vrshoot

annotate libs/assimp/ObjFileData.h @ 0:b2f14e535253

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 01 Feb 2014 19:58:19 +0200
parents
children
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