Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ==============
- BG_SplatterPattern
- For the shotgun, frag nade, acidtubes, flamer, etc...
- ==============
- */
- void BG_SplatterPattern( vec3_t origin2, int seed, int passEntNum,
- splatterData_t *data, void (*func)( splatterData_t *data ),
- void (*trace)( trace_t *, const vec3_t,
- const vec3_t, const vec3_t,
- const vec3_t, int, int ) ) {
- int i;
- const int modeIndex = data->weaponMode - 1;
- weapon_t weapon = data->weapon;
- const int splatterNumber = BG_Weapon( weapon )->splatter[modeIndex].number;
- const float spread = BG_Weapon( weapon )->splatter[modeIndex].spread;
- const float range = BG_Weapon( weapon )->splatter[modeIndex].range;
- vec3_t origin, forward, rotationDir, dir, end;
- const vec3_t upAbsolute = { 0.0f, 0.0f, 1.0f };
- float rotationAngle, rotationDirLength, dot;
- trace_t tr;
- Com_Assert( modeIndex >= 0 &&
- modeIndex < 3 &&
- "BG_SplatterPattern: invalid weaponMode" );
- Com_Assert( trace &&
- "BG_SplatterPattern: trace is NULL" );
- Com_Assert( func &&
- "BG_Weapon( weapon )->splatter[modeIndex].spread: func is NULL" );
- Com_Assert( spread >= 0 &&
- spread <= 180 &&
- "BG_SplatterPattern: spread is out of range" );
- VectorCopy( data->origin, origin );
- VectorCopy( origin2, forward );
- CrossProduct( forward, upAbsolute, rotationDir );
- rotationDirLength = VectorLength( rotationDir );
- dot = DotProduct( upAbsolute, forward );
- if( rotationDirLength > 0 ) {
- VectorNormalize( rotationDir );
- rotationAngle = RAD2DEG( acos( dot ) );
- } else if( dot > 0.0f ) {
- rotationAngle = 0;
- } else {
- rotationAngle = 180;
- }
- // generate the "random" spread pattern
- for( i = 0; i < splatterNumber; i++ ) {
- vec3_t splatterAngles,temp;
- //find the splatter angles
- splatterAngles[PITCH] = Q_random( &seed ) * spread;
- AngleNormalize180( splatterAngles[PITCH] );
- splatterAngles[YAW] = Q_random( &seed ) * 360;
- AngleNormalize360( splatterAngles[YAW] );
- splatterAngles[ROLL] = 0;
- //get the new dir vector
- AngleVectors( splatterAngles, temp, NULL, NULL );
- VectorNormalize( temp );
- if( rotationDirLength > 0 ) {
- RotatePointAroundVector( dir, rotationDir, temp, rotationAngle );
- } else if( dot > 0.0f ){
- VectorCopy( temp, dir );
- } else {
- VectorScale( temp, -1.0f, dir );
- }
- VectorMA( origin, range, dir, end );
- trace( &tr, origin, NULL, NULL, end, passEntNum, MASK_SHOT );
- data->tr = &tr;
- func( data );
- }
- }
Add Comment
Please, Sign In to add comment