X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=r_explosion.c;h=a2282c9b70e1538fa2ee3516ebcde94774badacf;hb=c71f71171708eafc50feb816fb0532eb57aa1de6;hp=90a5fcf5d664ad3e763d19705b7b1ebb2ec2e4cc;hpb=fd091d66e2673b19eb9c7d73d95160ef874de5e6;p=xonotic%2Fdarkplaces.git diff --git a/r_explosion.c b/r_explosion.c index 90a5fcf5..a2282c9b 100644 --- a/r_explosion.c +++ b/r_explosion.c @@ -26,8 +26,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define EXPLOSIONVERTS ((EXPLOSIONGRID+1)*(EXPLOSIONGRID+1)) #define EXPLOSIONTRIS (EXPLOSIONGRID*EXPLOSIONGRID*2) +static int numexplosions = 0; + static float explosiontexcoord2f[EXPLOSIONVERTS][2]; -static int explosiontris[EXPLOSIONTRIS][3]; +static unsigned short explosiontris[EXPLOSIONTRIS][3]; static int explosionnoiseindex[EXPLOSIONVERTS]; static vec3_t explosionpoint[EXPLOSIONVERTS]; @@ -79,11 +81,11 @@ static void r_explosion_start(void) data[y][x][3] = bound(0, a, 255); } } - explosiontexture = R_LoadTexture2D(explosiontexturepool, "explosiontexture", 128, 128, &data[0][0][0], TEXTYPE_BGRA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE, NULL); + explosiontexture = R_LoadTexture2D(explosiontexturepool, "explosiontexture", 128, 128, &data[0][0][0], TEXTYPE_BGRA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_FORCELINEAR, NULL); for (y = 0;y < 128;y++) for (x = 0;x < 128;x++) data[y][x][0] = data[y][x][1] = data[y][x][2] = 255; - explosiontexturefog = R_LoadTexture2D(explosiontexturepool, "explosiontexturefog", 128, 128, &data[0][0][0], TEXTYPE_BGRA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE, NULL); + explosiontexturefog = R_LoadTexture2D(explosiontexturepool, "explosiontexturefog", 128, 128, &data[0][0][0], TEXTYPE_BGRA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_FORCELINEAR, NULL); // note that explosions survive the restart } @@ -94,6 +96,7 @@ static void r_explosion_shutdown(void) static void r_explosion_newmap(void) { + numexplosions = 0; memset(explosion, 0, sizeof(explosion)); } @@ -153,6 +156,7 @@ void R_NewExplosion(const vec3_t org) { if (!e->alpha) { + numexplosions = max(numexplosions, i + 1); e->starttime = cl.time; e->endtime = cl.time + cl_explosions_lifetime.value; e->time = e->starttime; @@ -190,9 +194,10 @@ static void R_DrawExplosion_TransparentCallback(const entity_render_t *ent, cons GL_DepthRange(0, 1); GL_PolygonOffset(r_refdef.polygonfactor, r_refdef.polygonoffset); GL_DepthTest(true); - GL_CullFace(r_view.cullface_back); + GL_CullFace(r_refdef.view.cullface_back); R_Mesh_Matrix(&identitymatrix); + R_SetupGenericShader(true); R_Mesh_ColorPointer(NULL, 0, 0); memset(&m, 0, sizeof(m)); m.tex[0] = R_GetTexture(explosiontexture); @@ -202,10 +207,10 @@ static void R_DrawExplosion_TransparentCallback(const entity_render_t *ent, cons { 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); + // FIXME: fixed function path can't properly handle r_refdef.view.colorscale > 1 + GL_Color(e->alpha * r_refdef.view.colorscale, e->alpha * r_refdef.view.colorscale, e->alpha * r_refdef.view.colorscale, 1); GL_LockArrays(0, numverts); - R_Mesh_Draw(0, numverts, numtriangles, explosiontris[0], 0, 0); + R_Mesh_Draw(0, numverts, 0, numtriangles, NULL, explosiontris[0], 0, 0); GL_LockArrays(0, 0); } } @@ -246,23 +251,23 @@ static void R_MoveExplosion(explosion_t *e) } } - -void R_MoveExplosions(void) -{ - int i; - for (i = 0;i < MAX_EXPLOSIONS;i++) - if (explosion[i].alpha) - R_MoveExplosion(&explosion[i]); -} - void R_DrawExplosions(void) { int i; if (!r_drawexplosions.integer) return; - for (i = 0;i < MAX_EXPLOSIONS;i++) + + for (i = 0;i < numexplosions;i++) + { if (explosion[i].alpha) - R_MeshQueue_AddTransparent(explosion[i].origin, R_DrawExplosion_TransparentCallback, NULL, i, NULL); + { + R_MoveExplosion(&explosion[i]); + if (explosion[i].alpha) + R_MeshQueue_AddTransparent(explosion[i].origin, R_DrawExplosion_TransparentCallback, NULL, i, NULL); + } + } + while (numexplosions > 0 && explosion[i-1].alpha <= 0) + numexplosions--; }