X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=r_explosion.c;h=9f5888dc20323b2020c175d09a9b05da6e44a546;hp=000fc692a9863123e98465221724442a0e969028;hb=a255e13ec710fbfbf541ef09b2195253dea80658;hpb=2a1615321fd8f4a44b97d5b980bb15a4a2132292 diff --git a/r_explosion.c b/r_explosion.c index 000fc692..9f5888dc 100644 --- a/r_explosion.c +++ b/r_explosion.c @@ -52,8 +52,8 @@ static rtexture_t *explosiontexturefog; static rtexturepool_t *explosiontexturepool; -cvar_t r_explosionclip = {CVAR_SAVE, "r_explosionclip", "1"}; -static cvar_t r_drawexplosions = {0, "r_drawexplosions", "1"}; +cvar_t r_explosionclip = {CVAR_SAVE, "r_explosionclip", "1", "enables collision detection for explosion shell (so that it flattens against walls and floors)"}; +static cvar_t r_drawexplosions = {0, "r_drawexplosions", "1", "enables rendering of explosion shells (see also cl_particles_explosions_shell)"}; static void r_explosion_start(void) { @@ -141,7 +141,7 @@ void R_Explosion_Init(void) R_RegisterModule("R_Explosions", r_explosion_start, r_explosion_shutdown, r_explosion_newmap); } -void R_NewExplosion(vec3_t org) +void R_NewExplosion(const vec3_t org) { int i, j; float dist, n; @@ -151,7 +151,7 @@ void R_NewExplosion(vec3_t org) fractalnoisequick(noise, EXPLOSIONGRID, 4); // adjust noise grid size according to explosion for (i = 0, e = explosion;i < MAX_EXPLOSIONS;i++, e++) { - if (cl.time >= e->endtime) + if (!e->alpha) { e->starttime = cl.time; e->endtime = cl.time + cl_explosions_lifetime.value; @@ -171,7 +171,7 @@ void R_NewExplosion(vec3_t org) // clip start origin if (e->clipping) { - trace = CL_TraceBox(e->origin, vec3_origin, vec3_origin, e->vert[j], true, NULL, SUPERCONTENTS_SOLID, false); + trace = CL_Move(e->origin, vec3_origin, vec3_origin, e->vert[j], MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false); VectorCopy(trace.endpos, e->vert[i]); } } @@ -180,33 +180,34 @@ void R_NewExplosion(vec3_t org) } } -static void R_DrawExplosion_TransparentCallback(const entity_render_t *ent, int surfacenumber, const rtlight_t *rtlight) +static void R_DrawExplosion_TransparentCallback(const entity_render_t *ent, const rtlight_t *rtlight, int numsurfaces, int *surfacelist) { - const explosion_t *e = explosion + surfacenumber; - int numtriangles, numverts; - float alpha; + int surfacelistindex = 0; + const int numtriangles = EXPLOSIONTRIS, numverts = EXPLOSIONVERTS; rmeshstate_t m; - GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); GL_DepthMask(false); + GL_DepthRange(0, 1); + GL_PolygonOffset(r_refdef.polygonfactor, r_refdef.polygonoffset); GL_DepthTest(true); - R_Mesh_Matrix(&r_identitymatrix); - - numtriangles = EXPLOSIONTRIS; - numverts = EXPLOSIONVERTS; - alpha = e->alpha; + GL_CullFace(r_view.cullface_back); + R_Mesh_Matrix(&identitymatrix); + R_Mesh_ColorPointer(NULL, 0, 0); memset(&m, 0, sizeof(m)); m.tex[0] = R_GetTexture(explosiontexture); m.pointer_texcoord[0] = explosiontexcoord2f[0]; - m.pointer_vertex = e->vert[0]; - R_Mesh_State(&m); - - GL_Color(alpha, alpha, alpha, 1); - - GL_LockArrays(0, numverts); - R_Mesh_Draw(0, numverts, numtriangles, explosiontris[0]); - GL_LockArrays(0, 0); + R_Mesh_TextureState(&m); + for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++) + { + const explosion_t *e = explosion + surfacelist[surfacelistindex]; + R_Mesh_VertexPointer(e->vert[0], 0, 0); + // FIXME: fixed function path can't properly handle r_view.colorscale > 1 + GL_Color(e->alpha * r_view.colorscale, e->alpha * r_view.colorscale, e->alpha * r_view.colorscale, 1); + GL_LockArrays(0, numverts); + R_Mesh_Draw(0, numverts, numtriangles, explosiontris[0], 0, 0); + GL_LockArrays(0, 0); + } } static void R_MoveExplosion(explosion_t *e) @@ -218,6 +219,11 @@ static void R_MoveExplosion(explosion_t *e) frametime = cl.time - e->time; e->time = cl.time; e->alpha = e->alpha - (e->fade * frametime); + if (e->alpha < 0 || cl.time > e->endtime) + { + e->alpha = 0; + return; + } for (i = 0;i < EXPLOSIONVERTS;i++) { if (e->vertvel[i][0] || e->vertvel[i][1] || e->vertvel[i][2]) @@ -225,7 +231,7 @@ static void R_MoveExplosion(explosion_t *e) VectorMA(e->vert[i], frametime, e->vertvel[i], end); if (e->clipping) { - trace = CL_TraceBox(e->vert[i], vec3_origin, vec3_origin, end, true, NULL, SUPERCONTENTS_SOLID, false); + trace = CL_Move(e->vert[i], vec3_origin, vec3_origin, end, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false); if (trace.fraction < 1) { // clip velocity against the wall @@ -245,7 +251,7 @@ void R_MoveExplosions(void) { int i; for (i = 0;i < MAX_EXPLOSIONS;i++) - if (cl.time < explosion[i].endtime) + if (explosion[i].alpha) R_MoveExplosion(&explosion[i]); } @@ -256,7 +262,7 @@ void R_DrawExplosions(void) if (!r_drawexplosions.integer) return; for (i = 0;i < MAX_EXPLOSIONS;i++) - if (r_refdef.time < explosion[i].endtime) + if (explosion[i].alpha) R_MeshQueue_AddTransparent(explosion[i].origin, R_DrawExplosion_TransparentCallback, NULL, i, NULL); }