Merging with trunk up to r38631.
[blender.git] / source / blender / collada / ArmatureImporter.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 ArmatureImporter.h
26  *  \ingroup collada
27  */
28
29 #ifndef __BC_ARMATUREIMPORTER_H__
30 #define __BC_ARMATUREIMPORTER_H__
31
32 #include "COLLADAFWNode.h"
33 #include "COLLADAFWUniqueId.h"
34
35 extern "C" {
36 #include "BKE_context.h"
37
38 #include "DNA_armature_types.h"
39 #include "DNA_object_types.h"
40 #include "DNA_scene_types.h"
41
42 #include "ED_armature.h"
43 }
44
45 #include "AnimationImporter.h"
46 #include "MeshImporter.h"
47 #include "SkinInfo.h"
48 #include "TransformReader.h"
49
50 #include <map>
51 #include <vector>
52
53 #include "collada_internal.h"
54 #include "collada_utils.h"
55
56 class ArmatureImporter : private TransformReader
57 {
58 private:
59         Scene *scene;
60         UnitConverter *unit_converter;
61
62         // std::map<int, JointData> joint_index_to_joint_info_map;
63         // std::map<COLLADAFW::UniqueId, int> joint_id_to_joint_index_map;
64
65         struct LeafBone {
66                 // COLLADAFW::Node *node;
67                 EditBone *bone;
68                 char name[32];
69                 float mat[4][4]; // bone matrix, derived from inv_bind_mat
70         };
71         std::vector<LeafBone> leaf_bones;
72         // int bone_direction_row; // XXX not used
73         float leaf_bone_length;
74         int totbone;
75         // XXX not used
76         // float min_angle; // minimum angle between bone head-tail and a row of bone matrix
77
78 #if 0
79         struct ArmatureJoints {
80                 Object *ob_arm;
81                 std::vector<COLLADAFW::Node*> root_joints;
82         };
83         std::vector<ArmatureJoints> armature_joints;
84 #endif
85
86         Object *empty; // empty for leaf bones
87
88         std::map<COLLADAFW::UniqueId, COLLADAFW::UniqueId> geom_uid_by_controller_uid;
89         std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> joint_by_uid; // contains all joints
90         std::vector<COLLADAFW::Node*> root_joints;
91         std::map<COLLADAFW::UniqueId, Object*> joint_parent_map;
92         std::map<COLLADAFW::UniqueId, Object*> unskinned_armature_map;
93
94         MeshImporterBase *mesh_importer;
95         AnimationImporterBase *anim_importer;
96
97         // This is used to store data passed in write_controller_data.
98         // Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
99         // so that arrays don't get freed until we free them explicitly.
100
101         std::map<COLLADAFW::UniqueId, SkinInfo> skin_by_data_uid; // data UID = skin controller data UID
102 #if 0
103         JointData *get_joint_data(COLLADAFW::Node *node);
104 #endif
105
106         void create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBone *parent, int totchild,
107                                          float parent_mat[][4], bArmature *arm);
108
109         void create_unskinned_bone(COLLADAFW::Node *node, EditBone *parent, int totchild,
110                                  float parent_mat[][4], Object * ob_arm);
111
112         void add_leaf_bone(float mat[][4], EditBone *bone);
113
114         void fix_leaf_bones();
115         
116     void set_pose ( Object * ob_arm ,  COLLADAFW::Node * root_node ,char * parentname, float parent_mat[][4]);
117
118
119 #if 0
120         void set_leaf_bone_shapes(Object *ob_arm);
121         void set_euler_rotmode();
122 #endif
123
124         Object *get_empty_for_leaves();
125
126 #if 0
127         Object *find_armature(COLLADAFW::Node *node);
128
129         ArmatureJoints& get_armature_joints(Object *ob_arm);
130 #endif
131
132         void create_armature_bones(SkinInfo& skin);
133         void create_armature_bones( );
134
135 public:
136
137         ArmatureImporter(UnitConverter *conv, MeshImporterBase *mesh, AnimationImporterBase *anim, Scene *sce);
138         ~ArmatureImporter();
139
140         // root - if this joint is the top joint in hierarchy, if a joint
141         // is a child of a node (not joint), root should be true since
142         // this is where we build armature bones from
143         void add_joint(COLLADAFW::Node *node, bool root, Object *parent, Scene *sce);
144
145 #if 0
146         void add_root_joint(COLLADAFW::Node *node);
147 #endif
148
149         // here we add bones to armatures, having armatures previously created in write_controller
150         void make_armatures(bContext *C);
151
152 #if 0
153         // link with meshes, create vertex groups, assign weights
154         void link_armature(Object *ob_arm, const COLLADAFW::UniqueId& geom_id, const COLLADAFW::UniqueId& controller_data_id);
155 #endif
156
157         bool write_skin_controller_data(const COLLADAFW::SkinControllerData* data);
158
159         bool write_controller(const COLLADAFW::Controller* controller);
160
161         COLLADAFW::UniqueId *get_geometry_uid(const COLLADAFW::UniqueId& controller_uid);
162         
163         Object *get_armature_for_joint(COLLADAFW::Node *node);
164
165         void get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t count);
166         
167         // gives a world-space mat
168         bool get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint);
169
170         
171 };
172
173 #endif