/
redgpu
/
ezEngine
Обзор
Документация
Войти
/
redgpu
/
ezEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
Code/UnitTests/FoundationTest/SimdMath/SimdBBoxSphereTest.cpp
184 строки
6 KB
Jan Krassnigg
Make* functions for Simd Box + Sphere (#1025)
07 авг 2023, 14:56
Не верифицирован
07 авг 2023, 14:56
d6d5cc9
Код
Авторство
О чём код?
#include <FoundationTest/FoundationTestPCH.h> #include <Foundation/Math/BoundingBoxSphere.h> #include <Foundation/Math/Random.h> #include <Foundation/Math/Transform.h> #include <Foundation/SimdMath/SimdBBoxSphere.h> #include <Foundation/SimdMath/SimdConversion.h> EZ_CREATE_SIMPLE_TEST(SimdMath, SimdBBoxSphere) { EZ_TEST_BLOCK(ezTestBlock::Enabled, "Make Functions") { ezSimdBBoxSphere b = ezSimdBBoxSphere::MakeFromCenterExtents(ezSimdVec4f(-1, -2, -3), ezSimdVec4f(1, 2, 3), 2); EZ_TEST_BOOL((b.m_CenterAndRadius == ezSimdVec4f(-1, -2, -3, 2)).AllSet<4>()); EZ_TEST_BOOL((b.m_BoxHalfExtents == ezSimdVec4f(1, 2, 3)).AllSet<3>()); ezSimdBBox box(ezSimdVec4f(1, 1, 1), ezSimdVec4f(3, 3, 3)); ezSimdBSphere sphere(ezSimdVec4f(2, 2, 2), 1); b = ezSimdBBoxSphere::MakeFromBoxAndSphere(box, sphere); EZ_TEST_BOOL((b.m_CenterAndRadius == ezSimdVec4f(2, 2, 2, 1)).AllSet<4>()); EZ_TEST_BOOL((b.m_BoxHalfExtents == ezSimdVec4f(1, 1, 1)).AllSet<3>()); EZ_TEST_BOOL(b.GetBox() == box); EZ_TEST_BOOL(b.GetSphere() == sphere); b = ezSimdBBoxSphere::MakeFromBox(box); EZ_TEST_BOOL(b.m_CenterAndRadius.IsEqual(ezSimdVec4f(2, 2, 2, ezMath::Sqrt(3.0f)), 0.00001f).AllSet<4>()); EZ_TEST_BOOL((b.m_BoxHalfExtents == ezSimdVec4f(1, 1, 1)).AllSet<3>()); EZ_TEST_BOOL(b.GetBox() == box); b = ezSimdBBoxSphere::MakeFromSphere(sphere); EZ_TEST_BOOL((b.m_CenterAndRadius == ezSimdVec4f(2, 2, 2, 1)).AllSet<4>()); EZ_TEST_BOOL((b.m_BoxHalfExtents == ezSimdVec4f(1, 1, 1)).AllSet<3>()); EZ_TEST_BOOL(b.GetSphere() == sphere); } EZ_TEST_BLOCK(ezTestBlock::Enabled, "MakeInvalid") { ezSimdBBoxSphere b = ezSimdBBoxSphere::MakeInvalid(); EZ_TEST_BOOL(!b.IsValid()); } EZ_TEST_BLOCK(ezTestBlock::Enabled, "IsNaN") { if (ezMath::SupportsNaN<float>()) { ezSimdBBoxSphere b = ezSimdBBoxSphere::MakeInvalid(); b = ezSimdBBoxSphere::MakeInvalid(); EZ_TEST_BOOL(!b.IsNaN()); b = ezSimdBBoxSphere::MakeInvalid(); b.m_CenterAndRadius.SetX(ezMath::NaN<float>()); EZ_TEST_BOOL(b.IsNaN()); b = ezSimdBBoxSphere::MakeInvalid(); b.m_CenterAndRadius.SetY(ezMath::NaN<float>()); EZ_TEST_BOOL(b.IsNaN()); b = ezSimdBBoxSphere::MakeInvalid(); b.m_CenterAndRadius.SetZ(ezMath::NaN<float>()); EZ_TEST_BOOL(b.IsNaN()); b = ezSimdBBoxSphere::MakeInvalid(); b.m_CenterAndRadius.SetW(ezMath::NaN<float>()); EZ_TEST_BOOL(b.IsNaN()); b = ezSimdBBoxSphere::MakeInvalid(); b.m_BoxHalfExtents.SetX(ezMath::NaN<float>()); EZ_TEST_BOOL(b.IsNaN()); b = ezSimdBBoxSphere::MakeInvalid(); b.m_BoxHalfExtents.SetY(ezMath::NaN<float>()); EZ_TEST_BOOL(b.IsNaN()); b = ezSimdBBoxSphere::MakeInvalid(); b.m_BoxHalfExtents.SetZ(ezMath::NaN<float>()); EZ_TEST_BOOL(b.IsNaN()); } } EZ_TEST_BLOCK(ezTestBlock::Enabled, "SetFromPoints") { ezSimdVec4f p[6] = { ezSimdVec4f(-4, 0, 0), ezSimdVec4f(5, 0, 0), ezSimdVec4f(0, -6, 0), ezSimdVec4f(0, 7, 0), ezSimdVec4f(0, 0, -8), ezSimdVec4f(0, 0, 9), }; const ezSimdBBoxSphere b = ezSimdBBoxSphere::MakeFromPoints(p, 6); EZ_TEST_BOOL((b.m_CenterAndRadius == ezSimdVec4f(0.5, 0.5, 0.5)).AllSet<3>()); EZ_TEST_BOOL((b.m_BoxHalfExtents == ezSimdVec4f(4.5, 6.5, 8.5)).AllSet<3>()); EZ_TEST_BOOL(b.m_CenterAndRadius.w().IsEqual(ezSimdVec4f(0.5, 0.5, 8.5).GetLength<3>(), 0.00001f)); EZ_TEST_BOOL(b.m_CenterAndRadius.w() <= b.m_BoxHalfExtents.GetLength<3>()); } EZ_TEST_BLOCK(ezTestBlock::Enabled, "ExpandToInclude") { ezSimdBBoxSphere b1 = ezSimdBBoxSphere::MakeInvalid(); ezSimdBBoxSphere b2(ezSimdBBox(ezSimdVec4f(2, 2, 2), ezSimdVec4f(4, 4, 4))); b1.ExpandToInclude(b2); EZ_TEST_BOOL(b1 == b2); ezSimdBSphere sphere(ezSimdVec4f(2, 2, 2), 2); b2 = ezSimdBBoxSphere(sphere); b1.ExpandToInclude(b2); EZ_TEST_BOOL(b1 != b2); EZ_TEST_BOOL((b1.m_CenterAndRadius == ezSimdVec4f(2, 2, 2)).AllSet<3>()); EZ_TEST_BOOL((b1.m_BoxHalfExtents == ezSimdVec4f(2, 2, 2)).AllSet<3>()); EZ_TEST_FLOAT(b1.m_CenterAndRadius.w(), ezMath::Sqrt(3.0f) * 2.0f, 0.00001f); EZ_TEST_BOOL(b1.m_CenterAndRadius.w() <= b1.m_BoxHalfExtents.GetLength<3>()); b1 = ezSimdBBoxSphere::MakeInvalid(); b2 = ezSimdBBox(ezSimdVec4f(0.25, 0.25, 0.25), ezSimdVec4f(0.5, 0.5, 0.5)); b1.ExpandToInclude(b2); EZ_TEST_BOOL(b1 == b2); } EZ_TEST_BLOCK(ezTestBlock::Enabled, "Transform") { ezSimdBBoxSphere b = ezSimdBBoxSphere::MakeFromCenterExtents(ezSimdVec4f(1), ezSimdVec4f(5), 5); ezSimdTransform t(ezSimdVec4f(1, 1, 1), ezSimdQuat::MakeIdentity(), ezSimdVec4f(2, 3, -2)); b.Transform(t); EZ_TEST_BOOL((b.m_CenterAndRadius == ezSimdVec4f(3, 4, -1, 15)).AllSet<4>()); EZ_TEST_BOOL((b.m_BoxHalfExtents == ezSimdVec4f(10, 15, 10)).AllSet<3>()); // verification ezRandom rnd; rnd.Initialize(0x736454); ezDynamicArray<ezSimdVec4f, ezAlignedAllocatorWrapper> points; points.SetCountUninitialized(10); float fSize = 10; for (ezUInt32 i = 0; i < points.GetCount(); ++i) { float x = (float)rnd.DoubleMinMax(-fSize, fSize); float y = (float)rnd.DoubleMinMax(-fSize, fSize); float z = (float)rnd.DoubleMinMax(-fSize, fSize); points[i] = ezSimdVec4f(x, y, z); } b = ezSimdBBoxSphere::MakeFromPoints(points.GetData(), points.GetCount()); t.m_Rotation = ezSimdQuat::MakeFromAxisAndAngle(ezSimdVec4f(0, 0, 1), ezAngle::MakeFromDegree(-30)); b.Transform(t); for (ezUInt32 i = 0; i < points.GetCount(); ++i) { ezSimdVec4f tp = t.TransformPosition(points[i]); ezSimdFloat boxDist = b.GetBox().GetDistanceTo(tp); EZ_TEST_BOOL(boxDist < ezMath::DefaultEpsilon<float>()); ezSimdFloat sphereDist = b.GetSphere().GetDistanceTo(tp); EZ_TEST_BOOL(sphereDist < ezMath::DefaultEpsilon<float>()); } } EZ_TEST_BLOCK(ezTestBlock::Enabled, "Comparison") { ezSimdBBoxSphere b1(ezSimdBBox(ezSimdVec4f(5, 0, 0), ezSimdVec4f(1, 2, 3))); ezSimdBBoxSphere b2(ezSimdBBox(ezSimdVec4f(6, 0, 0), ezSimdVec4f(1, 2, 3))); EZ_TEST_BOOL(b1 == ezSimdBBoxSphere(ezSimdBBox(ezSimdVec4f(5, 0, 0), ezSimdVec4f(1, 2, 3)))); EZ_TEST_BOOL(b1 != b2); } }