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")