X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=r_explosion.c;h=7ebaf1f9ba0fd5ce281c8e04b69651ab58b87ddc;hb=805396ae3fec89152dac6b21c8d6e8c6c6437d17;hp=0c343154e66a809be0b484f5d4e2865235bc6177;hpb=16742571f9a7d696a654668febdc10b4f4affd57;p=xonotic%2Fdarkplaces.git diff --git a/r_explosion.c b/r_explosion.c index 0c343154..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; @@ -187,11 +191,14 @@ static void R_DrawExplosion_TransparentCallback(const entity_render_t *ent, cons 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); - GL_CullFace(GL_FRONT); // quake is backwards, this culls back faces + GL_CullFace(r_refdef.view.cullface_back); R_Mesh_Matrix(&identitymatrix); - R_Mesh_ColorPointer(NULL); + R_SetupGenericShader(true); + R_Mesh_ColorPointer(NULL, 0, 0); memset(&m, 0, sizeof(m)); m.tex[0] = R_GetTexture(explosiontexture); m.pointer_texcoord[0] = explosiontexcoord2f[0]; @@ -199,11 +206,11 @@ static void R_DrawExplosion_TransparentCallback(const entity_render_t *ent, cons 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); + R_Mesh_VertexPointer(e->vert[0], 0, 0); + // 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]); + R_Mesh_Draw(0, numverts, 0, numtriangles, NULL, explosiontris[0], 0, 0); GL_LockArrays(0, 0); } } @@ -244,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--; }