X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=r_explosion.c;h=283bbe81baea01fdc848cc2fcfdf2230134a7446;hb=5fb951ab4555f21c9f449157cf0ef42bde065593;hp=d1e51b97b4ff5d607982e8666ac87f526e0fa25b;hpb=d159736a199e4043ed98cde48f6d5716ec40845c;p=xonotic%2Fdarkplaces.git diff --git a/r_explosion.c b/r_explosion.c index d1e51b97..283bbe81 100644 --- a/r_explosion.c +++ b/r_explosion.c @@ -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; @@ -180,33 +180,31 @@ 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_DepthTest(true); - R_Mesh_Matrix(&r_identitymatrix); - - numtriangles = EXPLOSIONTRIS; - numverts = EXPLOSIONVERTS; - alpha = e->alpha; + R_Mesh_Matrix(&identitymatrix); + R_Mesh_ColorPointer(NULL); 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]); + // 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]); + GL_LockArrays(0, 0); + } } static void R_MoveExplosion(explosion_t *e) @@ -218,6 +216,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]) @@ -245,7 +248,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 +259,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); }