[Bf-blender-cvs] [8815f2f1163] master: Cleanup: use struct for GPU the select buffer

Campbell Barton noreply at git.blender.org
Mon Jan 31 04:12:56 CET 2022


Commit: 8815f2f11632ea84d706bacd18e60639cb13d6eb
Author: Campbell Barton
Date:   Mon Jan 31 13:01:29 2022 +1100
Branches: master
https://developer.blender.org/rB8815f2f11632ea84d706bacd18e60639cb13d6eb

Cleanup: use struct for GPU the select buffer

GPU_select originally used GL_SELECT which defined the format for
storing the selection result.

Now this is no longer the case, define our own struct - making the code
easier to follow:

- Avoid having to deal with arrays in both `uint*` and `uint(*)[4]`
  multiplying offsets by 4 in some cases & not others.

- No magic numbers for the offsets of depth & selection-ID.

- No need to allocate unused members to match GL_SELECT
  (halving the buffer size).

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

M	source/blender/editors/armature/armature_intern.h
M	source/blender/editors/armature/armature_select.c
M	source/blender/editors/armature/pose_select.c
M	source/blender/editors/include/ED_armature.h
M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/metaball/CMakeLists.txt
M	source/blender/editors/metaball/mball_edit.c
M	source/blender/editors/space_view3d/view3d_select.c
M	source/blender/editors/space_view3d/view3d_view.c
M	source/blender/gpu/GPU_select.h
M	source/blender/gpu/intern/gpu_select.c
M	source/blender/gpu/intern/gpu_select_pick.c
M	source/blender/gpu/intern/gpu_select_private.h
M	source/blender/gpu/intern/gpu_select_sample_query.cc
M	source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c

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

diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h
index 252cf806e34..aaeac29b7d0 100644
--- a/source/blender/editors/armature/armature_intern.h
+++ b/source/blender/editors/armature/armature_intern.h
@@ -27,6 +27,7 @@
 struct wmOperatorType;
 
 struct Base;
+struct GPUSelectResult;
 struct Object;
 struct Scene;
 struct bContext;
