3#include <litefx/core.h>
5#if !defined (LITEFX_MATH_API)
6# if defined(LiteFX_Math_EXPORTS) && (defined _WIN32 || defined WINCE)
7# define LITEFX_MATH_API __declspec(dllexport)
8# elif (defined(LiteFX_Math_EXPORTS) || defined(__APPLE__)) && defined __GNUC__ && __GNUC__ >= 4
9# define LITEFX_MATH_API __attribute__ ((visibility ("default")))
10# elif !defined(LiteFX_Math_EXPORTS) && (defined _WIN32 || defined WINCE)
11# define LITEFX_MATH_API __declspec(dllimport)
15#ifndef LITEFX_MATH_API
16# define LITEFX_MATH_API
19#if defined(LITEFX_BUILD_WITH_GLM)
23#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
24#include <DirectXMath.h>
27#include <litefx/vector.hpp>
28#include <litefx/matrix.hpp>
88 constexpr Byte operator ""_b(
unsigned long long int arg)
noexcept {
89 return static_cast<Byte>(arg);
97 constexpr UInt8 operator ""_ui8(
unsigned long long int arg)
noexcept {
98 return static_cast<UInt8>(arg);
106 constexpr Int16 operator ""_i16(
unsigned long long int arg)
noexcept {
107 return static_cast<Int16>(arg);
115 constexpr UInt16 operator ""_ui16(
unsigned long long int arg)
noexcept {
116 return static_cast<UInt16>(arg);
124 constexpr Int32 operator ""_i32(
unsigned long long int arg)
noexcept {
125 return static_cast<Int32>(arg);
133 constexpr UInt32 operator ""_ui32(
unsigned long long int arg)
noexcept {
134 return static_cast<UInt32>(arg);
142 constexpr Int64 operator ""_i64(
unsigned long long int arg)
noexcept {
143 return static_cast<Int64>(arg);
151 constexpr UInt64 operator ""_ui64(
unsigned long long int arg)
noexcept {
152 return static_cast<UInt64>(arg);
160 constexpr Float operator ""_f32(
long double arg)
noexcept {
161 return static_cast<Float>(arg);
169 constexpr Double operator ""_f64(
long double arg)
noexcept {
170 return static_cast<Double>(arg);
180 template <
typename T = UInt32>
181 static constexpr T align(T size, T alignment) {
182 return (size + alignment - 1) & ~(alignment - 1);
191 using Vector::Vector;
193#if defined(LITEFX_BUILD_WITH_GLM)
199 Vector1f(
const glm::f32vec1& v)
noexcept;
205 Vector1f(glm::f32vec1&& v)
noexcept;
210 operator glm::f32vec1()
const noexcept;
213#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
219 Vector1f(
const DirectX::XMVECTOR& v)
noexcept;
225 Vector1f(DirectX::XMVECTOR&& v)
noexcept;
230 operator DirectX::XMVECTOR()
const noexcept;
241 using Vector::Vector;
243#if defined(LITEFX_BUILD_WITH_GLM)
249 Vector1u(
const glm::u32vec1& v)
noexcept;
255 Vector1u(glm::u32vec1&& v)
noexcept;
260 operator glm::u32vec1()
const noexcept;
263#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
269 Vector1u(
const DirectX::XMVECTOR& v)
noexcept;
275 Vector1u(DirectX::XMVECTOR&& v)
noexcept;
280 operator DirectX::XMVECTOR()
const noexcept;
289 using Vector::Vector;
291#if defined(LITEFX_BUILD_WITH_GLM)
297 Vector2f(
const glm::f32vec2& v)
noexcept;
303 Vector2f(glm::f32vec2&& v)
noexcept;
308 operator glm::f32vec2()
const noexcept;
311#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
317 Vector2f(
const DirectX::XMVECTOR& v)
noexcept;
323 Vector2f(DirectX::XMVECTOR&& v)
noexcept;
329 Vector2f(
const DirectX::XMFLOAT2& v)
noexcept;
335 Vector2f(DirectX::XMFLOAT2&& v)
noexcept;
340 operator DirectX::XMVECTOR()
const noexcept;
345 operator DirectX::XMFLOAT2()
const noexcept;
354 using Vector::Vector;
356#if defined(LITEFX_BUILD_WITH_GLM)
362 Vector2u(
const glm::u32vec2& v)
noexcept;
368 Vector2u(glm::u32vec2&& v)
noexcept;
373 operator glm::u32vec2()
const noexcept;
376#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
382 Vector2u(
const DirectX::XMVECTOR& v)
noexcept;
388 Vector2u(DirectX::XMVECTOR&& v)
noexcept;
394 Vector2u(
const DirectX::XMUINT2& v)
noexcept;
400 Vector2u(DirectX::XMUINT2&& v)
noexcept;
405 operator DirectX::XMVECTOR()
const noexcept;
410 operator DirectX::XMUINT2()
const noexcept;
419 using Vector::Vector;
421#if defined(LITEFX_BUILD_WITH_GLM)
427 Vector2i(
const glm::i32vec2& v)
noexcept;
433 Vector2i(glm::i32vec2&& v)
noexcept;
438 operator glm::i32vec2()
const noexcept;
441#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
447 Vector2i(
const DirectX::XMVECTOR& v)
noexcept;
453 Vector2i(DirectX::XMVECTOR&& v)
noexcept;
459 Vector2i(
const DirectX::XMINT2& v)
noexcept;
465 Vector2i(DirectX::XMINT2&& v)
noexcept;
470 operator DirectX::XMVECTOR()
const noexcept;
475 operator DirectX::XMINT2()
const noexcept;
484 using Vector::Vector;
486#if defined(LITEFX_BUILD_WITH_GLM)
488 Vector3f(
const glm::f32vec3& v)
noexcept;
489 Vector3f(glm::f32vec3&& v)
noexcept;
490 operator glm::f32vec3()
const noexcept;
493#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
495 Vector3f(
const DirectX::XMVECTOR& v)
noexcept;
496 Vector3f(DirectX::XMVECTOR&& v)
noexcept;
497 Vector3f(
const DirectX::XMFLOAT3& v)
noexcept;
498 Vector3f(DirectX::XMFLOAT3&& v)
noexcept;
499 operator DirectX::XMVECTOR()
const noexcept;
500 operator DirectX::XMFLOAT3()
const noexcept;
506 using Vector::Vector;
508#if defined(LITEFX_BUILD_WITH_GLM)
510 Vector3u(
const glm::u32vec3& v)
noexcept;
511 Vector3u(glm::u32vec3&& v)
noexcept;
512 operator glm::u32vec3()
const noexcept;
515#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
517 Vector3u(
const DirectX::XMVECTOR& v)
noexcept;
518 Vector3u(DirectX::XMVECTOR&& v)
noexcept;
519 Vector3u(
const DirectX::XMUINT3& v)
noexcept;
520 Vector3u(DirectX::XMUINT3&& v)
noexcept;
521 operator DirectX::XMVECTOR()
const noexcept;
522 operator DirectX::XMUINT3()
const noexcept;
528 using Vector::Vector;
530#if defined(LITEFX_BUILD_WITH_GLM)
532 Vector3i(
const glm::i32vec3& v)
noexcept;
533 Vector3i(glm::i32vec3&& v)
noexcept;
534 operator glm::i32vec3()
const noexcept;
537#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
539 Vector3i(
const DirectX::XMVECTOR& v)
noexcept;
540 Vector3i(DirectX::XMVECTOR&& v)
noexcept;
541 Vector3i(
const DirectX::XMINT3& v)
noexcept;
542 Vector3i(DirectX::XMINT3&& v)
noexcept;
543 operator DirectX::XMVECTOR()
const noexcept;
544 operator DirectX::XMINT3()
const noexcept;
550 using Vector::Vector;
552#if defined(LITEFX_BUILD_WITH_GLM)
554 Vector4f(
const glm::f32vec4& v)
noexcept;
555 Vector4f(glm::f32vec4&& v)
noexcept;
556 operator glm::f32vec4()
const noexcept;
559#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
561 Vector4f(
const DirectX::XMVECTOR& v)
noexcept;
562 Vector4f(DirectX::XMVECTOR&& v)
noexcept;
563 Vector4f(
const DirectX::XMFLOAT4& v)
noexcept;
564 Vector4f(DirectX::XMFLOAT4&& v)
noexcept;
565 operator DirectX::XMVECTOR()
const noexcept;
566 operator DirectX::XMFLOAT4()
const noexcept;
572 using Vector::Vector;
574#if defined(LITEFX_BUILD_WITH_GLM)
576 Vector4u(
const glm::u32vec4& v)
noexcept;
577 Vector4u(glm::u32vec4&& v)
noexcept;
578 operator glm::u32vec4()
const noexcept;
581#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
583 Vector4u(
const DirectX::XMVECTOR& v)
noexcept;
584 Vector4u(DirectX::XMVECTOR&& v)
noexcept;
585 Vector4u(
const DirectX::XMUINT4& v)
noexcept;
586 Vector4u(DirectX::XMUINT4&& v)
noexcept;
587 operator DirectX::XMVECTOR()
const noexcept;
588 operator DirectX::XMUINT4()
const noexcept;
594 using Vector::Vector;
596#if defined(LITEFX_BUILD_WITH_GLM)
598 Vector4i(
const glm::i32vec4& v)
noexcept;
599 Vector4i(glm::i32vec4&& v)
noexcept;
600 operator glm::i32vec4()
const noexcept;
603#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
605 Vector4i(
const DirectX::XMVECTOR& v)
noexcept;
606 Vector4i(DirectX::XMVECTOR&& v)
noexcept;
607 Vector4i(
const DirectX::XMINT4& v)
noexcept;
608 Vector4i(DirectX::XMINT4&& v)
noexcept;
609 operator DirectX::XMVECTOR()
const noexcept;
610 operator DirectX::XMINT4()
const noexcept;
804 Size4d(
size_t v)
noexcept;
805 Size4d(
size_t w,
size_t h,
size_t d,
size_t a)
noexcept;
813 Size4d operator/(
size_t s) noexcept;
814 Size4d& operator/=(
size_t s) noexcept;
815 Size4d operator*(
size_t s) noexcept;
816 Size4d& operator*=(
size_t s) noexcept;
823 size_t width() const noexcept;
824 size_t& width() noexcept;
825 size_t height() const noexcept;
826 size_t& height() noexcept;
827 size_t depth() const noexcept;
828 size_t& depth() noexcept;
829 size_t alpha() const noexcept;
830 size_t& alpha() noexcept;
836 Size3d(
size_t v)
noexcept;
837 Size3d(
size_t w,
size_t h,
size_t d)
noexcept;
845 operator
Size4d() const noexcept;
846 Size3d operator/(
size_t s) noexcept;
847 Size3d& operator/=(
size_t s) noexcept;
848 Size3d operator*(
size_t s) noexcept;
849 Size3d& operator*=(
size_t s) noexcept;
856 size_t width() const noexcept;
857 size_t& width() noexcept;
858 size_t height() const noexcept;
859 size_t& height() noexcept;
860 size_t depth() const noexcept;
861 size_t& depth() noexcept;
867 Size2d(
size_t v)
noexcept;
868 Size2d(
size_t w,
size_t h)
noexcept;
876 operator
Size3d() const noexcept;
877 operator
Size4d() const noexcept;
878 Size2d operator/(
size_t s) noexcept;
879 Size2d& operator/=(
size_t s) noexcept;
880 Size2d operator*(
size_t s) noexcept;
881 Size2d& operator*=(
size_t s) noexcept;
888 size_t width() const noexcept;
889 size_t& width() noexcept;
890 size_t height() const noexcept;
891 size_t& height() noexcept;
895#pragma region Rectangle
900 Rect(
size_t x,
size_t y,
size_t w,
size_t h)
noexcept;
907 Rect& operator=(
Rect&& _other) noexcept;
910 Vector<
size_t, 2> position() const noexcept;
911 Size2d extent() const noexcept;
912 size_t width() const noexcept;
913 size_t& width() noexcept;
914 size_t height() const noexcept;
915 size_t& height() noexcept;
933 Size2d extent() const noexcept;
934 Int32 width() const noexcept;
935 Int32& width() noexcept;
936 Int32 height() const noexcept;
937 Int32& height() noexcept;
955 Size2d extent() const noexcept;
956 Float width() const noexcept;
957 Float& width() noexcept;
958 Float height() const noexcept;
959 Float& height() noexcept;
~RectF() noexcept=default
~RectI() noexcept=default
~Size2d() noexcept=default
~Size3d() noexcept=default
~Size4d() noexcept=default
A vector that contains a single float.
Definition math.hpp:189
A vector that contains a single unsigned integer.
Definition math.hpp:239
A vector that contains two floats.
Definition math.hpp:287
A vector that contains two signed integers.
Definition math.hpp:417
A vector that contains two unsigned integers.
Definition math.hpp:352
A vector that stores three floats.
Definition math.hpp:482
uint16_t UInt16
A type for an unsigned 16 bit integer.
Definition math.hpp:51
uint8_t UInt8
A type for an unsigned 8 bit integer.
Definition math.hpp:41
uint64_t UInt64
A type for an unsigned 64 bit integer.
Definition math.hpp:71
float_t Float
A type for a floating point value with single precision.
Definition math.hpp:76
double_t Double
A type for a floating point value with double precision.
Definition math.hpp:81
uint32_t UInt32
A type for an unsigned 32 bit integer.
Definition math.hpp:61
int64_t Int64
A type for a signed 64 bit integer.
Definition math.hpp:66
int16_t Int16
A type for a signed 16 bit integer.
Definition math.hpp:46
int32_t Int32
A type for a signed 32 bit integer.
Definition math.hpp:56
std::byte Byte
A type for a single byte of raw memory.
Definition math.hpp:36
An algebraic vector type.
Definition vector.hpp:23