/* ========================================================================== * (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" 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 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 GeoMeshLoader { private: Mesh *geoMesh; size_t mFileSize; unsigned int numVertices; unsigned long long_actual; char *nom_salida; size_t currentSubMesh; 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 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); // Writes the strips list. Mesh* GeoMeshLoader::BuildStripsGeoSubMesh(Mesh* geoMesh); public: // Constructor. GeoMeshLoader(); // Destroyer. ~GeoMeshLoader(); // Loads a Mesh file. Mesh* load(char *fileNameMesh); // Get the size in bytes of the file. size_t getFileSize(); }; } #endif