@@ -323,21 +324,21 @@ struct Bone *ED_armature_pick_bone(struct bContext *C,
 
 struct EditBone *ED_armature_pick_ebone_from_selectbuffer(struct Base **bases,
                                                           uint bases_len,
-                                                          const uint *buffer,
+                                                          const struct GPUSelectResult *buffer,
                                                           short hits,
                                                           bool findunsel,
                                                           bool do_nearest,
                                                           struct Base **r_base);
 struct bPoseChannel *ED_armature_pick_pchan_from_selectbuffer(struct Base **bases,
                                                               uint bases_len,
-                                                              const uint *buffer,
+                                                              const struct GPUSelectResult *buffer,
                                                               short hits,
                                                               bool findunsel,
                                                               bool do_nearest,
                                                               struct Base **r_base);
 struct Bone *ED_armature_pick_bone_from_selectbuffer(struct Base **bases,
                                                      uint bases_len,
-                                                     const uint *buffer,
+                                                     const struct GPUSelectResult *buffer,
                                                      short hits,
                                                      bool findunsel,
                                                      bool do_nearest,
diff --git a/source/blender/editors/armature/armature_select.c b/source/blender/editors/armature/armature_select.c
index 5e4cb813064..f9b52eb53ed 100644
--- a/source/blender/editors/armature/armature_select.c
+++ b/source/blender/editors/armature/armature_select.c
@@ -55,6 +55,8 @@
 
 #include "DEG_depsgraph.h"
 
+#include "GPU_select.h"
+
 #include "armature_intern.h"
 
 /* utility macros for storing a temp int in the bone (selection flag) */
@@ -67,10 +69,10 @@
 
 Base *ED_armature_base_and_ebone_from_select_buffer(Base **bases,
                                                     uint bases_len,
-                                                    int hit,
+                                                    const uint select_id,
                                                     EditBone **r_ebone)
 {
-  const uint hit_object = hit & 0xFFFF;
+  const uint hit_object = select_id & 0xFFFF;
   Base *base = NULL;
   EditBone *ebone = NULL;
   /* TODO(campbell): optimize, eg: sort & binary search. */
@@ -81,7 +83,7 @@ Base *ED_armature_base_and_ebone_from_select_buffer(Base **bases,
     }
   }
   if (base != NULL) {
-    const uint hit_bone = (hit & ~BONESEL_ANY) >> 16;
+    const uint hit_bone = (select_id & ~BONESEL_ANY) >> 16;
     bArmature *arm = base->object->data;
     ebone = BLI_findlink(arm->edbo, hit_bone);
   }
@@ -91,10 +93,10 @@ Base *ED_armature_base_and_ebone_from_select_buffer(Base **bases,
 
 Object *ED_armature_object_and_ebone_from_select_buffer(Object **objects,
                                                         uint objects_len,
-                                                        int hit,
+                                                        const uint select_id,
                                                         EditBone **r_ebone)
 {
-  const uint hit_object = hit & 0xFFFF;
+  const uint hit_object = select_id & 0xFFFF;
   Object *ob = NULL;
   EditBone *ebone = NULL;
   /* TODO(campbell): optimize, eg: sort & binary search. */
@@ -105,7 +107,7 @@ Object *ED_armature_object_and_ebone_from_select_buffer(Object **objects,
     }
   }
   if (ob != NULL) {
-    const uint hit_bone = (hit & ~BONESEL_ANY) >> 16;
+    const uint hit_bone = (select_id & ~BONESEL_ANY) >> 16;
     bArmature *arm = ob->data;
     ebone = BLI_findlink(arm->edbo, hit_bone);
   }
@@ -115,10 +117,10 @@ Object *ED_armature_object_and_ebone_from_select_buffer(Object **objects,
 
 Base *ED_armature_base_and_pchan_from_select_buffer(Base **bases,
                                                     uint bases_len,
-                                                    int hit,
+                                                    const uint select_id,
                                                     bPoseChannel **r_pchan)
 {
-  const uint hit_object = hit & 0xFFFF;
+  const uint hit_object = select_id & 0xFFFF;
   Base *base = NULL;
   bPoseChannel *pchan = NULL;
   /* TODO(campbell): optimize, eg: sort & binary search. */
@@ -130,7 +132,7 @@ Base *ED_armature_base_and_pchan_from_select_buffer(Base **bases,
   }
   if (base != NULL) {
     if (base->object->pose != NULL) {
-      const uint hit_bone = (hit & ~BONESEL_ANY) >> 16;
+      const uint hit_bone = (select_id & ~BONESEL_ANY) >> 16;
       /* pchan may be NULL. */
       pchan = BLI_findlink(&base->object->pose->chanbase, hit_bone);
     }
@@ -141,11 +143,11 @@ Base *ED_armature_base_and_pchan_from_select_buffer(Base **bases,
 
 Base *ED_armature_base_and_bone_from_select_buffer(Base **bases,
                                                    uint bases_len,
-                                                   int hit,
+                                                   const uint select_id,
                                                    Bone **r_bone)
 {
   bPoseChannel *pchan = NULL;
-  Base *base = ED_armature_base_and_pchan_from_select_buffer(bases, bases_len, hit, &pchan);
+  Base *base = ED_armature_base_and_pchan_from_select_buffer(bases, bases_len, select_id, &pchan);
   *r_bone = pchan ? pchan->bone : NULL;
   return base;
 }
@@ -166,8 +168,8 @@ Base *ED_armature_base_and_bone_from_select_buffer(Base **bases,
 static void *ed_armature_pick_bone_from_selectbuffer_impl(const bool is_editmode,
                                                           Base **bases,
                                                           uint bases_len,
-                                                          const uint *buffer,
-                                                          short hits,
+                                                          const GPUSelectResult *buffer,
+                                                          const short hits,
                                                           bool findunsel,
                                                           bool do_nearest,
                                                           Base **r_base)
@@ -181,7 +183,7 @@ static void *ed_armature_pick_bone_from_selectbuffer_impl(const bool is_editmode
   int minsel = 0xffffffff, minunsel = 0xffffffff;
 
   for (short i = 0; i < hits; i++) {
-    hitresult = buffer[3 + (i * 4)];
+    hitresult = buffer[i].id;
 
     if (hitresult & BONESEL_ANY) { /* to avoid including objects in selection */
       Base *base = NULL;
@@ -221,10 +223,10 @@ static void *ed_armature_pick_bone_from_selectbuffer_impl(const bool is_editmode
       if (data) {
         if (sel) {
           if (do_nearest) {
-            if (minsel > buffer[4 * i + 1]) {
+            if (minsel > buffer[i].depth) {
               firstSel = data;
               firstSel_base = base;
-              minsel = buffer[4 * i + 1];
+              minsel = buffer[i].depth;
             }
           }
           else {
@@ -237,10 +239,10 @@ static void *ed_armature_pick_bone_from_selectbuffer_impl(const bool is_editmode
         }
         else {
           if (do_nearest) {
-            if (minunsel > buffer[4 * i + 1]) {
+            if (minunsel > buffer[i].depth) {
               firstunSel = data;
               firstunSel_base = base;
-              minunsel = buffer[4 * i + 1];
+              minunsel = buffer[i].depth;
             }
           }
           else {
@@ -268,8 +270,8 @@ static void *ed_armature_pick_bone_from_selectbuffer_impl(const bool is_editmode
 
 EditBone *ED_armature_pick_ebone_from_selectbuffer(Base **bases,
                                                    uint bases_len,
-                                                   const uint *buffer,
-                                                   short hits,
+                                                   const GPUSelectResult *buffer,
+                                                   const short hits,
                                                    bool findunsel,
                                                    bool do_nearest,
                                                    Base **r_base)
@@ -281,8 +283,8 @@ EditBone *ED_armature_pick_ebone_from_selectbuffer(Base **bases,
 
 bPoseChannel *ED_armature_pick_pchan_from_selectbuffer(Base **bases,
                                                        uint bases_len,
-                                                       const uint *buffer,
-                                                       short hits,
+                                                       const GPUSelectResult *buffer,
+                                                       const short hits,
                                                        bool findunsel,
                                                        bool do_nearest,
                                                        Base **r_base)
@@ -294,8 +296,8 @@ bPoseChannel *ED_armature_pick_pchan_from_selectbuffer(Base **bases,
 
 Bone *ED_armature_pick_bone_from_selectbuffer(Base **bases,
                                               uint bases_len,
-          

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list