[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47979] trunk/blender: Collada: (Exporter) Add new option 'deform bones only'

Gaia Clary gaia.clary at machinimatrix.org
Sat Jun 16 00:00:29 CEST 2012


Revision: 47979
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47979
Author:   gaiaclary
Date:     2012-06-15 22:00:25 +0000 (Fri, 15 Jun 2012)
Log Message:
-----------
Collada: (Exporter) Add new option 'deform bones only'

Modified Paths:
--------------
    trunk/blender/release/scripts/presets/operator/wm.collada_export/second_life.py
    trunk/blender/source/blender/collada/ArmatureExporter.cpp
    trunk/blender/source/blender/collada/ArmatureExporter.h
    trunk/blender/source/blender/collada/ExportSettings.h
    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/release/scripts/presets/operator/wm.collada_export/second_life.py
===================================================================
--- trunk/blender/release/scripts/presets/operator/wm.collada_export/second_life.py	2012-06-15 21:48:08 UTC (rev 47978)
+++ trunk/blender/release/scripts/presets/operator/wm.collada_export/second_life.py	2012-06-15 22:00:25 UTC (rev 47979)
@@ -1,10 +1,10 @@
 import bpy
 op = bpy.context.active_operator
-
+op.apply_modifiers = True
 op.selected = True
-op.apply_modifiers = True
-op.include_armatures = False
 op.include_children = False
+op.include_armatures = True
+op.deform_bones_only = True
 op.use_object_instantiation = False
 op.sort_by_name = True
 op.second_life = True

Modified: trunk/blender/source/blender/collada/ArmatureExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/ArmatureExporter.cpp	2012-06-15 21:48:08 UTC (rev 47978)
+++ trunk/blender/source/blender/collada/ArmatureExporter.cpp	2012-06-15 22:00:25 UTC (rev 47979)
@@ -80,6 +80,18 @@
 	return bc_get_assigned_armature(ob) != NULL;
 }
 
+
+void ArmatureExporter::write_bone_URLs(COLLADASW::InstanceController &ins, Object *ob_arm, Bone *bone)
+{
+	if ( bc_is_root_bone(bone, this->export_settings->deform_bones_only) )
+		ins.addSkeleton(COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_joint_id(bone, ob_arm)));
+	else {
+		for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) {
+			write_bone_URLs(ins, ob_arm, child);
+		}
+	}
+}
+
 bool ArmatureExporter::add_instance_controller(Object *ob)
 {
 	Object *ob_arm = bc_get_assigned_armature(ob);
@@ -96,8 +108,7 @@
 	// write root bone URLs
 	Bone *bone;
 	for (bone = (Bone *)arm->bonebase.first; bone; bone = bone->next) {
-		if (!bone->parent)
-			ins.addSkeleton(COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_joint_id(bone, ob_arm)));
+		write_bone_URLs(ins, ob_arm, bone);
 	}
 
 	InstanceWriter::add_material_bindings(ins.getBindMaterial(), ob);
@@ -164,67 +175,73 @@
                                      SceneExporter *se,
                                      std::list<Object *>& child_objects)
 {
-	std::string node_id = get_joint_id(bone, ob_arm);
-	std::string node_name = std::string(bone->name);
-	std::string node_sid = get_joint_sid(bone, ob_arm);
+	if (!(this->export_settings->deform_bones_only && bone->flag & BONE_NO_DEFORM)) {
+		std::string node_id = get_joint_id(bone, ob_arm);
+		std::string node_name = std::string(bone->name);
+		std::string node_sid = get_joint_sid(bone, ob_arm);
 
-	COLLADASW::Node node(mSW);
+		COLLADASW::Node node(mSW);
 
-	node.setType(COLLADASW::Node::JOINT);
-	node.setNodeId(node_id);
-	node.setNodeName(node_name);
-	node.setNodeSid(node_sid);
+		node.setType(COLLADASW::Node::JOINT);
+		node.setNodeId(node_id);
+		node.setNodeName(node_name);
+		node.setNodeSid(node_sid);
 
-	/*if ( bone->childbase.first == NULL || BLI_countlist(&(bone->childbase))>=2)
-	    add_blender_leaf_bone( bone, ob_arm , node );
-	   else{*/
-	node.start();
+		/*if ( bone->childbase.first == NULL || BLI_countlist(&(bone->childbase))>=2)
+			add_blender_leaf_bone( bone, ob_arm , node );
+		   else{*/
+		node.start();
 
-	add_bone_transform(ob_arm, bone, node);
+		add_bone_transform(ob_arm, bone, node);
 
-	// Write nodes of childobjects, remove written objects from list
-	std::list<Object *>::iterator i = child_objects.begin();
+		// Write nodes of childobjects, remove written objects from list
+		std::list<Object *>::iterator i = child_objects.begin();
 
-	while (i != child_objects.end()) {
-		if ((*i)->partype == PARBONE && (0 == strcmp((*i)->parsubstr, bone->name))) {
-			float backup_parinv[4][4];
-			copy_m4_m4(backup_parinv, (*i)->parentinv);
+		while (i != child_objects.end()) {
+			if ((*i)->partype == PARBONE && (0 == strcmp((*i)->parsubstr, bone->name))) {
+				float backup_parinv[4][4];
+				copy_m4_m4(backup_parinv, (*i)->parentinv);
 
-			// crude, temporary change to parentinv
-			// so transform gets exported correctly.
+				// crude, temporary change to parentinv
+				// so transform gets exported correctly.
 
-			// Add bone tail- translation... don't know why
-			// bone parenting is against the tail of a bone
-			// and not it's head, seems arbitrary.
-			(*i)->parentinv[3][1] += bone->length;
+				// Add bone tail- translation... don't know why
+				// bone parenting is against the tail of a bone
+				// and not it's head, seems arbitrary.
+				(*i)->parentinv[3][1] += bone->length;
 
-			// SECOND_LIFE_COMPATIBILITY
-			// TODO: when such objects are animated as
-			// single matrix the tweak must be applied
-			// to the result.
-			if (export_settings->second_life) {
-				// tweak objects parentinverse to match compatibility
-				float temp[4][4];
+				// SECOND_LIFE_COMPATIBILITY
+				// TODO: when such objects are animated as
+				// single matrix the tweak must be applied
+				// to the result.
+				if (export_settings->second_life) {
+					// tweak objects parentinverse to match compatibility
+					float temp[4][4];
 
-				copy_m4_m4(temp, bone->arm_mat);
-				temp[3][0] = temp[3][1] = temp[3][2] = 0.0f;
+					copy_m4_m4(temp, bone->arm_mat);
+					temp[3][0] = temp[3][1] = temp[3][2] = 0.0f;
 
-				mult_m4_m4m4((*i)->parentinv, temp, (*i)->parentinv);
-			}
+					mult_m4_m4m4((*i)->parentinv, temp, (*i)->parentinv);
+				}
 
-			se->writeNodes(*i, sce);
+				se->writeNodes(*i, sce);
 
-			copy_m4_m4((*i)->parentinv, backup_parinv);
-			child_objects.erase(i++);
+				copy_m4_m4((*i)->parentinv, backup_parinv);
+				child_objects.erase(i++);
+			}
+			else i++;
 		}
-		else i++;
-	}
 
-	for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) {
-		add_bone_node(child, ob_arm, sce, se, child_objects);
+		for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) {
+			add_bone_node(child, ob_arm, sce, se, child_objects);
+		}
+		node.end();
 	}
-	node.end();
-	//}
+	else {
+		for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) {
+			add_bone_node(child, ob_arm, sce, se, child_objects);
+		}
+	}
 }
 
 #if 0

Modified: trunk/blender/source/blender/collada/ArmatureExporter.h
===================================================================
--- trunk/blender/source/blender/collada/ArmatureExporter.h	2012-06-15 21:48:08 UTC (rev 47978)
+++ trunk/blender/source/blender/collada/ArmatureExporter.h	2012-06-15 22:00:25 UTC (rev 47979)
@@ -120,6 +120,8 @@
 
 	void add_vertex_weights_element(const std::string& weights_source_id, const std::string& joints_source_id,
 									const std::list<int>& vcount, const std::list<int>& joints);
