Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/terrain.older/src/lib/graphics/importer/bsp_file.h @ 10606

Last change on this file since 10606 was 9324, checked in by ponder, 18 years ago

Added byte_order.h to
Added binary_file.h binary_file.cc
Changed the bsp code to work on big endian machines.

File size: 6.8 KB
Line 
1/*
2 orxonox - the future of 3D-vertical-scrollers
3 
4 Copyright (C) 2006 orx
5 
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10 
11 ### File Specific:
12 main-programmer: bottac@ee.ethz.ch
13 
14  Inspired by:
15  Rendering Q3 Maps by Morgan McGuire                  http://graphics.cs.brown.edu/games/quake/quake3.html
16  Unofficial Quake 3 Map Specs by Kekoa Proudfoot      http://graphics.stanford.edu/~kekoa/q3/
17  Quake 3 Collision Detection by Nathan Ostgard        http://www.devmaster.net/articles/quake3collision/
18*/
19
20#include <vector>
21#include "filesys/binary_file.h"
22class SDL_Surface;
23class BspTreeNode;
24class Vector;
25class Material;
26class MoviePlayer;
27class VertexArrayModel;
28
29
30struct bsp_lump {
31        int                     offset;
32        int                     length;
33};
34
35enum bsp_lumps {
36        Entities                =      0,
37        Textures                =      1,
38        Planes                  =      2,
39        Nodes                   =      3,
40        Leafs                   =      4,
41        Leaffaces               =      5,
42        Leafbrushes             =      6,
43        Models                  =      7,
44        Brushes                 =      8,
45        Brushsides              =      9,
46        Vertices                =     10,
47        Meshverts               =     11,
48        Effects                 =     12,
49        Faces                   =     13,
50        Lightmaps               =     14,
51        Lightvols               =     15,
52        Visdata                 =     16
53};
54
55struct bsp_header {
56        // The magic number always "IBSP"
57        char            magic[4];
58        // The version, 0x2e for quake 3 models
59        int                     version;
60        bsp_lump        lumps[17];
61};
62
63struct plane
64{
65  float x;     //!< 1st component of the plane's normal
66  float y;     //!< 2nd component of the plane's normal
67  float z;     //!< 3rd component of the plane's normal
68  float d;     //!< distance of the plane to the origin
69};
70
71
72typedef struct
73{
74  float mins [ 3 ]; //!< Bounding box min coord.
75  float maxs [ 3 ]; //!< Bounding box max coord.
76  int face;         //!< First face for model.
77  int n_faces;      //!< Number of faces for model.
78  int brush;        //!< First brush for model.
79  int n_brushes;    //!< Number of brushes
80}
81model;
82
83typedef struct
84{
85  int plane;        //!< Plane index.
86  int left;         //!< 1st Child index. Negative numbers are leaf indices: -(leaf+1).
87  int right;        //!< 2nd Child index. Negative numbers are leaf indices: -(leaf+1).
88  int mins[ 3 ];    //!< Integer bounding box min coord.
89  int maxs[ 3 ];    //!< Integer bounding box max coord.
90}
91node;
92
93typedef struct
94{
95  int cluster;            //!< Visdata cluster index.
96  int area;               //!< Areaportal area.
97  int mins[ 3 ];          //!< Integer bounding box min coord.
98  int maxs[ 3 ];          //!< Integer bounding box max coord.
99  int leafface;           //!< First leafface for leaf.
100  int n_leaffaces;        //!< Number of leaffaces for leaf.
101  int leafbrush_first;    //!< leafbrush for leaf.
102  int n_leafbrushes;      //!< Number of leafbrushes for leaf.
103}
104leaf;
105
106struct brush
107{
108  int brushside;        //!< First brushside for brush.
109  int n_brushsides;     //!< Number of brushsides for brush.
110  int texture;          //!< Texture index.
111};
112
113typedef struct
114{
115  int plane;    //!< Plane index.
116  int texture;  //!< Texture index.
117}
118brushside;
119
120
121struct face
122{
123  int texture;          //!< Texture index.
124  int effect;           //!< Index into lump 12 (Effects), or -1.
125  int type;             //!< Face type. 1=polygon, 2=patch, 3=mesh, 4=billboard
126  int vertex;           //!< Index of first vertex.
127  int n_vertexes;       //!< Number of vertices.
128  int meshvert;         //!< Index of first meshvert.
129  int n_meshverts;      //!< Number of meshverts.
130  int lm_index;         //!< Lightmap index.
131  int lm_start [ 2 ];   //!< Corner of this face's lightmap image in lightmap.
132  int lm_size [ 2 ];     //!< Size of this face's lightmap image in lightmap.
133  float lm_origin [ 3 ] ;    //!<  World space origin of lightmap.
134  float lm_vecs [ 2 ][ 3 ];  //!< World space lightmap s and t unit vectors.
135  float normal[ 3 ];         //!< Surface normal.
136  int size [ 2 ] ;           //!< Patch dimensions.
137} ;
138
139
140typedef struct
141{
142  float position[ 3 ];        //!< Vertex position.
143  float texcoord[ 2 ][ 2 ];   //!< Vertex texture coordinates. [0][x]=surface, [1][x]=lightmap.
144  float normal[ 3 ];          //!< Vertex normal.
145  unsigned char color [ 4 ];  //!< Vertex color. RGBA.
146}
147BspVertex;
148
149typedef struct
150{
151  int offset;
152}
153meshvert;                    //!< Integer offset to mesh vertex
154
155typedef struct
156{
157  float position [ 3 ];
158}
159BspVec;
160
161typedef struct
162{
163  Material* mat;
164  MoviePlayer* aviMat;
165  bool alpha;
166  bool animated;
167}
168AMat;
169typedef struct
170{
171  unsigned char map [128][128][3];
172}
173lightmap;
174
175typedef struct
176{
177  char name[64];
178  int flags;
179  int contents;
180}
181BspTexture;
182
183
184class BspFile
185{
186  friend class BspManager;
187
188public:
189  BspFile();
190  ~BspFile();
191  int read(const char* name );
192  void build_tree();
193  void load_textures();
194  void tesselate( int iface );
195  BspTreeNode* get_root();
196  AMat loadMat( char* mat );
197  AMat loadAVI(char * mat);
198 
199
200private:
201        void readEntities();
202        void readTextures();
203        void readPlanes();
204        void readNodes();
205        void readLeafs();
206        void readLeafFaces();
207        void readLeafBrushes();
208        void readBrushSides();
209        void readModels();
210        void readBrushes();
211        void readVertices();
212        void readMeshVerts();
213        void readEffects();
214        void readFaces();
215        void readLightmaps();
216        void readLightvols();
217        void readVisdata();
218        BinaryFile file;
219        BspTreeNode* root;
220        bsp_header header;               //!< Buffer for header of BSP-File
221        node* nodes;               //!< Buffer to store BSP-Tree-Nodes
222        leaf* leaves;              //!< Buffer to store BSP-Tree-Leaves
223        plane* planes;             //!< Buffer to store planes separateing the space
224        model* bspModels;          //!< Buffer to store BSP-Model-List
225        char* leafFaces;           //!< Buffer to store leafFaces
226        face* faces;               //!<
227        char* leafBrushes;         //!< Buffer to store brush indice
228        brush* brushes;            //!< Buffer to store  brushes
229        brushside* brushSides;     //!<
230        char* vertice;             //!<
231        meshvert* meshverts;       //!< Buffer to store meshverice
232        char* visData;             //!< Buffer to store visibility data
233        char* textures;            //!< Holds all the texture filename strings
234        char* patchVertice;        //!<
235        char* patchIndexes;
236        char* patchTrianglesPerRow;
237        lightmap* lightMaps;       //!< Buffer to store lightmap-images
238
239
240        int** patchRowIndexes;
241        VertexArrayModel** VertexArrayModels; 
242        int patchOffset;
243
244        int numNodes;
245        int numLeafs;
246        int numVertex;
247        int numPlanes;
248        int numBspModels;
249        int numLeafFaces;
250        int numFaces;
251        int numLeafBrushes;
252        int numTextures;
253        int numPatches;
254        int numBrushSides;
255        int numLightMaps;
256
257        float  scale;
258
259        BspTreeNode* build_tree_rec( int i );
260        unsigned int loadLightMapToGL(lightmap&);
261        AMat* Materials;
262        unsigned int* glLightMapTextures;
263        unsigned int whiteLightMap;
264        unsigned char whiteTexture[3];
265        void swapAllBspCoordinates();
266        void swapCoords(int * array);
267        void swapCoords(float * array);
268        SDL_Surface* testSurf;
269
270
271        ::std::vector<MoviePlayer* > MovieMaterials; //!< Movieplayer Materials
272};
273
Note: See TracBrowser for help on using the repository browser.