source: GTP/trunk/Lib/Geom/shared/GeoTool/include/GeoMeshLoader.h @ 989

Revision 989, 5.4 KB checked in by gumbau, 18 years ago (diff)
Line 
1/*      ==========================================================================
2 *      (C) 2005 Universitat Jaume I
3 *      ==========================================================================
4 *      PROYECT:        GAME TOOLS
5 *      =========================================================================*/
6/**     CONTENT:       
7        *
8        *
9        *       @file   GeoMeshLoader.h
10/*===========================================================================*/
11#ifndef __GEO_MESH_LOADER__
12#define __GEO_MESH_LOADER__
13
14#include <stdio.h>
15#include <stdlib.h>
16#include <string>
17#include <vector>
18#include <memory.h>
19#include <time.h>
20#include <iostream>
21#include <iomanip>
22#include "GeoBase.h"
23#include "GeoMesh.h"
24
25namespace Geometry
26{
27        const   unsigned        short   CHUNK_OVERHEAD_SIZE     = sizeof(unsigned short)
28                                                                                                                                                                                        +
29                                                                                                                                                                                        sizeof(unsigned long);
30
31        const unsigned  short M_HEADER                                                                                  = 0x1000;
32        const unsigned  short M_MESH                                                                                            = 0x3000;
33        const unsigned  short M_SUBMESH                                                                                 = 0x4000;
34        const unsigned  short M_SUBMESH_OPERATION                                               = 0x4010;
35        const unsigned  short M_SUBMESH_BONE_ASSIGNMENT                 = 0x4100;
36        const unsigned  short M_GEOMETRY                                                                                = 0x5000;
37        const unsigned  short M_GEOMETRY_VERTEX_DECLARATION = 0x5100;
38        const unsigned  short M_GEOMETRY_VERTEX_ELEMENT                 = 0x5110;
39        const unsigned  short M_GEOMETRY_VERTEX_BUFFER                  = 0x5200;
40        const unsigned  short M_GEOMETRY_VERTEX_BUFFER_DATA = 0x5210;
41        const unsigned  short M_MESH_SKELETON_LINK                                      = 0x6000;
42        const unsigned  short M_MESH_BONE_ASSIGNMENT                            = 0x7000;
43        const unsigned  short M_MESH_LOD                                                                                =       0x8000;
44        const unsigned  short M_MESH_LOD_USAGE                                                  =       0x8100;
45        const unsigned  short M_MESH_LOD_MANUAL                                                 =       0x8110;
46        const unsigned  short M_MESH_LOD_GENERATED                                      =       0x8120;
47        const unsigned  short M_MESH_BOUNDS                                                                     =       0x9000;
48        const unsigned  short M_SUBMESH_NAME_TABLE                                      =       0xA000;
49        const unsigned  short   M_SUBMESH_NAME_TABLE_ELEMENT    =       0xA100;
50        const unsigned  short M_EDGE_LISTS                                                                      =       0xB000;
51        const unsigned  short M_EDGE_LIST_LOD                                                           =       0xB100;
52        const unsigned  short M_EDGE_GROUP                                                                      = 0xB110;
53        const   unsigned        short   SUBMESH_COUNT                                                                   =       0;
54        const   unsigned        short   GEOMESH_BUILD                                                                   =       1;
55       
56        enum VertexElementType
57        {
58                VET_FLOAT1,
59                VET_FLOAT2,
60                VET_FLOAT3,
61                VET_FLOAT4,
62                VET_COLOUR,
63                VET_SHORT1,
64                VET_SHORT2,
65                VET_SHORT3,
66                VET_SHORT4,
67                VET_UBYTE4
68        };
69
70        enum VertexElementSemantic
71        {
72                /// Position, 3 reals per vertex
73                VES_POSITION = 1,
74                /// Blending weights
75                VES_BLEND_WEIGHTS = 2,
76                /// Blending indices
77                VES_BLEND_INDICES = 3,
78                /// Normal, 3 reals per vertex
79                VES_NORMAL = 4,
80                /// Diffuse colours
81                VES_DIFFUSE = 5,
82                /// Specular colours
83                VES_SPECULAR = 6,
84                /// Texture coordinates
85                VES_TEXTURE_COORDINATES = 7,
86                /// Binormal (Y axis if normal is Z)
87                VES_BINORMAL = 8,
88                /// Tangent (X axis if normal is Z)
89                VES_TANGENT = 9
90        };
91
92        /*
93        //      Bounding Box data.
94        struct  GeometryBounds
95        {
96                float   minx;
97                float   miny;
98                float   minz;
99                float   maxx;
100                float   maxy;
101                float   maxz;
102                float   radius;
103        };
104        */
105       
106        /// Mesh class interface
107        class GeoMeshLoader
108        {
109                private:
110                       
111                        Mesh                                            *geoMesh;
112                        size_t                                  mFileSize;
113                        unsigned        int             numVertices;
114                        unsigned        long    long_actual;
115                        size_t                                  currentSubMesh;
116                        bool                                            mError;
117
118                        struct GeometryElement
119                        {
120                                unsigned short offset;
121                                unsigned short semantic;
122                                unsigned short type;
123                                unsigned short index;
124                        };
125
126                        struct GT
127                        {
128                                unsigned short source; //bindIndex
129                                std::vector <GeometryElement> list;
130                        };
131
132                        std::vector <GT> list;
133
134                        //      Jump a chunk.
135                        void jumpChunk(FILE     *f);
136
137                        //      Read a chunk.
138                        unsigned short readChunk(FILE   *f);
139
140                        //      Read geometry vertex element.
141                        void readGeometryVertexElement(FILE     *f, Mesh        *geoMesh);
142
143                        //      Read geometry vertex declaration.
144                        void readGeometryVertexDeclaration(FILE *f, Mesh        *geoMesh);
145
146                        //      Read geometry vertex buffer.
147                        void readGeometryVertexBuffer(FILE              *f,
148                                                                                                                                                Mesh            *geoMesh,
149                                                                                                                                                int             option);
150
151                        //      Read geometry.
152                        void readGeometry(FILE  *f, Mesh        *geoMesh, int option);
153
154                        //      Read a submesh operation.
155                        void readSubMeshOperation(FILE  *f, Mesh        *geoMesh, int option);
156
157                        //      Read a submesh.
158                        void readSubMesh(FILE   *f, Mesh        *geoMesh, int option);
159
160                        //      Read skeleton name.
161                        void readSkeletonLink(FILE      *f, Mesh        *geoMesh, int option);
162
163                        //      Read bone assignment.
164                        void readMeshBoneAssignment(FILE        *f, Mesh        *geoMesh, int option);
165
166                        //      Read bone assignment.
167                        void readSubMeshBoneAssignment(FILE     *f, SubMesh     *geoSubMesh, int option);
168
169                        //      Read a mesh lod information.
170                        void readMeshLodInfo(FILE       *f, Mesh        *geoMesh);
171
172                        //      Read a submesh name table.
173                        void readSubMeshNameTable(FILE  *f, Mesh        *geoMesh);
174
175                        //      Read a mesh file.
176                        void readMesh(FILE      *f, Mesh        *geoMesh, int option);
177
178                        //      Read bounding box settings.
179                        void    readMeshBounds(FILE     *f, Mesh        *geoMesh,       int     option);
180
181                        //      Writes the strips list.
182                        SubMesh* GeoMeshLoader::BuildStripsGeoSubMesh(SubMesh   *geoSubMesh);
183
184                        //      Remove degenerate triangles of a submesh given.
185                        SubMesh *       removeDegenerateTriangles(SubMesh       *geoSubMesh);
186                       
187                        //      Sets coods between -1 and 1.
188                        void    normalizeModel(Mesh     *geoMesh);
189
190                public:
191
192                        //      Constructor.
193                        GeoMeshLoader();
194
195                        //      Destroyer.
196                        ~GeoMeshLoader();
197
198                        //      Loads a Mesh file.
199                        Mesh* load(char *fileNameMesh);
200
201                        //      Get the size in bytes of the file.
202                        size_t  getFileSize();
203        };
204}
205#endif
206
Note: See TracBrowser for help on using the repository browser.