[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