diff options
| author | xolatile | 2025-08-06 22:54:55 +0200 |
|---|---|---|
| committer | xolatile | 2025-08-06 22:54:55 +0200 |
| commit | 0a1172b75f571685c264a8b9d8ee224bbf11381f (patch) | |
| tree | d041fdc68a60f0ebb48a3852bbcce6d9432f83d5 /src/engine/rendergl.cpp | |
| parent | affde05dc07a94643f1fd2751b2b441f57f73d7d (diff) | |
| download | xolatile-badassbug-0a1172b75f571685c264a8b9d8ee224bbf11381f.tar.xz xolatile-badassbug-0a1172b75f571685c264a8b9d8ee224bbf11381f.tar.zst | |
Please do not hate me, it makes sense...
Diffstat (limited to 'src/engine/rendergl.cpp')
| -rw-r--r-- | src/engine/rendergl.cpp | 516 |
1 files changed, 130 insertions, 386 deletions
diff --git a/src/engine/rendergl.cpp b/src/engine/rendergl.cpp index 7489ff5..b8b28c5 100644 --- a/src/engine/rendergl.cpp +++ b/src/engine/rendergl.cpp @@ -143,8 +143,7 @@ PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays_ = NULL; PFNGLGENVERTEXARRAYSPROC glGenVertexArrays_ = NULL; PFNGLISVERTEXARRAYPROC glIsVertexArray_ = NULL; -void *getprocaddress(const char *name) -{ +void *getprocaddress(const char *name) { return SDL_GL_GetProcAddress(name); } @@ -162,23 +161,18 @@ VAR(rtsharefb, 0, 1, 1); hashset<const char *> glexts; -void parseglexts() -{ - if(glversion >= 300) - { +void parseglexts() { + if(glversion >= 300) { GLint numexts = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &numexts); - loopi(numexts) - { + loopi(numexts) { const char *ext = (const char *)glGetStringi_(GL_EXTENSIONS, i); glexts.add(newstring(ext)); } } - else - { + else { const char *exts = (const char *)glGetString(GL_EXTENSIONS); - for(;;) - { + for(;;) { while(*exts == ' ') exts++; if(!*exts) break; const char *ext = exts; @@ -188,47 +182,35 @@ void parseglexts() } } -bool hasext(const char *ext) -{ +bool hasext(const char *ext) { return glexts.access(ext)!=NULL; } -void gl_checkextensions() -{ +void gl_checkextensions() { const char *vendor = (const char *)glGetString(GL_VENDOR); const char *renderer = (const char *)glGetString(GL_RENDERER); const char *version = (const char *)glGetString(GL_VERSION); conoutf(CON_INIT, "Renderer: %s (%s)", renderer, vendor); conoutf(CON_INIT, "Driver: %s", version); - - bool mesa = false, intel = false, ati = false, nvidia = false; - if(strstr(renderer, "Mesa") || strstr(version, "Mesa")) - { + bool mesa = false, ati = false, nvidia = false; + if(strstr(renderer, "Mesa") || strstr(version, "Mesa")) { mesa = true; - if(strstr(renderer, "Intel")) intel = true; } else if(strstr(vendor, "NVIDIA")) nvidia = true; else if(strstr(vendor, "ATI") || strstr(vendor, "Advanced Micro Devices")) ati = true; - else if(strstr(vendor, "Intel")) - intel = true; - uint glmajorversion, glminorversion; if(sscanf(version, " %u.%u", &glmajorversion, &glminorversion) != 2) glversion = 100; else glversion = glmajorversion*100 + glminorversion*10; - if(glversion < 200) fatal("OpenGL 2.0 or greater is required!"); - glMultiDrawArrays_ = (PFNGLMULTIDRAWARRAYSPROC) getprocaddress("glMultiDrawArrays"); glMultiDrawElements_ = (PFNGLMULTIDRAWELEMENTSPROC) getprocaddress("glMultiDrawElements"); - glBlendFuncSeparate_ = (PFNGLBLENDFUNCSEPARATEPROC) getprocaddress("glBlendFuncSeparate"); glBlendEquationSeparate_ = (PFNGLBLENDEQUATIONSEPARATEPROC) getprocaddress("glBlendEquationSeparate"); glStencilOpSeparate_ = (PFNGLSTENCILOPSEPARATEPROC) getprocaddress("glStencilOpSeparate"); glStencilFuncSeparate_ = (PFNGLSTENCILFUNCSEPARATEPROC) getprocaddress("glStencilFuncSeparate"); glStencilMaskSeparate_ = (PFNGLSTENCILMASKSEPARATEPROC) getprocaddress("glStencilMaskSeparate"); - glGenBuffers_ = (PFNGLGENBUFFERSPROC) getprocaddress("glGenBuffers"); glBindBuffer_ = (PFNGLBINDBUFFERPROC) getprocaddress("glBindBuffer"); glMapBuffer_ = (PFNGLMAPBUFFERPROC) getprocaddress("glMapBuffer"); @@ -237,7 +219,6 @@ void gl_checkextensions() glBufferSubData_ = (PFNGLBUFFERSUBDATAPROC) getprocaddress("glBufferSubData"); glDeleteBuffers_ = (PFNGLDELETEBUFFERSPROC) getprocaddress("glDeleteBuffers"); glGetBufferSubData_ = (PFNGLGETBUFFERSUBDATAPROC) getprocaddress("glGetBufferSubData"); - glGetQueryiv_ = (PFNGLGETQUERYIVPROC) getprocaddress("glGetQueryiv"); glGenQueries_ = (PFNGLGENQUERIESPROC) getprocaddress("glGenQueries"); glDeleteQueries_ = (PFNGLDELETEQUERIESPROC) getprocaddress("glDeleteQueries"); @@ -245,7 +226,6 @@ void gl_checkextensions() glEndQuery_ = (PFNGLENDQUERYPROC) getprocaddress("glEndQuery"); glGetQueryObjectiv_ = (PFNGLGETQUERYOBJECTIVPROC) getprocaddress("glGetQueryObjectiv"); glGetQueryObjectuiv_ = (PFNGLGETQUERYOBJECTUIVPROC) getprocaddress("glGetQueryObjectuiv"); - glCreateProgram_ = (PFNGLCREATEPROGRAMPROC) getprocaddress("glCreateProgram"); glDeleteProgram_ = (PFNGLDELETEPROGRAMPROC) getprocaddress("glDeleteProgram"); glUseProgram_ = (PFNGLUSEPROGRAMPROC) getprocaddress("glUseProgram"); @@ -283,7 +263,6 @@ void gl_checkextensions() glGetActiveUniform_ = (PFNGLGETACTIVEUNIFORMPROC) getprocaddress("glGetActiveUniform"); glEnableVertexAttribArray_ = (PFNGLENABLEVERTEXATTRIBARRAYPROC) getprocaddress("glEnableVertexAttribArray"); glDisableVertexAttribArray_ = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) getprocaddress("glDisableVertexAttribArray"); - glVertexAttrib1f_ = (PFNGLVERTEXATTRIB1FPROC) getprocaddress("glVertexAttrib1f"); glVertexAttrib1fv_ = (PFNGLVERTEXATTRIB1FVPROC) getprocaddress("glVertexAttrib1fv"); glVertexAttrib1s_ = (PFNGLVERTEXATTRIB1SPROC) getprocaddress("glVertexAttrib1s"); @@ -312,44 +291,31 @@ void gl_checkextensions() glVertexAttrib4Nuiv_ = (PFNGLVERTEXATTRIB4NUIVPROC) getprocaddress("glVertexAttrib4Nuiv"); glVertexAttrib4Nusv_ = (PFNGLVERTEXATTRIB4NUSVPROC) getprocaddress("glVertexAttrib4Nusv"); glVertexAttribPointer_ = (PFNGLVERTEXATTRIBPOINTERPROC) getprocaddress("glVertexAttribPointer"); - glDrawBuffers_ = (PFNGLDRAWBUFFERSPROC) getprocaddress("glDrawBuffers"); - - if(glversion >= 300) - { + if(glversion >= 300) { glGetStringi_ = (PFNGLGETSTRINGIPROC) getprocaddress("glGetStringi"); glBindFragDataLocation_ = (PFNGLBINDFRAGDATALOCATIONPROC)getprocaddress("glBindFragDataLocation"); } - const char *glslstr = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION); uint glslmajorversion, glslminorversion; if(glslstr && sscanf(glslstr, " %u.%u", &glslmajorversion, &glslminorversion) == 2) glslversion = glslmajorversion*100 + glslminorversion; - if(glslversion < 120) fatal("GLSL 1.20 or greater is required!"); - parseglexts(); - GLint val; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &val); hwtexsize = val; glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &val); hwcubetexsize = val; - - if(glversion >= 300 || hasext("GL_ARB_texture_float") || hasext("GL_ATI_texture_float")) - { + if(glversion >= 300 || hasext("GL_ARB_texture_float") || hasext("GL_ATI_texture_float")) { hasTF = true; shadowmap = 1; extern int smoothshadowmappeel; smoothshadowmappeel = 1; } - - if(glversion >= 300 || hasext("GL_ARB_texture_rg")) - { + if(glversion >= 300 || hasext("GL_ARB_texture_rg")) { hasTRG = true; } - - if(glversion >= 300 || hasext("GL_ARB_framebuffer_object")) - { + if(glversion >= 300 || hasext("GL_ARB_framebuffer_object")) { glBindRenderbuffer_ = (PFNGLBINDRENDERBUFFERPROC) getprocaddress("glBindRenderbuffer"); glDeleteRenderbuffers_ = (PFNGLDELETERENDERBUFFERSPROC) getprocaddress("glDeleteRenderbuffers"); glGenRenderbuffers_ = (PFNGLGENFRAMEBUFFERSPROC) getprocaddress("glGenRenderbuffers"); @@ -364,8 +330,7 @@ void gl_checkextensions() glBlitFramebuffer_ = (PFNGLBLITFRAMEBUFFERPROC) getprocaddress("glBlitFramebuffer"); hasAFBO = hasFBO = hasFBB = hasDS = true; } - else if(hasext("GL_EXT_framebuffer_object")) - { + else if(hasext("GL_EXT_framebuffer_object")) { glBindRenderbuffer_ = (PFNGLBINDRENDERBUFFERPROC) getprocaddress("glBindRenderbufferEXT"); glDeleteRenderbuffers_ = (PFNGLDELETERENDERBUFFERSPROC) getprocaddress("glDeleteRenderbuffersEXT"); glGenRenderbuffers_ = (PFNGLGENFRAMEBUFFERSPROC) getprocaddress("glGenRenderbuffersEXT"); @@ -378,49 +343,36 @@ void gl_checkextensions() glFramebufferRenderbuffer_ = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)getprocaddress("glFramebufferRenderbufferEXT"); glGenerateMipmap_ = (PFNGLGENERATEMIPMAPPROC) getprocaddress("glGenerateMipmapEXT"); hasFBO = true; - - if(hasext("GL_EXT_framebuffer_blit")) - { + if(hasext("GL_EXT_framebuffer_blit")) { glBlitFramebuffer_ = (PFNGLBLITFRAMEBUFFERPROC) getprocaddress("glBlitFramebufferEXT"); hasFBB = true; } - - if(hasext("GL_EXT_packed_depth_stencil") || hasext("GL_NV_packed_depth_stencil")) - { + if(hasext("GL_EXT_packed_depth_stencil") || hasext("GL_NV_packed_depth_stencil")) { hasDS = true; } } else fatal("Framebuffer object support is required!"); - - if(ati) - { + if(ati) { minimizetcusage = 1; // On Catalyst 10.2, issuing an occlusion query on the first draw using a given cubemap texture causes a nasty crash ati_cubemap_bug = 1; } - else if(nvidia) - { + else if(nvidia) { reservevpparams = 10; rtsharefb = 0; // work-around for strange driver stalls involving when using many FBOs extern int filltjoints; if(glversion < 300 && !hasext("GL_EXT_gpu_shader4")) filltjoints = 0; // DX9 or less NV cards seem to not cause many sparklies } - else - { + else { reservevpparams = 20; - if(mesa) mesa_swap_bug = 1; } - - if(glversion >= 300 || hasext("GL_ARB_map_buffer_range")) - { + if(glversion >= 300 || hasext("GL_ARB_map_buffer_range")) { glMapBufferRange_ = (PFNGLMAPBUFFERRANGEPROC) getprocaddress("glMapBufferRange"); glFlushMappedBufferRange_ = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)getprocaddress("glFlushMappedBufferRange"); hasMBR = true; } - - if(glversion >= 310 || hasext("GL_ARB_uniform_buffer_object")) - { + if(glversion >= 310 || hasext("GL_ARB_uniform_buffer_object")) { glGetUniformIndices_ = (PFNGLGETUNIFORMINDICESPROC) getprocaddress("glGetUniformIndices"); glGetActiveUniformsiv_ = (PFNGLGETACTIVEUNIFORMSIVPROC) getprocaddress("glGetActiveUniformsiv"); glGetUniformBlockIndex_ = (PFNGLGETUNIFORMBLOCKINDEXPROC) getprocaddress("glGetUniformBlockIndex"); @@ -428,66 +380,50 @@ void gl_checkextensions() glUniformBlockBinding_ = (PFNGLUNIFORMBLOCKBINDINGPROC) getprocaddress("glUniformBlockBinding"); glBindBufferBase_ = (PFNGLBINDBUFFERBASEPROC) getprocaddress("glBindBufferBase"); glBindBufferRange_ = (PFNGLBINDBUFFERRANGEPROC) getprocaddress("glBindBufferRange"); - useubo = 1; hasUBO = true; } - - if(glversion >= 300 || hasext("GL_ARB_vertex_array_object")) - { + if(glversion >= 300 || hasext("GL_ARB_vertex_array_object")) { glBindVertexArray_ = (PFNGLBINDVERTEXARRAYPROC) getprocaddress("glBindVertexArray"); glDeleteVertexArrays_ = (PFNGLDELETEVERTEXARRAYSPROC)getprocaddress("glDeleteVertexArrays"); glGenVertexArrays_ = (PFNGLGENVERTEXARRAYSPROC) getprocaddress("glGenVertexArrays"); glIsVertexArray_ = (PFNGLISVERTEXARRAYPROC) getprocaddress("glIsVertexArray"); hasVAO = true; } - else if(hasext("GL_APPLE_vertex_array_object")) - { + else if(hasext("GL_APPLE_vertex_array_object")) { glBindVertexArray_ = (PFNGLBINDVERTEXARRAYPROC) getprocaddress("glBindVertexArrayAPPLE"); glDeleteVertexArrays_ = (PFNGLDELETEVERTEXARRAYSPROC)getprocaddress("glDeleteVertexArraysAPPLE"); glGenVertexArrays_ = (PFNGLGENVERTEXARRAYSPROC) getprocaddress("glGenVertexArraysAPPLE"); glIsVertexArray_ = (PFNGLISVERTEXARRAYPROC) getprocaddress("glIsVertexArrayAPPLE"); hasVAO = true; } - - if(glversion >= 330 || hasext("GL_ARB_texture_swizzle") || hasext("GL_EXT_texture_swizzle")) - { + if(glversion >= 330 || hasext("GL_ARB_texture_swizzle") || hasext("GL_EXT_texture_swizzle")) { hasTSW = true; } - - if(hasext("GL_EXT_texture_compression_s3tc")) - { + if(hasext("GL_EXT_texture_compression_s3tc")) { hasS3TC = true; if(!mesa) usetexcompress = 2; } - else if(hasext("GL_EXT_texture_compression_dxt1") && hasext("GL_ANGLE_texture_compression_dxt3") && hasext("GL_ANGLE_texture_compression_dxt5")) - { + else if(hasext("GL_EXT_texture_compression_dxt1") && hasext("GL_ANGLE_texture_compression_dxt3") && hasext("GL_ANGLE_texture_compression_dxt5")) { hasS3TC = true; } - if(hasext("GL_3DFX_texture_compression_FXT1")) - { + if(hasext("GL_3DFX_texture_compression_FXT1")) { hasFXT1 = true; if(mesa) usetexcompress = max(usetexcompress, 1); } - if(hasext("GL_EXT_texture_compression_latc")) - { + if(hasext("GL_EXT_texture_compression_latc")) { hasLATC = true; } - if(glversion >= 300 || hasext("GL_ARB_texture_compression_rgtc") || hasext("GL_EXT_texture_compression_rgtc")) - { + if(glversion >= 300 || hasext("GL_ARB_texture_compression_rgtc") || hasext("GL_EXT_texture_compression_rgtc")) { hasRGTC = true; } - - if(hasext("GL_EXT_texture_filter_anisotropic")) - { + if(hasext("GL_EXT_texture_filter_anisotropic")) { GLint val; glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &val); hwmaxaniso = val; hasAF = true; } - - if(glversion >= 300 || hasext("GL_EXT_gpu_shader4")) - { + if(glversion >= 300 || hasext("GL_EXT_gpu_shader4")) { // on DX10 or above class cards (i.e. GF8 or RadeonHD) enable expensive features extern int maxdynlights, texcompress; maxdynlights = MAXDYNLIGHTS; @@ -495,37 +431,28 @@ void gl_checkextensions() } } -void glext(char *ext) -{ +void glext(char *ext) { intret(hasext(ext) ? 1 : 0); } COMMAND(glext, "s"); -void gl_resize() -{ +void gl_resize() { glViewport(0, 0, screenw, screenh); } -void gl_init() -{ +void gl_init() { glClearColor(0, 0, 0, 0); glClearDepth(1); glDepthFunc(GL_LESS); glDisable(GL_DEPTH_TEST); - glEnable(GL_LINE_SMOOTH); //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); - glFrontFace(GL_CW); glCullFace(GL_BACK); glDisable(GL_CULL_FACE); - gle::setup(); - setupshaders(); - setuptexcompress(); - gl_resize(); } @@ -534,95 +461,76 @@ 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); }); vec worldpos, camdir, camright, camup; -void setcammatrix() -{ +void setcammatrix() { // move from RH to Z-up LH quake style worldspace cammatrix = viewmatrix; cammatrix.rotate_around_y(camera1->roll*RAD); cammatrix.rotate_around_x(camera1->pitch*-RAD); cammatrix.rotate_around_z(camera1->yaw*-RAD); cammatrix.translate(vec(camera1->o).neg()); - cammatrix.transposedtransformnormal(vec(viewmatrix.b), camdir); cammatrix.transposedtransformnormal(vec(viewmatrix.a).neg(), camright); cammatrix.transposedtransformnormal(vec(viewmatrix.c), camup); - - if(!drawtex) - { + if(!drawtex) { if(raycubepos(camera1->o, camdir, worldpos, 0, RAY_CLIPMAT|RAY_SKIPFIRST) == -1) worldpos = vec(camdir).mul(2*worldsize).add(camera1->o); // if nothing is hit, just far away in the view direction } } -void setcamprojmatrix(bool init = true, bool flush = false) -{ - if(init) - { +void setcamprojmatrix(bool init = true, bool flush = false) { + if(init) { setcammatrix(); } - camprojmatrix.muld(projmatrix, cammatrix); - - if(init) - { + if(init) { invcammatrix.invert(cammatrix); invcamprojmatrix.invert(camprojmatrix); } - GLOBALPARAM(camprojmatrix, camprojmatrix); - if(flush && Shader::lastshader) Shader::lastshader->flushparams(); } matrix4 hudmatrix, hudmatrixstack[64]; int hudmatrixpos = 0; -void resethudmatrix() -{ +void resethudmatrix() { hudmatrixpos = 0; GLOBALPARAM(hudmatrix, hudmatrix); } -void pushhudmatrix() -{ +void pushhudmatrix() { if(hudmatrixpos >= 0 && hudmatrixpos < int(sizeof(hudmatrixstack)/sizeof(hudmatrixstack[0]))) hudmatrixstack[hudmatrixpos] = hudmatrix; ++hudmatrixpos; } -void flushhudmatrix(bool flushparams) -{ +void flushhudmatrix(bool flushparams) { GLOBALPARAM(hudmatrix, hudmatrix); if(flushparams && Shader::lastshader) Shader::lastshader->flushparams(); } -void pophudmatrix(bool flush, bool flushparams) -{ +void pophudmatrix(bool flush, bool flushparams) { --hudmatrixpos; - if(hudmatrixpos >= 0 && hudmatrixpos < int(sizeof(hudmatrixstack)/sizeof(hudmatrixstack[0]))) - { + if(hudmatrixpos >= 0 && hudmatrixpos < int(sizeof(hudmatrixstack)/sizeof(hudmatrixstack[0]))) { hudmatrix = hudmatrixstack[hudmatrixpos]; if(flush) flushhudmatrix(flushparams); } } -void pushhudscale(float sx, float sy) -{ +void pushhudscale(float sx, float sy) { if(!sy) sy = sx; pushhudmatrix(); hudmatrix.scale(sx, sy, 1); flushhudmatrix(); } -void pushhudtranslate(float tx, float ty, float sx, float sy) -{ +void pushhudtranslate(float tx, float ty, float sx, float sy) { if(!sy) sy = sx; pushhudmatrix(); hudmatrix.translate(tx, ty, 0); @@ -644,18 +552,15 @@ FVARNP(aspect, forceaspect, 0, 0, 1e3f); static float zoomprogress = 0; VAR(zoom, -1, 0, 1); -void disablezoom() -{ +void disablezoom() { zoom = 0; zoomprogress = 0; } -void computezoom() -{ +void computezoom() { if(!zoom) { zoomprogress = 0; curfov = fov; curavatarfov = avatarfov; return; } if(zoom > 0) zoomprogress = zoominvel ? min(zoomprogress + float(elapsedtime) / zoominvel, 1.0f) : 1; - else - { + else { zoomprogress = zoomoutvel ? max(zoomprogress - float(elapsedtime) / zoomoutvel, 0.0f) : 0; if(zoomprogress <= 0) zoom = 0; } @@ -679,8 +584,7 @@ physent *camera1 = NULL; bool detachedcamera = false; bool isthirdperson() { return player!=camera1 || detachedcamera; } -void fixcamerarange() -{ +void fixcamerarange() { const float MAXPITCH = 90.0f; if(camera1->pitch>MAXPITCH) camera1->pitch = MAXPITCH; if(camera1->pitch<-MAXPITCH) camera1->pitch = -MAXPITCH; @@ -688,19 +592,15 @@ void fixcamerarange() while(camera1->yaw>=360.0f) camera1->yaw -= 360.0f; } -void mousemove(int dx, int dy) -{ +void mousemove(int dx, int dy) { if(!game::allowmouselook()) return; float cursens = sensitivity, curaccel = mouseaccel; - if(zoom) - { - if(zoomautosens) - { + if(zoom) { + if(zoomautosens) { cursens = float(sensitivity*zoomfov)/fov; curaccel = float(mouseaccel*zoomfov)/fov; } - else - { + else { cursens = zoomsens; curaccel = zoomaccel; } @@ -710,33 +610,27 @@ void mousemove(int dx, int dy) camera1->yaw += dx*cursens; camera1->pitch -= dy*cursens*(invmouse ? -1 : 1); fixcamerarange(); - if(camera1!=player && !detachedcamera) - { + if(camera1!=player && !detachedcamera) { player->yaw = camera1->yaw; player->pitch = camera1->pitch; } speedmodifier += abs(dx)-abs(dy); } -void recomputecamera() -{ +void recomputecamera() { game::setupcamera(); computezoom(); - bool allowthirdperson = game::allowthirdperson(); bool shoulddetach = (allowthirdperson && thirdperson > 1) || game::detachcamera(); - if((!allowthirdperson || !thirdperson) && !shoulddetach) - { + if((!allowthirdperson || !thirdperson) && !shoulddetach) { camera1 = player; detachedcamera = false; } - else - { + else { static physent tempcamera; camera1 = &tempcamera; if(detachedcamera && shoulddetach) camera1->o = player->o; - else - { + else { *camera1 = *player; detachedcamera = shoulddetach; } @@ -744,28 +638,23 @@ 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); orient.rotate_around_x(camera1->pitch*RAD); 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); - if(thirdpersonup) - { + if(thirdpersonup) { vec pos = camera1->o; float dist = fabs(thirdpersonup); if(thirdpersonup < 0) up.neg(); movecamera(camera1, up, dist, 1); movecamera(camera1, up, clamp(dist - camera1->o.dist(pos), 0.0f, 1.0f), 0.1f); } - if(thirdpersonside) - { + if(thirdpersonside) { vec pos = camera1->o; float dist = fabs(thirdpersonside); if(thirdpersonside < 0) side.neg(); @@ -773,8 +662,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)); if(thirdpersonside) camera1->o.add(vec(side).mul(thirdpersonside)); @@ -787,8 +675,7 @@ matrix4 cammatrix, projmatrix, camprojmatrix, invcammatrix, invcamprojmatrix; FVAR(nearplane, 0.01f, 0.54f, 2.0f); -vec calcavatarpos(const vec &pos, float dist) -{ +vec calcavatarpos(const vec &pos, float dist) { vec eyepos; cammatrix.transform(pos, eyepos); GLdouble ydist = nearplane * tan(curavatarfov/2*RAD), xdist = ydist * aspect; @@ -797,7 +684,6 @@ vec calcavatarpos(const vec &pos, float dist) scrpos.y = eyepos.y*nearplane/ydist; scrpos.z = (eyepos.z*(farplane + nearplane) - 2*nearplane*farplane) / (farplane - nearplane); scrpos.w = -eyepos.z; - vec worldpos = invcamprojmatrix.perspectivetransform(scrpos); vec dir = vec(worldpos).sub(camera1->o).rescale(dist); return dir.add(camera1->o); @@ -805,17 +691,13 @@ vec calcavatarpos(const vec &pos, float dist) matrix4 clipmatrix, noclipmatrix; -void renderavatar() -{ +void renderavatar() { if(isthirdperson()) return; - matrix4 oldprojmatrix = projmatrix; projmatrix.perspective(curavatarfov, aspect, nearplane, farplane); projmatrix.scalez(avatardepth); setcamprojmatrix(false); - game::renderavatar(); - projmatrix = oldprojmatrix; setcamprojmatrix(false); } @@ -826,36 +708,28 @@ FVAR(depthoffset, -1e4f, 0.01f, 1e4f); matrix4 nooffsetmatrix; -void enablepolygonoffset(GLenum type) -{ - if(!depthoffset) - { +void enablepolygonoffset(GLenum type) { + if(!depthoffset) { glPolygonOffset(polygonoffsetfactor, polygonoffsetunits); glEnable(type); return; } - bool clipped = false; - nooffsetmatrix = projmatrix; projmatrix.d.z += depthoffset * (clipped ? noclipmatrix.c.z : projmatrix.c.z); setcamprojmatrix(false, true); } -void disablepolygonoffset(GLenum type) -{ - if(!depthoffset) - { +void disablepolygonoffset(GLenum type) { + if(!depthoffset) { glDisable(type); return; } - projmatrix = nooffsetmatrix; setcamprojmatrix(false, true); } -void calcspherescissor(const vec ¢er, float size, float &sx1, float &sy1, float &sx2, float &sy2) -{ +void calcspherescissor(const vec ¢er, float size, float &sx1, float &sy1, float &sx2, float &sy2) { vec worldpos(center), e; cammatrix.transform(worldpos, e); if(e.z > 2*size) { sx1 = sy1 = 1; sx2 = sy2 = -1; return; } @@ -868,22 +742,20 @@ void calcspherescissor(const vec ¢er, float size, float &sx1, float &sy1, fl do { \ float nzc = (cz*cz + 1) / (cz dir drt) - cz, \ pz = (d##c)/(nzc*e.c - e.z); \ - if(pz > 0) \ - { \ + if(pz > 0) { \ + \ float c = (focaldist)*nzc, \ pc = pz*nzc; \ if(pc < e.c) low = c; \ else if(pc > e.c) high = c; \ } \ } while(0) - if(dx > 0) - { + if(dx > 0) { float cz = e.x/e.z, drt = sqrtf(dx)/size; CHECKPLANE(x, -, focaldist/aspect, sx1, sx2); CHECKPLANE(x, +, focaldist/aspect, sx1, sx2); } - if(dy > 0) - { + if(dy > 0) { float cz = e.y/e.z, drt = sqrtf(dy)/size; CHECKPLANE(y, -, focaldist, sy1, sy2); CHECKPLANE(y, +, focaldist, sy1, sy2); @@ -893,17 +765,13 @@ void calcspherescissor(const vec ¢er, float size, float &sx1, float &sy1, fl static int scissoring = 0; static GLint oldscissor[4]; -int pushscissor(float sx1, float sy1, float sx2, float sy2) -{ +int pushscissor(float sx1, float sy1, float sx2, float sy2) { scissoring = 0; - if(sx1 <= -1 && sy1 <= -1 && sx2 >= 1 && sy2 >= 1) return 0; - sx1 = max(sx1, -1.0f); sy1 = max(sy1, -1.0f); sx2 = min(sx2, 1.0f); sy2 = min(sy2, 1.0f); - GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); int sx = viewport[0] + int(floor((sx1+1)*0.5f*viewport[2])), @@ -911,9 +779,7 @@ int pushscissor(float sx1, float sy1, float sx2, float sy2) sw = viewport[0] + int(ceil((sx2+1)*0.5f*viewport[2])) - sx, sh = viewport[1] + int(ceil((sy2+1)*0.5f*viewport[3])) - sy; if(sw <= 0 || sh <= 0) return 0; - - if(glIsEnabled(GL_SCISSOR_TEST)) - { + if(glIsEnabled(GL_SCISSOR_TEST)) { glGetIntegerv(GL_SCISSOR_BOX, oldscissor); sw += sx; sh += sy; @@ -925,15 +791,12 @@ int pushscissor(float sx1, float sy1, float sx2, float sy2) scissoring = 2; } else scissoring = 1; - glScissor(sx, sy, sw, sh); if(scissoring<=1) glEnable(GL_SCISSOR_TEST); - return scissoring; } -void popscissor() -{ +void popscissor() { if(scissoring>1) glScissor(oldscissor[0], oldscissor[1], oldscissor[2], oldscissor[3]); else if(scissoring) glDisable(GL_SCISSOR_TEST); scissoring = 0; @@ -941,10 +804,8 @@ void popscissor() static GLuint screenquadvbo = 0; -static void setupscreenquad() -{ - if(!screenquadvbo) - { +static void setupscreenquad() { + if(!screenquadvbo) { glGenBuffers_(1, &screenquadvbo); gle::bindvbo(screenquadvbo); vec2 verts[4] = { vec2(1, -1), vec2(-1, -1), vec2(1, 1), vec2(-1, 1) }; @@ -953,13 +814,11 @@ static void setupscreenquad() } } -static void cleanupscreenquad() -{ +static void cleanupscreenquad() { if(screenquadvbo) { glDeleteBuffers_(1, &screenquadvbo); screenquadvbo = 0; } } -void screenquad() -{ +void screenquad() { setupscreenquad(); gle::bindvbo(screenquadvbo); gle::enablevertex(); @@ -971,38 +830,32 @@ void screenquad() static LocalShaderParam screentexcoord[2] = { LocalShaderParam("screentexcoord0"), LocalShaderParam("screentexcoord1") }; -static inline void setscreentexcoord(int i, float w, float h, float x = 0, float y = 0) -{ +static inline void setscreentexcoord(int i, float w, float h, float x = 0, float y = 0) { screentexcoord[i].setf(w*0.5f, h*0.5f, x + w*0.5f, y + fabs(h)*0.5f); } -void screenquad(float sw, float sh) -{ +void screenquad(float sw, float sh) { setscreentexcoord(0, sw, sh); screenquad(); } -void screenquadflipped(float sw, float sh) -{ +void screenquadflipped(float sw, float sh) { setscreentexcoord(0, sw, -sh); screenquad(); } -void screenquad(float sw, float sh, float sw2, float sh2) -{ +void screenquad(float sw, float sh, float sw2, float sh2) { setscreentexcoord(0, sw, sh); setscreentexcoord(1, sw2, sh2); screenquad(); } -void screenquadoffset(float x, float y, float w, float h) -{ +void screenquadoffset(float x, float y, float w, float h) { setscreentexcoord(0, w, h, x, y); screenquad(); } -void screenquadoffset(float x, float y, float w, float h, float x2, float y2, float w2, float h2) -{ +void screenquadoffset(float x, float y, float w, float h, float x2, float y2, float w2, float h2) { setscreentexcoord(0, w, h, x, y); setscreentexcoord(1, w2, h2, x2, y2); screenquad(); @@ -1019,15 +872,13 @@ void screenquadoffset(float x, float y, float w, float h, float x2, float y2, fl gle::end(); \ } -void hudquad(float x, float y, float w, float h, float tx, float ty, float tw, float th) -{ +void hudquad(float x, float y, float w, float h, float tx, float ty, float tw, float th) { HUDQUAD(x, y, x+w, y+h, tx, ty, tx+tw, ty+th); } bool renderedgame = false; -void rendergame(bool mainpass) -{ +void rendergame(bool mainpass) { game::rendergame(mainpass); if(!shadowmapping) renderedgame = true; } @@ -1037,23 +888,17 @@ int drawtex = 0; VAR(modelpreviewfov, 10, 20, 100); VAR(modelpreviewpitch, -90, -15, 90); -namespace modelpreview -{ +namespace modelpreview { physent *oldcamera; physent camera; - float oldaspect, oldfovy, oldfov; int oldfarplane; matrix4 oldprojmatrix; - - void start(int x, int y, int w, int h, bool background) - { + void start(int x, int y, int w, int h, bool background) { drawtex = DRAWTEX_MODELPREVIEW; - glViewport(x, y, w, h); glScissor(x, y, w, h); glEnable(GL_SCISSOR_TEST); - oldcamera = camera1; camera = *camera1; camera.reset(); @@ -1063,52 +908,39 @@ namespace modelpreview camera.pitch = modelpreviewpitch; camera.roll = 0; camera1 = &camera; - oldaspect = aspect; oldfovy = fovy; oldfov = curfov; oldfarplane = farplane; oldprojmatrix = projmatrix; - aspect = w/float(h); fovy = modelpreviewfov; curfov = 2*atan2(tan(fovy/2*RAD), 1/aspect)/RAD; farplane = 1024; - glClearColor(0, 0, 0, 1); - glClear((background ? GL_COLOR_BUFFER_BIT : 0) | GL_DEPTH_BUFFER_BIT); - projmatrix.perspective(fovy, aspect, nearplane, farplane); setcamprojmatrix(); - glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); } - - void end() - { + void end() { glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); - aspect = oldaspect; fovy = oldfovy; curfov = oldfov; farplane = oldfarplane; - camera1 = oldcamera; drawtex = 0; - glDisable(GL_SCISSOR_TEST); glViewport(0, 0, screenw, screenh); - projmatrix = oldprojmatrix; setcamprojmatrix(); } } -vec calcmodelpreviewpos(const vec &radius, float &yaw) -{ +vec calcmodelpreviewpos(const vec &radius, float &yaw) { yaw = fmod(lastmillis/10000.0f*360.0f, 360.0f); float dist = 1.15f*max(radius.magnitude2()/aspect, radius.magnitude())/sinf(fovy/2*RAD); return vec(0, dist, 0).rotate_around_x(camera1->pitch*RAD); @@ -1116,70 +948,47 @@ vec calcmodelpreviewpos(const vec &radius, float &yaw) bool deferdrawtextures = false; -void drawtextures() -{ +void drawtextures() { if(minimized) { deferdrawtextures = true; return; } deferdrawtextures = false; } int xtraverts, xtravertsva; -void gl_drawframe() -{ +void gl_drawframe() { if(deferdrawtextures) drawtextures(); - updatedynlights(); - int w = screenw, h = screenh; aspect = forceaspect ? forceaspect : w/float(h); fovy = 2*atan2(tan(curfov/2*RAD), aspect)/RAD; - farplane = worldsize*2; - projmatrix.perspective(fovy, aspect, nearplane, farplane); setcamprojmatrix(); - glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); - 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); - rendergeom(); - extern int outline; if(!wireframe && editmode && outline) renderoutline(); - renderdecals(true); - rendermapmodels(); rendergame(true); renderavatar(); - if(wireframe && editmode) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - rendermaterials(); renderalphageom(); - if(wireframe && editmode) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - renderparticles(true); - glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); - gl_drawhud(); - renderedgame = false; } -void gl_drawmainmenu() -{ +void gl_drawmainmenu() { xtravertsva = xtraverts = glde = gbatches = 0; renderbackground(NULL, NULL, NULL, NULL, true, true); gl_drawhud(); @@ -1194,14 +1003,12 @@ VARP(damagecompassmax, 1, 200, 1000); float damagedirs[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; -void damagecompass(int n, const vec &loc) -{ +void damagecompass(int n, const vec &loc) { if(!usedamagecompass || minimized) return; vec delta(loc); delta.sub(camera1->o); float yaw = 0, pitch; - if(delta.magnitude() > 4) - { + if(delta.magnitude() > 4) { vectoyawpitch(delta, yaw, pitch); yaw -= camera1->yaw; } @@ -1212,23 +1019,18 @@ void damagecompass(int n, const vec &loc) if(damagedirs[dir]>1) damagedirs[dir] = 1; } -void drawdamagecompass(int w, int h) -{ +void drawdamagecompass(int w, int h) { hudnotextureshader->set(); - int dirs = 0; float size = damagecompasssize/100.0f*min(h, w)/2.0f; - loopi(8) if(damagedirs[i]>0) - { - if(!dirs) - { + loopi(8) if(damagedirs[i]>0) { + if(!dirs) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); gle::colorf(1, 0, 0, damagecompassalpha/100.0f); gle::defvertex(); gle::begin(GL_TRIANGLES); } dirs++; - float logscale = 32, scale = log(1 + (logscale - 1)*damagedirs[i]) / log(logscale), offset = -size/2.0f-min(h, w)/4.0f; @@ -1238,11 +1040,9 @@ void drawdamagecompass(int w, int h) m.rotate_around_z(i*45*RAD); m.translate(0, offset, 0); m.scale(size*scale); - gle::attrib(m.transform(vec2(1, 1))); gle::attrib(m.transform(vec2(-1, 1))); gle::attrib(m.transform(vec2(0, 0))); - // fade in log space so short blips don't disappear too quickly scale -= float(curtime)/damagecompassfade; damagedirs[i] = scale > 0 ? (pow(logscale, scale) - 1) / (logscale - 1) : 0; @@ -1261,68 +1061,57 @@ VARP(crosshaircolors, 0, 1, 1); #define MAXCROSSHAIRS 4 static Texture *crosshairs[MAXCROSSHAIRS] = { NULL, NULL, NULL, NULL }; -void loadcrosshair(const char *name, int i) -{ +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"; crosshairs[i] = textureload(name, 3, true); } } -void loadcrosshair_(const char *name, int *i) -{ +void loadcrosshair_(const char *name, int *i) { loadcrosshair(name, *i); } COMMANDN(loadcrosshair, loadcrosshair_, "si"); -ICOMMAND(getcrosshair, "i", (int *i), -{ +ICOMMAND(getcrosshair, "i", (int *i), { const char *name = ""; - if(*i >= 0 && *i < MAXCROSSHAIRS) - { + if(*i >= 0 && *i < MAXCROSSHAIRS) { name = crosshairs[*i] ? crosshairs[*i]->name : game::defaultcrosshair(*i); if(!name) name = "data/crosshair.png"; } result(name); }); -void writecrosshairs(stream *f) -{ +void writecrosshairs(stream *f) { loopi(MAXCROSSHAIRS) if(crosshairs[i] && crosshairs[i]!=notexture) f->printf("loadcrosshair %s %d\n", escapestring(crosshairs[i]->name), i); f->printf("\n"); } -void drawcrosshair(int w, int h) -{ +void drawcrosshair(int w, int h) { bool windowhit = g3d_windowhit(true, false); if(!windowhit && (hidehud || mainmenu)) return; //(hidehud || player->state==CS_SPECTATOR || player->state==CS_DEAD)) return; - vec color(1, 1, 1); float cx = 0.5f, cy = 0.5f, chsize; Texture *crosshair; - if(windowhit) - { + if(windowhit) { static Texture *cursor = NULL; if(!cursor) cursor = textureload("data/guicursor.png", 3, true); crosshair = cursor; chsize = cursorsize*w/900.0f; g3d_cursorpos(cx, cy); } - else - { + 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]; } @@ -1333,7 +1122,6 @@ void drawcrosshair(int w, int h) float x = cx*w - (windowhit ? 0 : chsize/2.0f); float y = cy*h - (windowhit ? 0 : chsize/2.0f); glBindTexture(GL_TEXTURE_2D, crosshair->id); - hudshader->set(); gle::color(color); hudquad(x, y, chsize, chsize); @@ -1346,55 +1134,36 @@ VAR(statrate, 1, 200, 1000); FVARP(conscale, 1e-3f, 0.33f, 1e3f); -void gl_drawhud() -{ +void gl_drawhud() { g3d_render(); - int w = screenw, h = screenh; if(forceaspect) w = int(ceil(h*forceaspect)); - - if(editmode && !hidehud && !mainmenu) - { + if(editmode && !hidehud && !mainmenu) { glEnable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); - rendereditcursor(); - glDepthMask(GL_TRUE); glDisable(GL_DEPTH_TEST); } - gettextres(w, h); - hudmatrix.ortho(0, w, h, 0, -1, 1); resethudmatrix(); - gle::colorf(1, 1, 1); - glEnable(GL_BLEND); - - if(!mainmenu) - { + if(!mainmenu) { drawdamagecompass(w, h); } - hudshader->set(); - int conw = int(w/conscale), conh = int(h/conscale), abovehud = conh - FONTH, limitgui = abovehud; - if(!hidehud && !mainmenu) - { - if(!hidestats) - { + if(!hidehud && !mainmenu) { + if(!hidestats) { pushhudmatrix(); hudmatrix.scale(conscale, conscale, 1); flushhudmatrix(); - int roffset = 0; - if(showfps) - { + if(showfps) { static int lastfps = 0, prevfps[3] = { 0, 0, 0 }, curfps[3] = { 0, 0, 0 }; - if(totalmillis - lastfps >= statrate) - { + if(totalmillis - lastfps >= statrate) { memcpy(prevfps, curfps, sizeof(prevfps)); lastfps = totalmillis - (totalmillis%statrate); } @@ -1405,17 +1174,13 @@ void gl_drawhud() else draw_textf("fps %d", conw-5*FONTH, conh-FONTH*3/2, curfps[0]); roffset += FONTH; } - - if(editmode || showeditstats) - { + 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 }; - if(totalmillis - laststats >= statrate) - { + if(totalmillis - laststats >= statrate) { memcpy(prevstats, curstats, sizeof(prevstats)); laststats = totalmillis - (totalmillis%statrate); } - int nextstats[8] = - { + int nextstats[8] = { vtris*100/max(wtris, 1), vverts*100/max(wverts, 1), xtraverts/1024, @@ -1425,22 +1190,16 @@ void gl_drawhud() getnumqueries() }; loopi(8) if(prevstats[i]==curstats[i]) curstats[i] = nextstats[i]; - abovehud -= 2*FONTH; draw_textf("wtr:%dk(%d%%) wvt:%dk(%d%%) evt:%dk eva:%dk", FONTH/2, abovehud, wtris/1024, curstats[0], wverts/1024, curstats[1], curstats[2], curstats[3]); draw_textf("ond:%d va:%d gl:%d(%d) oq:%d lm:%d rp:%d", FONTH/2, abovehud+FONTH, allocnodes*8, allocva, curstats[4], curstats[5], curstats[6], lightmaps.length(), curstats[7]); limitgui = abovehud; } - - if(editmode) - { + if(editmode) { abovehud -= FONTH; draw_textf("cube %s%d%s", FONTH/2, abovehud, selchildcount<0 ? "1/" : "", abs(selchildcount), showmat && selchildmat > 0 ? getmaterialdesc(selchildmat, ": ") : ""); - - if(char *editinfo = execidentstr("edithud")) - { - if(editinfo[0]) - { + if(char *editinfo = execidentstr("edithud")) { + if(editinfo[0]) { int tw, th; text_bounds(editinfo, tw, th); th += FONTH-1; th -= th%FONTH; @@ -1450,10 +1209,8 @@ void gl_drawhud() DELETEA(editinfo); } } - else if(char *gameinfo = execidentstr("gamehud")) - { - if(gameinfo[0]) - { + else if(char *gameinfo = execidentstr("gamehud")) { + if(gameinfo[0]) { int tw, th; text_bounds(gameinfo, tw, th); th += FONTH-1; th -= th%FONTH; @@ -1462,30 +1219,21 @@ void gl_drawhud() } DELETEA(gameinfo); } - pophudmatrix(); } - - if(hidestats || (!editmode && !showeditstats)) - { + if(hidestats || (!editmode && !showeditstats)) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); game::gameplayhud(w, h); limitgui = abovehud = min(abovehud, int(conh*game::abovegameplayhud(w, h))); } - rendertexturepanel(w, h); } - glDisable(GL_BLEND); - g3d_limitscale((2*limitgui - conh) / float(conh)); g3d_render2d(); - glEnable(GL_BLEND); - hudmatrix.ortho(0, w, h, 0, -1, 1); resethudmatrix(); - pushhudmatrix(); hudmatrix.scale(conscale, conscale, 1); flushhudmatrix(); @@ -1493,16 +1241,12 @@ void gl_drawhud() extern int fullconsole; if(!hidehud || fullconsole) renderconsole(conw, conh, abovehud - FONTH/2); pophudmatrix(); - drawcrosshair(w, h); - glDisable(GL_BLEND); } -void cleanupgl() -{ +void cleanupgl() { cleanupscreenquad(); - gle::cleanup(); } |
