From 496a8725b2285998e12da1b0fbd9c1853817e69b Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Thu, 3 Oct 2019 22:52:25 +0700 Subject: [PATCH] add quat and unit bindings --- headers/enduro2d/math/_math.hpp | 3 + headers/enduro2d/math/quat.hpp | 32 ++-- headers/enduro2d/math/unit.hpp | 17 +- headers/enduro2d/math/vec2.hpp | 58 +++--- headers/enduro2d/math/vec3.hpp | 65 ++++--- headers/enduro2d/math/vec4.hpp | 72 ++++---- sources/enduro2d/high/bindings/math_binds.cpp | 169 ++++++++++++++++-- untests/sources/untests_high/luasol.cpp | 20 ++- 8 files changed, 288 insertions(+), 148 deletions(-) diff --git a/headers/enduro2d/math/_math.hpp b/headers/enduro2d/math/_math.hpp index 49094f87..c190aae4 100644 --- a/headers/enduro2d/math/_math.hpp +++ b/headers/enduro2d/math/_math.hpp @@ -136,6 +136,9 @@ namespace e2d using deg = unit; template < typename T > using rad = unit; + + using degf = deg; + using radf = rad; } namespace e2d::math diff --git a/headers/enduro2d/math/quat.hpp b/headers/enduro2d/math/quat.hpp index 629df226..e2d92ebe 100644 --- a/headers/enduro2d/math/quat.hpp +++ b/headers/enduro2d/math/quat.hpp @@ -28,15 +28,15 @@ namespace e2d T z = 0; T w = 1; public: - static const quat& zero() noexcept; - static const quat& identity() noexcept; + static constexpr quat zero() noexcept; + static constexpr quat identity() noexcept; public: - quat() noexcept = default; - quat(const quat& other) noexcept = default; - quat& operator=(const quat& other) noexcept = default; + constexpr quat() noexcept = default; + constexpr quat(const quat& other) noexcept = default; + constexpr quat& operator=(const quat& other) noexcept = default; - quat(T x, T y, T z, T w) noexcept; - explicit quat(const vec4& other) noexcept; + constexpr quat(T x, T y, T z, T w) noexcept; + constexpr explicit quat(const vec4& other) noexcept; template < typename To > quat cast_to() const noexcept; @@ -58,26 +58,24 @@ namespace e2d namespace e2d { template < typename T > - const quat& quat::zero() noexcept { - static const quat zero{0, 0, 0, 0}; - return zero; + constexpr quat quat::zero() noexcept { + return {0, 0, 0, 0}; } template < typename T > - const quat& quat::identity() noexcept { - static const quat identity{0, 0, 0, 1}; - return identity; + constexpr quat quat::identity() noexcept { + return {0, 0, 0, 1}; } template < typename T > - quat::quat(T nx, T ny, T nz, T nw) noexcept + constexpr quat::quat(T nx, T ny, T nz, T nw) noexcept : x(nx) , y(ny) , z(nz) , w(nw) {} template < typename T > - quat::quat(const vec4& other) noexcept + constexpr quat::quat(const vec4& other) noexcept : x(other.x) , y(other.y) , z(other.z) @@ -143,12 +141,12 @@ namespace e2d // template < typename T > - quat make_quat(T x, T y, T z, T w) noexcept { + constexpr quat make_quat(T x, T y, T z, T w) noexcept { return quat(x, y, z, w); } template < typename T > - quat make_quat(const vec4& other) noexcept { + constexpr quat make_quat(const vec4& other) noexcept { return quat(other); } diff --git a/headers/enduro2d/math/unit.hpp b/headers/enduro2d/math/unit.hpp index 5fa03184..28450ae5 100644 --- a/headers/enduro2d/math/unit.hpp +++ b/headers/enduro2d/math/unit.hpp @@ -22,12 +22,13 @@ namespace e2d public: T value = 0; public: - unit() noexcept = default; - unit(const unit& other) noexcept = default; - unit& operator=(const unit& other) noexcept = default; + constexpr unit() noexcept = default; + constexpr unit(const unit& other) noexcept = default; + constexpr unit& operator=(const unit& other) noexcept = default; + + constexpr explicit unit(T v) noexcept; + constexpr unit(T v, Tag tag) noexcept; - explicit unit(T v) noexcept; - unit(T v, Tag tag) noexcept; template < typename OtherTag > explicit unit(const unit& other) noexcept; @@ -59,11 +60,11 @@ namespace e2d namespace e2d { template < typename T, typename Tag > - unit::unit(T v) noexcept + constexpr unit::unit(T v) noexcept : value(v) {} template < typename T, typename Tag > - unit::unit(T v, Tag tag) noexcept + constexpr unit::unit(T v, Tag tag) noexcept : value(v) { E2D_UNUSED(tag); } template < typename T, typename Tag > @@ -116,7 +117,7 @@ namespace e2d // template < typename Tag, typename T > - unit make_unit(T v) noexcept { + constexpr unit make_unit(T v) noexcept { return unit(v); } diff --git a/headers/enduro2d/math/vec2.hpp b/headers/enduro2d/math/vec2.hpp index 881e6db5..ca345266 100644 --- a/headers/enduro2d/math/vec2.hpp +++ b/headers/enduro2d/math/vec2.hpp @@ -24,19 +24,19 @@ namespace e2d T x = 0; T y = 0; public: - static const vec2& zero() noexcept; - static const vec2& unit() noexcept; - static const vec2& unit_x() noexcept; - static const vec2& unit_y() noexcept; + static constexpr vec2 zero() noexcept; + static constexpr vec2 unit() noexcept; + static constexpr vec2 unit_x() noexcept; + static constexpr vec2 unit_y() noexcept; public: - vec2() noexcept = default; - vec2(const vec2& other) noexcept = default; - vec2& operator=(const vec2& other) noexcept = default; + constexpr vec2() noexcept = default; + constexpr vec2(const vec2& other) noexcept = default; + constexpr vec2& operator=(const vec2& other) noexcept = default; - explicit vec2(T v) noexcept; - vec2(T x, T y) noexcept; - explicit vec2(const vec3& other) noexcept; - explicit vec2(const vec4& other) noexcept; + constexpr explicit vec2(T v) noexcept; + constexpr vec2(T x, T y) noexcept; + constexpr explicit vec2(const vec3& other) noexcept; + constexpr explicit vec2(const vec4& other) noexcept; template < typename To > vec2 cast_to() const noexcept; @@ -62,46 +62,42 @@ namespace e2d namespace e2d { template < typename T > - const vec2& vec2::zero() noexcept { - static const vec2 zero{0, 0}; - return zero; + constexpr vec2 vec2::zero() noexcept { + return {0, 0}; } template < typename T > - const vec2& vec2::unit() noexcept { - static const vec2 unit{1, 1}; - return unit; + constexpr vec2 vec2::unit() noexcept { + return {1, 1}; } template < typename T > - const vec2& vec2::unit_x() noexcept { - static const vec2 unit_x{1, 0}; - return unit_x; + constexpr vec2 vec2::unit_x() noexcept { + return {1, 0}; } template < typename T > - const vec2& vec2::unit_y() noexcept { - static const vec2 unit_y{0, 1}; - return unit_y; + constexpr vec2 vec2::unit_y() noexcept { + return {0, 1}; } template < typename T > - vec2::vec2(T v) noexcept + constexpr vec2::vec2(T v) noexcept : x(v) , y(v) {} template < typename T > - vec2::vec2(T nx, T ny) noexcept + constexpr vec2::vec2(T nx, T ny) noexcept : x(nx) , y(ny) {} template < typename T > - vec2::vec2(const vec3& other) noexcept + constexpr vec2::vec2(const vec3& other) noexcept : x(other.x) , y(other.y) {} template < typename T > - vec2::vec2(const vec4& other) noexcept + constexpr vec2::vec2(const vec4& other) noexcept : x(other.x) , y(other.y) {} @@ -202,22 +198,22 @@ namespace e2d // template < typename T > - vec2 make_vec2(T v) noexcept { + constexpr vec2 make_vec2(T v) noexcept { return vec2(v); } template < typename T > - vec2 make_vec2(T x, T y) noexcept { + constexpr vec2 make_vec2(T x, T y) noexcept { return vec2(x, y); } template < typename T > - vec2 make_vec2(const vec3& other) noexcept { + constexpr vec2 make_vec2(const vec3& other) noexcept { return vec2(other); } template < typename T > - vec2 make_vec2(const vec4& other) noexcept { + constexpr vec2 make_vec2(const vec4& other) noexcept { return vec2(other); } diff --git a/headers/enduro2d/math/vec3.hpp b/headers/enduro2d/math/vec3.hpp index ebf14812..e77ac92e 100644 --- a/headers/enduro2d/math/vec3.hpp +++ b/headers/enduro2d/math/vec3.hpp @@ -25,20 +25,20 @@ namespace e2d T y = 0; T z = 0; public: - static const vec3& zero() noexcept; - static const vec3& unit() noexcept; - static const vec3& unit_x() noexcept; - static const vec3& unit_y() noexcept; - static const vec3& unit_z() noexcept; + static constexpr vec3 zero() noexcept; + static constexpr vec3 unit() noexcept; + static constexpr vec3 unit_x() noexcept; + static constexpr vec3 unit_y() noexcept; + static constexpr vec3 unit_z() noexcept; public: - vec3() noexcept = default; - vec3(const vec3& other) noexcept = default; - vec3& operator=(const vec3& other) noexcept = default; + constexpr vec3() noexcept = default; + constexpr vec3(const vec3& other) noexcept = default; + constexpr vec3& operator=(const vec3& other) noexcept = default; - explicit vec3(T v) noexcept; - vec3(T x, T y, T z) noexcept; - explicit vec3(const vec2& other, T z) noexcept; - explicit vec3(const vec4& other) noexcept; + constexpr explicit vec3(T v) noexcept; + constexpr vec3(T x, T y, T z) noexcept; + constexpr explicit vec3(const vec2& other, T z) noexcept; + constexpr explicit vec3(const vec4& other) noexcept; template < typename To > vec3 cast_to() const noexcept; @@ -64,55 +64,50 @@ namespace e2d namespace e2d { template < typename T > - const vec3& vec3::zero() noexcept { - static const vec3 zero{0, 0, 0}; - return zero; + constexpr vec3 vec3::zero() noexcept { + return {0, 0, 0}; } template < typename T > - const vec3& vec3::unit() noexcept { - static const vec3 unit{1, 1, 1}; - return unit; + constexpr vec3 vec3::unit() noexcept { + return {1, 1, 1}; } template < typename T > - const vec3& vec3::unit_x() noexcept { - static const vec3 unit_x{1, 0, 0}; - return unit_x; + constexpr vec3 vec3::unit_x() noexcept { + return {1, 0, 0}; } template < typename T > - const vec3& vec3::unit_y() noexcept { - static const vec3 unit_y{0, 1, 0}; - return unit_y; + constexpr vec3 vec3::unit_y() noexcept { + return {0, 1, 0}; } template < typename T > - const vec3& vec3::unit_z() noexcept { - static const vec3 unit_z{0, 0, 1}; - return unit_z; + constexpr vec3 vec3::unit_z() noexcept { + return {0, 0, 1}; } template < typename T > - vec3::vec3(T v) noexcept + constexpr vec3::vec3(T v) noexcept : x(v) , y(v) , z(v) {} template < typename T > - vec3::vec3(T nx, T ny, T nz) noexcept + constexpr vec3::vec3(T nx, T ny, T nz) noexcept : x(nx) , y(ny) , z(nz) {} template < typename T > - vec3::vec3(const vec2& other, T nz) noexcept + constexpr vec3::vec3(const vec2& other, T nz) noexcept : x(other.x) , y(other.y) , z(nz) {} template < typename T > - vec3::vec3(const vec4& other) noexcept + constexpr vec3::vec3(const vec4& other) noexcept : x(other.x) , y(other.y) , z(other.z) {} @@ -224,22 +219,22 @@ namespace e2d // template < typename T > - vec3 make_vec3(T v) noexcept { + constexpr vec3 make_vec3(T v) noexcept { return vec3(v); } template < typename T > - vec3 make_vec3(T x, T y, T z) noexcept { + constexpr vec3 make_vec3(T x, T y, T z) noexcept { return vec3(x, y, z); } template < typename T > - vec3 make_vec3(const vec2& other, T z) noexcept { + constexpr vec3 make_vec3(const vec2& other, T z) noexcept { return vec3(other, z); } template < typename T > - vec3 make_vec3(const vec4& other) noexcept { + constexpr vec3 make_vec3(const vec4& other) noexcept { return vec3(other); } diff --git a/headers/enduro2d/math/vec4.hpp b/headers/enduro2d/math/vec4.hpp index 83c8c812..86459d79 100644 --- a/headers/enduro2d/math/vec4.hpp +++ b/headers/enduro2d/math/vec4.hpp @@ -26,21 +26,21 @@ namespace e2d T z = 0; T w = 0; public: - static const vec4& zero() noexcept; - static const vec4& unit() noexcept; - static const vec4& unit_x() noexcept; - static const vec4& unit_y() noexcept; - static const vec4& unit_z() noexcept; - static const vec4& unit_w() noexcept; + static constexpr vec4 zero() noexcept; + static constexpr vec4 unit() noexcept; + static constexpr vec4 unit_x() noexcept; + static constexpr vec4 unit_y() noexcept; + static constexpr vec4 unit_z() noexcept; + static constexpr vec4 unit_w() noexcept; public: - vec4() noexcept = default; - vec4(const vec4& other) noexcept = default; - vec4& operator=(const vec4& other) noexcept = default; + constexpr vec4() noexcept = default; + constexpr vec4(const vec4& other) noexcept = default; + constexpr vec4& operator=(const vec4& other) noexcept = default; - explicit vec4(T v) noexcept; - vec4(T x, T y, T z, T w) noexcept; - explicit vec4(const vec2& other, T z, T w) noexcept; - explicit vec4(const vec3& other, T w) noexcept; + constexpr explicit vec4(T v) noexcept; + constexpr vec4(T x, T y, T z, T w) noexcept; + constexpr explicit vec4(const vec2& other, T z, T w) noexcept; + constexpr explicit vec4(const vec3& other, T w) noexcept; template < typename To > vec4 cast_to() const noexcept; @@ -66,64 +66,58 @@ namespace e2d namespace e2d { template < typename T > - const vec4& vec4::zero() noexcept { - static const vec4 zero{0, 0, 0, 0}; - return zero; + constexpr vec4 vec4::zero() noexcept { + return {0, 0, 0, 0}; } template < typename T > - const vec4& vec4::unit() noexcept { - static const vec4 unit{1, 1, 1, 1}; - return unit; + constexpr vec4 vec4::unit() noexcept { + return {1, 1, 1, 1}; } template < typename T > - const vec4& vec4::unit_x() noexcept { - static const vec4 unit_x{1, 0, 0, 0}; - return unit_x; + constexpr vec4 vec4::unit_x() noexcept { + return {1, 0, 0, 0}; } template < typename T > - const vec4& vec4::unit_y() noexcept { - static const vec4 unit_y{0, 1, 0, 0}; - return unit_y; + constexpr vec4 vec4::unit_y() noexcept { + return {0, 1, 0, 0}; } template < typename T > - const vec4& vec4::unit_z() noexcept { - static const vec4 unit_z{0, 0, 1, 0}; - return unit_z; + constexpr vec4 vec4::unit_z() noexcept { + return {0, 0, 1, 0}; } template < typename T > - const vec4& vec4::unit_w() noexcept { - static const vec4 unit_w{0, 0, 0, 1}; - return unit_w; + constexpr vec4 vec4::unit_w() noexcept { + return {0, 0, 0, 1}; } template < typename T > - vec4::vec4(T v) noexcept + constexpr vec4::vec4(T v) noexcept : x(v) , y(v) , z(v) , w(v) {} template < typename T > - vec4::vec4(T nx, T ny, T nz, T nw) noexcept + constexpr vec4::vec4(T nx, T ny, T nz, T nw) noexcept : x(nx) , y(ny) , z(nz) , w(nw) {} template < typename T > - vec4::vec4(const vec2& other, T nz, T nw) noexcept + constexpr vec4::vec4(const vec2& other, T nz, T nw) noexcept : x(other.x) , y(other.y) , z(nz) , w(nw) {} template < typename T > - vec4::vec4(const vec3& other, T nw) noexcept + constexpr vec4::vec4(const vec3& other, T nw) noexcept : x(other.x) , y(other.y) , z(other.z) @@ -246,22 +240,22 @@ namespace e2d // template < typename T > - vec4 make_vec4(T v) noexcept { + constexpr vec4 make_vec4(T v) noexcept { return vec4(v); } template < typename T > - vec4 make_vec4(T x, T y, T z, T w) noexcept { + constexpr vec4 make_vec4(T x, T y, T z, T w) noexcept { return vec4(x, y, z, w); } template < typename T > - vec4 make_vec4(const vec2& other, T z, T w) noexcept { + constexpr vec4 make_vec4(const vec2& other, T z, T w) noexcept { return vec4(other, z, w); } template < typename T > - vec4 make_vec4(const vec3& other, T w) noexcept { + constexpr vec4 make_vec4(const vec3& other, T w) noexcept { return vec4(other, w); } diff --git a/sources/enduro2d/high/bindings/math_binds.cpp b/sources/enduro2d/high/bindings/math_binds.cpp index 0e4d3bb1..0cd9e4d1 100644 --- a/sources/enduro2d/high/bindings/math_binds.cpp +++ b/sources/enduro2d/high/bindings/math_binds.cpp @@ -29,10 +29,26 @@ namespace sol::meta_function::less_than_or_equal_to, sol::resolve&, const vec2&)>(::operator<=), sol::meta_function::unary_minus, sol::resolve(const vec2&)>(::operator-), - sol::meta_function::addition, sol::resolve(const vec2&, const vec2&)>(::operator+), - sol::meta_function::subtraction, sol::resolve(const vec2&, const vec2&)>(::operator-), - sol::meta_function::multiplication, sol::resolve(const vec2&, const vec2&)>(::operator*), - sol::meta_function::division, sol::resolve(const vec2&, const vec2&)>(::operator/), + + sol::meta_function::addition, sol::overload( + sol::resolve(T, const vec2&)>(::operator+), + sol::resolve(const vec2&, T)>(::operator+), + sol::resolve(const vec2&, const vec2&)>(::operator+)), + + sol::meta_function::subtraction, sol::overload( + sol::resolve(T, const vec2&)>(::operator-), + sol::resolve(const vec2&, T)>(::operator-), + sol::resolve(const vec2&, const vec2&)>(::operator-)), + + sol::meta_function::multiplication, sol::overload( + sol::resolve(T, const vec2&)>(::operator*), + sol::resolve(const vec2&, T)>(::operator*), + sol::resolve(const vec2&, const vec2&)>(::operator*)), + + sol::meta_function::division, sol::overload( + sol::resolve(T, const vec2&)>(::operator/), + sol::resolve(const vec2&, T)>(::operator/), + sol::resolve(const vec2&, const vec2&)>(::operator/)), "approximately", [](const vec2& l, const vec2& r){ return math::approximately(l,r); }, @@ -82,16 +98,35 @@ namespace sol::meta_function::less_than_or_equal_to, sol::resolve&, const vec3&)>(::operator<=), sol::meta_function::unary_minus, sol::resolve(const vec3&)>(::operator-), - sol::meta_function::addition, sol::resolve(const vec3&, const vec3&)>(::operator+), - sol::meta_function::subtraction, sol::resolve(const vec3&, const vec3&)>(::operator-), - sol::meta_function::multiplication, sol::resolve(const vec3&, const vec3&)>(::operator*), - sol::meta_function::division, sol::resolve(const vec3&, const vec3&)>(::operator/), + + sol::meta_function::addition, sol::overload( + sol::resolve(T, const vec3&)>(::operator+), + sol::resolve(const vec3&, T)>(::operator+), + sol::resolve(const vec3&, const vec3&)>(::operator+)), + + sol::meta_function::subtraction, sol::overload( + sol::resolve(T, const vec3&)>(::operator-), + sol::resolve(const vec3&, T)>(::operator-), + sol::resolve(const vec3&, const vec3&)>(::operator-)), + + sol::meta_function::multiplication, sol::overload( + sol::resolve(T, const vec3&)>(::operator*), + sol::resolve(const vec3&, T)>(::operator*), + sol::resolve(const vec3&, const vec3&)>(::operator*), + sol::resolve(const vec3&, const quat&)>(::operator*)), + + sol::meta_function::division, sol::overload( + sol::resolve(T, const vec3&)>(::operator/), + sol::resolve(const vec3&, T)>(::operator/), + sol::resolve(const vec3&, const vec3&)>(::operator/)), "approximately", [](const vec3& l, const vec3& r){ return math::approximately(l,r); }, "dot", sol::resolve&, const vec3&)>(&math::dot), "abs_dot", sol::resolve&, const vec3&)>(&math::abs_dot), + "cross", sol::resolve(const vec3&, const vec3&)>(&math::cross), + "length_squared", sol::resolve&)>(&math::length_squared), "length", sol::resolve&)>(&math::length), @@ -136,10 +171,26 @@ namespace sol::meta_function::less_than_or_equal_to, sol::resolve&, const vec4&)>(::operator<=), sol::meta_function::unary_minus, sol::resolve(const vec4&)>(::operator-), - sol::meta_function::addition, sol::resolve(const vec4&, const vec4&)>(::operator+), - sol::meta_function::subtraction, sol::resolve(const vec4&, const vec4&)>(::operator-), - sol::meta_function::multiplication, sol::resolve(const vec4&, const vec4&)>(::operator*), - sol::meta_function::division, sol::resolve(const vec4&, const vec4&)>(::operator/), + + sol::meta_function::addition, sol::overload( + sol::resolve(T, const vec4&)>(::operator+), + sol::resolve(const vec4&, T)>(::operator+), + sol::resolve(const vec4&, const vec4&)>(::operator+)), + + sol::meta_function::subtraction, sol::overload( + sol::resolve(T, const vec4&)>(::operator-), + sol::resolve(const vec4&, T)>(::operator-), + sol::resolve(const vec4&, const vec4&)>(::operator-)), + + sol::meta_function::multiplication, sol::overload( + sol::resolve(T, const vec4&)>(::operator*), + sol::resolve(const vec4&, T)>(::operator*), + sol::resolve(const vec4&, const vec4&)>(::operator*)), + + sol::meta_function::division, sol::overload( + sol::resolve(T, const vec4&)>(::operator/), + sol::resolve(const vec4&, T)>(::operator/), + sol::resolve(const vec4&, const vec4&)>(::operator/)), "approximately", [](const vec4& l, const vec4& r){ return math::approximately(l,r); }, @@ -168,6 +219,97 @@ namespace "contains_nan", sol::resolve&)>(&math::contains_nan)); } + + template < typename T > + void bind_quat(const str& name, sol::state& l) { + l.new_usertype>(name, + sol::constructors< + quat(), + quat(quat), + quat(T,T,T,T), + quat(vec4)>(), + + "x", &quat::x, + "y", &quat::y, + "z", &quat::z, + "w", &quat::w, + + sol::meta_function::equal_to, sol::resolve&, const quat&)>(::operator==), + sol::meta_function::less_than, sol::resolve&, const quat&)>(::operator<), + sol::meta_function::less_than_or_equal_to, sol::resolve&, const quat&)>(::operator<=), + + sol::meta_function::addition, sol::overload( + sol::resolve(T, const quat&)>(::operator+), + sol::resolve(const quat&, T)>(::operator+), + sol::resolve(const quat&, const quat&)>(::operator+)), + + sol::meta_function::multiplication, sol::overload( + sol::resolve(T, const quat&)>(::operator*), + sol::resolve(const quat&, T)>(::operator*), + sol::resolve(const quat&, const quat&)>(::operator*)), + + "make_quat_from_axis_angle", sol::overload( + sol::resolve(const deg&, const vec3&)>(&math::make_quat_from_axis_angle), + sol::resolve(const rad&, const vec3&)>(&math::make_quat_from_axis_angle)), + + "make_quat_from_euler_angles", sol::overload( + sol::resolve(const deg&, const deg&, const deg&)>(&math::make_quat_from_euler_angles), + sol::resolve(const rad&, const rad&, const rad&)>(&math::make_quat_from_euler_angles)), + + "approximately", [](const quat& l, const quat& r){ return math::approximately(l,r); }, + + "dot", sol::resolve&, const quat&)>(&math::dot), + "abs_dot", sol::resolve&, const quat&)>(&math::abs_dot), + + "length_squared", sol::resolve&)>(&math::length_squared), + "length", sol::resolve&)>(&math::length), + + "normalized", [](const quat& v){ return math::normalized(v); }, + + "lerp", sol::resolve(const quat&, const quat&, T)>(&math::lerp), + + "inversed", [](const quat& v){ return math::inversed(v); }, + "conjugated", [](const quat& v){ return math::conjugated(v); }, + + "contains_nan", sol::resolve&)>(&math::contains_nan)); + } + + template < typename T, typename Tag > + void bind_unit(const str& name, sol::state& l) { + l.new_usertype>(name, + sol::constructors< + unit(), + unit(T), + unit(unit)>(), + + "value", &unit::value, + + sol::meta_function::equal_to, sol::resolve&, const unit&)>(::operator==), + sol::meta_function::less_than, sol::resolve&, const unit&)>(::operator<), + sol::meta_function::less_than_or_equal_to, sol::resolve&, const unit&)>(::operator<=), + + sol::meta_function::unary_minus, sol::resolve(const unit&)>(::operator-), + + sol::meta_function::multiplication, sol::overload( + sol::resolve(T, const unit&)>(::operator*), + sol::resolve(const unit&, T)>(::operator*)), + + sol::meta_function::division, sol::overload( + sol::resolve(T, const unit&)>(::operator/), + sol::resolve(const unit&, T)>(::operator/)), + + sol::meta_function::addition, sol::resolve(const unit&, const unit&)>(::operator+), + sol::meta_function::subtraction, sol::resolve(const unit&, const unit&)>(::operator-), + + "approximately", [](const unit& l, const unit& r){ return math::approximately(l,r); }, + + "minimized", sol::resolve(const unit&, const unit&)>(&math::minimized), + "maximized", sol::resolve(const unit&, const unit&)>(&math::maximized), + "clamped", sol::resolve(const unit&, const unit&, const unit&)>(&math::clamped), + "saturated", sol::resolve(const unit&)>(&math::saturated), + + "contains_nan", sol::resolve&)>(&math::contains_nan)); + } } namespace e2d::bindings @@ -176,5 +318,8 @@ namespace e2d::bindings bind_vec2("v2f", l); bind_vec3("v3f", l); bind_vec4("v4f", l); + bind_quat("q4f", l); + bind_unit("degf", l); + bind_unit("radf", l); } } diff --git a/untests/sources/untests_high/luasol.cpp b/untests/sources/untests_high/luasol.cpp index 8d65d3e6..d839293d 100644 --- a/untests/sources/untests_high/luasol.cpp +++ b/untests/sources/untests_high/luasol.cpp @@ -27,21 +27,29 @@ namespace TEST_CASE("luasol") { safe_starter_initializer initializer; luasol& l = the(); + SECTION("vec2/vec3/vec4") { v2f r0 = l.lua().script(R"lua( local v = v2f.new(1,2) - return v2f.new((v + v).y) + return v2f.new((v + v + 2).y) )lua"); v3f r1 = l.lua().script(R"lua( local v = v3f.new(1,2,3) - return v3f.new((v + v).y) + return v3f.new((v + v + 2).y) )lua"); v4f r2 = l.lua().script(R"lua( local v = v4f.new(1,2,3,4) - return v4f.new((v + v).y) + return v4f.new((v + v + 2).y) )lua"); - REQUIRE(r0 == v2f(4)); - REQUIRE(r1 == v3f(4)); - REQUIRE(r2 == v4f(4)); + REQUIRE(r0 == v2f(6)); + REQUIRE(r1 == v3f(6)); + REQUIRE(r2 == v4f(6)); + } + + SECTION("quat") { + v3f r0 = l.lua().script(R"lua( + return v3f.new(1,2,3) * q4f.make_quat_from_axis_angle(radf.new(10), v3f.new(1,2,3)) + )lua"); + REQUIRE(r0 == v3f(1,2,3) * math::make_quat_from_axis_angle(radf(10.f), v3f(1,2,3))); } }