Commit: c31f24c63b875e8c9a7cacd2733d3e8614eff74d
Author: Campbell Barton
Date:   Tue Jun 20 04:44:34 2017 +1000
Branches: blender2.8
https://developer.blender.org/rBc31f24c63b875e8c9a7cacd2733d3e8614eff74d

Manipulators: store operator type instead of id

Avoids lookups on each access.

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

M       source/blender/editors/transform/transform_manipulator.c
M       source/blender/editors/transform/transform_manipulator2d.c
M       source/blender/windowmanager/manipulators/WM_manipulator_api.h
M       source/blender/windowmanager/manipulators/WM_manipulator_types.h
M       source/blender/windowmanager/manipulators/intern/wm_manipulator.c
M       source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c
M       source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c
M       
source/blender/windowmanager/manipulators/intern/wm_manipulator_property.c

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

diff --git a/source/blender/editors/transform/transform_manipulator.c 
b/source/blender/editors/transform/transform_manipulator.c
index 2f276eb98b5..83b112066c9 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1158,6 +1158,10 @@ static void manipulator_modal(
 static void WIDGETGROUP_manipulator_setup(const bContext *UNUSED(C), 
wmManipulatorGroup *mgroup)
 {
        ManipulatorGroup *man = manipulatorgroup_init(mgroup);
+       struct {
+               wmOperatorType *translate, *rotate, *trackball, *resize;
+       } ot_store = {NULL};
+
        mgroup->customdata = man;
 
        /* *** set properties for axes *** */
@@ -1221,19 +1225,46 @@ static void WIDGETGROUP_manipulator_setup(const 
bContext *UNUSED(C), wmManipulat
 
                switch (axis_type) {
                        case MAN_AXES_TRANSLATE:
-                               ptr = WM_manipulator_set_operator(axis, 
"TRANSFORM_OT_translate");
+                               if (ot_store.translate == NULL) {
+                                       ot_store.translate = 
WM_operatortype_find("TRANSFORM_OT_translate", true);
+                               }
+                               ptr = WM_manipulator_set_operator(axis, 
ot_store.translate);
                                break;
                        case MAN_AXES_ROTATE:
-                               ptr = WM_manipulator_set_operator(
-                                         axis, (axis_idx == MAN_AXIS_ROT_T) ?
-                                         "TRANSFORM_OT_trackball" : 
"TRANSFORM_OT_rotate");
+                       {
+                               wmOperatorType *ot_rotate;
+                               if (axis_idx == MAN_AXIS_ROT_T) {
+                                       if (ot_store.trackball == NULL) {
+                                               ot_store.trackball = 
WM_operatortype_find("TRANSFORM_OT_trackball", true);
+                                       }
+                                       ot_rotate = ot_store.trackball;
+                               }
+                               else {
+                                       if (ot_store.rotate == NULL) {
+                                               ot_store.rotate = 
WM_operatortype_find("TRANSFORM_OT_rotate", true);
+                                       }
+                                       ot_rotate = ot_store.rotate;
+                               }
+                               ptr = WM_manipulator_set_operator(axis, 
ot_rotate);
                                break;
+                       }
                        case MAN_AXES_SCALE:
-                               ptr = WM_manipulator_set_operator(axis, 
"TRANSFORM_OT_resize");
+                       {
+                               if (ot_store.resize == NULL) {
+                                       ot_store.resize = 
WM_operatortype_find("TRANSFORM_OT_resize", true);
+                               }
+                               ptr = WM_manipulator_set_operator(axis, 
ot_store.resize);
                                break;
+                       }
                }
-               if (RNA_struct_find_property(ptr, "constraint_axis"))
-                       RNA_boolean_set_array(ptr, "constraint_axis", 
constraint_axis);
+
+               {
+                       PropertyRNA *prop;
+                       if ((prop = RNA_struct_find_property(ptr, 
"constraint_axis"))) {
+                               RNA_property_boolean_set_array(ptr, prop, 
constraint_axis);
+                       }
+               }
+
                RNA_boolean_set(ptr, "release_confirm", 1);
        }
        MAN_ITER_AXES_END;
diff --git a/source/blender/editors/transform/transform_manipulator2d.c 
b/source/blender/editors/transform/transform_manipulator2d.c
index 8cfa386cba2..ba61ae6ad71 100644
--- a/source/blender/editors/transform/transform_manipulator2d.c
+++ b/source/blender/editors/transform/transform_manipulator2d.c
@@ -182,6 +182,7 @@ static void manipulator2d_modal(
 
 void ED_widgetgroup_manipulator2d_setup(const bContext *UNUSED(C), 
wmManipulatorGroup *mgroup)
 {
+       wmOperatorType *ot_translate = 
WM_operatortype_find("TRANSFORM_OT_translate", true);
        ManipulatorGroup2D *man = manipulatorgroup2d_init(mgroup);
        mgroup->customdata = man;
 
@@ -204,7 +205,7 @@ void ED_widgetgroup_manipulator2d_setup(const bContext 
*UNUSED(C), wmManipulator
                WM_manipulator_set_color_highlight(axis, col_hi);
 
                /* assign operator */
-               PointerRNA *ptr = WM_manipulator_set_operator(axis, 
"TRANSFORM_OT_translate");
+               PointerRNA *ptr = WM_manipulator_set_operator(axis, 
ot_translate);
                int constraint[3] = {0.0f};
                constraint[(axis_idx + 1) % 2] = 1;
                if (RNA_struct_find_property(ptr, "constraint_axis"))
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h 
b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
index f613ca60329..f435ced75e7 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
@@ -64,7 +64,7 @@ void WM_manipulator_free(
         ListBase *manipulatorlist, struct wmManipulatorMap *mmap, struct 
wmManipulator *mpr,
         struct bContext *C);
 
-struct PointerRNA *WM_manipulator_set_operator(struct wmManipulator *, const 
char *opname);
+struct PointerRNA *WM_manipulator_set_operator(struct wmManipulator *, struct 
wmOperatorType *ot);
 
 /* callbacks */
 void WM_manipulator_set_fn_custom_modal(struct wmManipulator *mpr, 
wmManipulatorFnModal fn);
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h 
b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
index 6fd9f38671c..ae27de60805 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
@@ -100,10 +100,12 @@ struct wmManipulator {
        void *interaction_data;
 
        /* name of operator to spawn when activating the manipulator */
-       const char *opname;
-       /* operator properties if manipulator spawns and controls an operator,
-        * or owner pointer if manipulator spawns and controls a property */
-       PointerRNA opptr;
+       struct {
+               struct wmOperatorType *type;
+               /* operator properties if manipulator spawns and controls an 
operator,
+                * or owner pointer if manipulator spawns and controls a 
property */
+               PointerRNA ptr;
+       } op_data;
 
        /* Properties 'wmManipulatorProperty' attached to various manipulator 
parameters.
         * As the manipulator is interacted with, those properties get updated.
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c 
b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
index 6ba4d55e1e4..6a36a99d9c5 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
@@ -171,8 +171,8 @@ void WM_manipulator_free(ListBase *manipulatorlist, 
wmManipulatorMap *mmap, wmMa
                wm_manipulator_deselect(mmap, mpr);
        }
 
-       if (mpr->opptr.data) {
-               WM_operator_properties_free(&mpr->opptr);
+       if (mpr->op_data.ptr.data) {
+               WM_operator_properties_free(&mpr->op_data.ptr);
        }
        BLI_freelistN(&mpr->properties);
 
@@ -194,25 +194,16 @@ void WM_manipulator_free(ListBase *manipulatorlist, 
wmManipulatorMap *mmap, wmMa
  * \{ */
 
 
-PointerRNA *WM_manipulator_set_operator(wmManipulator *mpr, const char *opname)
+PointerRNA *WM_manipulator_set_operator(wmManipulator *mpr, wmOperatorType *ot)
 {
-       wmOperatorType *ot = WM_operatortype_find(opname, 0);
+       mpr->op_data.type = ot;
 
-       if (ot) {
-               mpr->opname = opname;
-
-               if (mpr->opptr.data) {
-                       WM_operator_properties_free(&mpr->opptr);
-               }
-               WM_operator_properties_create_ptr(&mpr->opptr, ot);
-
-               return &mpr->opptr;
-       }
-       else {
-               fprintf(stderr, "Error binding operator to manipulator: 
operator %s not found!\n", opname);
+       if (mpr->op_data.ptr.data) {
+               WM_operator_properties_free(&mpr->op_data.ptr);
        }
+       WM_operator_properties_create_ptr(&mpr->op_data.ptr, ot);
 
-       return NULL;
+       return &mpr->op_data.ptr;
 }
 
 static void wm_manipulator_set_matrix_rotation_from_z_axis__internal(
diff --git 
a/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c 
b/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c
index cee50c4e155..e9d7356df3a 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c
@@ -356,9 +356,8 @@ static int manipulator_tweak_invoke(bContext *C, wmOperator 
*op, const wmEvent *
 
        /* XXX temporary workaround for modal manipulator operator
         * conflicting with modal operator attached to manipulator */
-       if (mpr->opname) {
-               wmOperatorType *ot = WM_operatortype_find(mpr->opname, true);
-               if (ot->modal) {
+       if (mpr->op_data.type) {
+               if (mpr->op_data.type->modal) {
                        return OPERATOR_FINISHED;
                }
        }
diff --git 
a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c 
b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c
index 6bca825fd16..0f1a6e9d96e 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c
@@ -424,8 +424,8 @@ void wm_manipulatormaps_handled_modal_update(
 
        /* regular update for running operator */
        if (modal_running) {
-               if (mpr && mpr->opname &&
-                   STREQ(mpr->opname, handler->op->idname))
+               if (mpr && (mpr->op_data.type != NULL) &&
+                   (mpr->op_data.type == handler->op->type))
                {
                        if (mpr->custom_modal) {
                                mpr->custom_modal(C, mpr, event, 0);
@@ -640,32 +640,23 @@ void wm_manipulatormap_active_set(
                mpr->state |= WM_MANIPULATOR_STATE_ACTIVE;
                mmap->mmap_context.active = mpr;
 
-               if (mpr->opname) {
-                       wmOperatorType *ot = WM_operatortype_find(mpr->opname, 
0);
-
-                       if (ot) {
-                               /* first activate the manipulator itself */
-                               if (mpr->type->invoke &&
-                                   (mpr->type->modal || mpr->custom_modal))
-                               {
-                                       mpr->type->invoke(C, mpr, event);
-                               }
+               if (mpr->op_data.type) {
+                       /* first activate the manipulator itself */
+                       if (mpr->type->invoke &&
+                           (mpr->type->modal || mpr->custom_modal))
+                       {
+                               mpr->type->invoke(C, mpr, event);
+                       }
 
-                               WM_operator_name_call_ptr(C, ot, 
WM_OP_INVOKE_DEFAULT, &mpr->opptr);
+                       WM_operator_name_call_ptr(C, mpr->op_data.type, 
WM_OP_INVOKE_DEFAULT, &mpr->op_data.ptr);
 
-                               /* we failed to hook the manipulator to the 
operator handler or operator was cancelled, return */
-                               if (!mmap->mmap_context.active) {
-                                       mpr->state &= 
~WM_MANIPULATOR_STATE_ACTIVE;
-                                       /* first activate the manipulator 
itself */
-                                       MEM_SAFE_FREE(mpr->interaction_data);
-                               }
-                               return;
-                       }
-                       else {
-                               printf("Manipulator error: operator not found");
-                               mmap->mmap_context.active = NULL;
-                               return;
+                       /* we failed to hook the manipulator to the operator 
handler or operator was cancelled, return */
+                       if (!mmap->mmap_context.active) {
+                               mpr->state &= ~WM_MANIPULATOR_STATE_ACTIVE;
+                               /* first activate the manipulator itself */
+                               MEM_SAFE_FREE(mpr->interaction_data);
                        }
+                       return;
                }
                else {
                        if (mpr->type->invoke &&
diff --git 
a/source/blender/windowmanager/manipulators/intern/wm_manipulator_property.c 
b/source/blender/windowmanager/manipulators/intern/wm_manipulator_pro

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