[Bf-blender-cvs] [d2ee32f7fff] collada: Feature Collada: Export also not selected intermediate objects

Gaia Clary noreply at git.blender.org
Wed Mar 28 21:30:49 CEST 2018


Commit: d2ee32f7fffd2115a1285e83cf7c1e27e0a79ff0
Author: Gaia Clary
Date:   Sat Mar 17 13:51:12 2018 +0100
Branches: collada
https://developer.blender.org/rBd2ee32f7fffd2115a1285e83cf7c1e27e0a79ff0

Feature Collada: Export also not selected intermediate objects

Problem: When we export an Object Hierarchy, then we must export
all elements of the hierarchy to maintain the transforms. This
is especially important when exporting animated objects, because the
animation curves are exported as relative curves based on the
parent-child hierarchy. If an intermediate animated object is missing
then the exported animation breaks.

Solution: If the "Selected" Optioon is enabled, then take care
to also export all objects which are not selected and hidden,
but which are parents of selected objects.

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

M	source/blender/collada/SceneExporter.cpp
M	source/blender/collada/SceneExporter.h

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

diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp
index 0a4ee4403c2..4c1778c9726 100644
--- a/source/blender/collada/SceneExporter.cpp
+++ b/source/blender/collada/SceneExporter.cpp
@@ -85,15 +85,36 @@ void SceneExporter::exportHierarchy(Scene *sce)
 	}
 }
 
+void SceneExporter::writeNodeList(std::vector<Object *> &child_objects, Object *parent, Scene *sce)
+{
+	/* TODO: Handle the case where a parent is not exported
+	   Actually i am not even sure if this can be done at all
+	   in a good way. 
+	   I really prefer to enforce the export of hidden
+	   elements in an object hierarchy. When the children of
+	   the hidden elements are exported as well.
+	 */
+	for (int i = 0; i < child_objects.size(); ++i) {
+		Object *child = child_objects[i];
+		if (bc_is_marked(child)) {
+			bc_remove_mark(child);
+			writeNodes(child, sce);
+		}
+	}
+}
 
 void SceneExporter::writeNodes(Object *ob, Scene *sce)
 {
+	std::vector<Object *> child_objects;
+	bc_get_children(child_objects, ob, sce);
+	bool can_export = bc_is_in_Export_set(this->export_settings->export_set, ob, sce);
+
 	// Add associated armature first if available
 	bool armature_exported = false;
 	Object *ob_arm = bc_get_assigned_armature(ob);
 
 	if (ob_arm != NULL) {
-		armature_exported = bc_is_in_Export_set(this->export_settings->export_set, ob_arm);
+		armature_exported = bc_is_in_Export_set(this->export_settings->export_set, ob_arm, sce);
 		if (armature_exported && bc_is_marked(ob_arm)) {
 			bc_remove_mark(ob_arm);
 			writeNodes(ob_arm, sce);
@@ -101,141 +122,118 @@ void SceneExporter::writeNodes(Object *ob, Scene *sce)
 		}
 	}
 
-	COLLADASW::Node colladaNode(mSW);
-	colladaNode.setNodeId(translate_id(id_name(ob)));
-	colladaNode.setNodeName(translate_id(id_name(ob)));
-	colladaNode.setType(COLLADASW::Node::NODE);
+	if (can_export) {
+		COLLADASW::Node colladaNode(mSW);
+		colladaNode.setNodeId(translate_id(id_name(ob)));
+		colladaNode.setNodeName(translate_id(id_name(ob)));
+		colladaNode.setType(COLLADASW::Node::NODE);
 
-	colladaNode.start();
+		colladaNode.start();
 
-	std::list<Object *> child_objects;
+		if (ob->type == OB_MESH && armature_exported)
+			// for skinned mesh we write obmat in <bind_shape_matrix>
+			TransformWriter::add_node_transform_identity(colladaNode);
+		else {
+			TransformWriter::add_node_transform_ob(colladaNode, ob, this->export_settings->export_transformation_type);
+		}
 
-	// list child objects
-	LinkNode *node;
-	for (node=this->export_settings->export_set; node; node=node->next) {
-		// cob - child object
-		Object *cob = (Object *)node->link;
+		// <instance_geometry>
+		if (ob->type == OB_MESH) {
+			bool instance_controller_created = false;
+			if (armature_exported) {
+				instance_controller_created = arm_exporter->add_instance_controller(ob);
+			}
+			if (!instance_controller_created) {
+				COLLADASW::InstanceGeometry instGeom(mSW);
+				instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob, this->export_settings->use_object_instantiation)));
+				instGeom.setName(translate_id(id_name(ob)));
+				InstanceWriter::add_material_bindings(instGeom.getBindMaterial(),
+					ob,
+					this->export_settings->active_uv_only,
+					this->export_settings->export_texture_type);
 
-		if (cob->parent == ob) {
-			switch (cob->type) {
-				case OB_MESH:
-				case OB_CAMERA:
-				case OB_LAMP:
-				case OB_EMPTY:
-				case OB_ARMATURE:
-					if (bc_is_marked(cob))
-						child_objects.push_back(cob);
-					break;
+				instGeom.add();
 			}
 		}
-	}
 
-	if (ob->type == OB_MESH && armature_exported)
-		// for skinned mesh we write obmat in <bind_shape_matrix>
-		TransformWriter::add_node_transform_identity(colladaNode);
-	else {
-		TransformWriter::add_node_transform_ob(colladaNode, ob, this->export_settings->export_transformation_type);
-	}
-
-	// <instance_geometry>
-	if (ob->type == OB_MESH) {
-		bool instance_controller_created = false;
-		if (armature_exported) {
-			instance_controller_created = arm_exporter->add_instance_controller(ob);
+		// <instance_controller>
+		else if (ob->type == OB_ARMATURE) {
+			arm_exporter->add_armature_bones(ob, sce, this, child_objects);
 		}
-		if (!instance_controller_created) {
-			COLLADASW::InstanceGeometry instGeom(mSW);
-			instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob, this->export_settings->use_object_instantiation)));
-			instGeom.setName(translate_id(id_name(ob)));
-			InstanceWriter::add_material_bindings(instGeom.getBindMaterial(), 
-				    ob, 
-					this->export_settings->active_uv_only, 
-					this->export_settings->export_texture_type);
 
-			instGeom.add();
+		// <instance_camera>
+		else if (ob->type == OB_CAMERA) {
+			COLLADASW::InstanceCamera instCam(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_camera_id(ob)));
+			instCam.add();
 		}
