From 65874d3f33c5bbc2d91b3239ca549a635a12ba29 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Mon, 26 Nov 2018 23:05:55 +0100 Subject: fix: Collada: The limit precision option does nothing --- source/blender/collada/ArmatureExporter.cpp | 2 +- source/blender/collada/ControllerExporter.cpp | 2 +- source/blender/collada/SceneExporter.cpp | 11 ++++++++--- source/blender/collada/TransformWriter.cpp | 25 +++++++++++++++++-------- source/blender/collada/TransformWriter.h | 15 +++++++++++---- source/blender/collada/collada_utils.cpp | 16 ++++++++++++++++ source/blender/collada/collada_utils.h | 4 ++++ 7 files changed, 58 insertions(+), 17 deletions(-) (limited to 'source/blender/collada') diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp index 2aa7b483110..055ffc39e9a 100644 --- a/source/blender/collada/ArmatureExporter.cpp +++ b/source/blender/collada/ArmatureExporter.cpp @@ -304,7 +304,7 @@ void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW: } if (this->export_settings->limit_precision) - bc_sanitize_mat(mat, 6); + bc_sanitize_mat(mat, LIMITTED_PRECISION); TransformWriter::add_node_transform(node, mat, NULL); diff --git a/source/blender/collada/ControllerExporter.cpp b/source/blender/collada/ControllerExporter.cpp index 7685a2b09a0..f944855dab2 100644 --- a/source/blender/collada/ControllerExporter.cpp +++ b/source/blender/collada/ControllerExporter.cpp @@ -533,7 +533,7 @@ std::string ControllerExporter::add_inv_bind_mats_source(Object *ob_arm, ListBas invert_m4_m4(mat, world); UnitConverter::mat4_to_dae(inv_bind_mat, mat); if (this->export_settings->limit_precision) - bc_sanitize_mat(inv_bind_mat, 6); + bc_sanitize_mat(inv_bind_mat, LIMITTED_PRECISION); source.appendValues(inv_bind_mat); } } diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp index 9a7a3aa673d..212c2639a6e 100644 --- a/source/blender/collada/SceneExporter.cpp +++ b/source/blender/collada/SceneExporter.cpp @@ -36,10 +36,10 @@ extern "C" { void SceneExporter::exportScene() { - ViewLayer *view_layer = blender_context.get_view_layer(); + Scene *scene = blender_context.get_scene(); // - std::string name = id_name(view_layer); + std::string name = id_name(scene); openVisualScene(translate_id(name), encode_xml(name)); exportHierarchy(); closeVisualScene(); @@ -136,7 +136,12 @@ void SceneExporter::writeNodes(Object *ob) TransformWriter::add_node_transform_identity(colladaNode); } else { - TransformWriter::add_node_transform_ob(colladaNode, ob, this->export_settings->export_transformation_type); + TransformWriter::add_node_transform_ob( + colladaNode, + ob, + this->export_settings->export_transformation_type, + this->export_settings->limit_precision + ); } // diff --git a/source/blender/collada/TransformWriter.cpp b/source/blender/collada/TransformWriter.cpp index 9f75a604f96..c4d24e67b05 100644 --- a/source/blender/collada/TransformWriter.cpp +++ b/source/blender/collada/TransformWriter.cpp @@ -33,7 +33,7 @@ #include "TransformWriter.h" -void TransformWriter::add_node_transform(COLLADASW::Node& node, float mat[4][4], float parent_mat[4][4]) +void TransformWriter::add_node_transform(COLLADASW::Node& node, float mat[4][4], float parent_mat[4][4], bool limit_precision) { float loc[3], rot[3], scale[3]; float local[4][4]; @@ -63,8 +63,11 @@ void TransformWriter::add_node_transform(COLLADASW::Node& node, float mat[4][4], } } -void TransformWriter::add_node_transform_ob(COLLADASW::Node& node, Object *ob, - BC_export_transformation_type transformation_type) +void TransformWriter::add_node_transform_ob( + COLLADASW::Node& node, + Object *ob, + BC_export_transformation_type transformation_type, + bool limit_precision) { #if 0 float rot[3], loc[3], scale[3]; @@ -101,17 +104,18 @@ void TransformWriter::add_node_transform_ob(COLLADASW::Node& node, Object *ob, add_transform(node, loc, rot, scale); #endif - UnitConverter converter; - double d_obmat[4][4]; - float f_obmat[4][4]; - /* Export the local Matrix (relative to the object parent, be it an object, bone or vertex(-tices)) */ + float f_obmat[4][4]; BKE_object_matrix_local_get(ob, f_obmat); - converter.mat4_to_dae_double(d_obmat, f_obmat); switch (transformation_type) { case BC_TRANSFORMATION_TYPE_MATRIX: { + UnitConverter converter; + double d_obmat[4][4]; + converter.mat4_to_dae_double(d_obmat, f_obmat); + if (limit_precision) + bc_sanitize_mat(d_obmat, LIMITTED_PRECISION); node.addMatrix("transform",d_obmat); break; } @@ -119,6 +123,11 @@ void TransformWriter::add_node_transform_ob(COLLADASW::Node& node, Object *ob, { float loc[3], rot[3], scale[3]; bc_decompose(f_obmat, loc, rot, NULL, scale); + if (limit_precision) { + bc_sanitize_v3(loc, LIMITTED_PRECISION); + bc_sanitize_v3(rot, LIMITTED_PRECISION); + bc_sanitize_v3(scale, LIMITTED_PRECISION); + } add_transform(node, loc, rot, scale); break; } diff --git a/source/blender/collada/TransformWriter.h b/source/blender/collada/TransformWriter.h index 580430911f7..2c7fedb9f34 100644 --- a/source/blender/collada/TransformWriter.h +++ b/source/blender/collada/TransformWriter.h @@ -39,10 +39,17 @@ class TransformWriter { protected: - void add_node_transform(COLLADASW::Node& node, float mat[4][4], float parent_mat[4][4]); - - void add_node_transform_ob(COLLADASW::Node& node, Object *ob, - BC_export_transformation_type transformation_type); + void add_node_transform( + COLLADASW::Node& node, + float mat[4][4], + float parent_mat[4][4], + bool limit_precision=false); + + void add_node_transform_ob( + COLLADASW::Node& node, + Object *ob, + BC_export_transformation_type transformation_type, + bool limit_precision = false); void add_node_transform_identity(COLLADASW::Node& node); diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp index 41e661ffd40..3a0fb9fd64f 100644 --- a/source/blender/collada/collada_utils.cpp +++ b/source/blender/collada/collada_utils.cpp @@ -1135,6 +1135,15 @@ void bc_sanitize_mat(float mat[4][4], int precision) } } +void bc_sanitize_v3(float v[3], int precision) +{ + for (int i = 0; i < 3; i++) { + double val = (double)v[i]; + val = double_round(val, precision); + v[i] = (float)val; + } +} + void bc_sanitize_mat(double mat[4][4], int precision) { for (int i = 0; i < 4; i++) @@ -1142,6 +1151,13 @@ void bc_sanitize_mat(double mat[4][4], int precision) mat[i][j] = double_round(mat[i][j], precision); } +void bc_sanitize_v3(double v[3], int precision) +{ + for (int i = 0; i < 3; i++) { + v[i] = double_round(v[i], precision); + } +} + void bc_copy_m4_farray(float r[4][4], float *a) { for (int i = 0; i < 4; i++) diff --git a/source/blender/collada/collada_utils.h b/source/blender/collada/collada_utils.h index 14d1948a42b..ab0c450a91c 100644 --- a/source/blender/collada/collada_utils.h +++ b/source/blender/collada/collada_utils.h @@ -74,6 +74,8 @@ extern "C" { #include "BCSampleData.h" #include "BlenderContext.h" +static int LIMITTED_PRECISION = 6; + struct Depsgraph; typedef std::map UidImageMap; @@ -209,6 +211,8 @@ void bc_copy_v44_m4d(std::vector> &a, double(&r)[4][4]); void bc_sanitize_mat(float mat[4][4], int precision); void bc_sanitize_mat(double mat[4][4], int precision); +void bc_sanitize_v3(double v[3], int precision); +void bc_sanitize_v3(float v[3], int precision); extern IDProperty *bc_get_IDProperty(Bone *bone, std::string key); extern void bc_set_IDProperty(EditBone *ebone, const char *key, float value); -- cgit v1.2.3