add fast inverse sqrt method
This commit is contained in:
parent
70acec6b0f
commit
d008ce4875
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Blarg.GameFramework
|
namespace Blarg.GameFramework
|
||||||
{
|
{
|
||||||
|
@ -198,6 +199,24 @@ namespace Blarg.GameFramework
|
||||||
return degrees * MathConstants.PiOver180;
|
return degrees * MathConstants.PiOver180;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A fast method for calculating the inverse square root of a nunmber.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The inverse square root of the given number.</returns>
|
||||||
|
/// <param name="x">The value to get the inverse square root of.</param>
|
||||||
|
/// <remarks>Copy of the famous method from the Quake 3 source.</remarks>
|
||||||
|
public static float FastInverseSqrt(float x)
|
||||||
|
{
|
||||||
|
FloatIntUnion convert;
|
||||||
|
convert.i = 0;
|
||||||
|
convert.x = x;
|
||||||
|
float xhalf = 0.5f * x;
|
||||||
|
convert.i = 0x5f3759df - (convert.i >> 1);
|
||||||
|
x = convert.x;
|
||||||
|
x = x * (1.5f - xhalf * x * x);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks two floats for equality using a defined "tolerance" to account
|
/// Checks two floats for equality using a defined "tolerance" to account
|
||||||
/// for floating point rounding errors, etc.
|
/// for floating point rounding errors, etc.
|
||||||
|
@ -311,5 +330,16 @@ namespace Blarg.GameFramework
|
||||||
float n = Clamp(t, 0.0f, 1.0f);
|
float n = Clamp(t, 0.0f, 1.0f);
|
||||||
return Lerp(low, high, (n * n) * (3.0f - (2.0f * n)));
|
return Lerp(low, high, (n * n) * (3.0f - (2.0f * n)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this is to allow access to raw float bits
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public struct FloatIntUnion
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public float x;
|
||||||
|
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public int i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue