Fix invalid Math::RoundUpToPowerOf2

#833
This commit is contained in:
Wojtek Figat
2022-11-24 20:20:36 +01:00
parent 5cc66d60dc
commit 63c4eb17e4
2 changed files with 33 additions and 16 deletions

View File

@@ -214,11 +214,8 @@ namespace Math
/// <returns>The power of 2.</returns>
static int32 RoundUpToPowerOf2(int32 value)
{
// Source:
// http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
if (value < 0)
return 0;
value++;
// Source: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
value--;
value |= value >> 1;
value |= value >> 2;
value |= value >> 4;
@@ -234,9 +231,8 @@ namespace Math
/// <returns>The power of 2.</returns>
static uint32 RoundUpToPowerOf2(uint32 value)
{
// Source:
// http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
value++;
// Source: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
value--;
value |= value >> 1;
value |= value >> 2;
value |= value >> 4;
@@ -252,11 +248,8 @@ namespace Math
/// <returns>The power of 2.</returns>
static int64 RoundUpToPowerOf2(int64 value)
{
// Source:
// http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
if (value < 0)
return 0;
value++;
// Source: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
value--;
value |= value >> 1;
value |= value >> 2;
value |= value >> 4;
@@ -273,9 +266,8 @@ namespace Math
/// <returns>The power of 2.</returns>
static uint64 RoundUpToPowerOf2(uint64 value)
{
// Source:
// http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
value++;
// Source: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
value--;
value |= value >> 1;
value |= value >> 2;
value |= value >> 4;

View File

@@ -15,6 +15,31 @@ static Quaternion RotationX(float angle)
return Quaternion(Math::Sin(halfAngle), 0.0f, 0.0f, Math::Cos(halfAngle));
}
TEST_CASE("Math")
{
SECTION("Test")
{
CHECK(Math::RoundUpToPowerOf2(0) == 0);
CHECK(Math::RoundUpToPowerOf2(1) == 1);
CHECK(Math::RoundUpToPowerOf2(2) == 2);
CHECK(Math::RoundUpToPowerOf2(3) == 4);
CHECK(Math::RoundUpToPowerOf2(4) == 4);
CHECK(Math::RoundUpToPowerOf2(5) == 8);
CHECK(Math::RoundUpToPowerOf2(6) == 8);
CHECK(Math::RoundUpToPowerOf2(7) == 8);
CHECK(Math::RoundUpToPowerOf2(8) == 8);
CHECK(Math::RoundUpToPowerOf2(9) == 16);
CHECK(Math::RoundUpToPowerOf2(10) == 16);
CHECK(Math::RoundUpToPowerOf2(11) == 16);
CHECK(Math::RoundUpToPowerOf2(12) == 16);
CHECK(Math::RoundUpToPowerOf2(13) == 16);
CHECK(Math::RoundUpToPowerOf2(14) == 16);
CHECK(Math::RoundUpToPowerOf2(15) == 16);
CHECK(Math::RoundUpToPowerOf2(16) == 16);
CHECK(Math::RoundUpToPowerOf2(17) == 32);
}
}
TEST_CASE("FloatR10G10B10A2")
{
SECTION("Test Conversion")