root/OpenSceneGraph/trunk/src/osgPlugins/bsp/VBSPReader.h @ 13041

Revision 13041, 6.6 kB (checked in by robert, 2 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
Line 
1#ifndef __VBSP_READER_H_
2#define __VBSP_READER_H_
3
4
5#include <osg/Geometry>
6#include <osg/Node>
7#include <osg/Object>
8#include <osg/StateSet>
9#include <osgDB/Registry>
10#include <osgDB/FileNameUtils>
11#include <osg/Referenced>
12
13#include "VBSPData.h"
14
15namespace bsp
16{
17
18
19// The magic number for a Valve BSP file is 'VBSP' in little-endian
20// order
21const int MAGIC_NUMBER = (('P'<<24)+('S'<<16)+('B'<<8)+'V');
22
23
24enum LumpType
25{
26    ENTITIES_LUMP,
27    PLANES_LUMP,
28    TEXDATA_LUMP,
29    VERTICES_LUMP,
30    VISIBILITY_LUMP,
31    NODES_LUMP,
32    TEXINFO_LUMP,
33    FACES_LUMP,
34    LIGHTING_LUMP,
35    OCCLUSION_LUMP,
36    LEAFS_LUMP,
37    UNUSED_LUMP_11,
38    EDGES_LUMP,
39    SURFEDGES_LUMP,
40    MODELS_LUMP,
41    WORLD_LIGHTS_LUMP,
42    LEAF_FACES_LUMP,
43    LEAF_BRUSHES_LUMP,
44    BRUSHES_LUMP,
45    BRUSH_SIDES_LUMP,
46    AREAS_LUMP,
47    AREA_PORTALS_LUMP,
48    PORTALS_LUMP,
49    CLUSTERS_LUMP,
50    PORTAL_VERTS_LUMP,
51    CLUSTER_PORTALS_LUMP,
52    DISPINFO_LUMP,
53    ORIGINAL_FACES_LUMP,
54    UNUSED_LUMP_28,
55    PHYS_COLLIDE_LUMP,
56    VERT_NORMALS_LUMP,
57    VERT_NORMAL_INDICES_LUMP,
58    DISP_LIGHTMAP_ALPHAS_LUMP,
59    DISP_VERTS_LUMP,
60    DISP_LIGHTMAP_SAMPLE_POS_LUMP,
61    GAME_LUMP,
62    LEAF_WATER_DATA_LUMP,
63    PRIMITIVES_LUMP,
64    PRIM_VERTS_LUMP,
65    PRIM_INDICES_LUMP,
66    PAK_FILE_LUMP,
67    CLIP_PORTAL_VERTS_LUMP,
68    CUBEMAPS_LUMP,
69    TEXDATA_STRING_DATA_LUMP,
70    TEXDATA_STRING_TABLE_LUMP,
71    OVERLAYS_LUMP,
72    LEAF_MIN_DIST_TO_WATER_LUMP,
73    FACE_MACRO_TEXTURE_INFO_LUMP,
74    DISP_TRIS_LUMP,
75    PHYS_COLLIDE_SURFACE_LUMP,
76    UNUSED_LUMP_50,
77    UNUSED_LUMP_51,
78    UNUSED_LUMP_52,
79    LIGHTING_HDR_LUMP,
80    WORLD_LIGHTS_HDR_LUMP,
81    LEAF_LIGHT_HDR_1_LUMP,
82    LEAF_LIGHT_HDR_2_LUMP,
83    UNUSED_LUMP_57,
84    UNUSED_LUMP_58,
85    UNUSED_LUMP_59,
86    UNUSED_LUMP_60,
87    UNUSED_LUMP_61,
88    UNUSED_LUMP_62,
89    UNUSED_LUMP_63,
90    MAX_LUMPS
91};
92
93
94const char LUMP_DESCRIPTION[][64] =
95{
96    "ENTITIES_LUMP",
97    "PLANES_LUMP",
98    "TEXDATA_LUMP",
99    "VERTICES_LUMP",
100    "VISIBILITY_LUMP",
101    "NODES_LUMP",
102    "TEXINFO_LUMP",
103    "FACES_LUMP",
104    "LIGHTING_LUMP",
105    "OCCLUSION_LUMP",
106    "LEAFS_LUMP",
107    "UNUSED_LUMP_11",
108    "EDGES_LUMP",
109    "SURFEDGES_LUMP",
110    "MODELS_LUMP",
111    "WORLD_LIGHTS_LUMP",
112    "LEAF_FACES_LUMP",
113    "LEAF_BRUSHES_LUMP",
114    "BRUSHES_LUMP",
115    "BRUSH_SIDES_LUMP",
116    "AREAS_LUMP",
117    "AREA_PORTALS_LUMP",
118    "PORTALS_LUMP",
119    "CLUSTERS_LUMP",
120    "PORTAL_VERTS_LUMP",
121    "CLUSTER_PORTALS_LUMP",
122    "DISPINFO_LUMP",
123    "ORIGINAL_FACES_LUMP",
124    "UNUSED_LUMP_28",
125    "PHYS_COLLIDE_LUMP",
126    "VERT_NORMALS_LUMP",
127    "VERT_NORMAL_INDICES_LUMP",
128    "DISP_LIGHTMAP_ALPHAS_LUMP",
129    "DISP_VERTS_LUMP",
130    "DISP_LIGHTMAP_SAMPLE_POS_LUMP",
131    "GAME_LUMP",
132    "LEAF_WATER_DATA_LUMP",
133    "PRIMITIVES_LUMP",
134    "PRIM_VERTS_LUMP",
135    "PRIM_INDICES_LUMP",
136    "PAK_FILE_LUMP",
137    "CLIP_PORTAL_VERTS_LUMP",
138    "CUBEMAPS_LUMP",
139    "TEXDATA_STRING_DATA_LUMP",
140    "TEXDATA_STRING_TABLE_LUMP",
141    "OVERLAYS_LUMP",
142    "LEAF_MIN_DIST_TO_WATER_LUMP",
143    "FACE_MACRO_TEXTURE_INFO_LUMP",
144    "DISP_TRIS_LUMP",
145    "PHYS_COLLIDE_SURFACE_LUMP",
146    "UNUSED_LUMP_50",
147    "UNUSED_LUMP_51",
148    "UNUSED_LUMP_52",
149    "LIGHTING_HDR_LUMP",
150    "WORLD_LIGHTS_HDR_LUMP",
151    "LEAF_LIGHT_HDR_1_LUMP",
152    "LEAF_LIGHT_HDR_2_LUMP",
153    "UNUSED_LUMP_57",
154    "UNUSED_LUMP_58",
155    "UNUSED_LUMP_59",
156    "UNUSED_LUMP_60",
157    "UNUSED_LUMP_61",
158    "UNUSED_LUMP_62",
159    "UNUSED_LUMP_63"
160};
161
162
163struct LumpEntry
164{
165    int   file_offset;
166    int   lump_length;
167    int   lump_version;
168    char  ident_code[4];
169};
170
171
172struct Header
173{
174    int        magic_number;
175    int        bsp_version;
176    LumpEntry  lump_table[MAX_LUMPS];
177    int        map_revision;
178};
179
180
181struct GameHeader
182{
183    int              num_lumps;
184
185    // This is followed by this many GameLump entries (see below)
186};
187
188
189struct GameLump
190{
191    int               lump_id;
192    unsigned short    lump_flags;
193    unsigned short    lump_version;
194    int               lump_offset;
195    int               lump_length;
196};
197
198
199// This is the ID for the static prop game lump
200const int STATIC_PROP_ID = (('s'<<24)+('p'<<16)+('r'<<8)+'p');
201
202
203struct StaticPropModelNames
204{
205    int    num_model_names;
206
207    // This is followed by this many names, each 128 characters long
208};
209
210
211struct StaticPropLeaves
212{
213    int   num_leaf_entries;
214
215    // This is followed by this many unsigned shorts, indicating which BSP
216    // leaves this prop occupies
217};
218
219
220struct StaticProps
221{
222    int   num_static_props;
223
224    // This is followed by this many StaticProp entries (see VBSPData.h), note
225    // that there are two possible StaticProp versions, depending on the
226    // version of the GameLump
227};
228
229
230class VBSPReader
231{
232protected:
233
234    std::string                map_name;
235
236    osg::ref_ptr<VBSPData>     bsp_data;
237
238    osg::ref_ptr<osg::Node>    root_node;
239
240    char *                     texdata_string;
241    int *                      texdata_string_table;
242    int                        num_texdata_string_table_entries;
243
244
245    void   processEntities(std::istream & str, int offset, int length);
246    void   processModels(std::istream & str, int offset, int length);
247    void   processPlanes(std::istream & str, int offset, int length);
248    void   processVertices(std::istream & str, int offset, int length);
249    void   processEdges(std::istream & str, int offset, int length);
250    void   processSurfEdges(std::istream & str, int offset, int length);
251    void   processFaces(std::istream & str, int offset, int length);
252    void   processTexInfo(std::istream & str, int offset, int length);
253    void   processTexData(std::istream & str, int offset, int length);
254    void   processTexDataStringTable(std::istream & str, int offset,
255                                     int length);
256    void   processTexDataStringData(std::istream & str, int offset, int length);
257    void   processDispInfo(std::istream & str, int offset, int length);
258    void   processDispVerts(std::istream & str, int offset, int length);
259    void   processGameData(std::istream & str, int offset, int length);
260    void   processStaticProps(std::istream & str, int offset, int length,
261                              int lumpVersion);
262
263    std::string       getToken(std::string str, const char * delim,
264                               size_t & index);
265
266    osg::ref_ptr<osg::StateSet>   createBlendShader(osg::Texture * tex1,
267                                                    osg::Texture * tex2);
268
269    osg::ref_ptr<osg::Texture>    readTextureFile(std::string file);
270    osg::ref_ptr<osg::StateSet>   readMaterialFile(std::string file);
271
272    void   createScene();
273
274public:
275
276    VBSPReader();
277    virtual ~VBSPReader();
278
279    bool   readFile(const std::string & file);
280
281    osg::ref_ptr<osg::Node>   getRootNode();
282};
283
284
285}
286
287#endif
Note: See TracBrowser for help on using the browser.