[Bf-blender-cvs] [3cf0034e41f] collada: new: Collada added global orientation transform to export

Gaia Clary noreply at git.blender.org
Thu May 23 11:55:32 CEST 2019


Commit: 3cf0034e41f6fd38323f946637a6cbdabde29f65
Author: Gaia Clary
Date:   Thu May 23 11:54:39 2019 +0200
Branches: collada
https://developer.blender.org/rB3cf0034e41f6fd38323f946637a6cbdabde29f65

new: Collada added global orientation transform to export

===================================================================

M	source/blender/collada/AnimationExporter.cpp
M	source/blender/collada/ArmatureExporter.cpp
M	source/blender/collada/BCSampleData.cpp
M	source/blender/collada/BlenderContext.h
M	source/blender/collada/ControllerExporter.cpp
M	source/blender/collada/GeometryExporter.cpp
M	source/blender/collada/TransformWriter.cpp
M	source/blender/collada/TransformWriter.h
M	source/blender/collada/collada_utils.cpp
M	source/blender/collada/collada_utils.h

===================================================================

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 TransformWrit

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list