| 
									
										
										
										
											2011-02-21 08:38:53 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  |  * ***** BEGIN GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  |  * of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software Foundation, | 
					
						
							|  |  |  |  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-08-16 16:03:37 +00:00
										 |  |  |  * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory , Sukhitha Jayathilake. | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2011-02-21 08:38:53 +00:00
										 |  |  | /** \file AnimationImporter.h
 | 
					
						
							|  |  |  |  *  \ingroup collada | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | #ifndef __BC_ANIMATIONIMPORTER_H__
 | 
					
						
							|  |  |  | #define __BC_ANIMATIONIMPORTER_H__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <map>
 | 
					
						
							|  |  |  | #include <vector>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "COLLADAFWAnimation.h"
 | 
					
						
							|  |  |  | #include "COLLADAFWAnimationCurve.h"
 | 
					
						
							|  |  |  | #include "COLLADAFWAnimationList.h"
 | 
					
						
							|  |  |  | #include "COLLADAFWNode.h"
 | 
					
						
							|  |  |  | #include "COLLADAFWUniqueId.h"
 | 
					
						
							| 
									
										
										
										
											2011-07-03 11:07:34 +00:00
										 |  |  | #include "COLLADAFWLight.h"
 | 
					
						
							| 
									
										
										
										
											2011-07-06 18:09:36 +00:00
										 |  |  | #include "COLLADAFWCamera.h"
 | 
					
						
							| 
									
										
										
										
											2011-07-18 19:32:51 +00:00
										 |  |  | #include "COLLADAFWMaterial.h"
 | 
					
						
							|  |  |  | #include "COLLADAFWEffect.h"
 | 
					
						
							|  |  |  | #include "COLLADAFWInstanceGeometry.h"
 | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "DNA_anim_types.h"
 | 
					
						
							|  |  |  | #include "DNA_object_types.h"
 | 
					
						
							|  |  |  | #include "DNA_scene_types.h"
 | 
					
						
							| 
									
										
										
										
											2011-07-03 17:26:02 +00:00
										 |  |  | #include "DNA_lamp_types.h"
 | 
					
						
							| 
									
										
										
										
											2011-07-06 18:09:36 +00:00
										 |  |  | #include "DNA_camera_types.h"
 | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //#include "ArmatureImporter.h"
 | 
					
						
							|  |  |  | #include "TransformReader.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "collada_internal.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ArmatureImporter; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AnimationImporterBase | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	// virtual void change_eul_to_quat(Object *ob, bAction *act) = 0;
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AnimationImporter : private TransformReader, public AnimationImporterBase | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ArmatureImporter *armature_importer; | 
					
						
							|  |  |  | 	Scene *scene; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	std::map<COLLADAFW::UniqueId, std::vector<FCurve*> > curve_map; | 
					
						
							|  |  |  | 	std::map<COLLADAFW::UniqueId, TransformReader::Animation> uid_animated_map; | 
					
						
							|  |  |  | 	// std::map<bActionGroup*, std::vector<FCurve*> > fcurves_actionGroup_map;
 | 
					
						
							|  |  |  | 	std::map<COLLADAFW::UniqueId, const COLLADAFW::AnimationList*> animlist_map; | 
					
						
							|  |  |  | 	std::vector<FCurve*> unused_curves; | 
					
						
							|  |  |  | 	std::map<COLLADAFW::UniqueId, Object*> joint_objects; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	FCurve *create_fcurve(int array_index, const char *rna_path); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	void create_bezt(FCurve *fcu, float frame, float output); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create one or several fcurves depending on the number of parameters being animated
 | 
					
						
							|  |  |  | 	void animation_to_fcurves(COLLADAFW::AnimationCurve *curve); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void fcurve_deg_to_rad(FCurve *cu); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void add_fcurves_to_object(Object *ob, std::vector<FCurve*>& curves, char *rna_path, int array_index, Animation *animated); | 
					
						
							| 
									
										
										
										
											2011-07-04 19:41:33 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2011-07-03 13:01:52 +00:00
										 |  |  | 	int typeFlag; | 
					
						
							| 
									
										
										
										
											2011-09-04 00:15:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-09 15:15:17 +00:00
										 |  |  | 	enum lightAnim | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | //		INANIMATE = 0,
 | 
					
						
							|  |  |  | 		LIGHT_COLOR	= 2, | 
					
						
							|  |  |  | 		LIGHT_FOA = 4, | 
					
						
							|  |  |  | 		LIGHT_FOE = 8 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	enum cameraAnim | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | //		INANIMATE = 0,
 | 
					
						
							|  |  |  | 		CAMERA_XFOV = 2, | 
					
						
							| 
									
										
										
										
											2011-07-09 19:33:02 +00:00
										 |  |  | 		CAMERA_XMAG = 4, | 
					
						
							|  |  |  | 		CAMERA_ZFAR = 8, | 
					
						
							|  |  |  | 		CAMERA_ZNEAR = 16 | 
					
						
							| 
									
										
										
										
											2011-07-09 15:15:17 +00:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2011-07-18 18:31:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	enum matAnim | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2011-07-27 17:43:32 +00:00
										 |  |  | 		MATERIAL_SHININESS = 2, | 
					
						
							| 
									
										
										
										
											2011-07-27 19:08:18 +00:00
										 |  |  | 		MATERIAL_SPEC_COLOR = 4, | 
					
						
							| 
									
										
										
										
											2011-07-31 05:04:12 +00:00
										 |  |  | 		MATERIAL_DIFF_COLOR = 1 << 3, | 
					
						
							| 
									
										
										
										
											2011-08-07 18:15:40 +00:00
										 |  |  | 		MATERIAL_TRANSPARENCY = 1 << 4, | 
					
						
							|  |  |  | 		MATERIAL_IOR = 1 << 5 | 
					
						
							| 
									
										
										
										
											2011-07-18 18:31:01 +00:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2011-07-09 15:15:17 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2011-07-03 12:33:52 +00:00
										 |  |  | 	enum AnimationType | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2011-07-03 13:01:52 +00:00
										 |  |  | 			INANIMATE = 0, | 
					
						
							|  |  |  | 			NODE_TRANSFORM = 1, | 
					
						
							| 
									
										
										
										
											2011-07-03 12:33:52 +00:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2011-07-09 15:15:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	struct AnimMix | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		int transform; | 
					
						
							|  |  |  | 		int light; | 
					
						
							|  |  |  | 		int camera; | 
					
						
							|  |  |  | 		int material; | 
					
						
							|  |  |  | 		int texture; | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	AnimationImporter(UnitConverter *conv, ArmatureImporter *arm, Scene *scene); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	~AnimationImporter(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool write_animation(const COLLADAFW::Animation* anim); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	// called on post-process stage after writeVisualScenes
 | 
					
						
							|  |  |  | 	bool write_animation_list(const COLLADAFW::AnimationList* animlist); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void read_node_transform(COLLADAFW::Node *node, Object *ob); | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  | 	virtual void change_eul_to_quat(Object *ob, bAction *act); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-09-04 00:15:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-17 18:29:01 +00:00
										 |  |  | 	void translate_Animations( COLLADAFW::Node * Node ,  | 
					
						
							| 
									
										
										
										
											2011-06-14 20:42:01 +00:00
										 |  |  | 												   std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map, | 
					
						
							| 
									
										
										
										
											2011-07-03 11:07:34 +00:00
										 |  |  | 												   std::map<COLLADAFW::UniqueId, Object*>& object_map , | 
					
						
							|  |  |  | 												   std::map<COLLADAFW::UniqueId, const COLLADAFW::Object*> FW_object_map); | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-09 15:15:17 +00:00
										 |  |  | 	AnimMix* get_animation_type( const COLLADAFW::Node * node , std::map<COLLADAFW::UniqueId,const COLLADAFW::Object*> FW_object_map ) ; | 
					
						
							| 
									
										
										
										
											2011-06-14 20:42:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-14 16:14:32 +00:00
										 |  |  | 	void apply_matrix_curves( Object * ob, std::vector<FCurve*>& animcurves, COLLADAFW::Node* root ,COLLADAFW::Node* node, | 
					
						
							|  |  |  | 									COLLADAFW::Transformation * tm ); | 
					
						
							| 
									
										
										
										
											2011-06-14 20:42:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-03 11:28:40 +00:00
										 |  |  | 	void Assign_transform_animations(COLLADAFW::Transformation* transform ,  | 
					
						
							| 
									
										
										
										
											2011-06-14 20:42:01 +00:00
										 |  |  | 									 const COLLADAFW::AnimationList::AnimationBinding * binding, | 
					
						
							|  |  |  | 									 std::vector<FCurve*>* curves, bool is_joint, char * joint_path); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-05 19:27:21 +00:00
										 |  |  | 	void Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, const char * anim_type); | 
					
						
							|  |  |  | 	void Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, const char * anim_type); | 
					
						
							| 
									
										
										
										
											2011-09-04 00:15:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-09 19:33:02 +00:00
										 |  |  | 	int setAnimType ( const COLLADAFW::Animatable * prop , int type, int addition); | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2011-09-28 05:53:40 +00:00
										 |  |  | 	void modify_fcurve(std::vector<FCurve*>* curves , const char* rna_path , int array_index ); | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | 	// prerequisites:
 | 
					
						
							|  |  |  | 	// animlist_map - map animlist id -> animlist
 | 
					
						
							|  |  |  | 	// curve_map - map anim id -> curve(s)
 | 
					
						
							| 
									
										
										
										
											2011-08-17 18:29:01 +00:00
										 |  |  | 	Object * translate_animation_OLD(COLLADAFW::Node *node, | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | 								std::map<COLLADAFW::UniqueId, Object*>& object_map, | 
					
						
							|  |  |  | 								std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map, | 
					
						
							|  |  |  | 								COLLADAFW::Transformation::TransformationType tm_type, | 
					
						
							|  |  |  | 								Object *par_job = NULL); | 
					
						
							| 
									
										
										
										
											2011-07-04 19:41:33 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2011-06-14 20:42:01 +00:00
										 |  |  | 	void find_frames( std::vector<float>* frames , std::vector<FCurve*>* curves ); | 
					
						
							|  |  |  | 	void find_frames_old( std::vector<float>* frames, COLLADAFW::Node * node, COLLADAFW::Transformation::TransformationType tm_type ); | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | 	// internal, better make it private
 | 
					
						
							|  |  |  | 	// warning: evaluates only rotation
 | 
					
						
							|  |  |  | 	// prerequisites: animlist_map, curve_map
 | 
					
						
							|  |  |  | 	void evaluate_transform_at_frame(float mat[4][4], COLLADAFW::Node *node, float fra); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// return true to indicate that mat contains a sane value
 | 
					
						
							|  |  |  | 	bool evaluate_animation(COLLADAFW::Transformation *tm, float mat[4][4], float fra, const char *node_id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// gives a world-space mat of joint at rest position
 | 
					
						
							|  |  |  | 	void get_joint_rest_mat(float mat[4][4], COLLADAFW::Node *root, COLLADAFW::Node *node); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// gives a world-space mat, end's mat not included
 | 
					
						
							|  |  |  | 	bool calc_joint_parent_mat_rest(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef ARMATURE_TEST
 | 
					
						
							|  |  |  | 	Object *get_joint_object(COLLADAFW::Node *root, COLLADAFW::Node *node, Object *par_job); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  | 	// recursively evaluates joint tree until end is found, mat then is world-space matrix of end
 | 
					
						
							|  |  |  | 	// mat must be identity on enter, node must be root
 | 
					
						
							|  |  |  | 	bool evaluate_joint_world_transform_at_frame(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end, float fra); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void add_bone_fcurve(Object *ob, COLLADAFW::Node *node, FCurve *fcu); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void add_bezt(FCurve *fcu, float fra, float value); | 
					
						
							| 
									
										
										
										
											2011-08-14 16:14:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void extra_data_importer(std::string elementName); | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2011-09-04 00:15:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif
 |