X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=r_explosion.c;h=b5654092e18eb945874d5ed0d9b96387cfd1ead3;hb=7e973e86c5b9abe7638782e877603832861e9870;hp=d037ff17014ae41f206eee56781af3237c65e62d;hpb=ea7c24e1fb41f3b1df984ac0eed6881c9fde16f5;p=xonotic%2Fdarkplaces.git diff --git a/r_explosion.c b/r_explosion.c index d037ff17..b5654092 100644 --- a/r_explosion.c +++ b/r_explosion.c @@ -29,7 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define EXPLOSIONFADESTART (1.5f) #define EXPLOSIONFADERATE (3.0f) -float explosiontexcoords[EXPLOSIONVERTS][2]; +float explosiontexcoords[EXPLOSIONVERTS][4]; int explosiontris[EXPLOSIONTRIS][3]; int explosionnoiseindex[EXPLOSIONVERTS]; vec3_t explosionpoint[EXPLOSIONVERTS]; @@ -80,11 +80,11 @@ void r_explosion_start(void) data[y][x][3] = bound(0, a, 255); } } - explosiontexture = R_LoadTexture (explosiontexturepool, "explosiontexture", 128, 128, &data[0][0][0], TEXTYPE_RGBA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE); + explosiontexture = R_LoadTexture2D(explosiontexturepool, "explosiontexture", 128, 128, &data[0][0][0], TEXTYPE_RGBA, 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_LoadTexture (explosiontexturepool, "explosiontexturefog", 128, 128, &data[0][0][0], TEXTYPE_RGBA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE); + explosiontexturefog = R_LoadTexture2D(explosiontexturepool, "explosiontexturefog", 128, 128, &data[0][0][0], TEXTYPE_RGBA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE, NULL); // note that explosions survive the restart } @@ -103,8 +103,8 @@ int R_ExplosionVert(int column, int row) int i; float a, b, c; i = row * (EXPLOSIONGRID + 1) + column; - a = row * M_PI * 2 / EXPLOSIONGRID; - b = column * M_PI * 2 / EXPLOSIONGRID; + a = ((double) row / EXPLOSIONGRID) * M_PI * 2; + b = (((double) column / EXPLOSIONGRID) + 0.5) * M_PI; c = cos(b); explosionpoint[i][0] = cos(a) * c; explosionpoint[i][1] = sin(a) * c; @@ -173,32 +173,38 @@ void R_NewExplosion(vec3_t org) } } -void R_DrawExplosion(explosion_t *e) +void R_DrawExplosionCallback(const void *calldata1, int calldata2) { - int i; - float c[EXPLOSIONVERTS][4], diff[3], centerdir[3], ifog, alpha, dist; - rmeshinfo_t m; + int i, numtriangles, numverts; + float *c, *v, diff[3], centerdir[3], ifog, alpha, dist; + rmeshstate_t m; + const explosion_t *e; + e = calldata1; + memset(&m, 0, sizeof(m)); - m.transparent = true; m.blendfunc1 = GL_SRC_ALPHA; m.blendfunc2 = GL_ONE; - m.numtriangles = EXPLOSIONTRIS; - m.index = &explosiontris[0][0]; - m.numverts = EXPLOSIONVERTS; - m.vertex = &e->vert[0][0]; - m.vertexstep = sizeof(float[3]); + m.tex[0] = R_GetTexture(explosiontexture); + R_Mesh_Matrix(&r_identitymatrix); + R_Mesh_State(&m); + + numtriangles = EXPLOSIONTRIS; + numverts = EXPLOSIONVERTS; + R_Mesh_ResizeCheck(numverts); + + for (i = 0, v = varray_vertex;i < numverts;i++, v += 4) + { + v[0] = e->vert[i][0]; + v[1] = e->vert[i][1]; + v[2] = e->vert[i][2]; + } + memcpy(varray_texcoord[0], explosiontexcoords, numverts * sizeof(float[4])); alpha = e->alpha; - m.cr = 1; - m.cg = 1; - m.cb = 1; - m.ca = 1; //alpha; - m.color = &c[0][0]; - m.colorstep = sizeof(float[4]); VectorSubtract(r_origin, e->origin, centerdir); VectorNormalizeFast(centerdir); if (fogenabled) { - for (i = 0;i < EXPLOSIONVERTS;i++) + for (i = 0, c = varray_color;i < EXPLOSIONVERTS;i++, c += 4) { VectorSubtract(e->vert[i], e->origin, diff); VectorNormalizeFast(diff); @@ -211,31 +217,32 @@ void R_DrawExplosion(explosion_t *e) dist = dist * ifog; if (dist < 0) dist = 0; + else + dist *= r_colorscale; } else dist = 0; - c[i][0] = c[i][1] = c[i][2] = dist; - c[i][3] = 1; + c[0] = c[1] = c[2] = dist; + c[3] = 1; } } else { - for (i = 0;i < EXPLOSIONVERTS;i++) + for (i = 0, c = varray_color;i < EXPLOSIONVERTS;i++, c += 4) { VectorSubtract(e->vert[i], e->origin, diff); VectorNormalizeFast(diff); dist = (DotProduct(diff, centerdir) * 6.0f - 4.0f) * alpha; if (dist < 0) dist = 0; - c[i][0] = c[i][1] = c[i][2] = dist; - c[i][3] = 1; + else + dist *= r_colorscale; + c[0] = c[1] = c[2] = dist; + c[3] = 1; } } - m.tex[0] = R_GetTexture(explosiontexture); - m.texcoords[0] = &explosiontexcoords[0][0]; - m.texcoordstep[0] = sizeof(float[2]); - - R_Mesh_Draw(&m); + GL_UseColorArray(); + R_Mesh_Draw(numverts, numtriangles, explosiontris[0]); } void R_MoveExplosion(explosion_t *e) @@ -261,7 +268,7 @@ void R_MoveExplosion(explosion_t *e) VectorMA(e->vert[i], frametime, e->vertvel[i], end); if (r_explosionclip.integer) { - if (CL_TraceLine(e->vert[i], end, impact, normal, 0, true) < 1) + if (CL_TraceLine(e->vert[i], end, impact, normal, 0, true, NULL) < 1) { // clip velocity against the wall dot = DotProduct(e->vertvel[i], normal) * -1.125f; @@ -299,6 +306,6 @@ void R_DrawExplosions(void) return; for (i = 0;i < MAX_EXPLOSIONS;i++) if (explosion[i].alpha > 0.01f) - R_DrawExplosion(&explosion[i]); + R_MeshQueue_AddTransparent(explosion[i].origin, R_DrawExplosionCallback, &explosion[i], 0); }