diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index f0118104b0..87d385691f 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -2239,8 +2239,16 @@ Vector3d cEntity::GetLookVector(void) const // Set position void cEntity::SetPosition(const Vector3d & a_Position) { + // Clamp the positions to exactly representable single-precision floating point values + // This is necessary to avoid rounding errors in the noise generator and overflows in the chunk loader + const double MaxFloat = std::pow(2, std::numeric_limits().digits); + + const double ClampedPosX = Clamp(a_Position.x, -MaxFloat, MaxFloat); + const double ClampedPosY = Clamp(a_Position.y, -MaxFloat, MaxFloat); + const double ClampedPosZ = Clamp(a_Position.z, -MaxFloat, MaxFloat); + m_LastPosition = m_Position; - m_Position = a_Position; + m_Position = {ClampedPosX, ClampedPosY, ClampedPosZ}; }