From 3cf0034e41f6fd38323f946637a6cbdabde29f65 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Thu, 23 May 2019 11:54:39 +0200 Subject: new: Collada added global orientation transform to export --- source/blender/collada/AnimationExporter.cpp | 10 ++++-- source/blender/collada/ArmatureExporter.cpp | 10 ++---- source/blender/collada/BCSampleData.cpp | 19 +++++++++++- source/blender/collada/BlenderContext.h | 5 +++ source/blender/collada/ControllerExporter.cpp | 9 ++---- source/blender/collada/GeometryExporter.cpp | 18 +++++------ source/blender/collada/TransformWriter.cpp | 28 ++++++++++------- source/blender/collada/TransformWriter.h | 5 ++- source/blender/collada/collada_utils.cpp | 18 ++++++++++- source/blender/collada/collada_utils.h | 44 +++++++++++++++------------ 10 files changed, 107 insertions(+), 59 deletions(-) diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp index ba878a28e50..edd74886541 100644 --- a/source/blender/collada/AnimationExporter.cpp +++ b/source/blender/collada/AnimationExporter.cpp @@ -79,7 +79,7 @@ bool AnimationExporter::exportAnimations() { Scene *sce = export_settings.get_scene(); - LinkNode *export_set = this->export_settings->export_set; + LinkNode *export_set = this->export_settings.get_export_set(); bool has_anim_data = bc_has_animations(sce, export_set); int animation_count = 0; if (has_anim_data) { @@ -672,8 +672,14 @@ std::string AnimationExporter::collada_source_from_values( int precision = (this->export_settings.get_limit_precision()) ? 6 : -1; for (it = samples.begin(); it != samples.end(); it++) { BCMatrix sample = BCMatrix(*it->second); + BCMatrix global_transform = this->export_settings.get_global_transform(); DMatrix daemat; - sample.add_transform(this->export_settings.get_global_transform()); + if (this->export_settings.get_apply_global_orientation()) { + sample.apply_transform(global_transform); + } + else { + sample.add_transform(global_transform); + } sample.get_matrix(daemat, true, precision); source.appendValues(daemat); } diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp index 7d3904647de..6dfe6915892 100644 --- a/source/blender/collada/ArmatureExporter.cpp +++ b/source/blender/collada/ArmatureExporter.cpp @@ -291,6 +291,7 @@ void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW: } // OPEN_SIM_COMPATIBILITY + if (export_settings.get_open_sim()) { // Remove rotations vs armature from transform // parent_rest_rot * mat * irest_rot @@ -308,21 +309,16 @@ void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW: mul_m4_m4m4(mat, workmat, mat); - if (this->export_settings.get_apply_global_orientation()) { - Vector v; - copy_v3_v3(v, mat[3]); - bc_add_global_transform(v, this->export_settings.get_global_transform()); - copy_v3_v3(mat[3], v); - } } } + } if (this->export_settings.get_limit_precision()) { bc_sanitize_mat(mat, LIMITTED_PRECISION); } - TransformWriter::add_node_transform(node, mat, NULL); + TransformWriter::add_node_transform(node, mat, NULL, this->export_settings); } std::string ArmatureExporter::get_controller_id(Object *ob_arm, Object *ob) diff --git a/source/blender/collada/BCSampleData.cpp b/source/blender/collada/BCSampleData.cpp index ceb0e07b9eb..cf3668a08af 100644 --- a/source/blender/collada/BCSampleData.cpp +++ b/source/blender/collada/BCSampleData.cpp @@ -66,7 +66,7 @@ BCMatrix::BCMatrix(BC_global_forward_axis global_forward_axis, BC_global_up_axis mat3_from_axis_conversion( BC_DEFAULT_FORWARD, BC_DEFAULT_UP, global_forward_axis, global_up_axis, mrot); - // transpose_m3(mrot); // Assume that mat3_from_axis_conversion() returns a transposed matrix + transpose_m3(mrot); // TODO: Verify that mat3_from_axis_conversion() returns a transposed matrix copy_m4_m3(mat, mrot); set_transform(mat); } @@ -81,7 +81,24 @@ void BCMatrix::add_transform(const BCMatrix &mat, bool inverse) add_transform(this->matrix, mat.matrix, this->matrix, inverse); } +void BCMatrix::apply_transform(const BCMatrix &mat, bool inverse) +{ + apply_transform(this->matrix, mat.matrix, this->matrix, inverse); +} + void BCMatrix::add_transform(Matrix &to, const Matrix &transform, const Matrix &from, bool inverse) +{ + if (inverse) { + Matrix globinv; + invert_m4_m4(globinv, transform); + add_transform(to, globinv, from, /*inverse=*/false); + } + else { + mul_m4_m4m4(to, transform, from); + } +} + +void BCMatrix::apply_transform(Matrix &to, const Matrix &transform, const Matrix &from, bool inverse) { Matrix globinv; invert_m4_m4(globinv, transform); diff --git a/source/blender/collada/BlenderContext.h b/source/blender/collada/BlenderContext.h index 98c190afa94..da0384eba8b 100644 --- a/source/blender/collada/BlenderContext.h +++ b/source/blender/collada/BlenderContext.h @@ -106,9 +106,14 @@ class BCMatrix { const Matrix &transform, const Matrix &from, const bool inverted = false); + void apply_transform(Matrix &to, + const Matrix &transform, + const Matrix &from, + const bool inverted = false); void add_inverted_transform(Matrix &to, const Matrix &transform, const Matrix &from); void add_transform(const Matrix &matrix, const bool inverted = false); void add_transform(const BCMatrix &matrix, const bool inverted = false); + void apply_transform(const BCMatrix &matrix, const bool inverted = false); const bool in_range(const BCMatrix &other, float distance) const; static void sanitize(Matrix &matrix, int precision); diff --git a/source/blender/collada/ControllerExporter.cpp b/source/blender/collada/ControllerExporter.cpp index 4ae185ae684..adea9fd672a 100644 --- a/source/blender/collada/ControllerExporter.cpp +++ b/source/blender/collada/ControllerExporter.cpp @@ -432,6 +432,7 @@ void ControllerExporter::add_bind_shape_mat(Object *ob) BKE_object_matrix_local_get(ob, f_obmat); if (export_settings.get_apply_global_orientation()) { + // do nothing, rotation is going to be applied to the Data } else { bc_add_global_transform(f_obmat, export_settings.get_global_transform()); @@ -553,13 +554,7 @@ std::string ControllerExporter::add_inv_bind_mats_source(Object *ob_arm, mul_m4_m4m4(world, ob_arm->obmat, bind_mat); if (export_settings.get_apply_global_orientation()) { - Vector loc; - copy_v3_v3(loc, world[3]); - bc_add_global_transform(loc, export_settings.get_global_transform()); - copy_v3_v3(world[3], loc); - } - else { - bc_add_global_transform(world, export_settings.get_global_transform()); + bc_apply_global_transform(world, export_settings.get_global_transform()); } invert_m4_m4(mat, world); diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp index c0573dcc081..5125a9a0562 100644 --- a/source/blender/collada/GeometryExporter.cpp +++ b/source/blender/collada/GeometryExporter.cpp @@ -468,12 +468,12 @@ void GeometryExporter::createVertsSource(std::string geom_id, Mesh *me) int i = 0; for (i = 0; i < totverts; i++) { Vector co; - // if (export_settings.get_apply_global_orientation()) { - bc_add_global_transform(co, verts[i].co, export_settings.get_global_transform()); - //} - // else { - // copy_v3_v3(co, verts[i].co); - //} + if (export_settings.get_apply_global_orientation()) { + bc_add_global_transform(co, verts[i].co, export_settings.get_global_transform()); + } + else { + copy_v3_v3(co, verts[i].co); + } source.appendValues(co[0], co[1], co[2]); } @@ -616,9 +616,9 @@ void GeometryExporter::createNormalsSource(std::string geom_id, Mesh *me, std::v Normal &n = *it; Vector no{n.x, n.y, n.z}; - // if (export_settings.get_apply_global_orientation()) { - bc_add_global_transform(no, export_settings.get_global_transform()); - //} + if (export_settings.get_apply_global_orientation()) { + bc_add_global_transform(no, export_settings.get_global_transform()); + } source.appendValues(no[0], no[1], no[2]); } diff --git a/source/blender/collada/TransformWriter.cpp b/source/blender/collada/TransformWriter.cpp index dfe4add8e7f..0cbb8c65cf1 100644 --- a/source/blender/collada/TransformWriter.cpp +++ b/source/blender/collada/TransformWriter.cpp @@ -27,7 +27,9 @@ void TransformWriter::add_node_transform(COLLADASW::Node &node, float mat[4][4], - float parent_mat[4][4]) + float parent_mat[4][4], + BCExportSettings &export_settings + ) { // bool limit_precision = export_settings.limit_precision; float loc[3], rot[3], scale[3]; @@ -42,18 +44,24 @@ void TransformWriter::add_node_transform(COLLADASW::Node &node, copy_m4_m4(local, mat); } + if (export_settings.get_apply_global_orientation()) { + bc_apply_global_transform(local, export_settings.get_global_transform()); + } + double dmat[4][4]; UnitConverter *converter = new UnitConverter(); converter->mat4_to_dae_double(dmat, local); delete converter; - bc_decompose(local, loc, rot, NULL, scale); - if (node.getType() == COLLADASW::Node::JOINT) { // XXX Why are joints handled differently ? + // GC: I believe this is a mistake. Here we might want to + // export according to how the transformation type + // is set, see add_node_transform_ob() node.addMatrix("transform", dmat); } else { + bc_decompose(local, loc, rot, NULL, scale); add_transform(node, loc, rot, scale); } } @@ -71,14 +79,12 @@ void TransformWriter::add_node_transform_ob(COLLADASW::Node &node, Matrix f_obmat; BKE_object_matrix_local_get(ob, f_obmat); - // if (export_settings.is_export_root(ob)) { - // if (export_settings.get_apply_global_orientation()) { - // // do nothing. The rotation happens in the object data - // } - // else { - bc_add_global_transform(f_obmat, export_settings.get_global_transform()); - // } - //} + if (export_settings.get_apply_global_orientation()) { + bc_apply_global_transform(f_obmat, export_settings.get_global_transform()); + } + else { + bc_add_global_transform(f_obmat, export_settings.get_global_transform()); + } switch (transformation_type) { case BC_TRANSFORMATION_TYPE_MATRIX: { diff --git a/source/blender/collada/TransformWriter.h b/source/blender/collada/TransformWriter.h index 827d43e30f1..63f563ad58e 100644 --- a/source/blender/collada/TransformWriter.h +++ b/source/blender/collada/TransformWriter.h @@ -31,7 +31,10 @@ class TransformWriter { protected: - void add_node_transform(COLLADASW::Node &node, float mat[4][4], float parent_mat[4][4]); + void add_node_transform(COLLADASW::Node &node, + float mat[4][4], + float parent_mat[4][4], + BCExportSettings &export_settings); void add_node_transform_ob(COLLADASW::Node &node, Object *ob, BCExportSettings &export_settings); diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp index 8b8c9854781..9e8896c2b9f 100644 --- a/source/blender/collada/collada_utils.cpp +++ b/source/blender/collada/collada_utils.cpp @@ -967,8 +967,24 @@ void bc_add_global_transform(Matrix &to_mat, const BCMatrix &global_transform, c void bc_add_global_transform(Vector &to_vec, const BCMatrix &global_transform, const bool invert) { Matrix mat; + Vector from_vec; + copy_v3_v3(from_vec, to_vec); global_transform.get_matrix(mat, false, 6, invert); - mul_v3_m4v3(to_vec, mat, to_vec); + mul_v3_m4v3(to_vec, mat, from_vec); +} + +void bc_apply_global_transform(Matrix &to_mat, const BCMatrix &global_transform, const bool invert) +{ + BCMatrix mat(to_mat); + mat.apply_transform(global_transform, invert); + mat.get_matrix(to_mat); +} + +void bc_apply_global_transform(Vector &to_vec, const BCMatrix &global_transform, const bool invert) +{ + Matrix transform; + global_transform.get_matrix(transform); + mul_v3_m4v3(to_vec, transform, to_vec); } /** diff --git a/source/blender/collada/collada_utils.h b/source/blender/collada/collada_utils.h index acbf6f94add..810b9056193 100644 --- a/source/blender/collada/collada_utils.h +++ b/source/blender/collada/collada_utils.h @@ -230,27 +230,31 @@ extern bool bc_is_animated(BCMatrixSampleMap &values); extern bool bc_has_animations(Scene *sce, LinkNode *node); extern bool bc_has_animations(Object *ob); -void bc_add_global_transform(Matrix &to_mat, - const Matrix &from_mat, - const BCMatrix &global_transform, - const bool invert = false); -void bc_add_global_transform(Vector &to_vec, - const Vector &from_vec, - const BCMatrix &global_transform, - const bool invert = false); - -void bc_add_global_transform(Vector &to_vec, - const BCMatrix &global_transform, - const bool invert = false); -void bc_add_global_transform(Matrix &to_mat, - const BCMatrix &global_transform, - const bool invert = false); - +extern void bc_add_global_transform(Matrix &to_mat, + const Matrix &from_mat, + const BCMatrix &global_transform, + const bool invert = false); +extern void bc_add_global_transform(Vector &to_vec, + const Vector &from_vec, + const BCMatrix &global_transform, + const bool invert = false); +extern void bc_add_global_transform(Vector &to_vec, + const BCMatrix &global_transform, + const bool invert = false); +extern void bc_add_global_transform(Matrix &to_mat, + const BCMatrix &global_transform, + const bool invert = false); +extern void bc_apply_global_transform(Matrix &to_mat, + const BCMatrix &global_transform, + const bool invert = false); +extern void bc_apply_global_transform(Vector &to_vec, + const BCMatrix &global_transform, + const bool invert = false); extern void bc_create_restpose_mat(BCExportSettings &export_settings, - Bone *bone, - float to_mat[4][4], - float from_mat[4][4], - bool use_local_space); + Bone *bone, + float to_mat[4][4], + float from_mat[4][4], + bool use_local_space); class ColladaBaseNodes { private: -- cgit v1.2.3