Commit: d0a56bbe6941c7bdb4cd4d6a2b9334760e6a6d58
Author: Campbell Barton
Date:   Sun Mar 5 17:27:53 2017 +1100
Branches: temp-select-pick
https://developer.blender.org/rBd0a56bbe6941c7bdb4cd4d6a2b9334760e6a6d58

Add depth sorting mode VIEW3D_SELECT_DEPTH_SORT_ALL

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

M       source/blender/editors/armature/armature_select.c
M       source/blender/editors/armature/editarmature_sketch.c
M       source/blender/editors/include/ED_view3d.h
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/editors/transform/transform_manipulator.c
M       source/blender/gpu/GPU_select.h
M       source/blender/gpu/intern/gpu_select.c

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

diff --git a/source/blender/editors/armature/armature_select.c 
b/source/blender/editors/armature/armature_select.c
index 5696c1f8a0..be8e0bb152 100644
--- a/source/blender/editors/armature/armature_select.c
+++ b/source/blender/editors/armature/armature_select.c
@@ -177,7 +177,7 @@ void *get_nearest_bone(bContext *C, const int xy[2], bool 
findunsel)
        rect.xmin = rect.xmax = xy[0];
        rect.ymin = rect.ymax = xy[1];
        
-       hits = view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect, true);
+       hits = view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect, 
VIEW3D_SELECT_DEPTH_SORT_NEAREST);
 
        if (hits > 0)
                return get_bone_from_selectbuffer(vc.scene, vc.scene->basact, 
buffer, hits, findunsel, true);
@@ -290,6 +290,7 @@ static EditBone *get_nearest_editbonepoint(
        unsigned int hitresult, besthitresult = BONESEL_NOSEL;
        int i, mindep = 5;
        short hits;
+       static int last_mval[2] = {-100, -100};
 
        /* find the bone after the current active bone, so as to bump up its 
chances in selection.
         * this way overlapping bones will cycle selection state as with 
objects. */
@@ -308,13 +309,34 @@ static EditBone *get_nearest_editbonepoint(
        rect.ymin = mval[1] - 5;
        rect.ymax = mval[1] + 5;
 
-       hits = view3d_opengl_select(vc, buffer, MAXPICKBUF, &rect, true);
+       bool use_cycle = true;
+       bool do_nearest = false;
+
+       /* define if we use solid nearest select or not */
+       if (use_cycle) {
+               if (vc->v3d->drawtype > OB_WIRE) {
+                       do_nearest = true;
+                       if (len_manhattan_v2v2_int(mval, last_mval) < 3) {
+                               do_nearest = false;
+                       }
+               }
+               copy_v2_v2_int(last_mval, mval);
+       }
+       else {
+               if (vc->v3d->drawtype > OB_WIRE) {
+                       do_nearest = true;
+               }
+       }
+
+       const int select_mode = (do_nearest ? VIEW3D_SELECT_DEPTH_SORT_NEAREST 
: VIEW3D_SELECT_DEPTH_SORT_ALL);
+
+       hits = view3d_opengl_select(vc, buffer, MAXPICKBUF, &rect, select_mode);
        if (hits == 0) {
                rect.xmin = mval[0] - 12;
                rect.xmax = mval[0] + 12;
                rect.ymin = mval[1] - 12;
                rect.ymax = mval[1] + 12;
-               hits = view3d_opengl_select(vc, buffer, MAXPICKBUF, &rect, 
true);
+               hits = view3d_opengl_select(vc, buffer, MAXPICKBUF, &rect, 
select_mode);
        }
        /* See if there are any selected bones in this group */
        if (hits > 0) {
diff --git a/source/blender/editors/armature/editarmature_sketch.c 
b/source/blender/editors/armature/editarmature_sketch.c
index f6c04e9570..dc30a78fe7 100644
--- a/source/blender/editors/armature/editarmature_sketch.c
+++ b/source/blender/editors/armature/editarmature_sketch.c
@@ -1912,7 +1912,7 @@ static bool sk_selectStroke(bContext *C, SK_Sketch 
*sketch, const int mval[2], c
        rect.ymin = mval[1] - 5;
        rect.ymax = mval[1] + 5;
 
-       hits = view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect, true);
+       hits = view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect, 
VIEW3D_SELECT_DEPTH_SORT_NEAREST);
 
        if (hits > 0) {
                int besthitresult = -1;
diff --git a/source/blender/editors/include/ED_view3d.h 
b/source/blender/editors/include/ED_view3d.h
index 6adc05f08d..bb93f420e0 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -301,9 +301,16 @@ bool ED_view3d_autodist_depth_seg(struct ARegion *ar, 
const int mval_sta[2], con
 /* select */
 #define MAXPICKELEMS    2500
 #define MAXPICKBUF      (4 * MAXPICKELEMS)
+
+enum {
+       VIEW3D_SELECT_ALL = 0,
+       VIEW3D_SELECT_DEPTH_SORT_ALL = 1,
+       VIEW3D_SELECT_DEPTH_SORT_NEAREST = 2,
+};
+
 short view3d_opengl_select(
         struct ViewContext *vc, unsigned int *buffer, unsigned int bufsize, 
const struct rcti *input,
-        bool do_nearest);
+        int select_mode);
 
 /* view3d_select.c */
 float ED_view3d_select_dist_px(void);
diff --git a/source/blender/editors/metaball/mball_edit.c 
b/source/blender/editors/metaball/mball_edit.c
index ed5bf4a92b..5f5c994f33 100644
--- a/source/blender/editors/metaball/mball_edit.c
+++ b/source/blender/editors/metaball/mball_edit.c
@@ -597,7 +597,7 @@ bool ED_mball_select_pick(bContext *C, const int mval[2], 
bool extend, bool dese
        rect.ymin = mval[1] - 12;
        rect.ymax = mval[1] + 12;
 
-       hits = view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect, true);
+       hits = view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect, 
VIEW3D_SELECT_DEPTH_SORT_NEAREST);
 
        /* does startelem exist? */
        ml = mb->editelems->first;
diff --git a/source/blender/editors/space_view3d/view3d_select.c 
b/source/blender/editors/space_view3d/view3d_select.c
index 3239d07553..a42e9683bd 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -1234,8 +1234,10 @@ static short mixed_bones_object_selectbuffer(
 
        do_nearest = do_nearest && !enumerate;
 
+       const int select_mode = (do_nearest ? VIEW3D_SELECT_DEPTH_SORT_NEAREST 
: VIEW3D_SELECT_DEPTH_SORT_ALL);
+
        BLI_rcti_init(&rect, mval[0] - 14, mval[0] + 14, mval[1] - 14, mval[1] 
+ 14);
-       hits15 = view3d_opengl_select(vc, buffer, MAXPICKBUF, &rect, 
do_nearest);
+       hits15 = view3d_opengl_select(vc, buffer, MAXPICKBUF, &rect, 
select_mode);
        if (hits15 == 1) {
                return selectbuffer_ret_hits_15(buffer, hits15);
        }
@@ -1244,7 +1246,7 @@ static short mixed_bones_object_selectbuffer(
 
                offs = 4 * hits15;
                BLI_rcti_init(&rect, mval[0] - 9, mval[0] + 9, mval[1] - 9, 
mval[1] + 9);
-               hits9 = view3d_opengl_select(vc, buffer + offs, MAXPICKBUF - 
offs, &rect, do_nearest);
+               hits9 = view3d_opengl_select(vc, buffer + offs, MAXPICKBUF - 
offs, &rect, select_mode);
                if (hits9 == 1) {
                        return selectbuffer_ret_hits_9(buffer, hits15, hits9);
                }
@@ -1253,7 +1255,7 @@ static short mixed_bones_object_selectbuffer(
 
                        offs += 4 * hits9;
                        BLI_rcti_init(&rect, mval[0] - 5, mval[0] + 5, mval[1] 
- 5, mval[1] + 5);
-                       hits5 = view3d_opengl_select(vc, buffer + offs, 
MAXPICKBUF - offs, &rect, do_nearest);
+                       hits5 = view3d_opengl_select(vc, buffer + offs, 
MAXPICKBUF - offs, &rect, select_mode);
                        if (hits5 == 1) {
                                return selectbuffer_ret_hits_5(buffer, hits15, 
hits9, hits5);
                        }
@@ -1906,7 +1908,7 @@ static int do_meta_box_select(ViewContext *vc, rcti 
*rect, bool select, bool ext
        unsigned int buffer[MAXPICKBUF];
        short hits;
 
-       hits = view3d_opengl_select(vc, buffer, MAXPICKBUF, rect, false);
+       hits = view3d_opengl_select(vc, buffer, MAXPICKBUF, rect, 
VIEW3D_SELECT_ALL);
 
        if (extend == false && select)
                BKE_mball_deselect_all(mb);
@@ -1940,7 +1942,7 @@ static int do_armature_box_select(ViewContext *vc, rcti 
*rect, bool select, bool
        unsigned int buffer[MAXPICKBUF];
        short hits;
 
-       hits = view3d_opengl_select(vc, buffer, MAXPICKBUF, rect, false);
+       hits = view3d_opengl_select(vc, buffer, MAXPICKBUF, rect, 
VIEW3D_SELECT_ALL);
        
        /* clear flag we use to detect point was affected */
        for (ebone = arm->edbo->first; ebone; ebone = ebone->next)
@@ -2037,7 +2039,7 @@ static int do_object_pose_box_select(bContext *C, 
ViewContext *vc, rcti *rect, b
 
        /* selection buffer now has bones potentially too, so we add MAXPICKBUF 
*/
        vbuffer = MEM_mallocN(4 * (totobj + MAXPICKELEMS) * sizeof(unsigned 
int), "selection buffer");
-       hits = view3d_opengl_select(vc, vbuffer, 4 * (totobj + MAXPICKELEMS), 
rect, false);
+       hits = view3d_opengl_select(vc, vbuffer, 4 * (totobj + MAXPICKELEMS), 
rect, VIEW3D_SELECT_ALL);
        /*
         * LOGIC NOTES (theeth):
         * The buffer and ListBase have the same relative order, which makes 
the selection
diff --git a/source/blender/editors/space_view3d/view3d_view.c 
b/source/blender/editors/space_view3d/view3d_view.c
index 1e5c42fe11..ccf9f4d0d4 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -1172,7 +1172,7 @@ static void view3d_select_loop(ViewContext *vc, Scene 
*scene, View3D *v3d, ARegi
  */
 short view3d_opengl_select(
         ViewContext *vc, unsigned int *buffer, unsigned int bufsize, const 
rcti *input,
-        bool do_nearest)
+        int select_mode)
 {
        Scene *scene = vc->scene;
        View3D *v3d = vc->v3d;
@@ -1180,7 +1180,6 @@ short view3d_opengl_select(
        rctf rect;
        short hits;
        const bool use_obedit_skip = (scene->obedit != NULL) && (vc->obedit == 
NULL);
-       const bool do_passes = do_nearest && GPU_select_query_check_active();
 
        G.f |= G_PICKSEL;
        
@@ -1206,29 +1205,19 @@ short view3d_opengl_select(
        if (vc->rv3d->rflag & RV3D_CLIPPING)
                ED_view3d_clipping_set(vc->rv3d);
        
-       if (do_nearest) {
-               GPU_select_begin(buffer, bufsize, &rect, 
GPU_SELECT_NEAREST_DEPTH_SORT, 0);
+       if (select_mode == VIEW3D_SELECT_DEPTH_SORT_NEAREST) {
+               GPU_select_begin(buffer, bufsize, &rect, 
GPU_SELECT_DEPTH_SORT_NEAREST);
        }
-       else if (do_passes) {
-               /* XXX, this wont run currently with 
GPU_SELECT_NEAREST_DEPTH_SORT above */
-               GPU_select_begin(buffer, bufsize, &rect, 
GPU_SELECT_NEAREST_FIRST_PASS, 0);
+       else if (select_mode == VIEW3D_SELECT_DEPTH_SORT_ALL) {
+               GPU_select_begin(buffer, bufsize, &rect, 
GPU_SELECT_DEPTH_SORT_ALL);
        }
        else {
-               GPU_select_begin(buffer, bufsize, &rect, GPU_SELECT_ALL, 0);
+               GPU_select_begin(buffer, bufsize, &rect, GPU_SELECT_ALL);
        }
 
        view3d_select_loop(vc, scene, v3d, ar, use_obedit_skip);
 
        hits = GPU_select_end();
-       
-       /* second pass, to get the closest object to camera */
-       if (do_passes) {
-               GPU_select_begin(buffer, bufsize, &rect, 
GPU_SELECT_NEAREST_SECOND_PASS, hits);
-
-               view3d_select_loop(vc, scene, v3d, ar, use_obedit_skip);
-
-               GPU_select_end();
-       }
 
        G.f &= ~G_PICKSEL;
        view3d_winmatrix_set(ar, v3d, NULL);
diff --git a/source/blender/editors/transform/transform_manipulator.c 
b/source/blender/editors/transform/transform_manipulator.c
index 1567cafeb0..a1dd964ff1 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1728,7 +1728,6 @@ static int manipulator_selectbuf(ScrArea *sa, ARegion 
*ar, const int mval[2], fl
        GLuint buffer[64];      // max 4 items per select, so large enuf
        short hits;
        const bool is_picksel = true;
-       const bool do_passes = GPU_select_query_check_active();
 
        /* XXX check a bit later on this... (ton) */
        extern void view3d_winmatrix_set(ARegion *ar, View3D *v3d, rctf *rect);
@@ -1748,10 +1747,7 @@ static int manipulator_selectbuf(ScrArea *sa, ARegion 
*ar, const int mval[2], fl
        view3d_winmatrix_set(ar, v3d, &rect);

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to