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 &center, 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 &center, 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 &center, 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