[Bf-blender-cvs] [c31f24c63b8] blender2.8: Manipulators: store operator type instead of id

Campbell Barton noreply at git.blender.org
Mon Jun 19 20:42:21 CEST 2017


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




More information about the Bf-blender-cvs mailing list