21#define mm_ror_ps(vec,i) \
22 (((i)%4) ? (_mm_shuffle_ps(vec,vec, _MM_SHUFFLE((unsigned char)(i+3)%4,(unsigned char)(i+2)%4,(unsigned char)(i+1)%4,(unsigned char)(i+0)%4))) : (vec))
30static const __m128i
maskX = _mm_setr_epi32( -1,0,0,0 );
31static const __m128i
maskY = _mm_setr_epi32( 0,-1,0,0 );
32static const __m128i
maskZ = _mm_setr_epi32( 0,0,-1,0 );
33static const __m128i
maskW = _mm_setr_epi32( 0,0,0,-1 );
59 float m00,
float m01,
float m02,
float m03,
60 float m10,
float m11,
float m12,
float m13,
61 float m20,
float m21,
float m22,
float m23,
62 float m30,
float m31,
float m32,
float m33);
90 float m00,
float m01,
float m02,
float m03,
91 float m10,
float m11,
float m12,
float m13,
92 float m20,
float m21,
float m22,
float m23,
93 float m30,
float m31,
float m32,
float m33);
100 void translate(
const float x,
const float y,
const float z);
112 void scale(
const float x,
const float y,
const float z);
175mat4::mat4(
float m00,
float m01,
float m02,
float m03,
float m10,
float m11,
float m12,
float m13,
float m20,
float m21,
float m22,
float m23,
float m30,
float m31,
float m32,
float m33)
177 this->
r[0] =
vec4(m00, m01, m02, m03);
178 this->
r[1] =
vec4(m10, m11, m12, m13);
179 this->
r[2] =
vec4(m20, m21, m22, m23);
180 this->
r[3] =
vec4(m30, m31, m32, m33);
201 return !(*
this == rhs);
207__forceinline
vec4 const&
210#if NEBULA_BOUNDS_CHECK
222#if NEBULA_BOUNDS_CHECK
234 r[0] = _mm_load_ps(ptr);
235 r[1] = _mm_load_ps(ptr + 4);
236 r[2] = _mm_load_ps(ptr + 8);
237 r[3] = _mm_load_ps(ptr + 12);
246 r[0] = _mm_loadu_ps(ptr);
247 r[1] = _mm_loadu_ps(ptr + 4);
248 r[2] = _mm_loadu_ps(ptr + 8);
249 r[3] = _mm_loadu_ps(ptr + 12);
258 _mm_store_ps(ptr,
r[0].vec);
259 _mm_store_ps((ptr + 4),
r[1].vec);
260 _mm_store_ps((ptr + 8),
r[2].vec);
261 _mm_store_ps((ptr + 12),
r[3].vec);
270 _mm_store_ps(ptr,
r[0].vec);
271 _mm_store_ps((ptr + 4),
r[1].vec);
272 _mm_store_ps((ptr + 8),
r[2].vec);
281 _mm_storeu_ps(ptr,
r[0].vec);
282 _mm_storeu_ps((ptr + 4),
r[1].vec);
283 _mm_storeu_ps((ptr + 8),
r[2].vec);
284 _mm_storeu_ps((ptr + 12),
r[3].vec);
313mat4::set(
float m00,
float m01,
float m02,
float m03,
float m10,
float m11,
float m12,
float m13,
float m20,
float m21,
float m22,
float m23,
float m30,
float m31,
float m32,
float m33)
315 this->
r[0] =
vec4(m00, m01, m02, m03);
316 this->
r[1] =
vec4(m10, m11, m12, m13);
317 this->
r[2] =
vec4(m20, m21, m22, m23);
318 this->
r[3] =
vec4(m30, m31, m32, m33);
334 v =
vec4(xScale, yScale, zScale, 1.0f);
379 this->
r[3] = _mm_add_ps(
r[3].vec, t.
vec);
416 __m128 r1,r2,r3,tt,tt2;
419 __m128 _L1 = m.
r[0].
vec;
420 __m128 _L2 = m.
r[1].
vec;
421 __m128 _L3 = m.
r[2].
vec;
422 __m128 _L4 = m.
r[3].
vec;
436 Va =
mm_ror_ps(tt,1); sum = _mm_mul_ps(Va,r1);
437 Vb =
mm_ror_ps(tt,2); sum = _mm_add_ps(sum,_mm_mul_ps(Vb,r2));
438 Vc =
mm_ror_ps(tt,3); sum = _mm_add_ps(sum,_mm_mul_ps(Vc,r3));
441 Det = _mm_mul_ps(sum,_L1);
442 Det = _mm_add_ps(Det,_mm_movehl_ps(Det,Det));
445 tt =
mm_ror_ps(_L1,1); sum = _mm_mul_ps(tt,r1);
446 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r2));
447 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r3));
450 Det = _mm_sub_ss(Det,_mm_shuffle_ps(Det,Det,1));
460 __m128 tmp3, tmp2, tmp1, tmp0;
461 tmp0 = _mm_unpacklo_ps(m.
r[0].
vec, m.
r[1].
vec);
462 tmp2 = _mm_unpacklo_ps(m.
r[2].
vec, m.
r[3].
vec);
463 tmp1 = _mm_unpackhi_ps(m.
r[0].
vec, m.
r[1].
vec);
464 tmp3 = _mm_unpackhi_ps(m.
r[2].
vec, m.
r[3].
vec);
466 ret.
r[0] = _mm_movelh_ps(tmp0, tmp2);
467 ret.
r[1] = _mm_movehl_ps(tmp2, tmp0);
468 ret.
r[2] = _mm_movelh_ps(tmp1, tmp3);
469 ret.
r[3] = _mm_movehl_ps(tmp3, tmp1);
480 __m128 r1,r2,r3,tt,tt2;
482 __m128 trns0,trns1,trns2,trns3;
484 const __m128i pnpn = _mm_setr_epi32(0x00000000,
static_cast<int>(0x80000000), 0x00000000,
static_cast<int>(0x80000000));
485 const __m128i npnp = _mm_setr_epi32(
static_cast<int>(0x80000000), 0x00000000,
static_cast<int>(0x80000000), 0x00000000);
486 const __m128 zeroone = _mm_setr_ps(1.0f, 0.0f, 0.0f, 1.0f);
488 __m128 _L1 = m.
r[0].
vec;
489 __m128 _L2 = m.
r[1].
vec;
490 __m128 _L3 = m.
r[2].
vec;
491 __m128 _L4 = m.
r[3].
vec;
505 Va =
mm_ror_ps(tt,1); sum = _mm_mul_ps(Va,r1);
506 Vb =
mm_ror_ps(tt,2); sum = _mm_add_ps(sum,_mm_mul_ps(Vb,r2));
507 Vc =
mm_ror_ps(tt,3); sum = _mm_add_ps(sum,_mm_mul_ps(Vc,r3));
510 Det = _mm_mul_ps(sum,_L1);
511 Det = _mm_add_ps(Det,_mm_movehl_ps(Det,Det));
514 __m128 mtL1 = _mm_xor_ps(sum, _mm_castsi128_ps(pnpn));
517 tt =
mm_ror_ps(_L1,1); sum = _mm_mul_ps(tt,r1);
518 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r2));
519 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r3));
520 __m128 mtL2 = _mm_xor_ps(sum, _mm_castsi128_ps(npnp));
523 Det = _mm_sub_ss(Det,_mm_shuffle_ps(Det,Det,1));
527 Va = _mm_mul_ps(tt,Vb);
528 Vb = _mm_mul_ps(tt,Vc);
529 Vc = _mm_mul_ps(tt,_L2);
535 tt =
mm_ror_ps(_L4,1); sum = _mm_mul_ps(tt,r1);
536 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r2));
537 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r3));
538 __m128 mtL3 = _mm_xor_ps(sum, _mm_castsi128_ps(pnpn));
541 RDet = _mm_div_ss(zeroone, Det);
542 RDet = _mm_shuffle_ps(RDet,RDet,0x00);
545 mtL1 = _mm_mul_ps(mtL1, RDet);
546 mtL2 = _mm_mul_ps(mtL2, RDet);
547 mtL3 = _mm_mul_ps(mtL3, RDet);
550 tt =
mm_ror_ps(_L3,1); sum = _mm_mul_ps(tt,r1);
551 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r2));
552 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r3));
553 __m128 mtL4 = _mm_xor_ps(sum, _mm_castsi128_ps(npnp));
554 mtL4 = _mm_mul_ps(mtL4, RDet);
557 trns0 = _mm_unpacklo_ps(mtL1,mtL2);
558 trns1 = _mm_unpacklo_ps(mtL3,mtL4);
559 trns2 = _mm_unpackhi_ps(mtL1,mtL2);
560 trns3 = _mm_unpackhi_ps(mtL3,mtL4);
561 _L1 = _mm_movelh_ps(trns0,trns1);
562 _L2 = _mm_movehl_ps(trns1,trns0);
563 _L3 = _mm_movelh_ps(trns2,trns3);
564 _L4 = _mm_movehl_ps(trns3,trns2);
588 normUp =
permute(normUp, normUp, 1, 2, 0);
622 normUp =
permute(normUp, normUp, 1, 2, 0);
640static inline __m256 twolincomb_AVX_8(__m256 A01,
const mat4 &B)
643 result = _mm256_mul_ps(_mm256_shuffle_ps(A01, A01, 0x00), _mm256_broadcast_ps(&B.r[0].vec));
644 result = _mm256_add_ps(result, _mm256_mul_ps(_mm256_shuffle_ps(A01, A01, 0x55), _mm256_broadcast_ps(&B.r[1].vec)));
645 result = _mm256_add_ps(result, _mm256_mul_ps(_mm256_shuffle_ps(A01, A01, 0xaa), _mm256_broadcast_ps(&B.r[2].vec)));
646 result = _mm256_add_ps(result, _mm256_mul_ps(_mm256_shuffle_ps(A01, A01, 0xff), _mm256_broadcast_ps(&B.r[3].vec)));
659 __m256 A01 = _mm256_loadu_ps(&m1.m[0][0]);
660 __m256 A23 = _mm256_loadu_ps(&m1.m[2][0]);
662 __m256 out01x = twolincomb_AVX_8(A01, m0);
663 __m256 out23x = twolincomb_AVX_8(A23, m0);
665 _mm256_storeu_ps(&out.m[0][0], out01x);
666 _mm256_storeu_ps(&out.m[2][0], out23x);
670__forceinline
mat4 operator%(
const mat4& m1,
const mat4& m0) =
delete;
763 __m128 x = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(0, 0, 0, 0));
764 __m128 y = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(1, 1, 1, 1));
765 __m128 z = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(2, 2, 2, 2));
766 __m128 w = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(3, 3, 3, 3));
772 _mm_mul_ps(w, m.
r[3].
vec))));
781 __m128 x = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(0, 0, 0, 0));
783 __m128 y = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(1, 1, 1, 1));
785 __m128 z = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(2, 2, 2, 2));
791 _mm_mul_ps(z, m.
r[2].
vec)));
800 __m128 x = _mm_shuffle_ps(p.
vec, p.
vec, _MM_SHUFFLE(0, 0, 0, 0));
801 __m128 y = _mm_shuffle_ps(p.
vec, p.
vec, _MM_SHUFFLE(1, 1, 1, 1));
802 __m128 z = _mm_shuffle_ps(p.
vec, p.
vec, _MM_SHUFFLE(2, 2, 2, 2));
803 __m128 w = _mm_shuffle_ps(p.
vec, p.
vec, _MM_SHUFFLE(3, 3, 3, 3));
809 _mm_mul_ps(w, m.
r[3].
vec))));
818 __m128 x = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(0, 0, 0, 0));
820 __m128 y = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(1, 1, 1, 1));
822 __m128 z = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(2, 2, 2, 2));
828 _mm_mul_ps(z, m.
r[2].
vec)));
838 scalar dist = 1.0f / (zf - zn);
839 m.
r[0] =
vec4(2.0f / w, 0.0f, 0.0f, 0.0f);
840 m.
r[1] =
vec4(0.0f, 2.0f / h, 0.0f, 0.0f);
841 m.
r[2] =
vec4(0.0f, 0.0f, dist, 0.0f);
842 m.
r[3] =
vec4(0.0f, 0.0, -zn * dist, 1.0f);
853 scalar dist = 1.0f / (zn - zf);
854 m.
r[0] =
vec4(2.0f / w, 0.0f, 0.0f, 0.0f);
855 m.
r[1] =
vec4(0.0f, 2.0f / h, 0.0f, 0.0f);
856 m.
r[2] =
vec4(0.0f, 0.0f, dist, 0.0f);
857 m.
r[3] =
vec4(0.0f, 0.0, zn * dist, 1.0f);
868 m.
r[0] =
vec4(2.0f / (r-l), 0.0f, 0.0f, 0.0f);
869 m.
r[1] =
vec4(0.0f, 2.0f / (t-b), 0.0f, 0.0f);
870 m.
r[2] =
vec4(0.0f, 0.0f, 1.0f / (zf-zn), 0.0f);
871 m.
r[3] =
vec4((l + r) / (l - r), (t + b) / (b - t), zn / (zn - zf), 1.0f);
882 m.
r[0] =
vec4(2.0f / (r-l), 0.0f, 0.0f, 0.0f);
883 m.
r[1] =
vec4(0.0f, 2.0f / (t-b), 0.0f, 0.0f);
884 m.
r[2] =
vec4(0.0f, 0.0f, 1 / (zn-zf), 0.0f);
885 m.
r[3] =
vec4((l + r) / (l - r), (t + b) / (b - t), zn / (zn-zf), 1.0f);
896 scalar halfFov = 0.5f * fovy;
900 scalar height = cosfov / sinfov;
901 scalar width = height / aspect;
903 scalar dist = zf / (zf - zn);
904 m.
r[0] =
vec4(width, 0.0f, 0.0f, 0.0f);
905 m.
r[1] =
vec4(0.0f, height, 0.0f, 0.0f);
906 m.
r[2] =
vec4(0.0f, 0.0f, dist, 1.0f);
907 m.
r[3] =
vec4(0.0f, 0.0f, -dist * zn, 0.0f);
919 scalar halfFov = 0.5f * fovy;
923 scalar height = cosfov / sinfov;
924 scalar width = height / aspect;
926 scalar dist = zf / (zn - zf);
928 m.
r[0] =
vec4(width, 0.0f, 0.0f, 0.0f);
929 m.
r[1] =
vec4(0.0f, height, 0.0f, 0.0f);
930 m.
r[2] =
vec4(0.0f, 0.0f, dist, -1.0f);
931 m.
r[3] =
vec4(0.0f, 0.0f, dist * zn, 0.0f);
943 scalar dist = zf / (zf - zn);
945 m.
r[0] =
vec4(2.0f * zn / w, 0.0f, 0.0f, 0.0f);
946 m.
r[1] =
vec4(0.0f, 2.0f * zn / h, 0.0f, 0.0f);
947 m.
r[2] =
vec4(0.0f, 0.0f, dist, 1.0f);
948 m.
r[3] =
vec4(0.0f, 0.0, -dist * zn, 0.0f);
959 scalar dist = zf / (zn - zf);
961 m.
r[0] =
vec4(2.0f * zn / w, 0.0f, 0.0f, 0.0f);
962 m.
r[1] =
vec4(0.0f, 2.0f * zn / h, 0.0f, 0.0f);
963 m.
r[2] =
vec4(0.0f, 0.0f, dist, -1.0f);
964 m.
r[3] =
vec4(0.0f, 0.0, dist * zn, 0.0f);
975 scalar divwidth = 1.0f / (r - l);
976 scalar divheight = 1.0f / (t - b);
977 scalar dist = zf / (zf - zn);
979 m.
r[0] =
vec4(2.0f * zn * divwidth, 0.0f, 0.0f, 0.0f);
980 m.
r[1] =
vec4(0.0f, 2.0f * zn * divheight, 0.0f, 0.0f);
981 m.
r[2] =
vec4(-(l + r) * divwidth, -(b + t) * divheight, dist, 1.0f);
982 m.
r[3] =
vec4(0.0f, 0.0f, -dist * zn, 0.0f);
993 scalar divwidth = 1.0f / (r - l);
994 scalar divheight = 1.0f / (t - b);
995 scalar dist = zf / (zn - zf);
997 m.
r[0] =
vec4(2.0f * zn * divwidth, 0.0f, 0.0f, 0.0f);
998 m.
r[1] =
vec4(0.0f, 2.0f * zn * divheight, 0.0f, 0.0f);
999 m.
r[2] =
vec4((l + r) * divwidth, (b + t) * divheight, dist, -1.0f);
1000 m.
r[3] =
vec4(0.0f, 0.0f, dist * zn, 0.0f);
1015 __m128 m1_c = _mm_set_ps1(1.0f - cangle);
1016 __m128 c = _mm_set_ps1(cangle);
1017 __m128 s = _mm_set_ps1(sangle);
1019 __m128 nn1 = _mm_shuffle_ps(norm,norm,_MM_SHUFFLE(3,0,2,1));
1020 __m128 nn2 = _mm_shuffle_ps(norm,norm,_MM_SHUFFLE(3,1,0,2));
1022 __m128 v = _mm_mul_ps(nn1,m1_c);
1023 v = _mm_mul_ps(nn2,v);
1025 __m128 nn3 = _mm_mul_ps(norm, m1_c);
1026 nn3 = _mm_mul_ps(norm, nn3);
1027 nn3 = _mm_add_ps(nn3, c);
1029 __m128 nn4 = _mm_mul_ps(norm,s);
1030 nn4 = _mm_add_ps(nn4, v);
1031 __m128 nn5 = _mm_mul_ps(s, norm);
1032 nn5 = _mm_sub_ps(v,nn5);
1036 __m128 v1 = _mm_shuffle_ps(nn4,nn5,_MM_SHUFFLE(2,1,2,0));
1037 v1 = _mm_shuffle_ps(v1,v1,_MM_SHUFFLE(0,3,2,1));
1039 __m128 v2 = _mm_shuffle_ps(nn4,nn5,_MM_SHUFFLE(0,0,1,1));
1040 v2 = _mm_shuffle_ps(v2,v2,_MM_SHUFFLE(2,0,2,0));
1043 nn5 = _mm_shuffle_ps(v,v1,_MM_SHUFFLE(1,0,3,0));
1044 nn5 = _mm_shuffle_ps(nn5,nn5,_MM_SHUFFLE(1,3,2,0));
1049 nn5 = _mm_shuffle_ps(v,v1,_MM_SHUFFLE(3,2,3,1));
1050 nn5 = _mm_shuffle_ps(nn5,nn5,_MM_SHUFFLE(1,3,0,2));
1053 v2 = _mm_shuffle_ps(v2,v,_MM_SHUFFLE(3,2,1,0));
1076 m.
m[2][1] = -sangle;
1093 m.
m[0][2] = -sangle;
1114 m.
m[1][0] = -sangle;
1136 m.
r[0] = _mm_setr_ps(scale, 0.0f, 0.0f, 0.0f);
1137 m.
r[1] = _mm_setr_ps(0.0f, scale, 0.0f, 0.0f);
1138 m.
r[2] = _mm_setr_ps(0.0f, 0.0f, scale, 0.0f);
1139 m.
r[3] = _mm_setr_ps(0.0f, 0.0f, 0.0f, 1.0f);
1151 m.
r[0] = _mm_setr_ps(sx, 0.0f, 0.0f, 0.0f);
1152 m.
r[1] = _mm_setr_ps(0.0f, sy, 0.0f, 0.0f);
1153 m.
r[2] = _mm_setr_ps(0.0f, 0.0f, sz, 0.0f);
1154 m.
r[3] = _mm_setr_ps(0.0f, 0.0f, 0.0f, 1.0f);
1166 m.
r[0] = _mm_and_ps(s.
vec, _mm_castsi128_ps(
maskX));
1167 m.
r[1] = _mm_and_ps(s.
vec, _mm_castsi128_ps(
maskY));
1168 m.
r[2] = _mm_and_ps(s.
vec, _mm_castsi128_ps(
maskZ));
1180 m.
r[3] = _mm_set_ps(1.0f,z,y,x);
1226#if PROJECTION_HANDEDNESS_LH
1240#if PROJECTION_HANDEDNESS_LH
1241 return lookatlh(eye, eye + direction, up);
1243 return lookatrh(eye, eye + direction, up);
1254#if PROJECTION_HANDEDNESS_LH
1267#if PROJECTION_HANDEDNESS_LH
1280#if PROJECTION_HANDEDNESS_LH
1293#if PROJECTION_HANDEDNESS_LH
1306#if PROJECTION_HANDEDNESS_LH
#define n_assert(exp)
Definition debug.h:50
#define mm_ror_ps(vec, i)
Definition mat4.h:21
Different curves.
Definition angularpfeedbackloop.h:17
__forceinline vec3 cross(const vec3 &v0, const vec3 &v1)
Definition vec3.h:423
static const f32x4 _id_w
Definition vec3.h:29
__forceinline mat4 rotationz(scalar angle)
Definition mat4.h:1104
__forceinline mat4 rotationyawpitchroll(scalar yaw, scalar pitch, scalar roll)
Definition mat4.h:1123
__forceinline mat4 ortholh(scalar w, scalar h, scalar zn, scalar zf)
Definition mat4.h:835
__forceinline vec3 splat_z(const vec3 &v)
Definition vec3.h:824
__forceinline scalar length3(const vec4 &v)
Definition vec4.h:397
__forceinline mat4 rotationy(scalar angle)
Definition mat4.h:1085
__forceinline vec3 splat_x(const vec3 &v)
Definition vec3.h:804
__forceinline mat4 perspoffcenterlh(scalar l, scalar r, scalar b, scalar t, scalar zn, scalar zf)
Definition mat4.h:972
__forceinline mat4 orthooffcenterlh(scalar l, scalar r, scalar t, scalar b, scalar zn, scalar zf)
Definition mat4.h:865
mat4 reflect(const vec4 &p)
based on this http://www.opengl.org/discussion_boards/showthread.php/169605-reflection-matrix-how-to-...
Definition mat4.cc:22
__forceinline mat4 persprh(scalar w, scalar h, scalar zn, scalar zf)
Definition mat4.h:956
__forceinline vec3 multiply(const vec3 &v0, const vec3 &v1)
Definition vec3.h:387
__forceinline scalar angle(const vec3 &v0, const vec3 &v1)
Definition vec3.h:514
__forceinline mat4 trs(const vec3 &position, const quat &rotation, const vec3 &scale)
A short hand for creating a TRS (translation, rotation, scale) matrix from pos, rot and scale.
Definition mat4.h:1201
__forceinline mat4 rotationaxis(const vec3 &axis, scalar angle)
Definition mat4.h:1008
mat4 rotationquat(const quat &q)
TODO: rewrite using SSE.
Definition mat4.cc:178
__forceinline mat4 translation(scalar x, scalar y, scalar z)
Definition mat4.h:1177
__forceinline scalar length(const quat &q)
Definition quat.h:260
mat4 fromeuler(const vec3 &v)
Definition mat4.cc:237
__forceinline scalar dot(const plane &p, const vec4 &v1)
Definition plane.h:252
__forceinline mat4 orthooffcenter(scalar l, scalar r, scalar b, scalar t, scalar zn, scalar zf)
Definition mat4.h:1304
__forceinline vec3 permute(const vec3 &v0, const vec3 &v1, unsigned int i0, unsigned int i1, unsigned int i2)
Definition vec3.h:834
__forceinline mat4 orthorh(scalar w, scalar h, scalar zn, scalar zf)
Definition mat4.h:850
void decompose(const mat4 &mat, vec3 &outScale, quat &outRotation, vec3 &outTranslation)
Definition mat4.cc:50
__forceinline mat4 lookatrh(const point &eye, const point &at, const vector &up)
Definition mat4.h:607
static const __m128i maskZ
Definition mat4.h:32
__forceinline plane normalize(const plane &p)
Definition plane.h:261
__forceinline mat4 rotationx(scalar angle)
Definition mat4.h:1066
__forceinline mat4 persplh(scalar w, scalar h, scalar zn, scalar zf)
Definition mat4.h:940
__forceinline mat4 scaling(scalar scale)
Definition mat4.h:1133
static const f32x4 _id_y
Definition vec3.h:27
__forceinline mat4 perspfov(scalar fovy, scalar aspect, scalar zn, scalar zf)
Definition mat4.h:1252
__forceinline mat4 ortho(scalar w, scalar h, scalar zn, scalar zf)
Definition mat4.h:1291
static const f32x4 _id_z
Definition vec3.h:28
__forceinline mat4 perspfovrh(scalar fovy, scalar aspect, scalar zn, scalar zf)
Definition mat4.h:916
__forceinline mat4 perspfovlh(scalar fovy, scalar aspect, scalar zn, scalar zf)
Definition mat4.h:893
__forceinline mat4 lookat(point eye, point at, vector up)
Definition mat4.h:1224
__forceinline vec3 splat_y(const vec3 &v)
Definition vec3.h:814
__forceinline bool isidentity(const mat4 &m)
Definition mat4.h:401
__forceinline scalar determinant(const mat4 &m)
Definition mat4.h:413
mat4 skewsymmetric(const vec3 &v)
Definition mat4.h:1210
static const __m128i maskW
Definition mat4.h:33
float scalar
Definition scalar.h:45
mat4 transformation(const vec3 &scalingCenter, const quat &scalingRotation, const vec3 &scale, const vec3 &rotationCenter, const quat &rotation, const vec3 &trans)
Definition mat4.cc:199
__forceinline mat4 orthooffcenterrh(scalar l, scalar r, scalar t, scalar b, scalar zn, scalar zf)
Definition mat4.h:879
__forceinline mat4 perspoffcenter(scalar l, scalar r, scalar b, scalar t, scalar zn, scalar zf)
Definition mat4.h:1278
__forceinline mat4 lookatlh(const point &eye, const point &at, const vector &up)
Definition mat4.h:573
vec3 aseuler(const mat4 &m)
Definition mat4.cc:270
half operator*(half one, half two)
Definition half.h:123
quat quatyawpitchroll(scalar y, scalar x, scalar z)
Definition quat.cc:63
__forceinline scalar abs(scalar a)
Definition scalar.h:451
static const f32x4 _mask_xyz
Definition vec3.h:34
mat4 affine(const vec3 &scale, const vec3 &rotationCenter, const quat &rotation, const vec3 &translation)
Definition mat4.cc:117
__forceinline mat4 lookto(point eye, vector direction, vector up)
Definition mat4.h:1238
__forceinline scalar cos(scalar x)
Definition scalar.h:191
bool ispointinside(const vec4 &p, const mat4 &m)
Definition mat4.cc:224
__forceinline scalar sin(scalar x)
Definition scalar.h:182
static const __m128i maskY
Definition mat4.h:31
__forceinline mat4 transpose(const mat4 &m)
Definition mat4.h:458
static const f32x4 _id_x
Definition vec3.h:26
__forceinline mat4 perspoffcenterrh(scalar l, scalar r, scalar b, scalar t, scalar zn, scalar zf)
Definition mat4.h:990
__forceinline vec4 splat_w(const vec4 &v)
Definition vec4.h:1049
static const __m128i maskX
Definition mat4.h:30
mat4 affinetransformation(scalar scale, const vec3 &rotationCenter, const quat &rotation, const vec3 &translation)
Definition mat4.cc:166
__forceinline __m128 fmadd(__m128 a, __m128 b, __m128 c)
Fused multiply-add operation, (a * b) + c.
Definition sse.h:22
__forceinline mat4 persp(scalar w, scalar h, scalar zn, scalar zf)
Definition mat4.h:1265
__forceinline mat4 inverse(const mat4 &m)
Definition mat4.h:477
Nebula's scalar datatype.
A 4x4 single point precision float matrix.
Definition mat4.h:49
vec4 y_axis
Definition mat4.h:121
float _44
Definition mat4.h:132
vec4 row3
Definition mat4.h:143
float _34
Definition mat4.h:131
vec4 position
Definition mat4.h:123
void translate(const vec3 &t)
add a translation to pos_component
Definition mat4.h:377
vec4 & operator[](size_t const i)
row element accessor
Definition mat4.h:220
float _32
Definition mat4.h:131
float _42
Definition mat4.h:132
float _24
Definition mat4.h:130
mat4(const mat4 &rhs)=default
copy constructor
vec4 get_w() const
Definition mat4.h:368
vec4 row1
Definition mat4.h:141
bool operator==(const mat4 &rhs) const
equality operator
Definition mat4.h:187
vec4 get_x() const
Definition mat4.h:341
void stream(scalar *ptr) const
stream content to 16-byte-aligned memory circumventing the write-cache
Definition mat4.h:291
vec4 z_axis
Definition mat4.h:122
float _21
Definition mat4.h:130
float _43
Definition mat4.h:132
float _33
Definition mat4.h:131
float _23
Definition mat4.h:130
void store3(scalar *ptr) const
write 3 columns to 16-byte aligned memory through the write cache
Definition mat4.h:268
vec4 row0
Definition mat4.h:140
void scale(const vec3 &v)
scale matrix
Definition mat4.h:386
void load(const scalar *ptr)
load content from 16-byte-aligned memory
Definition mat4.h:232
vec4 r[4]
as a two-dimensional array
Definition mat4.h:137
float _31
Definition mat4.h:131
vec4 x_axis
Definition mat4.h:120
vec4 row2
Definition mat4.h:142
float _41
Definition mat4.h:132
float _14
Definition mat4.h:129
vec4 get_y() const
Definition mat4.h:350
void store(scalar *ptr) const
write content to 16-byte-aligned memory through the write cache
Definition mat4.h:256
float m[4][4]
Definition mat4.h:134
void loadu(const scalar *ptr)
load content from unaligned memory
Definition mat4.h:244
void set(const vec4 &r0, const vec4 &r1, const vec4 &r2, const vec4 &r3)
set content from row vectors
Definition mat4.h:301
float _12
Definition mat4.h:129
float _11
Definition mat4.h:129
float _22
Definition mat4.h:130
bool operator!=(const mat4 &rhs) const
inequality operator
Definition mat4.h:199
vec4 get_z() const
Definition mat4.h:359
static const mat4 identity
Definition mat4.h:147
void translate(const float x, const float y, const float z)
add a translation to pos_component
void storeu(scalar *ptr) const
write content to unaligned memory through the write cache
Definition mat4.h:279
float _13
Definition mat4.h:129
void scale(const float x, const float y, const float z)
scale matrix
void get_scale(vec4 &scale) const
extracts scale components to target vector
Definition mat4.h:325
mat4()
default constructor. returns identity matrix
Definition mat4.h:154
__m128 vec
Definition plane.h:46
Represents a 3D point in space.
Definition point.h:22
__m128 vec
Definition point.h:75
A quaternion is usually used to represent an orientation in 3D space.
Definition quat.h:30
A 3D vector.
Definition vec3.h:37
float x
Definition vec3.h:93
float z
Definition vec3.h:93
f32x4 vec
Definition vec3.h:95
float y
Definition vec3.h:93
A 4D vector.
Definition vec4.h:24
__m128 vec
Definition vec4.h:97
float w
Definition vec4.h:95
float x
Definition vec4.h:95
A vector is a 3D direction in space.
Definition vector.h:22
__m128 vec
Definition vector.h:82
bool operator==(const TiXmlString &a, const TiXmlString &b)
Definition tinystr.h:272
bool operator!=(const TiXmlString &a, const TiXmlString &b)
Definition tinystr.h:282
#define NEBULA_ALIGN16
Definition types.h:143