[Bf-blender-cvs] [5f350a4acd4] master: Cleanup: various improvements to ed_object_select_pick
Campbell Barton
noreply at git.blender.org
Wed Mar 23 03:45:32 CET 2022
Commit: 5f350a4acd48b31838d83d55590d6840e37b01b6
Author: Campbell Barton
Date: Wed Mar 23 13:15:45 2022 +1100
Branches: master
https://developer.blender.org/rB5f350a4acd48b31838d83d55590d6840e37b01b6
Cleanup: various improvements to ed_object_select_pick
- Document parameters.
- Add code-comments.
- Remove some historic/unhelpful code-comments.
- Rename argument names that were ambiguous
(object was a boolean for e.g.).
- Move `gpu` picking into an allocated struct which is only
allocated & used when using GPU picking.
- Move variable declarations after menu picking has been handled.
===================================================================
M source/blender/editors/space_view3d/view3d_select.c
===================================================================
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 6b209fb0469..7bc24b75877 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -2419,76 +2419,95 @@ static bool ed_object_select_pick_camera_track(bContext *C,
return changed || found;
}
+/**
+ * Cursor selection picking for object & pose-mode.
+ *
+ * \param mval: Region relative cursor coordinates.
+ * \param params: Selection parameters.
+ * \param center: Select by the cursors on-screen distances to the center/origin
+ * instead of the geometry any other contents of the item being selected.
+ * This could be used to select by bones by their origin too, currently it's only used for objects.
+ * \param enumerate: Show a menu for objects at the cursor location.
+ * Otherwise fall-through to non-menu selection.
+ * \param object_only: Only select objects (not bones / track markers).
+ */
static bool ed_object_select_pick(bContext *C,
const int mval[2],
const struct SelectPick_Params *params,
- bool obcenter,
- bool enumerate,
- bool object)
+ const bool center,
+ const bool enumerate,
+ const bool object_only)
{
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
ViewContext vc;
/* Setup view context for argument to callbacks. */
ED_view3d_viewcontext_init(C, &vc, depsgraph);
- Scene *scene = CTX_data_scene(C);
- ViewLayer *view_layer = CTX_data_view_layer(C);
- View3D *v3d = CTX_wm_view3d(C);
- /* Don't set when the context has no active object (hidden), see: T60807. */
- const Base *oldbasact = vc.obact ? BASACT(view_layer) : NULL;
- Base *startbase = NULL, *basact = NULL, *basact_override = NULL;
- const eObjectMode object_mode = oldbasact ? oldbasact->object->mode : OB_MODE_OBJECT;
- const bool is_obedit = (vc.obedit != NULL);
-
- /* Handle setting the new base active */
- bool use_activate_selected_base = false;
+ Scene *scene = vc.scene;
+ View3D *v3d = vc.v3d;
- /* When enabled, don't attempt any further selection. */
- bool handled = false;
- bool changed = false;
+ /* Menu activation may find a base to make active (if it only finds a single item to select). */
+ Base *basact_override = NULL;
- if (object) {
+ const bool is_obedit = (vc.obedit != NULL);
+ if (object_only) {
/* Signal for #view3d_opengl_select to skip edit-mode objects. */
vc.obedit = NULL;
}
- /* Always start list from `basact` when cycling the selection. */
- startbase = FIRSTBASE(view_layer);
- if (oldbasact && oldbasact->next) {
- startbase = oldbasact->next;
- }
+ /* Set for GPU depth buffer picking, leave NULL when selecting by center. */
+ struct {
+ GPUSelectResult buffer[MAXPICKELEMS];
+ int hits;
+ bool do_nearest;
+ bool has_bones;
+ } *gpu = NULL;
- GPUSelectResult buffer[MAXPICKELEMS];
- int hits = 0;
- bool do_nearest = false;
- bool has_bones = false;
+ /* First handle menu selection, early exit if a menu opens
+ * since this takes ownership of the selection action.
+ *
+ * Even when there is no menu `basact_override` may be set to avoid having to re-find
+ * the item under the cursor. */
+
+ if (center == false) {
+ gpu = MEM_mallocN(sizeof(*gpu), __func__);
+ gpu->do_nearest = false;
+ gpu->has_bones = false;
- if (obcenter == false) {
/* If objects have pose-mode set, the bones are in the same selection buffer. */
- const eV3DSelectObjectFilter select_filter = ((object == false) ?
+ const eV3DSelectObjectFilter select_filter = ((object_only == false) ?
ED_view3d_select_filter_from_mode(scene,
vc.obact) :
VIEW3D_SELECT_FILTER_NOP);
- hits = mixed_bones_object_selectbuffer_extended(
- &vc, buffer, ARRAY_SIZE(buffer), mval, select_filter, true, enumerate, &do_nearest);
- has_bones = (object && hits > 0) ? false : selectbuffer_has_bones(buffer, hits);
+ gpu->hits = mixed_bones_object_selectbuffer_extended(&vc,
+ gpu->buffer,
+ ARRAY_SIZE(gpu->buffer),
+ mval,
+ select_filter,
+ true,
+ enumerate,
+ &gpu->do_nearest);
+ gpu->has_bones = (object_only && gpu->hits > 0) ?
+ false :
+ selectbuffer_has_bones(gpu->buffer, gpu->hits);
}
/* First handle menu selection, early exit when a menu was opened.
* Otherwise fall through to regular selection. */
if (enumerate) {
bool has_menu = false;
- if (obcenter) {
+ if (center) {
if (object_mouse_select_menu(C, &vc, NULL, 0, mval, params, &basact_override)) {
has_menu = true;
}
}
else {
- if (hits != 0) {
- if (has_bones && bone_mouse_select_menu(C, buffer, hits, false, params)) {
+ if (gpu->hits != 0) {
+ if (gpu->has_bones && bone_mouse_select_menu(C, gpu->buffer, gpu->hits, false, params)) {
has_menu = true;
}
- else if (object_mouse_select_menu(C, &vc, buffer, hits, mval, params, &basact_override)) {
+ else if (object_mouse_select_menu(
+ C, &vc, gpu->buffer, gpu->hits, mval, params, &basact_override)) {
has_menu = true;
}
}
@@ -2496,15 +2515,33 @@ static bool ed_object_select_pick(bContext *C,
/* Let the menu handle any further actions. */
if (has_menu) {
+ if (gpu != NULL) {
+ MEM_freeN(gpu);
+ }
return false;
}
}
- /* This block uses the control key to make the object selected
- * by its center point rather than its contents */
+ /* No menu, continue with selection. */
- /* In edit-mode do not activate. */
- if (obcenter) {
+ ViewLayer *view_layer = vc.view_layer;
+ /* Don't set when the context has no active object (hidden), see: T60807. */
+ const Base *oldbasact = vc.obact ? BASACT(view_layer) : NULL;
+ /* Always start list from `basact` when cycling the selection. */
+ Base *startbase = (oldbasact && oldbasact->next) ? oldbasact->next : FIRSTBASE(view_layer);
+
+ /* The next object's base to make active. */
+ Base *basact = NULL;
+ const eObjectMode object_mode = oldbasact ? oldbasact->object->mode : OB_MODE_OBJECT;
+
+ /* When enabled, don't attempt any further selection. */
+ bool handled = false;
+ bool changed = false;
+
+ /* Handle setting the new base active (even when `handled == true`). */
+ bool use_activate_selected_base = false;
+
+ if (center) {
if (basact_override) {
basact = basact_override;
}
@@ -2517,19 +2554,23 @@ static bool ed_object_select_pick(bContext *C,
basact = basact_override;
}
else {
- basact = (hits > 0) ? mouse_select_eval_buffer(
- &vc, buffer, hits, startbase, has_bones, do_nearest, NULL) :
- NULL;
+ basact =
+ (gpu->hits > 0) ?
+ mouse_select_eval_buffer(
+ &vc, gpu->buffer, gpu->hits, startbase, gpu->has_bones, gpu->do_nearest, NULL) :
+ NULL;
}
- if (((hits > 0) && has_bones) ||
+ /* Select pose-bones or camera-tracks. */
+ if (((gpu->hits > 0) && gpu->has_bones) ||
/* Special case, even when there are no hits, pose logic may de-select all bones. */
- ((hits == 0) && (object_mode & OB_MODE_POSE))) {
+ ((gpu->hits == 0) && (object_mode & OB_MODE_POSE))) {
- if (basact && (has_bones && (basact->object->type == OB_CAMERA))) {
+ if (basact && (gpu->has_bones && (basact->object->type == OB_CAMERA))) {
MovieClip *clip = BKE_object_movieclip_get(scene, basact->object, false);
if (clip != NULL) {
- if (ed_object_select_pick_camera_track(C, scene, basact, clip, buffer, hits, params)) {
+ if (ed_object_select_pick_camera_track(
+ C, scene, basact, clip, gpu->buffer, gpu->hits, params)) {
ED_object_base_select(basact, BA_SELECT);
/* Don't set `handled` here as the object activation may be necessary. */
@@ -2539,31 +2580,32 @@ static bool ed_object_select_pick(bContext *C,
/* Fallback to regular object selection if no new bundles were selected,
* allows to select object parented to reconstruction object. */
basact = mouse_select_eval_buffer(
- &vc, buffer, hits, startbase, false, do_nearest, NULL);
+ &vc, gpu->buffer, gpu->hits, startbase, false, gpu->do_nearest, NULL);
}
}
}
else if (ED_armature_pose_select_pick_with_buffer(view_layer,
v3d,
basact ? basact : (Base *)oldbasact,
- buffer,
- hits,
+ gpu->buffer,
+ gpu->hits,
params,
- do_nearest)) {
+ gpu->do_nearest)) {
/* When there is no `baseact` this will have operated on `oldbasact`,
- * no object operations are needed. */
+ * allowing #SelectPick_Params.deselect_all work in p
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list