[Bf-blender-cvs] [e922dd7d8a3] master: Viewport: cannot select object by clicking on its instances

Jacques Lucke noreply at git.blender.org
Tue Nov 24 17:35:34 CET 2020


Commit: e922dd7d8a307c54d49bc01649a12610b022192b
Author: Jacques Lucke
Date:   Tue Nov 24 17:32:40 2020 +0100
Branches: master
https://developer.blender.org/rBe922dd7d8a307c54d49bc01649a12610b022192b

Viewport: cannot select object by clicking on its instances

Selecting an object by clicking on its instances only worked,
when the object itself is visible. However, it is possible to hide
the object and still keep the instances visible.

The solution is to give every object the correct `select_id` in the
depsgraph object iterator right before rendering.

Reviewers: fclem, brecht

Differential Revision: https://developer.blender.org/D9640

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

M	source/blender/depsgraph/intern/depsgraph_query_iter.cc
M	source/blender/draw/engines/overlay/overlay_armature.c
M	source/blender/draw/engines/overlay/overlay_extra.c
M	source/blender/draw/engines/overlay/overlay_metaball.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/makesdna/DNA_object_types.h

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

diff --git a/source/blender/depsgraph/intern/depsgraph_query_iter.cc b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
index 7d47e1fb541..dd5c998466b 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_iter.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
@@ -154,6 +154,7 @@ bool deg_objects_dupli_iterator_next(BLI_Iterator *iter)
         dupli_parent->runtime.local_collections_bits;
     temp_dupli_object->dt = MIN2(temp_dupli_object->dt, dupli_parent->dt);
     copy_v4_v4(temp_dupli_object->color, dupli_parent->color);
+    temp_dupli_object->runtime.select_id = dupli_parent->runtime.select_id;
 
     /* Duplicated elements shouldn't care whether their original collection is visible or not. */
     temp_dupli_object->base_flag |= BASE_VISIBLE_DEPSGRAPH;
@@ -224,6 +225,7 @@ void deg_iterator_objects_step(BLI_Iterator *iter, deg::IDNode *id_node)
     }
   }
 
+  object->runtime.select_id = DEG_get_original_object(object)->runtime.select_id;
   if (ob_visibility & OB_VISIBLE_INSTANCES) {
     if ((data->flag & DEG_ITER_OBJECT_FLAG_DUPLI) && (object->transflag & OB_DUPLI)) {
       data->dupli_parent = object;
diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c
index cbd2589f20f..1f95eec4486 100644
--- a/source/blender/draw/engines/overlay/overlay_armature.c
+++ b/source/blender/draw/engines/overlay/overlay_armature.c
@@ -1910,7 +1910,7 @@ static void draw_armature_edit(ArmatureDrawContext *ctx)
 
   edbo_compute_bbone_child(arm);
 
-  for (eBone = arm->edbo->first, index = ob_orig->runtime.select_id; eBone;
+  for (eBone = arm->edbo->first, index = ob->runtime.select_id; eBone;
        eBone = eBone->next, index += 0x10000) {
     if (eBone->layer & arm->layer) {
       if ((eBone->flag & BONE_HIDDEN_A) == 0) {
@@ -2005,8 +2005,7 @@ static void draw_armature_pose(ArmatureDrawContext *ctx)
         DRW_state_is_select();
 
     if (is_pose_select) {
-      const Object *ob_orig = DEG_get_original_object(ob);
-      index = ob_orig->runtime.select_id;
+      index = ob->runtime.select_id;
     }
   }
 
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 4ca7ee42f8d..39f17581e0d 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -871,7 +871,6 @@ static void camera_view3d_reconstruction(OVERLAY_ExtraCallBuffers *cb,
 {
   const DRWContextState *draw_ctx = DRW_context_state_get();
   const bool is_select = DRW_state_is_select();
-  const Object *orig_camera_object = DEG_get_original_object(camera_object);
 
   MovieClip *clip = BKE_object_movieclip_get(scene, ob, false);
   if (clip == NULL) {
@@ -945,7 +944,7 @@ static void camera_view3d_reconstruction(OVERLAY_ExtraCallBuffers *cb,
       }
 
       if (is_select) {
-        DRW_select_load_id(orig_camera_object->runtime.select_id | (track_index << 16));
+        DRW_select_load_id(camera_object->runtime.select_id | (track_index << 16));
         track_index++;
       }
 
diff --git a/source/blender/draw/engines/overlay/overlay_metaball.c b/source/blender/draw/engines/overlay/overlay_metaball.c
index c10c0a84247..f973c1eda8a 100644
--- a/source/blender/draw/engines/overlay/overlay_metaball.c
+++ b/source/blender/draw/engines/overlay/overlay_metaball.c
@@ -82,8 +82,7 @@ void OVERLAY_edit_metaball_cache_populate(OVERLAY_Data *vedata, Object *ob)
 
   int select_id = 0;
   if (is_select) {
-    const Object *orig_object = DEG_get_original_object(ob);
-    select_id = orig_object->runtime.select_id;
+    select_id = ob->runtime.select_id;
   }
 
   LISTBASE_FOREACH (MetaElem *, ml, mb->editelems) {
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index c5edf9577a4..99f102680e5 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -2422,11 +2422,7 @@ void DRW_draw_select_loop(struct Depsgraph *depsgraph,
             }
           }
 
-          /* This relies on dupli instances being after their instancing object. */
-          if ((ob->base_flag & BASE_FROM_DUPLI) == 0) {
-            Object *ob_orig = DEG_get_original_object(ob);
-            DRW_select_load_id(ob_orig->runtime.select_id);
-          }
+          DRW_select_load_id(ob->runtime.select_id);
           DST.dupli_parent = data_.dupli_parent;
           DST.dupli_source = data_.dupli_object_current;
           drw_duplidata_load(DST.dupli_source);
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 345d1287ab1..5a00b6479d5 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -126,7 +126,10 @@ typedef struct Object_Runtime {
   /** Only used for drawing the parent/child help-line. */
   float parent_display_origin[3];
 
-  /** Selection id of this object; only available in the original object */
+  /**
+   * Selection id of this object. It might differ between an evaluated and its original object,
+   * when the object is being instanced.
+   */
   int select_id;
   char _pad1[3];



More information about the Bf-blender-cvs mailing list