[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21726] branches/soc-2009-chingachgook/ source/blender: Added objects(not bones yet) animation import.

Chingiz Dyussenov chingiz.ds at gmail.com
Mon Jul 20 19:34:57 CEST 2009


Revision: 21726
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21726
Author:   chingachgook
Date:     2009-07-20 19:34:57 +0200 (Mon, 20 Jul 2009)

Log Message:
-----------
Added objects(not bones yet) animation import. Matrix and Skew transformations are not supported.

Modified Paths:
--------------
    branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
    branches/soc-2009-chingachgook/source/blender/makesdna/DNA_anim_types.h

Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-20 17:15:41 UTC (rev 21725)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-20 17:34:57 UTC (rev 21726)
@@ -1,36 +1,32 @@
+#include "COLLADAFWRoot.h"
+#include "COLLADAFWIWriter.h"
 #include "COLLADAFWStableHeaders.h"
-#include "COLLADAFWIWriter.h"
-#include "COLLADAFWRoot.h"
-#include "COLLADAFWNode.h"
-#include "COLLADAFWVisualScene.h"
+#include "COLLADAFWAnimationCurve.h"
+#include "COLLADAFWAnimationList.h"
+#include "COLLADAFWCamera.h"
+#include "COLLADAFWColorOrTexture.h"
+#include "COLLADAFWEffect.h"
+#include "COLLADAFWFloatOrDoubleArray.h"
+#include "COLLADAFWGeometry.h"
+#include "COLLADAFWImage.h"
+#include "COLLADAFWIndexList.h"
 #include "COLLADAFWInstanceGeometry.h"
-#include "COLLADAFWFileInfo.h"
-#include "COLLADAFWRoot.h"
 #include "COLLADAFWLight.h"
-#include "COLLADAFWImage.h"
 #include "COLLADAFWMaterial.h"
-#include "COLLADAFWEffect.h"
-#include "COLLADAFWGeometry.h"
 #include "COLLADAFWMesh.h"
-#include "COLLADAFWMeshPrimitive.h"
-#include "COLLADAFWMeshVertexData.h"
-#include "COLLADAFWFloatOrDoubleArray.h"
-#include "COLLADAFWArrayPrimitiveType.h"
-#include "COLLADAFWIndexList.h"
 #include "COLLADAFWMeshPrimitiveWithFaceVertexCount.h"
+#include "COLLADAFWNode.h"
 #include "COLLADAFWPolygons.h"
+#include "COLLADAFWRotate.h"
+#include "COLLADAFWSampler.h"
+#include "COLLADAFWScale.h"
+#include "COLLADAFWSkinController.h"
 #include "COLLADAFWTransformation.h"
 #include "COLLADAFWTranslate.h"
-#include "COLLADAFWScale.h"
-#include "COLLADAFWRotate.h"
-#include "COLLADAFWAnimationCurve.h"
-#include "COLLADAFWAnimationList.h"
-#include "COLLADAFWSkinController.h"
-#include "COLLADAFWColorOrTexture.h"
-#include "COLLADAFWSampler.h"
 #include "COLLADAFWTypes.h"
-#include "COLLADAFWCamera.h"
-#include "COLLADAFWLight.h"
+#include "COLLADAFWVisualScene.h"
+#include "COLLADAFWFileInfo.h"
+#include "COLLADAFWArrayPrimitiveType.h"
 
 #include "COLLADASaxFWLLoader.h"
 
@@ -41,6 +37,8 @@
 #include "BKE_customdata.h"
 #include "BKE_library.h"
 #include "BKE_texture.h"
+#include "ED_keyframing.h"
+#include "BKE_fcurve.h"
 }
 #include "DNA_lamp_types.h"
 #include "BKE_mesh.h"
@@ -51,15 +49,20 @@
 #include "BKE_material.h"
 
 #include "BLI_arithb.h"
+#include "BLI_listbase.h"
+#include "BLI_string.h"
 
+#include "DNA_anim_types.h"
+#include "DNA_curve_types.h"
 #include "DNA_texture_types.h"
 #include "DNA_camera_types.h"
 #include "DNA_object_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_material_types.h"
+#include "DNA_scene_types.h"
 
-//#include "DNA_texture_types.h"
+#include "MEM_guardedalloc.h"
 
 #include "DocumentImporter.h"
 
@@ -146,7 +149,8 @@
 	typedef std::map<COLLADAFW::MaterialId, std::vector<Primitive> > MaterialIdPrimitiveArrayMap;
 	// amazing name!
 	std::map<COLLADAFW::UniqueId, MaterialIdPrimitiveArrayMap> geom_uid_mat_mapping_map;
