Add ExtraTags class for handling tags inside an extra block.
[blender.git] / source / blender / collada / DocumentImporter.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.
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /** \file DocumentImporter.h
26  *  \ingroup collada
27  */
28
29 #ifndef __DOCUMENTIMPORTER_H__
30 #define __DOCUMENTIMPORTER_H__
31
32 #include "COLLADAFWIWriter.h"
33 #include "COLLADAFWMaterial.h"
34 #include "COLLADAFWEffect.h"
35 #include "COLLADAFWColor.h"
36 #include "COLLADAFWImage.h"
37 #include "COLLADAFWInstanceGeometry.h"
38 #include "COLLADAFWController.h"
39 #include "COLLADAFWMorphController.h"
40 #include "COLLADAFWSkinController.h"
41
42 #include "BKE_object.h"
43
44 #include "TransformReader.h"
45 #include "AnimationImporter.h"
46 #include "ArmatureImporter.h"
47 #include "MeshImporter.h"
48 #include "ExtraTags.h"
49
50
51 struct Main;
52 struct bContext;
53
54 /** Importer class. */
55 class DocumentImporter : COLLADAFW::IWriter
56 {
57 public:
58         //! Enumeration to denote the stage of import
59         enum ImportStage {
60                 General,                //!< First pass to collect all data except controller
61                 Controller,             //!< Second pass to collect controller data
62         };
63         /** Constructor */
64         DocumentImporter(bContext *C, const char *filename);
65
66         /** Destructor */
67         ~DocumentImporter();
68
69         /** Function called by blender UI */
70         bool import();
71
72         /** these should not be here */
73         Object* create_camera_object(COLLADAFW::InstanceCamera*, Scene*);
74         Object* create_lamp_object(COLLADAFW::InstanceLight*, Scene*);
75         Object* create_instance_node(Object*, COLLADAFW::Node*, COLLADAFW::Node*, Scene*, bool);
76         void write_node(COLLADAFW::Node*, COLLADAFW::Node*, Scene*, Object*, bool);
77         MTex* create_texture(COLLADAFW::EffectCommon*, COLLADAFW::Texture&, Material*, int, TexIndexTextureArrayMap&);
78         void write_profile_COMMON(COLLADAFW::EffectCommon*, Material*);
79         void translate_anim_recursive(COLLADAFW::Node*, COLLADAFW::Node*, Object*);
80
81         /** This method will be called if an error in the loading process occurred and the loader cannot
82         continue to load. The writer should undo all operations that have been performed.
83         @param errorMessage A message containing informations about the error that occurred.
84         */
85         void cancel(const COLLADAFW::String& errorMessage);
86
87         /** This is the method called. The writer hast to prepare to receive data.*/
88         void start();
89
90         /** This method is called after the last write* method. No other methods will be called after this.*/
91         void finish();
92
93         bool writeGlobalAsset(const COLLADAFW::FileInfo*);
94
95         bool writeScene(const COLLADAFW::Scene*);
96
97         bool writeVisualScene(const COLLADAFW::VisualScene*);
98
99         bool writeLibraryNodes(const COLLADAFW::LibraryNodes*);
100
101         bool writeAnimation(const COLLADAFW::Animation*);
102
103         bool writeAnimationList(const COLLADAFW::AnimationList*);
104
105         bool writeGeometry(const COLLADAFW::Geometry*);
106
107         bool writeMaterial(const COLLADAFW::Material*);
108
109         bool writeEffect(const COLLADAFW::Effect*);
110
111         bool writeCamera(const COLLADAFW::Camera*);
112
113         bool writeImage(const COLLADAFW::Image*);
114
115         bool writeLight(const COLLADAFW::Light*);
116
117         bool writeSkinControllerData(const COLLADAFW::SkinControllerData*);
118
119         bool writeController(const COLLADAFW::Controller*);
120
121         bool writeFormulas(const COLLADAFW::Formulas*);
122
123         bool writeKinematicsScene(const COLLADAFW::KinematicsScene*);
124
125         /** Add element and data for UniqueId */
126         bool addExtraTags(const COLLADAFW::UniqueId &uid, ExtraTags *extra_tags);
127         /** Get an extisting ExtraTags for uid */
128         ExtraTags* getExtraTags(const COLLADAFW::UniqueId &uid);
129
130 private:
131
132         /** Current import stage we're in. */
133         ImportStage mImportStage;
134         std::string mFilename;
135
136         bContext *mContext;
137
138         UnitConverter unit_converter;
139         ArmatureImporter armature_importer;
140         MeshImporter mesh_importer;
141         AnimationImporter anim_importer;
142
143         std::map<COLLADAFW::UniqueId, Image*> uid_image_map;
144         std::map<COLLADAFW::UniqueId, Material*> uid_material_map;
145         std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
146         std::map<COLLADAFW::UniqueId, Camera*> uid_camera_map;
147         std::map<COLLADAFW::UniqueId, Lamp*> uid_lamp_map;
148         std::map<COLLADAFW::UniqueId, ExtraTags*> uid_tags_map;
149         std::map<Material*, TexIndexTextureArrayMap> material_texture_mapping_map;
150         std::map<COLLADAFW::UniqueId, Object*> object_map;
151         std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> node_map;
152         std::vector<const COLLADAFW::VisualScene*> vscenes;
153         std::vector<Object*> libnode_ob;
154
155         std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> root_map; // find root joint by child joint uid, for bone tree evaluation during resampling
156
157 };
158
159 #endif