/* ========================================================================== * (C) 2005 Universitat Jaume I * ========================================================================== * PROYECT: GAME TOOLS * ========================================================================== * CONTENT: * * * @file GeoMeshLoader.h *===========================================================================*/ #ifndef __GEO_MESH_LOADER__ #define __GEO_MESH_LOADER__ #include #include #include #include #include #include #include #include #include "GeoBase.h" #include "GeoMesh.h" #include "GeoLodStripsLibrary.h" #include "GeoLodTreeLibrary.h" namespace Geometry { const unsigned short CHUNK_OVERHEAD_SIZE = sizeof(unsigned short) + sizeof(unsigned long); const unsigned short M_HEADER = 0x1000; const unsigned short M_MESH = 0x3000; const unsigned short M_SUBMESH = 0x4000; const unsigned short M_SUBMESH_OPERATION = 0x4010; const unsigned short M_SUBMESH_BONE_ASSIGNMENT = 0x4100; const unsigned short M_GEOMETRY = 0x5000; const unsigned short M_GEOMETRY_VERTEX_DECLARATION = 0x5100; const unsigned short M_GEOMETRY_VERTEX_ELEMENT = 0x5110; const unsigned short M_GEOMETRY_VERTEX_BUFFER = 0x5200; const unsigned short M_GEOMETRY_VERTEX_BUFFER_DATA = 0x5210; const unsigned short M_MESH_SKELETON_LINK = 0x6000; const unsigned short M_MESH_BONE_ASSIGNMENT = 0x7000; const unsigned short M_MESH_LOD = 0x8000; const unsigned short M_MESH_LOD_USAGE = 0x8100; const unsigned short M_MESH_LOD_MANUAL = 0x8110; const unsigned short M_MESH_LOD_GENERATED = 0x8120; const unsigned short M_MESH_BOUNDS = 0x9000; const unsigned short M_SUBMESH_NAME_TABLE = 0xA000; const unsigned short M_SUBMESH_NAME_TABLE_ELEMENT = 0xA100; const unsigned short M_EDGE_LISTS = 0xB000; const unsigned short M_EDGE_LIST_LOD = 0xB100; const unsigned short M_EDGE_GROUP = 0xB110; const unsigned short M_POSES = 0xC000; const unsigned short M_ANIMATIONS = 0xD000; const unsigned short M_LODSTRIPS = 0xABCD; const unsigned short M_LODTREES = 0xDCBA; const unsigned short SUBMESH_COUNT = 0; const unsigned short GEOMESH_BUILD = 1; enum VertexElementType { VET_FLOAT1, VET_FLOAT2, VET_FLOAT3, VET_FLOAT4, VET_COLOUR, VET_SHORT1, VET_SHORT2, VET_SHORT3, VET_SHORT4, VET_UBYTE4 }; enum VertexElementSemantic { /// Position, 3 reals per vertex VES_POSITION = 1, /// Blending weights VES_BLEND_WEIGHTS = 2, /// Blending indices VES_BLEND_INDICES = 3, /// Normal, 3 reals per vertex VES_NORMAL = 4, /// Diffuse colours VES_DIFFUSE = 5, /// Specular colours VES_SPECULAR = 6, /// Texture coordinates VES_TEXTURE_COORDINATES = 7, /// Binormal (Y axis if normal is Z) VES_BINORMAL = 8, /// Tangent (X axis if normal is Z) VES_TANGENT = 9 }; /* // Bounding Box data. struct GeometryBounds { float minx; float miny; float minz; float maxx; float maxy; float maxz; float radius; }; */ /// Mesh class interface class GEOLODLIBRARYDLL_API GeoMeshLoader { private: Mesh *geoMesh; size_t mFileSize; unsigned int numVertices; unsigned long long_actual; size_t currentSubMesh; bool mError; struct GeometryElement { unsigned short offset; unsigned short semantic; unsigned short type; unsigned short index; }; struct GT { unsigned short source; //bindIndex std::vector list; }; std::vector list; // Jump a chunk. void jumpChunk(FILE *f); // Read a chunk. unsigned short readChunk(FILE *f); // Read geometry vertex element. void readGeometryVertexElement(FILE *f, Mesh *geoMesh); // Read geometry vertex declaration. void readGeometryVertexDeclaration(FILE *f, Mesh *geoMesh); // Read geometry vertex buffer. void readGeometryVertexBuffer(FILE *f, Mesh *geoMesh, int option); // Read geometry. void readGeometry(FILE *f, Mesh *geoMesh, int option); // Read a submesh operation. void readSubMeshOperation(FILE *f, Mesh *geoMesh, int option); // Read a submesh. void readSubMesh(FILE *f, Mesh *geoMesh, int option); // Read skeleton name. void readSkeletonLink(FILE *f, Mesh *geoMesh, int option); // Read bone assignment. void readMeshBoneAssignment(FILE *f, Mesh *geoMesh, int option); // Read bone assignment. void readSubMeshBoneAssignment(FILE *f, SubMesh *geoSubMesh, int option); // Read a mesh lod information. void readMeshLodInfo(FILE *f, Mesh *geoMesh); // Read a submesh name table. void readSubMeshNameTable(FILE *f, Mesh *geoMesh); // Read a mesh file. void readMesh(FILE *f, Mesh *geoMesh, int option); // Read bounding box settings. void readMeshBounds(FILE *f, Mesh *geoMesh, int option); // Writes the strips list. SubMesh* GeoMeshLoader::BuildStripsGeoSubMesh(SubMesh *geoSubMesh); // Remove degenerate triangles of a submesh given. SubMesh * removeDegenerateTriangles(SubMesh *geoSubMesh); // Sets coods between -1 and 1. void normalizeModel(Mesh *geoMesh); // Imports an OBJ object void importOBJ(FILE *f, Mesh *geoMesh); Geometry::LodStripsLibraryData *lodstripsdata; Geometry::TreeSimplificationSequence *treesimpseq; public: // Constructor. GeoMeshLoader(); // Destroyer. ~GeoMeshLoader(); // Loads a Mesh file. Mesh* load(char *fileNameMesh); // Get the size in bytes of the file. size_t getFileSize(); // if the loaded .mesh file doesn't contain LOD data this will return NULL const Geometry::LodStripsLibraryData * GetLodStripsData(void) const { return lodstripsdata; } const Geometry::TreeSimplificationSequence * GetTreeSimpSeq(void) const { return treesimpseq; } }; } #endif