|
|
1.1 root 1:
2:
3: // upper design bounds
4:
5: #define MAX_MAP_HULLS 4
6:
7: #define MAX_MAP_MODELS 256
8: #define MAX_MAP_BRUSHES 4096
9: #define MAX_MAP_ENTITIES 1024
10: #define MAX_MAP_ENTSTRING 65536
11:
12: #define MAX_MAP_PLANES 8192
13: #define MAX_MAP_NODES 32767 // because negative shorts are contents
14: #define MAX_MAP_CLIPNODES 32767 //
15: #define MAX_MAP_LEAFS 32767 //
16: #define MAX_MAP_VERTS 65535
17: #define MAX_MAP_FACES 65535
18: #define MAX_MAP_MARKSURFACES 65535
19: #define MAX_MAP_TEXINFO 4096
20: #define MAX_MAP_EDGES 256000
21: #define MAX_MAP_SURFEDGES 512000
22: #define MAX_MAP_MIPTEX 0x200000
23: #define MAX_MAP_LIGHTING 0x100000
24: #define MAX_MAP_VISIBILITY 0x100000
25:
26: // key / value pair sizes
27:
28: #define MAX_KEY 32
29: #define MAX_VALUE 1024
30:
31:
32: //=============================================================================
33:
34:
35: #define BSPVERSION 29
36:
37: typedef struct
38: {
39: int fileofs, filelen;
40: } lump_t;
41:
42: #define LUMP_ENTITIES 0
43: #define LUMP_PLANES 1
44: #define LUMP_TEXTURES 2
45: #define LUMP_VERTEXES 3
46: #define LUMP_VISIBILITY 4
47: #define LUMP_NODES 5
48: #define LUMP_TEXINFO 6
49: #define LUMP_FACES 7
50: #define LUMP_LIGHTING 8
51: #define LUMP_CLIPNODES 9
52: #define LUMP_LEAFS 10
53: #define LUMP_MARKSURFACES 11
54: #define LUMP_EDGES 12
55: #define LUMP_SURFEDGES 13
56: #define LUMP_MODELS 14
57:
58: #define HEADER_LUMPS 15
59:
60: typedef struct
61: {
62: float mins[3], maxs[3];
63: float origin[3];
64: int headnode[MAX_MAP_HULLS];
65: int visleafs; // not including the solid leaf 0
66: int firstface, numfaces;
67: } dmodel_t;
68:
69: typedef struct
70: {
71: int version;
72: lump_t lumps[HEADER_LUMPS];
73: } dheader_t;
74:
75: typedef struct
76: {
77: int nummiptex;
78: int dataofs[4]; // [nummiptex]
79: } dmiptexlump_t;
80:
81: #define MIPLEVELS 4
82: typedef struct miptex_s
83: {
84: char name[16];
85: unsigned width, height;
86: unsigned offsets[MIPLEVELS]; // four mip maps stored
87: } miptex_t;
88:
89:
90: typedef struct
91: {
92: float point[3];
93: } dvertex_t;
94:
95:
96: // 0-2 are axial planes
97: #define PLANE_X 0
98: #define PLANE_Y 1
99: #define PLANE_Z 2
100:
101: // 3-5 are non-axial planes snapped to the nearest
102: #define PLANE_ANYX 3
103: #define PLANE_ANYY 4
104: #define PLANE_ANYZ 5
105:
106: typedef struct
107: {
108: float normal[3];
109: float dist;
110: int type; // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate
111: } dplane_t;
112:
113:
114:
115: #define CONTENTS_EMPTY -1
116: #define CONTENTS_SOLID -2
117: #define CONTENTS_WATER -3
118: #define CONTENTS_SLIME -4
119: #define CONTENTS_LAVA -5
120: #define CONTENTS_SKY -6
121:
122: // !!! if this is changed, it must be changed in asm_i386.h too !!!
123: typedef struct
124: {
125: int planenum;
126: short children[2]; // negative numbers are -(leafs+1), not nodes
127: short mins[3]; // for sphere culling
128: short maxs[3];
129: unsigned short firstface;
130: unsigned short numfaces; // counting both sides
131: } dnode_t;
132:
133: typedef struct
134: {
135: int planenum;
136: short children[2]; // negative numbers are contents
137: } dclipnode_t;
138:
139:
140: typedef struct texinfo_s
141: {
142: float vecs[2][4]; // [s/t][xyz offset]
143: int miptex;
144: int flags;
145: } texinfo_t;
146: #define TEX_SPECIAL 1 // sky or slime, no lightmap or 256 subdivision
147:
148: // note that edge 0 is never used, because negative edge nums are used for
149: // counterclockwise use of the edge in a face
150: typedef struct
151: {
152: unsigned short v[2]; // vertex numbers
153: } dedge_t;
154:
155: #define MAXLIGHTMAPS 4
156: typedef struct
157: {
158: short planenum;
159: short side;
160:
161: int firstedge; // we must support > 64k edges
162: short numedges;
163: short texinfo;
164:
165: // lighting info
166: byte styles[MAXLIGHTMAPS];
167: int lightofs; // start of [numstyles*surfsize] samples
168: } dface_t;
169:
170:
171:
172: #define AMBIENT_WATER 0
173: #define AMBIENT_SKY 1
174: #define AMBIENT_SLIME 2
175: #define AMBIENT_LAVA 3
176:
177: #define NUM_AMBIENTS 4 // automatic ambient sounds
178:
179: // leaf 0 is the generic CONTENTS_SOLID leaf, used for all solid areas
180: // all other leafs need visibility info
181: typedef struct
182: {
183: int contents;
184: int visofs; // -1 = no visibility info
185:
186: short mins[3]; // for frustum culling
187: short maxs[3];
188:
189: unsigned short firstmarksurface;
190: unsigned short nummarksurfaces;
191:
192: byte ambient_level[NUM_AMBIENTS];
193: } dleaf_t;
194:
195: //============================================================================
196:
197: #ifndef QUAKE_GAME
198:
199: // the utilities get to be lazy and just use large static arrays
200:
201: extern int nummodels;
202: extern dmodel_t dmodels[MAX_MAP_MODELS];
203:
204: extern int visdatasize;
205: extern byte dvisdata[MAX_MAP_VISIBILITY];
206:
207: extern int lightdatasize;
208: extern byte dlightdata[MAX_MAP_LIGHTING];
209:
210: extern int texdatasize;
211: extern byte dtexdata[MAX_MAP_MIPTEX]; // (dmiptexlump_t)
212:
213: extern int entdatasize;
214: extern char dentdata[MAX_MAP_ENTSTRING];
215:
216: extern int numleafs;
217: extern dleaf_t dleafs[MAX_MAP_LEAFS];
218:
219: extern int numplanes;
220: extern dplane_t dplanes[MAX_MAP_PLANES];
221:
222: extern int numvertexes;
223: extern dvertex_t dvertexes[MAX_MAP_VERTS];
224:
225: extern int numnodes;
226: extern dnode_t dnodes[MAX_MAP_NODES];
227:
228: extern int numtexinfo;
229: extern texinfo_t texinfo[MAX_MAP_TEXINFO];
230:
231: extern int numfaces;
232: extern dface_t dfaces[MAX_MAP_FACES];
233:
234: extern int numclipnodes;
235: extern dclipnode_t dclipnodes[MAX_MAP_CLIPNODES];
236:
237: extern int numedges;
238: extern dedge_t dedges[MAX_MAP_EDGES];
239:
240: extern int nummarksurfaces;
241: extern unsigned short dmarksurfaces[MAX_MAP_MARKSURFACES];
242:
243: extern int numsurfedges;
244: extern int dsurfedges[MAX_MAP_SURFEDGES];
245:
246:
247:
248: void LoadBSPFile (char *filename);
249: void WriteBSPFile (char *filename);
250: void PrintBSPFileSizes (void);
251:
252: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.