~ubuntu-branches/ubuntu/hardy/sauerbraten/hardy-backports

« back to all changes in this revision

Viewing changes to engine/engine.h

  • Committer: Bazaar Package Importer
  • Author(s): Bruno "Fuddl" Kleinert
  • Date: 2007-01-09 18:19:30 UTC
  • Revision ID: james.westby@ubuntu.com-20070109181930-zy2ulzq3ukfjhrix
Tags: upstream-0.0.20061204.dfsg
ImportĀ upstreamĀ versionĀ 0.0.20061204.dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "cube.h"
 
2
#include "iengine.h"
 
3
#include "igame.h"
 
4
 
 
5
#include "world.h"
 
6
#include "octa.h"
 
7
#include "lightmap.h"
 
8
#include "shaders.h"
 
9
#include "spheretree.h"
 
10
 
 
11
struct Texture
 
12
{
 
13
    char *name;
 
14
    int xs, ys, w, h, bpp;
 
15
    GLuint gl;
 
16
};
 
17
 
 
18
struct SphereTree;
 
19
 
 
20
enum { MDL_MD2 = 1, MDL_MD3 };
 
21
 
 
22
struct model
 
23
{
 
24
    Shader *shader;
 
25
    float spec, ambient;
 
26
    bool collide, cullface, masked, shadow;
 
27
    float scale;
 
28
    vec translate;
 
29
    SphereTree *spheretree;
 
30
    vec bbcenter, bbradius;
 
31
    float eyeheight, collideradius, collideheight;
 
32
 
 
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 &center, 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; };
 
42
 
 
43
    void boundbox(int frame, vec &center, vec &radius)
 
44
    {
 
45
        if(frame) calcbb(frame, center, radius);
 
46
        else
 
47
        {
 
48
            if(bbradius.iszero()) calcbb(0, bbcenter, bbradius);
 
49
            center = bbcenter;
 
50
            radius = bbradius;
 
51
        };
 
52
    };
 
53
 
 
54
    void collisionbox(int frame, vec &center, vec &radius)
 
55
    {
 
56
        boundbox(frame, center, radius);
 
57
        if(collideradius) 
 
58
        {
 
59
            center[0] = center[1] = 0;
 
60
            radius[0] = radius[1] = collideradius;
 
61
        };
 
62
        if(collideheight)
 
63
        {
 
64
            center[2] = radius[2] = collideheight/2;
 
65
        };
 
66
    };
 
67
 
 
68
    float boundsphere(int frame, vec &center)
 
69
    {
 
70
        vec radius;
 
71
        boundbox(frame, center, radius);
 
72
        return radius.magnitude();
 
73
    };
 
74
 
 
75
    float above(int frame = 0)
 
76
    {
 
77
        vec center, radius;
 
78
        boundbox(frame, center, radius);
 
79
        return center.z+radius.z;
 
80
    };
 
81
 
 
82
    void setshader()
 
83
    {
 
84
        if(renderpath==R_FIXEDFUNCTION) return;
 
85
 
 
86
        if(shader) shader->set();
 
87
        else
 
88
        {
 
89
            static Shader *modelshader = NULL, *modelshadernospec = NULL, *modelshadermasks = NULL;            
 
90
 
 
91
            if(!modelshader)       modelshader       = lookupshaderbyname("stdppmodel");
 
92
            if(!modelshadernospec) modelshadernospec = lookupshaderbyname("nospecpvmodel");
 
93
            if(!modelshadermasks)  modelshadermasks  = lookupshaderbyname("masksppmodel");
 
94
 
 
95
            (masked ? modelshadermasks : (spec>=0.01f ? modelshader : modelshadernospec))->set();
 
96
        };
 
97
 
 
98
        glProgramEnvParameter4f_(GL_FRAGMENT_PROGRAM_ARB, 2, spec, spec, spec, 0);
 
99
 
 
100
        GLfloat color[4];
 
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);
 
106
    };
 
107
};
 
108
 
 
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
 
112
 
 
113
enum
 
114
{
 
115
    TEX_DIFFUSE = 0,
 
116
    TEX_UNKNOWN,
 
117
    TEX_DECAL,
 
118
    TEX_NORMAL,
 
119
    TEX_GLOW,
 
120
    TEX_SPEC,
 
121
    TEX_DEPTH,
 
122
};
 
123
 
 
124
struct Slot
 
125
{
 
126
    struct Tex
 
127
    {
 
128
        int type;
 
129
        Texture *t;
 
130
        string name;
 
131
        int rotation, xoffset, yoffset;
 
132
        int combined;
 
133
    };
 
134
 
 
135
    vector<Tex> sts;
 
136
    Shader *shader;
 
137
    vector<ShaderParam> params;
 
138
    bool loaded;
 
139
 
 
140
    void reset()
 
141
    {
 
142
        sts.setsize(0);
 
143
        shader = NULL;
 
144
        params.setsize(0);
 
145
        loaded = false;
 
146
    };
 
147
};
 
148
 
 
149
 
 
150
// GL_ARB_multitexture
 
151
extern PFNGLACTIVETEXTUREARBPROC       glActiveTexture_;
 
