Merge branch 'master' into blender2.8
[blender.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 #include "BKE_constraint.h"
44
45 #include "TransformReader.h"
46 #include "AnimationImporter.h"
47 #include "ArmatureImporter.h"
48 #include "ControllerExporter.h"
49 #include "MeshImporter.h"
50 #include "ImportSettings.h"
51
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                 Fetching_Scene_data, /* First pass to collect all data except controller */
61                 Fetching_Controller_data, /* Second pass to collect controller data */
62         };
63         /** Constructor */
64         DocumentImporter(bContext *C, const ImportSettings *import_settings);
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 create_constraints(ExtraTags *et, Object *ob);
77         std::vector<Object *> *write_node(COLLADAFW::Node*, COLLADAFW::Node*, Scene*, Object*, bool);
78         void write_profile_COMMON(COLLADAFW::EffectCommon*, Material*);
79
80         void translate_anim_recursive(COLLADAFW::Node*, COLLADAFW::Node*, Object*);
81
82         /**
83          * This method will be called if an error in the loading process occurred and the loader cannot
84          * continue to load. The writer should undo all operations that have been performed.
85          * \param errorMessage A message containing information about the error that occurred.
86          */
87         void cancel(const COLLADAFW::String& errorMessage);
88
89         /** This is the method called. The writer hast to prepare to receive data.*/
90         void start();
91
92         /** This method is called after the last write* method. No other methods will be called after this.*/
93         void finish();
94
95         bool writeGlobalAsset(const COLLADAFW::FileInfo*);
96         std::string get_import_version(const COLLADAFW::FileInfo *asset);
97
98         bool writeScene(const COLLADAFW::Scene*);
99
100         bool writeVisualScene(const COLLADAFW::VisualScene*);
101
102         bool writeLibraryNodes(const COLLADAFW::LibraryNodes*);
103
104         bool writeAnimation(const COLLADAFW::Animation*);
105
106         bool writeAnimationList(const COLLADAFW::AnimationList*);
107
108 #if OPENCOLLADA_WITH_ANIMATION_CLIP
109         // Please enable this when building with Collada 1.6.65 or newer (also in DocumentImporter.cpp)
110         bool DocumentImporter::writeAnimationClip(const COLLADAFW::AnimationClip *AnimationClip);
111 #endif
112
113         bool writeGeometry(const COLLADAFW::Geometry*);
114
115         bool writeMaterial(const COLLADAFW::Material*);
116
117         bool writeEffect(const COLLADAFW::Effect*);
118
119         bool writeCamera(const COLLADAFW::Camera*);
120
121         bool writeImage(const COLLADAFW::Image*);
122
123         bool writeLight(const COLLADAFW::Light*);
124
125         bool writeSkinControllerData(const COLLADAFW::SkinControllerData*);
126
127         bool writeController(const COLLADAFW::Controller*);
128
129         bool writeFormulas(const COLLADAFW::Formulas*);
130
131         bool writeKinematicsScene(const COLLADAFW::KinematicsScene*);
132
133         /** Add element and data for UniqueId */
134         bool addExtraTags(const COLLADAFW::UniqueId &uid, ExtraTags *extra_tags);
135         /** Get an extisting ExtraTags for uid */
136         ExtraTags* getExtraTags(const COLLADAFW::UniqueId &uid);
137
138         bool is_armature(COLLADAFW::Node * node);
139
140
141
142 private:
143         const ImportSettings *import_settings;
144
145         /** Current import stage we're in. */
146         ImportStage mImportStage;
147
148         bContext *mContext;
149         ViewLayer *view_layer;
150
151         UnitConverter unit_converter;
152         ArmatureImporter armature_importer;
153         MeshImporter mesh_importer;
154         AnimationImporter anim_importer;
155
156         /** TagsMap typedef for uid_tags_map. */
157         typedef std::map<std::string, ExtraTags*> TagsMap;
158         /** Tags map of unique id as a string and ExtraTags instance. */
159         TagsMap uid_tags_map;
160
161         UidImageMap uid_image_map;
162         std::map<COLLADAFW::UniqueId, Material*> uid_material_map;
163         std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
164         std::map<COLLADAFW::UniqueId, Camera*> uid_camera_map;
165         std::map<COLLADAFW::UniqueId, Lamp*> uid_lamp_map;
166         std::map<Material*, TexIndexTextureArrayMap> material_texture_mapping_map;
167         std::multimap<COLLADAFW::UniqueId, Object*> object_map;
168         std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> node_map;
169         std::vector<const COLLADAFW::VisualScene*> vscenes;
170         std::vector<Object*> libnode_ob;
171
172         std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> root_map; // find root joint by child joint uid, for bone tree evaluation during resampling
173         std::map<COLLADAFW::UniqueId, const COLLADAFW::Object*> FW_object_map;
174
175         std::string import_from_version;
176
177         void report_unknown_reference(const COLLADAFW::Node &node, const std::string object_type);
178
179 };
180
181 #endif