X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=r_explosion.c;h=7ebaf1f9ba0fd5ce281c8e04b69651ab58b87ddc;hp=9f5888dc20323b2020c175d09a9b05da6e44a546;hb=14ad2aff100ae111396089eba85c0a02225a09b5;hpb=a255e13ec710fbfbf541ef09b2195253dea80658 diff --git a/r_explosion.c b/r_explosion.c index 9f5888dc..7ebaf1f9 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]; @@ -73,17 +75,17 @@ static void r_explosion_start(void) g = (j * 256) / 256; b = (j * 128) / 256; a = noise3[y][x] * 3 - 128; - data[y][x][0] = bound(0, r, 255); + data[y][x][2] = bound(0, r, 255); data[y][x][1] = bound(0, g, 255); - data[y][x][2] = bound(0, b, 255); + data[y][x][0] = bound(0, b, 255); data[y][x][3] = bound(0, a, 255); } } - explosiontexture = R_LoadTexture2D(explosiontexturepool, "explosiontexture", 128, 128, &data[0][0][0], TEXTYPE_RGBA, 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, 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_RGBA, 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, 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--; }