2001-12-31 16:16:59 +00:00
//-----------------------------------------------------------------------------
//
// $Id$
//
//-----------------------------------------------------------------------------
//
2001-12-31 16:28:42 +00:00
// $Log$
2006-04-14 18:16:31 +00:00
// Revision 1.8 2006/04/14 18:16:31 makro
// no message
//
2003-03-29 18:53:41 +00:00
// Revision 1.7 2003/03/29 18:53:41 jbravo
// Fixed ammo bug when dropping bandolier. Added color to more errormessages
//
2002-06-16 20:06:15 +00:00
// Revision 1.6 2002/06/16 20:06:13 jbravo
// Reindented all the source files with "indent -kr -ut -i8 -l120 -lc120 -sob -bad -bap"
//
2002-01-11 19:48:33 +00:00
// Revision 1.5 2002/01/11 19:48:29 jbravo
// Formatted the source in non DOS format.
//
2001-12-31 16:28:42 +00:00
// Revision 1.4 2001/12/31 16:28:41 jbravo
// I made a Booboo with the Log tag.
//
2001-12-31 16:16:59 +00:00
//
//-----------------------------------------------------------------------------
2001-08-01 21:07:18 +00:00
// Rafael particles
// cg_particles.c
# include "cg_local.h"
# define BLOODRED 2
# define EMISIVEFADE 3
# define GREY75 4
2002-06-16 20:06:15 +00:00
typedef struct particle_s {
struct particle_s * next ;
float time ;
float endtime ;
vec3_t org ;
vec3_t vel ;
vec3_t accel ;
int color ;
float colorvel ;
float alpha ;
float alphavel ;
int type ;
qhandle_t pshader ;
float height ;
float width ;
float endheight ;
float endwidth ;
float start ;
float end ;
float startfade ;
qboolean rotate ;
int snum ;
qboolean link ;
2001-08-01 21:07:18 +00:00
// Ridah
2002-06-16 20:06:15 +00:00
int shaderAnim ;
int roll ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
int accumroll ;
2001-08-01 21:07:18 +00:00
} cparticle_t ;
2002-06-16 20:06:15 +00:00
typedef enum {
2001-08-01 21:07:18 +00:00
P_NONE ,
P_WEATHER ,
P_FLAT ,
P_SMOKE ,
P_ROTATE ,
P_WEATHER_TURBULENT ,
2002-06-16 20:06:15 +00:00
P_ANIM , // Ridah
2001-08-01 21:07:18 +00:00
P_BAT ,
P_BLEED ,
P_FLAT_SCALEUP ,
P_FLAT_SCALEUP_FADE ,
P_WEATHER_FLURRY ,
P_SMOKE_IMPACT ,
P_BUBBLE ,
P_BUBBLE_TURBULENT ,
P_SPRITE
} particle_type_t ;
# define MAX_SHADER_ANIMS 32
# define MAX_SHADER_ANIM_FRAMES 64
static char * shaderAnimNames [ MAX_SHADER_ANIMS ] = {
" explode1 " ,
" blacksmokeanim " ,
" twiltb2 " ,
" expblue " ,
" blacksmokeanimb " , // uses 'explode1' sequence
" blood " ,
NULL
} ;
static qhandle_t shaderAnims [ MAX_SHADER_ANIMS ] [ MAX_SHADER_ANIM_FRAMES ] ;
2002-06-16 20:06:15 +00:00
static int shaderAnimCounts [ MAX_SHADER_ANIMS ] = {
2001-08-01 21:07:18 +00:00
23 ,
25 ,
45 ,
25 ,
23 ,
5 ,
} ;
2002-06-16 20:06:15 +00:00
static float shaderAnimSTRatio [ MAX_SHADER_ANIMS ] = {
2001-08-01 21:07:18 +00:00
1.405f ,
1.0f ,
1.0f ,
1.0f ,
1.0f ,
1.0f ,
} ;
2002-06-16 20:06:15 +00:00
static int numShaderAnims ;
2001-08-01 21:07:18 +00:00
// done.
# define PARTICLE_GRAVITY 40
# define MAX_PARTICLES 1024 * 8
2002-06-16 20:06:15 +00:00
cparticle_t * active_particles , * free_particles ;
cparticle_t particles [ MAX_PARTICLES ] ;
int cl_numparticles = MAX_PARTICLES ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
qboolean initparticles = qfalse ;
vec3_t vforward , vright , vup ;
vec3_t rforward , rright , rup ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
float oldtime ;
2001-08-01 21:07:18 +00:00
/*
= = = = = = = = = = = = = = =
CL_ClearParticles
= = = = = = = = = = = = = = =
*/
2002-06-16 20:06:15 +00:00
void CG_ClearParticles ( void )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
int i ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
memset ( particles , 0 , sizeof ( particles ) ) ;
2001-08-01 21:07:18 +00:00
free_particles = & particles [ 0 ] ;
active_particles = NULL ;
2002-06-16 20:06:15 +00:00
for ( i = 0 ; i < cl_numparticles ; i + + ) {
particles [ i ] . next = & particles [ i + 1 ] ;
2001-08-01 21:07:18 +00:00
particles [ i ] . type = 0 ;
}
2002-06-16 20:06:15 +00:00
particles [ cl_numparticles - 1 ] . next = NULL ;
2001-08-01 21:07:18 +00:00
oldtime = cg . time ;
// Ridah, init the shaderAnims
2002-06-16 20:06:15 +00:00
for ( i = 0 ; shaderAnimNames [ i ] ; i + + ) {
2001-08-01 21:07:18 +00:00
int j ;
2002-06-16 20:06:15 +00:00
for ( j = 0 ; j < shaderAnimCounts [ i ] ; j + + ) {
shaderAnims [ i ] [ j ] = trap_R_RegisterShader ( va ( " %s%i " , shaderAnimNames [ i ] , j + 1 ) ) ;
2001-08-01 21:07:18 +00:00
}
}
numShaderAnims = i ;
// done.
initparticles = qtrue ;
}
/*
= = = = = = = = = = = = = = = = = = = = =
CG_AddParticleToScene
= = = = = = = = = = = = = = = = = = = = =
*/
2002-06-16 20:06:15 +00:00
void CG_AddParticleToScene ( cparticle_t * p , vec3_t org , float alpha )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
vec3_t point ;
polyVert_t verts [ 4 ] ;
float width ;
float height ;
float time , time2 ;
float ratio ;
float invratio ;
vec3_t color ;
polyVert_t TRIverts [ 3 ] ;
vec3_t rright2 , rup2 ;
if ( p - > type = = P_WEATHER | | p - > type = = P_WEATHER_TURBULENT | | p - > type = = P_WEATHER_FLURRY | | p - > type = = P_BUBBLE | | p - > type = = P_BUBBLE_TURBULENT ) { // create a front facing polygon
if ( p - > type ! = P_WEATHER_FLURRY ) {
if ( p - > type = = P_BUBBLE | | p - > type = = P_BUBBLE_TURBULENT ) {
if ( org [ 2 ] > p - > end ) {
p - > time = cg . time ;
VectorCopy ( org , p - > org ) ; // Ridah, fixes rare snow flakes that flicker on the ground
p - > org [ 2 ] = ( p - > start + crandom ( ) * 4 ) ;
if ( p - > type = = P_BUBBLE_TURBULENT ) {
2001-08-01 21:07:18 +00:00
p - > vel [ 0 ] = crandom ( ) * 4 ;
p - > vel [ 1 ] = crandom ( ) * 4 ;
}
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
} else {
if ( org [ 2 ] < p - > end ) {
p - > time = cg . time ;
VectorCopy ( org , p - > org ) ; // Ridah, fixes rare snow flakes that flicker on the ground
while ( p - > org [ 2 ] < p - > end ) {
p - > org [ 2 ] + = ( p - > start - p - > end ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
if ( p - > type = = P_WEATHER_TURBULENT ) {
2001-08-01 21:07:18 +00:00
p - > vel [ 0 ] = crandom ( ) * 16 ;
p - > vel [ 1 ] = crandom ( ) * 16 ;
}
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
}
}
// Rafael snow pvs check
if ( ! p - > link )
return ;
p - > alpha = 1 ;
}
// Ridah, had to do this or MAX_POLYS is being exceeded in village1.bsp
2002-06-16 20:06:15 +00:00
if ( Distance ( cg . snap - > ps . origin , org ) > 1024 ) {
2001-08-01 21:07:18 +00:00
return ;
}
// done.
2002-06-16 20:06:15 +00:00
if ( p - > type = = P_BUBBLE | | p - > type = = P_BUBBLE_TURBULENT ) {
VectorMA ( org , - p - > height , vup , point ) ;
VectorMA ( point , - p - > width , vright , point ) ;
VectorCopy ( point , verts [ 0 ] . xyz ) ;
verts [ 0 ] . st [ 0 ] = 0 ;
verts [ 0 ] . st [ 1 ] = 0 ;
verts [ 0 ] . modulate [ 0 ] = 255 ;
verts [ 0 ] . modulate [ 1 ] = 255 ;
verts [ 0 ] . modulate [ 2 ] = 255 ;
verts [ 0 ] . modulate [ 3 ] = 255 * p - > alpha ;
VectorMA ( org , - p - > height , vup , point ) ;
VectorMA ( point , p - > width , vright , point ) ;
VectorCopy ( point , verts [ 1 ] . xyz ) ;
verts [ 1 ] . st [ 0 ] = 0 ;
verts [ 1 ] . st [ 1 ] = 1 ;
verts [ 1 ] . modulate [ 0 ] = 255 ;
verts [ 1 ] . modulate [ 1 ] = 255 ;
verts [ 1 ] . modulate [ 2 ] = 255 ;
verts [ 1 ] . modulate [ 3 ] = 255 * p - > alpha ;
VectorMA ( org , p - > height , vup , point ) ;
VectorMA ( point , p - > width , vright , point ) ;
VectorCopy ( point , verts [ 2 ] . xyz ) ;
verts [ 2 ] . st [ 0 ] = 1 ;
verts [ 2 ] . st [ 1 ] = 1 ;
verts [ 2 ] . modulate [ 0 ] = 255 ;
verts [ 2 ] . modulate [ 1 ] = 255 ;
verts [ 2 ] . modulate [ 2 ] = 255 ;
verts [ 2 ] . modulate [ 3 ] = 255 * p - > alpha ;
VectorMA ( org , p - > height , vup , point ) ;
VectorMA ( point , - p - > width , vright , point ) ;
VectorCopy ( point , verts [ 3 ] . xyz ) ;
verts [ 3 ] . st [ 0 ] = 1 ;
verts [ 3 ] . st [ 1 ] = 0 ;
verts [ 3 ] . modulate [ 0 ] = 255 ;
verts [ 3 ] . modulate [ 1 ] = 255 ;
verts [ 3 ] . modulate [ 2 ] = 255 ;
verts [ 3 ] . modulate [ 3 ] = 255 * p - > alpha ;
} else {
VectorMA ( org , - p - > height , vup , point ) ;
VectorMA ( point , - p - > width , vright , point ) ;
VectorCopy ( point , TRIverts [ 0 ] . xyz ) ;
2001-08-01 21:07:18 +00:00
TRIverts [ 0 ] . st [ 0 ] = 1 ;
TRIverts [ 0 ] . st [ 1 ] = 0 ;
TRIverts [ 0 ] . modulate [ 0 ] = 255 ;
TRIverts [ 0 ] . modulate [ 1 ] = 255 ;
TRIverts [ 0 ] . modulate [ 2 ] = 255 ;
2002-06-16 20:06:15 +00:00
TRIverts [ 0 ] . modulate [ 3 ] = 255 * p - > alpha ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
VectorMA ( org , p - > height , vup , point ) ;
VectorMA ( point , - p - > width , vright , point ) ;
VectorCopy ( point , TRIverts [ 1 ] . xyz ) ;
2001-08-01 21:07:18 +00:00
TRIverts [ 1 ] . st [ 0 ] = 0 ;
TRIverts [ 1 ] . st [ 1 ] = 0 ;
TRIverts [ 1 ] . modulate [ 0 ] = 255 ;
TRIverts [ 1 ] . modulate [ 1 ] = 255 ;
TRIverts [ 1 ] . modulate [ 2 ] = 255 ;
2002-06-16 20:06:15 +00:00
TRIverts [ 1 ] . modulate [ 3 ] = 255 * p - > alpha ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
VectorMA ( org , p - > height , vup , point ) ;
VectorMA ( point , p - > width , vright , point ) ;
VectorCopy ( point , TRIverts [ 2 ] . xyz ) ;
2001-08-01 21:07:18 +00:00
TRIverts [ 2 ] . st [ 0 ] = 0 ;
TRIverts [ 2 ] . st [ 1 ] = 1 ;
TRIverts [ 2 ] . modulate [ 0 ] = 255 ;
TRIverts [ 2 ] . modulate [ 1 ] = 255 ;
TRIverts [ 2 ] . modulate [ 2 ] = 255 ;
2002-06-16 20:06:15 +00:00
TRIverts [ 2 ] . modulate [ 3 ] = 255 * p - > alpha ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
} else if ( p - > type = = P_SPRITE ) {
vec3_t rr , ru ;
vec3_t rotate_ang ;
VectorSet ( color , 1.0 , 1.0 , 1.0 ) ;
2001-08-01 21:07:18 +00:00
time = cg . time - p - > time ;
time2 = p - > endtime - p - > time ;
ratio = time / time2 ;
2002-06-16 20:06:15 +00:00
width = p - > width + ( ratio * ( p - > endwidth - p - > width ) ) ;
height = p - > height + ( ratio * ( p - > endheight - p - > height ) ) ;
2001-08-01 21:07:18 +00:00
if ( p - > roll ) {
2002-06-16 20:06:15 +00:00
vectoangles ( cg . refdef . viewaxis [ 0 ] , rotate_ang ) ;
2001-08-01 21:07:18 +00:00
rotate_ang [ ROLL ] + = p - > roll ;
2002-06-16 20:06:15 +00:00
AngleVectors ( rotate_ang , NULL , rr , ru ) ;
2001-08-01 21:07:18 +00:00
}
if ( p - > roll ) {
2002-06-16 20:06:15 +00:00
VectorMA ( org , - height , ru , point ) ;
VectorMA ( point , - width , rr , point ) ;
2001-08-01 21:07:18 +00:00
} else {
2002-06-16 20:06:15 +00:00
VectorMA ( org , - height , vup , point ) ;
VectorMA ( point , - width , vright , point ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorCopy ( point , verts [ 0 ] . xyz ) ;
verts [ 0 ] . st [ 0 ] = 0 ;
verts [ 0 ] . st [ 1 ] = 0 ;
verts [ 0 ] . modulate [ 0 ] = 255 ;
verts [ 0 ] . modulate [ 1 ] = 255 ;
verts [ 0 ] . modulate [ 2 ] = 255 ;
2001-08-01 21:07:18 +00:00
verts [ 0 ] . modulate [ 3 ] = 255 ;
if ( p - > roll ) {
2002-06-16 20:06:15 +00:00
VectorMA ( point , 2 * height , ru , point ) ;
2001-08-01 21:07:18 +00:00
} else {
2002-06-16 20:06:15 +00:00
VectorMA ( point , 2 * height , vup , point ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorCopy ( point , verts [ 1 ] . xyz ) ;
verts [ 1 ] . st [ 0 ] = 0 ;
verts [ 1 ] . st [ 1 ] = 1 ;
verts [ 1 ] . modulate [ 0 ] = 255 ;
verts [ 1 ] . modulate [ 1 ] = 255 ;
verts [ 1 ] . modulate [ 2 ] = 255 ;
verts [ 1 ] . modulate [ 3 ] = 255 ;
2001-08-01 21:07:18 +00:00
if ( p - > roll ) {
2002-06-16 20:06:15 +00:00
VectorMA ( point , 2 * width , rr , point ) ;
2001-08-01 21:07:18 +00:00
} else {
2002-06-16 20:06:15 +00:00
VectorMA ( point , 2 * width , vright , point ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorCopy ( point , verts [ 2 ] . xyz ) ;
verts [ 2 ] . st [ 0 ] = 1 ;
verts [ 2 ] . st [ 1 ] = 1 ;
verts [ 2 ] . modulate [ 0 ] = 255 ;
verts [ 2 ] . modulate [ 1 ] = 255 ;
verts [ 2 ] . modulate [ 2 ] = 255 ;
verts [ 2 ] . modulate [ 3 ] = 255 ;
2001-08-01 21:07:18 +00:00
if ( p - > roll ) {
2002-06-16 20:06:15 +00:00
VectorMA ( point , - 2 * height , ru , point ) ;
2001-08-01 21:07:18 +00:00
} else {
2002-06-16 20:06:15 +00:00
VectorMA ( point , - 2 * height , vup , point ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorCopy ( point , verts [ 3 ] . xyz ) ;
verts [ 3 ] . st [ 0 ] = 1 ;
verts [ 3 ] . st [ 1 ] = 0 ;
verts [ 3 ] . modulate [ 0 ] = 255 ;
verts [ 3 ] . modulate [ 1 ] = 255 ;
verts [ 3 ] . modulate [ 2 ] = 255 ;
verts [ 3 ] . modulate [ 3 ] = 255 ;
} else if ( p - > type = = P_SMOKE | | p - > type = = P_SMOKE_IMPACT ) { // create a front rotating facing polygon
if ( p - > type = = P_SMOKE_IMPACT & & Distance ( cg . snap - > ps . origin , org ) > 1024 ) {
2001-08-01 21:07:18 +00:00
return ;
}
if ( p - > color = = BLOODRED )
2002-06-16 20:06:15 +00:00
VectorSet ( color , 0.22f , 0.0f , 0.0f ) ;
else if ( p - > color = = GREY75 ) {
float len ;
float greyit ;
float val ;
len = Distance ( cg . snap - > ps . origin , org ) ;
2001-08-01 21:07:18 +00:00
if ( ! len )
len = 1 ;
2002-06-16 20:06:15 +00:00
val = 4096 / len ;
2001-08-01 21:07:18 +00:00
greyit = 0.25 * val ;
if ( greyit > 0.5 )
greyit = 0.5 ;
2002-06-16 20:06:15 +00:00
VectorSet ( color , greyit , greyit , greyit ) ;
} else
VectorSet ( color , 1.0 , 1.0 , 1.0 ) ;
2001-08-01 21:07:18 +00:00
time = cg . time - p - > time ;
time2 = p - > endtime - p - > time ;
ratio = time / time2 ;
2002-06-16 20:06:15 +00:00
if ( cg . time > p - > startfade ) {
invratio = 1 - ( ( cg . time - p - > startfade ) / ( p - > endtime - p - > startfade ) ) ;
if ( p - > color = = EMISIVEFADE ) {
2001-08-01 21:07:18 +00:00
float fval ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
fval = ( invratio * invratio ) ;
if ( fval < 0 )
fval = 0 ;
2002-06-16 20:06:15 +00:00
VectorSet ( color , fval , fval , fval ) ;
2001-08-01 21:07:18 +00:00
}
invratio * = p - > alpha ;
2002-06-16 20:06:15 +00:00
} else
2001-08-01 21:07:18 +00:00
invratio = 1 * p - > alpha ;
2002-06-16 20:06:15 +00:00
if ( cgs . glconfig . hardwareType = = GLHW_RAGEPRO )
2001-08-01 21:07:18 +00:00
invratio = 1 ;
if ( invratio > 1 )
invratio = 1 ;
2002-06-16 20:06:15 +00:00
width = p - > width + ( ratio * ( p - > endwidth - p - > width ) ) ;
height = p - > height + ( ratio * ( p - > endheight - p - > height ) ) ;
if ( p - > type ! = P_SMOKE_IMPACT ) {
2001-08-01 21:07:18 +00:00
vec3_t temp ;
2002-06-16 20:06:15 +00:00
vectoangles ( rforward , temp ) ;
2001-08-01 21:07:18 +00:00
p - > accumroll + = p - > roll ;
temp [ ROLL ] + = p - > accumroll * 0.1 ;
2002-06-16 20:06:15 +00:00
AngleVectors ( temp , NULL , rright2 , rup2 ) ;
} else {
VectorCopy ( rright , rright2 ) ;
VectorCopy ( rup , rup2 ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
if ( p - > rotate ) {
VectorMA ( org , - height , rup2 , point ) ;
VectorMA ( point , - width , rright2 , point ) ;
} else {
VectorMA ( org , - p - > height , vup , point ) ;
VectorMA ( point , - p - > width , vright , point ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorCopy ( point , verts [ 0 ] . xyz ) ;
verts [ 0 ] . st [ 0 ] = 0 ;
verts [ 0 ] . st [ 1 ] = 0 ;
verts [ 0 ] . modulate [ 0 ] = 255 * color [ 0 ] ;
verts [ 0 ] . modulate [ 1 ] = 255 * color [ 1 ] ;
verts [ 0 ] . modulate [ 2 ] = 255 * color [ 2 ] ;
verts [ 0 ] . modulate [ 3 ] = 255 * invratio ;
if ( p - > rotate ) {
VectorMA ( org , - height , rup2 , point ) ;
VectorMA ( point , width , rright2 , point ) ;
} else {
VectorMA ( org , - p - > height , vup , point ) ;
VectorMA ( point , p - > width , vright , point ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorCopy ( point , verts [ 1 ] . xyz ) ;
verts [ 1 ] . st [ 0 ] = 0 ;
verts [ 1 ] . st [ 1 ] = 1 ;
verts [ 1 ] . modulate [ 0 ] = 255 * color [ 0 ] ;
verts [ 1 ] . modulate [ 1 ] = 255 * color [ 1 ] ;
verts [ 1 ] . modulate [ 2 ] = 255 * color [ 2 ] ;
verts [ 1 ] . modulate [ 3 ] = 255 * invratio ;
if ( p - > rotate ) {
VectorMA ( org , height , rup2 , point ) ;
VectorMA ( point , width , rright2 , point ) ;
} else {
VectorMA ( org , p - > height , vup , point ) ;
VectorMA ( point , p - > width , vright , point ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorCopy ( point , verts [ 2 ] . xyz ) ;
verts [ 2 ] . st [ 0 ] = 1 ;
verts [ 2 ] . st [ 1 ] = 1 ;
verts [ 2 ] . modulate [ 0 ] = 255 * color [ 0 ] ;
verts [ 2 ] . modulate [ 1 ] = 255 * color [ 1 ] ;
verts [ 2 ] . modulate [ 2 ] = 255 * color [ 2 ] ;
verts [ 2 ] . modulate [ 3 ] = 255 * invratio ;
if ( p - > rotate ) {
VectorMA ( org , height , rup2 , point ) ;
VectorMA ( point , - width , rright2 , point ) ;
} else {
VectorMA ( org , p - > height , vup , point ) ;
VectorMA ( point , - p - > width , vright , point ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorCopy ( point , verts [ 3 ] . xyz ) ;
verts [ 3 ] . st [ 0 ] = 1 ;
verts [ 3 ] . st [ 1 ] = 0 ;
verts [ 3 ] . modulate [ 0 ] = 255 * color [ 0 ] ;
verts [ 3 ] . modulate [ 1 ] = 255 * color [ 1 ] ;
verts [ 3 ] . modulate [ 2 ] = 255 * color [ 2 ] ;
verts [ 3 ] . modulate [ 3 ] = 255 * invratio ;
} else if ( p - > type = = P_BLEED ) {
vec3_t rr , ru ;
vec3_t rotate_ang ;
float alpha ;
2001-08-01 21:07:18 +00:00
alpha = p - > alpha ;
2002-06-16 20:06:15 +00:00
if ( cgs . glconfig . hardwareType = = GLHW_RAGEPRO )
2001-08-01 21:07:18 +00:00
alpha = 1 ;
2002-06-16 20:06:15 +00:00
if ( p - > roll ) {
vectoangles ( cg . refdef . viewaxis [ 0 ] , rotate_ang ) ;
2001-08-01 21:07:18 +00:00
rotate_ang [ ROLL ] + = p - > roll ;
2002-06-16 20:06:15 +00:00
AngleVectors ( rotate_ang , NULL , rr , ru ) ;
} else {
VectorCopy ( vup , ru ) ;
VectorCopy ( vright , rr ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorMA ( org , - p - > height , ru , point ) ;
VectorMA ( point , - p - > width , rr , point ) ;
VectorCopy ( point , verts [ 0 ] . xyz ) ;
verts [ 0 ] . st [ 0 ] = 0 ;
verts [ 0 ] . st [ 1 ] = 0 ;
verts [ 0 ] . modulate [ 0 ] = 111 ;
verts [ 0 ] . modulate [ 1 ] = 19 ;
verts [ 0 ] . modulate [ 2 ] = 9 ;
verts [ 0 ] . modulate [ 3 ] = 255 * alpha ;
VectorMA ( org , - p - > height , ru , point ) ;
VectorMA ( point , p - > width , rr , point ) ;
VectorCopy ( point , verts [ 1 ] . xyz ) ;
verts [ 1 ] . st [ 0 ] = 0 ;
verts [ 1 ] . st [ 1 ] = 1 ;
verts [ 1 ] . modulate [ 0 ] = 111 ;
verts [ 1 ] . modulate [ 1 ] = 19 ;
verts [ 1 ] . modulate [ 2 ] = 9 ;
verts [ 1 ] . modulate [ 3 ] = 255 * alpha ;
VectorMA ( org , p - > height , ru , point ) ;
VectorMA ( point , p - > width , rr , point ) ;
VectorCopy ( point , verts [ 2 ] . xyz ) ;
verts [ 2 ] . st [ 0 ] = 1 ;
verts [ 2 ] . st [ 1 ] = 1 ;
verts [ 2 ] . modulate [ 0 ] = 111 ;
verts [ 2 ] . modulate [ 1 ] = 19 ;
verts [ 2 ] . modulate [ 2 ] = 9 ;
verts [ 2 ] . modulate [ 3 ] = 255 * alpha ;
VectorMA ( org , p - > height , ru , point ) ;
VectorMA ( point , - p - > width , rr , point ) ;
VectorCopy ( point , verts [ 3 ] . xyz ) ;
verts [ 3 ] . st [ 0 ] = 1 ;
verts [ 3 ] . st [ 1 ] = 0 ;
verts [ 3 ] . modulate [ 0 ] = 111 ;
verts [ 3 ] . modulate [ 1 ] = 19 ;
verts [ 3 ] . modulate [ 2 ] = 9 ;
verts [ 3 ] . modulate [ 3 ] = 255 * alpha ;
} else if ( p - > type = = P_FLAT_SCALEUP ) {
2001-08-01 21:07:18 +00:00
float width , height ;
float sinR , cosR ;
if ( p - > color = = BLOODRED )
2002-06-16 20:06:15 +00:00
VectorSet ( color , 1 , 1 , 1 ) ;
2001-08-01 21:07:18 +00:00
else
2002-06-16 20:06:15 +00:00
VectorSet ( color , 0.5 , 0.5 , 0.5 ) ;
2001-08-01 21:07:18 +00:00
time = cg . time - p - > time ;
time2 = p - > endtime - p - > time ;
ratio = time / time2 ;
2002-06-16 20:06:15 +00:00
width = p - > width + ( ratio * ( p - > endwidth - p - > width ) ) ;
height = p - > height + ( ratio * ( p - > endheight - p - > height ) ) ;
2001-08-01 21:07:18 +00:00
if ( width > p - > endwidth )
width = p - > endwidth ;
if ( height > p - > endheight )
height = p - > endheight ;
sinR = height * sin ( DEG2RAD ( p - > roll ) ) * sqrt ( 2 ) ;
cosR = width * cos ( DEG2RAD ( p - > roll ) ) * sqrt ( 2 ) ;
2002-06-16 20:06:15 +00:00
VectorCopy ( org , verts [ 0 ] . xyz ) ;
2001-08-01 21:07:18 +00:00
verts [ 0 ] . xyz [ 0 ] - = sinR ;
verts [ 0 ] . xyz [ 1 ] - = cosR ;
2002-06-16 20:06:15 +00:00
verts [ 0 ] . st [ 0 ] = 0 ;
verts [ 0 ] . st [ 1 ] = 0 ;
verts [ 0 ] . modulate [ 0 ] = 255 * color [ 0 ] ;
verts [ 0 ] . modulate [ 1 ] = 255 * color [ 1 ] ;
verts [ 0 ] . modulate [ 2 ] = 255 * color [ 2 ] ;
verts [ 0 ] . modulate [ 3 ] = 255 ;
VectorCopy ( org , verts [ 1 ] . xyz ) ;
verts [ 1 ] . xyz [ 0 ] - = cosR ;
verts [ 1 ] . xyz [ 1 ] + = sinR ;
verts [ 1 ] . st [ 0 ] = 0 ;
verts [ 1 ] . st [ 1 ] = 1 ;
verts [ 1 ] . modulate [ 0 ] = 255 * color [ 0 ] ;
verts [ 1 ] . modulate [ 1 ] = 255 * color [ 1 ] ;
verts [ 1 ] . modulate [ 2 ] = 255 * color [ 2 ] ;
verts [ 1 ] . modulate [ 3 ] = 255 ;
VectorCopy ( org , verts [ 2 ] . xyz ) ;
verts [ 2 ] . xyz [ 0 ] + = sinR ;
verts [ 2 ] . xyz [ 1 ] + = cosR ;
verts [ 2 ] . st [ 0 ] = 1 ;
verts [ 2 ] . st [ 1 ] = 1 ;
verts [ 2 ] . modulate [ 0 ] = 255 * color [ 0 ] ;
verts [ 2 ] . modulate [ 1 ] = 255 * color [ 1 ] ;
verts [ 2 ] . modulate [ 2 ] = 255 * color [ 2 ] ;
verts [ 2 ] . modulate [ 3 ] = 255 ;
VectorCopy ( org , verts [ 3 ] . xyz ) ;
verts [ 3 ] . xyz [ 0 ] + = cosR ;
verts [ 3 ] . xyz [ 1 ] - = sinR ;
verts [ 3 ] . st [ 0 ] = 1 ;
verts [ 3 ] . st [ 1 ] = 0 ;
verts [ 3 ] . modulate [ 0 ] = 255 * color [ 0 ] ;
verts [ 3 ] . modulate [ 1 ] = 255 * color [ 1 ] ;
verts [ 3 ] . modulate [ 2 ] = 255 * color [ 2 ] ;
verts [ 3 ] . modulate [ 3 ] = 255 ;
} else if ( p - > type = = P_FLAT ) {
VectorCopy ( org , verts [ 0 ] . xyz ) ;
verts [ 0 ] . xyz [ 0 ] - = p - > height ;
verts [ 0 ] . xyz [ 1 ] - = p - > width ;
verts [ 0 ] . st [ 0 ] = 0 ;
verts [ 0 ] . st [ 1 ] = 0 ;
verts [ 0 ] . modulate [ 0 ] = 255 ;
verts [ 0 ] . modulate [ 1 ] = 255 ;
verts [ 0 ] . modulate [ 2 ] = 255 ;
verts [ 0 ] . modulate [ 3 ] = 255 ;
VectorCopy ( org , verts [ 1 ] . xyz ) ;
verts [ 1 ] . xyz [ 0 ] - = p - > height ;
verts [ 1 ] . xyz [ 1 ] + = p - > width ;
verts [ 1 ] . st [ 0 ] = 0 ;
verts [ 1 ] . st [ 1 ] = 1 ;
verts [ 1 ] . modulate [ 0 ] = 255 ;
verts [ 1 ] . modulate [ 1 ] = 255 ;
verts [ 1 ] . modulate [ 2 ] = 255 ;
verts [ 1 ] . modulate [ 3 ] = 255 ;
VectorCopy ( org , verts [ 2 ] . xyz ) ;
verts [ 2 ] . xyz [ 0 ] + = p - > height ;
verts [ 2 ] . xyz [ 1 ] + = p - > width ;
verts [ 2 ] . st [ 0 ] = 1 ;
verts [ 2 ] . st [ 1 ] = 1 ;
verts [ 2 ] . modulate [ 0 ] = 255 ;
verts [ 2 ] . modulate [ 1 ] = 255 ;
verts [ 2 ] . modulate [ 2 ] = 255 ;
verts [ 2 ] . modulate [ 3 ] = 255 ;
VectorCopy ( org , verts [ 3 ] . xyz ) ;
verts [ 3 ] . xyz [ 0 ] + = p - > height ;
verts [ 3 ] . xyz [ 1 ] - = p - > width ;
verts [ 3 ] . st [ 0 ] = 1 ;
verts [ 3 ] . st [ 1 ] = 0 ;
verts [ 3 ] . modulate [ 0 ] = 255 ;
verts [ 3 ] . modulate [ 1 ] = 255 ;
verts [ 3 ] . modulate [ 2 ] = 255 ;
verts [ 3 ] . modulate [ 3 ] = 255 ;
2001-08-01 21:07:18 +00:00
}
// Ridah
else if ( p - > type = = P_ANIM ) {
2002-06-16 20:06:15 +00:00
vec3_t rr , ru ;
vec3_t rotate_ang ;
2001-08-01 21:07:18 +00:00
int i , j ;
time = cg . time - p - > time ;
time2 = p - > endtime - p - > time ;
ratio = time / time2 ;
if ( ratio > = 1.0f ) {
ratio = 0.9999f ;
}
2002-06-16 20:06:15 +00:00
width = p - > width + ( ratio * ( p - > endwidth - p - > width ) ) ;
height = p - > height + ( ratio * ( p - > endheight - p - > height ) ) ;
2001-08-01 21:07:18 +00:00
// if we are "inside" this sprite, don't draw
2002-06-16 20:06:15 +00:00
if ( Distance ( cg . snap - > ps . origin , org ) < width / 1.5 ) {
2001-08-01 21:07:18 +00:00
return ;
}
i = p - > shaderAnim ;
2002-06-16 20:06:15 +00:00
j = ( int ) floor ( ratio * shaderAnimCounts [ p - > shaderAnim ] ) ;
2001-08-01 21:07:18 +00:00
p - > pshader = shaderAnims [ i ] [ j ] ;
if ( p - > roll ) {
2002-06-16 20:06:15 +00:00
vectoangles ( cg . refdef . viewaxis [ 0 ] , rotate_ang ) ;
2001-08-01 21:07:18 +00:00
rotate_ang [ ROLL ] + = p - > roll ;
2002-06-16 20:06:15 +00:00
AngleVectors ( rotate_ang , NULL , rr , ru ) ;
2001-08-01 21:07:18 +00:00
}
if ( p - > roll ) {
2002-06-16 20:06:15 +00:00
VectorMA ( org , - height , ru , point ) ;
VectorMA ( point , - width , rr , point ) ;
2001-08-01 21:07:18 +00:00
} else {
2002-06-16 20:06:15 +00:00
VectorMA ( org , - height , vup , point ) ;
VectorMA ( point , - width , vright , point ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorCopy ( point , verts [ 0 ] . xyz ) ;
verts [ 0 ] . st [ 0 ] = 0 ;
verts [ 0 ] . st [ 1 ] = 0 ;
verts [ 0 ] . modulate [ 0 ] = 255 ;
verts [ 0 ] . modulate [ 1 ] = 255 ;
verts [ 0 ] . modulate [ 2 ] = 255 ;
2001-08-01 21:07:18 +00:00
verts [ 0 ] . modulate [ 3 ] = 255 ;
if ( p - > roll ) {
2002-06-16 20:06:15 +00:00
VectorMA ( point , 2 * height , ru , point ) ;
2001-08-01 21:07:18 +00:00
} else {
2002-06-16 20:06:15 +00:00
VectorMA ( point , 2 * height , vup , point ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorCopy ( point , verts [ 1 ] . xyz ) ;
verts [ 1 ] . st [ 0 ] = 0 ;
verts [ 1 ] . st [ 1 ] = 1 ;
verts [ 1 ] . modulate [ 0 ] = 255 ;
verts [ 1 ] . modulate [ 1 ] = 255 ;
verts [ 1 ] . modulate [ 2 ] = 255 ;
verts [ 1 ] . modulate [ 3 ] = 255 ;
2001-08-01 21:07:18 +00:00
if ( p - > roll ) {
2002-06-16 20:06:15 +00:00
VectorMA ( point , 2 * width , rr , point ) ;
2001-08-01 21:07:18 +00:00
} else {
2002-06-16 20:06:15 +00:00
VectorMA ( point , 2 * width , vright , point ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorCopy ( point , verts [ 2 ] . xyz ) ;
verts [ 2 ] . st [ 0 ] = 1 ;
verts [ 2 ] . st [ 1 ] = 1 ;
verts [ 2 ] . modulate [ 0 ] = 255 ;
verts [ 2 ] . modulate [ 1 ] = 255 ;
verts [ 2 ] . modulate [ 2 ] = 255 ;
verts [ 2 ] . modulate [ 3 ] = 255 ;
2001-08-01 21:07:18 +00:00
if ( p - > roll ) {
2002-06-16 20:06:15 +00:00
VectorMA ( point , - 2 * height , ru , point ) ;
2001-08-01 21:07:18 +00:00
} else {
2002-06-16 20:06:15 +00:00
VectorMA ( point , - 2 * height , vup , point ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
VectorCopy ( point , verts [ 3 ] . xyz ) ;
verts [ 3 ] . st [ 0 ] = 1 ;
verts [ 3 ] . st [ 1 ] = 0 ;
verts [ 3 ] . modulate [ 0 ] = 255 ;
verts [ 3 ] . modulate [ 1 ] = 255 ;
verts [ 3 ] . modulate [ 2 ] = 255 ;
verts [ 3 ] . modulate [ 3 ] = 255 ;
2001-08-01 21:07:18 +00:00
}
// done.
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
if ( ! p - > pshader ) {
// (SA) temp commented out for DM
2002-06-16 20:06:15 +00:00
// CG_Printf ("CG_AddParticleToScene type %d p->pshader == ZERO\n", p->type);
2001-08-01 21:07:18 +00:00
return ;
}
if ( p - > type = = P_WEATHER | | p - > type = = P_WEATHER_TURBULENT | | p - > type = = P_WEATHER_FLURRY )
2002-06-16 20:06:15 +00:00
trap_R_AddPolyToScene ( p - > pshader , 3 , TRIverts ) ;
2001-08-01 21:07:18 +00:00
else
2002-06-16 20:06:15 +00:00
trap_R_AddPolyToScene ( p - > pshader , 4 , verts ) ;
2001-08-01 21:07:18 +00:00
}
// Ridah, made this static so it doesn't interfere with other files
static float roll = 0.0 ;
/*
= = = = = = = = = = = = = = =
CG_AddParticles
= = = = = = = = = = = = = = =
*/
2002-06-16 20:06:15 +00:00
void CG_AddParticles ( void )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p , * next ;
float alpha ;
float time , time2 ;
vec3_t org ;
2012-01-13 21:27:15 +00:00
// int color;
2002-06-16 20:06:15 +00:00
cparticle_t * active , * tail ;
2012-01-13 21:27:15 +00:00
// int type;
2002-06-16 20:06:15 +00:00
vec3_t rotate_ang ;
2001-08-01 21:07:18 +00:00
if ( ! initparticles )
2002-06-16 20:06:15 +00:00
CG_ClearParticles ( ) ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
VectorCopy ( cg . refdef . viewaxis [ 0 ] , vforward ) ;
VectorCopy ( cg . refdef . viewaxis [ 1 ] , vright ) ;
VectorCopy ( cg . refdef . viewaxis [ 2 ] , vup ) ;
vectoangles ( cg . refdef . viewaxis [ 0 ] , rotate_ang ) ;
roll + = ( ( cg . time - oldtime ) * 0.1 ) ;
rotate_ang [ ROLL ] + = ( roll * 0.9 ) ;
AngleVectors ( rotate_ang , rforward , rright , rup ) ;
2001-08-01 21:07:18 +00:00
oldtime = cg . time ;
active = NULL ;
tail = NULL ;
2002-06-16 20:06:15 +00:00
for ( p = active_particles ; p ; p = next ) {
2001-08-01 21:07:18 +00:00
next = p - > next ;
2002-06-16 20:06:15 +00:00
time = ( cg . time - p - > time ) * 0.001 ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
alpha = p - > alpha + time * p - > alphavel ;
if ( alpha < = 0 ) { // faded out
2001-08-01 21:07:18 +00:00
p - > next = free_particles ;
free_particles = p ;
p - > type = 0 ;
p - > color = 0 ;
p - > alpha = 0 ;
continue ;
}
2002-06-16 20:06:15 +00:00
if ( p - > type = = P_SMOKE | | p - > type = = P_ANIM | | p - > type = = P_BLEED | | p - > type = = P_SMOKE_IMPACT ) {
if ( cg . time > p - > endtime ) {
2001-08-01 21:07:18 +00:00
p - > next = free_particles ;
free_particles = p ;
p - > type = 0 ;
p - > color = 0 ;
p - > alpha = 0 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
continue ;
}
}
2002-06-16 20:06:15 +00:00
if ( p - > type = = P_WEATHER_FLURRY ) {
if ( cg . time > p - > endtime ) {
2001-08-01 21:07:18 +00:00
p - > next = free_particles ;
free_particles = p ;
p - > type = 0 ;
p - > color = 0 ;
p - > alpha = 0 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
continue ;
}
}
2002-06-16 20:06:15 +00:00
if ( p - > type = = P_FLAT_SCALEUP_FADE ) {
if ( cg . time > p - > endtime ) {
2001-08-01 21:07:18 +00:00
p - > next = free_particles ;
free_particles = p ;
p - > type = 0 ;
p - > color = 0 ;
p - > alpha = 0 ;
continue ;
}
}
if ( ( p - > type = = P_BAT | | p - > type = = P_SPRITE ) & & p - > endtime < 0 ) {
// temporary sprite
2002-06-16 20:06:15 +00:00
CG_AddParticleToScene ( p , p - > org , alpha ) ;
2001-08-01 21:07:18 +00:00
p - > next = free_particles ;
free_particles = p ;
p - > type = 0 ;
p - > color = 0 ;
p - > alpha = 0 ;
continue ;
}
p - > next = NULL ;
if ( ! tail )
active = tail = p ;
2002-06-16 20:06:15 +00:00
else {
2001-08-01 21:07:18 +00:00
tail - > next = p ;
tail = p ;
}
if ( alpha > 1.0 )
alpha = 1 ;
2012-01-13 21:27:15 +00:00
// color = p->color;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
time2 = time * time ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
org [ 0 ] = p - > org [ 0 ] + p - > vel [ 0 ] * time + p - > accel [ 0 ] * time2 ;
org [ 1 ] = p - > org [ 1 ] + p - > vel [ 1 ] * time + p - > accel [ 1 ] * time2 ;
org [ 2 ] = p - > org [ 2 ] + p - > vel [ 2 ] * time + p - > accel [ 2 ] * time2 ;
2001-08-01 21:07:18 +00:00
2012-01-13 21:27:15 +00:00
// type = p->type;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
CG_AddParticleToScene ( p , org , alpha ) ;
2001-08-01 21:07:18 +00:00
}
active_particles = active ;
}
/*
= = = = = = = = = = = = = = = = = = = = = =
CG_AddParticles
= = = = = = = = = = = = = = = = = = = = = =
*/
2002-06-16 20:06:15 +00:00
void CG_ParticleSnowFlurry ( qhandle_t pshader , centity_t * cent )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p ;
2001-08-01 21:07:18 +00:00
qboolean turb = qtrue ;
if ( ! pshader )
2003-03-29 18:53:41 +00:00
CG_Printf ( " ^1CG_ParticleSnowFlurry pshader == ZERO! \n " ) ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
p - > color = 0 ;
p - > alpha = 0.90f ;
p - > alphavel = 0 ;
p - > start = cent - > currentState . origin2 [ 0 ] ;
p - > end = cent - > currentState . origin2 [ 1 ] ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > endtime = cg . time + cent - > currentState . time ;
p - > startfade = cg . time + cent - > currentState . time2 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > pshader = pshader ;
2002-06-16 20:06:15 +00:00
if ( rand ( ) % 100 > 90 ) {
2001-08-01 21:07:18 +00:00
p - > height = 32 ;
p - > width = 32 ;
p - > alpha = 0.10f ;
2002-06-16 20:06:15 +00:00
} else {
2001-08-01 21:07:18 +00:00
p - > height = 1 ;
p - > width = 1 ;
}
p - > vel [ 2 ] = - 20 ;
p - > type = P_WEATHER_FLURRY ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
if ( turb )
p - > vel [ 2 ] = - 10 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
VectorCopy ( cent - > currentState . origin , p - > org ) ;
p - > org [ 0 ] = p - > org [ 0 ] ;
p - > org [ 1 ] = p - > org [ 1 ] ;
p - > org [ 2 ] = p - > org [ 2 ] ;
p - > vel [ 0 ] = p - > vel [ 1 ] = 0 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > accel [ 0 ] = p - > accel [ 1 ] = p - > accel [ 2 ] = 0 ;
p - > vel [ 0 ] + = cent - > currentState . angles [ 0 ] * 32 + ( crandom ( ) * 16 ) ;
p - > vel [ 1 ] + = cent - > currentState . angles [ 1 ] * 32 + ( crandom ( ) * 16 ) ;
p - > vel [ 2 ] + = cent - > currentState . angles [ 2 ] ;
2002-06-16 20:06:15 +00:00
if ( turb ) {
p - > accel [ 0 ] = crandom ( ) * 16 ;
p - > accel [ 1 ] = crandom ( ) * 16 ;
2001-08-01 21:07:18 +00:00
}
}
2002-06-16 20:06:15 +00:00
void CG_ParticleSnow ( qhandle_t pshader , vec3_t origin , vec3_t origin2 , int turb , float range , int snum )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p ;
2001-08-01 21:07:18 +00:00
if ( ! pshader )
2003-03-29 18:53:41 +00:00
CG_Printf ( " ^1CG_ParticleSnow pshader == ZERO! \n " ) ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
p - > color = 0 ;
p - > alpha = 0.40f ;
p - > alphavel = 0 ;
p - > start = origin [ 2 ] ;
p - > end = origin2 [ 2 ] ;
p - > pshader = pshader ;
p - > height = 1 ;
p - > width = 1 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > vel [ 2 ] = - 50 ;
2002-06-16 20:06:15 +00:00
if ( turb ) {
2001-08-01 21:07:18 +00:00
p - > type = P_WEATHER_TURBULENT ;
p - > vel [ 2 ] = - 50 * 1.3 ;
2002-06-16 20:06:15 +00:00
} else {
2001-08-01 21:07:18 +00:00
p - > type = P_WEATHER ;
}
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
VectorCopy ( origin , p - > org ) ;
2002-06-16 20:06:15 +00:00
p - > org [ 0 ] = p - > org [ 0 ] + ( crandom ( ) * range ) ;
p - > org [ 1 ] = p - > org [ 1 ] + ( crandom ( ) * range ) ;
p - > org [ 2 ] = p - > org [ 2 ] + ( crandom ( ) * ( p - > start - p - > end ) ) ;
2001-08-01 21:07:18 +00:00
p - > vel [ 0 ] = p - > vel [ 1 ] = 0 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > accel [ 0 ] = p - > accel [ 1 ] = p - > accel [ 2 ] = 0 ;
2002-06-16 20:06:15 +00:00
if ( turb ) {
2001-08-01 21:07:18 +00:00
p - > vel [ 0 ] = crandom ( ) * 16 ;
p - > vel [ 1 ] = crandom ( ) * 16 ;
}
// Rafael snow pvs check
p - > snum = snum ;
p - > link = qtrue ;
}
2002-06-16 20:06:15 +00:00
void CG_ParticleBubble ( qhandle_t pshader , vec3_t origin , vec3_t origin2 , int turb , float range , int snum )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p ;
float randsize ;
2001-08-01 21:07:18 +00:00
if ( ! pshader )
2003-03-29 18:53:41 +00:00
CG_Printf ( " ^1CG_ParticleSnow pshader == ZERO! \n " ) ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
p - > color = 0 ;
p - > alpha = 0.40f ;
p - > alphavel = 0 ;
p - > start = origin [ 2 ] ;
p - > end = origin2 [ 2 ] ;
p - > pshader = pshader ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
randsize = 1 + ( crandom ( ) * 0.5 ) ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > height = randsize ;
p - > width = randsize ;
2002-06-16 20:06:15 +00:00
p - > vel [ 2 ] = 50 + ( crandom ( ) * 10 ) ;
if ( turb ) {
2001-08-01 21:07:18 +00:00
p - > type = P_BUBBLE_TURBULENT ;
p - > vel [ 2 ] = 50 * 1.3 ;
2002-06-16 20:06:15 +00:00
} else {
2001-08-01 21:07:18 +00:00
p - > type = P_BUBBLE ;
}
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
VectorCopy ( origin , p - > org ) ;
2002-06-16 20:06:15 +00:00
p - > org [ 0 ] = p - > org [ 0 ] + ( crandom ( ) * range ) ;
p - > org [ 1 ] = p - > org [ 1 ] + ( crandom ( ) * range ) ;
p - > org [ 2 ] = p - > org [ 2 ] + ( crandom ( ) * ( p - > start - p - > end ) ) ;
2001-08-01 21:07:18 +00:00
p - > vel [ 0 ] = p - > vel [ 1 ] = 0 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > accel [ 0 ] = p - > accel [ 1 ] = p - > accel [ 2 ] = 0 ;
2002-06-16 20:06:15 +00:00
if ( turb ) {
2001-08-01 21:07:18 +00:00
p - > vel [ 0 ] = crandom ( ) * 4 ;
p - > vel [ 1 ] = crandom ( ) * 4 ;
}
// Rafael snow pvs check
p - > snum = snum ;
p - > link = qtrue ;
}
2002-06-16 20:06:15 +00:00
void CG_ParticleSmoke ( qhandle_t pshader , centity_t * cent )
2001-08-01 21:07:18 +00:00
{
// using cent->density = enttime
2002-06-16 20:06:15 +00:00
// cent->frame = startfade
cparticle_t * p ;
2001-08-01 21:07:18 +00:00
if ( ! pshader )
2003-03-29 18:53:41 +00:00
CG_Printf ( " ^1CG_ParticleSmoke == ZERO! \n " ) ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > endtime = cg . time + cent - > currentState . time ;
p - > startfade = cg . time + cent - > currentState . time2 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > color = 0 ;
p - > alpha = 1.0 ;
p - > alphavel = 0 ;
p - > start = cent - > currentState . origin [ 2 ] ;
p - > end = cent - > currentState . origin2 [ 2 ] ;
p - > pshader = pshader ;
p - > rotate = qfalse ;
p - > height = 8 ;
p - > width = 8 ;
p - > endheight = 32 ;
p - > endwidth = 32 ;
p - > type = P_SMOKE ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
VectorCopy ( cent - > currentState . origin , p - > org ) ;
p - > vel [ 0 ] = p - > vel [ 1 ] = 0 ;
p - > accel [ 0 ] = p - > accel [ 1 ] = p - > accel [ 2 ] = 0 ;
p - > vel [ 2 ] = 5 ;
2002-06-16 20:06:15 +00:00
if ( cent - > currentState . frame = = 1 ) // reverse gravity
2001-08-01 21:07:18 +00:00
p - > vel [ 2 ] * = - 1 ;
p - > roll = 8 + ( crandom ( ) * 4 ) ;
}
2002-06-16 20:06:15 +00:00
void CG_ParticleBulletDebris ( vec3_t org , vec3_t vel , int duration )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > endtime = cg . time + duration ;
2002-06-16 20:06:15 +00:00
p - > startfade = cg . time + duration / 2 ;
2001-08-01 21:07:18 +00:00
p - > color = EMISIVEFADE ;
p - > alpha = 1.0 ;
p - > alphavel = 0 ;
p - > height = 0.5 ;
p - > width = 0.5 ;
p - > endheight = 0.5 ;
p - > endwidth = 0.5 ;
p - > pshader = cgs . media . tracerShader ;
p - > type = P_SMOKE ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
VectorCopy ( org , p - > org ) ;
p - > vel [ 0 ] = vel [ 0 ] ;
p - > vel [ 1 ] = vel [ 1 ] ;
p - > vel [ 2 ] = vel [ 2 ] ;
p - > accel [ 0 ] = p - > accel [ 1 ] = p - > accel [ 2 ] = 0 ;
p - > accel [ 2 ] = - 60 ;
p - > vel [ 2 ] + = - 20 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
}
/*
= = = = = = = = = = = = = = = = = = = = = =
CG_ParticleExplosion
= = = = = = = = = = = = = = = = = = = = = =
*/
2002-06-16 20:06:15 +00:00
void CG_ParticleExplosion ( char * animStr , vec3_t origin , vec3_t vel , int duration , int sizeStart , int sizeEnd )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p ;
2001-08-01 21:07:18 +00:00
int anim ;
2002-06-16 20:06:15 +00:00
if ( animStr < ( char * ) 10 )
CG_Error ( " CG_ParticleExplosion: animStr is probably an index rather than a string " ) ;
2001-08-01 21:07:18 +00:00
// find the animation string
2002-06-16 20:06:15 +00:00
for ( anim = 0 ; shaderAnimNames [ anim ] ; anim + + ) {
2001-10-29 09:58:44 +00:00
// JBravo - It was stricmp. Changed to Q_stricmp
2002-06-16 20:06:15 +00:00
if ( ! Q_stricmp ( animStr , shaderAnimNames [ anim ] ) )
2001-08-01 21:07:18 +00:00
break ;
}
if ( ! shaderAnimNames [ anim ] ) {
2012-10-04 14:43:32 +00:00
CG_Error ( " CG_ParticleExplosion: unknown animation string: %s " , animStr ) ;
2001-08-01 21:07:18 +00:00
return ;
}
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
p - > alpha = 1.0 ;
p - > alphavel = 0 ;
if ( duration < 0 ) {
duration * = - 1 ;
p - > roll = 0 ;
} else {
2002-06-16 20:06:15 +00:00
p - > roll = crandom ( ) * 179 ;
2001-08-01 21:07:18 +00:00
}
p - > shaderAnim = anim ;
p - > width = sizeStart ;
2002-06-16 20:06:15 +00:00
p - > height = sizeStart * shaderAnimSTRatio [ anim ] ; // for sprites that are stretch in either direction
2001-08-01 21:07:18 +00:00
p - > endheight = sizeEnd ;
2002-06-16 20:06:15 +00:00
p - > endwidth = sizeEnd * shaderAnimSTRatio [ anim ] ;
2001-08-01 21:07:18 +00:00
p - > endtime = cg . time + duration ;
p - > type = P_ANIM ;
2002-06-16 20:06:15 +00:00
VectorCopy ( origin , p - > org ) ;
VectorCopy ( vel , p - > vel ) ;
VectorClear ( p - > accel ) ;
2001-08-01 21:07:18 +00:00
}
// Rafael Shrapnel
2002-06-16 20:06:15 +00:00
void CG_AddParticleShrapnel ( localEntity_t * le )
2001-08-01 21:07:18 +00:00
{
return ;
}
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
// done.
2002-06-16 20:06:15 +00:00
int CG_NewParticleArea ( int num )
2001-08-01 21:07:18 +00:00
{
// const char *str;
char * str ;
char * token ;
int type ;
vec3_t origin , origin2 ;
2002-06-16 20:06:15 +00:00
int i ;
2001-08-01 21:07:18 +00:00
float range = 0 ;
int turb ;
2002-06-16 20:06:15 +00:00
int numparticles ;
int snum ;
str = ( char * ) CG_ConfigString ( num ) ;
2001-08-01 21:07:18 +00:00
if ( ! str [ 0 ] )
return ( 0 ) ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
// returns type 128 64 or 32
2002-06-16 20:06:15 +00:00
token = COM_Parse ( & str ) ;
type = atoi ( token ) ;
2001-08-01 21:07:18 +00:00
if ( type = = 1 )
range = 128 ;
else if ( type = = 2 )
range = 64 ;
else if ( type = = 3 )
range = 32 ;
else if ( type = = 0 )
range = 256 ;
else if ( type = = 4 )
range = 8 ;
else if ( type = = 5 )
range = 16 ;
else if ( type = = 6 )
range = 32 ;
else if ( type = = 7 )
range = 64 ;
2002-06-16 20:06:15 +00:00
for ( i = 0 ; i < 3 ; i + + ) {
token = COM_Parse ( & str ) ;
origin [ i ] = atof ( token ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
for ( i = 0 ; i < 3 ; i + + ) {
token = COM_Parse ( & str ) ;
origin2 [ i ] = atof ( token ) ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
token = COM_Parse ( & str ) ;
numparticles = atoi ( token ) ;
token = COM_Parse ( & str ) ;
turb = atoi ( token ) ;
token = COM_Parse ( & str ) ;
snum = atoi ( token ) ;
for ( i = 0 ; i < numparticles ; i + + ) {
2001-08-01 21:07:18 +00:00
if ( type > = 4 )
2002-06-16 20:06:15 +00:00
CG_ParticleBubble ( cgs . media . waterBubbleShader , origin , origin2 , turb , range , snum ) ;
2001-08-01 21:07:18 +00:00
else
2002-06-16 20:06:15 +00:00
CG_ParticleSnow ( cgs . media . waterBubbleShader , origin , origin2 , turb , range , snum ) ;
2001-08-01 21:07:18 +00:00
}
return ( 1 ) ;
}
2002-06-16 20:06:15 +00:00
void CG_SnowLink ( centity_t * cent , qboolean particleOn )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p , * next ;
2001-08-01 21:07:18 +00:00
int id ;
id = cent - > currentState . frame ;
2002-06-16 20:06:15 +00:00
for ( p = active_particles ; p ; p = next ) {
2001-08-01 21:07:18 +00:00
next = p - > next ;
2002-06-16 20:06:15 +00:00
if ( p - > type = = P_WEATHER | | p - > type = = P_WEATHER_TURBULENT ) {
if ( p - > snum = = id ) {
2001-08-01 21:07:18 +00:00
if ( particleOn )
p - > link = qtrue ;
else
p - > link = qfalse ;
}
}
}
}
2002-06-16 20:06:15 +00:00
void CG_ParticleImpactSmokePuff ( qhandle_t pshader , vec3_t origin )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p ;
2001-08-01 21:07:18 +00:00
if ( ! pshader )
2003-03-29 18:53:41 +00:00
CG_Printf ( " ^1CG_ParticleImpactSmokePuff pshader == ZERO! \n " ) ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
p - > alpha = 0.25 ;
p - > alphavel = 0 ;
2002-06-16 20:06:15 +00:00
p - > roll = crandom ( ) * 179 ;
2001-08-01 21:07:18 +00:00
p - > pshader = pshader ;
p - > endtime = cg . time + 1000 ;
p - > startfade = cg . time + 100 ;
2002-06-16 20:06:15 +00:00
p - > width = rand ( ) % 4 + 8 ;
p - > height = rand ( ) % 4 + 8 ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
p - > endheight = p - > height * 2 ;
2001-08-01 21:07:18 +00:00
p - > endwidth = p - > width * 2 ;
p - > endtime = cg . time + 500 ;
p - > type = P_SMOKE_IMPACT ;
2002-06-16 20:06:15 +00:00
VectorCopy ( origin , p - > org ) ;
2001-08-01 21:07:18 +00:00
VectorSet ( p - > vel , 0 , 0 , 20 ) ;
VectorSet ( p - > accel , 0 , 0 , 20 ) ;
p - > rotate = qtrue ;
}
2002-06-16 20:06:15 +00:00
void CG_Particle_Bleed ( qhandle_t pshader , vec3_t start , vec3_t dir , int fleshEntityNum , int duration )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p ;
2001-08-01 21:07:18 +00:00
if ( ! pshader )
2003-03-29 18:53:41 +00:00
CG_Printf ( " ^1CG_Particle_Bleed pshader == ZERO! \n " ) ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
p - > alpha = 1.0 ;
p - > alphavel = 0 ;
p - > roll = 0 ;
p - > pshader = pshader ;
p - > endtime = cg . time + duration ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
if ( fleshEntityNum )
p - > startfade = cg . time ;
else
p - > startfade = cg . time + 100 ;
p - > width = 4 ;
p - > height = 4 ;
2002-06-16 20:06:15 +00:00
p - > endheight = 4 + rand ( ) % 3 ;
2001-08-01 21:07:18 +00:00
p - > endwidth = p - > endheight ;
p - > type = P_SMOKE ;
2002-06-16 20:06:15 +00:00
VectorCopy ( start , p - > org ) ;
2001-08-01 21:07:18 +00:00
p - > vel [ 0 ] = 0 ;
p - > vel [ 1 ] = 0 ;
p - > vel [ 2 ] = - 20 ;
2002-06-16 20:06:15 +00:00
VectorClear ( p - > accel ) ;
2001-08-01 21:07:18 +00:00
p - > rotate = qfalse ;
2002-06-16 20:06:15 +00:00
p - > roll = rand ( ) % 179 ;
2001-08-01 21:07:18 +00:00
p - > color = BLOODRED ;
p - > alpha = 0.75 ;
}
2002-06-16 20:06:15 +00:00
void CG_Particle_OilParticle ( qhandle_t pshader , centity_t * cent )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
int time ;
int time2 ;
float ratio ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
float duration = 1500 ;
2001-08-01 21:07:18 +00:00
time = cg . time ;
time2 = cg . time + cent - > currentState . time ;
2002-06-16 20:06:15 +00:00
ratio = ( float ) 1 - ( ( float ) time / ( float ) time2 ) ;
2001-08-01 21:07:18 +00:00
if ( ! pshader )
2003-03-29 18:53:41 +00:00
CG_Printf ( " ^1CG_Particle_OilParticle == ZERO! \n " ) ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
p - > alpha = 1.0 ;
p - > alphavel = 0 ;
p - > roll = 0 ;
p - > pshader = pshader ;
p - > endtime = cg . time + duration ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > startfade = p - > endtime ;
p - > width = 1 ;
p - > height = 3 ;
p - > endheight = 3 ;
p - > endwidth = 1 ;
p - > type = P_SMOKE ;
2002-06-16 20:06:15 +00:00
VectorCopy ( cent - > currentState . origin , p - > org ) ;
2001-08-01 21:07:18 +00:00
p - > vel [ 0 ] = ( cent - > currentState . origin2 [ 0 ] * ( 16 * ratio ) ) ;
p - > vel [ 1 ] = ( cent - > currentState . origin2 [ 1 ] * ( 16 * ratio ) ) ;
p - > vel [ 2 ] = ( cent - > currentState . origin2 [ 2 ] ) ;
p - > snum = 1.0f ;
2002-06-16 20:06:15 +00:00
VectorClear ( p - > accel ) ;
2001-08-01 21:07:18 +00:00
p - > accel [ 2 ] = - 20 ;
p - > rotate = qfalse ;
2002-06-16 20:06:15 +00:00
p - > roll = rand ( ) % 179 ;
2001-08-01 21:07:18 +00:00
p - > alpha = 0.75 ;
}
2002-06-16 20:06:15 +00:00
void CG_Particle_OilSlick ( qhandle_t pshader , centity_t * cent )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p ;
if ( ! pshader )
2003-03-29 18:53:41 +00:00
CG_Printf ( " ^1CG_Particle_OilSlick == ZERO! \n " ) ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
if ( cent - > currentState . angles2 [ 2 ] )
p - > endtime = cg . time + cent - > currentState . angles2 [ 2 ] ;
else
p - > endtime = cg . time + 60000 ;
p - > startfade = p - > endtime ;
p - > alpha = 1.0 ;
p - > alphavel = 0 ;
p - > roll = 0 ;
p - > pshader = pshader ;
2002-06-16 20:06:15 +00:00
if ( cent - > currentState . angles2 [ 0 ] | | cent - > currentState . angles2 [ 1 ] ) {
2001-08-01 21:07:18 +00:00
p - > width = cent - > currentState . angles2 [ 0 ] ;
p - > height = cent - > currentState . angles2 [ 0 ] ;
p - > endheight = cent - > currentState . angles2 [ 1 ] ;
p - > endwidth = cent - > currentState . angles2 [ 1 ] ;
2002-06-16 20:06:15 +00:00
} else {
2001-08-01 21:07:18 +00:00
p - > width = 8 ;
p - > height = 8 ;
p - > endheight = 16 ;
p - > endwidth = 16 ;
}
p - > type = P_FLAT_SCALEUP ;
p - > snum = 1.0 ;
2002-06-16 20:06:15 +00:00
VectorCopy ( cent - > currentState . origin , p - > org ) ;
p - > org [ 2 ] + = 0.55 + ( crandom ( ) * 0.5 ) ;
2001-08-01 21:07:18 +00:00
p - > vel [ 0 ] = 0 ;
p - > vel [ 1 ] = 0 ;
p - > vel [ 2 ] = 0 ;
2002-06-16 20:06:15 +00:00
VectorClear ( p - > accel ) ;
2001-08-01 21:07:18 +00:00
p - > rotate = qfalse ;
2002-06-16 20:06:15 +00:00
p - > roll = rand ( ) % 179 ;
2001-08-01 21:07:18 +00:00
p - > alpha = 0.75 ;
}
2002-06-16 20:06:15 +00:00
void CG_OilSlickRemove ( centity_t * cent )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p , * next ;
int id ;
2001-08-01 21:07:18 +00:00
id = 1.0f ;
if ( ! id )
2003-03-29 18:53:41 +00:00
CG_Printf ( " ^1CG_OilSlickRevove NULL id \n " ) ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
for ( p = active_particles ; p ; p = next ) {
2001-08-01 21:07:18 +00:00
next = p - > next ;
2002-06-16 20:06:15 +00:00
if ( p - > type = = P_FLAT_SCALEUP ) {
if ( p - > snum = = id ) {
2001-08-01 21:07:18 +00:00
p - > endtime = cg . time + 100 ;
p - > startfade = p - > endtime ;
p - > type = P_FLAT_SCALEUP_FADE ;
}
}
}
}
2002-06-16 20:06:15 +00:00
qboolean ValidBloodPool ( vec3_t start )
2001-08-01 21:07:18 +00:00
{
# define EXTRUDE_DIST 0.5
2002-06-16 20:06:15 +00:00
vec3_t angles ;
vec3_t right , up ;
vec3_t this_pos , x_pos , center_pos , end_pos ;
2012-01-13 21:27:15 +00:00
int x , y ;
int fwidth , fheight ;
2002-06-16 20:06:15 +00:00
trace_t trace ;
vec3_t normal ;
2001-08-01 21:07:18 +00:00
fwidth = 16 ;
fheight = 16 ;
2002-06-16 20:06:15 +00:00
VectorSet ( normal , 0 , 0 , 1 ) ;
vectoangles ( normal , angles ) ;
AngleVectors ( angles , NULL , right , up ) ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
VectorMA ( start , EXTRUDE_DIST , normal , center_pos ) ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
for ( x = - fwidth / 2 ; x < fwidth ; x + = fwidth ) {
VectorMA ( center_pos , x , right , x_pos ) ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
for ( y = - fheight / 2 ; y < fheight ; y + = fheight ) {
VectorMA ( x_pos , y , up , this_pos ) ;
VectorMA ( this_pos , - EXTRUDE_DIST * 2 , normal , end_pos ) ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
CG_Trace ( & trace , this_pos , NULL , NULL , end_pos , - 1 , CONTENTS_SOLID ) ;
2001-08-01 21:07:18 +00:00
2012-01-13 17:11:54 +00:00
if ( trace . entityNum < ENTITYNUM_WORLD ) // may only land on world
2001-08-01 21:07:18 +00:00
return qfalse ;
if ( ! ( ! trace . startsolid & & trace . fraction < 1 ) )
return qfalse ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
}
}
return qtrue ;
}
2002-06-16 20:06:15 +00:00
void CG_BloodPool ( localEntity_t * le , qhandle_t pshader , trace_t * tr )
{
cparticle_t * p ;
qboolean legit ;
vec3_t start ;
float rndSize ;
2001-08-01 21:07:18 +00:00
if ( ! pshader )
2003-03-29 18:53:41 +00:00
CG_Printf ( " ^1CG_BloodPool pshader == ZERO! \n " ) ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
2002-06-16 20:06:15 +00:00
VectorCopy ( tr - > endpos , start ) ;
legit = ValidBloodPool ( start ) ;
if ( ! legit )
2001-08-01 21:07:18 +00:00
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > endtime = cg . time + 3000 ;
p - > startfade = p - > endtime ;
p - > alpha = 1.0 ;
p - > alphavel = 0 ;
p - > roll = 0 ;
p - > pshader = pshader ;
2002-06-16 20:06:15 +00:00
rndSize = 0.4 + random ( ) * 0.6 ;
p - > width = 8 * rndSize ;
p - > height = 8 * rndSize ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
p - > endheight = 16 * rndSize ;
p - > endwidth = 16 * rndSize ;
2001-08-01 21:07:18 +00:00
p - > type = P_FLAT_SCALEUP ;
2002-06-16 20:06:15 +00:00
VectorCopy ( start , p - > org ) ;
2001-08-01 21:07:18 +00:00
p - > vel [ 0 ] = 0 ;
p - > vel [ 1 ] = 0 ;
p - > vel [ 2 ] = 0 ;
2002-06-16 20:06:15 +00:00
VectorClear ( p - > accel ) ;
2001-08-01 21:07:18 +00:00
p - > rotate = qfalse ;
2002-06-16 20:06:15 +00:00
p - > roll = rand ( ) % 179 ;
2001-08-01 21:07:18 +00:00
p - > alpha = 0.75 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > color = BLOODRED ;
}
# define NORMALSIZE 16
# define LARGESIZE 32
2002-06-16 20:06:15 +00:00
void CG_ParticleBloodCloud ( centity_t * cent , vec3_t origin , vec3_t dir )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
float length ;
float dist ;
float crittersize ;
vec3_t angles , forward ;
vec3_t point ;
cparticle_t * p ;
int i ;
2001-08-01 21:07:18 +00:00
dist = 0 ;
2002-06-16 20:06:15 +00:00
length = VectorLength ( dir ) ;
vectoangles ( dir , angles ) ;
AngleVectors ( angles , forward , NULL , NULL ) ;
2001-08-01 21:07:18 +00:00
crittersize = LARGESIZE ;
if ( length )
dist = length / crittersize ;
if ( dist < 1 )
dist = 1 ;
2002-06-16 20:06:15 +00:00
VectorCopy ( origin , point ) ;
for ( i = 0 ; i < dist ; i + + ) {
VectorMA ( point , crittersize , forward , point ) ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
p - > alpha = 1.0 ;
p - > alphavel = 0 ;
p - > roll = 0 ;
p - > pshader = cgs . media . smokePuffShader ;
p - > endtime = cg . time + 350 + ( crandom ( ) * 100 ) ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > startfade = cg . time ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > width = LARGESIZE ;
p - > height = LARGESIZE ;
p - > endheight = LARGESIZE ;
p - > endwidth = LARGESIZE ;
p - > type = P_SMOKE ;
2002-06-16 20:06:15 +00:00
VectorCopy ( origin , p - > org ) ;
2001-08-01 21:07:18 +00:00
p - > vel [ 0 ] = 0 ;
p - > vel [ 1 ] = 0 ;
p - > vel [ 2 ] = - 1 ;
2002-06-16 20:06:15 +00:00
VectorClear ( p - > accel ) ;
2001-08-01 21:07:18 +00:00
p - > rotate = qfalse ;
2002-06-16 20:06:15 +00:00
p - > roll = rand ( ) % 179 ;
2001-08-01 21:07:18 +00:00
p - > color = BLOODRED ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > alpha = 0.75 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
}
}
2001-10-29 09:58:44 +00:00
// JBravo - there was "float scale" missing from the declaration here. Caused errors under linux.
2002-06-16 20:06:15 +00:00
void CG_ParticleSparks ( vec3_t org , vec3_t vel , int duration , float x , float y , float speed , float scale )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
2006-04-14 18:16:31 +00:00
2001-08-01 21:07:18 +00:00
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > endtime = cg . time + duration ;
2002-06-16 20:06:15 +00:00
p - > startfade = cg . time + duration / 2 ;
2001-08-01 21:07:18 +00:00
p - > color = EMISIVEFADE ;
p - > alpha = 0.4f ;
p - > alphavel = 0 ;
p - > height = 0.5 ;
p - > width = 0.5 ;
p - > endheight = 0.5 ;
p - > endwidth = 0.5 ;
p - > pshader = cgs . media . tracerShader ;
p - > type = P_SMOKE ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
VectorCopy ( org , p - > org ) ;
p - > org [ 0 ] + = ( crandom ( ) * x ) ;
p - > org [ 1 ] + = ( crandom ( ) * y ) ;
p - > vel [ 0 ] = vel [ 0 ] ;
p - > vel [ 1 ] = vel [ 1 ] ;
p - > vel [ 2 ] = vel [ 2 ] ;
p - > accel [ 0 ] = p - > accel [ 1 ] = p - > accel [ 2 ] = 0 ;
p - > vel [ 0 ] + = ( crandom ( ) * 4 ) ;
p - > vel [ 1 ] + = ( crandom ( ) * 4 ) ;
2002-06-16 20:06:15 +00:00
p - > vel [ 2 ] + = ( 20 + ( crandom ( ) * 10 ) ) * speed ;
p - > accel [ 0 ] = crandom ( ) * 4 ;
p - > accel [ 1 ] = crandom ( ) * 4 ;
2001-08-01 21:07:18 +00:00
}
2002-06-16 20:06:15 +00:00
void CG_ParticleDust ( centity_t * cent , vec3_t origin , vec3_t dir )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
float length ;
float dist ;
float crittersize ;
vec3_t angles , forward ;
vec3_t point ;
cparticle_t * p ;
int i ;
2001-08-01 21:07:18 +00:00
dist = 0 ;
2002-06-16 20:06:15 +00:00
VectorNegate ( dir , dir ) ;
length = VectorLength ( dir ) ;
vectoangles ( dir , angles ) ;
AngleVectors ( angles , forward , NULL , NULL ) ;
2001-08-01 21:07:18 +00:00
crittersize = LARGESIZE ;
if ( length )
dist = length / crittersize ;
if ( dist < 1 )
dist = 1 ;
2002-06-16 20:06:15 +00:00
VectorCopy ( origin , point ) ;
for ( i = 0 ; i < dist ; i + + ) {
VectorMA ( point , crittersize , forward , point ) ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
p - > alpha = 5.0 ;
p - > alphavel = 0 ;
p - > roll = 0 ;
p - > pshader = cgs . media . smokePuffShader ;
// RF, stay around for long enough to expand and dissipate naturally
if ( length )
p - > endtime = cg . time + 4500 + ( crandom ( ) * 3500 ) ;
else
p - > endtime = cg . time + 750 + ( crandom ( ) * 500 ) ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > startfade = cg . time ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
p - > width = LARGESIZE ;
p - > height = LARGESIZE ;
// RF, expand while falling
2002-06-16 20:06:15 +00:00
p - > endheight = LARGESIZE * 3.0 ;
p - > endwidth = LARGESIZE * 3.0 ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
if ( ! length ) {
2001-08-01 21:07:18 +00:00
p - > width * = 0.2f ;
p - > height * = 0.2f ;
p - > endheight = NORMALSIZE ;
p - > endwidth = NORMALSIZE ;
}
p - > type = P_SMOKE ;
2002-06-16 20:06:15 +00:00
VectorCopy ( point , p - > org ) ;
p - > vel [ 0 ] = crandom ( ) * 6 ;
p - > vel [ 1 ] = crandom ( ) * 6 ;
p - > vel [ 2 ] = random ( ) * 20 ;
2001-08-01 21:07:18 +00:00
// RF, add some gravity/randomness
2002-06-16 20:06:15 +00:00
p - > accel [ 0 ] = crandom ( ) * 3 ;
p - > accel [ 1 ] = crandom ( ) * 3 ;
p - > accel [ 2 ] = - PARTICLE_GRAVITY * 0.4 ;
2001-08-01 21:07:18 +00:00
2002-06-16 20:06:15 +00:00
VectorClear ( p - > accel ) ;
2001-08-01 21:07:18 +00:00
p - > rotate = qfalse ;
2002-06-16 20:06:15 +00:00
p - > roll = rand ( ) % 179 ;
2001-08-01 21:07:18 +00:00
p - > alpha = 0.75 ;
2002-06-16 20:06:15 +00:00
2001-08-01 21:07:18 +00:00
}
}
2002-06-16 20:06:15 +00:00
void CG_ParticleMisc ( qhandle_t pshader , vec3_t origin , int size , int duration , float alpha )
2001-08-01 21:07:18 +00:00
{
2002-06-16 20:06:15 +00:00
cparticle_t * p ;
2001-08-01 21:07:18 +00:00
if ( ! pshader )
2003-03-29 18:53:41 +00:00
CG_Printf ( " ^1CG_ParticleImpactSmokePuff pshader == ZERO! \n " ) ;
2001-08-01 21:07:18 +00:00
if ( ! free_particles )
return ;
p = free_particles ;
free_particles = p - > next ;
p - > next = active_particles ;
active_particles = p ;
p - > time = cg . time ;
p - > alpha = 1.0 ;
p - > alphavel = 0 ;
2002-06-16 20:06:15 +00:00
p - > roll = rand ( ) % 179 ;
2001-08-01 21:07:18 +00:00
p - > pshader = pshader ;
if ( duration > 0 )
p - > endtime = cg . time + duration ;
else
p - > endtime = duration ;
p - > startfade = cg . time ;
p - > width = size ;
p - > height = size ;
p - > endheight = size ;
p - > endwidth = size ;
p - > type = P_SPRITE ;
2002-06-16 20:06:15 +00:00
VectorCopy ( origin , p - > org ) ;
2001-08-01 21:07:18 +00:00
p - > rotate = qfalse ;
}