diff options
Diffstat (limited to 'source/blender/collada/SceneExporter.cpp')
-rw-r--r-- | source/blender/collada/SceneExporter.cpp | 264 |
1 files changed, 130 insertions, 134 deletions
diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp index f21d82bd393..7a815e7d3e3 100644 --- a/source/blender/collada/SceneExporter.cpp +++ b/source/blender/collada/SceneExporter.cpp @@ -34,22 +34,25 @@ extern "C" { #include "SceneExporter.h" #include "collada_utils.h" -SceneExporter::SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm, const ExportSettings *export_settings) - : COLLADASW::LibraryVisualScenes(sw), arm_exporter(arm), export_settings(export_settings) +SceneExporter::SceneExporter(BlenderContext &blender_context, COLLADASW::StreamWriter *sw, ArmatureExporter *arm, const ExportSettings *export_settings): + blender_context(blender_context), + COLLADASW::LibraryVisualScenes(sw), arm_exporter(arm), export_settings(export_settings) { } -void SceneExporter::exportScene(bContext *C, Depsgraph *depsgraph, Scene *sce) +void SceneExporter::exportScene() { + ViewLayer *view_layer = blender_context.get_view_layer(); + // <library_visual_scenes> <visual_scene> - std::string id_naming = id_name(sce); - openVisualScene(translate_id(id_naming), id_naming); - exportHierarchy(C, depsgraph, sce); + std::string name = id_name(view_layer); + openVisualScene(translate_id(name), encode_xml(name)); + exportHierarchy(); closeVisualScene(); closeLibrary(); } -void SceneExporter::exportHierarchy(bContext *C, Depsgraph *depsgraph, Scene *sce) +void SceneExporter::exportHierarchy() { LinkNode *node; std::vector<Object *> base_objects; @@ -82,164 +85,157 @@ void SceneExporter::exportHierarchy(bContext *C, Depsgraph *depsgraph, Scene *sc Object *ob = base_objects[index]; if (bc_is_marked(ob)) { bc_remove_mark(ob); - writeNodes(C, depsgraph, ob, sce); + writeNodes(ob); } } } +void SceneExporter::writeNodeList(std::vector<Object *> &child_objects, Object *parent) +{ + /* 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); + } + } +} -void SceneExporter::writeNodes(bContext *C, Depsgraph *depsgraph, Object *ob, Scene *sce) +void SceneExporter::writeNodes(Object *ob) { + ViewLayer *view_layer = blender_context.get_view_layer(); + + std::vector<Object *> child_objects; + bc_get_children(child_objects, ob, view_layer); + bool can_export = bc_is_in_Export_set(this->export_settings->export_set, ob, view_layer); + // 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, view_layer); if (armature_exported && bc_is_marked(ob_arm)) { bc_remove_mark(ob_arm); - writeNodes(C, depsgraph, ob_arm, sce); + writeNodes(ob_arm); armature_exported = true; } } - 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(); + if (can_export) { + COLLADASW::Node colladaNode(mSW); + colladaNode.setNodeId(translate_id(id_name(ob))); + colladaNode.setNodeName(encode_xml(id_name(ob))); + colladaNode.setType(COLLADASW::Node::NODE); - std::list<Object *> child_objects; + colladaNode.start(); - // list child objects - LinkNode *node; - for (node=this->export_settings->export_set; node; node=node->next) { - // cob - child object - Object *cob = (Object *)node->link; + 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); + } - if (cob->parent == ob) { - switch (cob->type) { - case OB_MESH: - case OB_CAMERA: - case OB_LAMP: - case OB_EMPTY: - case OB_GPENCIL: - case OB_ARMATURE: - if (bc_is_marked(cob)) - child_objects.push_back(cob); - break; + // <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(encode_xml(id_name(ob))); + InstanceWriter::add_material_bindings(instGeom.getBindMaterial(), + ob, + this->export_settings->active_uv_only); + 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, view_layer, 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); - 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(C, depsgraph, 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(); - } - - // empty object - else if (ob->type == OB_EMPTY) { // TODO: handle groups (OB_DUPLICOLLECTION - if ((ob->transflag & OB_DUPLICOLLECTION) == OB_DUPLICOLLECTION && ob->dup_group) { - Collection *collection = ob->dup_group; - /* printf("group detected '%s'\n", group->id.name + 2); */ - FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(collection, object) - { - printf("\t%s\n", object->id.name); - } - FOREACH_COLLECTION_OBJECT_RECURSIVE_END; + // <instance_light> + else if (ob->type == OB_LAMP) { + COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_light_id(ob))); + instLa.add(); } - } - - if (ob->type == OB_ARMATURE) { - colladaNode.end(); - } - 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); + // empty object + else if (ob->type == OB_EMPTY) { // TODO: handle groups (OB_DUPLICOLLECTION + if ((ob->transflag & OB_DUPLICOLLECTION) == OB_DUPLICOLLECTION && ob->dup_group) { + Collection *collection = ob->dup_group; + /* printf("group detected '%s'\n", group->id.name + 2); */ + FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(collection, object) + { + printf("\t%s\n", object->id.name); } - - if (cti->flush_constraint_targets) - cti->flush_constraint_targets(con, &targets, 1); - + FOREACH_COLLECTION_OBJECT_RECURSIVE_END; } - 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); - writeNodes(C, depsgraph, *i, sce); + if (BLI_listbase_is_empty(&ob->constraints) == false) { + bConstraint *con = (bConstraint *)ob->constraints.first; + while (con) { + std::string con_name(encode_xml(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); + + } + + con = con->next; + } + } } - } - - if (ob->type != OB_ARMATURE) + writeNodeList(child_objects, ob); colladaNode.end(); + } } |