engine: client: rewrite R_RocketTrail for accuracy and fix potential uninitialized vectors

This commit is contained in:
Alibek Omarov 2024-11-05 17:43:00 +03:00
parent 2972d7c309
commit ec73f23e4a

View file

@ -1494,8 +1494,6 @@ R_RocketTrail
void GAME_EXPORT R_RocketTrail( vec3_t start, vec3_t end, int type ) void GAME_EXPORT R_RocketTrail( vec3_t start, vec3_t end, int type )
{ {
vec3_t vec, right, up; vec3_t vec, right, up;
static int tracercount;
float s, c, x, y;
float len, dec; float len, dec;
particle_t *p; particle_t *p;
@ -1504,15 +1502,18 @@ void GAME_EXPORT R_RocketTrail( vec3_t start, vec3_t end, int type )
if( type == 7 ) if( type == 7 )
{ {
dec = 1.0f;
VectorVectors( vec, right, up ); VectorVectors( vec, right, up );
} }
else if( type < 128 )
if( type < 128 )
{ {
dec = 3.0f; dec = 3.0f;
} }
else else
{ {
// initialize if type will be 7 here
VectorVectors( vec, right, up );
dec = 1.0f; dec = 1.0f;
type -= 128; type -= 128;
} }
@ -1521,67 +1522,65 @@ void GAME_EXPORT R_RocketTrail( vec3_t start, vec3_t end, int type )
while( len > 0 ) while( len > 0 )
{ {
len -= dec;
p = R_AllocParticle( NULL ); p = R_AllocParticle( NULL );
if( !p ) return; if( !p )
return;
len -= dec;
p->die = cl.time + 2.0f; p->die = cl.time + 2.0f;
switch( type ) switch( type )
{ {
case 0: // rocket trail case 0:
p->ramp = COM_RandomLong( 0, 3 ); case 1:
p->ramp = COM_RandomLong( 0 + type * 2, 3 + type * 2 );
p->color = ramp3[(int)p->ramp]; p->color = ramp3[(int)p->ramp];
p->type = pt_fire; p->type = pt_fire;
VectorAddScalar( start, COM_RandomFloat( -3.0f, 3.0f ), p->org ); VectorAddScalar( start, COM_RandomFloat( -3.0f, 3.0f ), p->org );
break; break;
case 1: // smoke smoke case 2:
p->ramp = COM_RandomLong( 2, 5 );
p->color = ramp3[(int)p->ramp];
p->type = pt_fire;
VectorAddScalar( start, COM_RandomFloat( -3.0f, 3.0f ), p->org );
break;
case 2: // blood
p->type = pt_grav;
p->color = COM_RandomLong( 67, 74 ); p->color = COM_RandomLong( 67, 74 );
p->type = pt_grav;
VectorAddScalar( start, COM_RandomFloat( -3.0f, 3.0f ), p->org ); VectorAddScalar( start, COM_RandomFloat( -3.0f, 3.0f ), p->org );
break; break;
case 3: case 3:
case 5: // tracer case 5:
{
static int tracercount;
p->die = cl.time + 0.5f; p->die = cl.time + 0.5f;
p->color = ( tracercount & 4 ) * 2;
if( type == 3 ) p->color = 52 + (( tracercount & 4 )<<1 ); if( type == 3 )
else p->color = 230 + (( tracercount & 4 )<<1 ); p->color += 52;
else
p->color += 230;
VectorCopy( start, p->org ); VectorCopy( start, p->org );
tracercount++; tracercount++;
if( FBitSet( tracercount, 1 ))
{
p->vel[0] = 30.0f * vec[1]; p->vel[0] = 30.0f * vec[1];
p->vel[1] = 30.0f * -vec[0];
}
else
{
p->vel[0] = 30.0f * -vec[1];
p->vel[1] = 30.0f * vec[0]; p->vel[1] = 30.0f * vec[0];
} p->vel[tracercount & 1] = -p->vel[tracercount & 1];
break; break;
case 4: // slight blood }
p->type = pt_grav; case 4:
p->color = COM_RandomLong( 67, 70 ); p->color = COM_RandomLong( 67, 70 );
p->type = pt_grav;
VectorAddScalar( start, COM_RandomFloat( -3.0f, 3.0f ), p->org ); VectorAddScalar( start, COM_RandomFloat( -3.0f, 3.0f ), p->org );
len -= 3.0f; len -= 3.0f;
break; break;
case 6: // voor trail case 6:
p->color = COM_RandomLong( 152, 155 ); p->type = pt_fire;
p->die += 0.3f; p->ramp = COM_RandomLong( 0, 3 );
VectorAddScalar( start, COM_RandomFloat( -8.0f, 8.0f ), p->org ); p->color = ramp3[(int)p->ramp];
VectorCopy( start, p->org );
break; break;
case 7: // explosion tracer case 7:
x = COM_RandomLong( 0, 65535 ); {
y = COM_RandomLong( 8, 16 ); float x = COM_RandomLong( 0, 65535 );
float y = COM_RandomLong( 8, 16 );
float s, c;
SinCos( x, &s, &c ); SinCos( x, &s, &c );
s *= y; s *= y;
c *= y; c *= y;
@ -1589,13 +1588,16 @@ void GAME_EXPORT R_RocketTrail( vec3_t start, vec3_t end, int type )
VectorMAMAM( 1.0f, start, s, right, c, up, p->org ); VectorMAMAM( 1.0f, start, s, right, c, up, p->org );
VectorSubtract( start, p->org, p->vel ); VectorSubtract( start, p->org, p->vel );
VectorScale( p->vel, 2.0f, p->vel ); VectorScale( p->vel, 2.0f, p->vel );
VectorMA( p->vel, COM_RandomFloat( 96.0f, 111.0f ), vec, p->vel );
x = COM_RandomFloat( 96.0f, 111.0f );
VectorMA( p->vel, x, vec, p->vel );
p->ramp = COM_RandomLong( 0, 3 ); p->ramp = COM_RandomLong( 0, 3 );
p->color = ramp3[(int)p->ramp]; p->color = ramp3[(int)p->ramp];
p->type = pt_explode2; p->type = pt_explode2;
break; break;
}
default: default:
// just build line to show error
VectorCopy( start, p->org ); VectorCopy( start, p->org );
break; break;
} }