Example #1
0
/*
* 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 );
	}
}
Example #2
0
/*
* 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 );
	}
}
Example #3
0
/*
* 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 );
	}
}
Example #4
0
/*
* 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 );
	}
}
Example #5
0
/*
* 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;
	}
}
Example #6
0
/*
* 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 );
	}
}
Example #7
0
/*
* 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 );
	}
}
Example #8
0
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 );
	}
}
Example #9
0
/**
 * 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 );
}