forked from bartvdbraak/blender
Fix #33487: game engine did not convert objects with rotation modes other than
Euler XYZ correctly, was never implemented;
This commit is contained in:
parent
593ae2c8f4
commit
779375251c
@ -89,7 +89,7 @@ int BKE_object_is_libdata(struct Object *ob);
|
|||||||
int BKE_object_obdata_is_libdata(struct Object *ob);
|
int BKE_object_obdata_is_libdata(struct Object *ob);
|
||||||
|
|
||||||
void BKE_object_scale_to_mat3(struct Object *ob, float mat[3][3]);
|
void BKE_object_scale_to_mat3(struct Object *ob, float mat[3][3]);
|
||||||
void BKE_object_rot_to_mat3(struct Object *ob, float mat[3][3]);
|
void BKE_object_rot_to_mat3(struct Object *ob, float mat[3][3], short use_drot);
|
||||||
void BKE_object_mat3_to_rot(struct Object *ob, float mat[3][3], short use_compat);
|
void BKE_object_mat3_to_rot(struct Object *ob, float mat[3][3], short use_compat);
|
||||||
void BKE_object_to_mat3(struct Object *ob, float mat[3][3]);
|
void BKE_object_to_mat3(struct Object *ob, float mat[3][3]);
|
||||||
void BKE_object_to_mat4(struct Object *ob, float mat[4][4]);
|
void BKE_object_to_mat4(struct Object *ob, float mat[4][4]);
|
||||||
|
@ -1539,7 +1539,7 @@ void BKE_object_scale_to_mat3(Object *ob, float mat[3][3])
|
|||||||
size_to_mat3(mat, vec);
|
size_to_mat3(mat, vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BKE_object_rot_to_mat3(Object *ob, float mat[3][3])
|
void BKE_object_rot_to_mat3(Object *ob, float mat[3][3], short use_drot)
|
||||||
{
|
{
|
||||||
float rmat[3][3], dmat[3][3];
|
float rmat[3][3], dmat[3][3];
|
||||||
|
|
||||||
@ -1570,7 +1570,10 @@ void BKE_object_rot_to_mat3(Object *ob, float mat[3][3])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* combine these rotations */
|
/* combine these rotations */
|
||||||
mul_m3_m3m3(mat, dmat, rmat);
|
if(use_drot)
|
||||||
|
mul_m3_m3m3(mat, dmat, rmat);
|
||||||
|
else
|
||||||
|
copy_m3_m3(mat, rmat);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BKE_object_mat3_to_rot(Object *ob, float mat[3][3], short use_compat)
|
void BKE_object_mat3_to_rot(Object *ob, float mat[3][3], short use_compat)
|
||||||
@ -1715,7 +1718,7 @@ void BKE_object_to_mat3(Object *ob, float mat[3][3]) /* no parent */
|
|||||||
BKE_object_scale_to_mat3(ob, smat);
|
BKE_object_scale_to_mat3(ob, smat);
|
||||||
|
|
||||||
/* rot */
|
/* rot */
|
||||||
BKE_object_rot_to_mat3(ob, rmat);
|
BKE_object_rot_to_mat3(ob, rmat, TRUE);
|
||||||
mul_m3_m3m3(mat, rmat, smat);
|
mul_m3_m3m3(mat, rmat, smat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,7 +447,7 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo
|
|||||||
float tmat[3][3], timat[3][3];
|
float tmat[3][3], timat[3][3];
|
||||||
|
|
||||||
/* simple rotation matrix */
|
/* simple rotation matrix */
|
||||||
BKE_object_rot_to_mat3(ob, rsmat);
|
BKE_object_rot_to_mat3(ob, rsmat, TRUE);
|
||||||
|
|
||||||
/* correct for scale, note mul_m3_m3m3 has swapped args! */
|
/* correct for scale, note mul_m3_m3m3 has swapped args! */
|
||||||
BKE_object_scale_to_mat3(ob, tmat);
|
BKE_object_scale_to_mat3(ob, tmat);
|
||||||
|
@ -2025,7 +2025,7 @@ static void set_axis(Scene *scene, Object *ob, MovieClip *clip, MovieTrackingOb
|
|||||||
if (!flip) {
|
if (!flip) {
|
||||||
float lmat[4][4], ilmat[4][4], rmat[3][3];
|
float lmat[4][4], ilmat[4][4], rmat[3][3];
|
||||||
|
|
||||||
BKE_object_rot_to_mat3(ob, rmat);
|
BKE_object_rot_to_mat3(ob, rmat, TRUE);
|
||||||
invert_m3(rmat);
|
invert_m3(rmat);
|
||||||
mul_m4_m4m3(mat, mat, rmat);
|
mul_m4_m4m3(mat, mat, rmat);
|
||||||
|
|
||||||
|
@ -2187,26 +2187,37 @@ static void bl_ConvertBlenderObject_Single(
|
|||||||
blenderobject->loc[1]+blenderobject->dloc[1],
|
blenderobject->loc[1]+blenderobject->dloc[1],
|
||||||
blenderobject->loc[2]+blenderobject->dloc[2]
|
blenderobject->loc[2]+blenderobject->dloc[2]
|
||||||
);
|
);
|
||||||
MT_Vector3 eulxyz(blenderobject->rot);
|
|
||||||
|
MT_Matrix3x3 rotation;
|
||||||
|
float rotmat[3][3];
|
||||||
|
BKE_object_rot_to_mat3(blenderobject, rotmat, FALSE);
|
||||||
|
rotation.setValue3x3((float*)rotmat);
|
||||||
|
|
||||||
MT_Vector3 scale(blenderobject->size);
|
MT_Vector3 scale(blenderobject->size);
|
||||||
|
|
||||||
if (converter->addInitFromFrame) {//rcruiz
|
if (converter->addInitFromFrame) {//rcruiz
|
||||||
float eulxyzPrev[3];
|
|
||||||
blenderscene->r.cfra=blenderscene->r.sfra-1;
|
blenderscene->r.cfra=blenderscene->r.sfra-1;
|
||||||
//XXX update_for_newframe();
|
//XXX update_for_newframe();
|
||||||
MT_Vector3 tmp=pos-MT_Point3(blenderobject->loc[0]+blenderobject->dloc[0],
|
MT_Vector3 tmp=pos-MT_Point3(blenderobject->loc[0]+blenderobject->dloc[0],
|
||||||
blenderobject->loc[1]+blenderobject->dloc[1],
|
blenderobject->loc[1]+blenderobject->dloc[1],
|
||||||
blenderobject->loc[2]+blenderobject->dloc[2]
|
blenderobject->loc[2]+blenderobject->dloc[2]
|
||||||
);
|
);
|
||||||
eulxyzPrev[0]=blenderobject->rot[0];
|
|
||||||
eulxyzPrev[1]=blenderobject->rot[1];
|
float rotmatPrev[3][3];
|
||||||
eulxyzPrev[2]=blenderobject->rot[2];
|
BKE_object_rot_to_mat3(blenderobject, rotmatPrev, FALSE);
|
||||||
|
|
||||||
|
float eulxyz[3], eulxyzPrev[3];
|
||||||
|
mat3_to_eul(eulxyz, rotmat);
|
||||||
|
mat3_to_eul(eulxyzPrev, rotmatPrev);
|
||||||
|
|
||||||
double fps = (double) blenderscene->r.frs_sec/
|
double fps = (double) blenderscene->r.frs_sec/
|
||||||
(double) blenderscene->r.frs_sec_base;
|
(double) blenderscene->r.frs_sec_base;
|
||||||
|
|
||||||
tmp.scale(fps, fps, fps);
|
tmp.scale(fps, fps, fps);
|
||||||
inivel.push_back(tmp);
|
inivel.push_back(tmp);
|
||||||
tmp=eulxyz-eulxyzPrev;
|
tmp[0]=eulxyz[0]-eulxyzPrev[0];
|
||||||
|
tmp[1]=eulxyz[1]-eulxyzPrev[1];
|
||||||
|
tmp[2]=eulxyz[2]-eulxyzPrev[2];
|
||||||
tmp.scale(fps, fps, fps);
|
tmp.scale(fps, fps, fps);
|
||||||
iniang.push_back(tmp);
|
iniang.push_back(tmp);
|
||||||
blenderscene->r.cfra=blenderscene->r.sfra;
|
blenderscene->r.cfra=blenderscene->r.sfra;
|
||||||
@ -2214,7 +2225,7 @@ static void bl_ConvertBlenderObject_Single(
|
|||||||
}
|
}
|
||||||
|
|
||||||
gameobj->NodeSetLocalPosition(pos);
|
gameobj->NodeSetLocalPosition(pos);
|
||||||
gameobj->NodeSetLocalOrientation(MT_Matrix3x3(eulxyz));
|
gameobj->NodeSetLocalOrientation(rotation);
|
||||||
gameobj->NodeSetLocalScale(scale);
|
gameobj->NodeSetLocalScale(scale);
|
||||||
gameobj->NodeUpdateGS(0);
|
gameobj->NodeUpdateGS(0);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user