1 #ifndef __ENGINE_H__
2 #define __ENGINE_H__
3
4 #include "cube.h"
5 #include "world.h"
6
7 #ifndef STANDALONE
8
9 #include "octa.h"
10 #include "lightmap.h"
11 #include "bih.h"
12 #include "texture.h"
13 #include "model.h"
14
15 extern dynent *player;
16 extern physent *camera1; // special ent that acts as camera, same object as player1 in FPS mode
17
18 extern int worldscale, worldsize;
19 extern int mapversion;
20 extern char *maptitle;
21 extern vector<ushort> texmru;
22 extern int xtraverts, xtravertsva;
23 extern const ivec cubecoords[8];
24 extern const ivec facecoords[6][4];
25 extern const uchar fv[6][4];
26 extern const uchar fvmasks[64];
27 extern const uchar faceedgesidx[6][4];
28 extern bool inbetweenframes, renderedframe;
29
30 extern SDL_Window *screen;
31 extern int screenw, screenh;
32 extern int zpass;
33
34 extern vector<int> entgroup;
35
36 // rendertext
37 struct font
38 {
39 struct charinfo
40 {
41 short x, y, w, h, offsetx, offsety, advance, tex;
42 };
43
44 char *name;
45 vector<Texture *> texs;
46 vector<charinfo> chars;
47 int charoffset, defaultw, defaulth, scale;
48
fontfont49 font() : name(NULL) {}
~fontfont50 ~font() { DELETEA(name); }
51 };
52
53 #define FONTH (curfont->scale)
54 #define FONTW (FONTH/2)
55 #define MINRESW 640
56 #define MINRESH 480
57
58 extern font *curfont;
59 extern const matrix4x3 *textmatrix;
60
61 extern void reloadfonts();
62
63 // texture
64 extern int hwtexsize, hwcubetexsize, hwmaxaniso, maxtexsize;
65
66 extern Texture *textureload(const char *name, int clamp = 0, bool mipit = true, bool msg = true);
67 extern int texalign(const void *data, int w, int bpp);
68 extern void cleanuptexture(Texture *t);
69 extern uchar *loadalphamask(Texture *t);
70 extern void loadlayermasks();
71 extern Texture *cubemapload(const char *name, bool mipit = true, bool msg = true, bool transient = false);
72 extern void drawcubemap(int size, const vec &o, float yaw, float pitch, const cubemapside &side, bool onlysky = false);
73 extern void loadshaders();
74 extern void setuptexparameters(int tnum, void *pixels, int clamp, int filter, GLenum format = GL_RGB, GLenum target = GL_TEXTURE_2D, bool swizzle = false);
75 extern void createtexture(int tnum, int w, int h, void *pixels, int clamp, int filter, GLenum component = GL_RGB, GLenum target = GL_TEXTURE_2D, int pw = 0, int ph = 0, int pitch = 0, bool resize = true, GLenum format = GL_FALSE, bool swizzle = false);
76 extern void blurtexture(int n, int bpp, int w, int h, uchar *dst, const uchar *src, int margin = 0);
77 extern void blurnormals(int n, int w, int h, bvec *dst, const bvec *src, int margin = 0);
78 extern void renderpostfx();
79 extern void initenvmaps();
80 extern void genenvmaps();
81 extern ushort closestenvmap(const vec &o);
82 extern ushort closestenvmap(int orient, const ivec &co, int size);
83 extern GLuint lookupenvmap(ushort emid);
84 extern GLuint lookupenvmap(Slot &slot);
85 extern bool reloadtexture(Texture &tex);
86 extern bool reloadtexture(const char *name);
87 extern void setuptexcompress();
88 extern void clearslots();
89 extern void compacteditvslots();
90 extern void compactmruvslots();
91 extern void compactvslots(cube *c, int n = 8);
92 extern void compactvslot(int &index);
93 extern void compactvslot(VSlot &vs);
94 extern int compactvslots();
95 extern void reloadtextures();
96 extern void cleanuptextures();
97
98 // shadowmap
99
100 extern int shadowmap, shadowmapcasters;
101 extern bool shadowmapping;
102 extern matrix4 shadowmatrix;
103
104 extern bool isshadowmapcaster(const vec &o, float rad);
105 extern bool addshadowmapcaster(const vec &o, float xyrad, float zrad);
106 extern bool isshadowmapreceiver(vtxarray *va);
107 extern void rendershadowmap();
108 extern void pushshadowmap();
109 extern void popshadowmap();
110 extern void rendershadowmapreceivers();
111 extern void guessshadowdir();
112
113 // pvs
114 extern void clearpvs();
115 extern bool pvsoccluded(const ivec &bbmin, const ivec &bbmax);
116 extern bool pvsoccludedsphere(const vec ¢er, float radius);
117 extern bool waterpvsoccluded(int height);
118 extern void setviewcell(const vec &p);
119 extern void savepvs(stream *f);
120 extern void loadpvs(stream *f, int numpvs);
121 extern int getnumviewcells();
122
pvsoccluded(const ivec & bborigin,int size)123 static inline bool pvsoccluded(const ivec &bborigin, int size)
124 {
125 return pvsoccluded(bborigin, ivec(bborigin).add(size));
126 }
127
128 // rendergl
129 extern bool hasVAO, hasFBO, hasAFBO, hasDS, hasTF, hasTRG, hasTSW, hasS3TC, hasFXT1, hasLATC, hasRGTC, hasAF, hasFBB, hasUBO, hasMBR;
130 extern int glversion, glslversion, glcompat;
131
132 enum { DRAWTEX_NONE = 0, DRAWTEX_ENVMAP, DRAWTEX_MINIMAP, DRAWTEX_MODELPREVIEW };
133
134 extern float curfov, fovy, aspect, forceaspect;
135 extern int drawtex;
136 extern bool renderedgame;
137 extern const matrix4 viewmatrix;
138 extern matrix4 cammatrix, projmatrix, camprojmatrix, invcammatrix, invcamprojmatrix;
139 extern bvec fogcolor;
140 extern vec curfogcolor;
141 extern int fog;
142 extern float curfogstart, curfogend;
143
144 extern void gl_checkextensions();
145 extern void gl_init();
146 extern void gl_resize();
147 extern void cleanupgl();
148 extern void rendergame(bool mainpass = false);
149 extern void invalidatepostfx();
150 extern void gl_drawhud();
151 extern void gl_drawframe();
152 extern void gl_drawmainmenu();
153 extern void drawminimap();
154 extern void drawtextures();
155 extern void enablepolygonoffset(GLenum type);
156 extern void disablepolygonoffset(GLenum type);
157 extern void calcspherescissor(const vec ¢er, float size, float &sx1, float &sy1, float &sx2, float &sy2);
158 extern int pushscissor(float sx1, float sy1, float sx2, float sy2);
159 extern void popscissor();
160 extern void recomputecamera();
161 extern void screenquad();
162 extern void screenquad(float sw, float sh);
163 extern void screenquadflipped(float sw, float sh);
164 extern void screenquad(float sw, float sh, float sw2, float sh2);
165 extern void screenquadoffset(float x, float y, float w, float h);
166 extern void screenquadoffset(float x, float y, float w, float h, float x2, float y2, float w2, float h2);
167 extern void hudquad(float x, float y, float w, float h, float tx = 0, float ty = 0, float tw = 1, float th = 1);
168 extern void setfogcolor(const vec &v);
169 extern void zerofogcolor();
170 extern void resetfogcolor();
171 extern void setfogdist(float start, float end);
172 extern void clearfogdist();
173 extern void resetfogdist();
174 extern void writecrosshairs(stream *f);
175
176 namespace modelpreview
177 {
178 extern void start(int x, int y, int w, int h, bool background = true);
179 extern void end();
180 }
181
182 // renderextras
183 extern void render3dbox(vec &o, float tofloor, float toceil, float xradius, float yradius = 0);
184
185 // octa
186 extern cube *newcubes(uint face = F_EMPTY, int mat = MAT_AIR);
187 extern cubeext *growcubeext(cubeext *ext, int maxverts);
188 extern void setcubeext(cube &c, cubeext *ext);
189 extern cubeext *newcubeext(cube &c, int maxverts = 0, bool init = true);
190 extern void getcubevector(cube &c, int d, int x, int y, int z, ivec &p);
191 extern void setcubevector(cube &c, int d, int x, int y, int z, const ivec &p);
192 extern int familysize(const cube &c);
193 extern void freeocta(cube *c);
194 extern void discardchildren(cube &c, bool fixtex = false, int depth = 0);
195 extern void optiface(uchar *p, cube &c);
196 extern void validatec(cube *c, int size = 0);
197 extern bool isvalidcube(const cube &c);
198 extern ivec lu;
199 extern int lusize;
200 extern cube &lookupcube(const ivec &to, int tsize = 0, ivec &ro = lu, int &rsize = lusize);
201 extern const cube *neighbourstack[32];
202 extern int neighbourdepth;
203 extern const cube &neighbourcube(const cube &c, int orient, const ivec &co, int size, ivec &ro = lu, int &rsize = lusize);
204 extern void resetclipplanes();
205 extern int getmippedtexture(const cube &p, int orient);
206 extern void forcemip(cube &c, bool fixtex = true);
207 extern bool subdividecube(cube &c, bool fullcheck=true, bool brighten=true);
208 extern void edgespan2vectorcube(cube &c);
209 extern int faceconvexity(const ivec v[4]);
210 extern int faceconvexity(const ivec v[4], int &vis);
211 extern int faceconvexity(const vertinfo *verts, int numverts, int size);
212 extern int faceconvexity(const cube &c, int orient);
213 extern void calcvert(const cube &c, const ivec &co, int size, ivec &vert, int i, bool solid = false);
214 extern void calcvert(const cube &c, const ivec &co, int size, vec &vert, int i, bool solid = false);
215 extern uint faceedges(const cube &c, int orient);
216 extern bool collapsedface(const cube &c, int orient);
217 extern bool touchingface(const cube &c, int orient);
218 extern bool flataxisface(const cube &c, int orient);
219 extern bool collideface(const cube &c, int orient);
220 extern int genclipplane(const cube &c, int i, vec *v, plane *clip);
221 extern void genclipplanes(const cube &c, const ivec &co, int size, clipplanes &p, bool collide = true);
222 extern bool visibleface(const cube &c, int orient, const ivec &co, int size, ushort mat = MAT_AIR, ushort nmat = MAT_AIR, ushort matmask = MATF_VOLUME);
223 extern int classifyface(const cube &c, int orient, const ivec &co, int size);
224 extern int visibletris(const cube &c, int orient, const ivec &co, int size, ushort nmat = MAT_ALPHA, ushort matmask = MAT_ALPHA);
225 extern int visibleorient(const cube &c, int orient);
226 extern void genfaceverts(const cube &c, int orient, ivec v[4]);
227 extern int calcmergedsize(int orient, const ivec &co, int size, const vertinfo *verts, int numverts);
228 extern void invalidatemerges(cube &c, const ivec &co, int size, bool msg);
229 extern void calcmerges();
230
231 extern int mergefaces(int orient, facebounds *m, int sz);
232 extern void mincubeface(const cube &cu, int orient, const ivec &o, int size, const facebounds &orig, facebounds &cf, ushort nmat = MAT_AIR, ushort matmask = MATF_VOLUME);
233
ext(cube & c)234 static inline cubeext &ext(cube &c)
235 {
236 return *(c.ext ? c.ext : newcubeext(c));
237 }
238
239 // ents
240 extern char *entname(entity &e);
241 extern bool haveselent();
242 extern undoblock *copyundoents(undoblock *u);
243 extern void pasteundoent(int idx, const entity &ue);
244 extern void pasteundoents(undoblock *u);
245
246 // octaedit
247 extern void cancelsel();
248 extern void rendertexturepanel(int w, int h);
249 extern void addundo(undoblock *u);
250 extern void commitchanges(bool force = false);
251 extern void rendereditcursor();
252 extern void tryedit();
253
254 extern bool prefabloaded(const char *name);
255 extern void renderprefab(const char *name, const vec &o, float yaw, float pitch, float roll, float size = 1, const vec &color = vec(1, 1, 1));
256 extern void previewprefab(const char *name, const vec &color);
257
258 // octarender
259 extern vector<tjoint> tjoints;
260 extern vector<vtxarray *> varoot, valist;
261
262 extern ushort encodenormal(const vec &n);
263 extern vec decodenormal(ushort norm);
264 extern void guessnormals(const vec *pos, int numverts, vec *normals);
265 extern void reduceslope(ivec &n);
266 extern void findtjoints();
267 extern void octarender();
268 extern void allchanged(bool load = false);
269 extern void clearvas(cube *c);
270 extern void destroyva(vtxarray *va, bool reparent = true);
271 extern bool readva(vtxarray *va, ushort *&edata, vertex *&vdata);
272 extern void updatevabb(vtxarray *va, bool force = false);
273 extern void updatevabbs(bool force = false);
274
275 // renderva
276 extern vtxarray *visibleva, *reflectedva;
277
278 extern void visiblecubes(bool cull = true);
279 extern void setvfcP(float z = -1, const vec &bbmin = vec(-1, -1, -1), const vec &bbmax = vec(1, 1, 1));
280 extern void savevfcP();
281 extern void restorevfcP();
282 extern void rendergeom(float causticspass = 0, bool fogpass = false);
283 extern void renderalphageom(bool fogpass = false);
284 extern void rendermapmodels();
285 extern void renderreflectedgeom(bool causticspass = false, bool fogpass = false);
286 extern void renderreflectedmapmodels();
287 extern void renderoutline();
288 extern bool rendersky(bool explicitonly = false);
289
290 extern bool isfoggedsphere(float rad, const vec &cv);
291 extern int isvisiblesphere(float rad, const vec &cv);
292 extern bool bboccluded(const ivec &bo, const ivec &br);
293 extern occludequery *newquery(void *owner);
294 extern void startquery(occludequery *query);
295 extern void endquery(occludequery *query);
296 extern bool checkquery(occludequery *query, bool nowait = false);
297 extern void resetqueries();
298 extern int getnumqueries();
299 extern void startbb(bool mask = true);
300 extern void endbb(bool mask = true);
301 extern void drawbb(const ivec &bo, const ivec &br);
302
303 extern int oqfrags;
304
305 // dynlight
306
307 extern void updatedynlights();
308 extern int finddynlights();
309 extern void calcdynlightmask(vtxarray *va);
310 extern int setdynlights(vtxarray *va);
311 extern bool getdynlight(int n, vec &o, float &radius, vec &color);
312
313 // material
314
315 extern int showmat;
316
317 extern int findmaterial(const char *name);
318 extern const char *findmaterialname(int mat);
319 extern const char *getmaterialdesc(int mat, const char *prefix = "");
320 extern void genmatsurfs(const cube &c, const ivec &co, int size, vector<materialsurface> &matsurfs);
321 extern void rendermatsurfs(materialsurface *matbuf, int matsurfs);
322 extern void rendermatgrid(materialsurface *matbuf, int matsurfs);
323 extern int optimizematsurfs(materialsurface *matbuf, int matsurfs);
324 extern void setupmaterials(int start = 0, int len = 0);
325 extern void rendermaterials();
326 extern int visiblematerial(const cube &c, int orient, const ivec &co, int size, ushort matmask = MATF_VOLUME);
327
328 // water
329 extern int refracting, refractfog;
330 extern bool reflecting, fading, fogging;
331 extern float reflectz;
332 extern int reflectdist, vertwater, waterrefract, waterreflect, waterfade, caustics, waterfallrefract;
333
334 #define GETMATIDXVAR(name, var, type) \
335 type get##name##var(int mat) \
336 { \
337 switch(mat&MATF_INDEX) \
338 { \
339 default: case 0: return name##var; \
340 case 1: return name##2##var; \
341 case 2: return name##3##var; \
342 case 3: return name##4##var; \
343 } \
344 }
345
346 extern const bvec &getwatercolor(int mat);
347 extern const bvec &getwaterfallcolor(int mat);
348 extern int getwaterfog(int mat);
349 extern const bvec &getlavacolor(int mat);
350 extern int getlavafog(int mat);
351 extern const bvec &getglasscolor(int mat);
352
353 extern void cleanreflections();
354 extern void queryreflections();
355 extern void drawreflections();
356 extern void renderwater();
357 extern void setuplava(Texture *tex, float scale);
358 extern void renderlava(const materialsurface &m);
359 extern void flushlava();
360 extern void loadcaustics(bool force = false);
361 extern void preloadwatershaders(bool force = false);
362
363 // glare
364 extern bool glaring;
365
366 extern void drawglaretex();
367 extern void addglare();
368
369 // depthfx
370 extern bool depthfxing;
371
372 extern void drawdepthfxtex();
373
374 // server
375 extern vector<const char *> gameargs;
376
377 extern void initserver(bool listen, bool dedicated);
378 extern void cleanupserver();
379 extern void serverslice(bool dedicated, uint timeout);
380 extern void updatetime();
381
382 extern ENetSocket connectmaster(bool wait);
383 extern void localclienttoserver(int chan, ENetPacket *);
384 extern void localconnect();
385 extern bool serveroption(char *opt);
386
387 // serverbrowser
388 extern bool resolverwait(const char *name, ENetAddress *address);
389 extern int connectwithtimeout(ENetSocket sock, const char *hostname, const ENetAddress &address);
390 extern void addserver(const char *name, int port = 0, const char *password = NULL, bool keep = false);
391 extern void writeservercfg();
392
393 // client
394 extern void localdisconnect(bool cleanup = true);
395 extern void localservertoclient(int chan, ENetPacket *packet);
396 extern void connectserv(const char *servername, int port, const char *serverpassword);
397 extern void abortconnect();
398 extern void clientkeepalive();
399
400 // command
401 extern hashnameset<ident> idents;
402 extern int identflags;
403
404 extern void clearoverrides();
405 extern void writecfg(const char *name = NULL);
406
407 extern void checksleep(int millis);
408 extern void clearsleep(bool clearoverrides = true);
409
410 // console
411 extern void processtextinput(const char *str, int len);
412 extern void processkey(int code, bool isdown, int modstate = 0);
413 extern int rendercommand(int x, int y, int w);
414 extern int renderconsole(int w, int h, int abovehud);
415 extern void conoutf(const char *s, ...) PRINTFARGS(1, 2);
416 extern void conoutf(int type, const char *s, ...) PRINTFARGS(2, 3);
417 extern void resetcomplete();
418 extern void complete(char *s, int maxlen, const char *cmdprefix);
419 const char *getkeyname(int code);
420 extern const char *addreleaseaction(char *s);
421 extern void writebinds(stream *f);
422 extern void writecompletions(stream *f);
423
424 // main
425 enum
426 {
427 NOT_INITING = 0,
428 INIT_GAME,
429 INIT_LOAD,
430 INIT_RESET
431 };
432 extern int initing, numcpus;
433
434 enum
435 {
436 CHANGE_GFX = 1<<0,
437 CHANGE_SOUND = 1<<1
438 };
439 extern bool initwarning(const char *desc, int level = INIT_RESET, int type = CHANGE_GFX);
440
441 extern bool grabinput, minimized;
442
443 extern bool interceptkey(int sym);
444
445 extern float loadprogress;
446 extern void renderbackground(const char *caption = NULL, Texture *mapshot = NULL, const char *mapname = NULL, const char *mapinfo = NULL, bool restore = false, bool force = false);
447 extern void renderprogress(float bar, const char *text, GLuint tex = 0, bool background = false);
448
449 extern void getfps(int &fps, int &bestdiff, int &worstdiff);
450 extern void swapbuffers(bool overlay = true);
451 extern int getclockmillis();
452
453 enum { KR_CONSOLE = 1<<0, KR_GUI = 1<<1, KR_EDITMODE = 1<<2 };
454
455 extern void keyrepeat(bool on, int mask = ~0);
456
457 enum { TI_CONSOLE = 1<<0, TI_GUI = 1<<1 };
458
459 extern void textinput(bool on, int mask = ~0);
460
461 // menu
462 extern void menuprocess();
463 extern void addchange(const char *desc, int type);
464 extern void clearchanges(int type);
465
466 // physics
467 extern void mousemove(int dx, int dy);
468 extern bool overlapsdynent(const vec &o, float radius);
469 extern void rotatebb(vec ¢er, vec &radius, int yaw);
470 extern float shadowray(const vec &o, const vec &ray, float radius, int mode, extentity *t = NULL);
471 struct ShadowRayCache;
472 extern ShadowRayCache *newshadowraycache();
473 extern void freeshadowraycache(ShadowRayCache *&cache);
474 extern void resetshadowraycache(ShadowRayCache *cache);
475 extern float shadowray(ShadowRayCache *cache, const vec &o, const vec &ray, float radius, int mode, extentity *t = NULL);
476
477 // world
478
479 extern vector<int> outsideents;
480
481 extern void entcancel();
482 extern void entitiesinoctanodes();
483 extern void attachentities();
484 extern void freeoctaentities(cube &c);
485 extern bool pointinsel(const selinfo &sel, const vec &o);
486
487 extern void resetmap();
488 extern void startmap(const char *name);
489
490 // rendermodel
491 struct mapmodelinfo { string name; model *m; };
492
493 extern bool modelloaded(const char *name);
494 extern void findanims(const char *pattern, vector<int> &anims);
495 extern void loadskin(const char *dir, const char *altdir, Texture *&skin, Texture *&masks);
496 extern mapmodelinfo *getmminfo(int i);
497 extern void startmodelquery(occludequery *query);
498 extern void endmodelquery();
499 extern void preloadmodelshaders(bool force = false);
500 extern void preloadusedmapmodels(bool msg = false, bool bih = false);
501
loadmapmodel(int n)502 static inline model *loadmapmodel(int n)
503 {
504 extern vector<mapmodelinfo> mapmodels;
505 if(mapmodels.inrange(n))
506 {
507 model *m = mapmodels[n].m;
508 return m ? m : loadmodel(NULL, n);
509 }
510 return NULL;
511 }
512
513 // renderparticles
514 extern void initparticles();
515 extern void clearparticles();
516 extern void clearparticleemitters();
517 extern void seedparticles();
518 extern void updateparticles();
519 extern void renderparticles(bool mainpass = false);
520 extern bool printparticles(extentity &e, char *buf, int len);
521
522 // decal
523 extern void initdecals();
524 extern void cleardecals();
525 extern void renderdecals(bool mainpass = false);
526
527 // blob
528
529 enum
530 {
531 BLOB_STATIC = 0,
532 BLOB_DYNAMIC
533 };
534
535 extern int showblobs;
536
537 extern void initblobs(int type = -1);
538 extern void resetblobs();
539 extern void renderblob(int type, const vec &o, float radius, float fade = 1);
540 extern void flushblobs();
541
542 // rendersky
543 extern int explicitsky;
544 extern double skyarea;
545 extern char *skybox;
546
547 extern void setupsky();
548 extern void drawskybox(int farplane, bool limited, bool force = false);
549 extern bool limitsky();
550 extern bool shouldrenderskyenvmap();
551 extern bool shouldclearskyboxglare();
552
553 // 3dgui
554 extern void g3d_render();
555 extern void g3d_render2d();
556 extern bool g3d_windowhit(bool on, bool act);
557 extern bool g3d_key(int code, bool isdown);
558 extern bool g3d_input(const char *str, int len);
559 // menus
560 extern int mainmenu;
561
562 extern void clearmainmenu();
563 extern void g3d_mainmenu();
564
565 // sound
566 extern void clearmapsounds();
567 extern void checkmapsounds();
568 extern void updatesounds();
569 extern void preloadmapsounds();
570
571 extern void initmumble();
572 extern void closemumble();
573 extern void updatemumble();
574
575 // grass
576 extern void generategrass();
577 extern void rendergrass();
578 extern void cleanupgrass();
579
580 // blendmap
581 extern int blendpaintmode;
582
583 struct BlendMapCache;
584 extern BlendMapCache *newblendmapcache();
585 extern void freeblendmapcache(BlendMapCache *&cache);
586 extern bool setblendmaporigin(BlendMapCache *cache, const ivec &o, int size);
587 extern bool hasblendmap(BlendMapCache *cache);
588 extern uchar lookupblendmap(BlendMapCache *cache, const vec &pos);
589 extern void resetblendmap();
590 extern void enlargeblendmap();
591 extern void shrinkblendmap(int octant);
592 extern void optimizeblendmap();
593 extern void stoppaintblendmap();
594 extern void trypaintblendmap();
595 extern void renderblendbrush(GLuint tex, float x, float y, float w, float h);
596 extern void renderblendbrush();
597 extern bool loadblendmap(stream *f, int info);
598 extern void saveblendmap(stream *f);
599 extern uchar shouldsaveblendmap();
600
601 // recorder
602
603 namespace recorder
604 {
605 extern void stop();
606 extern void capture(bool overlay = true);
607 extern void cleanup();
608 }
609
610 #endif
611
612 #endif
613
614