diff --git a/Source/Engine/Core/Math/Math.h b/Source/Engine/Core/Math/Math.h index 784afa1b2..c0bc52dcb 100644 --- a/Source/Engine/Core/Math/Math.h +++ b/Source/Engine/Core/Math/Math.h @@ -214,11 +214,8 @@ namespace Math /// The power of 2. 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 /// The power of 2. 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 /// The power of 2. 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 /// The power of 2. 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; diff --git a/Source/Engine/Tests/TestMath.cpp b/Source/Engine/Tests/TestMath.cpp index cd7e5e41d..82724064f 100644 --- a/Source/Engine/Tests/TestMath.cpp +++ b/Source/Engine/Tests/TestMath.cpp @@ -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")