Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/collada/SceneExporter.cpp')
-rw-r--r--source/blender/collada/SceneExporter.cpp57
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();
- }
}