Commit: a520e7c85c83536a81ba53f7c7c6dba665ebad96
Author: Campbell Barton
Date:   Mon Aug 28 16:00:28 2017 +1000
Branches: master
https://developer.blender.org/rBa520e7c85c83536a81ba53f7c7c6dba665ebad96

Transform: center override

Hidden option to override transform center.
Needed for manipulators that define their own center.

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

M       source/blender/editors/include/ED_transform.h
M       source/blender/editors/transform/transform.c
M       source/blender/editors/transform/transform.h
M       source/blender/editors/transform/transform_generics.c
M       source/blender/editors/transform/transform_ops.c

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

diff --git a/source/blender/editors/include/ED_transform.h 
b/source/blender/editors/include/ED_transform.h
index 0ba95d7d208..9a0a7f8f1bb 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -148,7 +148,8 @@ int BIF_countTransformOrientation(const struct bContext *C);
 #define P_CORRECT_UV    (1 << 8)
 #define P_NO_DEFAULTS   (1 << 10)
 #define P_NO_TEXSPACE   (1 << 11)
-#define P_GPENCIL_EDIT  (1 << 12)
+#define P_CENTER        (1 << 12)
+#define P_GPENCIL_EDIT  (1 << 13)
 
 void Transform_Properties(struct wmOperatorType *ot, int flags);
 
diff --git a/source/blender/editors/transform/transform.c 
b/source/blender/editors/transform/transform.c
index ca6e2267218..0ebf24b44ce 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -2878,7 +2878,9 @@ static void initBend(TransInfo *t)
        t->flag |= T_NO_CONSTRAINT;
 
        //copy_v3_v3(t->center, ED_view3d_cursor3d_get(t->scene, t->view));
-       calculateCenterCursor(t, t->center);
+       if ((t->flag & T_OVERRIDE_CENTER) == 0) {
+               calculateCenterCursor(t, t->center);
+       }
        calculateCenterGlobal(t, t->center, t->center_global);
 
        t->val = 0.0f;
@@ -8513,9 +8515,11 @@ static void initTimeScale(TransInfo *t)
 
        /* recalculate center2d to use CFRA and mouse Y, since that's
         * what is used in time scale */
-       t->center[0] = t->scene->r.cfra;
-       projectFloatView(t, t->center, center);
-       center[1] = t->mouse.imval[1];
+       if ((t->flag & T_OVERRIDE_CENTER) == 0) {
+               t->center[0] = t->scene->r.cfra;
+               projectFloatView(t, t->center, center);
+               center[1] = t->mouse.imval[1];
+       }
 
        /* force a reinit with the center2d used here */
        initMouseInput(t, &t->mouse, center, t->mouse.imval, false);
diff --git a/source/blender/editors/transform/transform.h 
b/source/blender/editors/transform/transform.h
index d60eb2f0778..06a60456cdb 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -533,6 +533,9 @@ typedef struct TransInfo {
        /* alternative transformation. used to add offset to tracking markers */
 #define T_ALT_TRANSFORM                (1 << 24)
 
+       /** #TransInfo.center has been set, don't change it. */
+#define T_OVERRIDE_CENTER      (1 << 25)
+
 /* TransInfo->modifiers */
 #define        MOD_CONSTRAINT_SELECT   0x01
 #define        MOD_PRECISION                   0x02
diff --git a/source/blender/editors/transform/transform_generics.c 
b/source/blender/editors/transform/transform_generics.c
index c23da19f830..65c8f70c06d 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -1331,7 +1331,12 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator 
*op, const wmEvent *eve
                        t->current_orientation = V3D_MANIP_GLOBAL;
                }
        }
