[Bf-blender-cvs] [e69fb440270] master: Fix T68782: false occlusion in selecting vertices and edges with objects in any wire view

mano-wii noreply at git.blender.org
Sat Aug 17 23:40:16 CEST 2019


Commit: e69fb440270263e84fa55dfb7cbe24f54069751c
Author: mano-wii
Date:   Sat Aug 17 18:40:08 2019 -0300
Branches: master
https://developer.blender.org/rBe69fb440270263e84fa55dfb7cbe24f54069751c

Fix T68782: false occlusion in selecting vertices and edges with objects in any wire view

===================================================================

M	source/blender/draw/engines/select/select_draw_utils.c
M	source/blender/draw/engines/select/select_engine.c

===================================================================

diff --git a/source/blender/draw/engines/select/select_draw_utils.c b/source/blender/draw/engines/select/select_draw_utils.c
index 268cd60a8aa..f3b6d324f33 100644
--- a/source/blender/draw/engines/select/select_draw_utils.c
+++ b/source/blender/draw/engines/select/select_draw_utils.c
@@ -151,12 +151,11 @@ static void draw_select_id_edit_mesh(SELECTID_StorageList *stl,
 
   BM_mesh_elem_table_ensure(em->bm, BM_VERT | BM_EDGE | BM_FACE);
 
-  struct GPUBatch *geom_faces;
-  DRWShadingGroup *face_shgrp;
   if (select_mode & SCE_SELECT_FACE) {
-    geom_faces = DRW_mesh_batch_cache_get_triangles_with_select_id(me);
-    face_shgrp = DRW_shgroup_create_sub(stl->g_data->shgrp_face_flat);
+    struct GPUBatch *geom_faces = DRW_mesh_batch_cache_get_triangles_with_select_id(me);
+    DRWShadingGroup *face_shgrp = DRW_shgroup_create_sub(stl->g_data->shgrp_face_flat);
     DRW_shgroup_uniform_int_copy(face_shgrp, "offset", *(int *)&initial_offset);
+    DRW_shgroup_call_no_cull(face_shgrp, geom_faces, ob);
 
     if (draw_facedot) {
       struct GPUBatch *geom_facedots = DRW_mesh_batch_cache_get_facedots_with_select_id(me);
@@ -165,11 +164,13 @@ static void draw_select_id_edit_mesh(SELECTID_StorageList *stl,
     *r_face_offset = initial_offset + em->bm->totface;
   }
   else {
-    geom_faces = DRW_mesh_batch_cache_get_surface(me);
-    face_shgrp = stl->g_data->shgrp_face_unif;
+    if (ob->dt >= OB_SOLID) {
+      struct GPUBatch *geom_faces = DRW_mesh_batch_cache_get_surface(me);
+      DRWShadingGroup *face_shgrp = stl->g_data->shgrp_face_unif;
+      DRW_shgroup_call_no_cull(face_shgrp, geom_faces, ob);
+    }
     *r_face_offset = initial_offset;
   }
-  DRW_shgroup_call_no_cull(face_shgrp, geom_faces, ob);
 
   /* Unlike faces, only draw edges if edge select mode. */
   if (select_mode & SCE_SELECT_EDGE) {
diff --git a/source/blender/draw/engines/select/select_engine.c b/source/blender/draw/engines/select/select_engine.c
index 4c158312e0f..d0347891120 100644
--- a/source/blender/draw/engines/select/select_engine.c
+++ b/source/blender/draw/engines/select/select_engine.c
@@ -204,14 +204,14 @@ static void select_cache_populate(void *vedata, Object *ob)
     /* The object indices have already been drawn. Fill depth pass.
      * Opti: Most of the time this depth pass is not used. */
     struct Mesh *me = ob->data;
-    struct GPUBatch *geom_faces;
     if (e_data.context.select_mode & SCE_SELECT_FACE) {
-      geom_faces = DRW_mesh_batch_cache_get_triangles_with_select_id(me);
+      struct GPUBatch *geom_faces = DRW_mesh_batch_cache_get_triangles_with_select_id(me);
+      DRW_shgroup_call_obmat(stl->g_data->shgrp_depth_only, geom_faces, ob->obmat);
     }
-    else {
-      geom_faces = DRW_mesh_batch_cache_get_surface(me);
+    else if (ob->dt >= OB_SOLID) {
+      struct GPUBatch *geom_faces = DRW_mesh_batch_cache_get_surface(me);
+      DRW_shgroup_call_obmat(stl->g_data->shgrp_depth_only, geom_faces, ob->obmat);
     }
-    DRW_shgroup_call_obmat(stl->g_data->shgrp_depth_only, geom_faces, ob->obmat);
 
     if (e_data.context.select_mode & SCE_SELECT_EDGE) {
       struct GPUBatch *geom_edges = DRW_mesh_batch_cache_get_edges_with_select_id(me);



More information about the Bf-blender-cvs mailing list