9
#include "spheretree.h"
14
int xs, ys, w, h, bpp;
20
enum { MDL_MD2 = 1, MDL_MD3 };
26
bool collide, cullface, masked, shadow;
29
SphereTree *spheretree;
30
vec bbcenter, bbradius;
31
float eyeheight, collideradius, collideheight;
33
model() : shader(0), spec(1.0f), ambient(0.3f), collide(true), cullface(true), masked(false), shadow(true), scale(1.0f), translate(0, 0, 0), spheretree(0), bbcenter(0, 0, 0), bbradius(0, 0, 0), eyeheight(0.9f), collideradius(0), collideheight(0) {};
34
virtual ~model() { DELETEP(spheretree); };
35
virtual void calcbb(int frame, vec ¢er, vec &radius) = 0;
36
virtual void render(int anim, int varseed, float speed, int basetime, float x, float y, float z, float yaw, float pitch, dynent *d, model *vwepmdl = NULL) = 0;
37
virtual void setskin(int tex = 0) = 0;
38
virtual bool load() = 0;
39
virtual char *name() = 0;
40
virtual int type() = 0;
41
virtual SphereTree *setspheretree() { return 0; };
43
void boundbox(int frame, vec ¢er, vec &radius)
45
if(frame) calcbb(frame, center, radius);
48
if(bbradius.iszero()) calcbb(0, bbcenter, bbradius);
54
void collisionbox(int frame, vec ¢er, vec &radius)
56
boundbox(frame, center, radius);
59
center[0] = center[1] = 0;
60
radius[0] = radius[1] = collideradius;
64
center[2] = radius[2] = collideheight/2;
68
float boundsphere(int frame, vec ¢er)
71
boundbox(frame, center, radius);
72
return radius.magnitude();
75
float above(int frame = 0)
78
boundbox(frame, center, radius);
79
return center.z+radius.z;
84
if(renderpath==R_FIXEDFUNCTION) return;
86
if(shader) shader->set();
89
static Shader *modelshader = NULL, *modelshadernospec = NULL, *modelshadermasks = NULL;
91
if(!modelshader) modelshader = lookupshaderbyname("stdppmodel");
92
if(!modelshadernospec) modelshadernospec = lookupshaderbyname("nospecpvmodel");
93
if(!modelshadermasks) modelshadermasks = lookupshaderbyname("masksppmodel");
95
(masked ? modelshadermasks : (spec>=0.01f ? modelshader : modelshadernospec))->set();
98
glProgramEnvParameter4f_(GL_FRAGMENT_PROGRAM_ARB, 2, spec, spec, spec, 0);
101
glGetFloatv(GL_CURRENT_COLOR, color);
102
vec diffuse = vec(color).mul(ambient);
103
loopi(3) diffuse[i] = max(diffuse[i], 0.2f);
104
glProgramEnvParameter4f_(GL_VERTEX_PROGRAM_ARB, 3, diffuse.x, diffuse.y, diffuse.z, 1);
105
glProgramEnvParameter4f_(GL_FRAGMENT_PROGRAM_ARB, 3, diffuse.x, diffuse.y, diffuse.z, 1);
109
// management of texture slots
110
// each texture slot can have multople texture frames, of which currently only the first is used
111
// additional frames can be used for various shaders
131
int rotation, xoffset, yoffset;
137
vector<ShaderParam> params;
150
// GL_ARB_multitexture
151
extern PFNGLACTIVETEXTUREARBPROC glActiveTexture_;
152
extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTexture_;
153
extern PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2f_;
155
// GL_ARB_vertex_buffer_object
156
extern PFNGLGENBUFFERSARBPROC glGenBuffers_;
157
extern PFNGLBINDBUFFERARBPROC glBindBuffer_;
158
extern PFNGLMAPBUFFERARBPROC glMapBuffer_;
159
extern PFNGLUNMAPBUFFERARBPROC glUnmapBuffer_;
160
extern PFNGLBUFFERDATAARBPROC glBufferData_;
161
extern PFNGLBUFFERSUBDATAARBPROC glBufferSubData_;
162
extern PFNGLDELETEBUFFERSARBPROC glDeleteBuffers_;
164
// GL_ARB_occlusion_query
165
extern PFNGLGENQUERIESARBPROC glGenQueries_;
166
extern PFNGLDELETEQUERIESARBPROC glDeleteQueries_;
167
extern PFNGLBEGINQUERYARBPROC glBeginQuery_;
168
extern PFNGLENDQUERYARBPROC glEndQuery_;
169
extern PFNGLGETQUERYIVARBPROC glGetQueryiv_;
170
extern PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectiv_;
171
extern PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuiv_;
173
// GL_EXT_framebuffer_object
174
extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbuffer_;
175
extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffers_;
176
extern PFNGLGENFRAMEBUFFERSEXTPROC glGenRenderbuffers_;
177
extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorage_;
178
extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatus_;
179
extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebuffer_;
180
extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffers_;
181
extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffers_;
182
extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2D_;
183
extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbuffer_;
189
extern dynent *player;
190
extern physent *camera1; // special ent that acts as camera, same object as player1 in FPS mode
192
extern header hdr; // current map header
193
extern vector<ushort> texmru;
194
extern int xtraverts, xtravertsva;
195
extern vector<vertex> verts; // the vertex array for all world rendering
196
extern int curtexnum;
197
extern const ivec cubecoords[8];
198
extern const ushort fv[6][4];
199
extern const uchar faceedgesidx[6][4];
200
extern Texture *crosshair;
201
extern bool inbetweenframes;
203
extern int curtime; // current frame time
204
extern int lastmillis; // last time
206
extern igameclient *cl;
207
extern igameserver *sv;
208
extern iclientcom *cc;
209
extern icliententities *et;
211
extern vector<int> entgroup;
214
extern bool hasVBO, hasOQ, hasFBO, hasCM, hasTC;
222
extern cubemapside cubemapsides[6];
224
extern void gl_init(int w, int h, int bpp, int depth, int fsaa);
225
extern void cleangl();
226
extern void gl_drawframe(int w, int h, float curfps);
227
extern Texture *textureload(const char *name, bool clamp = false, bool mipit = true, bool msg = true);
228
extern GLuint cubemapfromsky(int size);
229
extern Texture *cubemapload(const char *name, bool mipit = true, bool msg = true);
230
extern void drawcubemap(int size, const vec &o, float yaw, float pitch);
231
extern Slot &lookuptexture(int tex, bool load = true);
232
extern Shader *lookupshader(int slot);
233
extern void createtexture(int tnum, int w, int h, void *pixels, bool clamp, bool mipit, GLenum component = GL_RGB, GLenum target = GL_TEXTURE_2D);
234
extern void setfogplane(float scale = 0, float z = 0);
237
extern void render3dbox(vec &o, float tofloor, float toceil, float xradius, float yradius = 0);
241
extern cube *newcubes(uint face = F_EMPTY);
242
extern cubeext *newcubeext(cube &c);
243
extern void getcubevector(cube &c, int d, int x, int y, int z, ivec &p);
244
extern void setcubevector(cube &c, int d, int x, int y, int z, ivec &p);
245
extern int familysize(cube &c);
246
extern void freeocta(cube *c);
247
extern void discardchildren(cube &c);
248
extern void optiface(uchar *p, cube &c);
249
extern void validatec(cube *c, int size);
250
extern bool isvalidcube(cube &c);
251
extern cube &lookupcube(int tx, int ty, int tz, int tsize = 0);
252
extern cube &neighbourcube(int x, int y, int z, int size, int rsize, int orient);
253
extern void newclipplanes(cube &c);
254
extern void freeclipplanes(cube &c);
255
extern uchar octantrectangleoverlap(const ivec &c, int size, const ivec &o, const ivec &s);
256
extern void forcemip(cube &c);
257
extern bool subdividecube(cube &c, bool fullcheck=true, bool brighten=true);
258
extern int faceverts(cube &c, int orient, int vert);
259
extern void calcvert(cube &c, int x, int y, int z, int size, vvec &vert, int i, bool solid = false);
260
extern void calcverts(cube &c, int x, int y, int z, int size, vvec *verts, bool *usefaces, int *vertused, bool lodcube);
261
extern uint faceedges(cube &c, int orient);
262
extern bool collapsedface(uint cfe);
263
extern bool touchingface(cube &c, int orient);
264
extern int genclipplane(cube &c, int i, vec *v, plane *clip);
265
extern void genclipplanes(cube &c, int x, int y, int z, int size, clipplanes &p);
266
extern bool visibleface(cube &c, int orient, int x, int y, int z, int size, uchar mat = MAT_AIR, bool lodcube = false);
267
extern int visibleorient(cube &c, int orient);
268
extern bool threeplaneintersect(plane &pl1, plane &pl2, plane &pl3, vec &dest);
269
extern void remipworld();
270
extern void freemergeinfo(cube &c);
271
extern void genmergedverts(cube &cu, int orient, const ivec &co, int size, const mergeinfo &m, vvec *vv, plane *p = NULL);
272
extern int calcmergedsize(int orient, const ivec &co, int size, const mergeinfo &m, const vvec *vv);
273
extern void invalidatemerges(cube &c);
274
extern void calcmerges();
276
struct cubeface : mergeinfo
281
extern int mergefaces(int orient, cubeface *m, int sz);
282
extern void mincubeface(cube &cu, int orient, const ivec &o, int size, const mergeinfo &orig, mergeinfo &cf);
285
extern bool haveselent();
286
extern int rayent(const vec &o, vec &ray);
287
extern void copyundoents(undoblock &d, undoblock &s);
288
extern void pasteundoents(undoblock &u);
291
extern void cancelsel();
292
extern void render_texture_panel(int w, int h);
293
extern void addundo(undoblock &u);
296
extern void visiblecubes(cube *c, int size, int cx, int cy, int cz, int w, int h, int fov);
297
extern void reflectvfcP(float z);
298
extern void restorevfcP();
299
extern void octarender();
300
extern void rendermapmodels();
301
extern void rendergeom();
302
extern void renderoutline();
303
extern void allchanged(bool load = false);
304
extern void rendersky(bool explicitonly = false, float zreflect = 0);
305
extern void converttovectorworld();
307
extern void vaclearc(cube *c);
308
extern vtxarray *newva(int x, int y, int z, int size);
309
extern void destroyva(vtxarray *va, bool reparent = true);
310
extern int isvisiblesphere(float rad, const vec &cv);
311
extern bool bboccluded(const ivec &bo, const ivec &br, cube *c, const ivec &o, int size);
312
extern occludequery *newquery(void *owner);
313
extern bool checkquery(occludequery *query, bool nowait = false);
314
extern void resetqueries();
315
extern int getnumqueries();
317
#define startquery(query) { glBeginQuery_(GL_SAMPLES_PASSED_ARB, (query)->id); }
318
#define endquery(query) \
320
glEndQuery_(GL_SAMPLES_PASSED_ARB); \
321
extern int ati_oq_bug; \
322
if(ati_oq_bug) glFlush(); \
327
#define getwatercolour(wcol) \
328
uchar wcol[3] = { 20, 70, 80 }; \
329
if(hdr.watercolour[0] || hdr.watercolour[1] || hdr.watercolour[2]) memcpy(wcol, hdr.watercolour, 3);
333
extern int findmaterial(const char *name);
334
extern void genmatsurfs(cube &c, int cx, int cy, int cz, int size, vector<materialsurface> &matsurfs);
335
extern void rendermatsurfs(materialsurface *matbuf, int matsurfs);
336
extern void rendermatgrid(materialsurface *matbuf, int matsurfs);
337
extern int optimizematsurfs(materialsurface *matbuf, int matsurfs);
338
extern void setupmaterials(bool load = false);
339
extern void cleanreflections();
340
extern void queryreflections();
341
extern void drawreflections();
342
extern void renderwater();
343
extern void rendermaterials(float zclip = 0, bool refract = false);
347
extern void initserver(bool dedicated);
348
extern void cleanupserver();
349
extern void serverslice(int seconds, uint timeout);
351
extern uchar *retrieveservers(uchar *buf, int buflen);
352
extern void localclienttoserver(int chan, ENetPacket *);
353
extern void localconnect();
354
extern bool serveroption(char *opt);
357
extern bool resolverwait(const char *name, ENetAddress *address);
358
extern void addserver(char *servername);
359
extern char *getservername(int n);
360
extern void writeservercfg();
363
extern void localdisconnect();
364
extern void localservertoclient(int chan, uchar *buf, int len);
365
extern void connects(char *servername);
366
extern void clientkeepalive();
369
extern bool overrideidents, persistidents;
371
extern void clearoverrides();
372
extern void writecfg();
375
extern void writebinds(FILE *f);
378
extern void estartmap(const char *name);
379
extern void computescreen(const char *text);
382
extern void menuprocess();
385
extern void mousemove(int dx, int dy);
386
extern bool pointincube(const clipplanes &p, const vec &v);
387
extern bool overlapsdynent(const vec &o, float radius);
388
extern void rotatebb(vec ¢er, vec &radius, int yaw);
397
TRIG_DISAPPEAR = 1<<3,
398
TRIG_AUTO_RESET = 1<<4,
403
#define NUMTRIGGERTYPES 16
405
extern int triggertypes[NUMTRIGGERTYPES];
407
#define checktriggertype(type, flag) (triggertypes[(type) & (NUMTRIGGERTYPES-1)] & (flag))
409
extern void entitiesinoctanodes();
410
extern void freeoctaentities(cube &c);
411
extern bool pointinsel(selinfo &sel, vec &o);
414
extern void show_out_of_renderloop_progress(float bar1, const char *text1, float bar2 = 0, const char *text2 = NULL);
417
struct mapmodelinfo { string name; int tex; model *m; };
419
extern int findanim(const char *name);
420
extern void loadskin(const char *dir, const char *altdir, Texture *&skin, Texture *&masks, model *m);
421
extern model *loadmodel(const char *name, int i = -1);
422
extern mapmodelinfo &getmminfo(int i);
425
extern void particleinit();
428
extern void g3d_render();
429
extern bool g3d_windowhit(bool on, bool act);
431
extern void g3d_mainmenu();