lerp in FastSin to fix shimmer in MusicWheel

This commit is contained in:
Chris Danford
2005-03-30 03:59:33 +00:00
parent 61a5f51344
commit 43948c2134
+25 -13
View File
@@ -544,25 +544,37 @@ float RageFastSin( float x )
}
}
int i = (int)SCALE( x, 0.0f, PI*2, 0, ARRAYSIZE(table)*2 );
i %= ARRAYSIZE(table) * 2;
float fIndex = SCALE( x, 0.0f, PI*2, 0, ARRAYSIZE(table)*2 );
// lerp using samples from the table
int iSampleIndex[2] = { (int)floorf(fIndex), iSampleIndex[0]+1 };
float fRemainder = fIndex - iSampleIndex[0];
for( int i=0; i<ARRAYSIZE(iSampleIndex); i++ )
iSampleIndex[i] %= ARRAYSIZE(table) * 2;
DEBUG_ASSERT( i>=0 && i<ARRAYSIZE(table)*2 );
DEBUG_ASSERT( fRemainder>=0 && fRemainder<=1 );
float fRet;
if( i >= int(ARRAYSIZE(table)) ) // PI <= i < 2*PI
float fValue[ARRAYSIZE(iSampleIndex)];
for( int i=0; i<ARRAYSIZE(iSampleIndex); i++ )
{
// sin(x) == -sin(2*PI-x)
i = ARRAYSIZE(table)*2 - 1 - i; // mirror about ARRAYSIZE(table)
DEBUG_ASSERT( i>=0 && i<ARRAYSIZE(table) );
fRet = -table[i];
}
else
{
fRet = table[i];
int &iSample = iSampleIndex[i];
float &fVal = fValue[i];
if( iSample >= int(ARRAYSIZE(table)) ) // PI <= iSample < 2*PI
{
// sin(x) == -sin(2*PI-x)
iSample = ARRAYSIZE(table)*2 - 1 - iSample; // mirror about ARRAYSIZE(table)
DEBUG_ASSERT( iSample>=0 && iSample<ARRAYSIZE(table) );
fVal = -table[iSample];
}
else
{
fVal = table[iSample];
}
}
return fRet;
return SCALE( fRemainder, 0.0f, 1.0f, fValue[0], fValue[1] );
}
float RageFastCos( float x )