Merging r46111 through r46136 from trunk into soc-2011-tomato
[blender-staging.git] / source / blender / collada / DocumentImporter.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.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file DocumentImporter.h
24  *  \ingroup collada
25  */
26
27 #ifndef __DOCUMENTIMPORTER_H__
28 #define __DOCUMENTIMPORTER_H__
29
30 #include "COLLADAFWIWriter.h"
31 #include "COLLADAFWMaterial.h"
32 #include "COLLADAFWEffect.h"
33 #include "COLLADAFWColor.h"
34 #include "COLLADAFWImage.h"
35 #include "COLLADAFWInstanceGeometry.h"
36 #include "COLLADAFWController.h"
37 #include "COLLADAFWMorphController.h"
38 #include "COLLADAFWSkinController.h"
39 #include "COLLADAFWEffectCommon.h"
40
41
42 #include "BKE_object.h"
43
44 #include "TransformReader.h"
45 #include "AnimationImporter.h"
46 #include "ArmatureImporter.h"
47 #include "MeshImporter.h"
48
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         /** TagsMap typedef for uid_tags_map. */
144         typedef std::map<std::string, ExtraTags*> TagsMap;
145         /** Tags map of unique id as a string and ExtraTags instance. */
146         TagsMap uid_tags_map;
147
148         std::map<COLLADAFW::UniqueId, Image*> uid_image_map;
149         std::map<COLLADAFW::UniqueId, Material*> uid_material_map;
150         std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
151         std::map<COLLADAFW::UniqueId, Camera*> uid_camera_map;
152         std::map<COLLADAFW::UniqueId, Lamp*> uid_lamp_map;
153         std::map<Material*, TexIndexTextureArrayMap> material_texture_mapping_map;
154         std::multimap<COLLADAFW::UniqueId, Object*> object_map;
155         std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> node_map;
156         std::vector<const COLLADAFW::VisualScene*> vscenes;
157         std::vector<Object*> libnode_ob;
158         
159         std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> root_map; // find root joint by child joint uid, for bone tree evaluation during resampling
160         std::map<COLLADAFW::UniqueId, const COLLADAFW::Object*> FW_object_map;
161
162 };
163
164 #endif