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