nuclear@0: /* nuclear@0: Open Asset Import Library (assimp) nuclear@0: ---------------------------------------------------------------------- nuclear@0: nuclear@0: Copyright (c) 2006-2012, assimp team nuclear@0: All rights reserved. nuclear@0: nuclear@0: Redistribution and use of this software in source and binary forms, nuclear@0: with or without modification, are permitted provided that the nuclear@0: following conditions are met: nuclear@0: nuclear@0: * Redistributions of source code must retain the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer. nuclear@0: nuclear@0: * Redistributions in binary form must reproduce the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer in the documentation and/or other nuclear@0: materials provided with the distribution. nuclear@0: nuclear@0: * Neither the name of the assimp team, nor the names of its nuclear@0: contributors may be used to endorse or promote products nuclear@0: derived from this software without specific prior nuclear@0: written permission of the assimp team. nuclear@0: nuclear@0: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS nuclear@0: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT nuclear@0: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR nuclear@0: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT nuclear@0: OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, nuclear@0: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT nuclear@0: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, nuclear@0: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY nuclear@0: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT nuclear@0: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE nuclear@0: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. nuclear@0: nuclear@0: ---------------------------------------------------------------------- nuclear@0: */ nuclear@0: nuclear@0: #ifndef OBJ_FILEDATA_H_INC nuclear@0: #define OBJ_FILEDATA_H_INC nuclear@0: nuclear@0: #include nuclear@0: #include nuclear@0: #include "assimp/types.h" nuclear@0: #include "assimp/mesh.h" nuclear@0: nuclear@0: namespace Assimp nuclear@0: { nuclear@0: nuclear@0: namespace ObjFile nuclear@0: { nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: struct Object; nuclear@0: struct Face; nuclear@0: struct Material; nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: //! \struct Face nuclear@0: //! \brief Data structure for a simple obj-face, describes discredit,l.ation and materials nuclear@0: struct Face nuclear@0: { nuclear@0: typedef std::vector IndexArray; nuclear@0: nuclear@0: //! Primitive type nuclear@0: aiPrimitiveType m_PrimitiveType; nuclear@0: //! Vertex indices nuclear@0: IndexArray *m_pVertices; nuclear@0: //! Normal indices nuclear@0: IndexArray *m_pNormals; nuclear@0: //! Texture coordinates indices nuclear@0: IndexArray *m_pTexturCoords; nuclear@0: //! Pointer to assigned material nuclear@0: Material *m_pMaterial; nuclear@0: nuclear@0: //! \brief Default constructor nuclear@0: //! \param pVertices Pointer to assigned vertex indexbuffer nuclear@0: //! \param pNormals Pointer to assigned normals indexbuffer nuclear@0: //! \param pTexCoords Pointer to assigned texture indexbuffer nuclear@0: Face( std::vector *pVertices, nuclear@0: std::vector *pNormals, nuclear@0: std::vector *pTexCoords, nuclear@0: aiPrimitiveType pt = aiPrimitiveType_POLYGON) : nuclear@0: m_PrimitiveType( pt ), nuclear@0: m_pVertices( pVertices ), nuclear@0: m_pNormals( pNormals ), nuclear@0: m_pTexturCoords( pTexCoords ), nuclear@0: m_pMaterial( 0L ) nuclear@0: { nuclear@0: // empty nuclear@0: } nuclear@0: nuclear@0: //! \brief Destructor nuclear@0: ~Face() nuclear@0: { nuclear@0: delete m_pVertices; nuclear@0: m_pVertices = NULL; nuclear@0: nuclear@0: delete m_pNormals; nuclear@0: m_pNormals = NULL; nuclear@0: nuclear@0: delete m_pTexturCoords; nuclear@0: m_pTexturCoords = NULL; nuclear@0: } nuclear@0: }; nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: //! \struct Object nuclear@0: //! \brief Stores all objects of an objfile object definition nuclear@0: struct Object nuclear@0: { nuclear@0: enum ObjectType nuclear@0: { nuclear@0: ObjType, nuclear@0: GroupType nuclear@0: }; nuclear@0: nuclear@0: //! Object name nuclear@0: std::string m_strObjName; nuclear@0: //! Transformation matrix, stored in OpenGL format nuclear@0: aiMatrix4x4 m_Transformation; nuclear@0: //! All sub-objects referenced by this object nuclear@0: std::vector m_SubObjects; nuclear@0: /// Assigned meshes nuclear@0: std::vector m_Meshes; nuclear@0: nuclear@0: //! \brief Default constructor nuclear@0: Object() : nuclear@0: m_strObjName("") nuclear@0: { nuclear@0: // empty nuclear@0: } nuclear@0: nuclear@0: //! \brief Destructor nuclear@0: ~Object() nuclear@0: { nuclear@0: for (std::vector::iterator it = m_SubObjects.begin(); nuclear@0: it != m_SubObjects.end(); ++it) nuclear@0: { nuclear@0: delete *it; nuclear@0: } nuclear@0: m_SubObjects.clear(); nuclear@0: } nuclear@0: }; nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: //! \struct Material nuclear@0: //! \brief Data structure to store all material specific data nuclear@0: struct Material nuclear@0: { nuclear@0: //! Name of material description nuclear@0: aiString MaterialName; nuclear@0: nuclear@0: //! Texture names nuclear@0: aiString texture; nuclear@0: aiString textureSpecular; nuclear@0: aiString textureAmbient; nuclear@0: aiString textureBump; nuclear@0: aiString textureNormal; nuclear@0: aiString textureSpecularity; nuclear@0: aiString textureOpacity; nuclear@0: aiString textureDisp; nuclear@0: nuclear@0: //! Ambient color nuclear@0: aiColor3D ambient; nuclear@0: //! Diffuse color nuclear@0: aiColor3D diffuse; nuclear@0: //! Specular color nuclear@0: aiColor3D specular; nuclear@0: //! Alpha value nuclear@0: float alpha; nuclear@0: //! Shineness factor nuclear@0: float shineness; nuclear@0: //! Illumination model nuclear@0: int illumination_model; nuclear@0: //! Index of refraction nuclear@0: float ior; nuclear@0: nuclear@0: //! Constructor nuclear@0: Material() nuclear@0: : diffuse (0.6f,0.6f,0.6f) nuclear@0: , alpha (1.f) nuclear@0: , shineness (0.0f) nuclear@0: , illumination_model (1) nuclear@0: , ior (1.f) nuclear@0: { nuclear@0: // empty nuclear@0: } nuclear@0: nuclear@0: // Destructor nuclear@0: ~Material() nuclear@0: { nuclear@0: // empty nuclear@0: } nuclear@0: }; nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: //! \struct Mesh nuclear@0: //! \brief Data structure to store a mesh nuclear@0: struct Mesh nuclear@0: { nuclear@0: static const unsigned int NoMaterial = ~0u; nuclear@0: nuclear@0: /// Array with pointer to all stored faces nuclear@0: std::vector m_Faces; nuclear@0: /// Assigned material nuclear@0: Material *m_pMaterial; nuclear@0: /// Number of stored indices. nuclear@0: unsigned int m_uiNumIndices; nuclear@0: /// Number of UV nuclear@0: unsigned int m_uiUVCoordinates[ AI_MAX_NUMBER_OF_TEXTURECOORDS ]; nuclear@0: /// Material index. nuclear@0: unsigned int m_uiMaterialIndex; nuclear@0: /// True, if normals are stored. nuclear@0: bool m_hasNormals; nuclear@0: /// Constructor nuclear@0: Mesh() : nuclear@0: m_pMaterial(NULL), nuclear@0: m_uiNumIndices(0), nuclear@0: m_uiMaterialIndex( NoMaterial ), nuclear@0: m_hasNormals(false) nuclear@0: { nuclear@0: memset(m_uiUVCoordinates, 0, sizeof( unsigned int ) * AI_MAX_NUMBER_OF_TEXTURECOORDS); nuclear@0: } nuclear@0: nuclear@0: /// Destructor nuclear@0: ~Mesh() nuclear@0: { nuclear@0: for (std::vector::iterator it = m_Faces.begin(); nuclear@0: it != m_Faces.end(); ++it) nuclear@0: { nuclear@0: delete *it; nuclear@0: } nuclear@0: } nuclear@0: }; nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: //! \struct Model nuclear@0: //! \brief Data structure to store all obj-specific model datas nuclear@0: struct Model nuclear@0: { nuclear@0: typedef std::map* > GroupMap; nuclear@0: typedef std::map* >::iterator GroupMapIt; nuclear@0: typedef std::map* >::const_iterator ConstGroupMapIt; nuclear@0: nuclear@0: //! Model name nuclear@0: std::string m_ModelName; nuclear@0: //! List ob assigned objects nuclear@0: std::vector m_Objects; nuclear@0: //! Pointer to current object nuclear@0: ObjFile::Object *m_pCurrent; nuclear@0: //! Pointer to current material nuclear@0: ObjFile::Material *m_pCurrentMaterial; nuclear@0: //! Pointer to default material nuclear@0: ObjFile::Material *m_pDefaultMaterial; nuclear@0: //! Vector with all generated materials nuclear@0: std::vector m_MaterialLib; nuclear@0: //! Vector with all generated group nuclear@0: std::vector m_GroupLib; nuclear@0: //! Vector with all generated vertices nuclear@0: std::vector m_Vertices; nuclear@0: //! vector with all generated normals nuclear@0: std::vector m_Normals; nuclear@0: //! Group map nuclear@0: GroupMap m_Groups; nuclear@0: //! Group to face id assignment nuclear@0: std::vector *m_pGroupFaceIDs; nuclear@0: //! Active group nuclear@0: std::string m_strActiveGroup; nuclear@0: //! Vector with generated texture coordinates nuclear@0: std::vector m_TextureCoord; nuclear@0: //! Current mesh instance nuclear@0: Mesh *m_pCurrentMesh; nuclear@0: //! Vector with stored meshes nuclear@0: std::vector m_Meshes; nuclear@0: //! Material map nuclear@0: std::map m_MaterialMap; nuclear@0: nuclear@0: //! \brief Default constructor nuclear@0: Model() : nuclear@0: m_ModelName(""), nuclear@0: m_pCurrent(NULL), nuclear@0: m_pCurrentMaterial(NULL), nuclear@0: m_pDefaultMaterial(NULL), nuclear@0: m_pGroupFaceIDs(NULL), nuclear@0: m_strActiveGroup(""), nuclear@0: m_pCurrentMesh(NULL) nuclear@0: { nuclear@0: // empty nuclear@0: } nuclear@0: nuclear@0: //! \brief Destructor nuclear@0: ~Model() nuclear@0: { nuclear@0: // Clear all stored object instances nuclear@0: for (std::vector::iterator it = m_Objects.begin(); nuclear@0: it != m_Objects.end(); ++it) { nuclear@0: delete *it; nuclear@0: } nuclear@0: m_Objects.clear(); nuclear@0: nuclear@0: // Clear all stored mesh instances nuclear@0: for (std::vector::iterator it = m_Meshes.begin(); nuclear@0: it != m_Meshes.end(); ++it) { nuclear@0: delete *it; nuclear@0: } nuclear@0: m_Meshes.clear(); nuclear@0: nuclear@0: for(GroupMapIt it = m_Groups.begin(); it != m_Groups.end(); ++it) { nuclear@0: delete it->second; nuclear@0: } nuclear@0: m_Groups.clear(); nuclear@0: nuclear@0: for ( std::map::iterator it = m_MaterialMap.begin(); it != m_MaterialMap.end(); ++it ) { nuclear@0: delete it->second; nuclear@0: } nuclear@0: } nuclear@0: }; nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: nuclear@0: } // Namespace ObjFile nuclear@0: } // Namespace Assimp nuclear@0: nuclear@0: #endif