1 // "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman
2 // Ken Silverman's official web site: "http://www.advsys.net/ken"
3 // See the included license file "BUILDLIC.TXT" for license info.
4 //
5 // This file has been modified from Ken Silverman's original release
6 // by Jonathon Fowler (jf@jonof.id.au)
7 
8 
9 #ifndef __build_h__
10 #define __build_h__
11 
12 #ifndef USE_POLYMOST
13 #  define USE_POLYMOST 0
14 #endif
15 #ifndef USE_OPENGL
16 #  define USE_OPENGL 0
17 #endif
18 #define USE_GL2 2
19 #define USE_GL3 3
20 #define USE_GLES2 12
21 
22 #include "compat.h"
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 #define MAXSECTORSV8 4096
29 #define MAXWALLSV8 16384
30 #define MAXSPRITESV8 16384
31 
32 #define MAXSECTORSV7 1024
33 #define MAXWALLSV7 8192
34 #define MAXSPRITESV7 4096
35 
36 #define MAXSECTORSV6 1024
37 #define MAXWALLSV6   8192
38 #define MAXSPRITESV6 4096
39 #define MAXTILESV6   4096
40 
41 #define MAXSECTORSV5 1024
42 #define MAXWALLSV5   4096
43 #define MAXSPRITESV5 4096
44 #define MAXTILESV5   4096
45 
46 #define MAXSECTORS MAXSECTORSV8
47 #define MAXWALLS MAXWALLSV8
48 #define MAXSPRITES MAXSPRITESV8
49 
50 #define MAXTILES 9216
51 #define MAXVOXELS 4096
52 #define MAXSTATUS 1024
53 #define MAXPLAYERS 16
54 #define MAXXDIM 2880
55 #define MAXYDIM 1800
56 #define MAXPALOOKUPS 256
57 #define MAXPSKYTILES 256
58 #define MAXSPRITESONSCREEN 1024
59 #define MAXUNIQHUDID 256 //Extra slots so HUD models can store animation state without messing game sprites
60 
61 #define CLIPMASK0 (((1L)<<16)+1L)
62 #define CLIPMASK1 (((256L)<<16)+64L)
63 
64 	//Make all variables in BUILD.H defined in the ENGINE,
65 	//and externed in GAME
66 #ifdef ENGINE
67 #  define EXTERN
68 #else
69 #  define EXTERN extern
70 #endif
71 
72 #ifdef __GNUC__
73 #  if __GNUC__ == 4 && __GNUC_MINOR__ >= 7
74 #    define BPACK __attribute__ ((packed, gcc_struct))
75 #  else
76 #    define BPACK __attribute__ ((packed))
77 #  endif
78 #else
79 #define BPACK
80 #endif
81 
82 #ifdef _MSC_VER
83 #pragma pack(1)
84 #endif
85 
86 #ifdef __WATCOMC__
87 #pragma pack(push,1);
88 #endif
89 
90 
91 //ceilingstat/floorstat:
92 //   bit 0: 1 = parallaxing, 0 = not                                 "P"
93 //   bit 1: 1 = groudraw, 0 = not
94 //   bit 2: 1 = swap x&y, 0 = not                                    "F"
95 //   bit 3: 1 = double smooshiness                                   "E"
96 //   bit 4: 1 = x-flip                                               "F"
97 //   bit 5: 1 = y-flip                                               "F"
98 //   bit 6: 1 = Align texture to first wall of sector                "R"
99 //   bits 7-8:                                                       "T"
100 //          00 = normal floors
101 //          01 = masked floors
102 //          10 = transluscent masked floors
103 //          11 = reverse transluscent masked floors
104 //   bits 9-15: reserved
105 
106 	//40 bytes
107 typedef struct
108 {
109 	short wallptr, wallnum;
110 	int ceilingz, floorz;
111 	short ceilingstat, floorstat;
112 	short ceilingpicnum, ceilingheinum;
113 	signed char ceilingshade;
114 	unsigned char ceilingpal, ceilingxpanning, ceilingypanning;
115 	short floorpicnum, floorheinum;
116 	signed char floorshade;
117 	unsigned char floorpal, floorxpanning, floorypanning;
118 	unsigned char visibility, filler;
119 	short lotag, hitag, extra;
120 } sectortype;
121 
122 //cstat:
123 //   bit 0: 1 = Blocking wall (use with clipmove, getzrange)         "B"
124 //   bit 1: 1 = bottoms of invisible walls swapped, 0 = not          "2"
125 //   bit 2: 1 = align picture on bottom (for doors), 0 = top         "O"
126 //   bit 3: 1 = x-flipped, 0 = normal                                "F"
127 //   bit 4: 1 = masking wall, 0 = not                                "M"
128 //   bit 5: 1 = 1-way wall, 0 = not                                  "1"
129 //   bit 6: 1 = Blocking wall (use with hitscan / cliptype 1)        "H"
130 //   bit 7: 1 = Transluscence, 0 = not                               "T"
131 //   bit 8: 1 = y-flipped, 0 = normal                                "F"
132 //   bit 9: 1 = Transluscence reversing, 0 = normal                  "T"
133 //   bits 10-15: reserved
134 
135 	//32 bytes
136 typedef struct
137 {
138 	int x, y;
139 	short point2, nextwall, nextsector, cstat;
140 	short picnum, overpicnum;
141 	signed char shade;
142 	unsigned char pal, xrepeat, yrepeat, xpanning, ypanning;
143 	short lotag, hitag, extra;
144 } walltype;
145 
146 //cstat:
147 //   bit 0: 1 = Blocking sprite (use with clipmove, getzrange)       "B"
148 //   bit 1: 1 = transluscence, 0 = normal                            "T"
149 //   bit 2: 1 = x-flipped, 0 = normal                                "F"
150 //   bit 3: 1 = y-flipped, 0 = normal                                "F"
151 //   bits 5-4: 00 = FACE sprite (default)                            "R"
152 //             01 = WALL sprite (like masked walls)
153 //             10 = FLOOR sprite (parallel to ceilings&floors)
154 //   bit 6: 1 = 1-sided sprite, 0 = normal                           "1"
155 //   bit 7: 1 = Real centered centering, 0 = foot center             "C"
156 //   bit 8: 1 = Blocking sprite (use with hitscan / cliptype 1)      "H"
157 //   bit 9: 1 = Transluscence reversing, 0 = normal                  "T"
158 //   bits 10-14: reserved
159 //   bit 15: 1 = Invisible sprite, 0 = not invisible
160 
161 	//44 bytes
162 typedef struct
163 {
164 	int x, y, z;
165 	short cstat, picnum;
166 	signed char shade;
167 	unsigned char pal, clipdist, filler;
168 	unsigned char xrepeat, yrepeat;
169 	signed char xoffset, yoffset;
170 	short sectnum, statnum;
171 	short ang, owner, xvel, yvel, zvel;
172 	short lotag, hitag, extra;
173 } spritetype;
174 
175 	// 12 bytes
176 typedef struct {
177 	unsigned int mdanimtims;
178 	short mdanimcur;
179 	short angoff;
180 	unsigned char flags;
181 	char filler[3];
182 } spriteexttype;
183 #define SPREXT_NOTMD 1
184 #define SPREXT_NOMDANIM 2
185 
186 EXTERN sectortype sector[MAXSECTORS];
187 EXTERN walltype wall[MAXWALLS];
188 EXTERN spritetype sprite[MAXSPRITES];
189 EXTERN spriteexttype spriteext[MAXSPRITES+MAXUNIQHUDID];
190 EXTERN int guniqhudid;
191 
192 EXTERN int spritesortcnt;
193 EXTERN spritetype tsprite[MAXSPRITESONSCREEN];
194 
195 //numpages==127 means no persistence. Permanent rotatesprites will be retained until flushed.
196 //The initial frame contents will be invalid after each swap.
197 EXTERN int xdim, ydim, ylookup[MAXYDIM+1], numpages;
198 EXTERN int yxaspect, xyaspect, pixelaspect, widescreen, tallscreen, viewingrange;
199 
200 #define MAXVALIDMODES 256
201 EXTERN int validmodecnt;
202 struct validmode_t {
203 	int xdim,ydim;
204 	unsigned char bpp;
205 	unsigned char fs;	// bit 0 = fullscreen flag
206 	char filler[2];
207 	int extra;	// internal use
208 };
209 EXTERN struct validmode_t validmode[MAXVALIDMODES];
210 
211 EXTERN short numsectors, numwalls;
212 EXTERN /*volatile*/ int totalclock;
213 EXTERN int numframes, randomseed;
214 EXTERN short sintable[2048];
215 EXTERN unsigned char palette[768];
216 EXTERN short numpalookups;
217 EXTERN unsigned char *palookup[MAXPALOOKUPS];
218 EXTERN unsigned char parallaxtype, showinvisibility;
219 EXTERN int parallaxyoffs, parallaxyscale;
220 EXTERN int visibility, parallaxvisibility;
221 
222 EXTERN int windowx1, windowy1, windowx2, windowy2;
223 EXTERN short startumost[MAXXDIM], startdmost[MAXXDIM];
224 
225 EXTERN short pskyoff[MAXPSKYTILES], pskybits;
226 
227 EXTERN short headspritesect[MAXSECTORS+1], headspritestat[MAXSTATUS+1];
228 EXTERN short prevspritesect[MAXSPRITES], prevspritestat[MAXSPRITES];
229 EXTERN short nextspritesect[MAXSPRITES], nextspritestat[MAXSPRITES];
230 
231 EXTERN short tilesizx[MAXTILES], tilesizy[MAXTILES];
232 EXTERN unsigned char walock[MAXTILES];
233 EXTERN int numtiles, picanm[MAXTILES];
234 EXTERN intptr_t waloff[MAXTILES];
235 
236 	//These variables are for auto-mapping with the draw2dscreen function.
237 	//When you load a new board, these bits are all set to 0 - since
238 	//you haven't mapped out anything yet.  Note that these arrays are
239 	//bit-mapped.
240 	//If you want draw2dscreen() to show sprite #54 then you say:
241 	//   spritenum = 54;
242 	//   show2dsprite[spritenum>>3] |= (1<<(spritenum&7));
243 	//And if you want draw2dscreen() to not show sprite #54 then you say:
244 	//   spritenum = 54;
245 	//   show2dsprite[spritenum>>3] &= ~(1<<(spritenum&7));
246 	//Automapping defaults to 0 (do nothing).  If you set automapping to 1,
247 	//   then in 3D mode, the walls and sprites that you see will show up the
248 	//   next time you flip to 2D mode.
249 
250 EXTERN unsigned char show2dsector[(MAXSECTORS+7)>>3];
251 EXTERN unsigned char show2dwall[(MAXWALLS+7)>>3];
252 EXTERN unsigned char show2dsprite[(MAXSPRITES+7)>>3];
253 EXTERN unsigned char automapping;
254 
255 EXTERN unsigned char gotpic[(MAXTILES+7)>>3];
256 EXTERN unsigned char gotsector[(MAXSECTORS+7)>>3];
257 
258 EXTERN int captureformat;
259 extern unsigned char vgapalette[5*256];
260 extern unsigned int drawlinepat;
261 
262 extern void faketimerhandler(void);
263 
264 typedef struct {
265 	unsigned char r,g,b,f;
266 } palette_t;
267 extern palette_t curpalette[256], curpalettefaded[256], palfadergb;
268 extern unsigned char palfadedelta;
269 
270 extern int dommxoverlay, novoxmips;
271 
272 extern int tiletovox[MAXTILES];
273 extern int usevoxels, voxscale[MAXVOXELS];
274 #if USE_POLYMOST && USE_OPENGL
275 extern int usemodels, usehightile;
276 #endif
277 
278 extern char *engineerrstr;
279 extern const char *build_version, *build_date, *build_time;
280 
281 /*************************************************************************
282 POSITION VARIABLES:
283 
284 		POSX is your x - position ranging from 0 to 65535
285 		POSY is your y - position ranging from 0 to 65535
286 			(the length of a side of the grid in EDITBORD would be 1024)
287 		POSZ is your z - position (height) ranging from 0 to 65535, 0 highest.
288 		ANG is your angle ranging from 0 to 2047.  Instead of 360 degrees, or
289 			 2 * PI radians, I use 2048 different angles, so 90 degrees would
290 			 be 512 in my system.
291 
292 SPRITE VARIABLES:
293 
294 	EXTERN short headspritesect[MAXSECTORS+1], headspritestat[MAXSTATUS+1];
295 	EXTERN short prevspritesect[MAXSPRITES], prevspritestat[MAXSPRITES];
296 	EXTERN short nextspritesect[MAXSPRITES], nextspritestat[MAXSPRITES];
297 
298 	Example: if the linked lists look like the following:
299 		 ⁄ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒø
300 		 ≥      Sector lists:               Status lists:               ≥
301 		 √ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ¥
302 		 ≥  Sector0:  4, 5, 8             Status0:  2, 0, 8             ≥
303 		 ≥  Sector1:  16, 2, 0, 7         Status1:  4, 5, 16, 7, 3, 9   ≥
304 		 ≥  Sector2:  3, 9                                              ≥
305 		 ¿ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒŸ
306 	Notice that each number listed above is shown exactly once on both the
307 		left and right side.  This is because any sprite that exists must
308 		be in some sector, and must have some kind of status that you define.
309 
310 
311 Coding example #1:
312 	To go through all the sprites in sector 1, the code can look like this:
313 
314 		sectnum = 1;
315 		i = headspritesect[sectnum];
316 		while (i != -1)
317 		{
318 			nexti = nextspritesect[i];
319 
320 			//your code goes here
321 			//ex: printf("Sprite %d is in sector %d\n",i,sectnum);
322 
323 			i = nexti;
324 		}
325 
326 Coding example #2:
327 	To go through all sprites with status = 1, the code can look like this:
328 
329 		statnum = 1;        //status 1
330 		i = headspritestat[statnum];
331 		while (i != -1)
332 		{
333 			nexti = nextspritestat[i];
334 
335 			//your code goes here
336 			//ex: printf("Sprite %d has a status of 1 (active)\n",i,statnum);
337 
338 			i = nexti;
339 		}
340 
341 			 insertsprite(short sectnum, short statnum);
342 			 deletesprite(short spritenum);
343 			 changespritesect(short spritenum, short newsectnum);
344 			 changespritestat(short spritenum, short newstatnum);
345 
346 TILE VARIABLES:
347 		NUMTILES - the number of tiles found TILES.DAT.
348 		TILESIZX[MAXTILES] - simply the x-dimension of the tile number.
349 		TILESIZY[MAXTILES] - simply the y-dimension of the tile number.
350 		WALOFF[MAXTILES] - the actual 32-bit offset pointing to the top-left
351 								 corner of the tile.
352 		PICANM[MAXTILES] - flags for animating the tile.
353 
354 TIMING VARIABLES:
355 		TOTALCLOCK - When the engine is initialized, TOTALCLOCK is set to zero.
356 			From then on, it is incremented 120 times a second by 1.  That
357 			means that the number of seconds elapsed is totalclock / 120.
358 		NUMFRAMES - The number of times the draw3dscreen function was called
359 			since the engine was initialized.  This helps to determine frame
360 			rate.  (Frame rate = numframes * 120 / totalclock.)
361 
362 OTHER VARIABLES:
363 
364 		STARTUMOST[320] is an array of the highest y-coordinates on each column
365 				that my engine is allowed to write to.  You need to set it only
366 				once.
367 		STARTDMOST[320] is an array of the lowest y-coordinates on each column
368 				that my engine is allowed to write to.  You need to set it only
369 				once.
370 		SINTABLE[2048] is a sin table with 2048 angles rather than the
371 			normal 360 angles for higher precision.  Also since SINTABLE is in
372 			all integers, the range is multiplied by 16383, so instead of the
373 			normal -1<sin(x)<1, the range of sintable is -16383<sintable[]<16383
374 			If you use this sintable, you can possibly speed up your code as
375 			well as save space in memory.  If you plan to use sintable, 2
376 			identities you may want to keep in mind are:
377 				sintable[ang&2047]       = sin(ang * (3.141592/1024)) * 16383
378 				sintable[(ang+512)&2047] = cos(ang * (3.141592/1024)) * 16383
379 		NUMSECTORS - the total number of existing sectors.  Modified every time
380 			you call the loadboard function.
381 ***************************************************************************/
382 
383 int    preinitengine(void);	// a partial setup of the engine used for launch windows
384 int    initengine(void);
385 void   uninitengine(void);
386 void   initspritelists(void);
387 int   loadboard(char *filename, char fromwhere, int *daposx, int *daposy, int *daposz, short *daang, short *dacursectnum);
388 int   loadmaphack(char *filename);
389 int   saveboard(char *filename, int *daposx, int *daposy, int *daposz, short *daang, short *dacursectnum);
390 int   saveoldboard(char *filename, int *daposx, int *daposy, int *daposz, short *daang, short *dacursectnum);
391 int   loadpics(char *filename, int askedsize);
392 void   loadtile(short tilenume);
393 int   qloadkvx(int voxindex, char *filename);
394 int   allocatepermanenttile(short tilenume, int xsiz, int ysiz);
395 void   copytilepiece(int tilenume1, int sx1, int sy1, int xsiz, int ysiz, int tilenume2, int sx2, int sy2);
396 int    makepalookup(int palnum, unsigned char *remapbuf, signed char r, signed char g, signed char b, unsigned char dastat);
397 void   setvgapalette(void);
398 void   setbrightness(int dabrightness, unsigned char *dapal, char noapply);
399 void   setpalettefade(unsigned char r, unsigned char g, unsigned char b, unsigned char offset);
400 void   squarerotatetile(short tilenume);
401 
402 int   setgamemode(char davidoption, int daxdim, int daydim, int dabpp);
403 void   nextpage(void);
404 void   setview(int x1, int y1, int x2, int y2);
405 void   setaspect(int daxrange, int daaspect);
406 void   flushperms(void);
407 
408 void   plotpixel(int x, int y, unsigned char col);
409 unsigned char   getpixel(int x, int y);
410 void   setviewtotile(short tilenume, int xsiz, int ysiz);
411 void   setviewback(void);
412 void   preparemirror(int dax, int day, int daz, short daang, int dahoriz, short dawall, short dasector, int *tposx, int *tposy, short *tang);
413 void   completemirror(void);
414 
415 void   drawrooms(int daposx, int daposy, int daposz, short daang, int dahoriz, short dacursectnum);
416 void   drawmasks(void);
417 void   clearview(int dacol);
418 void   clearallviews(int dacol);
419 void   drawmapview(int dax, int day, int zoome, short ang);
420 void   rotatesprite(int sx, int sy, int z, short a, short picnum, signed char dashade, unsigned char dapalnum, unsigned char dastat, int cx1, int cy1, int cx2, int cy2);
421 void   drawline256(int x1, int y1, int x2, int y2, unsigned char col);
422 void   printext16(int xpos, int ypos, short col, short backcol, const char *name, char fontsize);
423 void   printext256(int xpos, int ypos, short col, short backcol, const char *name, char fontsize);
424 
425 int   clipmove(int *x, int *y, int *z, short *sectnum, int xvect, int yvect, int walldist, int ceildist, int flordist, unsigned int cliptype);
426 int   clipinsidebox(int x, int y, short wallnum, int walldist);
427 int   clipinsideboxline(int x, int y, int x1, int y1, int x2, int y2, int walldist);
428 int   pushmove(int *x, int *y, int *z, short *sectnum, int walldist, int ceildist, int flordist, unsigned int cliptype);
429 void   getzrange(int x, int y, int z, short sectnum, int *ceilz, int *ceilhit, int *florz, int *florhit, int walldist, unsigned int cliptype);
430 int    hitscan(int xs, int ys, int zs, short sectnum, int vx, int vy, int vz, short *hitsect, short *hitwall, short *hitsprite, int *hitx, int *hity, int *hitz, unsigned int cliptype);
431 int   neartag(int xs, int ys, int zs, short sectnum, short ange, short *neartagsector, short *neartagwall, short *neartagsprite, int *neartaghitdist, int neartagrange, unsigned char tagsearch);
432 int   cansee(int x1, int y1, int z1, short sect1, int x2, int y2, int z2, short sect2);
433 void   updatesector(int x, int y, short *sectnum);
434 void   updatesectorz(int x, int y, int z, short *sectnum);
435 int   inside(int x, int y, short sectnum);
436 void   dragpoint(short pointhighlight, int dax, int day);
437 void   setfirstwall(short sectnum, short newfirstwall);
438 
439 void   getmousevalues(int *mousx, int *mousy, int *bstatus);
440 int    krand(void);
441 int   ksqrt(int num);
442 int   getangle(int xvect, int yvect);
443 void   rotatepoint(int xpivot, int ypivot, int x, int y, short daang, int *x2, int *y2);
444 int   lastwall(short point);
445 int   nextsectorneighborz(short sectnum, int thez, short topbottom, short direction);
446 int   getceilzofslope(short sectnum, int dax, int day);
447 int   getflorzofslope(short sectnum, int dax, int day);
448 void   getzsofslope(short sectnum, int dax, int day, int *ceilz, int *florz);
449 void   alignceilslope(short dasect, int x, int y, int z);
450 void   alignflorslope(short dasect, int x, int y, int z);
451 int   sectorofwall(short theline);
452 int   loopnumofsector(short sectnum, short wallnum);
453 
454 int   insertsprite(short sectnum, short statnum);
455 int   deletesprite(short spritenum);
456 int   changespritesect(short spritenum, short newsectnum);
457 int   changespritestat(short spritenum, short newstatnum);
458 int   setsprite(short spritenum, int newx, int newy, int newz);
459 int   setspritez(short spritenum, int newx, int newy, int newz);
460 
461 int   screencapture(char *filename, char mode);	// mode&1 == invert, mode&2 == wait for nextpage
462 
463 #define STATUS2DSIZ 144
464 void   qsetmode640350(void);
465 void   qsetmode640480(void);
466 void   qsetmodeany(int,int);
467 void   clear2dscreen(void);
468 void   draw2dgrid(int posxe, int posye, short ange, int zoome, short gride);
469 void   draw2dscreen(int posxe, int posye, short ange, int zoome, short gride);
470 void   drawline16(int x1, int y1, int x2, int y2, unsigned char col);
471 void   drawcircle16(int x1, int y1, int r, unsigned char col);
472 
473 #if USE_POLYMOST
474 int   setrendermode(int renderer);
475 int   getrendermode(void);
476 # define POLYMOST_RENDERMODE_CLASSIC() (getrendermode() == 0)
477 # define POLYMOST_RENDERMODE_POLYMOST() (getrendermode() > 0)
478 # define POLYMOST_RENDERMODE_POLYGL() (getrendermode() == 3)
479 
480 void    setrollangle(int rolla);
481 #else
482 # define POLYMOST_RENDERMODE_CLASSIC() (1)
483 # define POLYMOST_RENDERMODE_POLYMOST() (0)
484 # define POLYMOST_RENDERMODE_POLYGL() (0)
485 #endif
486 
487 #if USE_POLYMOST && USE_OPENGL
488 //  pal: pass -1 to invalidate all palettes for the tile, or >=0 for a particular palette
489 //  how: pass -1 to invalidate all instances of the tile in texture memory, or a bitfield
490 //         bit 0: opaque or masked (non-translucent) texture, using repeating
491 //         bit 1: ignored
492 //         bit 2: 33% translucence, using repeating
493 //         bit 3: 67% translucence, using repeating
494 //         bit 4: opaque or masked (non-translucent) texture, using clamping
495 //         bit 5: ignored
496 //         bit 6: 33% translucence, using clamping
497 //         bit 7: 67% translucence, using clamping
498 //       clamping is for sprites, repeating is for walls
499 void invalidatetile(short tilenume, int pal, int how);
500 
501 void setpolymost2dview(void);   // sets up GL for 2D drawing
502 
503 int polymost_drawtilescreen(int tilex, int tiley, int wallnum, int dimen);
504 void polymost_glreset(void);
505 void polymost_precache_begin(void);
506 void polymost_precache(int dapicnum, int dapalnum, int datype);
507 int  polymost_precache_run(int* done, int* total);
508 
509 extern int glanisotropy;
510 extern int glusetexcompr;
511 extern int gltexfiltermode;
512 extern int glredbluemode;
513 extern int glusetexcache;
514 extern int glmultisample, glnvmultisamplehint;
515 void gltexapplyprops (void);
516 
517 extern int polymosttexfullbright;	// set to the first index of the fullbright palette
518 
519 // effect bitset: 1 = greyscale, 2 = invert
520 void hicsetpalettetint(int palnum, unsigned char r, unsigned char g, unsigned char b, unsigned char effect);
521 // flags bitset: 1 = don't compress
522 int hicsetsubsttex(int picnum, int palnum, char *filen, float alphacut, unsigned char flags);
523 int hicsetskybox(int picnum, int palnum, char *faces[6]);
524 int hicclearsubst(int picnum, int palnum);
525 
526 int md_loadmodel(const char *fn);
527 int md_setmisc(int modelid, float scale, int shadeoff, float zadd);
528 int md_tilehasmodel(int tilenume);
529 int md_defineframe(int modelid, const char *framename, int tilenume, int skinnum);
530 int md_defineanimation(int modelid, const char *framestart, const char *frameend, int fps, int flags);
531 int md_defineskin(int modelid, const char *skinfn, int palnum, int skinnum, int surfnum);
532 int md_definehud (int modelid, int tilex, double xadd, double yadd, double zadd, double angadd, int flags);
533 int md_undefinetile(int tile);
534 int md_undefinemodel(int modelid);
535 
536 #endif //USE_POLYMOST && USE_OPENGL
537 
538 int loaddefinitionsfile(const char *fn);
539 
540 extern int mapversion;	// if loadboard() fails with -2 return, try loadoldboard(). if it fails with -2, board is dodgy
541 int loadoldboard(char *filename, char fromwhere, int *daposx, int *daposy, int *daposz, short *daang, short *dacursectnum);
542 
543 void buildprintf(const char *fmt, ...) PRINTF_FORMAT(1, 2);
544 void buildputs(const char *str);
545 void buildsetlogfile(const char *fn);
546 
547 #ifdef _MSC_VER
548 #pragma pack()
549 #endif
550 
551 #ifdef __WATCOMC__
552 #pragma pack(pop)
553 #endif
554 
555 #undef BPACK
556 
557 #ifdef __cplusplus
558 }
559 #endif
560 
561 #endif // __build_h__
562