[Bf-blender-cvs] [d0a56bbe69] temp-select-pick: Add depth sorting mode VIEW3D_SELECT_DEPTH_SORT_ALL

Campbell Barton noreply at git.blender.org
Mon Mar 6 08:41:48 CET 2017


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. @@




More information about the Bf-blender-cvs mailing list