diff options
Diffstat (limited to 'source/blender/collada/SceneExporter.cpp')
-rw-r--r-- | source/blender/collada/SceneExporter.cpp | 57 |
1 files changed, 51 insertions, 6 deletions
diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp index 6d239ae0fb1..604e131b44b 100644 --- a/source/blender/collada/SceneExporter.cpp +++ b/source/blender/collada/SceneExporter.cpp @@ -36,7 +36,12 @@ SceneExporter::SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm, : COLLADASW::LibraryVisualScenes(sw), arm_exporter(arm), export_settings(export_settings) { } - + +void SceneExporter::setExportTransformationType(BC_export_transformation_type transformation_type) +{ + this->transformation_type = transformation_type; +} + void SceneExporter::exportScene(Scene *sce) { // <library_visual_scenes> <visual_scene> @@ -84,6 +89,7 @@ void SceneExporter::exportHierarchy(Scene *sce) } } + void SceneExporter::writeNodes(Object *ob, Scene *sce) { // Add associated armature first if available @@ -130,8 +136,9 @@ void SceneExporter::writeNodes(Object *ob, Scene *sce) 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); + else { + TransformWriter::add_node_transform_ob(colladaNode, ob, this->transformation_type); + } // <instance_geometry> if (ob->type == OB_MESH) { @@ -171,7 +178,7 @@ void SceneExporter::writeNodes(Object *ob, Scene *sce) 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); */ + /* 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); } @@ -182,6 +189,45 @@ void SceneExporter::writeNodes(Object *ob, Scene *sce) colladaNode.end(); } + if (ob->constraints.first != NULL ) { + bConstraint *con = (bConstraint *) ob->constraints.first; + while (con) { + std::string con_name(id_name(con)); + std::string con_tag = con_name + "_constraint"; + 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. + bConstraintTypeInfo *cti = BKE_constraint_get_typeinfo(con); + ListBase targets = {NULL, NULL}; + if (cti && cti->get_constraint_targets) { + + bConstraintTarget *ct; + Object *obtar; + + cti->get_constraint_targets(con, &targets); + if (cti) { + for (ct = (bConstraintTarget *)targets.first; ct; ct = ct->next) { + obtar = ct->tar; + std::string tar_id(id_name(obtar)); + colladaNode.addExtraTechniqueChildParameter("blender",con_tag,"target_id",tar_id); + } + } + } + + con = con->next; + } + } + for (std::list<Object *>::iterator i = child_objects.begin(); i != child_objects.end(); ++i) { if (bc_is_marked(*i)) { bc_remove_mark(*i); @@ -189,8 +235,7 @@ void SceneExporter::writeNodes(Object *ob, Scene *sce) } } - if (ob->type != OB_ARMATURE) { + if (ob->type != OB_ARMATURE) colladaNode.end(); - } } |