[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