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.
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs