b07edfbf34d8f8f51505c6292cb8eebb2d8c8618
[blender.git] / source / blender / collada / ArmatureImporter.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file ArmatureImporter.h
24  *  \ingroup collada
25  */
26
27 #ifndef __ARMATUREIMPORTER_H__
28 #define __ARMATUREIMPORTER_H__
29
30 #include "COLLADAFWNode.h"
31 #include "COLLADAFWUniqueId.h"
32 #include "COLLADAFWMorphController.h"
33
34 extern "C" {
35 #include "BKE_context.h"
36 #include "BKE_key.h"
37
38 #include "DNA_armature_types.h"
39 #include "DNA_object_types.h"
40 #include "DNA_scene_types.h"
41 #include "DNA_key_types.h"
42
43 #include "ED_armature.h"
44 }
45
46 #include "AnimationImporter.h"
47 #include "MeshImporter.h"
48 #include "SkinInfo.h"
49 #include "TransformReader.h"
50 #include "ExtraTags.h"
51
52 #include <map>
53 #include <vector>
54
55 #include "collada_internal.h"
56 #include "collada_utils.h"
57
58 class ArmatureImporter : private TransformReader
59 {
60 private:
61         Scene *scene;
62         UnitConverter *unit_converter;
63
64         // std::map<int, JointData> joint_index_to_joint_info_map;
65         // std::map<COLLADAFW::UniqueId, int> joint_id_to_joint_index_map;
66
67         struct LeafBone {
68                 // COLLADAFW::Node *node;
69                 EditBone *bone;
70                 char name[32];
71                 float mat[4][4]; // bone matrix, derived from inv_bind_mat
72         };
73         std::vector<LeafBone> leaf_bones;
74         // int bone_direction_row; // XXX not used
75         float leaf_bone_length;
76         int totbone;
77         // XXX not used
78         // float min_angle; // minimum angle between bone head-tail and a row of bone matrix
79
80 #if 0
81         struct ArmatureJoints {
82                 Object *ob_arm;
83                 std::vector<COLLADAFW::Node*> root_joints;
84         };
85         std::vector<ArmatureJoints> armature_joints;
86 #endif
87
88         Object *empty; // empty for leaf bones
89
90         std::map<COLLADAFW::UniqueId, COLLADAFW::UniqueId> geom_uid_by_controller_uid;
91         std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> joint_by_uid; // contains all joints
92         std::vector<COLLADAFW::Node*> root_joints;
93         std::vector<COLLADAFW::Node*> finished_joints;
94         std::vector<COLLADAFW::MorphController*> morph_controllers;
95         std::map<COLLADAFW::UniqueId, Object*> joint_parent_map;
96         std::map<COLLADAFW::UniqueId, Object*> unskinned_armature_map;
97
98         MeshImporterBase *mesh_importer;
99         AnimationImporterBase *anim_importer;
100
101         // This is used to store data passed in write_controller_data.
102         // Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
103         // so that arrays don't get freed until we free them explicitly.
104
105         std::map<COLLADAFW::UniqueId, SkinInfo> skin_by_data_uid; // data UID = skin controller data UID
106 #if 0
107         JointData *get_joint_data(COLLADAFW::Node *node);
108 #endif
109
110         void create_bone(SkinInfo* skin, COLLADAFW::Node *node, EditBone *parent, int totchild,
111                          float parent_mat[4][4], bArmature *arm);
112
113         void add_leaf_bone(float mat[4][4], EditBone *bone, COLLADAFW::Node * node);
114
115         void fix_leaf_bones();
116         
117         void set_pose ( Object * ob_arm,  COLLADAFW::Node * root_node, const char *parentname, float parent_mat[4][4]);
118
119
120 #if 0
121         void set_leaf_bone_shapes(Object *ob_arm);
122         void set_euler_rotmode();
123 #endif
124
125         Object *get_empty_for_leaves();
126
127 #if 0
128         Object *find_armature(COLLADAFW::Node *node);
129
130         ArmatureJoints& get_armature_joints(Object *ob_arm);
131 #endif
132
133         void create_armature_bones(SkinInfo& skin);
134         void create_armature_bones( );
135
136         /** TagsMap typedef for uid_tags_map. */
137         typedef std::map<std::string, ExtraTags*> TagsMap;
138         TagsMap uid_tags_map;
139 public:
140
141         ArmatureImporter(UnitConverter *conv, MeshImporterBase *mesh, AnimationImporterBase *anim, Scene *sce);
142         ~ArmatureImporter();
143
144         void add_joint(COLLADAFW::Node *node, bool root, Object *parent, Scene *sce);
145
146 #if 0
147         void add_root_joint(COLLADAFW::Node *node);
148 #endif
149
150         // here we add bones to armatures, having armatures previously created in write_controller
151         void make_armatures(bContext *C);
152
153         void make_shape_keys();
154
155 #if 0
156         // link with meshes, create vertex groups, assign weights
157         void link_armature(Object *ob_arm, const COLLADAFW::UniqueId& geom_id, const COLLADAFW::UniqueId& controller_data_id);
158 #endif
159
160         bool write_skin_controller_data(const COLLADAFW::SkinControllerData* data);
161
162         bool write_controller(const COLLADAFW::Controller* controller);
163
164         COLLADAFW::UniqueId *get_geometry_uid(const COLLADAFW::UniqueId& controller_uid);
165         
166         Object *get_armature_for_joint(COLLADAFW::Node *node);
167
168         void get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t count);
169         
170         // gives a world-space mat
171         bool get_joint_bind_mat(float m[4][4], COLLADAFW::Node *joint);
172
173         void set_tags_map( TagsMap& tags_map);
174         
175 };
176
177 #endif