take delta's into account when applying the objects matrix (dloc, drot, dsize).
authorCampbell Barton <ideasman42@gmail.com>
Fri, 12 Nov 2010 11:16:04 +0000 (11:16 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 12 Nov 2010 11:16:04 +0000 (11:16 +0000)
Now object_apply_mat4() can be used as the reverse of object_to_mat4().

Noticeable result is fly mode and 'Apply Visual Transform' dont jump when deltas are used, also means setting matrix from python works as expected.

source/blender/blenkernel/intern/object.c
source/blender/blenlib/BLI_math_vector.h
source/blender/blenlib/intern/math_vector_inline.c

index 9c76db2..a10901d 100644 (file)
@@ -1682,13 +1682,17 @@ void object_mat3_to_rot(Object *ob, float mat[][3], short use_compat)
        switch(ob->rotmode) {
        case ROT_MODE_QUAT:
                mat3_to_quat(ob->quat, mat);
+               sub_v4_v4(ob->quat, ob->dquat);
                break;
        case ROT_MODE_AXISANGLE:
                mat3_to_axis_angle(ob->rotAxis, &ob->rotAngle, mat);
+               sub_v3_v3(ob->rotAxis, ob->drotAxis);
+               ob->rotAngle -= ob->drotAngle;
                break;
        default: /* euler */
                if(use_compat)  mat3_to_compatible_eulO(ob->rot, ob->rot, ob->rotmode, mat);
                else                    mat3_to_eulO(ob->rot, ob->rotmode, mat);
+               sub_v3_v3(ob->rot, ob->drot);
        }
 }
 
@@ -1712,6 +1716,10 @@ void object_apply_mat4(Object *ob, float mat[][4], const short use_compat, const
                mat4_to_loc_rot_size(ob->loc, rot, ob->size, mat);
                object_mat3_to_rot(ob, rot, use_compat);
        }
+       
+       sub_v3_v3(ob->loc, ob->dloc);
+       sub_v3_v3(ob->size, ob->dsize);
+       /* object_mat3_to_rot handles delta rotations */
 }
 
 void object_to_mat3(Object *ob, float mat[][3])        /* no parent */
index 3fceef3..2e59695 100644 (file)
@@ -63,6 +63,8 @@ MINLINE void sub_v2_v2(float r[2], const float a[2]);
 MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2]);
 MINLINE void sub_v3_v3(float r[3], const float a[3]);
 MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3]);
+MINLINE void sub_v4_v4(float r[4], const float a[4]);
+MINLINE void sub_v4_v4v4(float r[4], const float a[4], const float b[4]);
 
 MINLINE void mul_v2_fl(float r[2], float f);
 MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f);
index a45356f..6bccb00 100644 (file)
@@ -149,6 +149,23 @@ MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
        r[2]= a[2] - b[2];
 }
 
+MINLINE void sub_v4_v4(float r[4], const float a[4])
+{
+       r[0] -= a[0];
+       r[1] -= a[1];
+       r[2] -= a[2];
+       r[3] -= a[3];
+}
+
+MINLINE void sub_v4_v4v4(float r[3], const float a[3], const float b[3])
+{
+       r[0]= a[0] - b[0];
+       r[1]= a[1] - b[1];
+       r[2]= a[2] - b[2];
+       r[3]= a[3] - b[3];
+}
+
+
 MINLINE void mul_v2_fl(float *v1, float f)
 {
        v1[0]*= f;