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>
83 constexpr Byte operator "" _b(
unsigned long long int arg)
noexcept {
84 return static_cast<Byte>(arg);
92 constexpr Int16 operator "" _i16(
unsigned long long int arg)
noexcept {
93 return static_cast<Int16>(arg);
101 constexpr UInt16 operator "" _ui16(
unsigned long long int arg)
noexcept {
102 return static_cast<UInt16>(arg);
110 constexpr Int32 operator "" _i32(
unsigned long long int arg)
noexcept {
111 return static_cast<Int32>(arg);
119 constexpr UInt32 operator "" _ui32(
unsigned long long int arg)
noexcept {
120 return static_cast<UInt32>(arg);
128 constexpr Int64 operator "" _i64(
unsigned long long int arg)
noexcept {
129 return static_cast<Int64>(arg);
137 constexpr UInt64 operator "" _ui64(
unsigned long long int arg)
noexcept {
138 return static_cast<UInt64>(arg);
146 constexpr Float operator "" _f32(
long double arg)
noexcept {
147 return static_cast<Float>(arg);
155 constexpr Double operator "" _f64(
long double arg)
noexcept {
156 return static_cast<Double>(arg);
166 template <
typename T = UInt32>
167 static constexpr T align(T size, T alignment) {
168 return (size + alignment - 1) & ~(alignment - 1);
177 using Vector::Vector;
179#if defined(LITEFX_BUILD_WITH_GLM)
185 Vector1f(
const glm::f32vec1& v)
noexcept;
191 Vector1f(glm::f32vec1&& v)
noexcept;
196 operator glm::f32vec1()
const noexcept;
199#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
205 Vector1f(
const DirectX::XMVECTOR& v)
noexcept;
211 Vector1f(DirectX::XMVECTOR&& v)
noexcept;
216 operator DirectX::XMVECTOR()
const noexcept;
227 using Vector::Vector;
229#if defined(LITEFX_BUILD_WITH_GLM)
235 Vector1u(
const glm::u32vec1& v)
noexcept;
241 Vector1u(glm::u32vec1&& v)
noexcept;
246 operator glm::u32vec1()
const noexcept;
249#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
255 Vector1u(
const DirectX::XMVECTOR& v)
noexcept;
261 Vector1u(DirectX::XMVECTOR&& v)
noexcept;
266 operator DirectX::XMVECTOR()
const noexcept;
275 using Vector::Vector;
277#if defined(LITEFX_BUILD_WITH_GLM)
283 Vector2f(
const glm::f32vec2& v)
noexcept;
289 Vector2f(glm::f32vec2&& v)
noexcept;
294 operator glm::f32vec2()
const noexcept;
297#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
303 Vector2f(
const DirectX::XMVECTOR& v)
noexcept;
309 Vector2f(DirectX::XMVECTOR&& v)
noexcept;
315 Vector2f(
const DirectX::XMFLOAT2& v)
noexcept;
321 Vector2f(DirectX::XMFLOAT2&& v)
noexcept;
326 operator DirectX::XMVECTOR()
const noexcept;
331 operator DirectX::XMFLOAT2()
const noexcept;
340 using Vector::Vector;
342#if defined(LITEFX_BUILD_WITH_GLM)
348 Vector2u(
const glm::u32vec2& v)
noexcept;
354 Vector2u(glm::u32vec2&& v)
noexcept;
359 operator glm::u32vec2()
const noexcept;
362#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
368 Vector2u(
const DirectX::XMVECTOR& v)
noexcept;
374 Vector2u(DirectX::XMVECTOR&& v)
noexcept;
380 Vector2u(
const DirectX::XMUINT2& v)
noexcept;
386 Vector2u(DirectX::XMUINT2&& v)
noexcept;
391 operator DirectX::XMVECTOR()
const noexcept;
396 operator DirectX::XMUINT2()
const noexcept;
405 using Vector::Vector;
407#if defined(LITEFX_BUILD_WITH_GLM)
413 Vector2i(
const glm::i32vec2& v)
noexcept;
419 Vector2i(glm::i32vec2&& v)
noexcept;
424 operator glm::i32vec2()
const noexcept;
427#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
433 Vector2i(
const DirectX::XMVECTOR& v)
noexcept;
439 Vector2i(DirectX::XMVECTOR&& v)
noexcept;
445 Vector2i(
const DirectX::XMINT2& v)
noexcept;
451 Vector2i(DirectX::XMINT2&& v)
noexcept;
456 operator DirectX::XMVECTOR()
const noexcept;
461 operator DirectX::XMINT2()
const noexcept;
470 using Vector::Vector;
472#if defined(LITEFX_BUILD_WITH_GLM)
474 Vector3f(
const glm::f32vec3& v)
noexcept;
475 Vector3f(glm::f32vec3&& v)
noexcept;
476 operator glm::f32vec3()
const noexcept;
479#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
481 Vector3f(
const DirectX::XMVECTOR& v)
noexcept;
482 Vector3f(DirectX::XMVECTOR&& v)
noexcept;
483 Vector3f(
const DirectX::XMFLOAT3& v)
noexcept;
484 Vector3f(DirectX::XMFLOAT3&& v)
noexcept;
485 operator DirectX::XMVECTOR()
const noexcept;
486 operator DirectX::XMFLOAT3()
const noexcept;
492 using Vector::Vector;
494#if defined(LITEFX_BUILD_WITH_GLM)
496 Vector3u(
const glm::u32vec3& v)
noexcept;
497 Vector3u(glm::u32vec3&& v)
noexcept;
498 operator glm::u32vec3()
const noexcept;
501#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
503 Vector3u(
const DirectX::XMVECTOR& v)
noexcept;
504 Vector3u(DirectX::XMVECTOR&& v)
noexcept;
505 Vector3u(
const DirectX::XMUINT3& v)
noexcept;
506 Vector3u(DirectX::XMUINT3&& v)
noexcept;
507 operator DirectX::XMVECTOR()
const noexcept;
508 operator DirectX::XMUINT3()
const noexcept;
514 using Vector::Vector;
516#if defined(LITEFX_BUILD_WITH_GLM)
518 Vector3i(
const glm::i32vec3& v)
noexcept;
519 Vector3i(glm::i32vec3&& v)
noexcept;
520 operator glm::i32vec3()
const noexcept;
523#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
525 Vector3i(
const DirectX::XMVECTOR& v)
noexcept;
526 Vector3i(DirectX::XMVECTOR&& v)
noexcept;
527 Vector3i(
const DirectX::XMINT3& v)
noexcept;
528 Vector3i(DirectX::XMINT3&& v)
noexcept;
529 operator DirectX::XMVECTOR()
const noexcept;
530 operator DirectX::XMINT3()
const noexcept;
536 using Vector::Vector;
538#if defined(LITEFX_BUILD_WITH_GLM)
540 Vector4f(
const glm::f32vec4& v)
noexcept;
541 Vector4f(glm::f32vec4&& v)
noexcept;
542 operator glm::f32vec4()
const noexcept;
545#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
547 Vector4f(
const DirectX::XMVECTOR& v)
noexcept;
548 Vector4f(DirectX::XMVECTOR&& v)
noexcept;
549 Vector4f(
const DirectX::XMFLOAT4& v)
noexcept;
550 Vector4f(DirectX::XMFLOAT4&& v)
noexcept;
551 operator DirectX::XMVECTOR()
const noexcept;
552 operator DirectX::XMFLOAT4()
const noexcept;
558 using Vector::Vector;
560#if defined(LITEFX_BUILD_WITH_GLM)
562 Vector4u(
const glm::u32vec4& v)
noexcept;
563 Vector4u(glm::u32vec4&& v)
noexcept;
564 operator glm::u32vec4()
const noexcept;
567#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
569 Vector4u(
const DirectX::XMVECTOR& v)
noexcept;
570 Vector4u(DirectX::XMVECTOR&& v)
noexcept;
571 Vector4u(
const DirectX::XMUINT4& v)
noexcept;
572 Vector4u(DirectX::XMUINT4&& v)
noexcept;
573 operator DirectX::XMVECTOR()
const noexcept;
574 operator DirectX::XMUINT4()
const noexcept;
580 using Vector::Vector;
582#if defined(LITEFX_BUILD_WITH_GLM)
584 Vector4i(
const glm::i32vec4& v)
noexcept;
585 Vector4i(glm::i32vec4&& v)
noexcept;
586 operator glm::i32vec4()
const noexcept;
589#if defined(LITEFX_BUILD_WITH_DIRECTX_MATH)
591 Vector4i(
const DirectX::XMVECTOR& v)
noexcept;
592 Vector4i(DirectX::XMVECTOR&& v)
noexcept;
593 Vector4i(
const DirectX::XMINT4& v)
noexcept;
594 Vector4i(DirectX::XMINT4&& v)
noexcept;
595 operator DirectX::XMVECTOR()
const noexcept;
596 operator DirectX::XMINT4()
const noexcept;
790 Size4d(
size_t v)
noexcept;
791 Size4d(
size_t w,
size_t h,
size_t d,
size_t a)
noexcept;
799 Size4d operator/(
size_t s) noexcept;
800 Size4d& operator/=(
size_t s) noexcept;
801 Size4d operator*(
size_t s) noexcept;
802 Size4d& operator*=(
size_t s) noexcept;
809 size_t width() const noexcept;
810 size_t& width() noexcept;
811 size_t height() const noexcept;
812 size_t& height() noexcept;
813 size_t depth() const noexcept;
814 size_t& depth() noexcept;
815 size_t alpha() const noexcept;
816 size_t& alpha() noexcept;
822 Size3d(
size_t v)
noexcept;
823 Size3d(
size_t w,
size_t h,
size_t d)
noexcept;
831 operator
Size4d() const noexcept;
832 Size3d operator/(
size_t s) noexcept;
833 Size3d& operator/=(
size_t s) noexcept;
834 Size3d operator*(
size_t s) noexcept;
835 Size3d& operator*=(
size_t s) noexcept;
842 size_t width() const noexcept;
843 size_t& width() noexcept;
844 size_t height() const noexcept;
845 size_t& height() noexcept;
846 size_t depth() const noexcept;
847 size_t& depth() noexcept;
853 Size2d(
size_t v)
noexcept;
854 Size2d(
size_t w,
size_t h)
noexcept;
862 operator
Size3d() const noexcept;
863 operator
Size4d() const noexcept;
864 Size2d operator/(
size_t s) noexcept;
865 Size2d& operator/=(
size_t s) noexcept;
866 Size2d operator*(
size_t s) noexcept;
867 Size2d& operator*=(
size_t s) noexcept;
874 size_t width() const noexcept;
875 size_t& width() noexcept;
876 size_t height() const noexcept;
877 size_t& height() noexcept;
881#pragma region Rectangle
886 Rect(
size_t x,
size_t y,
size_t w,
size_t h)
noexcept;
893 Rect& operator=(
Rect&& _other) noexcept;
896 Vector<
size_t, 2> position() const noexcept;
897 Size2d extent() const noexcept;
898 size_t width() const noexcept;
899 size_t& width() noexcept;
900 size_t height() const noexcept;
901 size_t& height() noexcept;
919 Size2d extent() const noexcept;
920 Int32 width() const noexcept;
921 Int32& width() noexcept;
922 Int32 height() const noexcept;
923 Int32& height() noexcept;
941 Size2d extent() const noexcept;
942 Float width() const noexcept;
943 Float& width() noexcept;
944 Float height() const noexcept;
945 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:175
A vector that contains a single unsigned integer.
Definition math.hpp:225
A vector that contains two floats.
Definition math.hpp:273
A vector that contains two signed integers.
Definition math.hpp:403
A vector that contains two unsigned integers.
Definition math.hpp:338
A vector that stores three floats.
Definition math.hpp:468
uint16_t UInt16
A type for an unsigned 16 bit integer.
Definition math.hpp:46
uint64_t UInt64
A type for an unsigned 64 bit integer.
Definition math.hpp:66
float_t Float
A type for a floating point value with single precision.
Definition math.hpp:71
double_t Double
A type for a floating point value with double precision.
Definition math.hpp:76
uint32_t UInt32
A type for an unsigned 32 bit integer.
Definition math.hpp:56
uint8_t Byte
A type for an unsigned 8 bit integer.
Definition math.hpp:36
int64_t Int64
A type for a signed 64 bit integer.
Definition math.hpp:61
int16_t Int16
A type for a signed 16 bit integer.
Definition math.hpp:41
int32_t Int32
A type for a signed 32 bit integer.
Definition math.hpp:51
An algebraic vector type.
Definition vector.hpp:23