diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-02-17 03:39:29 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-02-17 03:39:29 +0300 |
commit | f2453ecdcd179fb696494d03501c0dd149ee1ed2 (patch) | |
tree | 23fdd70d99c95b5efab3fb258db77b68501aa059 /source | |
parent | 09eb790f4bbc89ceac0dda949f2f42a3c94883a4 (diff) | |
parent | 5bc2c17161cfc23ca2d8c58e7e24458c277100ae (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/collada/AnimationExporter.cpp | 3 | ||||
-rw-r--r-- | source/blender/collada/AnimationImporter.cpp | 15 | ||||
-rw-r--r-- | source/blender/collada/collada_utils.cpp | 37 | ||||
-rw-r--r-- | source/blender/collada/collada_utils.h | 2 |
4 files changed, 55 insertions, 2 deletions
diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp index 01f800b08e1..cc772535e37 100644 --- a/source/blender/collada/AnimationExporter.cpp +++ b/source/blender/collada/AnimationExporter.cpp @@ -989,6 +989,9 @@ std::string AnimationExporter::create_4x4_source(std::vector<float> &frames, Obj double outmat[4][4]; converter.mat4_to_dae_double(outmat, mat); + if (this->export_settings->limit_precision) + bc_sanitize_mat(outmat, 6); + source.appendValues(outmat); j++; diff --git a/source/blender/collada/AnimationImporter.cpp b/source/blender/collada/AnimationImporter.cpp index 65acce41046..e63b70edcf5 100644 --- a/source/blender/collada/AnimationImporter.cpp +++ b/source/blender/collada/AnimationImporter.cpp @@ -780,6 +780,9 @@ void AnimationImporter::apply_matrix_curves(Object *ob, std::vector<FCurve *>& a std::vector<float>::iterator it; + float qref[4]; + unit_qt(qref); + // sample values at each frame for (it = frames.begin(); it != frames.end(); it++) { float fra = *it; @@ -814,8 +817,11 @@ void AnimationImporter::apply_matrix_curves(Object *ob, std::vector<FCurve *>& a } float rot[4], loc[3], scale[3]; + transpose_m4(mat); + + bc_rotate_from_reference_quat(rot, qref, mat); + copy_qt_qt(qref, rot); - mat4_to_quat(rot, mat); #if 0 for (int i = 0 ; i < 4; i++) { rot[i] = RAD2DEGF(rot[i]); @@ -1190,6 +1196,9 @@ void AnimationImporter::add_bone_animation_sampled(Object *ob, std::vector<FCurv std::sort(frames.begin(), frames.end()); + float qref[4]; + unit_qt(qref); + std::vector<float>::iterator it; // sample values at each frame @@ -1223,7 +1232,9 @@ void AnimationImporter::add_bone_animation_sampled(Object *ob, std::vector<FCurv float rot[4], loc[3], scale[3]; - mat4_to_quat(rot, mat); + bc_rotate_from_reference_quat(rot, qref, mat); + copy_qt_qt(qref, rot); + copy_v3_v3(loc, mat[3]); mat4_to_size(scale, mat); diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp index f351ebf7952..117e2ef7f76 100644 --- a/source/blender/collada/collada_utils.cpp +++ b/source/blender/collada/collada_utils.cpp @@ -384,6 +384,35 @@ void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], floa } } +/* +* Create rotation_quaternion from a delta rotation and a reference quat +* +* Input: +* mat_from: The rotation matrix before rotation +* mat_to : The rotation matrix after rotation +* qref : the quat corresponding to mat_from +* +* Output: +* rot : the calculated result (quaternion) +* +*/ +void bc_rotate_from_reference_quat(float quat_to[4], float quat_from[4], float mat_to[4][4]) +{ + float qd[4]; + float matd[4][4]; + float mati[4][4]; + float mat_from[4][4]; + quat_to_mat4(mat_from, quat_from); + + // Calculate the difference matrix matd between mat_from and mat_to + invert_m4_m4(mati, mat_from); + mul_m4_m4m4(matd, mati, mat_to); + + mat4_to_quat(qd, matd); + + mul_qt_qtqt(quat_to, qd, quat_from); // rot is the final rotation corresponding to mat_to +} + void bc_triangulate_mesh(Mesh *me) { bool use_beauty = false; @@ -841,3 +870,11 @@ void bc_sanitize_mat(float mat[4][4], int precision) for (int j = 0; j < 4; j++) mat[i][j] = double_round(mat[i][j], precision); } + +void bc_sanitize_mat(double mat[4][4], int precision) +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + mat[i][j] = double_round(mat[i][j], precision); +} + diff --git a/source/blender/collada/collada_utils.h b/source/blender/collada/collada_utils.h index 5d6e836b9c3..e3a16105861 100644 --- a/source/blender/collada/collada_utils.h +++ b/source/blender/collada/collada_utils.h @@ -93,6 +93,7 @@ extern void bc_match_scale(Object *ob, UnitConverter &bc_unit, bool scale_to_sce extern void bc_match_scale(std::vector<Object *> *objects_done, UnitConverter &unit_converter, bool scale_to_scene); extern void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], float *size); +extern void bc_rotate_from_reference_quat(float quat_to[4], float quat_from[4], float mat_to[4][4]); extern void bc_triangulate_mesh(Mesh *me); extern bool bc_is_leaf_bone(Bone *bone); @@ -100,6 +101,7 @@ extern EditBone *bc_get_edit_bone(bArmature * armature, char *name); extern int bc_set_layer(int bitfield, int layer, bool enable); extern int bc_set_layer(int bitfield, int layer); extern void bc_sanitize_mat(float mat[4][4], int precision); +extern void bc_sanitize_mat(double mat[4][4], int precision); extern IDProperty *bc_get_IDProperty(Bone *bone, std::string key); extern void bc_set_IDProperty(EditBone *ebone, const char *key, float value); |