-	}
-
-	// <instance_controller>
-	else if (ob->type == OB_ARMATURE) {
-		arm_exporter->add_armature_bones(ob, sce, this, child_objects);
-	}
 
-	// <instance_camera>
-	else if (ob->type == OB_CAMERA) {
-		COLLADASW::InstanceCamera instCam(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_camera_id(ob)));
-		instCam.add();
-	}
-
-	// <instance_light>
-	else if (ob->type == OB_LAMP) {
-		COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_light_id(ob)));
-		instLa.add();
-	}
+		// <instance_light>
+		else if (ob->type == OB_LAMP) {
+			COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_light_id(ob)));
+			instLa.add();
+		}
 
-	// empty object
-	else if (ob->type == OB_EMPTY) { // TODO: handle groups (OB_DUPLIGROUP
-		if ((ob->transflag & OB_DUPLIGROUP) == OB_DUPLIGROUP && ob->dup_group) {
-			GroupObject *go = NULL;
-			Group *gr = ob->dup_group;
-			/* printf("group detected '%s'\n", gr->id.name + 2); */
-			for (go = (GroupObject *)(gr->gobject.first); go; go = go->next) {
-				printf("\t%s\n", go->ob->id.name);
+		// empty object
+		else if (ob->type == OB_EMPTY) { // TODO: handle groups (OB_DUPLIGROUP
+			if ((ob->transflag & OB_DUPLIGROUP) == OB_DUPLIGROUP && ob->dup_group) {
+				GroupObject *go = NULL;
+				Group *gr = ob->dup_group;
+				/* printf("group detected '%s'\n", gr->id.name + 2); */
+				for (go = (GroupObject *)(gr->gobject.first); go; go = go->next) {
+					printf("\t%s\n", go->ob->id.name);
+				}
 			}
 		}
-	}
 
-	if (BLI_listbase_is_empty(&ob->constraints) == false) {
-		bConstraint *con = (bConstraint *) ob->constraints.first;
-		while (con) {
-			std::string con_name(translate_id(con->name));
-			std::string con_tag = con_name + "_constraint";
-			printf("%s\n", con_name.c_str());
-			printf("%s\n\n", con_tag.c_str());
-			colladaNode.addExtraTechniqueChildParameter("blender",con_tag,"type",con->type);
-			colladaNode.addExtraTechniqueChildParameter("blender",con_tag,"enforce",con->enforce);
-			colladaNode.addExtraTechniqueChildParameter("blender",con_tag,"flag",con->flag);
-			colladaNode.addExtraTechniqueChildParameter("blender",con_tag,"headtail",con->headtail);
-			colladaNode.addExtraTechniqueChildParameter("blender",con_tag,"lin_error",con->lin_error);
-			colladaNode.addExtraTechniqueChildParameter("blender",con_tag,"own_space",con->ownspace);
-			colladaNode.addExtraTechniqueChildParameter("blender",con_tag,"rot_error",con->rot_error);
-			colladaNode.addExtraTechniqueChildParameter("blender",con_tag,"tar_space",con->tarspace);
-			colladaNode.addExtraTechniqueChildParameter("blender",con_tag,"lin_error",con->lin_error);
-			
-			//not ideal: add the target object name as another parameter. 
-			//No real mapping in the .dae
-			//Need support for multiple target objects also.
-			const bConstraintTypeInfo *cti = BKE_constraint_typeinfo_get(con);
-			ListBase targets = {NULL, NULL};
-			if (cti && cti->get_constraint_targets) {
-			
-				bConstraintTarget *ct;
-				Object *obtar;
-			
-				cti->get_constraint_targets(con, &targets);
-
-				for (ct = (bConstraintTarget *)targets.first; ct; ct = ct->next) {
-					obtar = ct->tar;
-					std::string tar_id((obtar) ? id_name(obtar) : "");
-					colladaNode.addExtraTechniqueChildParameter("blender",con_tag,"target_id",tar_id);
-				}
+		if (BLI_listbase_is_empty(&ob->constraints) == false) {
+			bConstraint *con = (bConstraint *)ob->constraints.first;
+			while (con) {
+				std::string con_name(translate_id(con->name));
+				std::string con_tag = con_name + "_constraint";
+				printf("%s\n", con_name.c_str());
+				printf("%s\n\n", con_tag.c_str());
+				colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "type", con->type);
+				colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "enforce", con->enforce);
+				colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "flag", con->flag);
+				colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "headtail", con->headtail);
+				colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "lin_error", con->lin_error);
+				colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "own_space", con->ownspace);
+				colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "rot_error", con->rot_error);
+				colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "tar_space", con->tarspace);
+				colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "lin_error", con->lin_error);
+
+				//not ideal: add the target object name as another parameter. 
+				//No real mapping in the .dae
+				//Need support for multiple target objects also.
+				const bConstraintTypeInfo *cti = BKE_constraint_typeinfo_get(con);
+				ListBase targets = { NULL, NULL };
+				if (cti && cti->get_constraint_targets) {
+
+					bConstraintTarget *ct;
+					Object *obtar;
+
+					cti->get_constraint_targets(con, &targets);
+
+					for (ct = (bConstraintTarget *)targets.first; ct; ct = ct->next) {
+						obtar = ct->tar;
+						std::string tar_id((obtar) ? id_name(obtar) : "");
+						colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "target_id", tar_id);
+					}
+
+					if (cti->flush_constraint_targets)
+						cti->flush_constraint_targets(con, &targets, 1);
 
-				if (cti->flush_constraint_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list