transform:
authorMartin Poirier <theeth@yahoo.com>
Mon, 4 Jan 2010 20:49:42 +0000 (20:49 +0000)
committerMartin Poirier <theeth@yahoo.com>
Mon, 4 Jan 2010 20:49:42 +0000 (20:49 +0000)
Rotation operator now saves axis of rotation (when not using a constraint). Better for operator redo and tweak (would use a Z axis because of matrix init)

Also fix crash in Translation operator redo and tweak (rv3d is not always available).

source/blender/editors/transform/transform.c
source/blender/editors/transform/transform.h
source/blender/editors/transform/transform_ops.c

index 7de2006a35c019db44f5a041cce645e38815f167..e8e7e323496ed628dfeffd8b8ce7f1ed28b75357 100644 (file)
@@ -1384,6 +1384,11 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
                RNA_float_set(op->ptr, "proportional_size", t->prop_size);
        }
 
+       if (RNA_struct_find_property(op->ptr, "axis"))
+       {
+               RNA_float_set_array(op->ptr, "axis", t->axis);
+       }
+
        if (RNA_struct_find_property(op->ptr, "mirror"))
        {
                RNA_boolean_set(op->ptr, "mirror", t->flag & T_MIRROR);
@@ -1577,6 +1582,13 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
                t->flag |= T_AUTOVALUES;
        }
 
+       /* Transformation axis from operator */
+       if (RNA_struct_find_property(op->ptr, "axis") && RNA_property_is_set(op->ptr, "axis"))
+       {
+               RNA_float_get_array(op->ptr, "axis", t->axis);
+               normalize_v3(t->axis);
+       }
+
        /* Constraint init from operator */
        if (RNA_struct_find_property(op->ptr, "constraint_axis") && RNA_property_is_set(op->ptr, "constraint_axis"))
        {
@@ -2662,6 +2674,10 @@ void initRotation(TransInfo *t)
        
        if (t->flag & T_2D_EDIT)
                t->flag |= T_NO_CONSTRAINT;
+
+       VECCOPY(t->axis, t->viewinv[2]);
+       mul_v3_fl(t->axis, -1.0f);
+       normalize_v3(t->axis);
 }
 
 static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short around) {
@@ -2906,13 +2922,8 @@ int Rotation(TransInfo *t, short mval[2])
        
        float final;
        
-       float axis[3];
        float mat[3][3];
        
-       VECCOPY(axis, t->viewinv[2]);
-       mul_v3_fl(axis, -1.0f);
-       normalize_v3(axis);
-       
        final = t->values[0];
        
        applyNDofInput(&t->ndof, &final);
@@ -2920,7 +2931,7 @@ int Rotation(TransInfo *t, short mval[2])
        snapGrid(t, &final);
        
        if (t->con.applyRot) {
-               t->con.applyRot(t, NULL, axis, &final);
+               t->con.applyRot(t, NULL, t->axis, &final);
        }
        
        applySnapping(t, &final);
@@ -2947,13 +2958,13 @@ int Rotation(TransInfo *t, short mval[2])
                sprintf(str, "Rot: %.2f%s %s", 180.0*final/M_PI, t->con.text, t->proptext);
        }
        
-       vec_rot_to_mat3( mat,axis, final);
+       vec_rot_to_mat3( mat, t->axis, final);
        
        // TRANSFORM_FIX_ME
 //     t->values[0] = final;           // used in manipulator
 //     copy_m3_m3(t->mat, mat);        // used in manipulator
        
-       applyRotation(t, final, axis);
+       applyRotation(t, final, t->axis);
        
        recalcData(t);
        
@@ -3085,9 +3096,11 @@ void initTranslation(TransInfo *t)
        if(t->spacetype == SPACE_VIEW3D) {
                RegionView3D *rv3d = t->ar->regiondata;
 
-               t->snap[0] = 0.0f;
-               t->snap[1] = rv3d->gridview * 1.0f;
-               t->snap[2] = t->snap[1] * 0.1f;
+               if (rv3d) {
+                       t->snap[0] = 0.0f;
+                       t->snap[1] = rv3d->gridview * 1.0f;
+                       t->snap[2] = t->snap[1] * 0.1f;
+               }
        }
        else if(t->spacetype == SPACE_IMAGE) {
                t->snap[0] = 0.0f;
index 72d970c967aab95f7364083cc1fe0ded914860a3..fd4f67f4f272b53d73a760017928bc77424902b2 100644 (file)
@@ -315,6 +315,8 @@ typedef struct TransInfo {
 
        float           values[4];
        float           auto_values[4];
+       float           axis[3];
+
        void            *view;
        struct ScrArea  *sa;
        struct ARegion  *ar;
index 4c118aa26252a8c08345f46e2e18e60969930987..1ef0bdb0e054ca2e544746f083cb94537098cfd9 100644 (file)
@@ -385,6 +385,15 @@ void Properties_Proportional(struct wmOperatorType *ot)
        RNA_def_float(ot->srna, "proportional_size", 1, 0, FLT_MAX, "Proportional Size", "", 0, 100);
 }
 
+void Properties_Axis(struct wmOperatorType *ot)
+{
+       PropertyRNA *prop;
+
+       prop= RNA_def_property(ot->srna, "axis", PROP_FLOAT, PROP_DIRECTION);
+       RNA_def_property_array(prop, 3);
+       RNA_def_property_ui_text(prop, "Axis", "The axis around which the transformation occurs.");
+}
+
 void Properties_Snapping(struct wmOperatorType *ot, short fullsnap, short align)
 {
        RNA_def_boolean(ot->srna, "snap", 0, "Use Snapping Options", "");
@@ -504,6 +513,8 @@ void TRANSFORM_OT_rotate(struct wmOperatorType *ot)
 
        RNA_def_float_rotation(ot->srna, "value", 1, NULL, -FLT_MAX, FLT_MAX, "Angle", "", -M_PI*2, M_PI*2);
 
+       Properties_Axis(ot);
+
        Properties_Proportional(ot);
 
        RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
@@ -757,6 +768,8 @@ 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);
 
+       Properties_Axis(ot);
+
        Properties_Proportional(ot);
        RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");