From cd452b0397ceb36e6787276b6af377333800c3c6 Mon Sep 17 00:00:00 2001 From: Orange Date: Mon, 17 Mar 2025 09:14:42 +0300 Subject: [PATCH] updated comment --- CMakeLists.txt | 2 +- include/omath/engines/iw_engine/Formulas.hpp | 4 +- .../omath/engines/source_engine/Formulas.hpp | 3 +- tests/CMakeLists.txt | 1 + tests/engines/UnitTestIwEngine.cpp | 66 +++++++++++++++++++ 5 files changed, 72 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dab8ddf..b2bf452 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ project(omath VERSION 1.0.1 LANGUAGES CXX) include(CMakePackageConfigHelpers) -option(OMATH_BUILD_TESTS "Build unit tests" ON) +option(OMATH_BUILD_TESTS "Build unit tests" OFF) option(OMATH_THREAT_WARNING_AS_ERROR "Set highest level of warnings and force compiler to treat them as errors" ON) option(OMATH_BUILD_AS_SHARED_LIBRARY "Build Omath as .so or .dll" OFF) option(OMATH_USE_AVX2 "Omath will use AVX2 to boost performance" ON) diff --git a/include/omath/engines/iw_engine/Formulas.hpp b/include/omath/engines/iw_engine/Formulas.hpp index 3af95c7..c98e727 100644 --- a/include/omath/engines/iw_engine/Formulas.hpp +++ b/include/omath/engines/iw_engine/Formulas.hpp @@ -41,7 +41,9 @@ namespace omath::iw_engine inline Mat4x4 CalcPerspectiveProjectionMatrix(const float fieldOfView, const float aspectRatio, const float near, const float far) { - const float fovHalfTan = std::tan(angles::DegreesToRadians(fieldOfView) / 2.f) * 0.75f; + // NOTE: Need magic number to fix fov calculation, since source inherit Quake proj matrix calculation + constexpr auto kMultiplyFactor = 0.75f; + const float fovHalfTan = std::tan(angles::DegreesToRadians(fieldOfView) / 2.f) * kMultiplyFactor; return { diff --git a/include/omath/engines/source_engine/Formulas.hpp b/include/omath/engines/source_engine/Formulas.hpp index 9e27298..549d16a 100644 --- a/include/omath/engines/source_engine/Formulas.hpp +++ b/include/omath/engines/source_engine/Formulas.hpp @@ -40,8 +40,7 @@ namespace omath::source_engine inline Mat4x4 CalcPerspectiveProjectionMatrix(const float fieldOfView, const float aspectRatio, const float near, const float far) { - // NOTE: Needed tp make thing draw normal, since source is wierd - // and use tricky projection matrix formula. + // NOTE: Need magic number to fix fov calculation, since source inherit Quake proj matrix calculation constexpr auto kMultiplyFactor = 0.75f; const float fovHalfTan = std::tan(angles::DegreesToRadians(fieldOfView) / 2.f) * kMultiplyFactor; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 55b9d83..bc043bd 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -22,6 +22,7 @@ add_executable(unit-tests engines/UnitTestOpenGL.cpp engines/UnitTestUnityEngine.cpp engines/UnitTestSourceEngine.cpp + engines/UnitTestIwEngine.cpp ) diff --git a/tests/engines/UnitTestIwEngine.cpp b/tests/engines/UnitTestIwEngine.cpp index 9df832c..00bdc40 100644 --- a/tests/engines/UnitTestIwEngine.cpp +++ b/tests/engines/UnitTestIwEngine.cpp @@ -1,3 +1,69 @@ // // Created by Vlad on 3/17/2025. // +#include +#include +#include +#include + + +TEST(UnitTestEwEngine, ForwardVector) +{ + const auto forward = omath::source_engine::ForwardVector({}); + + EXPECT_EQ(forward, omath::source_engine::kAbsForward); +} + +TEST(UnitTestEwEngine, RightVector) +{ + const auto right = omath::source_engine::RightVector({}); + + EXPECT_EQ(right, omath::source_engine::kAbsRight); +} + +TEST(UnitTestEwEngine, UpVector) +{ + const auto up = omath::source_engine::UpVector({}); + EXPECT_EQ(up, omath::source_engine::kAbsUp); +} + +TEST(UnitTestEwEngine, ProjectTargetMovedFromCamera) +{ + constexpr auto fov = omath::projection::FieldOfView::FromDegrees(90.f); + const auto cam = omath::source_engine::Camera({0, 0, 0}, {}, {1920.f, 1080.f}, fov, 0.01f, 1000.f); + + + for (float distance = 0.02f; distance < 1000.f; distance += 0.01f) + { + const auto projected = cam.WorldToScreen({distance, 0, 0}); + + EXPECT_TRUE(projected.has_value()); + + if (!projected.has_value()) + continue; + + EXPECT_NEAR(projected->x, 960, 0.00001f); + EXPECT_NEAR(projected->y, 540, 0.00001f); + } +} + +TEST(UnitTestEwEngine, CameraSetAndGetFov) +{ + constexpr auto fov = omath::projection::FieldOfView::FromDegrees(90.f); + auto cam = omath::source_engine::Camera({0, 0, 0}, {}, {1920.f, 1080.f}, fov, 0.01f, 1000.f); + + EXPECT_EQ(cam.GetFieldOfView().AsDegrees(), 90.f); + cam.SetFieldOfView(omath::projection::FieldOfView::FromDegrees(50.f)); + + EXPECT_EQ(cam.GetFieldOfView().AsDegrees(), 50.f); +} + +TEST(UnitTestEwEngine, CameraSetAndGetOrigin) +{ + auto cam = omath::source_engine::Camera({0, 0, 0}, {}, {1920.f, 1080.f}, {}, 0.01f, 1000.f); + + EXPECT_EQ(cam.GetOrigin(), omath::Vector3{}); + cam.SetFieldOfView(omath::projection::FieldOfView::FromDegrees(50.f)); + + EXPECT_EQ(cam.GetFieldOfView().AsDegrees(), 50.f); +} \ No newline at end of file