-
+	// maps for animation
+	std::map<COLLADAFW::UniqueId, std::vector<FCurve*> > uid_fcurve_map;
 	struct AnimatedTransform {
 		Object *ob;
 		// COLLADAFW::Node *node;
@@ -196,10 +200,6 @@
 
 		void getUV(int uv_set_index, int uv_index[2], float *uv)
 		{
-			//int uv_coords_index = mVData->getInputInfosArray()[uv_set_index]->getCount() * uv_set_index + uv_index * 2;
-			// int uv_coords_index = uv_index * 2;
- 			//int uv_coords_index = mVData->getLength(uv_set_index) * uv_set_index + uv_index * 2;
-			
 			switch(mVData->getType()) {
 			case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
 				{
@@ -1049,8 +1049,8 @@
 		@return The writer should return true, if writing succeeded, false otherwise.*/
 	virtual bool writeCamera( const COLLADAFW::Camera* camera ) 
 	{
-		//std::string name = camera->getOriginalId();
-		Camera *cam = (Camera*)add_camera("my_camera");
+		std::string name = camera->getOriginalId();
+		Camera *cam = (Camera*)add_camera((char*)name.c_str());
 		if (cam != NULL)
 			this->uid_camera_map[camera->getUniqueId()] = cam;
 		else fprintf(stderr, "Cannot create camera. \n");
@@ -1076,8 +1076,8 @@
 		@return The writer should return true, if writing succeeded, false otherwise.*/
 	virtual bool writeLight( const COLLADAFW::Light* light ) 
 	{
-		//std::string name = light->getOriginalId();
-		Lamp *lamp = (Lamp*)add_lamp("my_lamp");
+		std::string name = light->getOriginalId();
+		Lamp *lamp = (Lamp*)add_lamp((char*)name.c_str());
 		COLLADAFW::Light::LightType type = light->getLightType();
 		switch(type) {
 		case COLLADAFW::Light::AMBIENT_LIGHT:
@@ -1114,13 +1114,112 @@
 		// XXX import light options*/
 		return true;
 	}
-
+	
+	float get_float(COLLADAFW::FloatOrDoubleArray array, int i)
+	{
+		switch(array.getType()) {
+		case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
+			{
+				COLLADAFW::ArrayPrimitiveType<float> *values = array.getFloatValues();
+				return (*values)[i];
+			}
+		case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
+			{
+				COLLADAFW::ArrayPrimitiveType<double> *values = array.getDoubleValues();
+				return (float)(*values)[i];
+			}
+		}
+	}
+	
+	void write_curves(const COLLADAFW::Animation* anim,
+					  COLLADAFW::AnimationCurve *curve,
+					  COLLADAFW::FloatOrDoubleArray input,
+					  COLLADAFW::FloatOrDoubleArray output,
+					  COLLADAFW::FloatOrDoubleArray intan,
+					  COLLADAFW::FloatOrDoubleArray outtan, size_t dim, float fps)
+	{
+		int i;
+		if (dim == 1) {
+			// create fcurve
+			FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
+			if (!fcu) {
+				fprintf(stderr, "Cannot create fcurve. \n");
+				return;
+			}
+			char *path = "location";
+			fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
+			fcu->rna_path = BLI_strdupn(path, strlen(path));
+			fcu->array_index = 0;
+			fcu->totvert = curve->getKeyCount();
+			
+			// create beztriple for each key
+			for (i = 0; i < curve->getKeyCount(); i++) {
+				BezTriple bez;
+				memset(&bez, 0, sizeof(BezTriple));
+				// intangent
+				bez.vec[0][0] = get_float(intan, i + i) * fps;
+				bez.vec[0][1] = get_float(intan, i + i + 1);
+				// input, output
+				bez.vec[1][0] = get_float(input, i) * fps;
+				bez.vec[1][1] = get_float(output, i);
+				// outtangent
+				bez.vec[2][0] = get_float(outtan, i + i) * fps;
+				bez.vec[2][1] = get_float(outtan, i + i + 1);
+				bez.ipo = U.ipo_new; /* use default interpolation mode here... */
+				bez.f1 = bez.f2 = bez.f3 = SELECT;
+				bez.h1 = bez.h2 = HD_AUTO;
+				insert_bezt_fcurve(fcu, &bez);
+				calchandles_fcurve(fcu);
+			}
+			// map fcurve to animation's UID
+			this->uid_fcurve_map[anim->getUniqueId()].push_back(fcu);
+		}
+		else if(dim == 3) {
+			for (i = 0; i < dim; i++ ) {
+				// create fcurve
+				FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
+				if (!fcu) {
+					fprintf(stderr, "Cannot create fcurve. \n");
+					continue;
+				}
+				fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
+				fcu->rna_path = "location";
+				fcu->array_index = 0;
+				fcu->totvert = curve->getKeyCount();
+				
+				// create beztriple for each key
+				for (int j = 0; j < curve->getKeyCount(); j++) {
+					BezTriple bez;
+					memset(&bez, 0, sizeof(BezTriple));
+					// intangent
+					bez.vec[0][0] = get_float(intan, j * 6 + i + i) * fps;
+					bez.vec[0][1] = get_float(intan, j * 6 + i + i + 1);
+					// input, output
+					bez.vec[1][0] = get_float(input, j) * fps; 
+					bez.vec[1][1] = get_float(output, j * 3 + i);
+					// outtangent
+					bez.vec[2][0] = get_float(outtan, j * 6 + i + i) * fps;
+					bez.vec[2][1] = get_float(outtan, j * 6 + i + i + 1);
+					bez.ipo = U.ipo_new; /* use default interpolation mode here... */
+					bez.f1 = bez.f2 = bez.f3 = SELECT;
+					bez.h1 = bez.h2 = HD_AUTO;
+					insert_bezt_fcurve(fcu, &bez);
+					calchandles_fcurve(fcu);
+				}
+				// map fcurve to animation's UID
+				this->uid_fcurve_map[anim->getUniqueId()].push_back(fcu);
+				
+			}
+		}
+	}
+	
 	// this function is called only for animations that pass COLLADAFW::validate
 	virtual bool writeAnimation( const COLLADAFW::Animation* anim ) 
 	{
 		if (anim->getAnimationType() == COLLADAFW::Animation::ANIMATION_CURVE) {
 			COLLADAFW::AnimationCurve *curve = (COLLADAFW::AnimationCurve*)anim;
-
+			Scene *scene = CTX_data_scene(mContext);
+			float fps = (float)FPS;
 			// I wonder how do we use this (Arystan)
 			size_t dim = curve->getOutDimension();
 			
@@ -1130,18 +1229,23 @@
 				fprintf(stderr, "Inputs physical dimension is not time. \n");
 				return true;
 			}
-			
+			COLLADAFW::FloatOrDoubleArray input = curve->getInputValues();
+			COLLADAFW::FloatOrDoubleArray output = curve->getOutputValues();
+			COLLADAFW::FloatOrDoubleArray intan = curve->getInTangentValues();
+			COLLADAFW::FloatOrDoubleArray outtan = curve->getOutTangentValues();
 			// a curve can have mixed interpolation type,
 			// in this case curve->getInterpolationTypes returns a list of interpolation types per key
 			COLLADAFW::AnimationCurve::InterpolationType interp = curve->getInterpolationType();
-
+			
 			if (interp != COLLADAFW::AnimationCurve::INTERPOLATION_MIXED) {
 				switch (interp) {
 				case COLLADAFW::AnimationCurve::INTERPOLATION_LINEAR:
 					// support this
+					write_curves(anim, curve, input, output, intan, outtan, dim, fps);
 					break;
 				case COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER:
 					// and this
+					write_curves(anim, curve, input, output, intan, outtan, dim, fps);
 					break;
 				case COLLADAFW::AnimationCurve::INTERPOLATION_CARDINAL:
 				case COLLADAFW::AnimationCurve::INTERPOLATION_HERMITE:
@@ -1162,40 +1266,90 @@
 		
 		return true;
 	}
-
+	
+	void change_fcurve(Object *ob, const COLLADAFW::UniqueId& anim_id, char *rna_path, int array_index)
+	{
+		if (uid_fcurve_map.find(anim_id) == uid_fcurve_map.end()) {
+			fprintf(stderr, "Cannot find fcurves by UID.\n");
+			return;
+		}
+		ID *id = &ob->id;
+		bAction *act;
+		if (!ob->adt || !ob->adt->action)
+			act = verify_adt_action(id, 1);
+		else 
+			act = verify_adt_action(id, 0);
+		if (!ob->adt || !ob->adt->action) {
+			fprintf(stderr, "Cannot create anim data or action for this object. \n");
+			return;
+		}
+		FCurve *fcu;
+		std::vector<FCurve*> fcurves = uid_fcurve_map[anim_id];
+		std::vector<FCurve*>::iterator it;
+		int i = 0;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list