Material Specular Color Animation import.
[blender-staging.git] / source / blender / collada / AnimationImporter.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24  
25 /** \file AnimationImporter.h
26  *  \ingroup collada
27  */
28
29 #ifndef __BC_ANIMATIONIMPORTER_H__
30 #define __BC_ANIMATIONIMPORTER_H__
31
32 #include <map>
33 #include <vector>
34
35 #include "COLLADAFWAnimation.h"
36 #include "COLLADAFWAnimationCurve.h"
37 #include "COLLADAFWAnimationList.h"
38 #include "COLLADAFWNode.h"
39 #include "COLLADAFWUniqueId.h"
40 #include "COLLADAFWLight.h"
41 #include "COLLADAFWCamera.h"
42 #include "COLLADAFWMaterial.h"
43 #include "COLLADAFWEffect.h"
44 #include "COLLADAFWInstanceGeometry.h"
45
46 #include "DNA_anim_types.h"
47 #include "DNA_object_types.h"
48 #include "DNA_scene_types.h"
49 #include "DNA_lamp_types.h"
50 #include "DNA_camera_types.h"
51
52 //#include "ArmatureImporter.h"
53 #include "TransformReader.h"
54
55 #include "collada_internal.h"
56
57 class ArmatureImporter;
58
59 class AnimationImporterBase
60 {
61 public:
62         // virtual void change_eul_to_quat(Object *ob, bAction *act) = 0;
63 };
64
65 class AnimationImporter : private TransformReader, public AnimationImporterBase
66 {
67 private:
68
69         ArmatureImporter *armature_importer;
70         Scene *scene;
71
72         std::map<COLLADAFW::UniqueId, std::vector<FCurve*> > curve_map;
73         std::map<COLLADAFW::UniqueId, TransformReader::Animation> uid_animated_map;
74         // std::map<bActionGroup*, std::vector<FCurve*> > fcurves_actionGroup_map;
75         std::map<COLLADAFW::UniqueId, const COLLADAFW::AnimationList*> animlist_map;
76         std::vector<FCurve*> unused_curves;
77         std::map<COLLADAFW::UniqueId, Object*> joint_objects;
78         
79         FCurve *create_fcurve(int array_index, const char *rna_path);
80         
81         void create_bezt(FCurve *fcu, float frame, float output);
82
83         // create one or several fcurves depending on the number of parameters being animated
84         void animation_to_fcurves(COLLADAFW::AnimationCurve *curve);
85
86         void fcurve_deg_to_rad(FCurve *cu);
87
88         void add_fcurves_to_object(Object *ob, std::vector<FCurve*>& curves, char *rna_path, int array_index, Animation *animated);
89         
90         int typeFlag;
91     
92         enum lightAnim
93         {
94 //              INANIMATE = 0,
95                 LIGHT_COLOR     = 2,
96                 LIGHT_FOA = 4,
97                 LIGHT_FOE = 8
98         };
99
100         enum cameraAnim
101         {
102 //              INANIMATE = 0,
103                 CAMERA_XFOV = 2,
104                 CAMERA_XMAG = 4,
105                 CAMERA_ZFAR = 8,
106                 CAMERA_ZNEAR = 16
107         };
108
109         enum matAnim
110         {
111                 MATERIAL_SHININESS = 2,
112                 MATERIAL_SPEC_COLOR = 4
113         };
114         
115         enum AnimationType
116                 {
117                         INANIMATE = 0,
118                         NODE_TRANSFORM = 1,
119                 };
120
121         struct AnimMix
122         {
123                 int transform;
124                 int light;
125                 int camera;
126                 int material;
127                 int texture;
128         };
129 public:
130
131         AnimationImporter(UnitConverter *conv, ArmatureImporter *arm, Scene *scene);
132
133         ~AnimationImporter();
134
135         bool write_animation(const COLLADAFW::Animation* anim);
136         
137         // called on post-process stage after writeVisualScenes
138         bool write_animation_list(const COLLADAFW::AnimationList* animlist);
139
140         void read_node_transform(COLLADAFW::Node *node, Object *ob);
141 #if 0
142         virtual void change_eul_to_quat(Object *ob, bAction *act);
143 #endif
144   
145         void translate_Animations_NEW ( COLLADAFW::Node * Node , 
146                                                                                                    std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
147                                                                                                    std::map<COLLADAFW::UniqueId, Object*>& object_map ,
148                                                                                                    std::map<COLLADAFW::UniqueId, const COLLADAFW::Object*> FW_object_map);
149
150         AnimMix* get_animation_type( const COLLADAFW::Node * node , std::map<COLLADAFW::UniqueId,const COLLADAFW::Object*> FW_object_map ) ;
151
152
153         void Assign_transform_animations(COLLADAFW::Transformation* transform , 
154                                                                          const COLLADAFW::AnimationList::AnimationBinding * binding,
155                                                                          std::vector<FCurve*>* curves, bool is_joint, char * joint_path);
156
157         void Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves ,char * anim_type);
158         void Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, char * anim_type);
159     
160         int setAnimType ( const COLLADAFW::Animatable * prop , int type, int addition);
161         
162         void modify_fcurve(std::vector<FCurve*>* curves , char* rna_path , int array_index );
163         // prerequisites:
164         // animlist_map - map animlist id -> animlist
165         // curve_map - map anim id -> curve(s)
166         Object * translate_animation(COLLADAFW::Node *node,
167                                                                 std::map<COLLADAFW::UniqueId, Object*>& object_map,
168                                                                 std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
169                                                                 COLLADAFW::Transformation::TransformationType tm_type,
170                                                                 Object *par_job = NULL);
171         
172         void find_frames( std::vector<float>* frames , std::vector<FCurve*>* curves );
173         void find_frames_old( std::vector<float>* frames, COLLADAFW::Node * node, COLLADAFW::Transformation::TransformationType tm_type );
174         // internal, better make it private
175         // warning: evaluates only rotation
176         // prerequisites: animlist_map, curve_map
177         void evaluate_transform_at_frame(float mat[4][4], COLLADAFW::Node *node, float fra);
178
179         // return true to indicate that mat contains a sane value
180         bool evaluate_animation(COLLADAFW::Transformation *tm, float mat[4][4], float fra, const char *node_id);
181
182         // gives a world-space mat of joint at rest position
183         void get_joint_rest_mat(float mat[4][4], COLLADAFW::Node *root, COLLADAFW::Node *node);
184
185         // gives a world-space mat, end's mat not included
186         bool calc_joint_parent_mat_rest(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end);
187
188 #ifdef ARMATURE_TEST
189         Object *get_joint_object(COLLADAFW::Node *root, COLLADAFW::Node *node, Object *par_job);
190 #endif
191
192 #if 0
193         // recursively evaluates joint tree until end is found, mat then is world-space matrix of end
194         // mat must be identity on enter, node must be root
195         bool evaluate_joint_world_transform_at_frame(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end, float fra);
196 #endif
197
198         void add_bone_fcurve(Object *ob, COLLADAFW::Node *node, FCurve *fcu);
199
200         void add_bezt(FCurve *fcu, float fra, float value);
201 };
202  
203  #endif