X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=cl_particles.c;h=1107913bd1635aad743407410a0d98f32efc3d1e;hb=1c74d2fca77f8fecef650fc0ec390ae6165a01d6;hp=20bb95de09cabc38a7a4d90733f0a444a1c5efab;hpb=98784e552392f849545b1aa7d88c869e116642b6;p=xonotic%2Fdarkplaces.git diff --git a/cl_particles.c b/cl_particles.c index 20bb95de..1107913b 100644 --- a/cl_particles.c +++ b/cl_particles.c @@ -30,6 +30,11 @@ typedef enum } ptype_t; +#define PARTICLE_INVALID 0 +#define PARTICLE_BILLBOARD 1 +#define PARTICLE_BEAM 2 +#define PARTICLE_ORIENTED_DOUBLESIDED 3 + #define P_TEXNUM_FIRSTBIT 0 #define P_TEXNUM_BITS 6 #define P_ORIENTATION_FIRSTBIT (P_TEXNUM_FIRSTBIT + P_TEXNUM_BITS) @@ -432,7 +437,7 @@ void CL_SparkShower (vec3_t org, vec3_t dir, int count) if (!cl_particles.integer) return; if (cl_stainmaps.integer) - R_Stain(org, 32, 96, 96, 96, 2, 128, 128, 128, 2); + R_Stain(org, 32, 96, 96, 96, 24, 128, 128, 128, 24); if (cl_particles_bulletimpacts.integer) { @@ -446,7 +451,7 @@ void CL_SparkShower (vec3_t org, vec3_t dir, int count) while(count--) { k = particlepalette[0x68 + (rand() & 7)]; - particle(pt_static, PARTICLE_BILLBOARD, k, k, tex_particle, false, true, 1, 1, lhrandom(64, 255), 512, 9999, 1, 0, org[0], org[1], org[2], lhrandom(-64, 64) + dir[0], lhrandom(-64, 64) + dir[1], lhrandom(0, 128) + dir[2], 0, 0, 0, 0, 0, 0); + particle(pt_static, PARTICLE_BEAM, k, k, tex_particle, false, true, 0.4f, 0.015f, lhrandom(64, 255), 512, 9999, 1, 0, org[0], org[1], org[2], lhrandom(-64, 64) + dir[0], lhrandom(-64, 64) + dir[1], lhrandom(0, 128) + dir[2], 0, 0, 0, 0, 0, 0); } } } @@ -455,7 +460,7 @@ void CL_SparkShower (vec3_t org, vec3_t dir, int count) void CL_PlasmaBurn (vec3_t org) { if (cl_stainmaps.integer) - R_Stain(org, 48, 96, 96, 96, 3, 128, 128, 128, 3); + R_Stain(org, 48, 96, 96, 96, 32, 128, 128, 128, 32); } static float bloodcount = 0; @@ -565,7 +570,7 @@ void CL_ParticleRain (vec3_t mins, vec3_t maxs, vec3_t dir, int count, int color while(count--) { k = particlepalette[colorbase + (rand()&3)]; - particle(pt_rain, PARTICLE_UPRIGHT_FACING, k, k, tex_particle, true, true, 0.5, 8, lhrandom(8, 16), 0, t, 0, 0, lhrandom(mins[0], maxs[0]), lhrandom(mins[1], maxs[1]), lhrandom(minz, maxz), dir[0], dir[1], dir[2], cl.time + 9999, dir[0], dir[1], dir[2], 0, 0); + particle(pt_rain, PARTICLE_BEAM, k, k, tex_particle, true, true, 0.5, 0.02, lhrandom(8, 16), 0, t, 0, 0, lhrandom(mins[0], maxs[0]), lhrandom(mins[1], maxs[1]), lhrandom(minz, maxz), dir[0], dir[1], dir[2], cl.time + 9999, dir[0], dir[1], dir[2], 0, 0); } break; case 1: @@ -860,7 +865,7 @@ void CL_MoveParticles (void) { // assume it's blood (lame, but...) if (cl_stainmaps.integer) - R_Stain(v, 32, 32, 16, 16, p->alpha * p->scalex * (1.0f / 400.0f), 192, 48, 48, p->alpha * p->scalex * (1.0f / 400.0f)); + R_Stain(v, 32, 32, 16, 16, p->alpha * p->scalex * (1.0f / 40.0f), 192, 48, 48, p->alpha * p->scalex * (1.0f / 40.0f)); p->die = -1; freeparticles[j++] = p; continue; @@ -1179,12 +1184,10 @@ void R_Particles_Init (void) R_RegisterModule("R_Particles", r_part_start, r_part_shutdown, r_part_newmap); } -int partindexarray[6] = {0, 1, 2, 0, 2, 3}; - void R_DrawParticleCallback(const void *calldata1, int calldata2) { int additive, texnum, orientation; - float org[3], up2[3], right2[3], v[3], right[3], up[3], fog, ifog, fogvec[3], cr, cg, cb, ca; + float org[3], up2[3], v[3], right[3], up[3], fog, ifog, fogvec[3], cr, cg, cb, ca; particletexture_t *tex; rmeshstate_t m; const particle_t *p = calldata1; @@ -1202,66 +1205,10 @@ void R_DrawParticleCallback(const void *calldata1, int calldata2) else m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA; m.tex[0] = R_GetTexture(particlefonttexture); - Matrix4x4_CreateIdentity(&m.matrix); + R_Mesh_Matrix(&r_identitymatrix); R_Mesh_State(&m); - varray_element[0] = 0; - varray_element[1] = 1; - varray_element[2] = 2; - varray_element[3] = 0; - varray_element[4] = 2; - varray_element[5] = 3; - if (orientation == PARTICLE_BILLBOARD) - { - VectorScale(vright, p->scalex, right); - VectorScale(vup, p->scaley, up); - } - else if (orientation == PARTICLE_UPRIGHT_FACING) - { - v[0] = r_origin[0] - org[0]; - v[1] = r_origin[1] - org[1]; - v[2] = 0; - VectorNormalizeFast(v); - VectorVectors(v, right2, up2); - VectorScale(right2, p->scalex, right); - VectorScale(up2, p->scaley, up); - } - else if (orientation == PARTICLE_ORIENTED_DOUBLESIDED) - { - // double-sided - if (DotProduct(p->vel2, r_origin) > DotProduct(p->vel2, org)) - { - VectorNegate(p->vel2, v); - VectorVectors(v, right, up); - } - else - VectorVectors(p->vel2, right, up); - VectorScale(right, p->scalex, right); - VectorScale(up, p->scaley, up); - } - else - Host_Error("R_DrawParticles: unknown particle orientation %i\n", orientation); - varray_vertex[0] = org[0] - right[0] - up[0]; - varray_vertex[1] = org[1] - right[1] - up[1]; - varray_vertex[2] = org[2] - right[2] - up[2]; - varray_vertex[4] = org[0] - right[0] + up[0]; - varray_vertex[5] = org[1] - right[1] + up[1]; - varray_vertex[6] = org[2] - right[2] + up[2]; - varray_vertex[8] = org[0] + right[0] + up[0]; - varray_vertex[9] = org[1] + right[1] + up[1]; - varray_vertex[10] = org[2] + right[2] + up[2]; - varray_vertex[12] = org[0] + right[0] - up[0]; - varray_vertex[13] = org[1] + right[1] - up[1]; - varray_vertex[14] = org[2] + right[2] - up[2]; tex = &particletexture[texnum]; - varray_texcoord[0][0] = tex->s1; - varray_texcoord[0][1] = tex->t1; - varray_texcoord[0][2] = tex->s1; - varray_texcoord[0][3] = tex->t2; - varray_texcoord[0][4] = tex->s2; - varray_texcoord[0][5] = tex->t2; - varray_texcoord[0][6] = tex->s2; - varray_texcoord[0][7] = tex->t1; cr = p->color[0] * (1.0f / 255.0f); cg = p->color[1] * (1.0f / 255.0f); cb = p->color[2] * (1.0f / 255.0f); @@ -1281,11 +1228,70 @@ void R_DrawParticleCallback(const void *calldata1, int calldata2) cb += fogcolor[2] * fog; } } - varray_color[0] = varray_color[4] = varray_color[8] = varray_color[12] = cr * mesh_colorscale; - varray_color[1] = varray_color[5] = varray_color[9] = varray_color[13] = cg * mesh_colorscale; - varray_color[2] = varray_color[6] = varray_color[10] = varray_color[14] = cb * mesh_colorscale; - varray_color[3] = varray_color[7] = varray_color[11] = varray_color[15] = ca; - R_Mesh_Draw(4, 2); + cr *= r_colorscale; + cg *= r_colorscale; + cb *= r_colorscale; + + varray_color[ 0] = varray_color[ 4] = varray_color[ 8] = varray_color[12] = cr; + varray_color[ 1] = varray_color[ 5] = varray_color[ 9] = varray_color[13] = cg; + varray_color[ 2] = varray_color[ 6] = varray_color[10] = varray_color[14] = cb; + varray_color[ 3] = varray_color[ 7] = varray_color[11] = varray_color[15] = ca; + varray_texcoord[0][0] = tex->s2;varray_texcoord[0][1] = tex->t1; + varray_texcoord[0][2] = tex->s1;varray_texcoord[0][3] = tex->t1; + varray_texcoord[0][4] = tex->s1;varray_texcoord[0][5] = tex->t2; + varray_texcoord[0][6] = tex->s2;varray_texcoord[0][7] = tex->t2; + + if (orientation == PARTICLE_BEAM) + { + VectorMA(p->org, -p->scaley, p->vel, v); + VectorMA(p->org, p->scaley, p->vel, up2); + R_CalcBeamVerts(varray_vertex, v, up2, p->scalex); + } + else if (orientation == PARTICLE_BILLBOARD) + { + VectorScale(vright, p->scalex, right); + VectorScale(vup, p->scaley, up); + varray_vertex[ 0] = org[0] + right[0] - up[0]; + varray_vertex[ 1] = org[1] + right[1] - up[1]; + varray_vertex[ 2] = org[2] + right[2] - up[2]; + varray_vertex[ 4] = org[0] - right[0] - up[0]; + varray_vertex[ 5] = org[1] - right[1] - up[1]; + varray_vertex[ 6] = org[2] - right[2] - up[2]; + varray_vertex[ 8] = org[0] - right[0] + up[0]; + varray_vertex[ 9] = org[1] - right[1] + up[1]; + varray_vertex[10] = org[2] - right[2] + up[2]; + varray_vertex[12] = org[0] + right[0] + up[0]; + varray_vertex[13] = org[1] + right[1] + up[1]; + varray_vertex[14] = org[2] + right[2] + up[2]; + } + else if (orientation == PARTICLE_ORIENTED_DOUBLESIDED) + { + // double-sided + if (DotProduct(p->vel2, r_origin) > DotProduct(p->vel2, org)) + { + VectorNegate(p->vel2, v); + VectorVectors(v, right, up); + } + else + VectorVectors(p->vel2, right, up); + VectorScale(right, p->scalex, right); + VectorScale(up, p->scaley, up); + varray_vertex[ 0] = org[0] + right[0] - up[0]; + varray_vertex[ 1] = org[1] + right[1] - up[1]; + varray_vertex[ 2] = org[2] + right[2] - up[2]; + varray_vertex[ 4] = org[0] - right[0] - up[0]; + varray_vertex[ 5] = org[1] - right[1] - up[1]; + varray_vertex[ 6] = org[2] - right[2] - up[2]; + varray_vertex[ 8] = org[0] - right[0] + up[0]; + varray_vertex[ 9] = org[1] - right[1] + up[1]; + varray_vertex[10] = org[2] - right[2] + up[2]; + varray_vertex[12] = org[0] + right[0] + up[0]; + varray_vertex[13] = org[1] + right[1] + up[1]; + varray_vertex[14] = org[2] + right[2] + up[2]; + } + else + Host_Error("R_DrawParticles: unknown particle orientation %i\n", orientation); + R_Mesh_Draw(4, 2, polygonelements); } void R_DrawParticles (void)