[Bf-blender-cvs] [623fe9412e1] collada: feature: Collada Exporter implement Export option for global axis rotation (wip)

Gaia Clary noreply at git.blender.org
Wed Apr 10 22:40:42 CEST 2019


Commit: 623fe9412e1e371bbab57d9e72a0b15708ae9aeb
Author: Gaia Clary
Date:   Mon Apr 8 19:16:00 2019 +0200
Branches: collada
https://developer.blender.org/rB623fe9412e1e371bbab57d9e72a0b15708ae9aeb

feature: Collada Exporter implement Export option for global axis rotation (wip)

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

M	source/blender/collada/ArmatureExporter.cpp
M	source/blender/collada/ControllerExporter.cpp
M	source/blender/collada/ControllerExporter.h
M	source/blender/collada/GeometryExporter.cpp
M	source/blender/collada/GeometryExporter.h
M	source/blender/collada/SceneExporter.cpp
M	source/blender/collada/TransformWriter.cpp

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

diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp
index 2da3373725e..e8e87b75072 100644
--- a/source/blender/collada/ArmatureExporter.cpp
+++ b/source/blender/collada/ArmatureExporter.cpp
@@ -44,8 +44,6 @@ extern "C" {
 #include "ArmatureExporter.h"
 #include "SceneExporter.h"
 
-#include "collada_utils.h"
-
 // write bone nodes
 void ArmatureExporter::add_armature_bones(
 	Object *ob_arm,
@@ -181,9 +179,19 @@ void ArmatureExporter::add_bone_node(
 			}
 			if (bc_is_leaf_bone(bone))
 			{
-				node.addExtraTechniqueParameter("blender", "tip_x", bone->arm_tail[0] - bone->arm_head[0]);
-				node.addExtraTechniqueParameter("blender", "tip_y", bone->arm_tail[1] - bone->arm_head[1]);
-				node.addExtraTechniqueParameter("blender", "tip_z", bone->arm_tail[2] - bone->arm_head[2]);
+				Vector head, tail;
+				const BCMatrix &global_transform = this->export_settings.get_global_transform();
+				if (this->export_settings.get_apply_global_orientation()) {
+					bc_add_global_transform(head, bone->arm_head, global_transform);
+					bc_add_global_transform(tail, bone->arm_tail, global_transform);
+				}
+				else {
+					copy_v3_v3(head, bone->arm_head);
+					copy_v3_v3(tail, bone->arm_tail);
+				}
+				node.addExtraTechniqueParameter("blender", "tip_x", tail[0] - head[0]);
+				node.addExtraTechniqueParameter("blender", "tip_y", tail[1] - head[1]);
+				node.addExtraTechniqueParameter("blender", "tip_z", tail[2] - head[2]);
 			}
 		}
 
@@ -269,39 +277,42 @@ void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW:
 
 		bc_create_restpose_mat(this->export_settings, bone, bone_rest_mat, bone->arm_mat, true);
 
-		if (bone->parent) {
-			// get bone-space matrix from parent pose
-			/*bPoseChannel *parchan = BKE_pose_channel_find_name(ob_arm->pose, bone->parent->name);
-			float invpar[4][4];
-			invert_m4_m4(invpar, parchan->pose_mat);
-			mul_m4_m4m4(mat, invpar, pchan->pose_mat);*/
-			float invpar[4][4];
-			bc_create_restpose_mat(this->export_settings, bone->parent, parent_rest_mat, bone->parent->arm_mat, true);
-
-			invert_m4_m4(invpar, parent_rest_mat);
-			mul_m4_m4m4(mat, invpar, bone_rest_mat);
-
+		if (is_export_root(bone)) {
+			copy_m4_m4(mat, bone_rest_mat);
 		}
 		else {
-			copy_m4_m4(mat, bone_rest_mat);
+			Matrix parent_inverse;
+			bc_create_restpose_mat(this->export_settings, bone->parent, parent_rest_mat, bone->parent->arm_mat, true);
+
+			invert_m4_m4(parent_inverse, parent_rest_mat);
+			mul_m4_m4m4(mat, parent_inverse, bone_rest_mat);
 		}
 
 		// OPEN_SIM_COMPATIBILITY
 		if (export_settings.get_open_sim()) {
 			// Remove rotations vs armature from transform
 			// parent_rest_rot * mat * irest_rot
-			float temp[4][4];
-			copy_m4_m4(temp, bone_rest_mat);
-			temp[3][0] = temp[3][1] = temp[3][2] = 0.0f;
-			invert_m4(temp);
+			Matrix workmat;
+			copy_m4_m4(workmat, bone_rest_mat);
 
-			mul_m4_m4m4(mat, mat, temp);
+			workmat[3][0] = workmat[3][1] = workmat[3][2] = 0.0f;
+			invert_m4(workmat);
 
-			if (bone->parent) {
-				copy_m4_m4(temp, parent_rest_mat);
-				temp[3][0] = temp[3][1] = temp[3][2] = 0.0f;
+			mul_m4_m4m4(mat, mat, workmat);
+
+			if (!is_export_root(bone)) {
+				copy_m4_m4(workmat, parent_rest_mat);
+				workmat[3][0] = workmat[3][1] = workmat[3][2] = 0.0f;
+
+				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);
+				}
 
-				mul_m4_m4m4(mat, temp, mat);
 			}
 		}
 	}
diff --git a/source/blender/collada/ControllerExporter.cpp b/source/blender/collada/ControllerExporter.cpp
index 0fa9910e891..16d99cf7a7a 100644
--- a/source/blender/collada/ControllerExporter.cpp
+++ b/source/blender/collada/ControllerExporter.cpp
@@ -417,6 +417,12 @@ void ControllerExporter::add_bind_shape_mat(Object *ob)
 	float  f_obmat[4][4];
 	BKE_object_matrix_local_get(ob, f_obmat);
 
+	if (export_settings.get_apply_global_orientation()) {
+	}
+	else {
+		bc_add_global_transform(f_obmat, export_settings.get_global_transform());
+	}
+
 	//UnitConverter::mat4_to_dae_double(bind_mat, ob->obmat);
 	UnitConverter::mat4_to_dae_double(bind_mat, f_obmat);
 	if (this->export_settings.get_limit_precision())
@@ -529,6 +535,16 @@ std::string ControllerExporter::add_inv_bind_mats_source(Object *ob_arm, ListBas
 			// make world-space matrix (bind_mat is armature-space)
 			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());
+			}
+
 			invert_m4_m4(mat, world);
 			UnitConverter::mat4_to_dae(inv_bind_mat, mat);
 			if (this->export_settings.get_limit_precision())
diff --git a/source/blender/collada/ControllerExporter.h b/source/blender/collada/ControllerExporter.h
index a301bd9dbce..183e008a3d5 100644
--- a/source/blender/collada/ControllerExporter.h
+++ b/source/blender/collada/ControllerExporter.h
@@ -63,8 +63,8 @@ public:
 	ControllerExporter(BlenderContext &blender_context, COLLADASW::StreamWriter *sw, BCExportSettings &export_settings) :
 		COLLADASW::LibraryControllers(sw),
 		blender_context(blender_context),
-		export_settings(export_settings) {
-	}
+		export_settings(export_settings)
+	{}
 
 	bool is_skinned_mesh(Object *ob);
 
diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp
index 79f381d9f4f..b4dab9e5b8d 100644
--- a/source/blender/collada/GeometryExporter.cpp
+++ b/source/blender/collada/GeometryExporter.cpp
@@ -473,7 +473,14 @@ void GeometryExporter::createVertsSource(std::string geom_id, Mesh *me)
 	//appends data to <float_array>
 	int i = 0;
 	for (i = 0; i < totverts; i++) {
-		source.appendValues(verts[i].co[0], verts[i].co[1], verts[i].co[2]);
+		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);
+		}
+		source.appendValues(co[0], co[1], co[2]);
 	}
 
 	source.finish();
@@ -619,7 +626,13 @@ void GeometryExporter::createNormalsSource(std::string geom_id, Mesh *me, std::v
 	std::vector<Normal>::iterator it;
 	for (it = nor.begin(); it != nor.end(); it++) {
 		Normal& n = *it;
-		source.appendValues(n.x, n.y, n.z);
+
+		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());
+		}
+		source.appendValues(no[0], no[1], no[2]);
+
 	}
 
 	source.finish();
diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h
index eb2d3a6aa10..c66d769ea13 100644
--- a/source/blender/collada/GeometryExporter.h
+++ b/source/blender/collada/GeometryExporter.h
@@ -41,8 +41,6 @@
 
 struct Depsgraph;
 
-extern Object *bc_get_highest_selected_ancestor_or_self(Object *ob);
-
 class Normal
 {
 	public:
diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp
index 1447fc8acf2..6b1f633ceef 100644
--- a/source/blender/collada/SceneExporter.cpp
+++ b/source/blender/collada/SceneExporter.cpp
@@ -23,10 +23,12 @@ extern "C" {
 	#include "BKE_collection.h"
 	#include "BKE_object.h"
 	#include "BLI_listbase.h"
+	#include "BKE_library.h"
 }
 
 #include "SceneExporter.h"
 #include "collada_utils.h"
+#include "BCSampleData.h"
 
 void SceneExporter::exportScene()
 {
@@ -43,7 +45,7 @@ void SceneExporter::exportScene()
 void SceneExporter::exportHierarchy()
 {
 	LinkNode *node;
-	std::vector<Object *> base_objects;
+	ColladaBaseNodes base_objects;
 
 	// Ensure all objects in the export_set are marked
 	for (node = this->export_settings.get_export_set(); node; node = node->next) {
@@ -56,24 +58,24 @@ void SceneExporter::exportHierarchy()
 		Object *ob = (Object *)node->link;
 		if (this->export_settings.is_export_root(ob)) {
 			switch (ob->type) {
-				case OB_MESH:
-				case OB_CAMERA:
-				case OB_LAMP:
-				case OB_EMPTY:
-				case OB_GPENCIL:
-				case OB_ARMATURE:
-					base_objects.push_back(ob);
-					break;
+			case OB_MESH:
+			case OB_CAMERA:
+			case OB_LAMP:
+			case OB_EMPTY:
+			case OB_GPENCIL:
+			case OB_ARMATURE:
+				base_objects.add(ob);
+				break;
 			}
 		}
 	}
 
 	// And now export the base objects:
 	for (int index = 0; index < base_objects.size(); index++) {
-		Object *ob = base_objects[index];
+		Object *ob = base_objects.get(index);
+		writeNode(ob);
 		if (bc_is_marked(ob)) {
 			bc_remove_mark(ob);
-			writeNode(ob);
 		}
 	}
 }
@@ -89,9 +91,9 @@ void SceneExporter::writeNodeList(std::vector<Object *> &child_objects, Object *
 	 */
 	for (int i = 0; i < child_objects.size(); ++i) {
 		Object *child = child_objects[i];
+		writeNode(child);
 		if (bc_is_marked(child)) {
 			bc_remove_mark(child);
-			writeNode(child);
 		}
 	}
 }
@@ -111,8 +113,8 @@ void SceneExporter::writeNode(Object *ob)
 	if (ob_arm != NULL) {
 		armature_exported = bc_is_in_Export_set(this->export_settings.get_export_set(), ob_arm, view_layer);
 		if (armature_exported && bc_is_marked(ob_arm)) {
-			bc_remove_mark(ob_arm);
 			writeNode(ob_arm);
+			bc_remove_mark(ob_arm);
 			armature_exported = true;
 		}
 	}
@@ -227,7 +229,12 @@ void SceneExporter::writeNode(Object *ob)
 				}
 			}
 		}
+		bc_remove_mark(ob);
 		writeNodeList(child_objects, ob);
 		colladaNode.end();
 	}
+	else {
+		writeNodeList(child_objects, ob);
+	}
 }
+
diff --git a/source/blender/collada/TransformWriter.cpp b/source/blender/collada/TransformWriter.cpp
index 2fdd479cbd2..c4199b374a3 100644
--- a/source/blender/collada/TransformWriter.cpp
+++ b/source/blender/collada/TransformWriter.cpp
@@ -70,9 +70,13 @@ void TransformWriter::add_node_transform_ob(
 	Matrix f_obmat;
 	BKE_object_matrix_local_get(ob, f_obmat);
 
-	if (false) {
-	}
-	else {
+	if (export_settings.is_export_root(ob)) {
+		if (export_settings.get_apply_global_orientation()) {


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list