+
+	void write_bone_URLs(COLLADASW::InstanceController &ins, Object *ob_arm, Bone *bone);
 };
 
 #endif

Modified: trunk/blender/source/blender/collada/ExportSettings.h
===================================================================
--- trunk/blender/source/blender/collada/ExportSettings.h	2012-06-15 21:48:08 UTC (rev 47978)
+++ trunk/blender/source/blender/collada/ExportSettings.h	2012-06-15 22:00:25 UTC (rev 47979)
@@ -34,10 +34,11 @@
 struct ExportSettings
 {
  public:
+ bool apply_modifiers;
  bool selected;
- bool apply_modifiers;
+ bool include_children;
  bool include_armatures;
- bool include_children;
+ bool deform_bones_only;
  bool use_object_instantiation;
  bool sort_by_name;
  bool second_life;

Modified: trunk/blender/source/blender/collada/collada.cpp
===================================================================
--- trunk/blender/source/blender/collada/collada.cpp	2012-06-15 21:48:08 UTC (rev 47978)
+++ trunk/blender/source/blender/collada/collada.cpp	2012-06-15 22:00:25 UTC (rev 47979)
@@ -50,17 +50,19 @@
 }
 
 int collada_export(
-    Scene *sce,
-    const char *filepath,
-    int selected,
-    int apply_modifiers,
+	Scene *sce,
+	const char *filepath,
 
-    int include_armatures,
-    int include_children,
+	int apply_modifiers,
 
-    int use_object_instantiation,
+	int selected,
+	int include_children,
+	int include_armatures,
+	int deform_bones_only,
+
+	int use_object_instantiation,
 	int sort_by_name,
-    int second_life)
+	int second_life)
 {
 	ExportSettings export_settings;
 
@@ -73,16 +75,20 @@
 	}
 	/* end! */
 
+	export_settings.filepath                 = (char *)filepath;
 
-	export_settings.selected                 = selected != 0;
 	export_settings.apply_modifiers          = apply_modifiers != 0;
+
+	export_settings.selected                 = selected          != 0;
+	export_settings.include_children         = include_children  != 0;
 	export_settings.include_armatures        = include_armatures != 0;
-	export_settings.include_children         = include_children != 0;
-	export_settings.second_life              = second_life != 0;
+	export_settings.deform_bones_only        = deform_bones_only != 0;
+
 	export_settings.use_object_instantiation = use_object_instantiation != 0;
 	export_settings.sort_by_name             = sort_by_name != 0;
-	export_settings.filepath                 = (char *)filepath;
+	export_settings.second_life              = second_life != 0;
 
+
 	int includeFilter = OB_REL_NONE;
 	if (export_settings.include_armatures) includeFilter |= OB_REL_MOD_ARMATURE;
 	if (export_settings.include_children) includeFilter |= OB_REL_CHILDREN_RECURSIVE;

Modified: trunk/blender/source/blender/collada/collada.h
===================================================================
--- trunk/blender/source/blender/collada/collada.h	2012-06-15 21:48:08 UTC (rev 47978)
+++ trunk/blender/source/blender/collada/collada.h	2012-06-15 22:00:25 UTC (rev 47979)
@@ -40,11 +40,12 @@
 	int collada_export(
 		Scene *sce, 
 		const char *filepath,
-		int selected,
 		int apply_modifiers,
 
+		int selected,
+		int include_children,
 		int include_armatures,
-		int include_children,
+		int deform_bones_only,
 
 		int use_object_instantiation,
 		int sort_by_name,

Modified: trunk/blender/source/blender/collada/collada_utils.cpp
===================================================================
--- trunk/blender/source/blender/collada/collada_utils.cpp	2012-06-15 21:48:08 UTC (rev 47978)
+++ trunk/blender/source/blender/collada/collada_utils.cpp	2012-06-15 22:00:25 UTC (rev 47979)
@@ -34,11 +34,14 @@
 
 #include "collada_utils.h"
 
+extern "C" {
+
 #include "DNA_modifier_types.h"
 #include "DNA_customdata_types.h"
 #include "DNA_object_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_scene_types.h"

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list