X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=r_explosion.c;h=50c3d66f38e04b2d508d6d91e04ca9f915e2e0aa;hb=5385844e6dd47a347e48032f0e5b191358d82266;hp=3f8daa4b8007d554510bc0367321687af6f4dc57;hpb=45bff1c2dd893d329c86aa043661187b86da6609;p=xonotic%2Fdarkplaces.git diff --git a/r_explosion.c b/r_explosion.c index 3f8daa4b..50c3d66f 100644 --- a/r_explosion.c +++ b/r_explosion.c @@ -173,72 +173,75 @@ void R_NewExplosion(vec3_t org) } } -void R_DrawExplosion(explosion_t *e) +void R_DrawExplosionCallback(const void *calldata1, int calldata2) { - int i; + int i, numtriangles, numverts; float *c, *v, diff[3], centerdir[3], ifog, alpha, dist; - rmeshbufferinfo_t m; + 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.numverts = EXPLOSIONVERTS; m.tex[0] = R_GetTexture(explosiontexture); - if (R_Mesh_Draw_GetBuffer(&m, false)) + 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) { - 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 + 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[2])); + alpha = e->alpha; + VectorSubtract(r_origin, e->origin, centerdir); + VectorNormalizeFast(centerdir); + if (fogenabled) + { + for (i = 0, c = varray_color;i < EXPLOSIONVERTS;i++, c += 4) { - 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) { - VectorSubtract(e->vert[i], e->origin, diff); - VectorNormalizeFast(diff); - dist = (DotProduct(diff, centerdir) * 6.0f - 4.0f) * alpha; + // 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; - c[0] = c[1] = c[2] = dist; - c[3] = 1; + dist *= r_colorscale; } + else + dist = 0; + c[0] = c[1] = c[2] = dist; + c[3] = 1; + } + } + else + { + 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; + else + dist *= r_colorscale; + c[0] = c[1] = c[2] = dist; + c[3] = 1; } } + R_Mesh_Draw(numverts, numtriangles, explosiontris[0]); } void R_MoveExplosion(explosion_t *e) @@ -264,7 +267,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; @@ -302,6 +305,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); }