rev |
line source |
nuclear@0
|
1 /*
|
nuclear@0
|
2 Open Asset Import Library (assimp)
|
nuclear@0
|
3 ----------------------------------------------------------------------
|
nuclear@0
|
4
|
nuclear@0
|
5 Copyright (c) 2006-2012, assimp team
|
nuclear@0
|
6 All rights reserved.
|
nuclear@0
|
7
|
nuclear@0
|
8 Redistribution and use of this software in source and binary forms,
|
nuclear@0
|
9 with or without modification, are permitted provided that the
|
nuclear@0
|
10 following conditions are met:
|
nuclear@0
|
11
|
nuclear@0
|
12 * Redistributions of source code must retain the above
|
nuclear@0
|
13 copyright notice, this list of conditions and the
|
nuclear@0
|
14 following disclaimer.
|
nuclear@0
|
15
|
nuclear@0
|
16 * Redistributions in binary form must reproduce the above
|
nuclear@0
|
17 copyright notice, this list of conditions and the
|
nuclear@0
|
18 following disclaimer in the documentation and/or other
|
nuclear@0
|
19 materials provided with the distribution.
|
nuclear@0
|
20
|
nuclear@0
|
21 * Neither the name of the assimp team, nor the names of its
|
nuclear@0
|
22 contributors may be used to endorse or promote products
|
nuclear@0
|
23 derived from this software without specific prior
|
nuclear@0
|
24 written permission of the assimp team.
|
nuclear@0
|
25
|
nuclear@0
|
26 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
nuclear@0
|
27 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
nuclear@0
|
28 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
nuclear@0
|
29 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
nuclear@0
|
30 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
nuclear@0
|
31 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
nuclear@0
|
32 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
nuclear@0
|
33 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
nuclear@0
|
34 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
nuclear@0
|
35 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
nuclear@0
|
36 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
nuclear@0
|
37
|
nuclear@0
|
38 ----------------------------------------------------------------------
|
nuclear@0
|
39 */
|
nuclear@0
|
40
|
nuclear@0
|
41 #ifndef OBJ_FILEDATA_H_INC
|
nuclear@0
|
42 #define OBJ_FILEDATA_H_INC
|
nuclear@0
|
43
|
nuclear@0
|
44 #include <vector>
|
nuclear@0
|
45 #include <map>
|
nuclear@0
|
46 #include "assimp/types.h"
|
nuclear@0
|
47 #include "assimp/mesh.h"
|
nuclear@0
|
48
|
nuclear@0
|
49 namespace Assimp
|
nuclear@0
|
50 {
|
nuclear@0
|
51
|
nuclear@0
|
52 namespace ObjFile
|
nuclear@0
|
53 {
|
nuclear@0
|
54 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
55 struct Object;
|
nuclear@0
|
56 struct Face;
|
nuclear@0
|
57 struct Material;
|
nuclear@0
|
58
|
nuclear@0
|
59 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
60 //! \struct Face
|
nuclear@0
|
61 //! \brief Data structure for a simple obj-face, describes discredit,l.ation and materials
|
nuclear@0
|
62 struct Face
|
nuclear@0
|
63 {
|
nuclear@0
|
64 typedef std::vector<unsigned int> IndexArray;
|
nuclear@0
|
65
|
nuclear@0
|
66 //! Primitive type
|
nuclear@0
|
67 aiPrimitiveType m_PrimitiveType;
|
nuclear@0
|
68 //! Vertex indices
|
nuclear@0
|
69 IndexArray *m_pVertices;
|
nuclear@0
|
70 //! Normal indices
|
nuclear@0
|
71 IndexArray *m_pNormals;
|
nuclear@0
|
72 //! Texture coordinates indices
|
nuclear@0
|
73 IndexArray *m_pTexturCoords;
|
nuclear@0
|
74 //! Pointer to assigned material
|
nuclear@0
|
75 Material *m_pMaterial;
|
nuclear@0
|
76
|
nuclear@0
|
77 //! \brief Default constructor
|
nuclear@0
|
78 //! \param pVertices Pointer to assigned vertex indexbuffer
|
nuclear@0
|
79 //! \param pNormals Pointer to assigned normals indexbuffer
|
nuclear@0
|
80 //! \param pTexCoords Pointer to assigned texture indexbuffer
|
nuclear@0
|
81 Face( std::vector<unsigned int> *pVertices,
|
nuclear@0
|
82 std::vector<unsigned int> *pNormals,
|
nuclear@0
|
83 std::vector<unsigned int> *pTexCoords,
|
nuclear@0
|
84 aiPrimitiveType pt = aiPrimitiveType_POLYGON) :
|
nuclear@0
|
85 m_PrimitiveType( pt ),
|
nuclear@0
|
86 m_pVertices( pVertices ),
|
nuclear@0
|
87 m_pNormals( pNormals ),
|
nuclear@0
|
88 m_pTexturCoords( pTexCoords ),
|
nuclear@0
|
89 m_pMaterial( 0L )
|
nuclear@0
|
90 {
|
nuclear@0
|
91 // empty
|
nuclear@0
|
92 }
|
nuclear@0
|
93
|
nuclear@0
|
94 //! \brief Destructor
|
nuclear@0
|
95 ~Face()
|
nuclear@0
|
96 {
|
nuclear@0
|
97 delete m_pVertices;
|
nuclear@0
|
98 m_pVertices = NULL;
|
nuclear@0
|
99
|
nuclear@0
|
100 delete m_pNormals;
|
nuclear@0
|
101 m_pNormals = NULL;
|
nuclear@0
|
102
|
nuclear@0
|
103 delete m_pTexturCoords;
|
nuclear@0
|
104 m_pTexturCoords = NULL;
|
nuclear@0
|
105 }
|
nuclear@0
|
106 };
|
nuclear@0
|
107
|
nuclear@0
|
108 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
109 //! \struct Object
|
nuclear@0
|
110 //! \brief Stores all objects of an objfile object definition
|
nuclear@0
|
111 struct Object
|
nuclear@0
|
112 {
|
nuclear@0
|
113 enum ObjectType
|
nuclear@0
|
114 {
|
nuclear@0
|
115 ObjType,
|
nuclear@0
|
116 GroupType
|
nuclear@0
|
117 };
|
nuclear@0
|
118
|
nuclear@0
|
119 //! Object name
|
nuclear@0
|
120 std::string m_strObjName;
|
nuclear@0
|
121 //! Transformation matrix, stored in OpenGL format
|
nuclear@0
|
122 aiMatrix4x4 m_Transformation;
|
nuclear@0
|
123 //! All sub-objects referenced by this object
|
nuclear@0
|
124 std::vector<Object*> m_SubObjects;
|
nuclear@0
|
125 /// Assigned meshes
|
nuclear@0
|
126 std::vector<unsigned int> m_Meshes;
|
nuclear@0
|
127
|
nuclear@0
|
128 //! \brief Default constructor
|
nuclear@0
|
129 Object() :
|
nuclear@0
|
130 m_strObjName("")
|
nuclear@0
|
131 {
|
nuclear@0
|
132 // empty
|
nuclear@0
|
133 }
|
nuclear@0
|
134
|
nuclear@0
|
135 //! \brief Destructor
|
nuclear@0
|
136 ~Object()
|
nuclear@0
|
137 {
|
nuclear@0
|
138 for (std::vector<Object*>::iterator it = m_SubObjects.begin();
|
nuclear@0
|
139 it != m_SubObjects.end(); ++it)
|
nuclear@0
|
140 {
|
nuclear@0
|
141 delete *it;
|
nuclear@0
|
142 }
|
nuclear@0
|
143 m_SubObjects.clear();
|
nuclear@0
|
144 }
|
nuclear@0
|
145 };
|
nuclear@0
|
146
|
nuclear@0
|
147 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
148 //! \struct Material
|
nuclear@0
|
149 //! \brief Data structure to store all material specific data
|
nuclear@0
|
150 struct Material
|
nuclear@0
|
151 {
|
nuclear@0
|
152 //! Name of material description
|
nuclear@0
|
153 aiString MaterialName;
|
nuclear@0
|
154
|
nuclear@0
|
155 //! Texture names
|
nuclear@0
|
156 aiString texture;
|
nuclear@0
|
157 aiString textureSpecular;
|
nuclear@0
|
158 aiString textureAmbient;
|
nuclear@0
|
159 aiString textureBump;
|
nuclear@0
|
160 aiString textureNormal;
|
nuclear@0
|
161 aiString textureSpecularity;
|
nuclear@0
|
162 aiString textureOpacity;
|
nuclear@0
|
163 aiString textureDisp;
|
nuclear@0
|
164
|
nuclear@0
|
165 //! Ambient color
|
nuclear@0
|
166 aiColor3D ambient;
|
nuclear@0
|
167 //! Diffuse color
|
nuclear@0
|
168 aiColor3D diffuse;
|
nuclear@0
|
169 //! Specular color
|
nuclear@0
|
170 aiColor3D specular;
|
nuclear@0
|
171 //! Alpha value
|
nuclear@0
|
172 float alpha;
|
nuclear@0
|
173 //! Shineness factor
|
nuclear@0
|
174 float shineness;
|
nuclear@0
|
175 //! Illumination model
|
nuclear@0
|
176 int illumination_model;
|
nuclear@0
|
177 //! Index of refraction
|
nuclear@0
|
178 float ior;
|
nuclear@0
|
179
|
nuclear@0
|
180 //! Constructor
|
nuclear@0
|
181 Material()
|
nuclear@0
|
182 : diffuse (0.6f,0.6f,0.6f)
|
nuclear@0
|
183 , alpha (1.f)
|
nuclear@0
|
184 , shineness (0.0f)
|
nuclear@0
|
185 , illumination_model (1)
|
nuclear@0
|
186 , ior (1.f)
|
nuclear@0
|
187 {
|
nuclear@0
|
188 // empty
|
nuclear@0
|
189 }
|
nuclear@0
|
190
|
nuclear@0
|
191 // Destructor
|
nuclear@0
|
192 ~Material()
|
nuclear@0
|
193 {
|
nuclear@0
|
194 // empty
|
nuclear@0
|
195 }
|
nuclear@0
|
196 };
|
nuclear@0
|
197
|
nuclear@0
|
198 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
199 //! \struct Mesh
|
nuclear@0
|
200 //! \brief Data structure to store a mesh
|
nuclear@0
|
201 struct Mesh
|
nuclear@0
|
202 {
|
nuclear@0
|
203 static const unsigned int NoMaterial = ~0u;
|
nuclear@0
|
204
|
nuclear@0
|
205 /// Array with pointer to all stored faces
|
nuclear@0
|
206 std::vector<Face*> m_Faces;
|
nuclear@0
|
207 /// Assigned material
|
nuclear@0
|
208 Material *m_pMaterial;
|
nuclear@0
|
209 /// Number of stored indices.
|
nuclear@0
|
210 unsigned int m_uiNumIndices;
|
nuclear@0
|
211 /// Number of UV
|
nuclear@0
|
212 unsigned int m_uiUVCoordinates[ AI_MAX_NUMBER_OF_TEXTURECOORDS ];
|
nuclear@0
|
213 /// Material index.
|
nuclear@0
|
214 unsigned int m_uiMaterialIndex;
|
nuclear@0
|
215 /// True, if normals are stored.
|
nuclear@0
|
216 bool m_hasNormals;
|
nuclear@0
|
217 /// Constructor
|
nuclear@0
|
218 Mesh() :
|
nuclear@0
|
219 m_pMaterial(NULL),
|
nuclear@0
|
220 m_uiNumIndices(0),
|
nuclear@0
|
221 m_uiMaterialIndex( NoMaterial ),
|
nuclear@0
|
222 m_hasNormals(false)
|
nuclear@0
|
223 {
|
nuclear@0
|
224 memset(m_uiUVCoordinates, 0, sizeof( unsigned int ) * AI_MAX_NUMBER_OF_TEXTURECOORDS);
|
nuclear@0
|
225 }
|
nuclear@0
|
226
|
nuclear@0
|
227 /// Destructor
|
nuclear@0
|
228 ~Mesh()
|
nuclear@0
|
229 {
|
nuclear@0
|
230 for (std::vector<Face*>::iterator it = m_Faces.begin();
|
nuclear@0
|
231 it != m_Faces.end(); ++it)
|
nuclear@0
|
232 {
|
nuclear@0
|
233 delete *it;
|
nuclear@0
|
234 }
|
nuclear@0
|
235 }
|
nuclear@0
|
236 };
|
nuclear@0
|
237
|
nuclear@0
|
238 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
239 //! \struct Model
|
nuclear@0
|
240 //! \brief Data structure to store all obj-specific model datas
|
nuclear@0
|
241 struct Model
|
nuclear@0
|
242 {
|
nuclear@0
|
243 typedef std::map<std::string, std::vector<unsigned int>* > GroupMap;
|
nuclear@0
|
244 typedef std::map<std::string, std::vector<unsigned int>* >::iterator GroupMapIt;
|
nuclear@0
|
245 typedef std::map<std::string, std::vector<unsigned int>* >::const_iterator ConstGroupMapIt;
|
nuclear@0
|
246
|
nuclear@0
|
247 //! Model name
|
nuclear@0
|
248 std::string m_ModelName;
|
nuclear@0
|
249 //! List ob assigned objects
|
nuclear@0
|
250 std::vector<Object*> m_Objects;
|
nuclear@0
|
251 //! Pointer to current object
|
nuclear@0
|
252 ObjFile::Object *m_pCurrent;
|
nuclear@0
|
253 //! Pointer to current material
|
nuclear@0
|
254 ObjFile::Material *m_pCurrentMaterial;
|
nuclear@0
|
255 //! Pointer to default material
|
nuclear@0
|
256 ObjFile::Material *m_pDefaultMaterial;
|
nuclear@0
|
257 //! Vector with all generated materials
|
nuclear@0
|
258 std::vector<std::string> m_MaterialLib;
|
nuclear@0
|
259 //! Vector with all generated group
|
nuclear@0
|
260 std::vector<std::string> m_GroupLib;
|
nuclear@0
|
261 //! Vector with all generated vertices
|
nuclear@0
|
262 std::vector<aiVector3D> m_Vertices;
|
nuclear@0
|
263 //! vector with all generated normals
|
nuclear@0
|
264 std::vector<aiVector3D> m_Normals;
|
nuclear@0
|
265 //! Group map
|
nuclear@0
|
266 GroupMap m_Groups;
|
nuclear@0
|
267 //! Group to face id assignment
|
nuclear@0
|
268 std::vector<unsigned int> *m_pGroupFaceIDs;
|
nuclear@0
|
269 //! Active group
|
nuclear@0
|
270 std::string m_strActiveGroup;
|
nuclear@0
|
271 //! Vector with generated texture coordinates
|
nuclear@0
|
272 std::vector<aiVector2D> m_TextureCoord;
|
nuclear@0
|
273 //! Current mesh instance
|
nuclear@0
|
274 Mesh *m_pCurrentMesh;
|
nuclear@0
|
275 //! Vector with stored meshes
|
nuclear@0
|
276 std::vector<Mesh*> m_Meshes;
|
nuclear@0
|
277 //! Material map
|
nuclear@0
|
278 std::map<std::string, Material*> m_MaterialMap;
|
nuclear@0
|
279
|
nuclear@0
|
280 //! \brief Default constructor
|
nuclear@0
|
281 Model() :
|
nuclear@0
|
282 m_ModelName(""),
|
nuclear@0
|
283 m_pCurrent(NULL),
|
nuclear@0
|
284 m_pCurrentMaterial(NULL),
|
nuclear@0
|
285 m_pDefaultMaterial(NULL),
|
nuclear@0
|
286 m_pGroupFaceIDs(NULL),
|
nuclear@0
|
287 m_strActiveGroup(""),
|
nuclear@0
|
288 m_pCurrentMesh(NULL)
|
nuclear@0
|
289 {
|
nuclear@0
|
290 // empty
|
nuclear@0
|
291 }
|
nuclear@0
|
292
|
nuclear@0
|
293 //! \brief Destructor
|
nuclear@0
|
294 ~Model()
|
nuclear@0
|
295 {
|
nuclear@0
|
296 // Clear all stored object instances
|
nuclear@0
|
297 for (std::vector<Object*>::iterator it = m_Objects.begin();
|
nuclear@0
|
298 it != m_Objects.end(); ++it) {
|
nuclear@0
|
299 delete *it;
|
nuclear@0
|
300 }
|
nuclear@0
|
301 m_Objects.clear();
|
nuclear@0
|
302
|
nuclear@0
|
303 // Clear all stored mesh instances
|
nuclear@0
|
304 for (std::vector<Mesh*>::iterator it = m_Meshes.begin();
|
nuclear@0
|
305 it != m_Meshes.end(); ++it) {
|
nuclear@0
|
306 delete *it;
|
nuclear@0
|
307 }
|
nuclear@0
|
308 m_Meshes.clear();
|
nuclear@0
|
309
|
nuclear@0
|
310 for(GroupMapIt it = m_Groups.begin(); it != m_Groups.end(); ++it) {
|
nuclear@0
|
311 delete it->second;
|
nuclear@0
|
312 }
|
nuclear@0
|
313 m_Groups.clear();
|
nuclear@0
|
314
|
nuclear@0
|
315 for ( std::map<std::string, Material*>::iterator it = m_MaterialMap.begin(); it != m_MaterialMap.end(); ++it ) {
|
nuclear@0
|
316 delete it->second;
|
nuclear@0
|
317 }
|
nuclear@0
|
318 }
|
nuclear@0
|
319 };
|
nuclear@0
|
320
|
nuclear@0
|
321 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
322
|
nuclear@0
|
323 } // Namespace ObjFile
|
nuclear@0
|
324 } // Namespace Assimp
|
nuclear@0
|
325
|
nuclear@0
|
326 #endif
|