Rewrite new quake stuff for correctness

- Quake scaling should be handled for each quake. The former
  implementation was potentially taking flags from one quake and applying
  them to another, which is broken.
- Remove all the int<->float conversions.
This commit is contained in:
Randy Heit 2015-02-20 19:36:13 -06:00
commit 2827c13d0c
3 changed files with 80 additions and 84 deletions

View file

@ -770,45 +770,9 @@ bool R_GetViewInterpolationStatus()
//
//==========================================================================
static fixed_t QuakePower(double factor, int intensity, quakeInfo quake)
static fixed_t QuakePower(fixed_t factor, fixed_t intensity)
{
double scaleDownStart = quake.scaleDownStart;
double scaleDown = quake.scaleDown;
if (intensity == 0)
{
return 0;
}
else
{
double ss = (double)((pr_torchflicker() % (intensity << 2)) - (intensity << 1));
double mtp = (quake.fullIntensity) ? 2.0 : 1.0;
if (quake.isScalingDown || quake.isScalingUp)
{
fixed_t result;
if (scaleDownStart == 0) scaleDownStart = 1;
if (quake.isScalingDown && quake.isScalingUp)
{
if (quake.preferMaximum)
result = FLOAT2FIXED((factor * ss) * MAX(((scaleDown*mtp) / scaleDownStart), ((scaleDownStart - scaleDown)*mtp) / scaleDownStart));
else
result = FLOAT2FIXED((factor * ss) * MIN(((scaleDown*mtp) / scaleDownStart), ((scaleDownStart - scaleDown)*mtp) / scaleDownStart));
}
else if (quake.isScalingDown)
result = FLOAT2FIXED((factor * ss) * (scaleDown / scaleDownStart));
else if (quake.isScalingUp)
result = FLOAT2FIXED((factor * ss) * ((scaleDownStart - scaleDown) / scaleDownStart));
else
result = FLOAT2FIXED(factor * ss);
return result;
}
else
{
return FLOAT2FIXED(factor * ss);
}
}
return FixedMul(factor, pr_torchflicker(intensity * 2) - intensity);
}
//==========================================================================
@ -921,38 +885,40 @@ void R_SetupFrame (AActor *actor)
if (!paused)
{
quakeInfo quake;
if (DEarthquake::StaticGetQuakeIntensities(camera, quake) > 0)
fixed_t intensityX, intensityY, intensityZ, relIntensityX, relIntensityY, relIntensityZ;
if (DEarthquake::StaticGetQuakeIntensities(camera,
intensityX, intensityY, intensityZ,
relIntensityX, relIntensityY, relIntensityZ) > 0)
{
double quakefactor = r_quakeintensity;
fixed_t quakefactor = FLOAT2FIXED(r_quakeintensity);
if (quake.relIntensityX != 0)
if (relIntensityX != 0)
{
int ang = (camera->angle) >> ANGLETOFINESHIFT;
fixed_t power = QuakePower(quakefactor, quake.relIntensityX, quake);
fixed_t power = QuakePower(quakefactor, relIntensityX);
viewx += FixedMul(finecosine[ang], power);
viewy += FixedMul(finesine[ang], power);
}
if (quake.relIntensityY != 0)
if (relIntensityY != 0)
{
int ang = (camera->angle + ANG90) >> ANGLETOFINESHIFT;
fixed_t power = QuakePower(quakefactor, quake.relIntensityY, quake);
fixed_t power = QuakePower(quakefactor, relIntensityY);
viewx += FixedMul(finecosine[ang], power);
viewy += FixedMul(finesine[ang], power);
}
if (quake.intensityX != 0)
if (intensityX != 0)
{
viewx += QuakePower(quakefactor, quake.intensityX, quake);
viewx += QuakePower(quakefactor, intensityX);
}
if (quake.intensityY != 0)
if (intensityY != 0)
{
viewy += QuakePower(quakefactor, quake.intensityY, quake);
viewy += QuakePower(quakefactor, intensityY);
}
// FIXME: Relative Z is not relative
quake.intensityZ = MAX(quake.intensityZ, quake.relIntensityZ);
if (quake.intensityZ != 0)
intensityZ = MAX(intensityZ, relIntensityZ);
if (intensityZ != 0)
{
viewz += QuakePower(quakefactor, quake.intensityZ, quake);
viewz += QuakePower(quakefactor, intensityZ);
}
}
}