/* model/asefile.h This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #ifndef __INCLUDED_MODEL_ASEFILE_H__ #define __INCLUDED_MODEL_ASEFILE_H__ #include "math/vector3f.h" #include "model/model.h" #include "model/material.h" #include "model/fragment.h" #include "model/triangle.h" #include "filesystem/filestream.h" #include #include #include namespace model { /// class to parse the .ase file structure and load geometry data into a model class ASEFile { public: /** * @brief load a .ase file into a Model * @param name name of the model to be loaded, without .ase extension or models/ prefix * If the file can not be read, load() returns the NULL-pointer */ static Model *load(std::string const &name); private: /** * @brief type definition for a list of submaterials in the ASE file */ typedef std::map SubMaterialList; /** * @brief type definition for a list of materials in the ASE file */ typedef std::map MaterialList; /** * @brief type definition for a list of vertices in a GEOMOBJECT */ typedef std::map VertexList; /** * @brief type definition for a list of faces in a GEOMOBJECT */ typedef std::map FaceList; ASEFile(std::string const &name); ~ASEFile(); /** * @brief read *SUBMATERIAL */ Material *read_submaterial(std::istream &is); /** * @brief read *MATERIAL */ SubMaterialList *read_material(std::istream &is); /** * @brief read *MATERIAL_LIST */ bool read_material_list(std::istream &is); /** * @brief read *MESH_NORMALS */ bool read_mesh_normals(std::istream &is); /** * @brief read *MESH_FACE_LIST */ bool read_mesh_face_list(std::istream &is); /** * @brief read *MESH_VERTEX_LIST */ bool read_mesh_vertex_list(std::istream &is); /** * @brief read *MESH_TVERTLIST */ bool read_mesh_tvertex_list(std::istream &is); /** * @brief read *MESH_TFACELIST */ bool read_mesh_tface_list(std::istream &is); /** * @brief read *MESH */ bool read_mesh(std::istream &is); /** * @brief read *GEOMOBJECT */ bool read_geom(std::istream &is); /** * @brief clear *GEOMOBJECT */ bool clear_geom(); /** * @brief read the .ase header */ bool read_header(std::istream &is); /** * @brief read the .ase file */ bool read(); inline const std::string &name() const { return asefile_name; } inline bool is_open() { return asefile_ifs.is_open(); } inline size_t vertexcount() const { return ase_vertexcount; } inline size_t facecount() const { return ase_facecount; } inline FragmentGroup *fragmentgroup() { return ase_fragmentgroup; } inline const math::BoundingBox3f & box() const { return ase_box; } std::string asefile_name; filesystem::IFileStream asefile_ifs; VertexList ase_vertexlist; VertexList ase_tvertexlist; FaceList ase_facelist; MaterialList ase_materials; math::BoundingBox3f ase_box; FragmentGroup *ase_fragmentgroup; size_t ase_vertexcount; size_t ase_facecount; }; } // namespace model #endif // __INCLUDED_MODEL_ASEFILE_H__