151 lines
4.7 KiB
C++
151 lines
4.7 KiB
C++
//Phaser
|
|
|
|
#include "cg_local.h"
|
|
#include "FX_Public.h"
|
|
|
|
/*
|
|
-------------------------
|
|
FX_PhaserFire
|
|
-------------------------
|
|
*/
|
|
|
|
void FX_PhaserFire( vec3_t start, vec3_t end, vec3_t normal, qboolean spark, qboolean impact, qboolean weak )
|
|
{
|
|
FXTrail *particle;
|
|
vec3_t dir, org;
|
|
vec3_t rgb = { 1,0.9f,0.6f}, rgb2={1,0.3f,0};
|
|
float scale = 2.4f + ( crandom() * 0.6f ),len;
|
|
int sparks;
|
|
|
|
// Phaser beam
|
|
if ( weak )
|
|
FX_AddLine( start, end, 20.0f, scale, 0.0f, 0.4f, 0.4f, 1, cgs.media.phaserFireShader, FXF_ADJUST_ST );
|
|
else
|
|
FX_AddLine( start, end, 20.0f, scale, 0.0f, 1.0f, 1.0f, 1, cgs.media.phaserFireShader, FXF_ADJUST_ST );
|
|
|
|
// Per frame impact mark
|
|
FX_AddQuad( end, normal, NULL, NULL, random() * 1.5f + 1.75f, 0.0f, 0.5f, 0.5f, 0.0f, 0, 0, 1, cgs.media.sparkShader );
|
|
FX_AddQuad( end, normal, NULL, NULL, random() * 1.5 + 1.7f, 0.0f, 1.0f, 1.0f, random()*360.0f, 0, 0, 1, cgs.media.yellowParticleShader );
|
|
|
|
// Multi frame impacts--never do this when it hits a player because it will just look stupid
|
|
if ( impact )
|
|
{
|
|
if ( !weak )
|
|
FX_AddQuad( end, normal, NULL, NULL, random() * 1.25 + 1.5f, 2.0f, 1.0f, 0.0f, rgb, rgb2,random() * 360.0f, 2, 0, 500 + random() * 200,
|
|
cgs.media.sunnyFlareShader );
|
|
|
|
CG_ImpactMark( cgs.media.scavMarkShader, end, normal, random()*360, 1,1,1,0.2f, qfalse,
|
|
random() + 1, qfalse );
|
|
}
|
|
|
|
if ( weak )
|
|
return;
|
|
|
|
// "Fun" sparks
|
|
if ( spark )
|
|
{
|
|
sparks = rand() & 1 + 1;
|
|
for( int i = 0; i < sparks; i++ )
|
|
{
|
|
scale = 0.2f + (random() * 0.4);
|
|
particle = FX_AddTrail( end, NULL, NULL, 5.0f, -15.0f,
|
|
scale, -scale, 1.0f, 0.5f, 0.4f, 500.0f, cgs.media.sparkShader, rand() & FXF_BOUNCE );
|
|
|
|
if ( particle == NULL )
|
|
return;
|
|
|
|
FXE_Spray( normal, 200, 75, 0.8f, 1024, (FXPrimitive *) particle );
|
|
}
|
|
}
|
|
|
|
// Beam pulsing -- Is this really adding anything useful??
|
|
VectorSubtract( end, start, dir );
|
|
len = VectorNormalize( dir );
|
|
|
|
for (int t = 0; t < 6; t++ )
|
|
{
|
|
scale = random();
|
|
|
|
VectorMA( start, len * scale, dir, org );
|
|
FX_AddSprite( org, NULL, NULL, random() + 5.3, 0.0, 0.25, 0.25, 0.0, 0.0, 1, cgs.media.yellowParticleShader );
|
|
}
|
|
}
|
|
|
|
/*
|
|
-------------------------
|
|
FX_PhaserAltFire
|
|
-------------------------
|
|
*/
|
|
|
|
void FX_PhaserAltFire( vec3_t start, vec3_t end, vec3_t normal, qboolean spark, qboolean impact )
|
|
{
|
|
float scale = 1.5f + ( crandom() * 0.5f ), scale2, len;
|
|
vec3_t rgb = { 1,0.9f,0.6f}, rgb2={1,0.3f,0};
|
|
vec3_t org, dir;
|
|
int sparks;
|
|
FXTrail *particle;
|
|
FXLine2 *fx;
|
|
|
|
VectorSubtract( end, start, dir );
|
|
len = VectorNormalize( dir );
|
|
|
|
if ( len < 160 )
|
|
{
|
|
scale2 = (len / 160) * scale * 3.5f + scale;
|
|
|
|
// Draw just the flared beam
|
|
fx = FX_AddLine2( start, end, 1.0f, scale, 0.0f, scale2 * 1.25f, 0.0f, 1.0f, 0.9f, 1, cgs.media.whiteLaserShader );
|
|
FX_AddLine2( start, end, 1.0f, scale * 0.6f, 0.0f, scale2, 0.0f, 0.8f, 0.8f, 1, cgs.media.phaserShader );
|
|
}
|
|
else
|
|
{
|
|
scale2 = scale * 4.5f;
|
|
|
|
VectorMA( start, 160, dir, org );
|
|
|
|
// Draw flared bit
|
|
fx = FX_AddLine2( start, org, 1.0f, scale, 0.0f, scale2 * 1.25f, 0.0f, 1.0f, 0.9f, 1, cgs.media.whiteLaserShader );
|
|
FX_AddLine2( start, org, 1.0f, scale * 0.6f, 0.0f, scale2, 0.0f, 0.8f, 0.8f, 1, cgs.media.phaserShader );
|
|
|
|
// Now draw the rest
|
|
FX_AddLine( org, end, 1.0f, scale2 * 1.25f, 0.0f, 1.0f, 0.9f, rgb2, rgb2, 1, cgs.media.whiteLaserShader );
|
|
FX_AddLine( org, end, 1.0f, scale2, 0.0f, 0.8f, 0.8f, 1, cgs.media.phaserShader );
|
|
}
|
|
|
|
if ( fx )
|
|
{
|
|
fx->SetStartRGB( rgb2 );
|
|
fx->SetEndRGB( rgb2 );
|
|
}
|
|
|
|
FX_AddLine( start, end, 1.0f, scale * 0.4f, 0.0f, 0.6f, 0.6f, 1, cgs.media.whiteLaserShader );
|
|
|
|
// Per frame impact mark
|
|
FX_AddQuad( end, normal, NULL, NULL, random() * 3.0 + scale2 * 2.5f, 0.0f, 1.0f, 1.0f, random() * 360.0f, 2, 0, 1, cgs.media.sunnyFlareShader );
|
|
FX_AddQuad( end, normal, NULL, NULL, random() * 4 + scale2 * 3.0f, 0.0f, 1.0f, 1.0f, random()*360.0f, 0, 0, 1, cgs.media.yellowParticleShader );
|
|
|
|
// Multi frame impacts--never do this when it hits a player because it will just look stupid
|
|
if ( impact )
|
|
{
|
|
FX_AddQuad( end, normal, NULL, NULL, random() * 3.0 + scale2 * 2, 2.0f, 1.0f, 0.0f, rgb, rgb2,random() * 360.0f, 2, 0, 800 + random() * 200,
|
|
cgs.media.sunnyFlareShader );
|
|
|
|
CG_ImpactMark( cgs.media.scavMarkShader, end, normal, random()*360, 1,1,1,0.2f, qfalse,
|
|
random() + scale2, qfalse );
|
|
}
|
|
|
|
sparks = rand() & 3 + 3;
|
|
|
|
for( int i = 0; i < sparks; i++ )
|
|
{
|
|
scale = 0.2f + (random() * 0.4);
|
|
particle = FX_AddTrail( end, NULL, NULL, 5.0f, -15.0f,
|
|
scale, -scale, 0.6f, 0.0f, 0.0f, 500.0f, cgs.media.orangeParticleShader );
|
|
|
|
if ( particle == NULL )
|
|
return;
|
|
|
|
FXE_Spray( normal, 200, 75, 0.8f, 128, (FXPrimitive *) particle );
|
|
}
|
|
}
|