Fix T46805: Scale along axis fails w/ Python
authorCampbell Barton <ideasman42@gmail.com>
Tue, 24 Nov 2015 05:50:21 +0000 (16:50 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 24 Nov 2015 05:50:21 +0000 (16:50 +1100)
't->value' no longer has constraint matrix applied for translate,
fix for T46003 is no longer needed.

source/blender/editors/transform/transform.c
source/blender/editors/transform/transform_constraints.c

index ae32e9ded6274549ebdd167c32e2a3e828d68727..c6c7b95b720c1c24b4a45f626ccf4eb0aff01c88 100644 (file)
@@ -1890,6 +1890,9 @@ static void drawTransformPixel(const struct bContext *UNUSED(C), ARegion *ar, vo
        }
 }
 
+/**
+ * \see #initTransform which reads values from the operator.
+ */
 void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
 {
        ToolSettings *ts = CTX_data_tool_settings(C);
@@ -1907,10 +1910,6 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
 
                copy_v4_v4(values, (t->flag & T_AUTOVALUES) ? t->auto_values : t->values);
 
-               if (t->con.mode & CON_APPLY) {
-                       mul_m3_v3(t->con.imtx, values);
-               }
-
                if (RNA_property_array_check(prop)) {
                        RNA_property_float_set_array(op->ptr, prop, values);
                }
@@ -2044,6 +2043,7 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
 /**
  * \note  caller needs to free 't' on a 0 return
  * \warning  \a event might be NULL (when tweaking from redo panel)
+ * \see #saveTransform which writes these values back.
  */
 bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *event, int mode)
 {
@@ -2353,10 +2353,6 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
                        values[0] = RNA_float_get(op->ptr, "value");
                }
 
-               if (t->con.mode & CON_APPLY) {
-                       mul_m3_v3(t->con.mtx, values);
-               }
-
                copy_v4_v4(t->values, values);
                copy_v4_v4(t->auto_values, values);
                t->flag |= T_AUTOVALUES;
