[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58727] trunk/blender/source/blender/ collada/DocumentImporter.cpp: Collada: Optimize Scale to scene.

Gaia Clary gaia.clary at machinimatrix.org
Tue Jul 30 00:15:05 CEST 2013


Revision: 58727
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58727
Author:   gaiaclary
Date:     2013-07-29 22:15:04 +0000 (Mon, 29 Jul 2013)
Log Message:
-----------
Collada: Optimize Scale to scene. Only need to scale the root objects of a hierarchy

Modified Paths:
--------------
    trunk/blender/source/blender/collada/DocumentImporter.cpp

Modified: trunk/blender/source/blender/collada/DocumentImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentImporter.cpp	2013-07-29 21:51:53 UTC (rev 58726)
+++ trunk/blender/source/blender/collada/DocumentImporter.cpp	2013-07-29 22:15:04 UTC (rev 58727)
@@ -187,6 +187,8 @@
 	Scene *sce = CTX_data_scene(mContext);
 	unit_converter.calculate_scale(*sce);
 
+	std::vector<Object *> *objects_to_scale = new std::vector<Object *>();
+
 	/** TODO Break up and put into 2-pass parsing of DAE */
 	std::vector<const COLLADAFW::VisualScene *>::iterator it;
 	for (it = vscenes.begin(); it != vscenes.end(); it++) {
@@ -222,11 +224,8 @@
 		// Write nodes to scene
 		const COLLADAFW::NodePointerArray& roots = (*it)->getRootNodes();
 		for (unsigned int i = 0; i < roots.getCount(); i++) {
-			std::vector<Object *> *objects_done;
-			objects_done = write_node(roots[i], NULL, sce, NULL, false);
-			
-			// Match incoming scene with current unit settings
-			bc_match_scale(objects_done, unit_converter, !this->import_settings->import_units);
+			std::vector<Object *> *objects_done = write_node(roots[i], NULL, sce, NULL, false);
+			objects_to_scale->insert(objects_to_scale->end(), objects_done->begin(), objects_done->end());
 		}
 
 		// update scene
@@ -277,6 +276,8 @@
 
 		DAG_relations_tag_update(bmain);
 	}
+	
+	bc_match_scale(objects_to_scale, unit_converter, !this->import_settings->import_units);
 }
 
 
@@ -460,6 +461,7 @@
 	std::string name = node->getName();
 
 	std::vector<Object *> *objects_done = new std::vector<Object *>();
+	std::vector<Object *> *root_objects = new std::vector<Object *>();
 
 	fprintf(stderr,
 			"Writing node id='%s', name='%s'\n",
@@ -472,6 +474,7 @@
 			// Here we add the armature "on the fly":
 			par = bc_add_object(sce, OB_ARMATURE, std::string("Armature").c_str());
 			objects_done->push_back(par);
+			root_objects->push_back(par);
 			object_map.insert(std::pair<COLLADAFW::UniqueId, Object *>(node->getUniqueId(), par));
 			node_map[node->getUniqueId()] = node;
 		}
@@ -482,7 +485,7 @@
 		if (parent_node == NULL) {
 			// for skeletons without root node all has been done above.
 			// Skeletons with root node are handled further down.
-			return objects_done;
+			return root_objects;
 		}
 	}
 	else {
@@ -511,6 +514,9 @@
 			}
 			else {
 				objects_done->push_back(ob);
+				if (parent_node == NULL) {
+					root_objects->push_back(ob);
+				}
 			}
 			++geom_done;
 		}
@@ -521,19 +527,29 @@
 				std::string name = node->getName();
 				fprintf(stderr, "<node id=\"%s\", name=\"%s\" >...contains a reference to an unknown instance_camera.\n", id.c_str(), name.c_str());
 			}
-			else
+			else {
 				objects_done->push_back(ob);
+				if (parent_node == NULL) {
+					root_objects->push_back(ob);
+				}
+			}
 			++camera_done;
 		}
 		while (lamp_done < lamp.getCount()) {
 			ob = create_lamp_object(lamp[lamp_done], sce);
 			objects_done->push_back(ob);
+			if (parent_node == NULL) {
+				root_objects->push_back(ob);
+			}
 			++lamp_done;
 		}
 		while (controller_done < controller.getCount()) {
 			COLLADAFW::InstanceGeometry *geom = (COLLADAFW::InstanceGeometry *)controller[controller_done];
 			ob = mesh_importer.create_mesh_object(node, geom, true, uid_material_map, material_texture_mapping_map);
 			objects_done->push_back(ob);
+			if (parent_node == NULL) {
+				root_objects->push_back(ob);
+			}
 			++controller_done;
 		}
 		// XXX instance_node is not supported yet
@@ -551,7 +567,12 @@
 					ob = create_instance_node(source_ob, source_node, node, sce, is_library_node);
 				}
 			}
-			if (ob != NULL) objects_done->push_back(ob);
+			if (ob != NULL) {
+				objects_done->push_back(ob);
+				if (parent_node == NULL) {
+					root_objects->push_back(ob);
+				}
+			}
 			++inst_done;
 
 			read_transform = false;
@@ -568,12 +589,14 @@
 				ob = bc_add_object(sce, OB_EMPTY, NULL);
 			}
 			objects_done->push_back(ob);
-
+			if (parent_node == NULL) {
+				root_objects->push_back(ob);
+			}
 		}
 		
 		// XXX: if there're multiple instances, only one is stored
 
-		if (!ob) return objects_done;
+		if (!ob) return root_objects;
 
 		for (std::vector<Object *>::iterator it = objects_done->begin(); it != objects_done->end(); ++it) {
 			ob = *it;
@@ -622,7 +645,7 @@
 		write_node(child_nodes[i], node, sce, ob, is_library_node);
 	}
 
-	return objects_done;
+	return root_objects;
 }
 
 /** When this method is called, the writer must write the entire visual scene.




More information about the Bf-blender-cvs mailing list