diff options
| author | xolatile | 2025-07-17 23:28:55 +0200 |
|---|---|---|
| committer | xolatile | 2025-07-17 23:28:55 +0200 |
| commit | c79dda69d6e603500a5681430172b5152041af0a (patch) | |
| tree | c1669442318e77a9ae76009edd5eefcaa69064ce /src/engine/rendergl.cpp | |
| parent | 5b88d873f42b1cad5c5fd03888cfe45b82da06d6 (diff) | |
| download | xolatile-badassbug-c79dda69d6e603500a5681430172b5152041af0a.tar.xz xolatile-badassbug-c79dda69d6e603500a5681430172b5152041af0a.tar.zst | |
Big changed mentioned in IRC channel...
Diffstat (limited to 'src/engine/rendergl.cpp')
| -rw-r--r-- | src/engine/rendergl.cpp | 211 |
1 files changed, 34 insertions, 177 deletions
diff --git a/src/engine/rendergl.cpp b/src/engine/rendergl.cpp index 6049951..5ada421 100644 --- a/src/engine/rendergl.cpp +++ b/src/engine/rendergl.cpp @@ -599,7 +599,7 @@ void gl_init() glClearDepth(1); glDepthFunc(GL_LESS); glDisable(GL_DEPTH_TEST); - + glEnable(GL_LINE_SMOOTH); //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); @@ -621,7 +621,7 @@ VAR(wireframe, 0, 0, 1); ICOMMAND(getcamyaw, "", (), floatret(camera1->yaw)); ICOMMAND(getcampitch, "", (), floatret(camera1->pitch)); ICOMMAND(getcamroll, "", (), floatret(camera1->roll)); -ICOMMAND(getcampos, "", (), +ICOMMAND(getcampos, "", (), { defformatstring(pos, "%s %s %s", floatstr(camera1->o.x), floatstr(camera1->o.y), floatstr(camera1->o.z)); result(pos); @@ -652,7 +652,7 @@ void setcammatrix() void setcamprojmatrix(bool init = true, bool flush = false) { if(init) - { + { setcammatrix(); } @@ -672,7 +672,7 @@ void setcamprojmatrix(bool init = true, bool flush = false) fogplane.x /= projmatrix.a.x; fogplane.y /= projmatrix.b.y; fogplane.z /= projmatrix.c.w; - GLOBALPARAMF(fogplane, fogplane.x, fogplane.y, 0, fogplane.z); + GLOBALPARAMF(fogplane, fogplane.x, fogplane.y, 0, fogplane.z); } else { @@ -771,7 +771,7 @@ FVARP(sensitivity, 1e-3f, 3, 1000); FVARP(sensitivityscale, 1e-3f, 1, 1000); VARP(invmouse, 0, 0, 1); FVARP(mouseaccel, 0, 0, 1000); - + VAR(thirdperson, 0, 0, 2); FVAR(thirdpersondistance, 0, 20, 50); FVAR(thirdpersonup, -25, 0, 25); @@ -795,12 +795,12 @@ void mousemove(int dx, int dy) float cursens = sensitivity, curaccel = mouseaccel; if(zoom) { - if(zoomautosens) + if(zoomautosens) { cursens = float(sensitivity*zoomfov)/fov; curaccel = float(mouseaccel*zoomfov)/fov; } - else + else { cursens = zoomsens; curaccel = zoomaccel; @@ -844,7 +844,7 @@ void recomputecamera() camera1->type = ENT_CAMERA; camera1->move = -1; camera1->eyeheight = camera1->aboveeye = camera1->radius = camera1->xradius = camera1->yradius = 2; - + matrix3 orient; orient.identity(); orient.rotate_around_z(camera1->yaw*RAD); @@ -852,7 +852,7 @@ void recomputecamera() orient.rotate_around_y(camera1->roll*-RAD); vec dir = vec(orient.b).neg(), side = vec(orient.a).neg(), up = orient.c; - if(game::collidecamera()) + if(game::collidecamera()) { movecamera(camera1, dir, thirdpersondistance, 1); movecamera(camera1, dir, clamp(thirdpersondistance - camera1->o.dist(player->o), 0.0f, 1.0f), 0.1f); @@ -873,7 +873,7 @@ void recomputecamera() movecamera(camera1, side, clamp(dist - camera1->o.dist(pos), 0.0f, 1.0f), 0.1f); } } - else + else { camera1->o.add(vec(dir).mul(thirdpersondistance)); if(thirdpersonup) camera1->o.add(vec(up).mul(thirdpersonup)); @@ -939,7 +939,7 @@ void enablepolygonoffset(GLenum type) glEnable(type); return; } - + bool clipped = reflectz < 1e15f && reflectclip; nooffsetmatrix = projmatrix; @@ -954,7 +954,7 @@ void disablepolygonoffset(GLenum type) glDisable(type); return; } - + projmatrix = nooffsetmatrix; setcamprojmatrix(false, true); } @@ -962,8 +962,8 @@ void disablepolygonoffset(GLenum type) void calcspherescissor(const vec ¢er, float size, float &sx1, float &sy1, float &sx2, float &sy2) { vec worldpos(center), e; - if(reflecting) worldpos.z = 2*reflectz - worldpos.z; - cammatrix.transform(worldpos, e); + if(reflecting) worldpos.z = 2*reflectz - worldpos.z; + cammatrix.transform(worldpos, e); if(e.z > 2*size) { sx1 = sy1 = 1; sx2 = sy2 = -1; return; } float zzrr = e.z*e.z - size*size, dx = e.x*e.x + zzrr, dy = e.y*e.y + zzrr, @@ -1034,7 +1034,7 @@ int pushscissor(float sx1, float sy1, float sx2, float sy2) glScissor(sx, sy, sw, sh); if(scissoring<=1) glEnable(GL_SCISSOR_TEST); - + return scissoring; } @@ -1452,7 +1452,7 @@ void drawreflection(float z, bool refract, int fogdepth, const bvec &col) rendergame(); if(refracting && z>=0 && !isthirdperson() && fabs(camera1->o.z-z) <= 0.5f*(player->eyeheight + player->aboveeye)) - { + { matrix4 oldprojmatrix = projmatrix, avatarproj; avatarproj.perspective(curavatarfov, aspect, nearplane, farplane); if(reflectclip) @@ -1477,7 +1477,7 @@ void drawreflection(float z, bool refract, int fogdepth, const bvec &col) if(fading) glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - if(reflectclip && z>=0) projmatrix = noclipmatrix; + if(reflectclip && z>=0) projmatrix = noclipmatrix; if(reflecting) { @@ -1488,7 +1488,7 @@ void drawreflection(float z, bool refract, int fogdepth, const bvec &col) popfogdist(); popfogcolor(); - + reflectz = 1e16f; refracting = 0; reflecting = fading = fogging = false; @@ -1513,7 +1513,7 @@ void drawcubemap(int size, const vec &o, float yaw, float pitch, const cubemapsi cmcamera.roll = 0; camera1 = &cmcamera; setviewcell(camera1->o); - + int fogmat = lookupmaterial(o)&(MATF_VOLUME|MATF_INDEX); setfog(fogmat); @@ -1653,146 +1653,6 @@ vec calcmodelpreviewpos(const vec &radius, float &yaw) return vec(0, dist, 0).rotate_around_x(camera1->pitch*RAD); } -GLuint minimaptex = 0; -vec minimapcenter(0, 0, 0), minimapradius(0, 0, 0), minimapscale(0, 0, 0); - -void clearminimap() -{ - if(minimaptex) { glDeleteTextures(1, &minimaptex); minimaptex = 0; } -} - -VARR(minimapheight, 0, 0, 2<<16); -bvec minimapcolor(0, 0, 0); -HVARFR(minimapcolour, 0, 0, 0xFFFFFF, -{ - minimapcolor = bvec((minimapcolour>>16)&0xFF, (minimapcolour>>8)&0xFF, minimapcolour&0xFF); -}); -VARR(minimapclip, 0, 0, 1); -VARFP(minimapsize, 7, 8, 10, { if(minimaptex) drawminimap(); }); - -void bindminimap() -{ - glBindTexture(GL_TEXTURE_2D, minimaptex); -} - -void clipminimap(ivec &bbmin, ivec &bbmax, cube *c = worldroot, const ivec &co = ivec(0, 0, 0), int size = worldsize>>1) -{ - loopi(8) - { - ivec o(i, co, size); - if(c[i].children) clipminimap(bbmin, bbmax, c[i].children, o, size>>1); - else if(!isentirelysolid(c[i]) && (c[i].material&MATF_CLIP)!=MAT_CLIP) - { - loopk(3) bbmin[k] = min(bbmin[k], o[k]); - loopk(3) bbmax[k] = max(bbmax[k], o[k] + size); - } - } -} - -void drawminimap() -{ - if(!game::needminimap()) { clearminimap(); return; } - - renderprogress(0, "generating mini-map...", 0, !renderedframe); - - int size = 1<<minimapsize, sizelimit = min(hwtexsize, min(screenw, screenh)); - while(size > sizelimit) size /= 2; - if(!minimaptex) glGenTextures(1, &minimaptex); - - ivec bbmin(worldsize, worldsize, worldsize), bbmax(0, 0, 0); - loopv(valist) - { - vtxarray *va = valist[i]; - loopk(3) - { - if(va->geommin[k]>va->geommax[k]) continue; - bbmin[k] = min(bbmin[k], va->geommin[k]); - bbmax[k] = max(bbmax[k], va->geommax[k]); - } - } - if(minimapclip) - { - ivec clipmin(worldsize, worldsize, worldsize), clipmax(0, 0, 0); - clipminimap(clipmin, clipmax); - loopk(2) bbmin[k] = max(bbmin[k], clipmin[k]); - loopk(2) bbmax[k] = min(bbmax[k], clipmax[k]); - } - - minimapradius = vec(bbmax).sub(vec(bbmin)).mul(0.5f); - minimapcenter = vec(bbmin).add(minimapradius); - minimapradius.x = minimapradius.y = max(minimapradius.x, minimapradius.y); - minimapscale = vec((0.5f - 1.0f/size)/minimapradius.x, (0.5f - 1.0f/size)/minimapradius.y, 1.0f); - - drawtex = DRAWTEX_MINIMAP; - - physent *oldcamera = camera1; - static physent cmcamera; - cmcamera = *player; - cmcamera.reset(); - cmcamera.type = ENT_CAMERA; - cmcamera.o = vec(minimapcenter.x, minimapcenter.y, max(minimapcenter.z + minimapradius.z + 1, float(minimapheight))); - cmcamera.yaw = 0; - cmcamera.pitch = -90; - cmcamera.roll = 0; - camera1 = &cmcamera; - setviewcell(vec(-1, -1, -1)); - - projmatrix.ortho(-minimapradius.x, minimapradius.x, -minimapradius.y, minimapradius.y, 0, camera1->o.z + 1); - projmatrix.a.mul(-1); - setcamprojmatrix(); - - setnofog(minimapcolor.tocolor()); - - glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); - - glViewport(0, 0, size, size); - - glEnable(GL_CULL_FACE); - glEnable(GL_DEPTH_TEST); - - glFrontFace(GL_CCW); - - xtravertsva = xtraverts = glde = gbatches = 0; - - visiblecubes(false); - queryreflections(); - drawreflections(); - - loopi(minimapheight > 0 && minimapheight < minimapcenter.z + minimapradius.z ? 2 : 1) - { - if(i) - { - glClear(GL_DEPTH_BUFFER_BIT); - camera1->o.z = minimapheight; - setcamprojmatrix(); - } - rendergeom(); - rendermapmodels(); - renderwater(); - rendermaterials(); - renderalphageom(); - } - - glFrontFace(GL_CW); - - glDisable(GL_DEPTH_TEST); - glDisable(GL_CULL_FACE); - - glViewport(0, 0, screenw, screenh); - - camera1 = oldcamera; - drawtex = 0; - - glBindTexture(GL_TEXTURE_2D, minimaptex); - glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5, 0, 0, size, size, 0); - setuptexparameters(minimaptex, NULL, 3, 1, GL_RGB5, GL_TEXTURE_2D); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - GLfloat border[4] = { minimapcolor.x/255.0f, minimapcolor.y/255.0f, minimapcolor.z/255.0f, 1.0f }; - glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border); - glBindTexture(GL_TEXTURE_2D, 0); -} - bool deferdrawtextures = false; void drawtextures() @@ -1800,7 +1660,6 @@ void drawtextures() if(minimized) { deferdrawtextures = true; return; } deferdrawtextures = false; genenvmaps(); - drawminimap(); } GLuint motiontex = 0; @@ -1870,7 +1729,7 @@ void gl_drawframe() int w = screenw, h = screenh; aspect = forceaspect ? forceaspect : w/float(h); fovy = 2*atan2(tan(curfov/2*RAD), aspect)/RAD; - + int fogmat = lookupmaterial(camera1->o)&(MATF_VOLUME|MATF_INDEX), abovemat = MAT_AIR; float fogblend = 1.0f, causticspass = 0.0f; if(isliquid(fogmat&MATF_VOLUME)) @@ -1881,7 +1740,7 @@ void gl_drawframe() if(caustics && (fogmat&MATF_VOLUME)==MAT_WATER && camera1->o.z < z) causticspass = min(z - camera1->o.z, 1.0f); } - else fogmat = MAT_AIR; + else fogmat = MAT_AIR; setfog(fogmat, fogblend, abovemat); if(fogmat!=MAT_AIR) { @@ -1901,10 +1760,10 @@ void gl_drawframe() xtravertsva = xtraverts = glde = gbatches = 0; visiblecubes(); - + glClear(GL_DEPTH_BUFFER_BIT|(wireframe && editmode ? GL_COLOR_BUFFER_BIT : 0)); - if(wireframe && editmode) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + if(wireframe && editmode) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); if(limitsky()) drawskybox(farplane, true); @@ -1979,7 +1838,7 @@ void damagecompass(int n, const vec &loc) { if(!usedamagecompass || minimized) return; vec delta(loc); - delta.sub(camera1->o); + delta.sub(camera1->o); float yaw = 0, pitch; if(delta.magnitude() > 4) { @@ -2087,7 +1946,7 @@ void loadcrosshair(const char *name, int i) { if(i < 0 || i >= MAXCROSSHAIRS) return; crosshairs[i] = name ? textureload(name, 3, true) : notexture; - if(crosshairs[i] == notexture) + if(crosshairs[i] == notexture) { name = game::defaultcrosshair(i); if(!name) name = "data/crosshair.png"; @@ -2102,7 +1961,7 @@ void loadcrosshair_(const char *name, int *i) COMMANDN(loadcrosshair, loadcrosshair_, "si"); -ICOMMAND(getcrosshair, "i", (int *i), +ICOMMAND(getcrosshair, "i", (int *i), { const char *name = ""; if(*i >= 0 && *i < MAXCROSSHAIRS) @@ -2112,7 +1971,7 @@ ICOMMAND(getcrosshair, "i", (int *i), } result(name); }); - + void writecrosshairs(stream *f) { loopi(MAXCROSSHAIRS) if(crosshairs[i] && crosshairs[i]!=notexture) @@ -2137,13 +1996,13 @@ void drawcrosshair(int w, int h) g3d_cursorpos(cx, cy); } else - { + { int index = game::selectcrosshair(color); if(index < 0) return; if(!crosshairfx) index = 0; if(!crosshairfx || !crosshaircolors) color = vec(1, 1, 1); crosshair = crosshairs[index]; - if(!crosshair) + if(!crosshair) { loadcrosshair(NULL, index); crosshair = crosshairs[index]; @@ -2198,7 +2057,7 @@ void gl_drawhud() hudmatrix.ortho(0, w, h, 0, -1, 1); resethudmatrix(); - + gle::colorf(1, 1, 1); extern int debugsm; @@ -2223,10 +2082,10 @@ void gl_drawhud() } glEnable(GL_BLEND); - + extern void debugparticles(); debugparticles(); - + if(!mainmenu) { drawdamagescreen(w, h); @@ -2274,12 +2133,12 @@ void gl_drawhud() char *dst = buf; const char *src = &buf[!wallclock24 && buf[0]=='0' ? 1 : 0]; while(*src) *dst++ = tolower(*src++); - *dst++ = '\0'; + *dst++ = '\0'; draw_text(buf, conw-5*FONTH, conh-FONTH*3/2-roffset); roffset += FONTH; } } - + if(editmode || showeditstats) { static int laststats = 0, prevstats[8] = { 0, 0, 0, 0, 0, 0, 0 }, curstats[8] = { 0, 0, 0, 0, 0, 0, 0 }; @@ -2378,8 +2237,6 @@ void cleanupgl() { cleanupmotionblur(); - clearminimap(); - cleanupscreenquad(); gle::cleanup(); |
