Commit: e79d7747d21f3d3079c759abe0f20a7904aded80
Author: Campbell Barton
Date:   Thu Dec 13 13:04:25 2018 +1100
Branches: blender2.8
https://developer.blender.org/rBe79d7747d21f3d3079c759abe0f20a7904aded80

Cleanup: use doxy grouping for view3d select

Easier to navigate, avoid mixing up functionality across the file.

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

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 b2fbdbad31c..c740fa7814e 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -110,6 +110,11 @@
 
 // #include "PIL_time_utildefines.h"
 
+
+/* -------------------------------------------------------------------- */
+/** \name Public Utilities
+ * \{ */
+
 float ED_view3d_select_dist_px(void)
 {
        return 75.0f * U.pixelsize;
@@ -147,9 +152,33 @@ void ED_view3d_viewcontext_init_object(ViewContext *vc, 
Object *obact)
        }
 }
 
-/* ********************** view3d_select: selection manipulations 
********************* */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Internal Utilities
+ * \{ */
+
+static void object_deselect_all_visible(ViewLayer *view_layer, View3D *v3d)
+{
+       Base *base;
+
+       for (base = view_layer->object_bases.first; base; base = base->next) {
+               if (BASE_SELECTABLE(v3d, base)) {
+                       ED_object_base_select(base, BA_DESELECT);
+               }
+       }
+}
 
-/* local prototypes */
+static void object_deselect_all_except(ViewLayer *view_layer, Base *b)   /* 
deselect all except b */
+{
+       for (Base *base = view_layer->object_bases.first; base; base = 
base->next) {
+               if (base->flag & BASE_SELECTED) {
+                       if (b != base) {
+                               ED_object_base_select(base, BA_DESELECT);
+                       }
+               }
+       }
+}
 
 static void edbm_backbuf_check_and_select_verts(BMEditMesh *em, const 
eSelectOp sel_op)
 {
@@ -248,7 +277,11 @@ static void edbm_backbuf_check_and_select_tfaces(Mesh *me, 
const eSelectOp sel_o
        }
 }
 
-/* *********************** GESTURE AND LASSO ******************* */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Lasso Select
+ * \{ */
 
 typedef struct LassoSelectUserData {
        ViewContext *vc;
@@ -405,17 +438,6 @@ static void do_lasso_tag_pose(ViewContext *vc, Object *ob, 
const int mcords[][2]
        pose_foreachScreenBone(&vc_tmp, do_lasso_select_pose__do_tag, &data, 
V3D_PROJ_TEST_CLIP_DEFAULT);
 }
 
-static void object_deselect_all_visible(ViewLayer *view_layer, View3D *v3d)
-{
-       Base *base;
-
-       for (base = view_layer->object_bases.first; base; base = base->next) {
-               if (BASE_SELECTABLE(v3d, base)) {
-                       ED_object_base_select(base, BA_DESELECT);
-               }
-       }
-}
-
 static void do_lasso_select_objects(
         ViewContext *vc, const int mcords[][2], const short moves,
         const eSelectOp sel_op)
@@ -1077,7 +1099,11 @@ void VIEW3D_OT_select_lasso(wmOperatorType *ot)
        WM_operator_properties_select_operation(ot);
 }
 
-/* ************************** mouse select ************************* */
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Cursor Picking
+ * \{ */
 
 /* The max number of menu items in an object select menu */
 typedef struct SelMenuItemF {
@@ -1184,17 +1210,6 @@ void VIEW3D_OT_select_menu(wmOperatorType *ot)
        RNA_def_boolean(ot->srna, "toggle", 0, "Toggle", "Toggle selection 
instead of deselecting everything first");
 }
 
-static void deselectall_except(ViewLayer *view_layer, Base *b)   /* deselect 
all except b */
-{
-       for (Base *base = view_layer->object_bases.first; base; base = 
base->next) {
-               if (base->flag & BASE_SELECTED) {
-                       if (b != base) {
-                               ED_object_base_select(base, BA_DESELECT);
-                       }
-               }
-       }
-}
-
 static Base *object_mouse_select_menu(
         bContext *C, ViewContext *vc, unsigned int *buffer, int hits,
         const int mval[2], bool toggle)
@@ -1797,7 +1812,7 @@ static bool ed_object_select_pick(
 
                if (vc.obedit) {
                        /* only do select */
-                       deselectall_except(view_layer, basact);
+                       object_deselect_all_except(view_layer, basact);
                        ED_object_base_select(basact, BA_SELECT);
                }
                /* also prevent making it active on mouse selection */
@@ -1821,7 +1836,7 @@ static bool ed_object_select_pick(
                        else {
                                /* When enabled, this puts other objects out of 
multi pose-mode. */
                                if (is_pose_mode == false) {
-                                       deselectall_except(view_layer, basact);
+                                       object_deselect_all_except(view_layer, 
basact);
                                        ED_object_base_select(basact, 
BA_SELECT);
                                }
                        }
@@ -1860,7 +1875,160 @@ static bool ed_object_select_pick(
        return retval;
 }
 
-/* ********************  border and circle 
************************************** */
+/* mouse selection in weight paint */
+/* gets called via generic mouse select operator */
+static bool ed_wpaint_vertex_select_pick(
+        bContext *C, const int mval[2],
+        bool extend, bool deselect, bool toggle, Object *obact)
+{
+       View3D *v3d = CTX_wm_view3d(C);
+       const bool use_zbuf = V3D_IS_ZBUF(v3d);
+
+       Mesh *me = obact->data; /* already checked for NULL */
+       unsigned int index = 0;
+       MVert *mv;
+
+       if (ED_mesh_pick_vert(C, obact, mval, &index, 
ED_MESH_PICK_DEFAULT_VERT_SIZE, use_zbuf)) {
+               mv = &me->mvert[index];
+               if (extend) {
+                       mv->flag |= SELECT;
+               }
+               else if (deselect) {
+                       mv->flag &= ~SELECT;
+               }
+               else if (toggle) {
+                       mv->flag ^= SELECT;
+               }
+               else {
+                       paintvert_deselect_all_visible(obact, SEL_DESELECT, 
false);
+                       mv->flag |= SELECT;
+               }
+
+               /* update mselect */
+               if (mv->flag & SELECT) {
+                       BKE_mesh_mselect_active_set(me, index, ME_VSEL);
+               }
+               else {
+                       BKE_mesh_mselect_validate(me);
+               }
+
+               paintvert_flush_flags(obact);
+               paintvert_tag_select_update(C, obact);
+               return true;
+       }
+       return false;
+}
+
+static int view3d_select_exec(bContext *C, wmOperator *op)
+{
+       Object *obedit = CTX_data_edit_object(C);
+       Object *obact = CTX_data_active_object(C);
+       bool extend = RNA_boolean_get(op->ptr, "extend");
+       bool deselect = RNA_boolean_get(op->ptr, "deselect");
+       bool toggle = RNA_boolean_get(op->ptr, "toggle");
+       bool center = RNA_boolean_get(op->ptr, "center");
+       bool enumerate = RNA_boolean_get(op->ptr, "enumerate");
+       /* only force object select for editmode to support vertex parenting,
+        * or paint-select to allow pose bone select with vert/face select */
+       bool object = (RNA_boolean_get(op->ptr, "object") &&
+                      (obedit ||
+                       BKE_paint_select_elem_test(obact) ||
+                       /* so its possible to select bones in weightpaint mode 
(LMB select) */
+                       (obact && (obact->mode & OB_MODE_WEIGHT_PAINT) && 
BKE_object_pose_armature_get(obact))));
+
+       bool retval = false;
+       int location[2];
+
+       RNA_int_get_array(op->ptr, "location", location);
+
+       view3d_operator_needs_opengl(C);
+
+       if (object) {
+               obedit = NULL;
+               obact = NULL;
+
+               /* ack, this is incorrect but to do this correctly we would 
need an
+                * alternative editmode/objectmode keymap, this copies the 
functionality
+                * from 2.4x where Ctrl+Select in editmode does object select 
only */
+               center = false;
+       }
+
+       if (obedit && object == false) {
+               if (obedit->type == OB_MESH)
+                       retval = EDBM_select_pick(C, location, extend, 
deselect, toggle);
+               else if (obedit->type == OB_ARMATURE)
+                       retval = ED_armature_edit_select_pick(C, location, 
extend, deselect, toggle);
+               else if (obedit->type == OB_LATTICE)
+                       retval = ED_lattice_select_pick(C, location, extend, 
deselect, toggle);
+               else if (ELEM(obedit->type, OB_CURVE, OB_SURF))
+                       retval = ED_curve_editnurb_select_pick(C, location, 
extend, deselect, toggle);
+               else if (obedit->type == OB_MBALL)
+                       retval = ED_mball_select_pick(C, location, extend, 
deselect, toggle);
+               else if (obedit->type == OB_FONT)
+                       retval = ED_curve_editfont_select_pick(C, location, 
extend, deselect, toggle);
+
+       }
+       else if (obact && obact->mode & OB_MODE_PARTICLE_EDIT)
+               return PE_mouse_particles(C, location, extend, deselect, 
toggle);
+       else if (obact && BKE_paint_select_face_test(obact))
+               retval = paintface_mouse_select(C, obact, location, extend, 
deselect, toggle);
+       else if (BKE_paint_select_vert_test(obact))
+               retval = ed_wpaint_vertex_select_pick(C, location, extend, 
deselect, toggle, obact);
+       else
+               retval = ed_object_select_pick(C, location, extend, deselect, 
toggle, center, enumerate, object);
+
+       /* passthrough allows tweaks
+        * FINISHED to signal one operator worked
+        * */
+       if (retval)
+               return OPERATOR_PASS_THROUGH | OPERATOR_FINISHED;
+       else
+               return OPERATOR_PASS_THROUGH;  /* nothing selected, just 
passthrough */
+}
+
+static int view3d_select_invoke(bContext *C, wmOperator *op, const wmEvent 
*event)
+{
+       RNA_int_set_array(op->ptr, "location", event->mval);
+
+       return view3d_select_exec(C, op);
+}
+
+void VIEW3D_OT_select(wmOperatorType *ot)
+{
+       PropertyRNA *prop;
+
+       /* identifiers */
+       ot->name = "Select";
+       ot->description = "Select and activate item(s)";
+       ot->idname = "VIEW3D_OT_select";
+
+       /* api callbacks */
+       ot->invoke = view3d_select_invoke;
+       ot->exec = view3d_select_exec;
+       ot->poll = ED_operator_view3d_active;
+
+       /* flags */
+       ot->flag = OPTYPE_UNDO;
+
+       /* properties */
+       WM_operator_properties_mouse_select(ot);
+
+       prop = RNA_def_boolean(ot->srna, "center", 0, "Center", "Use the object 
center when selecting, in editmode used to extend object selection");
+       RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+       prop = RNA_def_boolean(ot->srna, "enumerate", 0, "Enumerate", "List 
objects under the mouse (object mode only)");
+       RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+       prop = RNA_def_boolean(ot->srna, "object", 0, "Object", "Use object 
selection (editmode only)");
+       RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+
+       prop = RNA_def_int_vector(ot->srna, "location", 2, NULL, INT_MIN, 
INT_MAX, "Location", "Mouse location", INT_MIN, INT_MAX);
+       RNA_def_property_flag(prop, PROP_HIDDEN);
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Box Select
+ * \{ */
 
 typedef struct BoxSelectUserData {
        ViewContext *vc;
@@ -2618,10 +2786,6 @@ static int view3d_box_select_exec(bContext *C, 
wmOperator *op)
        return ret;
 }
 
-
-/* *****************Selection Operators******************* */
-
-/* ****** Box Select ****** */
 void VIEW3D_OT_select_box(wmOperatorType *ot)
 {
        /* identifiers */
@@ -2644,161 +2808,11 @@ void VIEW3D_OT_select_box(wmOperatorType *ot)
        WM_operator_properties_select_operation(ot);
 }
 
+/** \} */
 
-/* mouse selection in weight paint */
-/* gets called via generic m

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