17#ifdef VGM_USES_DOUBLE_PRECISION
18 #define VG_T_TYPE double
19 #define VGM_USES_TEMPLATE
21 #define VG_T_TYPE float
25 #ifndef VGM_USES_TEMPLATE
26 #define VGM_USES_TEMPLATE
29 #define VGM_NAMESPACE glm
31 #include <glm/glm.hpp>
32 #include <glm/gtx/vector_angle.hpp>
33 #include <glm/gtx/exterior_product.hpp>
34 #include <glm/gtc/type_ptr.hpp>
35 #include <glm/gtc/quaternion.hpp>
36 #include <glm/gtc/matrix_transform.hpp>
38 using tVec2 = glm::tvec2<VG_T_TYPE>;
39 using tVec3 = glm::tvec3<VG_T_TYPE>;
40 using tVec4 = glm::tvec4<VG_T_TYPE>;
41 using tQuat = glm::tquat<VG_T_TYPE>;
42 using tMat3 = glm::tmat3x3<VG_T_TYPE>;
43 using tMat4 = glm::tmat4x4<VG_T_TYPE>;
45 #define T_PI glm::pi<VG_T_TYPE>()
46 #define T_INV_PI glm::one_over_pi<VG_T_TYPE>()
48 #define VGIZMO_BASE_CLASS virtualGizmoBaseClass<T>
49 #define TEMPLATE_TYPENAME_T template<typename T>
56 #define VGM_NAMESPACE vgm
58 #ifdef VGM_USES_TEMPLATE
59 #define TEMPLATE_TYPENAME_T template<typename T>
61 #define VEC2_T Vec2<T>
62 #define VEC3_T Vec3<T>
63 #define VEC4_T Vec4<T>
64 #define QUAT_T Quat<T>
65 #define MAT3_T Mat3<T>
66 #define MAT4_T Mat4<T>
68 #define VEC2_PRECISION Vec2<VG_T_TYPE>
69 #define VEC3_PRECISION Vec3<VG_T_TYPE>
70 #define VEC4_PRECISION Vec4<VG_T_TYPE>
71 #define QUAT_PRECISION Quat<VG_T_TYPE>
72 #define MAT3_PRECISION Mat3<VG_T_TYPE>
73 #define MAT4_PRECISION Mat4<VG_T_TYPE>
75 #define T_PI vgm::pi<VG_T_TYPE>()
76 #define T_INV_PI vgm::one_over_pi<VG_T_TYPE>()
79 #define TEMPLATE_TYPENAME_T
88 #define VEC2_PRECISION Vec2
89 #define VEC3_PRECISION Vec3
90 #define VEC4_PRECISION Vec4
91 #define QUAT_PRECISION Quat
92 #define MAT3_PRECISION Mat3
93 #define MAT4_PRECISION Mat4
95 #define T_PI vgm::pi()
96 #define T_INV_PI vgm::one_over_pi()
104#if !defined(VGM_USES_TEMPLATE)
141 explicit operator const T *()
const {
return &
x; }
142 explicit operator T *() {
return &
x; }
180 explicit operator const T *()
const {
return &
x; }
181 explicit operator T *() {
return &
x; }
219 explicit operator const T *()
const {
return &
x; }
220 explicit operator T *() {
return &
x; }
244 w * q.
x +
x * q.
w +
y * q.
z -
z * q.
y,
245 w * q.
y +
y * q.
w +
z * q.
x -
x * q.
z,
246 w * q.
z +
z * q.
w +
x * q.
y -
y * q.
x }; }
254 explicit operator const T *()
const {
return &
x; }
255 explicit operator T *() {
return &
x; }
275 T v2x,
T v2y,
T v2z) :
v {
VEC3_T(v0x, v0y, v0z),
VEC3_T(v1x, v1y, v1z),
VEC3_T(v2x, v2y, v2z) } {}
291#define M(X,Y) (m##X * m.m##Y)
293 M(01,00) +
M(11,01) +
M(21,02),
294 M(02,00) +
M(12,01) +
M(22,02),
295 M(00,10) +
M(10,11) +
M(20,12),
296 M(01,10) +
M(11,11) +
M(21,12),
297 M(02,10) +
M(12,11) +
M(22,12),
298 M(00,20) +
M(10,21) +
M(20,22),
299 M(01,20) +
M(11,21) +
M(21,22),
300 M(02,20) +
M(12,21) +
M(22,22)}; }
308 explicit operator const T *()
const {
return &
m00; }
309 explicit operator T *() {
return &
m00; }
324 explicit Mat4(
T s) :
v {
VEC4_T(s, 0, 0, 0),
VEC4_T(0, s, 0, 0),
VEC4_T(0, 0, s, 0),
VEC4_T(0, 0, 0, s)} {}
328 T v1x,
T v1y,
T v1z,
T v1w,
329 T v2x,
T v2y,
T v2z,
T v2w,
330 T v3x,
T v3y,
T v3z,
T v3w) :
v {
VEC4_T(v0x, v0y, v0z, v0w),
VEC4_T(v1x, v1y, v1z, v1w),
VEC4_T(v2x, v2y, v2z, v2w),
VEC4_T(v3x, v3y, v3z, v3w) } {}
348#define M(X,Y) (m##X * m.m##Y)
350 M(01,00) +
M(11,01) +
M(21,02) +
M(31,03),
351 M(02,00) +
M(12,01) +
M(22,02) +
M(32,03),
352 M(03,00) +
M(13,01) +
M(23,02) +
M(33,03),
353 M(00,10) +
M(10,11) +
M(20,12) +
M(30,13),
354 M(01,10) +
M(11,11) +
M(21,12) +
M(31,13),
355 M(02,10) +
M(12,11) +
M(22,12) +
M(32,13),
356 M(03,10) +
M(13,11) +
M(23,12) +
M(33,13),
357 M(00,20) +
M(10,21) +
M(20,22) +
M(30,23),
358 M(01,20) +
M(11,21) +
M(21,22) +
M(31,23),
359 M(02,20) +
M(12,21) +
M(22,22) +
M(32,23),
360 M(03,20) +
M(13,21) +
M(23,22) +
M(33,23),
361 M(00,30) +
M(10,31) +
M(20,32) +
M(30,33),
362 M(01,30) +
M(11,31) +
M(21,32) +
M(31,33),
363 M(02,30) +
M(12,31) +
M(22,32) +
M(32,33),
364 M(03,30) +
M(13,31) +
M(23,32) +
M(33,33) }; }
370 explicit operator const T *()
const {
return &
m00; }
371 explicit operator T *() {
return &
m00; }
378 T xx(q.x * q.x);
T yy(q.y * q.y);
T zz(q.z * q.z);
379 T xz(q.x * q.z);
T xy(q.x * q.y);
T yz(q.y * q.z);
380 T wx(q.w * q.x);
T wy(q.w * q.y);
T wz(q.w * q.z);
382 return {
T(1) -
T(2) * (yy + zz),
T(2) * (xy + wz),
T(2) * (xz - wy),
383 T(2) * (xy - wz),
T(1) -
T(2) * (xx + zz),
T(2) * (yz + wx),
384 T(2) * (xz + wy),
T(2) * (yz - wx),
T(1) -
T(2) * (xx + yy) }; }
447 return { m.m00, m.m10, m.m20,
449 m.m02, m.m12, m.m22}; }
451 return { m.m00, m.m10, m.m20, m.m30,
452 m.m01, m.m11, m.m21, m.m31,
453 m.m02, m.m12, m.m22, m.m32,
454 m.m03, m.m13, m.m23, m.m33}; }
457#define M(X,Y) (m.m##X * m.m##Y)
460 T invDet =
T(1) / (m.m00 * (
M(11,22) -
M(21,12)) - m.m10 * (
M(01,22) -
M(21,02)) + m.m20 * (
M(01,12) -
M(11,02)));
461 return MAT3_T( (
M(11,22) -
M(21,12)), - (
M(01,22) -
M(21,02)), (
M(01,12) -
M(11,02)),
462 - (
M(10,22) -
M(20,12)), (
M(00,22) -
M(20,02)), - (
M(00,12) -
M(10,02)),
463 (
M(10,21) -
M(20,11)), - (
M(00,21) -
M(20,01)), (
M(00,11) -
M(10,01))) * invDet; }
465 const T c0 =
M(22,33) -
M(32,23);
VEC4_T f0(c0, c0,
M(12,33) -
M(32,13),
M(12,23) -
M(22,13));
466 const T c1 =
M(21,33) -
M(31,23);
VEC4_T f1(c1, c1,
M(11,33) -
M(31,13),
M(11,23) -
M(21,13));
467 const T c2 =
M(21,32) -
M(31,22);
VEC4_T f2(c2, c2,
M(11,32) -
M(31,12),
M(11,22) -
M(21,12));
468 const T c3 =
M(20,33) -
M(30,23);
VEC4_T f3(c3, c3,
M(10,33) -
M(30,13),
M(10,23) -
M(20,13));
469 const T c4 =
M(20,32) -
M(30,22);
VEC4_T f4(c4, c4,
M(10,32) -
M(30,12),
M(10,22) -
M(20,12));
470 const T c5 =
M(20,31) -
M(30,21);
VEC4_T f5(c5, c5,
M(10,31) -
M(30,11),
M(10,21) -
M(20,11));
472 VEC4_T v0(m.m10, m.m00, m.m00, m.m00);
473 VEC4_T v1(m.m11, m.m01, m.m01, m.m01);
474 VEC4_T v2(m.m12, m.m02, m.m02, m.m02);
475 VEC4_T v3(m.m13, m.m03, m.m03, m.m03);
478 MAT4_T inv((v1 * f0 - v2 * f1 + v3 * f2) * signV,
479 (v0 * f0 - v2 * f3 + v3 * f4) * -signV,
480 (v0 * f1 - v1 * f3 + v3 * f5) * signV,
481 (v0 * f2 - v1 * f4 + v2 * f5) * -signV);
483 VEC4_T v0r0(m.v[0] *
VEC4_T(inv.m00, inv.m10, inv.m20, inv.m30));
484 return inv * (
T(1) / (v0r0.x + v0r0.y + v0r0.z + v0r0.w)); }
499 return v + ((uv * q.w) +
cross(qV, uv)) *
T(2); }
504 MAT4_T r(m); r[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
507 return MAT4_T(m[0] * v[0], m[1] * v[1], m[2] * v[2], m[3]); }
513 const T t1 =
T(1) - q.w * q.w;
if(t1 <=
T(0))
return VEC3_T(0, 0, 1);
514 const T t2 =
T(1) / sqrt(t1);
return VEC3_T(q.x * t2, q.y * t2, q.z * t2); }
526#ifdef VGM_USES_LEFT_HAND_AXES
531 return { i.x, j.x, k.x,
T(0),
534 -
dot(i, pov), -
dot(j, pov), -
dot(k, pov),
T(1)}; }
539#ifdef VGM_USES_LEFT_HAND_AXES
544 return {
T(2)/(r-l),
T(0),
T(0),
T(0),
545 T(0),
T(2)/(t-b),
T(0),
T(0),
546 T(0),
T(0), v/(f-n),
T(0),
547 -(r+l)/(r-l), -(t+b)/(t-b), -(f+n)/(f-n),
T(1)}; }
552#ifdef VGM_USES_LEFT_HAND_AXES
553 const T v =
T(1), f_n = (f+n)/(f-n);
555 const T v =
T(-1), f_n = -(f+n)/(f-n);
557 const T hFovy = tan(fovy /
T(2));
558 return {
T(1)/(a*hFovy),
T(0),
T(0),
T(0),
559 T(0),
T(1)/(hFovy),
T(0),
T(0),
561 T(0),
T(0), -(
T(2)*f*n)/(f-n),
T(0)}; }
569#ifdef VGM_USES_LEFT_HAND_AXES
570 const T v =
T(1), f_n = (f+n)/(f-n);
572 const T v =
T(-1), f_n = -(f+n)/(f-n);
574 return { (
T(2)*n)/(r-l),
T(0),
T(0),
T(0),
575 T(0), (
T(2)*n)/(t-b),
T(0),
T(0),
576 (r+l)/(r-l), (t+b)/(t-b), f_n, v ,
577 T(0),
T(0), -(
T(2)*f*n)/(f-n),
T(0)}; }
581#ifdef VGM_USES_TEMPLATE
597 using dmat3x3 = dmat3;
598 using dmat4x4 = dmat4;
608#ifdef VGIZMO_USES_HLSL_TYPES
639#ifdef VGIZMO_USES_HLSL_TYPES
671 #undef VEC2_PRECISION
672 #undef VEC3_PRECISION
673 #undef VEC4_PRECISION
674 #undef QUAT_PRECISION
675 #undef MAT3_PRECISION
676 #undef MAT4_PRECISION
680#if !defined(VGM_DISABLE_AUTO_NAMESPACE) || defined(VGIZMO_H_FILE)
Mat3(const MAT3_T &)=default
Mat3 operator*(const Mat3 &m) const
Mat3 & operator*=(const Mat3 &m)
Mat3 operator+(const Mat3 &m) const
Mat3 operator-(const Mat3 &m) const
Mat3 operator*(T s) const
Mat3 operator/(T s) const
Mat3(const VEC3_T &v0, const VEC3_T &v1, const VEC3_T &v2)
const VEC3_T & operator[](int i) const
VEC3_T operator*(const VEC3_T &v) const
VEC3_T & operator[](int i)
Mat3(T v0x, T v0y, T v0z, T v1x, T v1y, T v1z, T v2x, T v2y, T v2z)
Mat3 & operator+=(const Mat3 &m)
Mat3 & operator-=(const Mat3 &m)
Mat3 & operator/=(const Mat3 &m)
Mat4(const VEC4_T &v0, const VEC4_T &v1, const VEC4_T &v2, const VEC4_T &v3)
Mat4 operator/(T s) const
Mat4 operator+(const Mat4 &m) const
Mat4 & operator+=(const Mat4 &m)
Mat4 & operator/=(const Mat4 &m)
Mat4 operator*(const Mat4 &m) const
Mat4 & operator*=(const Mat4 &m)
const VEC4_T & operator[](int i) const
VEC4_T operator*(const VEC4_T &v) const
Mat4 operator-(const Mat4 &m) const
Mat4 & operator-=(const Mat4 &m)
Mat4 operator*(T s) const
Mat4(T v0x, T v0y, T v0z, T v0w, T v1x, T v1y, T v1z, T v1w, T v2x, T v2y, T v2z, T v2w, T v3x, T v3y, T v3z, T v3w)
VEC4_T & operator[](int i)
Quat(const QUAT_T &)=default
Quat operator/(T s) const
Quat & operator+=(const Quat &q)
Quat(T s, const VEC3_T &v)
Quat operator-(const Quat &q) const
Quat & operator*=(const Quat &q)
Quat operator+(const Quat &q) const
Quat & operator-=(const Quat &q)
Quat operator*(T s) const
const T & operator[](int i) const
Quat operator*(const Quat &q) const
const T & operator[](int i) const
Vec2 operator*(T s) const
Vec2 operator+(const Vec2 &v) const
Vec2 & operator/=(const Vec2 &v)
Vec2 & operator-=(const Vec2 &v)
Vec2 & operator+=(const Vec2 &v)
Vec2 operator/(const Vec2 &v) const
Vec2 operator*(const Vec2 &v) const
Vec2 operator-(const Vec2 &v) const
Vec2 & operator*=(const Vec2 &v)
Vec2(const VEC2_T &)=default
Vec2 operator/(T s) const
Vec3 operator+(const Vec3 &v) const
Vec3 & operator+=(const Vec3 &v)
Vec3 & operator/=(const Vec3 &v)
Vec3(const VEC3_T &)=default
Vec3 operator/(T s) const
Vec3 operator*(const Vec3 &v) const
Vec3 & operator-=(const Vec3 &v)
Vec3(T s, const VEC2_T &v)
Vec3 operator*(T s) const
Vec3 operator-(const Vec3 &v) const
Vec3 & operator*=(const Vec3 &v)
Vec3(const VEC2_T &v, T s)
const T & operator[](int i) const
Vec3 operator/(const Vec3 &v) const
Vec4 & operator-=(const Vec4 &v)
Vec4 operator+(const Vec4 &v) const
Vec4 operator*(T s) const
Vec4 operator*(const Vec4 &v) const
Vec4 & operator*=(const Vec4 &v)
Vec4 operator-(const Vec4 &v) const
Vec4 & operator/=(const Vec4 &v)
Vec4 & operator+=(const Vec4 &v)
Vec4(const VEC4_T &)=default
Vec4(T s, const VEC3_T &v)
const T & operator[](int i) const
Vec4 operator/(const Vec4 &v) const
Vec4 operator/(T s) const
Vec4(const VEC3_T &v, T s)
TEMPLATE_TYPENAME_T VEC2_T pow(const VEC2_T &b, const VEC2_T &e)
TEMPLATE_TYPENAME_T T one_over_pi()
TEMPLATE_TYPENAME_T T mix(const T x, const T y, const T a)
TEMPLATE_TYPENAME_T MAT3_T mat3_cast(QUAT_T const &q)
float uintBitsToFloat(uint32_t const v)
TEMPLATE_TYPENAME_T MAT4_T translate(MAT4_T const &m, VEC3_T const &v)
TEMPLATE_TYPENAME_T T degrees(T r)
TEMPLATE_TYPENAME_T VEC3_T axis(QUAT_T const &q)
TEMPLATE_TYPENAME_T VEC2_T operator*(const T s, const VEC2_T &v)
TEMPLATE_TYPENAME_T T distance(const VEC2_T &v0, const VEC2_T &v1)
TEMPLATE_TYPENAME_T MAT4_T perspectiveFov(T fovy, T w, T h, T n, T f)
uint32_t floatBitsToUint(float const v)
TEMPLATE_TYPENAME_T VEC2_T operator/(const T s, const VEC2_T &v)
TEMPLATE_TYPENAME_T T tAbs(T x)
TEMPLATE_TYPENAME_T MAT4_T scale(MAT4_T const &m, VEC3_T const &v)
TEMPLATE_TYPENAME_T T dot(const VEC2_T &v0, const VEC2_T &v1)
TEMPLATE_TYPENAME_T MAT3_T transpose(MAT3_T m)
TEMPLATE_TYPENAME_T MAT4_T frustum(T l, T r, T b, T t, T n, T f)
TEMPLATE_TYPENAME_T MAT4_T perspective(T fovy, T a, T n, T f)
TEMPLATE_TYPENAME_T MAT4_T lookAt(const VEC3_T &pov, const VEC3_T &tgt, const VEC3_T &up)
TEMPLATE_TYPENAME_T VEC2_T normalize(const VEC2_T &v)
TEMPLATE_TYPENAME_T MAT4_T ortho(T l, T r, T b, T t, T n, T f)
TEMPLATE_TYPENAME_T T * value_ptr(const VEC2_T &v)
TEMPLATE_TYPENAME_T T angle(QUAT_T const &q)
TEMPLATE_TYPENAME_T MAT4_T mat4_cast(QUAT_T const &q)
TEMPLATE_TYPENAME_T QUAT_T angleAxis(T const &a, VEC3_T const &v)
TEMPLATE_TYPENAME_T T cross(const VEC2_T &u, const VEC2_T &v)
TEMPLATE_TYPENAME_T T pi()
TEMPLATE_TYPENAME_T VEC2_T abs(const VEC2_T &v)
TEMPLATE_TYPENAME_T QUAT_T inverse(QUAT_T const &q)
TEMPLATE_TYPENAME_T T sign(const T v)
TEMPLATE_TYPENAME_T T radians(T d)
TEMPLATE_TYPENAME_T T length(const VEC2_T &v)
vgm::VEC3_PRECISION tVec3
vgm::QUAT_PRECISION tQuat
vgm::VEC4_PRECISION tVec4
vgm::VEC2_PRECISION tVec2
#define TEMPLATE_TYPENAME_T
vgm::MAT3_PRECISION tMat3
vgm::MAT4_PRECISION tMat4