/* * CG_BlasterTrail */ void CG_BlasterTrail( const vec3_t start, const vec3_t end ) { int j, count; vec3_t move, vec; float len; //const float dec = 5.0f; const float dec = 3.0f; cparticle_t *p; if( !cg_particles->integer ) { return; } VectorCopy( start, move ); VectorSubtract( end, start, vec ); len = VectorNormalize( vec ); VectorScale( vec, dec, vec ); count = (int)( len / dec ) + 1; if( cg_numparticles + count > MAX_PARTICLES ) { count = MAX_PARTICLES - cg_numparticles; } for( p = &particles[cg_numparticles], cg_numparticles += count; count > 0; count--, p++ ) { CG_InitParticle( p, 2.5f, 0.25f, 1.0f, 0.85f, 0, NULL ); p->alphavel = -1.0 / ( 0.1 + random() * 0.2 ); for( j = 0; j < 3; j++ ) { p->org[j] = move[j] + crandom(); p->vel[j] = crandom() * 5; } VectorClear( p->accel ); VectorAdd( move, vec, move ); } }
/* * CG_HighVelImpactPuffParticles * High velocity wall impact puffs */ void CG_HighVelImpactPuffParticles( const vec3_t org, const vec3_t dir, int count, float scale, float r, float g, float b, float a, struct shader_s *shader ) { int j; float d; cparticle_t *p; if( !cg_particles->integer ) { return; } if( cg_numparticles + count > MAX_PARTICLES ) { count = MAX_PARTICLES - cg_numparticles; } for( p = &particles[cg_numparticles], cg_numparticles += count; count > 0; count--, p++ ) { CG_InitParticle( p, scale, a, r, g, b, shader ); d = rand() & 15; for( j = 0; j < 3; j++ ) { p->org[j] = org[j] + ( ( rand() & 7 ) - 4 ) + d * dir[j]; p->vel[j] = dir[j] * 180 + crandom() * 40; } p->accel[0] = p->accel[1] = 0; p->accel[2] = -PARTICLE_GRAVITY * 2; p->alphavel = -5.0 / ( 0.5 + random() * 0.3 ); } }
/* * CG_ParticleExplosionEffect */ void CG_ParticleExplosionEffect( const vec3_t org, const vec3_t dir, float r, float g, float b, int count ) { int j; cparticle_t *p; float d; if( !cg_particles->integer ) { return; } if( cg_numparticles + count > MAX_PARTICLES ) { count = MAX_PARTICLES - cg_numparticles; } for( p = &particles[cg_numparticles], cg_numparticles += count; count > 0; count--, p++ ) { CG_InitParticle( p, 0.75, 1, r + random() * 0.1, g + random() * 0.1, b + random() * 0.1, NULL ); d = rand() & 31; for( j = 0; j < 3; j++ ) { p->org[j] = org[j] + ( ( rand() & 7 ) - 4 ) + d * dir[j]; p->vel[j] = crandom() * 400; } //p->accel[0] = p->accel[1] = 0; p->accel[2] = -PARTICLE_GRAVITY; p->alphavel = -1.0 / ( 0.7 + random() * 0.25 ); } }
/* * CG_ParticleEffect2 */ void CG_ParticleEffect2( vec3_t org, vec3_t dir, float r, float g, float b, int count ) { int j; float d; cparticle_t *p; if( !cg_particles->integer ) return; if( cg_numparticles + count > MAX_PARTICLES ) count = MAX_PARTICLES - cg_numparticles; for( p = &particles[cg_numparticles], cg_numparticles += count; count > 0; count--, p++ ) { CG_InitParticle( p, 1, 1, r, g, b, NULL ); d = rand()&7; for( j = 0; j < 3; j++ ) { p->org[j] = org[j] + ( ( rand()&7 ) - 4 ) + d * dir[j]; p->vel[j] = crandom() * 20; } p->accel[0] = p->accel[1] = 0; p->accel[2] = -PARTICLE_GRAVITY; p->alphavel = -1.0 / ( 0.5 + random() * 0.3 ); } }
/* * CG_FlyParticles */ static void CG_FlyParticles( const vec3_t origin, int count ) { int i, j; float angle, sp, sy, cp, cy; vec3_t forward, dir; float dist, ltime; cparticle_t *p; if( !cg_particles->integer ) { return; } if( count > NUMVERTEXNORMALS ) { count = NUMVERTEXNORMALS; } if( !avelocities[0][0] ) { for( i = 0; i < NUMVERTEXNORMALS; i++ ) for( j = 0; j < 3; j++ ) avelocities[i][j] = ( rand() & 255 ) * 0.01; } i = 0; ltime = (float)cg.time / 1000.0; count /= 2; if( cg_numparticles + count > MAX_PARTICLES ) { count = MAX_PARTICLES - cg_numparticles; } for( p = &particles[cg_numparticles], cg_numparticles += count; count > 0; count--, p++ ) { CG_InitParticle( p, 1, 1, 0, 0, 0, NULL ); angle = ltime * avelocities[i][0]; sy = sin( angle ); cy = cos( angle ); angle = ltime * avelocities[i][1]; sp = sin( angle ); cp = cos( angle ); forward[0] = cp * cy; forward[1] = cp * sy; forward[2] = -sp; dist = sin( ltime + i ) * 64; ByteToDir( i, dir ); p->org[0] = origin[0] + dir[0] * dist + forward[0] * BEAMLENGTH; p->org[1] = origin[1] + dir[1] * dist + forward[1] * BEAMLENGTH; p->org[2] = origin[2] + dir[2] * dist + forward[2] * BEAMLENGTH; VectorClear( p->vel ); VectorClear( p->accel ); p->alphavel = -100; i += 2; } }
/* * CG_ElectroWeakTrail */ void CG_ElectroWeakTrail( const vec3_t start, const vec3_t end, const vec4_t color ) { int j, count; vec3_t move, vec; float len; const float dec = 5; cparticle_t *p; vec4_t ucolor = { 1.0f, 1.0f, 1.0f, 0.8f }; if( color ) { VectorCopy( color, ucolor ); } if( !cg_particles->integer ) { return; } VectorCopy( start, move ); VectorSubtract( end, start, vec ); len = VectorNormalize( vec ); VectorScale( vec, dec, vec ); count = (int)( len / dec ) + 1; if( cg_numparticles + count > MAX_PARTICLES ) { count = MAX_PARTICLES - cg_numparticles; } for( p = &particles[cg_numparticles], cg_numparticles += count; count > 0; count--, p++ ) { //CG_InitParticle( p, 2.0f, 0.8f, 1.0f, 1.0f, 1.0f, NULL ); CG_InitParticle( p, 2.0f, ucolor[3], ucolor[0], ucolor[1], ucolor[2], NULL ); p->alphavel = -1.0 / ( 0.2 + random() * 0.1 ); for( j = 0; j < 3; j++ ) { p->org[j] = move[j] + random();/* + crandom();*/ p->vel[j] = crandom() * 2; } VectorClear( p->accel ); VectorAdd( move, vec, move ); } }
/* * CG_ElectroIonsTrail */ void CG_ElectroIonsTrail( vec3_t start, vec3_t end ) { #define MAX_BOLT_IONS 48 int i, count; vec3_t move, vec; float len; float dec2 = 24.0f; cparticle_t *p; if( !cg_particles->integer ) return; VectorSubtract( end, start, vec ); len = VectorNormalize( vec ); count = (int)( len / dec2 ) + 1; if( count > MAX_BOLT_IONS ) { count = MAX_BOLT_IONS; dec2 = len / count; } VectorScale( vec, dec2, vec ); VectorCopy( start, move ); if( cg_numparticles + count > MAX_PARTICLES ) count = MAX_PARTICLES - cg_numparticles; for( p = &particles[cg_numparticles], cg_numparticles += count; count > 0; count--, p++ ) { CG_InitParticle( p, 1.2f, 1, 0.8f + crandom()*0.1, 0.8f + crandom()*0.1, 0.8f + crandom()*0.1, NULL ); for( i = 0; i < 3; i++ ) { p->org[i] = move[i]; p->vel[i] = crandom()*4; } p->alphavel = -1.0 / ( 0.6 + random()*0.6 ); VectorClear( p->accel ); VectorAdd( move, vec, move ); } }
void CG_ElectroIonsTrail2( const vec3_t start, const vec3_t end, const vec4_t color ) { #define MAX_RING_IONS 96 int count; vec3_t move, vec; float len; float dec2 = 8.0f; cparticle_t *p; if( !cg_particles->integer ) { return; } VectorSubtract( end, start, vec ); len = VectorNormalize( vec ); count = (int)( len / dec2 ) + 1; if( count > MAX_RING_IONS ) { count = MAX_RING_IONS; dec2 = len / count; } VectorScale( vec, dec2, vec ); VectorCopy( start, move ); if( cg_numparticles + count > MAX_PARTICLES ) { count = MAX_PARTICLES - cg_numparticles; } // Ring rail eb particles for( p = &particles[cg_numparticles], cg_numparticles += count; count > 0; count--, p++ ) { CG_InitParticle( p, 0.65f, color[3], color[0] + crandom() * 0.1, color[1] + crandom() * 0.1, color[2] + crandom() * 0.1, NULL ); p->alphavel = -1.0 / ( 0.6 + random() * 0.6 ); VectorCopy( move, p->org ); VectorClear( p->accel ); VectorClear( p->vel ); VectorAdd( move, vec, move ); } }
/** * CG_AddLinearTrail * Add a partical trail following the given entity * @param cent The entity to follow * @param lifetime How long the particles should last in seconds (?? verify) */ void CG_AddLinearTrail( centity_t *cent, float lifetime ) { cparticle_t *p; float r, g, b, a, s; if( cg_numparticles + 1 > MAX_PARTICLES ) return; if( cg_playerTrailsColor->string != NULL && sscanf( cg_playerTrailsColor->string, "%f %f %f", &r, &g, &b ) == 3 ) { if( r == -1.0f ) r = (float) rand()/RAND_MAX; if( g == -1.0f ) g = (float) rand()/RAND_MAX; if( b == -1.0f ) b = (float) rand()/RAND_MAX; r = r < 0.0f ? 0.0f : r > 1.0f ? 1.0f : r; g = g < 0.0f ? 0.0f : g > 1.0f ? 1.0f : g; b = b < 0.0f ? 0.0f : b > 1.0f ? 1.0f : b; } else if(cg_playerTrailsColor->integer == 1) { switch( cent->current.number ) { case 1: r = 1.0f; g = 0.0f; b = 0.0f; break; case 2: r = 0.0f; g = 1.0f; b = 0.0f; break; case 3: r = 0.0f; g = 0.0f; b = 1.0f; break; case 4: r = 1.0f; g = 1.0f; b = 0.0f; break; case 5: r = 1.0f; g = 0.0f; b = 1.0f; break; case 6: r = 0.0f; g = 1.0f; b = 1.0f; break; case 7: r = 1.0f; g = 1.0f; b = 1.0f; break; case 8: r = 1.0f; g = 0.5f; b = 0.0f; break; case 9: r = 1.0f; g = 0.0f; b = 0.5f; break; case 10: r = 0.25f; g = 0.0f; b = 0.5f; break; case 11: r = 1.0f; g = 0.25f; b = 0.25f; break; case 12: r = 0.0f; g = 0.0f; b = 0.25f; break; case 13: r = 0.0f; g = 0.5f; b = 0.0f; break; case 14: r = 0.5f; g = 0.0f; b = 0.0f; break; case 15: r = 0.25f; g = 0.5f; b = 1.0f; break; case 16: r = 0.0f; g = 0.0f; b = 0.0f; break; } } else { r = 0.0f; g = 1.0f; b = 0.0f; } if( cg_playerTrailsAlpha->string != NULL && sscanf( cg_playerTrailsAlpha->string, "%f", &a ) == 1 ) { a = a < 0.0f ? 0.0f : a > 1.0f ? 1.0f : a; } else { a = 1.0f; } if( cg_playerTrailsSize->string != NULL && sscanf( cg_playerTrailsSize->string, "%f", &s ) == 1 ) { s = s < 0.0f ? 0.0f : s > 100.0f ? 1.0f : s; } else { s = 1.0f; } // Own player trail shows up when looking straight down // maybe move particle a bit behind player // maybe don't show own trail at all p = &particles[cg_numparticles++]; CG_InitParticle( p, s, a, r, g, b, NULL ); VectorCopy( cent->ent.origin, p->org ); p->alphavel = -( 1.0f / lifetime ); }