diff --git a/Source/Engine/Level/Level.cpp b/Source/Engine/Level/Level.cpp index 0e35e9dac..983b814e1 100644 --- a/Source/Engine/Level/Level.cpp +++ b/Source/Engine/Level/Level.cpp @@ -50,6 +50,9 @@ void LargeWorlds::UpdateOrigin(Vector3& origin, const Vector3& position) { if (Enable) { + constexpr Real chunkSizeInv = 1.0 / ChunkSize; + constexpr Real chunkSizeHalf = ChunkSize * 0.5; + origin = Vector3(Int3((position - chunkSizeHalf) * chunkSizeInv)) * ChunkSize; } } diff --git a/Source/Engine/Tests/TestLevel.cpp b/Source/Engine/Tests/TestLevel.cpp new file mode 100644 index 000000000..830868a1d --- /dev/null +++ b/Source/Engine/Tests/TestLevel.cpp @@ -0,0 +1,18 @@ +// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved. + +#include "Engine/Core/Math/Vector3.h" +#include "Engine/Level/LargeWorlds.h" +#include + +TEST_CASE("LargeWorlds") +{ + SECTION("UpdateOrigin") + { + LargeWorlds::Enable = true; + Vector3 origin = Vector3::Zero; + LargeWorlds::UpdateOrigin(origin, Vector3::Zero); + CHECK(origin == Vector3::Zero); + LargeWorlds::UpdateOrigin(origin, Vector3(LargeWorlds::ChunkSize * 0.5, LargeWorlds::ChunkSize * 1.0001, LargeWorlds::ChunkSize * 1.5)); + CHECK(origin == Vector3(0, 0, LargeWorlds::ChunkSize * 1)); + } +}