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: /** @file XGLLoader.h nuclear@0: * @brief Declaration of the .xgl/.zgl nuclear@0: */ nuclear@0: #ifndef AI_XGLLOADER_H_INCLUDED nuclear@0: #define AI_XGLLOADER_H_INCLUDED nuclear@0: nuclear@0: #include "BaseImporter.h" nuclear@0: #include "irrXMLWrapper.h" nuclear@0: #include "LogAux.h" nuclear@0: nuclear@0: namespace Assimp { nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: /** XGL/ZGL importer. nuclear@0: * nuclear@0: * Spec: http://vizstream.aveva.com/release/vsplatform/XGLSpec.htm nuclear@0: */ nuclear@0: class XGLImporter : public BaseImporter, public LogFunctions nuclear@0: { nuclear@0: public: nuclear@0: nuclear@0: XGLImporter(); nuclear@0: ~XGLImporter(); nuclear@0: nuclear@0: nuclear@0: public: nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: /** Returns whether the class can handle the format of the given file. nuclear@0: * See BaseImporter::CanRead() for details. */ nuclear@0: bool CanRead( const std::string& pFile, IOSystem* pIOHandler, nuclear@0: bool checkSig) const; nuclear@0: nuclear@0: protected: nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: /** Return importer meta information. nuclear@0: * See #BaseImporter::GetInfo for the details */ nuclear@0: const aiImporterDesc* GetInfo () const; nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: /** Imports the given file into the given scene structure. nuclear@0: * See BaseImporter::InternReadFile() for details */ nuclear@0: void InternReadFile( const std::string& pFile, aiScene* pScene, nuclear@0: IOSystem* pIOHandler); nuclear@0: nuclear@0: private: nuclear@0: nuclear@0: struct TempScope nuclear@0: { nuclear@0: TempScope() nuclear@0: : light() nuclear@0: {} nuclear@0: nuclear@0: ~TempScope() nuclear@0: { nuclear@0: BOOST_FOREACH(aiMesh* m, meshes_linear) { nuclear@0: delete m; nuclear@0: } nuclear@0: nuclear@0: BOOST_FOREACH(aiMaterial* m, materials_linear) { nuclear@0: delete m; nuclear@0: } nuclear@0: nuclear@0: delete light; nuclear@0: } nuclear@0: nuclear@0: void dismiss() { nuclear@0: light = NULL; nuclear@0: meshes_linear.clear(); nuclear@0: materials_linear.clear(); nuclear@0: meshes.clear(); nuclear@0: materials.clear(); nuclear@0: } nuclear@0: nuclear@0: std::multimap meshes; nuclear@0: std::map materials; nuclear@0: nuclear@0: std::vector meshes_linear; nuclear@0: std::vector materials_linear; nuclear@0: nuclear@0: aiLight* light; nuclear@0: }; nuclear@0: nuclear@0: struct TempMesh nuclear@0: { nuclear@0: std::map points; nuclear@0: std::map normals; nuclear@0: std::map uvs; nuclear@0: }; nuclear@0: nuclear@0: struct TempMaterialMesh nuclear@0: { nuclear@0: TempMaterialMesh() nuclear@0: : pflags() nuclear@0: , matid() nuclear@0: {} nuclear@0: nuclear@0: std::vector positions, normals; nuclear@0: std::vector uvs; nuclear@0: nuclear@0: std::vector vcounts; nuclear@0: unsigned int pflags; nuclear@0: unsigned int matid; nuclear@0: }; nuclear@0: nuclear@0: struct TempFace nuclear@0: { nuclear@0: TempFace() nuclear@0: : has_uv() nuclear@0: , has_normal() nuclear@0: {} nuclear@0: nuclear@0: aiVector3D pos; nuclear@0: aiVector3D normal; nuclear@0: aiVector2D uv; nuclear@0: bool has_uv; nuclear@0: bool has_normal; nuclear@0: }; nuclear@0: nuclear@0: private: nuclear@0: nuclear@0: void Cleanup(); nuclear@0: nuclear@0: std::string GetElementName(); nuclear@0: bool ReadElement(); nuclear@0: bool ReadElementUpToClosing(const char* closetag); nuclear@0: bool SkipToText(); nuclear@0: unsigned int ReadIDAttr(); nuclear@0: nuclear@0: void ReadWorld(TempScope& scope); nuclear@0: void ReadLighting(TempScope& scope); nuclear@0: aiLight* ReadDirectionalLight(); nuclear@0: aiNode* ReadObject(TempScope& scope,bool skipFirst = false,const char* closetag = "object"); nuclear@0: bool ReadMesh(TempScope& scope); nuclear@0: void ReadMaterial(TempScope& scope); nuclear@0: aiVector2D ReadVec2(); nuclear@0: aiVector3D ReadVec3(); nuclear@0: aiColor3D ReadCol3(); nuclear@0: aiMatrix4x4 ReadTrafo(); nuclear@0: unsigned int ReadIndexFromText(); nuclear@0: float ReadFloat(); nuclear@0: nuclear@0: aiMesh* ToOutputMesh(const TempMaterialMesh& m); nuclear@0: void ReadFaceVertex(const TempMesh& t, TempFace& out); nuclear@0: unsigned int ResolveMaterialRef(TempScope& scope); nuclear@0: nuclear@0: private: nuclear@0: nuclear@0: nuclear@0: private: nuclear@0: nuclear@0: irr::io::IrrXMLReader* reader; nuclear@0: aiScene* scene; nuclear@0: }; nuclear@0: nuclear@0: } // end of namespace Assimp nuclear@0: nuclear@0: #endif // AI_IRRMESHIMPORTER_H_INC