-       
+
+       if (op && (prop = RNA_struct_find_property(op->ptr, "center_override")) 
&& RNA_property_is_set(op->ptr, prop)) {
+               RNA_property_float_get_array(op->ptr, prop, t->center);
+               t->flag |= T_OVERRIDE_CENTER;
+       }
+
        if (op && ((prop = RNA_struct_find_property(op->ptr, 
"release_confirm")) &&
                   RNA_property_is_set(op->ptr, prop)))
        {
@@ -1835,7 +1840,9 @@ static void calculateCenter_FromAround(TransInfo *t, int 
around, float r_center[
 
 void calculateCenter(TransInfo *t)
 {
-       calculateCenter_FromAround(t, t->around, t->center);
+       if ((t->flag & T_OVERRIDE_CENTER) == 0) {
+               calculateCenter_FromAround(t, t->around, t->center);
+       }
        calculateCenterGlobal(t, t->center, t->center_global);
 
        /* avoid calculating again */
@@ -1849,7 +1856,7 @@ void calculateCenter(TransInfo *t)
        calculateCenter2D(t);
 
        /* for panning from cameraview */
-       if (t->flag & T_OBJECT) {
+       if ((t->flag & T_OBJECT) && (t->flag & T_OVERRIDE_CENTER) == 0) {
                if (t->spacetype == SPACE_VIEW3D && t->ar && t->ar->regiontype 
== RGN_TYPE_WINDOW) {
                        
                        if (t->flag & T_CAMERA) {
diff --git a/source/blender/editors/transform/transform_ops.c 
b/source/blender/editors/transform/transform_ops.c
index 2a97384cf7d..273d312eccb 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -565,6 +565,14 @@ void Transform_Properties(struct wmOperatorType *ot, int 
flags)
                RNA_def_boolean(ot->srna, "correct_uv", 0, "Correct UVs", 
"Correct UV coordinates when transforming");
        }
 
+       if (flags & P_CENTER) {
+               /* For manipulators that define their own center. */
+               prop = RNA_def_property(ot->srna, "center_override", 
PROP_FLOAT, PROP_XYZ);
+               RNA_def_property_array(prop, 3);
+               RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
+               RNA_def_property_ui_text(prop, "Center", "Force using this 
center value (when set)");
+       }
+
        if ((flags & P_NO_DEFAULTS) == 0) {
                // Add confirm method all the time. At the end because it's not 
really that important and should be hidden only in log, not in keymap edit
                /*prop =*/ RNA_def_boolean(ot->srna, "release_confirm", 0, 
"Confirm on Release", "Always confirm operation when releasing button");
@@ -612,7 +620,8 @@ static void TRANSFORM_OT_resize(struct wmOperatorType *ot)
 
        RNA_def_float_vector(ot->srna, "value", 3, VecOne, -FLT_MAX, FLT_MAX, 
"Vector", "", -FLT_MAX, FLT_MAX);
 
-       Transform_Properties(ot, P_CONSTRAINT | P_PROPORTIONAL | P_MIRROR | 
P_GEO_SNAP | P_OPTIONS | P_GPENCIL_EDIT);
+       Transform_Properties(
+               ot, P_CONSTRAINT | P_PROPORTIONAL | P_MIRROR | P_GEO_SNAP | 
P_OPTIONS | P_GPENCIL_EDIT | P_CENTER);
 }
 
 static int skin_resize_poll(bContext *C)
@@ -663,7 +672,7 @@ static void TRANSFORM_OT_trackball(struct wmOperatorType 
*ot)
        /* Maybe we could use float_vector_xyz here too? */
        RNA_def_float_rotation(ot->srna, "value", 2, NULL, -FLT_MAX, FLT_MAX, 
"Angle", "", -FLT_MAX, FLT_MAX);
 
-       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_GPENCIL_EDIT);
+       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_GPENCIL_EDIT | P_CENTER);
 }
 
 static void TRANSFORM_OT_rotate(struct wmOperatorType *ot)
@@ -683,7 +692,8 @@ static void TRANSFORM_OT_rotate(struct wmOperatorType *ot)
 
        RNA_def_float_rotation(ot->srna, "value", 0, NULL, -FLT_MAX, FLT_MAX, 
"Angle", "", -M_PI * 2, M_PI * 2);
 
-       Transform_Properties(ot, P_AXIS | P_CONSTRAINT | P_PROPORTIONAL | 
P_MIRROR | P_GEO_SNAP | P_GPENCIL_EDIT);
+       Transform_Properties(
+               ot, P_AXIS | P_CONSTRAINT | P_PROPORTIONAL | P_MIRROR | 
P_GEO_SNAP | P_GPENCIL_EDIT | P_CENTER);
 }
 
 static void TRANSFORM_OT_tilt(struct wmOperatorType *ot)
@@ -726,7 +736,7 @@ static void TRANSFORM_OT_bend(struct wmOperatorType *ot)
 
        RNA_def_float_rotation(ot->srna, "value", 1, NULL, -FLT_MAX, FLT_MAX, 
"Angle", "", -M_PI * 2, M_PI * 2);
 
-       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_GPENCIL_EDIT);
+       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_GPENCIL_EDIT | P_CENTER);
 }
 
 static void TRANSFORM_OT_shear(struct wmOperatorType *ot)
@@ -767,7 +777,7 @@ static void TRANSFORM_OT_push_pull(struct wmOperatorType 
*ot)
 
        RNA_def_float(ot->srna, "value", 0, -FLT_MAX, FLT_MAX, "Distance", "", 
-FLT_MAX, FLT_MAX);
 
-       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP);
+       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | P_CENTER);
 }
 
 static void TRANSFORM_OT_shrink_fatten(struct wmOperatorType *ot)
@@ -810,7 +820,7 @@ static void TRANSFORM_OT_tosphere(struct wmOperatorType *ot)
 
        RNA_def_float_factor(ot->srna, "value", 0, 0, 1, "Factor", "", 0, 1);
 
-       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_GPENCIL_EDIT);
+       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_GPENCIL_EDIT | P_CENTER);
 }
 
 static void TRANSFORM_OT_mirror(struct wmOperatorType *ot)
@@ -828,7 +838,7 @@ static void TRANSFORM_OT_mirror(struct wmOperatorType *ot)
        ot->cancel = transform_cancel;
        ot->poll   = ED_operator_screenactive;
 
-       Transform_Properties(ot, P_CONSTRAINT | P_PROPORTIONAL | 
P_GPENCIL_EDIT);
+       Transform_Properties(ot, P_CONSTRAINT | P_PROPORTIONAL | P_GPENCIL_EDIT 
| P_CENTER);
 }
 
 static void TRANSFORM_OT_edge_slide(struct wmOperatorType *ot)
@@ -991,7 +1001,8 @@ static void TRANSFORM_OT_transform(struct wmOperatorType 
*ot)
 
        RNA_def_float_vector(ot->srna, "value", 4, NULL, -FLT_MAX, FLT_MAX, 
"Values", "", -FLT_MAX, FLT_MAX);
 
-       Transform_Properties(ot, P_AXIS | P_CONSTRAINT | P_PROPORTIONAL | 
P_MIRROR | P_ALIGN_SNAP | P_GPENCIL_EDIT);
+       Transform_Properties(
+               ot, P_AXIS | P_CONSTRAINT | P_PROPORTIONAL | P_MIRROR | 
P_ALIGN_SNAP | P_GPENCIL_EDIT | P_CENTER);
 }
 
 void transform_operatortypes(void)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to