1/*
2Open Asset Import Library (assimp)
3----------------------------------------------------------------------
4
5Copyright (c) 2006-2017, assimp team
6
7All rights reserved.
8
9Redistribution and use of this software in source and binary forms,
10with or without modification, are permitted provided that the
11following conditions are met:
12
13* Redistributions of source code must retain the above
14 copyright notice, this list of conditions and the
15 following disclaimer.
16
17* Redistributions in binary form must reproduce the above
18 copyright notice, this list of conditions and the
19 following disclaimer in the documentation and/or other
20 materials provided with the distribution.
21
22* Neither the name of the assimp team, nor the names of its
23 contributors may be used to endorse or promote products
24 derived from this software without specific prior
25 written permission of the assimp team.
26
27THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38
39----------------------------------------------------------------------
40*/
41
42/** @file BlenderLoader.h
43 * @brief Declaration of the Blender 3D (*.blend) importer class.
44 */
45#ifndef INCLUDED_AI_BLEND_LOADER_H
46#define INCLUDED_AI_BLEND_LOADER_H
47
48#include "BaseImporter.h"
49#include "LogAux.h"
50#include <memory>
51
52struct aiNode;
53struct aiMesh;
54struct aiLight;
55struct aiCamera;
56struct aiMaterial;
57
58namespace Assimp {
59
60 // TinyFormatter.h
61 namespace Formatter {
62 template <typename T,typename TR, typename A> class basic_formatter;
63 typedef class basic_formatter< char, std::char_traits<char>, std::allocator<char> > format;
64 }
65
66 // BlenderDNA.h
67 namespace Blender {
68 class FileDatabase;
69 struct ElemBase;
70 }
71
72 // BlenderScene.h
73 namespace Blender {
74 struct Scene;
75 struct Object;
76 struct Mesh;
77 struct Camera;
78 struct Lamp;
79 struct MTex;
80 struct Image;
81 struct Material;
82 }
83
84 // BlenderIntermediate.h
85 namespace Blender {
86 struct ConversionData;
87 template <template <typename,typename> class TCLASS, typename T> struct TempArray;
88 }
89
90 // BlenderModifier.h
91 namespace Blender {
92 class BlenderModifierShowcase;
93 class BlenderModifier;
94 }
95
96
97
98// -------------------------------------------------------------------------------------------
99/** Load blenders official binary format. The actual file structure (the `DNA` how they
100 * call it is outsourced to BlenderDNA.cpp/BlenderDNA.h. This class only performs the
101 * conversion from intermediate format to aiScene. */
102// -------------------------------------------------------------------------------------------
103class BlenderImporter : public BaseImporter, public LogFunctions<BlenderImporter>
104{
105public:
106 BlenderImporter();
107 ~BlenderImporter();
108
109public:
110
111 // --------------------
112 bool CanRead( const std::string& pFile,
113 IOSystem* pIOHandler,
114 bool checkSig
115 ) const;
116
117protected:
118
119 // --------------------
120 const aiImporterDesc* GetInfo () const;
121
122 // --------------------
123 void GetExtensionList(std::set<std::string>& app);
124
125 // --------------------
126 void SetupProperties(const Importer* pImp);
127
128 // --------------------
129 void InternReadFile( const std::string& pFile,
130 aiScene* pScene,
131 IOSystem* pIOHandler
132 );
133
134 // --------------------
135 void ParseBlendFile(Blender::FileDatabase& out,
136 std::shared_ptr<IOStream> stream
137 );
138
139 // --------------------
140 void ExtractScene(Blender::Scene& out,
141 const Blender::FileDatabase& file
142 );
143
144 // --------------------
145 void ConvertBlendFile(aiScene* out,
146 const Blender::Scene& in,
147 const Blender::FileDatabase& file
148 );
149
150private:
151
152 // --------------------
153 aiNode* ConvertNode(const Blender::Scene& in,
154 const Blender::Object* obj,
155 Blender::ConversionData& conv_info,
156 const aiMatrix4x4& parentTransform
157 );
158
159 // --------------------
160 void ConvertMesh(const Blender::Scene& in,
161 const Blender::Object* obj,
162 const Blender::Mesh* mesh,
163 Blender::ConversionData& conv_data,
164 Blender::TempArray<std::vector,aiMesh>& temp
165 );
166
167 // --------------------
168 aiLight* ConvertLight(const Blender::Scene& in,
169 const Blender::Object* obj,
170 const Blender::Lamp* mesh,
171 Blender::ConversionData& conv_data
172 );
173
174 // --------------------
175 aiCamera* ConvertCamera(const Blender::Scene& in,
176 const Blender::Object* obj,
177 const Blender::Camera* mesh,
178 Blender::ConversionData& conv_data
179 );
180
181 // --------------------
182 void BuildDefaultMaterial(
183 Blender::ConversionData& conv_data
184 );
185
186 void AddBlendParams(
187 aiMaterial* result,
188 const Blender::Material* source
189 );
190
191 void BuildMaterials(
192 Blender::ConversionData& conv_data
193 );
194
195 // --------------------
196 void ResolveTexture(
197 aiMaterial* out,
198 const Blender::Material* mat,
199 const Blender::MTex* tex,
200 Blender::ConversionData& conv_data
201 );
202
203 // --------------------
204 void ResolveImage(
205 aiMaterial* out,
206 const Blender::Material* mat,
207 const Blender::MTex* tex,
208 const Blender::Image* img,
209 Blender::ConversionData& conv_data
210 );
211
212 void AddSentinelTexture(
213 aiMaterial* out,
214 const Blender::Material* mat,
215 const Blender::MTex* tex,
216 Blender::ConversionData& conv_data
217 );
218
219private: // static stuff, mostly logging and error reporting.
220
221 // --------------------
222 static void CheckActualType(const Blender::ElemBase* dt,
223 const char* check
224 );
225
226 // --------------------
227 static void NotSupportedObjectType(const Blender::Object* obj,
228 const char* type
229 );
230
231
232private:
233
234 Blender::BlenderModifierShowcase* modifier_cache;
235
236}; // !class BlenderImporter
237
238} // end of namespace Assimp
239#endif // AI_UNREALIMPORTER_H_INC
240

source code of qt3d/src/3rdparty/assimp/code/BlenderLoader.h