Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaia Clary <gaia.clary@machinimatrix.org>2019-05-23 12:54:39 +0300
committerGaia Clary <gaia.clary@machinimatrix.org>2019-05-23 12:54:39 +0300
commit3cf0034e41f6fd38323f946637a6cbdabde29f65 (patch)
tree45ec4a4bcf455079f4c3015986a5a7224cdff638
parent4755c2345854dd97234de2438e00008311537dde (diff)
new: Collada added global orientation transform to exportcollada
-rw-r--r--source/blender/collada/AnimationExporter.cpp10
-rw-r--r--source/blender/collada/ArmatureExporter.cpp10
-rw-r--r--source/blender/collada/BCSampleData.cpp19
-rw-r--r--source/blender/collada/BlenderContext.h5
-rw-r--r--source/blender/collada/ControllerExporter.cpp9
-rw-r--r--source/blender/collada/GeometryExporter.cpp18
-rw-r--r--source/blender/collada/TransformWriter.cpp28
-rw-r--r--source/blender/collada/TransformWriter.h5
-rw-r--r--source/blender/collada/collada_utils.cpp18
-rw-r--r--source/blender/collada/collada_utils.h44
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,8 +81,25 @@ 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);
if (inverse) {
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: