[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39004] branches/soc-2011-pepper/source/ blender/collada: Find all key frames for baked animation export.

Sukhitha Jayathilake pr.jayathilake at gmail.com
Wed Aug 3 21:12:18 CEST 2011


Revision: 39004
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39004
Author:   phabtar
Date:     2011-08-03 19:12:18 +0000 (Wed, 03 Aug 2011)
Log Message:
-----------
Find all key frames for baked animation export.

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-08-03 19:05:58 UTC (rev 39003)
+++ branches/soc-2011-pepper/source/blender/collada/AnimationExporter.cpp	2011-08-03 19:12:18 UTC (rev 39004)
@@ -61,6 +61,13 @@
 		bool isMatAnim = false;
         if(ob->adt && ob->adt->action)      
 		{
+			if ( ob->type == OB_ARMATURE )
+			{
+				bArmature *arm = (bArmature*)ob->data;
+				for (Bone *bone = (Bone*)arm->bonebase.first; bone; bone = bone->next)
+					bake_bone_animation(ob, bone);
+			    
+			}
 			fcu = (FCurve*)ob->adt->action->curves.first;
 		    while (fcu) {
 			transformName = extract_transform_name( fcu->rna_path );
@@ -318,6 +325,17 @@
 		closeAnimation();
 	}
 
+	void AnimationExporter::bake_bone_animation(Object *ob_arm, Bone *bone)
+	{
+		if (!ob_arm->adt)
+			return;
+        
+		sample_and_bake_bone_animation(ob_arm, bone);
+
+        for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next)
+			bake_bone_animation(ob_arm, child);
+	}
+
 	void AnimationExporter::write_bone_animation(Object *ob_arm, Bone *bone)
 	{
 		if (!ob_arm->adt)
@@ -334,6 +352,22 @@
 			write_bone_animation(ob_arm, child);
 	}
 
+	void AnimationExporter::sample_and_bake_bone_animation(Object *ob_arm, Bone *bone)
+	{
+		bArmature *arm = (bArmature*)ob_arm->data;
+		int flag = arm->flag;
+		std::vector<float> fra;
+		char prefix[256];
+
+		BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone->name);
+
+		bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
+		if (!pchan)
+			return;
+    
+		find_all_frames(ob_arm, fra);
+	}
+
 	void AnimationExporter::sample_and_write_bone_animation(Object *ob_arm, Bone *bone, int transform_type)
 	{
 		bArmature *arm = (bArmature*)ob_arm->data;
@@ -920,6 +954,25 @@
 		return dot ? (dot + 1) : rna_path;
 	}
 
+	void AnimationExporter::find_all_frames(Object *ob, std::vector<float> &fra)
+	{
+		FCurve *fcu= (FCurve*)ob->adt->action->curves.first;
+		std::vector<float> keys;
+		for (unsigned int i = 0; i < fcu->totvert; i++) {
+					float f = fcu->bezt[i].vec[1][0];     //
+					if (std::find(keys.begin(), keys.end(), f) == keys.end())   
+						keys.push_back(f);
+		}
+
+		std::sort(keys.begin(), keys.end());
+
+		for ( float fAll = *(keys.begin()) ; fAll != *(keys.end()) ; fAll+=1.0f )
+		{
+			fra.push_back(fAll); 
+		}
+		return;
+
+	}
 	void AnimationExporter::find_frames(Object *ob, std::vector<float> &fra, const char *prefix, const char *tm_name)
 	{
 		FCurve *fcu= (FCurve*)ob->adt->action->curves.first;

Modified: branches/soc-2011-pepper/source/blender/collada/AnimationExporter.h
===================================================================
--- branches/soc-2011-pepper/source/blender/collada/AnimationExporter.h	2011-08-03 19:05:58 UTC (rev 39003)
+++ branches/soc-2011-pepper/source/blender/collada/AnimationExporter.h	2011-08-03 19:12:18 UTC (rev 39004)
@@ -96,10 +96,14 @@
 
 	void dae_animation(Object* ob, FCurve *fcu, char* transformName , bool is_param, Material *ma = NULL);
 
+	void bake_bone_animation(Object *ob_arm, Bone *bone);
+
 	void write_bone_animation(Object *ob_arm, Bone *bone);
 
 	void sample_and_write_bone_animation(Object *ob_arm, Bone *bone, int transform_type);
 
+	void sample_and_bake_bone_animation(Object *ob_arm, Bone *bone);
+
 	void sample_animation(float *v, std::vector<float> &frames, int type, Bone *bone, Object *ob_arm, bPoseChannel *pChan);
 
 	// dae_bone_animation -> add_bone_animation
@@ -134,6 +138,8 @@
 	std::string get_transform_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis);
 	
 	void find_frames(Object *ob, std::vector<float> &fra, const char *prefix, const char *tm_name);
+
+	void find_all_frames(Object *ob, std::vector<float> &fra);
 	
 	void find_rotation_frames(Object *ob, std::vector<float> &fra, const char *prefix, int rotmode);
 	




More information about the Bf-blender-cvs mailing list