add quat and unit bindings

This commit is contained in:
2019-10-03 22:52:25 +07:00
parent 7c11a2fb20
commit 496a8725b2
8 changed files with 288 additions and 148 deletions

View File

@@ -136,6 +136,9 @@ namespace e2d
using deg = unit<T, deg_tag>;
template < typename T >
using rad = unit<T, rad_tag>;
using degf = deg<f32>;
using radf = rad<f32>;
}
namespace e2d::math

View File

@@ -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<T>& other) noexcept;
constexpr quat(T x, T y, T z, T w) noexcept;
constexpr explicit quat(const vec4<T>& other) noexcept;
template < typename To >
quat<To> cast_to() const noexcept;
@@ -58,26 +58,24 @@ namespace e2d
namespace e2d
{
template < typename T >
const quat<T>& quat<T>::zero() noexcept {
static const quat<T> zero{0, 0, 0, 0};
return zero;
constexpr quat<T> quat<T>::zero() noexcept {
return {0, 0, 0, 0};
}
template < typename T >
const quat<T>& quat<T>::identity() noexcept {
static const quat<T> identity{0, 0, 0, 1};
return identity;
constexpr quat<T> quat<T>::identity() noexcept {
return {0, 0, 0, 1};
}
template < typename T >
quat<T>::quat(T nx, T ny, T nz, T nw) noexcept
constexpr quat<T>::quat(T nx, T ny, T nz, T nw) noexcept
: x(nx)
, y(ny)
, z(nz)
, w(nw) {}
template < typename T >
quat<T>::quat(const vec4<T>& other) noexcept
constexpr quat<T>::quat(const vec4<T>& other) noexcept
: x(other.x)
, y(other.y)
, z(other.z)
@@ -143,12 +141,12 @@ namespace e2d
//
template < typename T >
quat<T> make_quat(T x, T y, T z, T w) noexcept {
constexpr quat<T> make_quat(T x, T y, T z, T w) noexcept {
return quat<T>(x, y, z, w);
}
template < typename T >
quat<T> make_quat(const vec4<T>& other) noexcept {
constexpr quat<T> make_quat(const vec4<T>& other) noexcept {
return quat<T>(other);
}

View File

@@ -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<T, OtherTag>& other) noexcept;
@@ -59,11 +60,11 @@ namespace e2d
namespace e2d
{
template < typename T, typename Tag >
unit<T, Tag>::unit(T v) noexcept
constexpr unit<T, Tag>::unit(T v) noexcept
: value(v) {}
template < typename T, typename Tag >
unit<T, Tag>::unit(T v, Tag tag) noexcept
constexpr unit<T, Tag>::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<T, Tag> make_unit(T v) noexcept {
constexpr unit<T, Tag> make_unit(T v) noexcept {
return unit<T, Tag>(v);
}

View File

@@ -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<T>& other) noexcept;
explicit vec2(const vec4<T>& other) noexcept;
constexpr explicit vec2(T v) noexcept;
constexpr vec2(T x, T y) noexcept;
constexpr explicit vec2(const vec3<T>& other) noexcept;
constexpr explicit vec2(const vec4<T>& other) noexcept;
template < typename To >
vec2<To> cast_to() const noexcept;
@@ -62,46 +62,42 @@ namespace e2d
namespace e2d
{
template < typename T >
const vec2<T>& vec2<T>::zero() noexcept {
static const vec2<T> zero{0, 0};
return zero;
constexpr vec2<T> vec2<T>::zero() noexcept {
return {0, 0};
}
template < typename T >
const vec2<T>& vec2<T>::unit() noexcept {
static const vec2<T> unit{1, 1};
return unit;
constexpr vec2<T> vec2<T>::unit() noexcept {
return {1, 1};
}
template < typename T >
const vec2<T>& vec2<T>::unit_x() noexcept {
static const vec2<T> unit_x{1, 0};
return unit_x;
constexpr vec2<T> vec2<T>::unit_x() noexcept {
return {1, 0};
}
template < typename T >
const vec2<T>& vec2<T>::unit_y() noexcept {
static const vec2<T> unit_y{0, 1};
return unit_y;
constexpr vec2<T> vec2<T>::unit_y() noexcept {
return {0, 1};
}
template < typename T >
vec2<T>::vec2(T v) noexcept
constexpr vec2<T>::vec2(T v) noexcept
: x(v)
, y(v) {}
template < typename T >
vec2<T>::vec2(T nx, T ny) noexcept
constexpr vec2<T>::vec2(T nx, T ny) noexcept
: x(nx)
, y(ny) {}
template < typename T >
vec2<T>::vec2(const vec3<T>& other) noexcept
constexpr vec2<T>::vec2(const vec3<T>& other) noexcept
: x(other.x)
, y(other.y) {}
template < typename T >
vec2<T>::vec2(const vec4<T>& other) noexcept
constexpr vec2<T>::vec2(const vec4<T>& other) noexcept
: x(other.x)
, y(other.y) {}
@@ -202,22 +198,22 @@ namespace e2d
//
template < typename T >
vec2<T> make_vec2(T v) noexcept {
constexpr vec2<T> make_vec2(T v) noexcept {
return vec2<T>(v);
}
template < typename T >
vec2<T> make_vec2(T x, T y) noexcept {
constexpr vec2<T> make_vec2(T x, T y) noexcept {
return vec2<T>(x, y);
}
template < typename T >
vec2<T> make_vec2(const vec3<T>& other) noexcept {
constexpr vec2<T> make_vec2(const vec3<T>& other) noexcept {
return vec2<T>(other);
}
template < typename T >
vec2<T> make_vec2(const vec4<T>& other) noexcept {
constexpr vec2<T> make_vec2(const vec4<T>& other) noexcept {
return vec2<T>(other);
}

View File

@@ -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<T>& other, T z) noexcept;
explicit vec3(const vec4<T>& other) noexcept;
constexpr explicit vec3(T v) noexcept;
constexpr vec3(T x, T y, T z) noexcept;
constexpr explicit vec3(const vec2<T>& other, T z) noexcept;
constexpr explicit vec3(const vec4<T>& other) noexcept;
template < typename To >
vec3<To> cast_to() const noexcept;
@@ -64,55 +64,50 @@ namespace e2d
namespace e2d
{
template < typename T >
const vec3<T>& vec3<T>::zero() noexcept {
static const vec3<T> zero{0, 0, 0};
return zero;
constexpr vec3<T> vec3<T>::zero() noexcept {
return {0, 0, 0};
}
template < typename T >
const vec3<T>& vec3<T>::unit() noexcept {
static const vec3<T> unit{1, 1, 1};
return unit;
constexpr vec3<T> vec3<T>::unit() noexcept {
return {1, 1, 1};
}
template < typename T >
const vec3<T>& vec3<T>::unit_x() noexcept {
static const vec3<T> unit_x{1, 0, 0};
return unit_x;
constexpr vec3<T> vec3<T>::unit_x() noexcept {
return {1, 0, 0};
}
template < typename T >
const vec3<T>& vec3<T>::unit_y() noexcept {
static const vec3<T> unit_y{0, 1, 0};
return unit_y;
constexpr vec3<T> vec3<T>::unit_y() noexcept {
return {0, 1, 0};
}
template < typename T >
const vec3<T>& vec3<T>::unit_z() noexcept {
static const vec3<T> unit_z{0, 0, 1};
return unit_z;
constexpr vec3<T> vec3<T>::unit_z() noexcept {
return {0, 0, 1};
}
template < typename T >
vec3<T>::vec3(T v) noexcept
constexpr vec3<T>::vec3(T v) noexcept
: x(v)
, y(v)
, z(v) {}
template < typename T >
vec3<T>::vec3(T nx, T ny, T nz) noexcept
constexpr vec3<T>::vec3(T nx, T ny, T nz) noexcept
: x(nx)
, y(ny)
, z(nz) {}
template < typename T >
vec3<T>::vec3(const vec2<T>& other, T nz) noexcept
constexpr vec3<T>::vec3(const vec2<T>& other, T nz) noexcept
: x(other.x)
, y(other.y)
, z(nz) {}
template < typename T >
vec3<T>::vec3(const vec4<T>& other) noexcept
constexpr vec3<T>::vec3(const vec4<T>& other) noexcept
: x(other.x)
, y(other.y)
, z(other.z) {}
@@ -224,22 +219,22 @@ namespace e2d
//
template < typename T >
vec3<T> make_vec3(T v) noexcept {
constexpr vec3<T> make_vec3(T v) noexcept {
return vec3<T>(v);
}
template < typename T >
vec3<T> make_vec3(T x, T y, T z) noexcept {
constexpr vec3<T> make_vec3(T x, T y, T z) noexcept {
return vec3<T>(x, y, z);
}
template < typename T >
vec3<T> make_vec3(const vec2<T>& other, T z) noexcept {
constexpr vec3<T> make_vec3(const vec2<T>& other, T z) noexcept {
return vec3<T>(other, z);
}
template < typename T >
vec3<T> make_vec3(const vec4<T>& other) noexcept {
constexpr vec3<T> make_vec3(const vec4<T>& other) noexcept {
return vec3<T>(other);
}

View File

@@ -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<T>& other, T z, T w) noexcept;
explicit vec4(const vec3<T>& 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<T>& other, T z, T w) noexcept;
constexpr explicit vec4(const vec3<T>& other, T w) noexcept;
template < typename To >
vec4<To> cast_to() const noexcept;
@@ -66,64 +66,58 @@ namespace e2d
namespace e2d
{
template < typename T >
const vec4<T>& vec4<T>::zero() noexcept {
static const vec4<T> zero{0, 0, 0, 0};
return zero;
constexpr vec4<T> vec4<T>::zero() noexcept {
return {0, 0, 0, 0};
}
template < typename T >
const vec4<T>& vec4<T>::unit() noexcept {
static const vec4<T> unit{1, 1, 1, 1};
return unit;
constexpr vec4<T> vec4<T>::unit() noexcept {
return {1, 1, 1, 1};
}
template < typename T >
const vec4<T>& vec4<T>::unit_x() noexcept {
static const vec4<T> unit_x{1, 0, 0, 0};
return unit_x;
constexpr vec4<T> vec4<T>::unit_x() noexcept {
return {1, 0, 0, 0};
}
template < typename T >
const vec4<T>& vec4<T>::unit_y() noexcept {
static const vec4<T> unit_y{0, 1, 0, 0};
return unit_y;
constexpr vec4<T> vec4<T>::unit_y() noexcept {
return {0, 1, 0, 0};
}
template < typename T >
const vec4<T>& vec4<T>::unit_z() noexcept {
static const vec4<T> unit_z{0, 0, 1, 0};
return unit_z;
constexpr vec4<T> vec4<T>::unit_z() noexcept {
return {0, 0, 1, 0};
}
template < typename T >
const vec4<T>& vec4<T>::unit_w() noexcept {
static const vec4<T> unit_w{0, 0, 0, 1};
return unit_w;
constexpr vec4<T> vec4<T>::unit_w() noexcept {
return {0, 0, 0, 1};
}
template < typename T >
vec4<T>::vec4(T v) noexcept
constexpr vec4<T>::vec4(T v) noexcept
: x(v)
, y(v)
, z(v)
, w(v) {}
template < typename T >
vec4<T>::vec4(T nx, T ny, T nz, T nw) noexcept
constexpr vec4<T>::vec4(T nx, T ny, T nz, T nw) noexcept
: x(nx)
, y(ny)
, z(nz)
, w(nw) {}
template < typename T >
vec4<T>::vec4(const vec2<T>& other, T nz, T nw) noexcept
constexpr vec4<T>::vec4(const vec2<T>& other, T nz, T nw) noexcept
: x(other.x)
, y(other.y)
, z(nz)
, w(nw) {}
template < typename T >
vec4<T>::vec4(const vec3<T>& other, T nw) noexcept
constexpr vec4<T>::vec4(const vec3<T>& other, T nw) noexcept
: x(other.x)
, y(other.y)
, z(other.z)
@@ -246,22 +240,22 @@ namespace e2d
//
template < typename T >
vec4<T> make_vec4(T v) noexcept {
constexpr vec4<T> make_vec4(T v) noexcept {
return vec4<T>(v);
}
template < typename T >
vec4<T> make_vec4(T x, T y, T z, T w) noexcept {
constexpr vec4<T> make_vec4(T x, T y, T z, T w) noexcept {
return vec4<T>(x, y, z, w);
}
template < typename T >
vec4<T> make_vec4(const vec2<T>& other, T z, T w) noexcept {
constexpr vec4<T> make_vec4(const vec2<T>& other, T z, T w) noexcept {
return vec4<T>(other, z, w);
}
template < typename T >
vec4<T> make_vec4(const vec3<T>& other, T w) noexcept {
constexpr vec4<T> make_vec4(const vec3<T>& other, T w) noexcept {
return vec4<T>(other, w);
}

View File

@@ -29,10 +29,26 @@ namespace
sol::meta_function::less_than_or_equal_to, sol::resolve<bool(const vec2<T>&, const vec2<T>&)>(::operator<=),
sol::meta_function::unary_minus, sol::resolve<vec2<T>(const vec2<T>&)>(::operator-),
sol::meta_function::addition, sol::resolve<vec2<T>(const vec2<T>&, const vec2<T>&)>(::operator+),
sol::meta_function::subtraction, sol::resolve<vec2<T>(const vec2<T>&, const vec2<T>&)>(::operator-),
sol::meta_function::multiplication, sol::resolve<vec2<T>(const vec2<T>&, const vec2<T>&)>(::operator*),
sol::meta_function::division, sol::resolve<vec2<T>(const vec2<T>&, const vec2<T>&)>(::operator/),
sol::meta_function::addition, sol::overload(
sol::resolve<vec2<T>(T, const vec2<T>&)>(::operator+),
sol::resolve<vec2<T>(const vec2<T>&, T)>(::operator+),
sol::resolve<vec2<T>(const vec2<T>&, const vec2<T>&)>(::operator+)),
sol::meta_function::subtraction, sol::overload(
sol::resolve<vec2<T>(T, const vec2<T>&)>(::operator-),
sol::resolve<vec2<T>(const vec2<T>&, T)>(::operator-),
sol::resolve<vec2<T>(const vec2<T>&, const vec2<T>&)>(::operator-)),
sol::meta_function::multiplication, sol::overload(
sol::resolve<vec2<T>(T, const vec2<T>&)>(::operator*),
sol::resolve<vec2<T>(const vec2<T>&, T)>(::operator*),
sol::resolve<vec2<T>(const vec2<T>&, const vec2<T>&)>(::operator*)),
sol::meta_function::division, sol::overload(
sol::resolve<vec2<T>(T, const vec2<T>&)>(::operator/),
sol::resolve<vec2<T>(const vec2<T>&, T)>(::operator/),
sol::resolve<vec2<T>(const vec2<T>&, const vec2<T>&)>(::operator/)),
"approximately", [](const vec2<T>& l, const vec2<T>& r){ return math::approximately(l,r); },
@@ -82,16 +98,35 @@ namespace
sol::meta_function::less_than_or_equal_to, sol::resolve<bool(const vec3<T>&, const vec3<T>&)>(::operator<=),
sol::meta_function::unary_minus, sol::resolve<vec3<T>(const vec3<T>&)>(::operator-),
sol::meta_function::addition, sol::resolve<vec3<T>(const vec3<T>&, const vec3<T>&)>(::operator+),
sol::meta_function::subtraction, sol::resolve<vec3<T>(const vec3<T>&, const vec3<T>&)>(::operator-),
sol::meta_function::multiplication, sol::resolve<vec3<T>(const vec3<T>&, const vec3<T>&)>(::operator*),
sol::meta_function::division, sol::resolve<vec3<T>(const vec3<T>&, const vec3<T>&)>(::operator/),
sol::meta_function::addition, sol::overload(
sol::resolve<vec3<T>(T, const vec3<T>&)>(::operator+),
sol::resolve<vec3<T>(const vec3<T>&, T)>(::operator+),
sol::resolve<vec3<T>(const vec3<T>&, const vec3<T>&)>(::operator+)),
sol::meta_function::subtraction, sol::overload(
sol::resolve<vec3<T>(T, const vec3<T>&)>(::operator-),
sol::resolve<vec3<T>(const vec3<T>&, T)>(::operator-),
sol::resolve<vec3<T>(const vec3<T>&, const vec3<T>&)>(::operator-)),
sol::meta_function::multiplication, sol::overload(
sol::resolve<vec3<T>(T, const vec3<T>&)>(::operator*),
sol::resolve<vec3<T>(const vec3<T>&, T)>(::operator*),
sol::resolve<vec3<T>(const vec3<T>&, const vec3<T>&)>(::operator*),
sol::resolve<vec3<T>(const vec3<T>&, const quat<T>&)>(::operator*)),
sol::meta_function::division, sol::overload(
sol::resolve<vec3<T>(T, const vec3<T>&)>(::operator/),
sol::resolve<vec3<T>(const vec3<T>&, T)>(::operator/),
sol::resolve<vec3<T>(const vec3<T>&, const vec3<T>&)>(::operator/)),
"approximately", [](const vec3<T>& l, const vec3<T>& r){ return math::approximately(l,r); },
"dot", sol::resolve<T(const vec3<T>&, const vec3<T>&)>(&math::dot),
"abs_dot", sol::resolve<T(const vec3<T>&, const vec3<T>&)>(&math::abs_dot),
"cross", sol::resolve<vec3<T>(const vec3<T>&, const vec3<T>&)>(&math::cross),
"length_squared", sol::resolve<T(const vec3<T>&)>(&math::length_squared),
"length", sol::resolve<T(const vec3<T>&)>(&math::length),
@@ -136,10 +171,26 @@ namespace
sol::meta_function::less_than_or_equal_to, sol::resolve<bool(const vec4<T>&, const vec4<T>&)>(::operator<=),
sol::meta_function::unary_minus, sol::resolve<vec4<T>(const vec4<T>&)>(::operator-),
sol::meta_function::addition, sol::resolve<vec4<T>(const vec4<T>&, const vec4<T>&)>(::operator+),
sol::meta_function::subtraction, sol::resolve<vec4<T>(const vec4<T>&, const vec4<T>&)>(::operator-),
sol::meta_function::multiplication, sol::resolve<vec4<T>(const vec4<T>&, const vec4<T>&)>(::operator*),
sol::meta_function::division, sol::resolve<vec4<T>(const vec4<T>&, const vec4<T>&)>(::operator/),
sol::meta_function::addition, sol::overload(
sol::resolve<vec4<T>(T, const vec4<T>&)>(::operator+),
sol::resolve<vec4<T>(const vec4<T>&, T)>(::operator+),
sol::resolve<vec4<T>(const vec4<T>&, const vec4<T>&)>(::operator+)),
sol::meta_function::subtraction, sol::overload(
sol::resolve<vec4<T>(T, const vec4<T>&)>(::operator-),
sol::resolve<vec4<T>(const vec4<T>&, T)>(::operator-),
sol::resolve<vec4<T>(const vec4<T>&, const vec4<T>&)>(::operator-)),
sol::meta_function::multiplication, sol::overload(
sol::resolve<vec4<T>(T, const vec4<T>&)>(::operator*),
sol::resolve<vec4<T>(const vec4<T>&, T)>(::operator*),
sol::resolve<vec4<T>(const vec4<T>&, const vec4<T>&)>(::operator*)),
sol::meta_function::division, sol::overload(
sol::resolve<vec4<T>(T, const vec4<T>&)>(::operator/),
sol::resolve<vec4<T>(const vec4<T>&, T)>(::operator/),
sol::resolve<vec4<T>(const vec4<T>&, const vec4<T>&)>(::operator/)),
"approximately", [](const vec4<T>& l, const vec4<T>& r){ return math::approximately(l,r); },
@@ -168,6 +219,97 @@ namespace
"contains_nan", sol::resolve<bool(const vec4<T>&)>(&math::contains_nan));
}
template < typename T >
void bind_quat(const str& name, sol::state& l) {
l.new_usertype<quat<T>>(name,
sol::constructors<
quat<T>(),
quat<T>(quat<T>),
quat<T>(T,T,T,T),
quat<T>(vec4<T>)>(),
"x", &quat<T>::x,
"y", &quat<T>::y,
"z", &quat<T>::z,
"w", &quat<T>::w,
sol::meta_function::equal_to, sol::resolve<bool(const quat<T>&, const quat<T>&)>(::operator==),
sol::meta_function::less_than, sol::resolve<bool(const quat<T>&, const quat<T>&)>(::operator<),
sol::meta_function::less_than_or_equal_to, sol::resolve<bool(const quat<T>&, const quat<T>&)>(::operator<=),
sol::meta_function::addition, sol::overload(
sol::resolve<quat<T>(T, const quat<T>&)>(::operator+),
sol::resolve<quat<T>(const quat<T>&, T)>(::operator+),
sol::resolve<quat<T>(const quat<T>&, const quat<T>&)>(::operator+)),
sol::meta_function::multiplication, sol::overload(
sol::resolve<quat<T>(T, const quat<T>&)>(::operator*),
sol::resolve<quat<T>(const quat<T>&, T)>(::operator*),
sol::resolve<quat<T>(const quat<T>&, const quat<T>&)>(::operator*)),
"make_quat_from_axis_angle", sol::overload(
sol::resolve<quat<T>(const deg<T>&, const vec3<T>&)>(&math::make_quat_from_axis_angle),
sol::resolve<quat<T>(const rad<T>&, const vec3<T>&)>(&math::make_quat_from_axis_angle)),
"make_quat_from_euler_angles", sol::overload(
sol::resolve<quat<T>(const deg<T>&, const deg<T>&, const deg<T>&)>(&math::make_quat_from_euler_angles),
sol::resolve<quat<T>(const rad<T>&, const rad<T>&, const rad<T>&)>(&math::make_quat_from_euler_angles)),
"approximately", [](const quat<T>& l, const quat<T>& r){ return math::approximately(l,r); },
"dot", sol::resolve<T(const quat<T>&, const quat<T>&)>(&math::dot),
"abs_dot", sol::resolve<T(const quat<T>&, const quat<T>&)>(&math::abs_dot),
"length_squared", sol::resolve<T(const quat<T>&)>(&math::length_squared),
"length", sol::resolve<T(const quat<T>&)>(&math::length),
"normalized", [](const quat<T>& v){ return math::normalized(v); },
"lerp", sol::resolve<quat<T>(const quat<T>&, const quat<T>&, T)>(&math::lerp),
"inversed", [](const quat<T>& v){ return math::inversed(v); },
"conjugated", [](const quat<T>& v){ return math::conjugated(v); },
"contains_nan", sol::resolve<bool(const quat<T>&)>(&math::contains_nan));
}
template < typename T, typename Tag >
void bind_unit(const str& name, sol::state& l) {
l.new_usertype<unit<T,Tag>>(name,
sol::constructors<
unit<T,Tag>(),
unit<T,Tag>(T),
unit<T,Tag>(unit<T,Tag>)>(),
"value", &unit<T,Tag>::value,
sol::meta_function::equal_to, sol::resolve<bool(const unit<T,Tag>&, const unit<T,Tag>&)>(::operator==),
sol::meta_function::less_than, sol::resolve<bool(const unit<T,Tag>&, const unit<T,Tag>&)>(::operator<),
sol::meta_function::less_than_or_equal_to, sol::resolve<bool(const unit<T,Tag>&, const unit<T,Tag>&)>(::operator<=),
sol::meta_function::unary_minus, sol::resolve<unit<T,Tag>(const unit<T,Tag>&)>(::operator-),
sol::meta_function::multiplication, sol::overload(
sol::resolve<unit<T,Tag>(T, const unit<T,Tag>&)>(::operator*),
sol::resolve<unit<T,Tag>(const unit<T,Tag>&, T)>(::operator*)),
sol::meta_function::division, sol::overload(
sol::resolve<unit<T,Tag>(T, const unit<T,Tag>&)>(::operator/),
sol::resolve<unit<T,Tag>(const unit<T,Tag>&, T)>(::operator/)),
sol::meta_function::addition, sol::resolve<unit<T,Tag>(const unit<T,Tag>&, const unit<T,Tag>&)>(::operator+),
sol::meta_function::subtraction, sol::resolve<unit<T,Tag>(const unit<T,Tag>&, const unit<T,Tag>&)>(::operator-),
"approximately", [](const unit<T,Tag>& l, const unit<T,Tag>& r){ return math::approximately(l,r); },
"minimized", sol::resolve<unit<T,Tag>(const unit<T,Tag>&, const unit<T,Tag>&)>(&math::minimized),
"maximized", sol::resolve<unit<T,Tag>(const unit<T,Tag>&, const unit<T,Tag>&)>(&math::maximized),
"clamped", sol::resolve<unit<T,Tag>(const unit<T,Tag>&, const unit<T,Tag>&, const unit<T,Tag>&)>(&math::clamped),
"saturated", sol::resolve<unit<T,Tag>(const unit<T,Tag>&)>(&math::saturated),
"contains_nan", sol::resolve<bool(const unit<T,Tag>&)>(&math::contains_nan));
}
}
namespace e2d::bindings
@@ -176,5 +318,8 @@ namespace e2d::bindings
bind_vec2<f32>("v2f", l);
bind_vec3<f32>("v3f", l);
bind_vec4<f32>("v4f", l);
bind_quat<f32>("q4f", l);
bind_unit<f32, deg_tag>("degf", l);
bind_unit<f32, rad_tag>("radf", l);
}
}

View File

@@ -27,21 +27,29 @@ namespace
TEST_CASE("luasol") {
safe_starter_initializer initializer;
luasol& l = the<luasol>();
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)));
}
}