[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37219] branches/soc-2011-pepper/source/ blender/collada: Add new animation export features.

Sukhitha Jayathilake pr.jayathilake at gmail.com
Sun Jun 5 20:58:22 CEST 2011


Revision: 37219
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37219
Author:   phabtar
Date:     2011-06-05 18:58:22 +0000 (Sun, 05 Jun 2011)
Log Message:
-----------
Add new animation export features.

- Bone animations are also exported as f-curve animations now. As a result euler rotaions of bones are also exported. All animations with BEZIER, LINEAR or STEP ipo are exported. 
- Quaternion rotations export.
- Object parented with armatures, animations to Armature Objects as a whole are also exported. 

Modified Paths:
--------------
    branches/soc-2011-pepper/source/blender/collada/AnimationExporter.cpp
    branches/soc-2011-pepper/source/blender/collada/AnimationExporter.h

Modified: branches/soc-2011-pepper/source/blender/collada/AnimationExporter.cpp
===================================================================
--- branches/soc-2011-pepper/source/blender/collada/AnimationExporter.cpp	2011-06-05 18:51:00 UTC (rev 37218)
+++ branches/soc-2011-pepper/source/blender/collada/AnimationExporter.cpp	2011-06-05 18:58:22 UTC (rev 37219)
@@ -55,41 +55,86 @@
 	void AnimationExporter::operator() (Object *ob) 
 	{
 		if (!ob->adt || !ob->adt->action) return;  //this is already checked in hasAnimations()
-		
 		FCurve *fcu = (FCurve*)ob->adt->action->curves.first;
-		
-		if (ob->type == OB_ARMATURE) {
-			if (!ob->data) return;
-
-			bArmature *arm = (bArmature*)ob->data;
-			for (Bone *bone = (Bone*)arm->bonebase.first; bone; bone = bone->next)
-				write_bone_animation(ob, bone);
-		}
-		else {
+		char * transformName = extract_transform_name( fcu->rna_path );
+        
+		//if (ob->type == OB_ARMATURE) {
+		//	if (!ob->data) return;
+		//	bArmature *arm = (bArmature*)ob->data;
+		//	while(fcu)
+		//	{ 		
+		//		transformName = extract_transform_name( fcu->rna_path );
+		//	//	std::string ob_name =  getObjectBoneName( ob , fcu);
+		//	//	for (Bone *bone = (Bone*)arm->bonebase.first; bone; bone = bone->next)
+		//	//		write_bone_animation(ob, bone);
+		//		dae_animation(ob, fcu, ob_name, transformName);
+		//		fcu = fcu->next;
+		//	}
+		//}
+		//else {
 			while (fcu) {
-				// TODO "rotation_quaternion" is also possible for objects (although euler is default)
-				if ((!strcmp(fcu->rna_path, "location") || !strcmp(fcu->rna_path, "scale")) ||
-					(!strcmp(fcu->rna_path, "rotation_euler") && ob->rotmode == ROT_MODE_EUL))
-					dae_animation(fcu, id_name(ob));
+			transformName = extract_transform_name( fcu->rna_path );
+				printf("fcu -> rna _path : %s \n transformName : %s\n", fcu->rna_path, transformName);
+				if ((!strcmp(transformName, "location") || !strcmp(transformName, "scale")) ||
+					(!strcmp(transformName, "rotation_euler") && ob->rotmode == ROT_MODE_EUL)||
+					(!strcmp(transformName, "rotation_quaternion"))) 
+					dae_animation(ob ,fcu,/* id_name(ob),*/ transformName);
 
 				fcu = fcu->next;
 			}
-		}
+		//}
 	}
 
-	void AnimationExporter::dae_animation(FCurve *fcu, std::string ob_name)
+	std::string AnimationExporter::getObjectBoneName( Object* ob,const FCurve* fcu ) 
 	{
-		const char *axis_names[] = {"X", "Y", "Z"};
+		//hard-way to derive the bone name from rna_path. Must find more compact method
+		std::string rna_path = std::string(fcu->rna_path);
+
+		char* boneName = strtok((char *)rna_path.c_str(), "\"");
+		boneName = strtok(NULL,"\"");
+		
+		if( boneName != NULL )
+			return id_name(ob) + "_" + std::string(boneName);
+		else		
+			return id_name(ob);
+	}
+
+	void AnimationExporter::dae_animation(Object* ob, FCurve *fcu/*, std::string ob_name*/ , char* transformName)
+	{
+		printf("in dae animation\n");
 		const char *axis_name = NULL;
 		char anim_id[200];
 		bool has_tangents = false;
 		
-		if (fcu->array_index < 3)
+		if ( !strcmp(transformName, "rotation_quaternion") )
+		{
+			const char *axis_names[] = {"W", "X", "Y", "Z"};
+			if (fcu->array_index < 4)
 			axis_name = axis_names[fcu->array_index];
+		}
 
-		BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
-					 fcu->rna_path, axis_names[fcu->array_index]);
+		else
+		{
+			const char *axis_names[] = {"X", "Y", "Z"};
+			if (fcu->array_index < 3)
+			axis_name = axis_names[fcu->array_index];
+			
 
+		}
+		std::string ob_name = std::string("null");
+		if (ob->type == OB_ARMATURE) 
+		{   
+		    ob_name =  getObjectBoneName( ob , fcu);
+			BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s.%s", (char*)translate_id(ob_name).c_str(),
+				transformName, axis_name);
+		}
+		else 
+		{
+			ob_name = id_name(ob);
+			BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
+				 fcu->rna_path, axis_name);
+		}
+		
 		// check rna_path is one of: rotation, scale, location
 
 		openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
@@ -221,9 +266,9 @@
 	void AnimationExporter::sample_animation(float *v, std::vector<float> &frames, int type, Bone *bone, Object *ob_arm, bPoseChannel *pchan)
 	{
 		bPoseChannel *parchan = NULL;
-		/*bPose *pose = ob_arm->pose;
+		bPose *pose = ob_arm->pose;
 
-		pchan = get_pose_channel(pose, bone->name);*/
+		pchan = get_pose_channel(pose, bone->name);
 
 		if (!pchan)
 			return;
@@ -636,23 +681,27 @@
 		if (rna_path) {
 			char *name = extract_transform_name(rna_path);
 
-			if (strstr(name, "rotation"))
+			if (!strcmp(name, "rotation_euler"))
 				tm_type = 0;
+			else if (!strcmp(name, "rotation_quaternion"))
+				tm_type = 1;
 			else if (!strcmp(name, "scale"))
-				tm_type = 1;
+				tm_type = 2;
 			else if (!strcmp(name, "location"))
-				tm_type = 2;
+				tm_type = 3;
 			else
 				tm_type = -1;
 		}
 
 		switch (tm_type) {
 		case 0:
-			return std::string("rotation") + std::string(axis_name) + ".ANGLE";
+			return std::string("rotation_euler.") + std::string(axis_name) + ".ANGLE";
 		case 1:
+			return std::string("rotation_quaternion.") + std::string(axis_name) + ".ANGLE";
+	    case 2:
 			tm_name = "scale";
 			break;
-		case 2:
+		case 3:
 			tm_name = "location";
 			break;
 		default:

Modified: branches/soc-2011-pepper/source/blender/collada/AnimationExporter.h
===================================================================
--- branches/soc-2011-pepper/source/blender/collada/AnimationExporter.h	2011-06-05 18:51:00 UTC (rev 37218)
+++ branches/soc-2011-pepper/source/blender/collada/AnimationExporter.h	2011-06-05 18:58:22 UTC (rev 37219)
@@ -89,7 +89,7 @@
 	
 protected:
 
-	void dae_animation(FCurve *fcu, std::string ob_name);
+	void dae_animation(Object* ob, FCurve *fcu, char* transformName);
 
 	void write_bone_animation(Object *ob_arm, Bone *bone);
 
@@ -137,4 +137,6 @@
 	bool hasAnimations(Scene *sce);
 	
 	char* extract_transform_name(char *rna_path);
+
+	std::string getObjectBoneName ( Object *ob,const FCurve * fcu);
 };
\ No newline at end of file




More information about the Bf-blender-cvs mailing list