152
extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTexture_;
 
153
extern PFNGLMULTITEXCOORD2FARBPROC     glMultiTexCoord2f_;
 
154
 
 
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_;
 
163
 
 
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_;
 
172
 
 
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_;
 
184
 
 
185
#define FONTH 64
 
186
#define MINRESW 640
 
187
#define MINRESH 480
 
188
 
 
189
extern dynent *player;
 
190
extern physent *camera1;                // special ent that acts as camera, same object as player1 in FPS mode
 
191
 
 
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;
 
202
 
 
203
extern int curtime;                     // current frame time
 
204
extern int lastmillis;                  // last time
 
205
 
 
206
extern igameclient     *cl;
 
207
extern igameserver     *sv;
 
208
extern iclientcom      *cc;
 
209
extern icliententities *et;
 
210
 
 
211
extern vector<int> entgroup;
 
212
 
 
213
// rendergl
 
214
extern bool hasVBO, hasOQ, hasFBO, hasCM, hasTC;
 
215
 
 
216
struct cubemapside
 
217
{
 
218
    GLenum target;
 
219
    const char *name;
 
220
};
 
221
 
 
222
extern cubemapside cubemapsides[6];
 
223
 
 
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);
 
235
 
 
236
// renderextras
 
237
extern void render3dbox(vec &o, float tofloor, float toceil, float xradius, float yradius = 0);
 
238
 
 
239
 
 
240
// octa
 
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();
 
275
 
 
276
struct cubeface : mergeinfo
 
277
{
 
278
    cube *c;
 
279
};
 
280
 
 
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);
 
283
 
 
284
// ents
 
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);
 
289
 
 
290
// octaedit
 
291
extern void cancelsel();
 
292
extern void render_texture_panel(int w, int h);
 
293
extern void addundo(undoblock &u);
 
294
 
 
295
// octarender
 
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();
 
306
 
 
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();
 
316
 
 
317
#define startquery(query) { glBeginQuery_(GL_SAMPLES_PASSED_ARB, (query)->id); }
 
318
#define endquery(query) \
 
319
    { \
 
320
        glEndQuery_(GL_SAMPLES_PASSED_ARB); \
 
321
        extern int ati_oq_bug; \
 
322
        if(ati_oq_bug) glFlush(); \
 
323
    }
 
324
 
 
325
// water
 
326
 
 
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);
 
330
 
 
331
extern int showmat;
 
332
 
 
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);
 
344
 
 
345
// server
 
346
 
 
347
extern void initserver(bool dedicated);
 
348
extern void cleanupserver();
 
349
extern void serverslice(int seconds, uint timeout);
 
350
 
 
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);
 
355
 
 
356
// serverbrowser
 
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();
 
361
 
 
362
// client
 
363
extern void localdisconnect();
 
364
extern void localservertoclient(int chan, uchar *buf, int len);
 
365
extern void connects(char *servername);
 
366
extern void clientkeepalive();
 
367
 
 
368
// command
 
369
extern bool overrideidents, persistidents;
 
370
 
 
371
extern void clearoverrides();
 
372
extern void writecfg();
 
373
 
 
374
// console
 
375
extern void writebinds(FILE *f);
 
376
 
 
377
// main
 
378
extern void estartmap(const char *name);
 
379
extern void computescreen(const char *text);
 
380
 
 
381
// menu
 
382
extern void menuprocess();
 
383
 
 
384
// physics
 
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 &center, vec &radius, int yaw);
 
389
 
 
390
// world
 
391
enum
 
392
{
 
393
    TRIG_COLLIDE    = 1<<0,
 
394
    TRIG_TOGGLE     = 1<<1,
 
395
    TRIG_ONCE       = 0<<2,
 
396
    TRIG_MANY       = 1<<2,
 
397
    TRIG_DISAPPEAR  = 1<<3,
 
398
    TRIG_AUTO_RESET = 1<<4,
 
399
    TRIG_RUMBLE     = 1<<5,
 
400
    TRIG_LOCKED     = 1<<6,
 
401
};
 
402
 
 
403
#define NUMTRIGGERTYPES 16
 
404
 
 
405
extern int triggertypes[NUMTRIGGERTYPES];
 
406
 
 
407
#define checktriggertype(type, flag) (triggertypes[(type) & (NUMTRIGGERTYPES-1)] & (flag))
 
408
 
 
409
extern void entitiesinoctanodes();
 
410
extern void freeoctaentities(cube &c);
 
411
extern bool pointinsel(selinfo &sel, vec &o);
 
412
 
 
413
// lightmap
 
414
extern void show_out_of_renderloop_progress(float bar1, const char *text1, float bar2 = 0, const char *text2 = NULL);
 
415
 
 
416
// rendermodel
 
417
struct mapmodelinfo { string name; int tex; model *m; };
 
418
 
 
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);
 
423
 
 
424
// particles
 
425
extern void particleinit();
 
426
 
 
427
// 3dgui
 
428
extern void g3d_render();
 
429
extern bool g3d_windowhit(bool on, bool act);
 
430
 
 
431
extern void g3d_mainmenu();