mirror of
https://github.com/orange-cpp/omath.git
synced 2026-04-18 17:03:27 +00:00
migrated to sol2
decomposed method added vector2, vector4 refactored tests added opengl engine to lua added other engines added source tests removed tons of lua files
This commit is contained in:
@@ -22,6 +22,8 @@ else() # GTest is being linked as vcpkg package
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE GTest::gtest GTest::gtest_main omath::omath)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE LUA_SCRIPTS_DIR="${CMAKE_CURRENT_SOURCE_DIR}/lua")
|
||||
|
||||
if(OMATH_ENABLE_COVERAGE)
|
||||
include(${CMAKE_SOURCE_DIR}/cmake/Coverage.cmake)
|
||||
omath_setup_coverage(${PROJECT_NAME})
|
||||
|
||||
79
tests/general/unit_test_lua_source_engine.cpp
Normal file
79
tests/general/unit_test_lua_source_engine.cpp
Normal file
@@ -0,0 +1,79 @@
|
||||
//
|
||||
// Created by orange on 07.03.2026.
|
||||
//
|
||||
#include <gtest/gtest.h>
|
||||
#include <lua.hpp>
|
||||
#include <omath/lua/lua.hpp>
|
||||
|
||||
class LuaSourceEngine : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
lua_State* L = nullptr;
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
L = luaL_newstate();
|
||||
luaL_openlibs(L);
|
||||
omath::lua::register_lib(L);
|
||||
if (luaL_dofile(L, LUA_SCRIPTS_DIR "/source_engine_tests.lua") != LUA_OK)
|
||||
FAIL() << lua_tostring(L, -1);
|
||||
}
|
||||
|
||||
void TearDown() override { lua_close(L); }
|
||||
|
||||
void check(const char* func_name)
|
||||
{
|
||||
lua_getglobal(L, func_name);
|
||||
if (lua_pcall(L, 0, 0, 0) != LUA_OK)
|
||||
{
|
||||
FAIL() << lua_tostring(L, -1);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// PitchAngle
|
||||
TEST_F(LuaSourceEngine, PitchAngle_from_degrees) { check("Source_PitchAngle_from_degrees"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_clamping_max) { check("Source_PitchAngle_clamping_max"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_clamping_min) { check("Source_PitchAngle_clamping_min"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_from_radians) { check("Source_PitchAngle_from_radians"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_as_radians) { check("Source_PitchAngle_as_radians"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_sin) { check("Source_PitchAngle_sin"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_cos) { check("Source_PitchAngle_cos"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_tan) { check("Source_PitchAngle_tan"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_addition) { check("Source_PitchAngle_addition"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_addition_clamped) { check("Source_PitchAngle_addition_clamped"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_subtraction) { check("Source_PitchAngle_subtraction"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_unary_minus) { check("Source_PitchAngle_unary_minus"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_equal_to) { check("Source_PitchAngle_equal_to"); }
|
||||
TEST_F(LuaSourceEngine, PitchAngle_to_string) { check("Source_PitchAngle_to_string"); }
|
||||
|
||||
// YawAngle
|
||||
TEST_F(LuaSourceEngine, YawAngle_from_degrees) { check("Source_YawAngle_from_degrees"); }
|
||||
TEST_F(LuaSourceEngine, YawAngle_normalization) { check("Source_YawAngle_normalization"); }
|
||||
|
||||
// RollAngle
|
||||
TEST_F(LuaSourceEngine, RollAngle_from_degrees) { check("Source_RollAngle_from_degrees"); }
|
||||
|
||||
// FieldOfView
|
||||
TEST_F(LuaSourceEngine, FieldOfView_from_degrees) { check("Source_FieldOfView_from_degrees"); }
|
||||
TEST_F(LuaSourceEngine, FieldOfView_clamping) { check("Source_FieldOfView_clamping"); }
|
||||
|
||||
// ViewAngles
|
||||
TEST_F(LuaSourceEngine, ViewAngles_new) { check("Source_ViewAngles_new"); }
|
||||
TEST_F(LuaSourceEngine, ViewAngles_field_mutation) { check("Source_ViewAngles_field_mutation"); }
|
||||
|
||||
// Camera
|
||||
TEST_F(LuaSourceEngine, Camera_constructor) { check("Source_Camera_constructor"); }
|
||||
TEST_F(LuaSourceEngine, Camera_get_set_origin) { check("Source_Camera_get_set_origin"); }
|
||||
TEST_F(LuaSourceEngine, Camera_get_set_near_plane) { check("Source_Camera_get_set_near_plane"); }
|
||||
TEST_F(LuaSourceEngine, Camera_get_set_far_plane) { check("Source_Camera_get_set_far_plane"); }
|
||||
TEST_F(LuaSourceEngine, Camera_get_set_fov) { check("Source_Camera_get_set_fov"); }
|
||||
TEST_F(LuaSourceEngine, Camera_get_set_view_angles) { check("Source_Camera_get_set_view_angles"); }
|
||||
TEST_F(LuaSourceEngine, Camera_look_at) { check("Source_Camera_look_at"); }
|
||||
TEST_F(LuaSourceEngine, Camera_get_forward) { check("Source_Camera_get_forward"); }
|
||||
TEST_F(LuaSourceEngine, Camera_get_right) { check("Source_Camera_get_right"); }
|
||||
TEST_F(LuaSourceEngine, Camera_get_up) { check("Source_Camera_get_up"); }
|
||||
TEST_F(LuaSourceEngine, Camera_world_to_screen_success) { check("Source_Camera_world_to_screen_success"); }
|
||||
TEST_F(LuaSourceEngine, Camera_world_to_screen_error) { check("Source_Camera_world_to_screen_error"); }
|
||||
TEST_F(LuaSourceEngine, Camera_screen_to_world) { check("Source_Camera_screen_to_world"); }
|
||||
56
tests/general/unit_test_lua_vector2.cpp
Normal file
56
tests/general/unit_test_lua_vector2.cpp
Normal file
@@ -0,0 +1,56 @@
|
||||
//
|
||||
// Created by orange on 07.03.2026.
|
||||
//
|
||||
#include <gtest/gtest.h>
|
||||
#include <lua.hpp>
|
||||
#include <omath/lua/lua.hpp>
|
||||
|
||||
class LuaVec2 : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
lua_State* L = nullptr;
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
L = luaL_newstate();
|
||||
luaL_openlibs(L);
|
||||
omath::lua::register_lib(L);
|
||||
if (luaL_dofile(L, LUA_SCRIPTS_DIR "/vec2_tests.lua") != LUA_OK)
|
||||
FAIL() << lua_tostring(L, -1);
|
||||
}
|
||||
|
||||
void TearDown() override { lua_close(L); }
|
||||
|
||||
void check(const char* func_name)
|
||||
{
|
||||
lua_getglobal(L, func_name);
|
||||
if (lua_pcall(L, 0, 0, 0) != LUA_OK)
|
||||
{
|
||||
FAIL() << lua_tostring(L, -1);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(LuaVec2, Constructor_default) { check("Vec2_Constructor_default"); }
|
||||
TEST_F(LuaVec2, Constructor_xy) { check("Vec2_Constructor_xy"); }
|
||||
TEST_F(LuaVec2, Field_mutation) { check("Vec2_Field_mutation"); }
|
||||
TEST_F(LuaVec2, Addition) { check("Vec2_Addition"); }
|
||||
TEST_F(LuaVec2, Subtraction) { check("Vec2_Subtraction"); }
|
||||
TEST_F(LuaVec2, UnaryMinus) { check("Vec2_UnaryMinus"); }
|
||||
TEST_F(LuaVec2, Multiplication_scalar) { check("Vec2_Multiplication_scalar"); }
|
||||
TEST_F(LuaVec2, Multiplication_scalar_reversed) { check("Vec2_Multiplication_scalar_reversed"); }
|
||||
TEST_F(LuaVec2, Division_scalar) { check("Vec2_Division_scalar"); }
|
||||
TEST_F(LuaVec2, EqualTo_true) { check("Vec2_EqualTo_true"); }
|
||||
TEST_F(LuaVec2, EqualTo_false) { check("Vec2_EqualTo_false"); }
|
||||
TEST_F(LuaVec2, LessThan) { check("Vec2_LessThan"); }
|
||||
TEST_F(LuaVec2, LessThanOrEqual) { check("Vec2_LessThanOrEqual"); }
|
||||
TEST_F(LuaVec2, ToString) { check("Vec2_ToString"); }
|
||||
TEST_F(LuaVec2, Length) { check("Vec2_Length"); }
|
||||
TEST_F(LuaVec2, LengthSqr) { check("Vec2_LengthSqr"); }
|
||||
TEST_F(LuaVec2, Normalized) { check("Vec2_Normalized"); }
|
||||
TEST_F(LuaVec2, Dot) { check("Vec2_Dot"); }
|
||||
TEST_F(LuaVec2, DistanceTo) { check("Vec2_DistanceTo"); }
|
||||
TEST_F(LuaVec2, DistanceToSqr) { check("Vec2_DistanceToSqr"); }
|
||||
TEST_F(LuaVec2, Sum) { check("Vec2_Sum"); }
|
||||
TEST_F(LuaVec2, Abs) { check("Vec2_Abs"); }
|
||||
69
tests/general/unit_test_lua_vector3.cpp
Normal file
69
tests/general/unit_test_lua_vector3.cpp
Normal file
@@ -0,0 +1,69 @@
|
||||
//
|
||||
// Created by orange on 07.03.2026.
|
||||
//
|
||||
#include <gtest/gtest.h>
|
||||
#include <lua.hpp>
|
||||
#include <omath/lua/lua.hpp>
|
||||
|
||||
class LuaVec3 : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
lua_State* L = nullptr;
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
L = luaL_newstate();
|
||||
luaL_openlibs(L);
|
||||
omath::lua::register_lib(L);
|
||||
if (luaL_dofile(L, LUA_SCRIPTS_DIR "/vec3_tests.lua") != LUA_OK)
|
||||
FAIL() << lua_tostring(L, -1);
|
||||
}
|
||||
|
||||
void TearDown() override { lua_close(L); }
|
||||
|
||||
void check(const char* func_name)
|
||||
{
|
||||
lua_getglobal(L, func_name);
|
||||
if (lua_pcall(L, 0, 0, 0) != LUA_OK)
|
||||
{
|
||||
FAIL() << lua_tostring(L, -1);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(LuaVec3, Constructor_default) { check("Vec3_Constructor_default"); }
|
||||
TEST_F(LuaVec3, Constructor_xyz) { check("Vec3_Constructor_xyz"); }
|
||||
TEST_F(LuaVec3, Field_mutation) { check("Vec3_Field_mutation"); }
|
||||
TEST_F(LuaVec3, Addition) { check("Vec3_Addition"); }
|
||||
TEST_F(LuaVec3, Subtraction) { check("Vec3_Subtraction"); }
|
||||
TEST_F(LuaVec3, UnaryMinus) { check("Vec3_UnaryMinus"); }
|
||||
TEST_F(LuaVec3, Multiplication_scalar) { check("Vec3_Multiplication_scalar"); }
|
||||
TEST_F(LuaVec3, Multiplication_scalar_reversed) { check("Vec3_Multiplication_scalar_reversed"); }
|
||||
TEST_F(LuaVec3, Multiplication_vec) { check("Vec3_Multiplication_vec"); }
|
||||
TEST_F(LuaVec3, Division_scalar) { check("Vec3_Division_scalar"); }
|
||||
TEST_F(LuaVec3, Division_vec) { check("Vec3_Division_vec"); }
|
||||
TEST_F(LuaVec3, EqualTo_true) { check("Vec3_EqualTo_true"); }
|
||||
TEST_F(LuaVec3, EqualTo_false) { check("Vec3_EqualTo_false"); }
|
||||
TEST_F(LuaVec3, LessThan) { check("Vec3_LessThan"); }
|
||||
TEST_F(LuaVec3, LessThanOrEqual) { check("Vec3_LessThanOrEqual"); }
|
||||
TEST_F(LuaVec3, ToString) { check("Vec3_ToString"); }
|
||||
TEST_F(LuaVec3, Length) { check("Vec3_Length"); }
|
||||
TEST_F(LuaVec3, Length2d) { check("Vec3_Length2d"); }
|
||||
TEST_F(LuaVec3, LengthSqr) { check("Vec3_LengthSqr"); }
|
||||
TEST_F(LuaVec3, Normalized) { check("Vec3_Normalized"); }
|
||||
TEST_F(LuaVec3, Dot_perpendicular) { check("Vec3_Dot_perpendicular"); }
|
||||
TEST_F(LuaVec3, Dot_parallel) { check("Vec3_Dot_parallel"); }
|
||||
TEST_F(LuaVec3, Cross) { check("Vec3_Cross"); }
|
||||
TEST_F(LuaVec3, DistanceTo) { check("Vec3_DistanceTo"); }
|
||||
TEST_F(LuaVec3, DistanceToSqr) { check("Vec3_DistanceToSqr"); }
|
||||
TEST_F(LuaVec3, Sum) { check("Vec3_Sum"); }
|
||||
TEST_F(LuaVec3, Sum2d) { check("Vec3_Sum2d"); }
|
||||
TEST_F(LuaVec3, Abs) { check("Vec3_Abs"); }
|
||||
TEST_F(LuaVec3, PointToSameDirection_true) { check("Vec3_PointToSameDirection_true"); }
|
||||
TEST_F(LuaVec3, PointToSameDirection_false) { check("Vec3_PointToSameDirection_false"); }
|
||||
TEST_F(LuaVec3, IsPerpendicular_true) { check("Vec3_IsPerpendicular_true"); }
|
||||
TEST_F(LuaVec3, IsPerpendicular_false) { check("Vec3_IsPerpendicular_false"); }
|
||||
TEST_F(LuaVec3, AngleBetween_90deg) { check("Vec3_AngleBetween_90deg"); }
|
||||
TEST_F(LuaVec3, AngleBetween_zero_vector_error) { check("Vec3_AngleBetween_zero_vector_error"); }
|
||||
TEST_F(LuaVec3, AsTable) { check("Vec3_AsTable"); }
|
||||
57
tests/general/unit_test_lua_vector4.cpp
Normal file
57
tests/general/unit_test_lua_vector4.cpp
Normal file
@@ -0,0 +1,57 @@
|
||||
//
|
||||
// Created by orange on 07.03.2026.
|
||||
//
|
||||
#include <gtest/gtest.h>
|
||||
#include <lua.hpp>
|
||||
#include <omath/lua/lua.hpp>
|
||||
|
||||
class LuaVec4 : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
lua_State* L = nullptr;
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
L = luaL_newstate();
|
||||
luaL_openlibs(L);
|
||||
omath::lua::register_lib(L);
|
||||
if (luaL_dofile(L, LUA_SCRIPTS_DIR "/vec4_tests.lua") != LUA_OK)
|
||||
FAIL() << lua_tostring(L, -1);
|
||||
}
|
||||
|
||||
void TearDown() override { lua_close(L); }
|
||||
|
||||
void check(const char* func_name)
|
||||
{
|
||||
lua_getglobal(L, func_name);
|
||||
if (lua_pcall(L, 0, 0, 0) != LUA_OK)
|
||||
{
|
||||
FAIL() << lua_tostring(L, -1);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(LuaVec4, Constructor_default) { check("Vec4_Constructor_default"); }
|
||||
TEST_F(LuaVec4, Constructor_xyzw) { check("Vec4_Constructor_xyzw"); }
|
||||
TEST_F(LuaVec4, Field_mutation) { check("Vec4_Field_mutation"); }
|
||||
TEST_F(LuaVec4, Addition) { check("Vec4_Addition"); }
|
||||
TEST_F(LuaVec4, Subtraction) { check("Vec4_Subtraction"); }
|
||||
TEST_F(LuaVec4, UnaryMinus) { check("Vec4_UnaryMinus"); }
|
||||
TEST_F(LuaVec4, Multiplication_scalar) { check("Vec4_Multiplication_scalar"); }
|
||||
TEST_F(LuaVec4, Multiplication_scalar_reversed) { check("Vec4_Multiplication_scalar_reversed"); }
|
||||
TEST_F(LuaVec4, Multiplication_vec) { check("Vec4_Multiplication_vec"); }
|
||||
TEST_F(LuaVec4, Division_scalar) { check("Vec4_Division_scalar"); }
|
||||
TEST_F(LuaVec4, Division_vec) { check("Vec4_Division_vec"); }
|
||||
TEST_F(LuaVec4, EqualTo_true) { check("Vec4_EqualTo_true"); }
|
||||
TEST_F(LuaVec4, EqualTo_false) { check("Vec4_EqualTo_false"); }
|
||||
TEST_F(LuaVec4, LessThan) { check("Vec4_LessThan"); }
|
||||
TEST_F(LuaVec4, LessThanOrEqual) { check("Vec4_LessThanOrEqual"); }
|
||||
TEST_F(LuaVec4, ToString) { check("Vec4_ToString"); }
|
||||
TEST_F(LuaVec4, Length) { check("Vec4_Length"); }
|
||||
TEST_F(LuaVec4, LengthSqr) { check("Vec4_LengthSqr"); }
|
||||
TEST_F(LuaVec4, Dot) { check("Vec4_Dot"); }
|
||||
TEST_F(LuaVec4, Dot_perpendicular) { check("Vec4_Dot_perpendicular"); }
|
||||
TEST_F(LuaVec4, Sum) { check("Vec4_Sum"); }
|
||||
TEST_F(LuaVec4, Abs) { check("Vec4_Abs"); }
|
||||
TEST_F(LuaVec4, Clamp) { check("Vec4_Clamp"); }
|
||||
197
tests/lua/source_engine_tests.lua
Normal file
197
tests/lua/source_engine_tests.lua
Normal file
@@ -0,0 +1,197 @@
|
||||
local function approx(a, b, eps) return math.abs(a - b) < (eps or 1e-4) end
|
||||
|
||||
local function make_camera()
|
||||
local pos = omath.Vec3.new(0, 0, 0)
|
||||
local pitch = omath.source.PitchAngle.from_degrees(0)
|
||||
local yaw = omath.source.YawAngle.from_degrees(0)
|
||||
local roll = omath.source.RollAngle.from_degrees(0)
|
||||
local angles = omath.source.ViewAngles.new(pitch, yaw, roll)
|
||||
local vp = omath.opengl.ViewPort.new(1920, 1080)
|
||||
local fov = omath.source.FieldOfView.from_degrees(90)
|
||||
return omath.source.Camera.new(pos, angles, vp, fov, 0.1, 1000)
|
||||
end
|
||||
|
||||
-- PitchAngle
|
||||
function Source_PitchAngle_from_degrees()
|
||||
assert(omath.source.PitchAngle.from_degrees(45):as_degrees() == 45)
|
||||
end
|
||||
|
||||
function Source_PitchAngle_clamping_max()
|
||||
assert(omath.source.PitchAngle.from_degrees(100):as_degrees() == 89)
|
||||
end
|
||||
|
||||
function Source_PitchAngle_clamping_min()
|
||||
assert(omath.source.PitchAngle.from_degrees(-100):as_degrees() == -89)
|
||||
end
|
||||
|
||||
function Source_PitchAngle_from_radians()
|
||||
assert(approx(omath.source.PitchAngle.from_radians(math.pi / 4):as_degrees(), 45))
|
||||
end
|
||||
|
||||
function Source_PitchAngle_as_radians()
|
||||
assert(approx(omath.source.PitchAngle.from_degrees(0):as_radians(), 0))
|
||||
end
|
||||
|
||||
function Source_PitchAngle_sin()
|
||||
assert(approx(omath.source.PitchAngle.from_degrees(30):sin(), 0.5))
|
||||
end
|
||||
|
||||
function Source_PitchAngle_cos()
|
||||
assert(approx(omath.source.PitchAngle.from_degrees(60):cos(), 0.5))
|
||||
end
|
||||
|
||||
function Source_PitchAngle_tan()
|
||||
assert(approx(omath.source.PitchAngle.from_degrees(45):tan(), 1.0))
|
||||
end
|
||||
|
||||
function Source_PitchAngle_addition()
|
||||
local c = omath.source.PitchAngle.from_degrees(20) + omath.source.PitchAngle.from_degrees(15)
|
||||
assert(c:as_degrees() == 35)
|
||||
end
|
||||
|
||||
function Source_PitchAngle_addition_clamped()
|
||||
local c = omath.source.PitchAngle.from_degrees(80) + omath.source.PitchAngle.from_degrees(20)
|
||||
assert(c:as_degrees() == 89)
|
||||
end
|
||||
|
||||
function Source_PitchAngle_subtraction()
|
||||
local c = omath.source.PitchAngle.from_degrees(50) - omath.source.PitchAngle.from_degrees(20)
|
||||
assert(c:as_degrees() == 30)
|
||||
end
|
||||
|
||||
function Source_PitchAngle_unary_minus()
|
||||
assert((-omath.source.PitchAngle.from_degrees(45)):as_degrees() == -45)
|
||||
end
|
||||
|
||||
function Source_PitchAngle_equal_to()
|
||||
local a = omath.source.PitchAngle.from_degrees(45)
|
||||
assert(a == omath.source.PitchAngle.from_degrees(45))
|
||||
assert(not (a == omath.source.PitchAngle.from_degrees(30)))
|
||||
end
|
||||
|
||||
function Source_PitchAngle_to_string()
|
||||
assert(tostring(omath.source.PitchAngle.from_degrees(45)) == "45deg")
|
||||
end
|
||||
|
||||
-- YawAngle
|
||||
function Source_YawAngle_from_degrees()
|
||||
assert(omath.source.YawAngle.from_degrees(90):as_degrees() == 90)
|
||||
end
|
||||
|
||||
function Source_YawAngle_normalization()
|
||||
assert(approx(omath.source.YawAngle.from_degrees(200):as_degrees(), -160))
|
||||
end
|
||||
|
||||
-- RollAngle
|
||||
function Source_RollAngle_from_degrees()
|
||||
assert(omath.source.RollAngle.from_degrees(45):as_degrees() == 45)
|
||||
end
|
||||
|
||||
-- FieldOfView
|
||||
function Source_FieldOfView_from_degrees()
|
||||
assert(omath.source.FieldOfView.from_degrees(90):as_degrees() == 90)
|
||||
end
|
||||
|
||||
function Source_FieldOfView_clamping()
|
||||
assert(omath.source.FieldOfView.from_degrees(200):as_degrees() == 180)
|
||||
end
|
||||
|
||||
-- ViewAngles
|
||||
function Source_ViewAngles_new()
|
||||
local angles = omath.source.ViewAngles.new(
|
||||
omath.source.PitchAngle.from_degrees(30),
|
||||
omath.source.YawAngle.from_degrees(90),
|
||||
omath.source.RollAngle.from_degrees(0))
|
||||
assert(angles.pitch:as_degrees() == 30)
|
||||
assert(angles.yaw:as_degrees() == 90)
|
||||
assert(angles.roll:as_degrees() == 0)
|
||||
end
|
||||
|
||||
function Source_ViewAngles_field_mutation()
|
||||
local angles = omath.source.ViewAngles.new(
|
||||
omath.source.PitchAngle.from_degrees(0),
|
||||
omath.source.YawAngle.from_degrees(0),
|
||||
omath.source.RollAngle.from_degrees(0))
|
||||
angles.pitch = omath.source.PitchAngle.from_degrees(45)
|
||||
assert(angles.pitch:as_degrees() == 45)
|
||||
end
|
||||
|
||||
-- Camera
|
||||
function Source_Camera_constructor()
|
||||
assert(make_camera() ~= nil)
|
||||
end
|
||||
|
||||
function Source_Camera_get_set_origin()
|
||||
local cam = make_camera()
|
||||
cam:set_origin(omath.Vec3.new(1, 2, 3))
|
||||
local o = cam:get_origin()
|
||||
assert(approx(o.x, 1) and approx(o.y, 2) and approx(o.z, 3))
|
||||
end
|
||||
|
||||
function Source_Camera_get_set_near_plane()
|
||||
local cam = make_camera()
|
||||
cam:set_near_plane(0.5)
|
||||
assert(approx(cam:get_near_plane(), 0.5))
|
||||
end
|
||||
|
||||
function Source_Camera_get_set_far_plane()
|
||||
local cam = make_camera()
|
||||
cam:set_far_plane(500)
|
||||
assert(approx(cam:get_far_plane(), 500))
|
||||
end
|
||||
|
||||
function Source_Camera_get_set_fov()
|
||||
local cam = make_camera()
|
||||
cam:set_field_of_view(omath.source.FieldOfView.from_degrees(60))
|
||||
assert(approx(cam:get_field_of_view():as_degrees(), 60))
|
||||
end
|
||||
|
||||
function Source_Camera_get_set_view_angles()
|
||||
local cam = make_camera()
|
||||
cam:set_view_angles(omath.source.ViewAngles.new(
|
||||
omath.source.PitchAngle.from_degrees(30),
|
||||
omath.source.YawAngle.from_degrees(90),
|
||||
omath.source.RollAngle.from_degrees(0)))
|
||||
assert(approx(cam:get_view_angles().pitch:as_degrees(), 30))
|
||||
assert(approx(cam:get_view_angles().yaw:as_degrees(), 90))
|
||||
end
|
||||
|
||||
function Source_Camera_look_at()
|
||||
local cam = make_camera()
|
||||
cam:look_at(omath.Vec3.new(10, 0, 0))
|
||||
assert(cam:get_view_angles() ~= nil)
|
||||
end
|
||||
|
||||
function Source_Camera_get_forward()
|
||||
local fwd = make_camera():get_forward()
|
||||
assert(approx(fwd:length(), 1.0))
|
||||
end
|
||||
|
||||
function Source_Camera_get_right()
|
||||
assert(approx(make_camera():get_right():length(), 1.0))
|
||||
end
|
||||
|
||||
function Source_Camera_get_up()
|
||||
assert(approx(make_camera():get_up():length(), 1.0))
|
||||
end
|
||||
|
||||
function Source_Camera_world_to_screen_success()
|
||||
local cam = make_camera()
|
||||
cam:look_at(omath.Vec3.new(1, 0, 0))
|
||||
local screen, err = cam:world_to_screen(omath.Vec3.new(5, 0, 0))
|
||||
assert(screen ~= nil, "expected screen pos, got: " .. tostring(err))
|
||||
end
|
||||
|
||||
function Source_Camera_world_to_screen_error()
|
||||
local cam = make_camera()
|
||||
cam:look_at(omath.Vec3.new(1, 0, 0))
|
||||
local screen, err = cam:world_to_screen(omath.Vec3.new(-100, 0, 0))
|
||||
assert(screen == nil and err ~= nil)
|
||||
end
|
||||
|
||||
function Source_Camera_screen_to_world()
|
||||
local cam = make_camera()
|
||||
cam:look_at(omath.Vec3.new(1, 0, 0))
|
||||
local world, err = cam:screen_to_world(omath.Vec3.new(960, 540, 1))
|
||||
assert(world ~= nil, "expected world pos, got: " .. tostring(err))
|
||||
end
|
||||
102
tests/lua/vec2_tests.lua
Normal file
102
tests/lua/vec2_tests.lua
Normal file
@@ -0,0 +1,102 @@
|
||||
local function approx(a, b) return math.abs(a - b) < 1e-5 end
|
||||
|
||||
function Vec2_Constructor_default()
|
||||
local v = omath.Vec2.new()
|
||||
assert(v.x == 0 and v.y == 0)
|
||||
end
|
||||
|
||||
function Vec2_Constructor_xy()
|
||||
local v = omath.Vec2.new(3, 4)
|
||||
assert(v.x == 3 and v.y == 4)
|
||||
end
|
||||
|
||||
function Vec2_Field_mutation()
|
||||
local v = omath.Vec2.new(1, 2)
|
||||
v.x = 9; v.y = 8
|
||||
assert(v.x == 9 and v.y == 8)
|
||||
end
|
||||
|
||||
function Vec2_Addition()
|
||||
local c = omath.Vec2.new(1, 2) + omath.Vec2.new(3, 4)
|
||||
assert(c.x == 4 and c.y == 6)
|
||||
end
|
||||
|
||||
function Vec2_Subtraction()
|
||||
local c = omath.Vec2.new(5, 7) - omath.Vec2.new(2, 3)
|
||||
assert(c.x == 3 and c.y == 4)
|
||||
end
|
||||
|
||||
function Vec2_UnaryMinus()
|
||||
local b = -omath.Vec2.new(1, 2)
|
||||
assert(b.x == -1 and b.y == -2)
|
||||
end
|
||||
|
||||
function Vec2_Multiplication_scalar()
|
||||
local b = omath.Vec2.new(2, 3) * 2.0
|
||||
assert(b.x == 4 and b.y == 6)
|
||||
end
|
||||
|
||||
function Vec2_Multiplication_scalar_reversed()
|
||||
local b = 2.0 * omath.Vec2.new(2, 3)
|
||||
assert(b.x == 4 and b.y == 6)
|
||||
end
|
||||
|
||||
function Vec2_Division_scalar()
|
||||
local b = omath.Vec2.new(4, 6) / 2.0
|
||||
assert(b.x == 2 and b.y == 3)
|
||||
end
|
||||
|
||||
function Vec2_EqualTo_true()
|
||||
assert(omath.Vec2.new(1, 2) == omath.Vec2.new(1, 2))
|
||||
end
|
||||
|
||||
function Vec2_EqualTo_false()
|
||||
assert(not (omath.Vec2.new(1, 2) == omath.Vec2.new(9, 9)))
|
||||
end
|
||||
|
||||
function Vec2_LessThan()
|
||||
assert(omath.Vec2.new(1, 0) < omath.Vec2.new(3, 4))
|
||||
end
|
||||
|
||||
function Vec2_LessThanOrEqual()
|
||||
-- (3,4) and (4,3) both have length 5
|
||||
assert(omath.Vec2.new(3, 4) <= omath.Vec2.new(4, 3))
|
||||
end
|
||||
|
||||
function Vec2_ToString()
|
||||
assert(tostring(omath.Vec2.new(1, 2)) == "Vec2(1, 2)")
|
||||
end
|
||||
|
||||
function Vec2_Length()
|
||||
assert(approx(omath.Vec2.new(3, 4):length(), 5.0))
|
||||
end
|
||||
|
||||
function Vec2_LengthSqr()
|
||||
assert(omath.Vec2.new(3, 4):length_sqr() == 25.0)
|
||||
end
|
||||
|
||||
function Vec2_Normalized()
|
||||
local n = omath.Vec2.new(3, 4):normalized()
|
||||
assert(approx(n.x, 0.6) and approx(n.y, 0.8))
|
||||
end
|
||||
|
||||
function Vec2_Dot()
|
||||
assert(omath.Vec2.new(1, 2):dot(omath.Vec2.new(3, 4)) == 11.0)
|
||||
end
|
||||
|
||||
function Vec2_DistanceTo()
|
||||
assert(approx(omath.Vec2.new(0, 0):distance_to(omath.Vec2.new(3, 4)), 5.0))
|
||||
end
|
||||
|
||||
function Vec2_DistanceToSqr()
|
||||
assert(omath.Vec2.new(0, 0):distance_to_sqr(omath.Vec2.new(3, 4)) == 25.0)
|
||||
end
|
||||
|
||||
function Vec2_Sum()
|
||||
assert(omath.Vec2.new(3, 4):sum() == 7.0)
|
||||
end
|
||||
|
||||
function Vec2_Abs()
|
||||
local a = omath.Vec2.new(-3, -4):abs()
|
||||
assert(a.x == 3 and a.y == 4)
|
||||
end
|
||||
163
tests/lua/vec3_tests.lua
Normal file
163
tests/lua/vec3_tests.lua
Normal file
@@ -0,0 +1,163 @@
|
||||
local function approx(a, b, eps) return math.abs(a - b) < (eps or 1e-5) end
|
||||
|
||||
function Vec3_Constructor_default()
|
||||
local v = omath.Vec3.new()
|
||||
assert(v.x == 0 and v.y == 0 and v.z == 0)
|
||||
end
|
||||
|
||||
function Vec3_Constructor_xyz()
|
||||
local v = omath.Vec3.new(1, 2, 3)
|
||||
assert(v.x == 1 and v.y == 2 and v.z == 3)
|
||||
end
|
||||
|
||||
function Vec3_Field_mutation()
|
||||
local v = omath.Vec3.new(1, 2, 3)
|
||||
v.x = 9; v.y = 8; v.z = 7
|
||||
assert(v.x == 9 and v.y == 8 and v.z == 7)
|
||||
end
|
||||
|
||||
function Vec3_Addition()
|
||||
local c = omath.Vec3.new(1, 2, 3) + omath.Vec3.new(4, 5, 6)
|
||||
assert(c.x == 5 and c.y == 7 and c.z == 9)
|
||||
end
|
||||
|
||||
function Vec3_Subtraction()
|
||||
local c = omath.Vec3.new(4, 5, 6) - omath.Vec3.new(1, 2, 3)
|
||||
assert(c.x == 3 and c.y == 3 and c.z == 3)
|
||||
end
|
||||
|
||||
function Vec3_UnaryMinus()
|
||||
local b = -omath.Vec3.new(1, 2, 3)
|
||||
assert(b.x == -1 and b.y == -2 and b.z == -3)
|
||||
end
|
||||
|
||||
function Vec3_Multiplication_scalar()
|
||||
local b = omath.Vec3.new(1, 2, 3) * 2.0
|
||||
assert(b.x == 2 and b.y == 4 and b.z == 6)
|
||||
end
|
||||
|
||||
function Vec3_Multiplication_scalar_reversed()
|
||||
local b = 2.0 * omath.Vec3.new(1, 2, 3)
|
||||
assert(b.x == 2 and b.y == 4 and b.z == 6)
|
||||
end
|
||||
|
||||
function Vec3_Multiplication_vec()
|
||||
local c = omath.Vec3.new(2, 3, 4) * omath.Vec3.new(2, 2, 2)
|
||||
assert(c.x == 4 and c.y == 6 and c.z == 8)
|
||||
end
|
||||
|
||||
function Vec3_Division_scalar()
|
||||
local b = omath.Vec3.new(2, 4, 6) / 2.0
|
||||
assert(b.x == 1 and b.y == 2 and b.z == 3)
|
||||
end
|
||||
|
||||
function Vec3_Division_vec()
|
||||
local c = omath.Vec3.new(4, 6, 8) / omath.Vec3.new(2, 2, 2)
|
||||
assert(c.x == 2 and c.y == 3 and c.z == 4)
|
||||
end
|
||||
|
||||
function Vec3_EqualTo_true()
|
||||
assert(omath.Vec3.new(1, 2, 3) == omath.Vec3.new(1, 2, 3))
|
||||
end
|
||||
|
||||
function Vec3_EqualTo_false()
|
||||
assert(not (omath.Vec3.new(1, 2, 3) == omath.Vec3.new(9, 9, 9)))
|
||||
end
|
||||
|
||||
function Vec3_LessThan()
|
||||
assert(omath.Vec3.new(1, 0, 0) < omath.Vec3.new(3, 4, 0))
|
||||
end
|
||||
|
||||
function Vec3_LessThanOrEqual()
|
||||
-- (0,3,4) and (0,4,3) both have length 5
|
||||
assert(omath.Vec3.new(0, 3, 4) <= omath.Vec3.new(0, 4, 3))
|
||||
end
|
||||
|
||||
function Vec3_ToString()
|
||||
assert(tostring(omath.Vec3.new(1, 2, 3)) == "Vec3(1, 2, 3)")
|
||||
end
|
||||
|
||||
function Vec3_Length()
|
||||
assert(approx(omath.Vec3.new(1, 2, 2):length(), 3.0))
|
||||
end
|
||||
|
||||
function Vec3_Length2d()
|
||||
assert(approx(omath.Vec3.new(3, 4, 99):length_2d(), 5.0))
|
||||
end
|
||||
|
||||
function Vec3_LengthSqr()
|
||||
assert(omath.Vec3.new(1, 2, 2):length_sqr() == 9.0)
|
||||
end
|
||||
|
||||
function Vec3_Normalized()
|
||||
local n = omath.Vec3.new(3, 0, 0):normalized()
|
||||
assert(approx(n.x, 1.0) and approx(n.y, 0.0) and approx(n.z, 0.0))
|
||||
end
|
||||
|
||||
function Vec3_Dot_perpendicular()
|
||||
assert(omath.Vec3.new(1, 0, 0):dot(omath.Vec3.new(0, 1, 0)) == 0.0)
|
||||
end
|
||||
|
||||
function Vec3_Dot_parallel()
|
||||
local a = omath.Vec3.new(1, 2, 3)
|
||||
assert(a:dot(a) == 14.0)
|
||||
end
|
||||
|
||||
function Vec3_Cross()
|
||||
local c = omath.Vec3.new(1, 0, 0):cross(omath.Vec3.new(0, 1, 0))
|
||||
assert(approx(c.x, 0) and approx(c.y, 0) and approx(c.z, 1))
|
||||
end
|
||||
|
||||
function Vec3_DistanceTo()
|
||||
assert(approx(omath.Vec3.new(0, 0, 0):distance_to(omath.Vec3.new(1, 2, 2)), 3.0))
|
||||
end
|
||||
|
||||
function Vec3_DistanceToSqr()
|
||||
assert(omath.Vec3.new(0, 0, 0):distance_to_sqr(omath.Vec3.new(1, 2, 2)) == 9.0)
|
||||
end
|
||||
|
||||
function Vec3_Sum()
|
||||
assert(omath.Vec3.new(1, 2, 3):sum() == 6.0)
|
||||
end
|
||||
|
||||
function Vec3_Sum2d()
|
||||
assert(omath.Vec3.new(1, 2, 3):sum_2d() == 3.0)
|
||||
end
|
||||
|
||||
function Vec3_Abs()
|
||||
local a = omath.Vec3.new(-1, -2, -3):abs()
|
||||
assert(a.x == 1 and a.y == 2 and a.z == 3)
|
||||
end
|
||||
|
||||
function Vec3_PointToSameDirection_true()
|
||||
assert(omath.Vec3.new(1, 1, 0):point_to_same_direction(omath.Vec3.new(2, 2, 0)) == true)
|
||||
end
|
||||
|
||||
function Vec3_PointToSameDirection_false()
|
||||
assert(omath.Vec3.new(1, 0, 0):point_to_same_direction(omath.Vec3.new(-1, 0, 0)) == false)
|
||||
end
|
||||
|
||||
function Vec3_IsPerpendicular_true()
|
||||
assert(omath.Vec3.new(1, 0, 0):is_perpendicular(omath.Vec3.new(0, 1, 0)) == true)
|
||||
end
|
||||
|
||||
function Vec3_IsPerpendicular_false()
|
||||
local a = omath.Vec3.new(1, 0, 0)
|
||||
assert(a:is_perpendicular(a) == false)
|
||||
end
|
||||
|
||||
function Vec3_AngleBetween_90deg()
|
||||
local angle, err = omath.Vec3.new(1, 0, 0):angle_between(omath.Vec3.new(0, 1, 0))
|
||||
assert(angle ~= nil, err)
|
||||
assert(math.abs(angle - 90.0) < 1e-3)
|
||||
end
|
||||
|
||||
function Vec3_AngleBetween_zero_vector_error()
|
||||
local angle, err = omath.Vec3.new(0, 0, 0):angle_between(omath.Vec3.new(1, 0, 0))
|
||||
assert(angle == nil and err ~= nil)
|
||||
end
|
||||
|
||||
function Vec3_AsTable()
|
||||
local t = omath.Vec3.new(1, 2, 3):as_table()
|
||||
assert(t.x == 1 and t.y == 2 and t.z == 3)
|
||||
end
|
||||
110
tests/lua/vec4_tests.lua
Normal file
110
tests/lua/vec4_tests.lua
Normal file
@@ -0,0 +1,110 @@
|
||||
local function approx(a, b) return math.abs(a - b) < 1e-5 end
|
||||
|
||||
function Vec4_Constructor_default()
|
||||
local v = omath.Vec4.new()
|
||||
assert(v.x == 0 and v.y == 0 and v.z == 0 and v.w == 0)
|
||||
end
|
||||
|
||||
function Vec4_Constructor_xyzw()
|
||||
local v = omath.Vec4.new(1, 2, 3, 4)
|
||||
assert(v.x == 1 and v.y == 2 and v.z == 3 and v.w == 4)
|
||||
end
|
||||
|
||||
function Vec4_Field_mutation()
|
||||
local v = omath.Vec4.new(1, 2, 3, 4)
|
||||
v.w = 99
|
||||
assert(v.w == 99)
|
||||
end
|
||||
|
||||
function Vec4_Addition()
|
||||
local c = omath.Vec4.new(1, 2, 3, 4) + omath.Vec4.new(4, 3, 2, 1)
|
||||
assert(c.x == 5 and c.y == 5 and c.z == 5 and c.w == 5)
|
||||
end
|
||||
|
||||
function Vec4_Subtraction()
|
||||
local c = omath.Vec4.new(5, 5, 5, 5) - omath.Vec4.new(1, 2, 3, 4)
|
||||
assert(c.x == 4 and c.y == 3 and c.z == 2 and c.w == 1)
|
||||
end
|
||||
|
||||
function Vec4_UnaryMinus()
|
||||
local b = -omath.Vec4.new(1, 2, 3, 4)
|
||||
assert(b.x == -1 and b.y == -2 and b.z == -3 and b.w == -4)
|
||||
end
|
||||
|
||||
function Vec4_Multiplication_scalar()
|
||||
local b = omath.Vec4.new(1, 2, 3, 4) * 2.0
|
||||
assert(b.x == 2 and b.y == 4 and b.z == 6 and b.w == 8)
|
||||
end
|
||||
|
||||
function Vec4_Multiplication_scalar_reversed()
|
||||
local b = 2.0 * omath.Vec4.new(1, 2, 3, 4)
|
||||
assert(b.x == 2 and b.y == 4 and b.z == 6 and b.w == 8)
|
||||
end
|
||||
|
||||
function Vec4_Multiplication_vec()
|
||||
local c = omath.Vec4.new(2, 3, 4, 5) * omath.Vec4.new(2, 2, 2, 2)
|
||||
assert(c.x == 4 and c.y == 6 and c.z == 8 and c.w == 10)
|
||||
end
|
||||
|
||||
function Vec4_Division_scalar()
|
||||
local b = omath.Vec4.new(2, 4, 6, 8) / 2.0
|
||||
assert(b.x == 1 and b.y == 2 and b.z == 3 and b.w == 4)
|
||||
end
|
||||
|
||||
function Vec4_Division_vec()
|
||||
local c = omath.Vec4.new(4, 6, 8, 10) / omath.Vec4.new(2, 2, 2, 2)
|
||||
assert(c.x == 2 and c.y == 3 and c.z == 4 and c.w == 5)
|
||||
end
|
||||
|
||||
function Vec4_EqualTo_true()
|
||||
assert(omath.Vec4.new(1, 2, 3, 4) == omath.Vec4.new(1, 2, 3, 4))
|
||||
end
|
||||
|
||||
function Vec4_EqualTo_false()
|
||||
assert(not (omath.Vec4.new(1, 2, 3, 4) == omath.Vec4.new(9, 9, 9, 9)))
|
||||
end
|
||||
|
||||
function Vec4_LessThan()
|
||||
assert(omath.Vec4.new(1, 0, 0, 0) < omath.Vec4.new(0, 0, 3, 4))
|
||||
end
|
||||
|
||||
function Vec4_LessThanOrEqual()
|
||||
-- (0,0,3,4) and (0,0,4,3) both have length 5
|
||||
assert(omath.Vec4.new(0, 0, 3, 4) <= omath.Vec4.new(0, 0, 4, 3))
|
||||
end
|
||||
|
||||
function Vec4_ToString()
|
||||
assert(tostring(omath.Vec4.new(1, 2, 3, 4)) == "Vec4(1, 2, 3, 4)")
|
||||
end
|
||||
|
||||
function Vec4_Length()
|
||||
assert(approx(omath.Vec4.new(0, 0, 3, 4):length(), 5.0))
|
||||
end
|
||||
|
||||
function Vec4_LengthSqr()
|
||||
assert(omath.Vec4.new(0, 0, 3, 4):length_sqr() == 25.0)
|
||||
end
|
||||
|
||||
function Vec4_Dot()
|
||||
local a = omath.Vec4.new(1, 2, 3, 4)
|
||||
assert(a:dot(a) == 30.0)
|
||||
end
|
||||
|
||||
function Vec4_Dot_perpendicular()
|
||||
assert(omath.Vec4.new(1, 0, 0, 0):dot(omath.Vec4.new(0, 1, 0, 0)) == 0.0)
|
||||
end
|
||||
|
||||
function Vec4_Sum()
|
||||
assert(omath.Vec4.new(1, 2, 3, 4):sum() == 10.0)
|
||||
end
|
||||
|
||||
function Vec4_Abs()
|
||||
local a = omath.Vec4.new(-1, -2, -3, -4):abs()
|
||||
assert(a.x == 1 and a.y == 2 and a.z == 3 and a.w == 4)
|
||||
end
|
||||
|
||||
function Vec4_Clamp()
|
||||
local v = omath.Vec4.new(5, -3, 10, 99)
|
||||
v:clamp(0, 7)
|
||||
assert(v.x == 5 and v.y == 0 and v.z == 7)
|
||||
end
|
||||
29
tests/lua/vector2_test.lua
Normal file
29
tests/lua/vector2_test.lua
Normal file
@@ -0,0 +1,29 @@
|
||||
local a = omath.Vec2.new(1, 2)
|
||||
local b = omath.Vec2.new(10, 20)
|
||||
|
||||
-- Operators
|
||||
local c = a + b
|
||||
local d = a - b
|
||||
local e = a * 2.0
|
||||
local f = -a
|
||||
print("a + b = " .. tostring(c))
|
||||
print("a - b = " .. tostring(d))
|
||||
print("a * 2 = " .. tostring(e))
|
||||
print("-a = " .. tostring(f))
|
||||
print("a == Vec2(1,2): " .. tostring(a == omath.Vec2.new(1, 2)))
|
||||
print("a < b: " .. tostring(a < b))
|
||||
|
||||
-- Field access + mutation
|
||||
print("c.x = " .. c.x .. ", c.y = " .. c.y)
|
||||
c.x = 99
|
||||
print("c.x after mutation = " .. c.x)
|
||||
|
||||
-- Methods
|
||||
print("a:length() = " .. a:length())
|
||||
print("a:length_sqr() = " .. a:length_sqr())
|
||||
print("a:normalized() = " .. tostring(a:normalized()))
|
||||
print("a:dot(b) = " .. a:dot(b))
|
||||
print("a:distance_to(b) = " .. a:distance_to(b))
|
||||
print("a:distance_to_sqr(b) = " .. a:distance_to_sqr(b))
|
||||
print("a:sum() = " .. a:sum())
|
||||
print("a:abs() = " .. tostring(a:abs()))
|
||||
55
tests/lua/vector3_test.lua
Normal file
55
tests/lua/vector3_test.lua
Normal file
@@ -0,0 +1,55 @@
|
||||
local a = omath.Vec3.new(1, 0, 0)
|
||||
local b = omath.Vec3.new(0, 1, 0)
|
||||
|
||||
-- Operators
|
||||
local c = a + b
|
||||
local d = a - b
|
||||
local e = a * 2.0
|
||||
local f = -a
|
||||
print("a + b = " .. tostring(c))
|
||||
print("a - b = " .. tostring(d))
|
||||
print("a * 2 = " .. tostring(e))
|
||||
print("-a = " .. tostring(f))
|
||||
print("a == Vec3(1,2,3): " .. tostring(a == omath.Vec3.new(1, 2, 3)))
|
||||
print("a < b: " .. tostring(a < b))
|
||||
|
||||
-- Field access + mutation
|
||||
print("c.x = " .. c.x .. ", c.y = " .. c.y .. ", c.z = " .. c.z)
|
||||
c.x = 99
|
||||
print("c.x after mutation = " .. c.x)
|
||||
|
||||
-- Methods
|
||||
print("a:length() = " .. a:length())
|
||||
print("a:length_2d() = " .. a:length_2d())
|
||||
print("a:length_sqr() = " .. a:length_sqr())
|
||||
print("a:normalized() = " .. tostring(a:normalized()))
|
||||
print("a:dot(b) = " .. a:dot(b))
|
||||
print("a:cross(b) = " .. tostring(a:cross(b)))
|
||||
print("a:distance_to(b) = " .. a:distance_to(b))
|
||||
print("a:distance_to_sqr(b) = " .. a:distance_to_sqr(b))
|
||||
print("a:abs() = " .. tostring(a:abs()))
|
||||
print("a:sum() = " .. a:sum())
|
||||
print("a:sum_2d() = " .. a:sum_2d())
|
||||
print("a:point_to_same_direction(b) = " .. tostring(a:point_to_same_direction(b)))
|
||||
print("a:is_perpendicular(b) = " .. tostring(a:is_perpendicular(b)))
|
||||
|
||||
-- angle_between
|
||||
local angle, err = a:angle_between(b)
|
||||
if angle then
|
||||
print("angle_between = " .. angle .. " degrees")
|
||||
else
|
||||
print("angle_between error: " .. err)
|
||||
end
|
||||
|
||||
-- Zero vector edge case
|
||||
local zero = omath.Vec3.new(0, 0, 0)
|
||||
local ang2, err2 = zero:angle_between(a)
|
||||
if ang2 then
|
||||
print("zero angle = " .. ang2)
|
||||
else
|
||||
print("zero angle error: " .. err2)
|
||||
end
|
||||
|
||||
-- as_table
|
||||
local t = a:as_table()
|
||||
print("as_table: x=" .. t.x .. " y=" .. t.y .. " z=" .. t.z)
|
||||
31
tests/lua/vector4_test.lua
Normal file
31
tests/lua/vector4_test.lua
Normal file
@@ -0,0 +1,31 @@
|
||||
local a = omath.Vec4.new(1, 2, 3, 4)
|
||||
local b = omath.Vec4.new(10, 20, 30, 40)
|
||||
|
||||
-- Operators
|
||||
local c = a + b
|
||||
local d = a - b
|
||||
local e = a * 2.0
|
||||
local f = -a
|
||||
print("a + b = " .. tostring(c))
|
||||
print("a - b = " .. tostring(d))
|
||||
print("a * 2 = " .. tostring(e))
|
||||
print("-a = " .. tostring(f))
|
||||
print("a == Vec4(1,2,3,4): " .. tostring(a == omath.Vec4.new(1, 2, 3, 4)))
|
||||
print("a < b: " .. tostring(a < b))
|
||||
|
||||
-- Field access + mutation
|
||||
print("c.x=" .. c.x .. " c.y=" .. c.y .. " c.z=" .. c.z .. " c.w=" .. c.w)
|
||||
c.w = 99
|
||||
print("c.w after mutation = " .. c.w)
|
||||
|
||||
-- Methods
|
||||
print("a:length() = " .. a:length())
|
||||
print("a:length_sqr() = " .. a:length_sqr())
|
||||
print("a:dot(b) = " .. a:dot(b))
|
||||
print("a:sum() = " .. a:sum())
|
||||
print("a:abs() = " .. tostring(a:abs()))
|
||||
|
||||
-- clamp
|
||||
local clamped = omath.Vec4.new(5, -3, 10, 1)
|
||||
clamped:clamp(0, 7)
|
||||
print("clamp([5,-3,10,1], 0, 7).x=" .. clamped.x .. " .y=" .. clamped.y .. " .z=" .. clamped.z)
|
||||
Reference in New Issue
Block a user