[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47579] trunk/blender/source/blender: [ #31739] Collada: New Export selections 'Include Armatures'
Gaia Clary
gaia.clary at machinimatrix.org
Thu Jun 7 19:55:38 CEST 2012
Revision: 47579
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47579
Author: gaiaclary
Date: 2012-06-07 17:55:26 +0000 (Thu, 07 Jun 2012)
Log Message:
-----------
[#31739] Collada: New Export selections 'Include Armatures'
Modified Paths:
--------------
trunk/blender/source/blender/collada/ArmatureExporter.cpp
trunk/blender/source/blender/collada/ArmatureExporter.h
trunk/blender/source/blender/collada/DocumentExporter.cpp
trunk/blender/source/blender/collada/ExportSettings.h
trunk/blender/source/blender/collada/GeometryExporter.cpp
trunk/blender/source/blender/collada/GeometryExporter.h
trunk/blender/source/blender/collada/SceneExporter.cpp
trunk/blender/source/blender/collada/collada.cpp
trunk/blender/source/blender/collada/collada.h
trunk/blender/source/blender/collada/collada_utils.cpp
trunk/blender/source/blender/collada/collada_utils.h
trunk/blender/source/blender/makesrna/intern/rna_scene_api.c
trunk/blender/source/blender/windowmanager/intern/wm_operators.c
Modified: trunk/blender/source/blender/collada/ArmatureExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/ArmatureExporter.cpp 2012-06-07 16:36:19 UTC (rev 47578)
+++ trunk/blender/source/blender/collada/ArmatureExporter.cpp 2012-06-07 17:55:26 UTC (rev 47579)
@@ -37,6 +37,14 @@
#include "BKE_action.h"
#include "BKE_armature.h"
+
+extern "C" {
+#include "BKE_main.h"
+#include "BKE_mesh.h"
+#include "BKE_global.h"
+#include "BKE_library.h"
+}
+
#include "ED_armature.h"
#include "BLI_listbase.h"
@@ -45,6 +53,8 @@
#include "ArmatureExporter.h"
#include "SceneExporter.h"
+#include "collada_utils.h"
+
// XXX exporter writes wrong data for shared armatures. A separate
// controller should be written for each armature-mesh binding how do
// we make controller ids then?
@@ -66,12 +76,12 @@
bool ArmatureExporter::is_skinned_mesh(Object *ob)
{
- return get_assigned_armature(ob) != NULL;
+ return bc_get_assigned_armature(ob) != NULL;
}
-void ArmatureExporter::add_instance_controller(Object *ob)
+bool ArmatureExporter::add_instance_controller(Object *ob)
{
- Object *ob_arm = get_assigned_armature(ob);
+ Object *ob_arm = bc_get_assigned_armature(ob);
bArmature *arm = (bArmature*)ob_arm->data;
const std::string& controller_id = get_controller_id(ob_arm, ob);
@@ -79,6 +89,9 @@
COLLADASW::InstanceController ins(mSW);
ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id));
+ Mesh *me = (Mesh *)ob->data;
+ if (!me->dvert) return false;
+
// write root bone URLs
Bone *bone;
for (bone = (Bone*)arm->bonebase.first; bone; bone = bone->next) {
@@ -89,6 +102,7 @@
InstanceWriter::add_material_bindings(ins.getBindMaterial(), ob);
ins.add();
+ return true;
}
void ArmatureExporter::export_controllers(Scene *sce)
@@ -105,7 +119,7 @@
void ArmatureExporter::operator()(Object *ob)
{
- Object *ob_arm = get_assigned_armature(ob);
+ Object *ob_arm = bc_get_assigned_armature(ob);
if (ob_arm /*&& !already_written(ob_arm)*/)
export_controller(ob, ob_arm);
@@ -139,27 +153,6 @@
}
#endif
-Object *ArmatureExporter::get_assigned_armature(Object *ob)
-{
- Object *ob_arm = NULL;
-
- if (ob->parent && ob->partype == PARSKEL && ob->parent->type == OB_ARMATURE) {
- ob_arm = ob->parent;
- }
- else {
- ModifierData *mod = (ModifierData*)ob->modifiers.first;
- while (mod) {
- if (mod->type == eModifierType_Armature) {
- ob_arm = ((ArmatureModifierData*)mod)->object;
- }
-
- mod = mod->next;
- }
- }
-
- return ob_arm;
-}
-
std::string ArmatureExporter::get_joint_sid(Bone *bone, Object *ob_arm)
{
return get_joint_id(bone, ob_arm);
@@ -325,7 +318,16 @@
*/
bool use_instantiation = this->export_settings->use_object_instantiation;
- Mesh *me = (Mesh*)ob->data;
+ Mesh *me;
+
+ if ( this->export_settings->apply_modifiers ) {
+ me = bc_to_mesh_apply_modifiers(scene, ob);
+ }
+ else {
+ me = (Mesh*)ob->data;
+ }
+ BKE_mesh_tessface_ensure(me);
+
if (!me->dvert) return;
std::string controller_name = id_name(ob_arm);
@@ -393,6 +395,10 @@
add_joints_element(&ob->defbase, joints_source_id, inv_bind_mat_source_id);
add_vertex_weights_element(weights_source_id, joints_source_id, vcounts, joints);
+ if (this->export_settings->apply_modifiers)
+ {
+ BKE_libblock_free_us(&(G.main->mesh), me);
+ }
closeSkin();
closeController();
}
Modified: trunk/blender/source/blender/collada/ArmatureExporter.h
===================================================================
--- trunk/blender/source/blender/collada/ArmatureExporter.h 2012-06-07 16:36:19 UTC (rev 47578)
+++ trunk/blender/source/blender/collada/ArmatureExporter.h 2012-06-07 17:55:26 UTC (rev 47579)
@@ -64,7 +64,7 @@
bool is_skinned_mesh(Object *ob);
- void add_instance_controller(Object *ob);
+ bool add_instance_controller(Object *ob);
void export_controllers(Scene *sce);
@@ -85,8 +85,6 @@
void find_objects_using_armature(Object *ob_arm, std::vector<Object *>& objects, Scene *sce);
#endif
- Object *get_assigned_armature(Object *ob);
-
std::string get_joint_sid(Bone *bone, Object *ob_arm);
// Scene, SceneExporter and the list of child_objects
Modified: trunk/blender/source/blender/collada/DocumentExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentExporter.cpp 2012-06-07 16:36:19 UTC (rev 47578)
+++ trunk/blender/source/blender/collada/DocumentExporter.cpp 2012-06-07 17:55:26 UTC (rev 47579)
@@ -262,8 +262,10 @@
// <library_controllers>
ArmatureExporter arm_exporter(&sw, this->export_settings);
- if (has_object_type(sce, OB_ARMATURE)) {
- arm_exporter.export_controllers(sce);
+ if (this->export_settings->include_armatures) {
+ if (has_object_type(sce, OB_ARMATURE)) {
+ arm_exporter.export_controllers(sce);
+ }
}
// <library_visual_scenes>
Modified: trunk/blender/source/blender/collada/ExportSettings.h
===================================================================
--- trunk/blender/source/blender/collada/ExportSettings.h 2012-06-07 16:36:19 UTC (rev 47578)
+++ trunk/blender/source/blender/collada/ExportSettings.h 2012-06-07 17:55:26 UTC (rev 47579)
@@ -32,6 +32,7 @@
public:
bool selected;
bool apply_modifiers;
+ bool include_armatures;
bool include_bone_children;
bool use_object_instantiation;
bool second_life;
Modified: trunk/blender/source/blender/collada/GeometryExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/GeometryExporter.cpp 2012-06-07 16:36:19 UTC (rev 47578)
+++ trunk/blender/source/blender/collada/GeometryExporter.cpp 2012-06-07 17:55:26 UTC (rev 47579)
@@ -49,6 +49,7 @@
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "collada_internal.h"
+#include "collada_utils.h"
// TODO: optimize UV sets by making indexed list with duplicates removed
GeometryExporter::GeometryExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryGeometries(sw), export_settings(export_settings) {}
@@ -65,25 +66,6 @@
closeLibrary();
}
-Mesh * GeometryExporter::get_mesh(Object *ob, int apply_modifiers)
-{
- Mesh *tmpmesh;
- if (!apply_modifiers)
- {
- tmpmesh = (Mesh*)ob->data;
- }
- else
- {
- CustomDataMask mask = CD_MASK_MESH;
- DerivedMesh *dm = mesh_create_derived_view(mScene, ob, mask);
- tmpmesh = BKE_mesh_add("ColladaMesh"); // name is not important here
- DM_to_mesh(dm, tmpmesh, ob);
- dm->release(dm);
- }
- BKE_mesh_tessface_ensure(tmpmesh);
- return tmpmesh;
-}
-
void GeometryExporter::operator()(Object *ob)
{
// XXX don't use DerivedMesh, Mesh instead?
@@ -93,7 +75,14 @@
#endif
bool use_instantiation = this->export_settings->use_object_instantiation;
- Mesh *me = get_mesh(ob, this->export_settings->apply_modifiers);
+ Mesh *me;
+ if ( this->export_settings->apply_modifiers ) {
+ me = bc_to_mesh_apply_modifiers(mScene, ob);
+ }
+ else {
+ me = (Mesh*)ob->data;
+ }
+ BKE_mesh_tessface_ensure(me);
std::string geom_id = get_geometry_id(ob, use_instantiation);
std::vector<Normal> nor;
Modified: trunk/blender/source/blender/collada/GeometryExporter.h
===================================================================
--- trunk/blender/source/blender/collada/GeometryExporter.h 2012-06-07 16:36:19 UTC (rev 47578)
+++ trunk/blender/source/blender/collada/GeometryExporter.h 2012-06-07 17:55:26 UTC (rev 47579)
@@ -105,7 +105,7 @@
const ExportSettings *export_settings;
- Mesh * get_mesh(Object *ob, int apply_modifiers);
+ Mesh * get_mesh(Scene *sce, Object *ob, int apply_modifiers);
};
struct GeometryFunctor {
Modified: trunk/blender/source/blender/collada/SceneExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/SceneExporter.cpp 2012-06-07 16:36:19 UTC (rev 47578)
+++ trunk/blender/source/blender/collada/SceneExporter.cpp 2012-06-07 17:55:26 UTC (rev 47579)
@@ -25,6 +25,7 @@
*/
#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)
@@ -40,19 +41,36 @@
closeLibrary();
}
+// Returns true if the parent chain does not contain any selected object
+// Otherwise return false (ob has selected predecessor)
+bool is_exported_base_node(Object *ob, bool selection_only) {
+
+ if (selection_only && ob->flag & SELECT) {
+ // Move up towards root object,
+ // stop at first selected predecessor's child,
+ // or at root, if no parent was selected
+ while (ob->parent && (ob->parent->type==OB_ARMATURE || !(ob->parent->flag & SELECT)))
+ {
+ ob = ob->parent;
+ }
+ }
+
+ return !ob->parent;
+}
+
void SceneExporter::exportHierarchy(Scene *sce)
{
Base *base= (Base*) sce->base.first;
while (base) {
Object *ob = base->object;
- if (!ob->parent) {
+ bool is_export_base_node = is_exported_base_node(ob, this->export_settings->selected);
+ if (is_export_base_node) {
if (sce->lay & ob->lay) {
switch (ob->type) {
case OB_MESH:
case OB_CAMERA:
case OB_LAMP:
- case OB_ARMATURE:
case OB_EMPTY:
if (this->export_settings->selected && !(ob->flag & SELECT)) {
break;
@@ -70,6 +88,14 @@
void SceneExporter::writeNodes(Object *ob, Scene *sce)
{
+
+ // Add associated armature first if available
+ if (this->export_settings->include_armatures) {
+ Object *ob_arm = bc_get_assigned_armature(ob);
+ if(ob_arm != NULL)
+ writeNodes(ob_arm, sce);
+ }
+
COLLADASW::Node node(mSW);
node.setNodeId(translate_id(id_name(ob)));
node.setNodeName(translate_id(id_name(ob)));
@@ -80,8 +106,19 @@
bool is_skinned_mesh = arm_exporter->is_skinned_mesh(ob);
std::list<Object*> child_objects;
+ // XXX Not sure about this.
+ // For me this looks more like a very special case for a very special purpose.
+ // Wouldn't it be better to have only one option here ?
+ //
+ // - include children
+ //
+ // Instead of "include_bone_children" ?
+ // then we could just ask:
+ // if (this->export_settings->include_children)
+ // ...
+ if (this->export_settings->include_armatures
+ && this->export_settings->include_bone_children) {
- if (this->export_settings->include_bone_children) {
// list child objects
Base *b = (Base*) sce->base.first;
while (b) {
@@ -105,7 +142,7 @@
}
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list