X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=r_explosion.c;h=45b7f5ce12b336a5489651bbb27eb809ab8ae4ae;hp=507f1f7445844a55f9a820785f795b419d422312;hb=c60119cef7f0b44169ddb4c7d688976f9f9283ae;hpb=933a1996b1c2661e86bf76936c8cda4f38281726 diff --git a/r_explosion.c b/r_explosion.c index 507f1f74..45b7f5ce 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 explosiontexcoord2f[EXPLOSIONVERTS][2]; 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 } @@ -101,22 +101,21 @@ void r_explosion_newmap(void) int R_ExplosionVert(int column, int row) { int i; - float a, b, c; + float yaw, pitch; + // top and bottom rows are all one position... + if (row == 0 || row == EXPLOSIONGRID) + column = 0; i = row * (EXPLOSIONGRID + 1) + column; - a = row * M_PI * 2 / EXPLOSIONGRID; - b = column * M_PI * 2 / EXPLOSIONGRID; - c = cos(b); - explosionpoint[i][0] = cos(a) * c; - explosionpoint[i][1] = sin(a) * c; - explosionpoint[i][2] = -sin(b); + yaw = ((double) column / EXPLOSIONGRID) * M_PI * 2; + pitch = (((double) row / EXPLOSIONGRID) - 0.5) * M_PI; + explosionpoint[i][0] = cos(yaw) * cos(pitch); + explosionpoint[i][1] = sin(yaw) * cos(pitch); + explosionpoint[i][2] = 1 * -sin(pitch); explosionspherevertvel[i][0] = explosionpoint[i][0] * EXPLOSIONSTARTVELOCITY; explosionspherevertvel[i][1] = explosionpoint[i][1] * EXPLOSIONSTARTVELOCITY; explosionspherevertvel[i][2] = explosionpoint[i][2] * EXPLOSIONSTARTVELOCITY; - explosiontexcoords[i][0] = (float) column / (float) EXPLOSIONGRID; - explosiontexcoords[i][1] = (float) row / (float) EXPLOSIONGRID; - // top and bottom rows are all one position... - if (row == 0 || row == EXPLOSIONGRID) - column = 0; + explosiontexcoord2f[i][0] = (float) column / (float) EXPLOSIONGRID; + explosiontexcoord2f[i][1] = (float) row / (float) EXPLOSIONGRID; explosionnoiseindex[i] = (row % EXPLOSIONGRID) * EXPLOSIONGRID + (column % EXPLOSIONGRID); return i; } @@ -173,73 +172,31 @@ void R_NewExplosion(vec3_t org) } } -void R_DrawExplosion(explosion_t *e) +void R_DrawExplosionCallback(const void *calldata1, int calldata2) { - int i; - float *c, *v, diff[3], centerdir[3], ifog, alpha, dist; - rmeshbufferinfo_t m; + int numtriangles, numverts; + float alpha; + rmeshstate_t m; + const explosion_t *e; + e = calldata1; + + 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; + GL_Color(alpha, alpha, alpha, 1); + GL_VertexPointer(e->vert[0]); memset(&m, 0, sizeof(m)); - m.transparent = true; - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ONE; - m.numtriangles = EXPLOSIONTRIS; - m.numverts = EXPLOSIONVERTS; m.tex[0] = R_GetTexture(explosiontexture); - if (R_Mesh_Draw_GetBuffer(&m, false)) - { - memcpy(m.index, explosiontris, m.numtriangles * sizeof(int[3])); - for (i = 0, v = m.vertex;i < m.numverts;i++, v += 4) - { - v[0] = e->vert[i][0]; - v[1] = e->vert[i][1]; - v[2] = e->vert[i][2]; - } - memcpy(m.texcoords[0], explosiontexcoords, m.numverts * sizeof(float[2])); - alpha = e->alpha; - VectorSubtract(r_origin, e->origin, centerdir); - VectorNormalizeFast(centerdir); - if (fogenabled) - { - for (i = 0, c = m.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) - { - // use inverse fog alpha - VectorSubtract(e->vert[i], r_origin, diff); - ifog = 1 - exp(fogdensity/DotProduct(diff,diff)); - dist = dist * ifog; - if (dist < 0) - dist = 0; - else - dist *= m.colorscale; - } - else - dist = 0; - c[0] = c[1] = c[2] = dist; - c[3] = 1; - } - } - else - { - for (i = 0, c = m.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; - else - dist *= m.colorscale; - c[0] = c[1] = c[2] = dist; - c[3] = 1; - } - } - R_Mesh_Render(); - } + m.pointer_texcoord[0] = explosiontexcoord2f[0]; + R_Mesh_State_Texture(&m); + + R_Mesh_Draw(numverts, numtriangles, explosiontris[0]); } void R_MoveExplosion(explosion_t *e) @@ -265,7 +222,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, true, NULL, SUPERCONTENTS_SOLID) < 1) { // clip velocity against the wall dot = DotProduct(e->vertvel[i], normal) * -1.125f; @@ -277,9 +234,6 @@ void R_MoveExplosion(explosion_t *e) VectorCopy(end, e->vert[i]); } } - for (i = 0;i < EXPLOSIONGRID;i++) - VectorCopy(e->vert[i * (EXPLOSIONGRID + 1)], e->vert[i * (EXPLOSIONGRID + 1) + EXPLOSIONGRID]); - memcpy(e->vert[EXPLOSIONGRID * (EXPLOSIONGRID + 1)], e->vert[0], sizeof(float[3]) * (EXPLOSIONGRID + 1)); } @@ -303,6 +257,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); }