1 | /* |
---|
2 | =========================================================================== |
---|
3 | Copyright (C) 2008 Daniel Örstadius |
---|
4 | Copyright (C) 2009 Jared Prince |
---|
5 | |
---|
6 | This file is part of bsp-renderer source code. |
---|
7 | |
---|
8 | bsp-renderer is free software: you can redistribute it and/or modify |
---|
9 | it under the terms of the GNU General Public License as published by |
---|
10 | the Free Software Foundation, either version 3 of the License, or |
---|
11 | (at your option) any later version. |
---|
12 | |
---|
13 | bsp-renderer is distributed in the hope that it will be useful, |
---|
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
16 | GNU General Public License for more details. |
---|
17 | |
---|
18 | You should have received a copy of the GNU General Public License |
---|
19 | along with bsp-renderer. If not, see <http://www.gnu.org/licenses/>. |
---|
20 | |
---|
21 | */ |
---|
22 | |
---|
23 | // Q3Map.h -- handles the map data |
---|
24 | |
---|
25 | #ifndef _Q3MAP_H |
---|
26 | #define _Q3MAP_H |
---|
27 | |
---|
28 | #define WIN32_LEAN_AND_MEAN |
---|
29 | #include "windows.h" |
---|
30 | |
---|
31 | #include "Q3Map_Bezier.h" |
---|
32 | |
---|
33 | #include <string> |
---|
34 | #include <vector> |
---|
35 | |
---|
36 | #include "Q3Map_misc.h" |
---|
37 | |
---|
38 | //#include "JarDebug.h" //!! just for debugging, remove from final build |
---|
39 | |
---|
40 | #define MEMADD 65536 // memory is grown in 66k blocks |
---|
41 | #define MAX_TOKENSIZE 1024 // make sure tokens in texts aren't ridiculously large |
---|
42 | |
---|
43 | |
---|
44 | |
---|
45 | #define MINMAXLIMIT 10000000.0 |
---|
46 | |
---|
47 | #define BRIGHTNESSTWEAK 0.5f //1.25f // tweak for spotlight brightness |
---|
48 | |
---|
49 | #define ADDTEXTUREUNIQUE_FAIL -1 |
---|
50 | #define ADDTEXLAMP_FAIL -2 |
---|
51 | |
---|
52 | #define ADDSPOTLIGHTTEXTURE_FAIL -1 |
---|
53 | |
---|
54 | //////////////////////////////////////////////////// |
---|
55 | |
---|
56 | #define AXIS_X 0 |
---|
57 | #define AXIS_Y 1 |
---|
58 | #define AXIS_Z 2 |
---|
59 | |
---|
60 | //////////////////////////////////////////////////// |
---|
61 | /* |
---|
62 | #define FACESORT_FACE_LIMIT 16777216 |
---|
63 | #define FACESORT_FACE_SHIFT 0 |
---|
64 | #define FACESORT_FACE_MASK 0x0000000000FFFFFF |
---|
65 | #define FACESORT_TEXTURE_LIMIT 4096 |
---|
66 | #define FACESORT_TEXTURE_SHIFT 24 |
---|
67 | #define FACESORT_TEXTURE_MASK 0x0000000FFF000000 |
---|
68 | #define FACESORT_SUBZONE_LIMIT 4096 // also see MAX_ZONE |
---|
69 | #define FACESORT_SUBZONE_SHIFT 36 |
---|
70 | #define FACESORT_SUBZONE_MASK 0x0000FFF000000000 |
---|
71 | */ |
---|
72 | |
---|
73 | #define FACESORT_FACE_LIMIT 16777216 |
---|
74 | #define FACESORT_FACE_SHIFT 0 |
---|
75 | #define FACESORT_FACE_MASK 0x0000000000FFFFFF |
---|
76 | #define FACESORT_GROUP_LIMIT 65536 // also see MAX_TRANS |
---|
77 | #define FACESORT_GROUP_SHIFT 24 |
---|
78 | #define FACESORT_GROUP_MASK 0x000000FFFF000000 |
---|
79 | #define FACESORT_TEXTURE_LIMIT 4096 |
---|
80 | #define FACESORT_TEXTURE_SHIFT 40 |
---|
81 | #define FACESORT_TEXTURE_MASK 0x000FFF0000000000 |
---|
82 | #define FACESORT_SUBZONE_LIMIT 4096 // also see MAX_ZONE |
---|
83 | #define FACESORT_SUBZONE_SHIFT 52 |
---|
84 | #define FACESORT_SUBZONE_MASK 0xFFF0000000000000 |
---|
85 | |
---|
86 | #define GROUPSORT_FACE_LIMIT 16777216 |
---|
87 | #define GROUPSORT_FACE_SHIFT 0 |
---|
88 | #define GROUPSORT_FACE_MASK 0x0000000000FFFFFF |
---|
89 | #define GROUPSORT_GROUP_LIMIT 16777216 |
---|
90 | #define GROUPSORT_GROUP_SHIFT 24 |
---|
91 | #define GROUPSORT_GROUP_MASK 0x0000FFFFFF000000 |
---|
92 | #define GROUPSORT_SUBZONE_LIMIT 4096 // also see MAX_ZONE |
---|
93 | #define GROUPSORT_SUBZONE_SHIFT 52 |
---|
94 | #define GROUPSORT_SUBZONE_MASK 0xFFF0000000000000 |
---|
95 | |
---|
96 | |
---|
97 | |
---|
98 | //////////////////////////////////////////////////// |
---|
99 | |
---|
100 | #define MAX_ZONE 4096 // max subzones and max zones. Also see FACESORT_SUBZONE_LIMIT |
---|
101 | #define MAX_SUBZONEPERZONE 16 // the most subzones that can make up a zone, further subzones ignored. INDEX_SUBZONECOUNT must be same as this |
---|
102 | #define INDEX_SUBZONECOUNT 16 // helps subzone counting in m_nZone. See MAX_SUBZONEPERZONE |
---|
103 | |
---|
104 | #define MAX_PORTAL 32768 // max subzoneportals in a map. |
---|
105 | #define MAX_PORTALPERZONE 64 // the most portals that a zone can have, further portals ignored. INDEX_PORTALCOUNT must be same as this |
---|
106 | #define MAX_ZONEPERPORTAL 8 // the most zones a portal can connect, further zones ignored. INDEX_PORTALZONECOUNT must be the same as this |
---|
107 | #define MAX_LIGHTPERPORTAL 16 // the most lights that can touch a portal, further lights ignored. INDEX_PORTALLIGHTCOUNT must be the same as this |
---|
108 | #define INDEX_PORTALCOUNT 64 // helps portal counting in m_nZoneTouchesPortal. See MAX_PORTALSPERZONE |
---|
109 | #define INDEX_PORTALZONECOUNT 8 // helps portalconnect counting in m_nPortalTouchesZone. See MAX_ZONEPERPORTAL |
---|
110 | #define INDEX_PORTALLIGHTCOUNT 16 // helps portallight counting in m_PortalConnectsLight. See MAX_LIGHTPERPORTAL |
---|
111 | |
---|
112 | #define MAX_ZONEPERZONE 64 // the most zones that a zone can connect to. |
---|
113 | #define INDEX_ZONEPERZONECOUNT 64 // helps zone per zone counting. |
---|
114 | |
---|
115 | #define MAX_LIGHT 32768 // max lights in a map, both from the map and other things (flashlight, missiles, etc) |
---|
116 | #define MAX_LIGHTPERZONE 64 // the most lights that a zone can have, further lights ignored. INDEX_LIGHTCOUNT must be same as this |
---|
117 | #define MAX_ZONEPERLIGHT 8 // the most zones a light can touch, further zones ignored. INDEX_LIGHTZONECOUNT must be the same as this |
---|
118 | #define INDEX_LIGHTCOUNT 64 // helps light counting in m_nZoneContainsLight. see MAX_LIGHTPERZONE |
---|
119 | #define INDEX_LIGHTZONECOUNT 8 // helps light counting in m_nLightContainedByZone. See MAX_ZONEPERLIGHT |
---|
120 | |
---|
121 | #define MAX_SUBLIGHT 262144 // must be MAX_LIGHT * MAX_ZONEPERLIGHT |
---|
122 | #define MAX_TRANS 65536 // most transparent objects per zone (objects may be defined in various ways). see FACESORT_TRANS_LIMIT |
---|
123 | |
---|
124 | |
---|
125 | |
---|
126 | //////////////////////////////////////////////////// |
---|
127 | |
---|
128 | #define SUBZONE_EPSILON 0.01f // small buffer of extra size around subzones so that we don't accidentally exclude a point due to float accuracy errors. |
---|
129 | #define FRUSTUM_EPSILON 0.0001f // once frustum is this tiny consider it dead |
---|
130 | #define VERYSMALL 0.00001 // small number |
---|
131 | |
---|
132 | #define PORTAL_UNCHECKED 0 |
---|
133 | #define PORTAL_VISCHECK 1 |
---|
134 | #define PORTAL_VISIBLE 2 |
---|
135 | |
---|
136 | #define PORTALSTATE_OPENCHECK 0 |
---|
137 | #define PORTALSTATE_CLOSED 1 |
---|
138 | #define PORTALSTATE_OPEN 2 |
---|
139 | |
---|
140 | #define ZONE_UNCHECKED 0 |
---|
141 | #define ZONE_VISIBLE 1 |
---|
142 | |
---|
143 | #define LIGHT_UNCHECKED 0 |
---|
144 | #define LIGHT_OUTOFFRUSTUM 1 |
---|
145 | #define LIGHT_INSIDEFRUSTUM 2 |
---|
146 | #define LIGHT_NOTVISIBLE 4 |
---|
147 | #define LIGHT_VISIBLE 8 |
---|
148 | #define LIGHT_CHECKED 16 |
---|
149 | |
---|
150 | /////////////////////////////////////////////////// |
---|
151 | |
---|
152 | #define MAX_PROJECTORTEX 16 // most types of projector textures we can have per map. |
---|
153 | |
---|
154 | |
---|
155 | /////////////////////////////////////////////////// |
---|
156 | |
---|
157 | // NOERROR is already defined in a windows file, it is 0 |
---|
158 | #define ERROR_ParseMap 1 |
---|
159 | #define ERROR_ParseEntities 2 |
---|
160 | #define ERROR_AllocateVertex 3 |
---|
161 | #define ERROR_AllocateTriangle 4 |
---|
162 | #define ERROR_InitializeFaces 5 |
---|
163 | #define ERROR_ConvertFaces 6 |
---|
164 | #define ERROR_ConvertPatches 7 |
---|
165 | #define ERROR_ConvertLamps 8 |
---|
166 | #define ERROR_ConvertLampGlow 9 |
---|
167 | #define ERROR_ConvertLightGlow 10 |
---|
168 | #define ERROR_AssignTriangles 11 |
---|
169 | #define ERROR_SortTriangles 12 |
---|
170 | #define ERROR_ConvertTexLamp 13 |
---|
171 | #define ERROR_SetupTransTextures 14 |
---|
172 | #define ERROR_SortGroups 15 |
---|
173 | |
---|
174 | |
---|
175 | /////////////////////////////////////////////////// |
---|
176 | // error values for parsing key/values |
---|
177 | #define KEY_OK 0 |
---|
178 | #define KEY_NONE 1 |
---|
179 | #define KEY_ERROR 2 |
---|
180 | |
---|
181 | ////////////////////////////////////////////////// |
---|
182 | // entity types |
---|
183 | #define ENTITY_ERROR 0 |
---|
184 | #define ENTITY_UNKNOWN 1 |
---|
185 | #define ENTITY_WORLDSPAWN 2 |
---|
186 | #define ENTITY_LIGHT 3 |
---|
187 | |
---|
188 | /////////////////////////////////////////////////// |
---|
189 | |
---|
190 | |
---|
191 | |
---|
192 | // The lump idexes that make up a bsp file. |
---|
193 | // Bzn bsp lump data is almost identical to q3a bsp lump data, except that the |
---|
194 | // Effects, Lightmaps and VisData lumps are removed and there are two new lumps, one |
---|
195 | // describing the subzones and one describing the portals. The other difference is the lighting |
---|
196 | // entities (which are stored as normal entities in lump 0) since q3a bsps don't usually |
---|
197 | // store the light entities at all, and BZN has it's own unique set of lighting keys. |
---|
198 | |
---|
199 | const int Textures = 1; |
---|
200 | const int Planes = 2; |
---|
201 | const int Nodes = 3; |
---|
202 | const int Leafs = 4; |
---|
203 | const int LeafFaces = 5; |
---|
204 | const int LeafBrushes = 6; |
---|
205 | const int Brushes = 8; |
---|
206 | const int BrushSides = 9; |
---|
207 | const int Vertices = 10; |
---|
208 | const int MeshVerts = 11; |
---|
209 | const int Effects = 12; // removed from bzn |
---|
210 | const int Faces = 13; |
---|
211 | const int LightMaps = 14; // removed from bzn |
---|
212 | const int VisData = 16; // removed from bzn |
---|
213 | const int SubZoneData = 17 ; // added to bzn: overlapping subzones form zones. Zones are like groups of axial boxes. |
---|
214 | const int PortalData = 18 ; // added to bzn: portals overlapping different zones allow them to see each other. |
---|
215 | const int MAX_LUMP = 19 ; |
---|
216 | |
---|
217 | const int MAX_LUMP_SIZE = 100000000 ; // this value is very large and arbitrary, 100 megabytes. Just make sure MAX_LUMP_SIZE * MAX_LUMP is less than the max size for a size_t or parseMap error checking won't work. |
---|
218 | |
---|
219 | enum {POLYGON = 1, PATCH, MESH, BILLBOARD}; |
---|
220 | |
---|
221 | typedef struct{ |
---|
222 | int iOffset; |
---|
223 | int iLength; |
---|
224 | } direntry_t; |
---|
225 | |
---|
226 | #define Q3NAMESIZE 64 |
---|
227 | typedef struct { |
---|
228 | char name[Q3NAMESIZE]; |
---|
229 | int flags; |
---|
230 | int contents; |
---|
231 | } Q3BspTexture; |
---|
232 | |
---|
233 | typedef struct{ |
---|
234 | unsigned char magic[4]; |
---|
235 | int version; |
---|
236 | direntry_t Lumps[MAX_LUMP]; |
---|
237 | } Q3BspHeader_t; |
---|
238 | |
---|
239 | typedef struct{ |
---|
240 | int texture; |
---|
241 | int effect; |
---|
242 | int type; |
---|
243 | int vertex; |
---|
244 | int n_vertexes; |
---|
245 | int meshvert; |
---|
246 | int n_meshverts; |
---|
247 | int lm_index; |
---|
248 | int lm_start[2]; |
---|
249 | int lm_size[2]; |
---|
250 | float lm_origin[3]; |
---|
251 | float lm_vecs[2][3]; |
---|
252 | float normal[3]; |
---|
253 | int size[2]; |
---|
254 | } Q3BspFace_t; |
---|
255 | |
---|
256 | typedef struct{ |
---|
257 | float position[3]; |
---|
258 | float texcoord[2][2]; |
---|
259 | float normal[3]; |
---|
260 | unsigned char color[4]; |
---|
261 | } Q3BspVertex; |
---|
262 | |
---|
263 | typedef struct { |
---|
264 | int cluster; |
---|
265 | int area; |
---|
266 | int mins[3]; |
---|
267 | int maxs[3]; |
---|
268 | int leafface; |
---|
269 | int n_leaffaces; |
---|
270 | int leafbrush; |
---|
271 | int n_leafbrushes; |
---|
272 | } Q3BspLeaf; |
---|
273 | |
---|
274 | typedef struct { |
---|
275 | float normal[3]; |
---|
276 | float dist; |
---|
277 | } Q3BspPlane; |
---|
278 | |
---|
279 | typedef struct { |
---|
280 | int plane; |
---|
281 | int children[2]; |
---|
282 | int mins[3]; |
---|
283 | int maxs[3]; |
---|
284 | } Q3BspNode; |
---|
285 | |
---|
286 | typedef struct { |
---|
287 | int brushside; |
---|
288 | int n_brushsides; |
---|
289 | int texture; |
---|
290 | } Q3BspBrush; |
---|
291 | |
---|
292 | typedef struct { |
---|
293 | int plane; |
---|
294 | int texture; |
---|
295 | } Q3BspBrushSide; |
---|
296 | |
---|
297 | typedef struct { |
---|
298 | unsigned char lightmap[128][128][3]; |
---|
299 | } Q3BspLightMap; |
---|
300 | |
---|
301 | typedef struct { |
---|
302 | int n_vecs; |
---|
303 | int sz_vecs; |
---|
304 | unsigned char *vecs; |
---|
305 | } Q3BspVisData; |
---|
306 | |
---|
307 | typedef struct { |
---|
308 | int size; |
---|
309 | Bezier *bezier; |
---|
310 | } Q3BspPatch; |
---|
311 | |
---|
312 | |
---|
313 | // this struct must be the same as in BZNq3map2 |
---|
314 | typedef struct |
---|
315 | { |
---|
316 | int Zone ; |
---|
317 | float Min[3] ; |
---|
318 | float Max[3] ; |
---|
319 | } |
---|
320 | BZN_SubZone_t; |
---|
321 | |
---|
322 | // this struct must be the same as in BZNq3map2 |
---|
323 | typedef struct |
---|
324 | { |
---|
325 | float Min[3] ; |
---|
326 | float Max[3] ; |
---|
327 | } |
---|
328 | BZN_Portal_t; |
---|
329 | |
---|
330 | |
---|
331 | typedef struct{ |
---|
332 | int texture; |
---|
333 | int type; |
---|
334 | int vertex; |
---|
335 | int n_vertexes; |
---|
336 | int meshvert; |
---|
337 | int n_meshverts; |
---|
338 | int n_triangles; |
---|
339 | int lm_index; |
---|
340 | float normal[3]; |
---|
341 | int zone ; // added by Jared |
---|
342 | Q3BspPatch *patch; |
---|
343 | } Q3BspFaceRenderer; |
---|
344 | |
---|
345 | ////////////////////////////////////// |
---|
346 | typedef struct { |
---|
347 | int Zone ; // this gets set to -1 for triangles in no zone, and they don't get added to the manualobjects |
---|
348 | int Texture ; |
---|
349 | //int Lightmap ; // bzn doesn't use lightmaps |
---|
350 | int VIndex[3] ; |
---|
351 | int Lamp ; // which lamp this triangle came from, -1 for most triangles. |
---|
352 | |
---|
353 | int Group ; // triangles from the same face are the same group, triangles from the same patch are the same group. Most stuff is group 0 unless it needs special attention, such as transparent stuff |
---|
354 | } triangle_t; |
---|
355 | |
---|
356 | typedef struct { |
---|
357 | unsigned int Flags ; |
---|
358 | float Position[3] ; |
---|
359 | float Direction[3] ; |
---|
360 | float Colour[3] ; |
---|
361 | float Min[3] ; |
---|
362 | float Max[3] ; |
---|
363 | float Cutoff ; |
---|
364 | float Angle ; |
---|
365 | float Brightness ; |
---|
366 | int Texture ; // texture index of light |
---|
367 | unsigned int ZoneCount ; // how many zones this light touches |
---|
368 | unsigned int CentreZone ; // which zone contains the centre of this light. even if on a boundary, the light will only choose one zone as its centre. |
---|
369 | short SubLightStart ; // where this light's sublights start in the sublight list. |
---|
370 | } light_t ; |
---|
371 | |
---|
372 | typedef struct { |
---|
373 | unsigned int Flags ; |
---|
374 | float Position[3] ; |
---|
375 | float Colour[3] ; |
---|
376 | float Min[3] ; |
---|
377 | float Max[3] ; |
---|
378 | float Brightness ; |
---|
379 | int Texture ; // texture index of light |
---|
380 | int LightNode ; // -1 if not a node, 0 - 3 if a node. LightNodes are used as the data for TexLamps, freeform geometry that gets converted to deferred shading lamp triangles. |
---|
381 | unsigned short Zone[MAX_ZONEPERLIGHT+1] ; // the zones this lamp touches |
---|
382 | } lamp_t ; |
---|
383 | |
---|
384 | typedef struct |
---|
385 | { |
---|
386 | float Min[3] ; |
---|
387 | float Max[3] ; |
---|
388 | } |
---|
389 | minmax_t; |
---|
390 | |
---|
391 | // this used for the light culling algo, where each cutup light is treated as a subzone. |
---|
392 | typedef struct |
---|
393 | { |
---|
394 | unsigned short Light ; |
---|
395 | unsigned short Zone ; |
---|
396 | float Min[3] ; |
---|
397 | float Max[3] ; |
---|
398 | } |
---|
399 | sublight_t; |
---|
400 | |
---|
401 | |
---|
402 | class Q3Map |
---|
403 | { |
---|
404 | public: |
---|
405 | Q3Map(); |
---|
406 | ~Q3Map(); |
---|
407 | |
---|
408 | int m_nNewCount ; |
---|
409 | |
---|
410 | int m_nDebugA ; |
---|
411 | |
---|
412 | // CJarDebug Q3Bug ; //!! just for debugging, remove from final build |
---|
413 | char m_chBug[10240] ; |
---|
414 | |
---|
415 | int ParseAndTriangulateMap(const char* pData, size_t Size) ; |
---|
416 | void FreeParseMem(void) ; |
---|
417 | |
---|
418 | int parseMap(const char* pMem, size_t Size); |
---|
419 | |
---|
420 | int findVisibleFaces(const QVECTOR *camPos, int *facesToRender); |
---|
421 | Q3BspFace_t *getFaces(void); |
---|
422 | Q3BspPatch *handlePatch(int faceIndex); |
---|
423 | |
---|
424 | char m_chSpotlightTexture[MAX_PROJECTORTEX][Q3NAMESIZE] ; |
---|
425 | int m_nMaxSpotlightTexture ; |
---|
426 | int AddSpolightTexture(char TEXNAME[]) ; |
---|
427 | |
---|
428 | private: |
---|
429 | |
---|
430 | |
---|
431 | |
---|
432 | |
---|
433 | |
---|
434 | |
---|
435 | |
---|
436 | int findLeaf(const QVECTOR *camPos) const; |
---|
437 | bool isClusterVisible(int visCluster, int testCluster) const; |
---|
438 | |
---|
439 | int *mVisibleFaces; |
---|
440 | |
---|
441 | std::vector<Q3BspVisData> *patches; |
---|
442 | |
---|
443 | public: |
---|
444 | // map data |
---|
445 | |
---|
446 | Q3BspHeader_t m_BspHeader; |
---|
447 | |
---|
448 | char *m_pEntities; |
---|
449 | |
---|
450 | int m_iNumTexs; |
---|
451 | Q3BspTexture *m_pTexturesOrig; |
---|
452 | |
---|
453 | int m_iNumFaces; |
---|
454 | Q3BspFace_t *m_pFaces; |
---|
455 | |
---|
456 | int m_iNumVertices; |
---|
457 | Q3BspVertex *m_pVertices; |
---|
458 | |
---|
459 | int m_iNumMeshVerts; |
---|
460 | int *m_pMeshVerts; |
---|
461 | |
---|
462 | int m_iNumLeafs; |
---|
463 | Q3BspLeaf *m_pLeafs; |
---|
464 | |
---|
465 | int m_iNumLeafFaces; |
---|
466 | int *m_pLeafFaces; |
---|
467 | |
---|
468 | int m_iNumPlanes; |
---|
469 | Q3BspPlane *m_pPlanes; |
---|
470 | |
---|
471 | int m_iNumNodes; |
---|
472 | Q3BspNode *m_pNodes; |
---|
473 | |
---|
474 | int m_iNumLeafBrushes; |
---|
475 | int *m_pLeafBrushes; |
---|
476 | |
---|
477 | int m_iNumBrushes; |
---|
478 | Q3BspBrush *m_pBrushes; |
---|
479 | |
---|
480 | int m_iNumBrushSides; |
---|
481 | Q3BspBrushSide *m_pBrushSides; |
---|
482 | |
---|
483 | int m_iNumLightMaps; |
---|
484 | Q3BspLightMap *m_pLightMaps; |
---|
485 | |
---|
486 | Q3BspVisData *m_VisData; |
---|
487 | |
---|
488 | int m_iNumSubZones ; |
---|
489 | BZN_SubZone_t *m_pSubZones; |
---|
490 | |
---|
491 | int m_iNumPortals ; |
---|
492 | BZN_Portal_t *m_pPortals; |
---|
493 | |
---|
494 | |
---|
495 | |
---|
496 | |
---|
497 | int m_ClusterCount ; |
---|
498 | |
---|
499 | void swizzleCoords(void); |
---|
500 | void swizzleFloat3(float t[3]); |
---|
501 | void swizzleInt3(int t[3]); |
---|
502 | |
---|
503 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
---|
504 | |
---|
505 | // memory management for the triangles |
---|
506 | int AllocateTriangleMemory(void) ; |
---|
507 | void FreeTriangleMemory(void) ; |
---|
508 | int ExpandTriangleMemory(void) ; |
---|
509 | int AddTriangle(triangle_t Triangle) ; |
---|
510 | int m_nTriangleSize ; // starting memory size |
---|
511 | void* m_pTriangleMem ; // allocate starting memory space |
---|
512 | triangle_t* m_pTriangle ; // a pointer to the memory cast as a triangle_t |
---|
513 | int m_nTriangleMax ; |
---|
514 | int m_nTriangleLimit ; |
---|
515 | |
---|
516 | // memory management for the vertices |
---|
517 | int AllocateVertexMemory(int nVertNum) ; |
---|
518 | void FreeVertexMemory(void) ; |
---|
519 | int ExpandVertexMemory(void) ; |
---|
520 | int AddVertex(Q3BspVertex Vertex) ; |
---|
521 | int m_nVertexSize ; // starting memory size |
---|
522 | void* m_pVertexMem ; // allocate starting memory space |
---|
523 | Q3BspVertex* m_pVertex ; // a pointer to the memory cast as a Q3BspVertex |
---|
524 | int m_nVertexMax ; |
---|
525 | int m_nVertexLimit ; |
---|
526 | |
---|
527 | // memory management for the lights |
---|
528 | int AllocateLightMemory(void) ; |
---|
529 | void FreeLightMemory(void) ; |
---|
530 | int ExpandLightMemory(void) ; |
---|
531 | int AddLight(light_t Light) ; |
---|
532 | int m_nLightSize ; // starting memory size |
---|
533 | void* m_pLightMem ; // allocate starting memory space |
---|
534 | light_t* m_pLight ; // a pointer to the memory cast as a light_t |
---|
535 | int m_nLightMax ; |
---|
536 | int m_nLightLimit ; |
---|
537 | |
---|
538 | // memory management for the lamps (a lamp is a deferred shading non-shadowing point light) |
---|
539 | int AllocateLampMemory(void) ; |
---|
540 | void FreeLampMemory(void) ; |
---|
541 | int ExpandLampMemory(void) ; |
---|
542 | int AddLamp(lamp_t Lamp) ; |
---|
543 | int m_nLampSize ; // starting memory size |
---|
544 | void* m_pLampMem ; // allocate starting memory space |
---|
545 | lamp_t* m_pLamp ; // a pointer to the memory cast as a lamp_t |
---|
546 | int m_nLampMax ; |
---|
547 | int m_nLampLimit ; |
---|
548 | |
---|
549 | // memory management for the textures |
---|
550 | int AllocateTextureMemory(void) ; |
---|
551 | void FreeTextureMemory(void) ; |
---|
552 | int ExpandTextureMemory(void) ; |
---|
553 | int AddTexture(Q3BspTexture Texture) ; |
---|
554 | int AddTextureUnique(Q3BspTexture Texture) ; // special version of the Add function, will not add if the texture name already exist. returns texture index, or -1 on fail |
---|
555 | int m_nTextureSize ; // starting memory size |
---|
556 | void* m_pTextureMem ; // allocate starting memory space |
---|
557 | Q3BspTexture* m_pTexture ; // a pointer to the memory cast as a Texture_t |
---|
558 | int m_nTextureMax ; |
---|
559 | int m_nTextureLimit ; |
---|
560 | |
---|
561 | // memory management for the TexLamp Triangles |
---|
562 | int AllocateTexLampMemory(void) ; |
---|
563 | void FreeTexLampMemory(void) ; |
---|
564 | int ExpandTexLampMemory(void) ; |
---|
565 | int AddTexLamp(int TexLamp) ; |
---|
566 | int m_nTexLampSize ; // starting memory size |
---|
567 | void* m_pTexLampMem ; // allocate starting memory space |
---|
568 | int* m_pTexLamp ; // a pointer to the memory cast as an int |
---|
569 | int m_nTexLampMax ; |
---|
570 | int m_nTexLampLimit ; |
---|
571 | |
---|
572 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
---|
573 | |
---|
574 | |
---|
575 | int ParseEntities(void) ; |
---|
576 | int NextEntity(int* pPos, int nMaxPos) ; |
---|
577 | int GetEntityType(int nPos, int nMaxPos) ; |
---|
578 | int GetEntityKeyAndValue(int* pPos, int nMaxPos, char* pKey, char* pValue) ; |
---|
579 | int GetNumbersFromValue(char* pValue, float *pNumber, int nNumberSize) ; |
---|
580 | int GetNumbersFromValue(char* pValue, int *pNumber, int nNumberSize) ; |
---|
581 | int ParseAndAddLight(int* pPos, int nMaxPos) ; |
---|
582 | |
---|
583 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
---|
584 | |
---|
585 | Q3BspFaceRenderer *m_BspFaces; |
---|
586 | int m_NumBspFaces; |
---|
587 | void DestroyBspFacesMemory(void) ; |
---|
588 | int initFaces(void) ; |
---|
589 | |
---|
590 | // we keep track of common texture indexes to avoid slow calls to AddTextureUnique when we add default light texture indexes |
---|
591 | int m_nDefaultTextureIndexLamp ; |
---|
592 | int m_nDefaultTextureIndexLamp2Pass ; |
---|
593 | int m_nDefaultTextureIndexGlowLamp ; |
---|
594 | int m_nDefaultTextureIndexGlowLight ; |
---|
595 | int m_nDefaultTextureIndexSpotlight ; |
---|
596 | |
---|
597 | void GetTexLampTextureNumbers() ; |
---|
598 | int m_nBZN_LightNode0 ; |
---|
599 | int m_nBZN_LightNode1 ; |
---|
600 | int m_nBZN_LightNode2 ; |
---|
601 | int m_nBZN_LightNode3 ; |
---|
602 | |
---|
603 | int m_nGroup ; |
---|
604 | |
---|
605 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
---|
606 | // |
---|
607 | // Much easier to keep track of how zones/subzones/portals/lights connect to each other using hardwired arrays |
---|
608 | // than dynamically allocated memory, even if it does waste a little space and impose some design limits. |
---|
609 | // It's fast, easy to manage, and the total memory used is reasonably small. |
---|
610 | // The design limits are generous enough that it's unlikely maps will get anywhere near hitting them. |
---|
611 | // |
---|
612 | // Memory Footprints: |
---|
613 | // |
---|
614 | // m_nZone: 4096 * (16+1) * sizeof(unsigned short) = 139,264 |
---|
615 | // m_ZoneBoundary 4096 * sizeof(minmax_t)24 = 98,304 |
---|
616 | // m_nZoneTouchesPortal 4096 * (64+1) * sizeof(unsigned short) = 532,480 |
---|
617 | // m_nPortalTouchesZone 32768 * ( 8+1) * sizeof(unsigned short) = 589,824 |
---|
618 | // |
---|
619 | // m_nZoneContainsLightCentre 4096 * (64+1) * sizeof(unsigned short) = 532,480 |
---|
620 | // m_nLightTouchesZone 32768 * ( 8+1) * sizeof(unsigned short) = 589,824 |
---|
621 | // m_nZoneTouchesSubLight 4096 * (64+1) * sizeof(unsigned short) = 532,480 |
---|
622 | // |
---|
623 | // m_nMultiZoneLight 32768 * sizeof(unsigned short) = 65,536 |
---|
624 | // m_SubLight 32768 * 8 * sizeof(sublight_t)28 = 6,815,744 |
---|
625 | // m_nZoneTouchesZone 4096 * (64+1) * sizeof(unsigned short) = 532,480 |
---|
626 | // |
---|
627 | // TOTAL = 10,428,416 (9.9 meg) |
---|
628 | |
---|
629 | unsigned short m_nZone[MAX_ZONE][MAX_SUBZONEPERZONE+1] ; // last index is used as a counter, INDEX_SUBZONECOUNT |
---|
630 | minmax_t m_ZoneBoundary[MAX_ZONE] ; // min and max of a zone. Since zones might not be square, NEVER use this as the real zone boundary, work it out using the subzones instead. This is just for cutting up lights. |
---|
631 | |
---|
632 | unsigned short m_nZoneTouchesPortal[MAX_ZONE][MAX_PORTALPERZONE+1] ; // last index is used as a counter, INDEX_PORTALCOUNT |
---|
633 | unsigned short m_nPortalTouchesZone[MAX_PORTAL][MAX_ZONEPERPORTAL+1] ; // last index is used as a counter, INDEX_PORTALZONECOUNT |
---|
634 | |
---|
635 | // PortalTouchesLight is true if the light AABB touches the portal. |
---|
636 | unsigned short m_nPortalTouchesLight[MAX_PORTAL][MAX_LIGHTPERPORTAL+1] ; // last index is used as a counter, INDEX_PORTALLIGHTCOUNT |
---|
637 | |
---|
638 | unsigned short m_nZoneContainsLightCentre[MAX_ZONE][MAX_LIGHTPERZONE+1] ; // last index is used as a counter, INDEX_LIGHTCOUNT |
---|
639 | unsigned short m_nLightTouchesZone[MAX_LIGHT][MAX_ZONEPERLIGHT+1] ; // last index is used as a counter, INDEX_LIGHTZONECOUNT |
---|
640 | unsigned short m_nZoneTouchesSubLight[MAX_ZONE][MAX_LIGHTPERZONE+1] ; // last index is used as a counter, INDEX_LIGHTCOUNT |
---|
641 | |
---|
642 | unsigned short m_nZoneTouchesZone[MAX_ZONE][MAX_ZONEPERZONE+1] ; // last index is used as a counter, INDEX_ZONEPERZONECOUNT |
---|
643 | |
---|
644 | // list of lights that touche more than one zone. These require more complex visibility checks |
---|
645 | unsigned short m_nMultiZoneLight[MAX_LIGHT] ; |
---|
646 | int m_nMaxMultiZoneLight ; |
---|
647 | |
---|
648 | sublight_t m_SubLight[MAX_SUBLIGHT] ; |
---|
649 | int m_nSubLightMax ; |
---|
650 | |
---|
651 | |
---|
652 | // |
---|
653 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
---|
654 | |
---|
655 | |
---|
656 | int m_nMaxZone ; |
---|
657 | |
---|
658 | int ConvertFacesToTriangles(void) ; |
---|
659 | int ConvertPatchesToTriangles(void) ; |
---|
660 | int ConvertTexLampsToLampTriangles(void) ; |
---|
661 | int ConvertLampsToTriangles(void) ; |
---|
662 | int ConvertLampsToGlowTriangles(void) ; |
---|
663 | int ConvertLightsToGlowTriangles(void) ; |
---|
664 | |
---|
665 | |
---|
666 | void SetVertex(Q3BspVertex *pVert, float flXPos, float flYPos, float flZPos) ; |
---|
667 | bool VectorsAreEqual(Q3BspVertex* pVecA, Q3BspVertex* pVecB) ; |
---|
668 | Q3BspVertex NormalizedCrossProduct(Q3BspVertex VertA, Q3BspVertex VertB, Q3BspVertex VertC) ; |
---|
669 | float VertexDistance(Q3BspVertex* VertA, Q3BspVertex* VertB) ; |
---|
670 | void VertexScale(Q3BspVertex* pVert, float flScale) ; |
---|
671 | Q3BspVertex GetNormalised(Q3BspVertex* pVector) ; |
---|
672 | Q3BspVertex VectorAdd(Q3BspVertex* pVecA, Q3BspVertex* pVecB) ; |
---|
673 | Q3BspVertex VectorSubtract(Q3BspVertex* pVecA, Q3BspVertex* pVecB) ; |
---|
674 | Q3BspVertex VectorMultiply(Q3BspVertex* pVecA, Q3BspVertex* pVecB) ; |
---|
675 | |
---|
676 | void SetupZones(void) ; |
---|
677 | int GetNextSubZone(float *flPoint, int nStart, int nMax) ; |
---|
678 | |
---|
679 | bool PointInSubZone(float *flPoint, int nSubZone) ; |
---|
680 | bool PointInZone(float *flPos, int nZone) ; |
---|
681 | |
---|
682 | bool AABBTouchesSubZone(float *flPointMin, float *flPointMax, int nSubZone) ; |
---|
683 | bool AABBTouchesZone(float *flPosMin, float *flPosMax, int nZone) ; |
---|
684 | |
---|
685 | int AssignTrianglesToZones(void) ; |
---|
686 | int FindTriangleZone(int nTriangle) ; |
---|
687 | int SetupTriangleZone(int nTriangle) ; |
---|
688 | int SplitTriangle(int nTriangle, int nAxis, float flCutPos) ; // only does axial cuts. returns false on failure, probably due to lack of memory. |
---|
689 | void CreateTweenVert(Q3BspVertex* pVertA, Q3BspVertex* pVertB, float flPercent0, Q3BspVertex* pVertAB) ; |
---|
690 | |
---|
691 | |
---|
692 | int SortTrianglesIntoGroups(void) ; |
---|
693 | static int compareGroups( const void *arg1, const void *arg2 ) ; |
---|
694 | |
---|
695 | int SortTrianglesIntoBatches(void) ; |
---|
696 | static int compareTriangles( const void *arg1, const void *arg2 ) ; |
---|
697 | |
---|
698 | int SetupTransTextures(void) ; |
---|
699 | int* m_pTransTexture ; |
---|
700 | |
---|
701 | |
---|
702 | int AssignPortalsToZones(void) ; |
---|
703 | int AssignLightsToPortals(void) ; |
---|
704 | int AssignLightsToZones(void) ; |
---|
705 | int AssignZonesToZones(void) ; |
---|
706 | |
---|
707 | }; |
---|
708 | |
---|
709 | #endif /* _Q3MAP_H */ |
---|