@@ -3398,36 +3394,36 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3])
 static void applyResize(TransInfo *t, const int mval[2])
 {
        TransData *td;
-       float size[3], mat[3][3];
-       float ratio;
+       float mat[3][3];
        int i;
        char str[MAX_INFO_LEN];
 
-       /* for manipulator, center handle, the scaling can't be done relative to center */
-       if ((t->flag & T_USES_MANIPULATOR) && t->con.mode == 0) {
-               ratio = 1.0f - ((t->mouse.imval[0] - mval[0]) + (t->mouse.imval[1] - mval[1])) / 100.0f;
+       if (t->flag & T_AUTOVALUES) {
+               copy_v3_v3(t->values, t->auto_values);
        }
        else {
-               ratio = t->values[0];
-       }
-       
-       copy_v3_fl(size, ratio);
-       
-       snapGridIncrement(t, size);
-       
-       if (applyNumInput(&t->num, size)) {
-               constraintNumInput(t, size);
-       }
-       
-       applySnapping(t, size);
-       
-       if (t->flag & T_AUTOVALUES) {
-               copy_v3_v3(size, t->auto_values);
+               float ratio;
+
+               /* for manipulator, center handle, the scaling can't be done relative to center */
+               if ((t->flag & T_USES_MANIPULATOR) && t->con.mode == 0) {
+                       ratio = 1.0f - ((t->mouse.imval[0] - mval[0]) + (t->mouse.imval[1] - mval[1])) / 100.0f;
+               }
+               else {
+                       ratio = t->values[0];
+               }
+
+               copy_v3_fl(t->values, ratio);
+
+               snapGridIncrement(t, t->values);
+
+               if (applyNumInput(&t->num, t->values)) {
+                       constraintNumInput(t, t->values);
+               }
+
+               applySnapping(t, t->values);
        }
        
-       copy_v3_v3(t->values, size);
-       
-       size_to_mat3(mat, size);
+       size_to_mat3(mat, t->values);
        
        if (t->con.applySize) {
                t->con.applySize(t, NULL, mat);
@@ -3435,7 +3431,7 @@ static void applyResize(TransInfo *t, const int mval[2])
        
        copy_m3_m3(t->mat, mat);    // used in manipulator
        
-       headerResize(t, size, str);
+       headerResize(t, t->values, str);
        
        for (i = 0, td = t->data; i < t->total; i++, td++) {
                if (td->flag & TD_NOACTION)
@@ -3448,8 +3444,8 @@ static void applyResize(TransInfo *t, const int mval[2])
        }
        
        /* evil hack - redo resize if cliping needed */
-       if (t->flag & T_CLIP_UV && clipUVTransform(t, size, 1)) {
-               size_to_mat3(mat, size);
+       if (t->flag & T_CLIP_UV && clipUVTransform(t, t->values, 1)) {
+               size_to_mat3(mat, t->values);
                
                if (t->con.applySize)
                        t->con.applySize(t, NULL, mat);
@@ -4380,36 +4376,45 @@ static void applyTranslationValue(TransInfo *t, const float vec[3])
        }
 }
 
-/* uses t->vec to store actual translation in */
 static void applyTranslation(TransInfo *t, const int UNUSED(mval[2]))
 {
        char str[MAX_INFO_LEN];
+       float value_final[3];
+
+       if (t->flag & T_AUTOVALUES) {
+               copy_v3_v3(t->values, t->auto_values);
+       }
+       else {
+               if ((t->con.mode & CON_APPLY) == 0) {
+                       snapGridIncrement(t, t->values);
+               }
 
-       if (t->con.mode & CON_APPLY) {
-               float pvec[3] = {0.0f, 0.0f, 0.0f};
-               float tvec[3];
                if (applyNumInput(&t->num, t->values)) {
                        removeAspectRatio(t, t->values);
                }
+
                applySnapping(t, t->values);
-               t->con.applyVec(t, NULL, t->values, tvec, pvec);
-               copy_v3_v3(t->values, tvec);
+       }
+
+       if (t->con.mode & CON_APPLY) {
+               float pvec[3] = {0.0f, 0.0f, 0.0f};
+               t->con.applyVec(t, NULL, t->values, value_final, pvec);
                headerTranslation(t, pvec, str);
+
+               /* only so we have re-usable value with redo, see T46741. */
+               mul_v3_m3v3(t->values, t->con.imtx, value_final);
        }
        else {
-               snapGridIncrement(t, t->values);
-               if (applyNumInput(&t->num, t->values)) {
-                       removeAspectRatio(t, t->values);
-               }
-               applySnapping(t, t->values);
                headerTranslation(t, t->values, str);
        }
 
-       applyTranslationValue(t, t->values);
+       /* don't use 't->values' now on */
+
+       applyTranslationValue(t, value_final);
 
        /* evil hack - redo translation if clipping needed */
-       if (t->flag & T_CLIP_UV && clipUVTransform(t, t->values, 0)) {
-               applyTranslationValue(t, t->values);
+       if (t->flag & T_CLIP_UV && clipUVTransform(t, value_final, 0)) {
+               applyTranslationValue(t, value_final);
 
                /* In proportional edit it can happen that */
                /* vertices in the radius of the brush end */
index f6422446e50f10c3dc6b67119e248483d32d557d..9fd5b7288d4a52a5786dec5944c5653b586a8428 100644 (file)
@@ -150,7 +150,7 @@ static void postConstraintChecks(TransInfo *t, float vec[3], float pvec[3])
 
        /* autovalues is operator param, use that directly but not if snapping is forced */
        if (t->flag & T_AUTOVALUES && (t->tsnap.status & SNAP_FORCED) == 0) {
-               mul_v3_m3v3(vec, t->con.imtx, t->auto_values);
+               copy_v3_v3(vec, t->auto_values);
                constraintAutoValues(t, vec);
                /* inverse transformation at the end */
        }