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));
461 __m128 r1,r2,r3,tt,tt2;
463 __m128 trns0,trns1,trns2,trns3;
465 const __m128i pnpn = _mm_setr_epi32(0x00000000,
static_cast<int>(0x80000000), 0x00000000,
static_cast<int>(0x80000000));
466 const __m128i npnp = _mm_setr_epi32(
static_cast<int>(0x80000000), 0x00000000,
static_cast<int>(0x80000000), 0x00000000);
467 const __m128 zeroone = _mm_setr_ps(1.0f, 0.0f, 0.0f, 1.0f);
469 __m128 _L1 = m.
r[0].
vec;
470 __m128 _L2 = m.
r[1].
vec;
471 __m128 _L3 = m.
r[2].
vec;
472 __m128 _L4 = m.
r[3].
vec;
486 Va =
mm_ror_ps(tt,1); sum = _mm_mul_ps(Va,r1);
487 Vb =
mm_ror_ps(tt,2); sum = _mm_add_ps(sum,_mm_mul_ps(Vb,r2));
488 Vc =
mm_ror_ps(tt,3); sum = _mm_add_ps(sum,_mm_mul_ps(Vc,r3));
491 Det = _mm_mul_ps(sum,_L1);
492 Det = _mm_add_ps(Det,_mm_movehl_ps(Det,Det));
495 __m128 mtL1 = _mm_xor_ps(sum, _mm_castsi128_ps(pnpn));
498 tt =
mm_ror_ps(_L1,1); sum = _mm_mul_ps(tt,r1);
499 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r2));
500 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r3));
501 __m128 mtL2 = _mm_xor_ps(sum, _mm_castsi128_ps(npnp));
504 Det = _mm_sub_ss(Det,_mm_shuffle_ps(Det,Det,1));
508 Va = _mm_mul_ps(tt,Vb);
509 Vb = _mm_mul_ps(tt,Vc);
510 Vc = _mm_mul_ps(tt,_L2);
516 tt =
mm_ror_ps(_L4,1); sum = _mm_mul_ps(tt,r1);
517 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r2));
518 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r3));
519 __m128 mtL3 = _mm_xor_ps(sum, _mm_castsi128_ps(pnpn));
522 RDet = _mm_div_ss(zeroone, Det);
523 RDet = _mm_shuffle_ps(RDet,RDet,0x00);
526 mtL1 = _mm_mul_ps(mtL1, RDet);
527 mtL2 = _mm_mul_ps(mtL2, RDet);
528 mtL3 = _mm_mul_ps(mtL3, RDet);
531 tt =
mm_ror_ps(_L3,1); sum = _mm_mul_ps(tt,r1);
532 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r2));
533 tt =
mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r3));
534 __m128 mtL4 = _mm_xor_ps(sum, _mm_castsi128_ps(npnp));
535 mtL4 = _mm_mul_ps(mtL4, RDet);
538 trns0 = _mm_unpacklo_ps(mtL1,mtL2);
539 trns1 = _mm_unpacklo_ps(mtL3,mtL4);
540 trns2 = _mm_unpackhi_ps(mtL1,mtL2);
541 trns3 = _mm_unpackhi_ps(mtL3,mtL4);
542 _L1 = _mm_movelh_ps(trns0,trns1);
543 _L2 = _mm_movehl_ps(trns1,trns0);
544 _L3 = _mm_movelh_ps(trns2,trns3);
545 _L4 = _mm_movehl_ps(trns3,trns2);
569 normUp =
permute(normUp, normUp, 1, 2, 0);
573 return mat4(xaxis, yaxis, zaxis, eye);
595 normUp =
permute(normUp, normUp, 1, 2, 0);
599 return mat4(xaxis, yaxis, zaxis, eye);
604static inline __m256 twolincomb_AVX_8(__m256 A01,
const mat4 &B)
607 result = _mm256_mul_ps(_mm256_shuffle_ps(A01, A01, 0x00), _mm256_broadcast_ps(&B.r[0].vec));
608 result = _mm256_add_ps(result, _mm256_mul_ps(_mm256_shuffle_ps(A01, A01, 0x55), _mm256_broadcast_ps(&B.r[1].vec)));
609 result = _mm256_add_ps(result, _mm256_mul_ps(_mm256_shuffle_ps(A01, A01, 0xaa), _mm256_broadcast_ps(&B.r[2].vec)));
610 result = _mm256_add_ps(result, _mm256_mul_ps(_mm256_shuffle_ps(A01, A01, 0xff), _mm256_broadcast_ps(&B.r[3].vec)));
623 __m256 A01 = _mm256_loadu_ps(&m1.m[0][0]);
624 __m256 A23 = _mm256_loadu_ps(&m1.m[2][0]);
626 __m256 out01x = twolincomb_AVX_8(A01, m0);
627 __m256 out23x = twolincomb_AVX_8(A23, m0);
629 _mm256_storeu_ps(&out.m[0][0], out01x);
630 _mm256_storeu_ps(&out.m[2][0], out23x);
634__forceinline
mat4 operator%(
const mat4& m1,
const mat4& m0) =
delete;
727 __m128 x = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(0, 0, 0, 0));
728 __m128 y = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(1, 1, 1, 1));
729 __m128 z = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(2, 2, 2, 2));
730 __m128 w = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(3, 3, 3, 3));
736 _mm_mul_ps(w, m.
r[3].
vec))));
745 __m128 x = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(0, 0, 0, 0));
747 __m128 y = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(1, 1, 1, 1));
749 __m128 z = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(2, 2, 2, 2));
755 _mm_mul_ps(z, m.
r[2].
vec)));
764 __m128 x = _mm_shuffle_ps(p.
vec, p.
vec, _MM_SHUFFLE(0, 0, 0, 0));
765 __m128 y = _mm_shuffle_ps(p.
vec, p.
vec, _MM_SHUFFLE(1, 1, 1, 1));
766 __m128 z = _mm_shuffle_ps(p.
vec, p.
vec, _MM_SHUFFLE(2, 2, 2, 2));
767 __m128 w = _mm_shuffle_ps(p.
vec, p.
vec, _MM_SHUFFLE(3, 3, 3, 3));
773 _mm_mul_ps(w, m.
r[3].
vec))));
782 __m128 x = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(0, 0, 0, 0));
784 __m128 y = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(1, 1, 1, 1));
786 __m128 z = _mm_shuffle_ps(v.
vec, v.
vec, _MM_SHUFFLE(2, 2, 2, 2));
792 _mm_mul_ps(z, m.
r[2].
vec)));
802 scalar dist = 1.0f / (zf - zn);
803 m.
r[0] =
vec4(2.0f / w, 0.0f, 0.0f, 0.0f);
804 m.
r[1] =
vec4(0.0f, 2.0f / h, 0.0f, 0.0f);
805 m.
r[2] =
vec4(0.0f, 0.0f, 2.0f * dist, 0.0f);
806 m.
r[3] =
vec4(0.0f, 0.0, -dist * (zf + zn), 1.0f);
817 scalar dist = 1.0f / (zn - zf);
818 m.
r[0] =
vec4(2.0f / w, 0.0f, 0.0f, 0.0f);
819 m.
r[1] =
vec4(0.0f, 2.0f / h, 0.0f, 0.0f);
820 m.
r[2] =
vec4(0.0f, 0.0f, 2.0f * dist, 0.0f);
821 m.
r[3] =
vec4(0.0f, 0.0, dist * (zf + zn), 1.0f);
832 scalar divwidth = 1.0f / (r - l);
833 scalar divheight = 1.0f / (t - b);
834 scalar dist = 1.0f / (zf - zn);
835 m.
r[0] =
vec4(2.0f * divwidth, 0.0f, 0.0f, 0.0f);
836 m.
r[1] =
vec4(0.0f, 2.0f * divheight, 0.0f, 0.0f);
837 m.
r[2] =
vec4(0.0f, 0.0f, 2.0f * dist, 0.0f);
838 m.
r[3] =
vec4(-(l+r) * divwidth, - (b+t) * divheight, -dist * (zf + zn), 1.0f);
849 scalar divwidth = 1.0f / (r - l);
850 scalar divheight = 1.0f / (t - b);
851 scalar dist = 1.0f / (zn - zf);
852 m.
r[0] =
vec4(2.0f * divwidth, 0.0f, 0.0f, 0.0f);
853 m.
r[1] =
vec4(0.0f, 2.0f * divheight, 0.0f, 0.0f);
854 m.
r[2] =
vec4(0.0f, 0.0f, 2.0f * dist, 0.0f);
855 m.
r[3] =
vec4(-(l+r) * divwidth, - (b+t) * divheight, dist * (zf + zn), 1.0f);
866 scalar halfFov = 0.5f * fovy;
870 scalar height = cosfov / sinfov;
871 scalar width = height / aspect;
873 scalar dist = zf / (zf - zn);
874 m.
r[0] =
vec4(width, 0.0f, 0.0f, 0.0f);
875 m.
r[1] =
vec4(0.0f, height, 0.0f, 0.0f);
876 m.
r[2] =
vec4(0.0f, 0.0f, dist, 1.0f);
877 m.
r[3] =
vec4(0.0f, 0.0f, -dist * zn, 0.0f);
889 scalar halfFov = 0.5f * fovy;
893 scalar height = cosfov / sinfov;
894 scalar width = height / aspect;
896 scalar dist = zf / (zn - zf);
898 m.
r[0] =
vec4(width, 0.0f, 0.0f, 0.0f);
899 m.
r[1] =
vec4(0.0f, height, 0.0f, 0.0f);
900 m.
r[2] =
vec4(0.0f, 0.0f, dist, -1.0f);
901 m.
r[3] =
vec4(0.0f, 0.0f, dist * zn, 0.0f);
913 scalar dist = zf / (zf - zn);
915 m.
r[0] =
vec4(2.0f * zn / w, 0.0f, 0.0f, 0.0f);
916 m.
r[1] =
vec4(0.0f, 2.0f * zn / h, 0.0f, 0.0f);
917 m.
r[2] =
vec4(0.0f, 0.0f, dist, 1.0f);
918 m.
r[3] =
vec4(0.0f, 0.0, -dist * zn, 0.0f);
929 scalar dist = zf / (zn - zf);
931 m.
r[0] =
vec4(2.0f * zn / w, 0.0f, 0.0f, 0.0f);
932 m.
r[1] =
vec4(0.0f, 2.0f * zn / h, 0.0f, 0.0f);
933 m.
r[2] =
vec4(0.0f, 0.0f, dist, -1.0f);
934 m.
r[3] =
vec4(0.0f, 0.0, dist * zn, 0.0f);
945 scalar divwidth = 1.0f / (r - l);
946 scalar divheight = 1.0f / (t - b);
947 scalar dist = zf / (zf - zn);
949 m.
r[0] =
vec4(2.0f * zn * divwidth, 0.0f, 0.0f, 0.0f);
950 m.
r[1] =
vec4(0.0f, 2.0f * zn * divheight, 0.0f, 0.0f);
951 m.
r[2] =
vec4(-(l + r) * divwidth, -(b + t) * divheight, dist, 1.0f);
952 m.
r[3] =
vec4(0.0f, 0.0f, -dist * zn, 0.0f);
963 scalar divwidth = 1.0f / (r - l);
964 scalar divheight = 1.0f / (t - b);
965 scalar dist = zf / (zn - zf);
967 m.
r[0] =
vec4(2.0f * zn * divwidth, 0.0f, 0.0f, 0.0f);
968 m.
r[1] =
vec4(0.0f, 2.0f * zn * divheight, 0.0f, 0.0f);
969 m.
r[2] =
vec4((l + r) * divwidth, (b + t) * divheight, dist, -1.0f);
970 m.
r[3] =
vec4(0.0f, 0.0f, dist * zn, 0.0f);
985 __m128 m1_c = _mm_set_ps1(1.0f - cangle);
986 __m128 c = _mm_set_ps1(cangle);
987 __m128 s = _mm_set_ps1(sangle);
989 __m128 nn1 = _mm_shuffle_ps(norm,norm,_MM_SHUFFLE(3,0,2,1));
990 __m128 nn2 = _mm_shuffle_ps(norm,norm,_MM_SHUFFLE(3,1,0,2));
992 __m128 v = _mm_mul_ps(nn1,m1_c);
993 v = _mm_mul_ps(nn2,v);
995 __m128 nn3 = _mm_mul_ps(norm, m1_c);
996 nn3 = _mm_mul_ps(norm, nn3);
997 nn3 = _mm_add_ps(nn3, c);
999 __m128 nn4 = _mm_mul_ps(norm,s);
1000 nn4 = _mm_add_ps(nn4, v);
1001 __m128 nn5 = _mm_mul_ps(s, norm);
1002 nn5 = _mm_sub_ps(v,nn5);
1006 __m128 v1 = _mm_shuffle_ps(nn4,nn5,_MM_SHUFFLE(2,1,2,0));
1007 v1 = _mm_shuffle_ps(v1,v1,_MM_SHUFFLE(0,3,2,1));
1009 __m128 v2 = _mm_shuffle_ps(nn4,nn5,_MM_SHUFFLE(0,0,1,1));
1010 v2 = _mm_shuffle_ps(v2,v2,_MM_SHUFFLE(2,0,2,0));
1013 nn5 = _mm_shuffle_ps(v,v1,_MM_SHUFFLE(1,0,3,0));
1014 nn5 = _mm_shuffle_ps(nn5,nn5,_MM_SHUFFLE(1,3,2,0));
1019 nn5 = _mm_shuffle_ps(v,v1,_MM_SHUFFLE(3,2,3,1));
1020 nn5 = _mm_shuffle_ps(nn5,nn5,_MM_SHUFFLE(1,3,0,2));
1023 v2 = _mm_shuffle_ps(v2,v,_MM_SHUFFLE(3,2,1,0));
1046 m.
m[2][1] = -sangle;
1063 m.
m[0][2] = -sangle;
1084 m.
m[1][0] = -sangle;
1106 m.
r[0] = _mm_setr_ps(scale, 0.0f, 0.0f, 0.0f);
1107 m.
r[1] = _mm_setr_ps(0.0f, scale, 0.0f, 0.0f);
1108 m.
r[2] = _mm_setr_ps(0.0f, 0.0f, scale, 0.0f);
1109 m.
r[3] = _mm_setr_ps(0.0f, 0.0f, 0.0f, 1.0f);
1121 m.
r[0] = _mm_setr_ps(sx, 0.0f, 0.0f, 0.0f);
1122 m.
r[1] = _mm_setr_ps(0.0f, sy, 0.0f, 0.0f);
1123 m.
r[2] = _mm_setr_ps(0.0f, 0.0f, sz, 0.0f);
1124 m.
r[3] = _mm_setr_ps(0.0f, 0.0f, 0.0f, 1.0f);
1136 m.
r[0] = _mm_and_ps(s.
vec, _mm_castsi128_ps(
maskX));
1137 m.
r[1] = _mm_and_ps(s.
vec, _mm_castsi128_ps(
maskY));
1138 m.
r[2] = _mm_and_ps(s.
vec, _mm_castsi128_ps(
maskZ));
1150 m.
r[3] = _mm_set_ps(1.0f,z,y,x);
1182 __m128 tmp3, tmp2, tmp1, tmp0;
1183 tmp0 = _mm_unpacklo_ps(m.
r[0].
vec, m.
r[1].
vec);
1184 tmp2 = _mm_unpacklo_ps(m.
r[2].
vec, m.
r[3].
vec);
1185 tmp1 = _mm_unpackhi_ps(m.
r[0].
vec, m.
r[1].
vec);
1186 tmp3 = _mm_unpackhi_ps(m.
r[2].
vec, m.
r[3].
vec);
1188 ret.
r[0] = _mm_movelh_ps(tmp0, tmp2);
1189 ret.
r[1] = _mm_movehl_ps(tmp2, tmp0);
1190 ret.
r[2] = _mm_movelh_ps(tmp1, tmp3);
1191 ret.
r[3] = _mm_movehl_ps(tmp3, tmp1);
#define n_assert(exp)
Definition debug.h:50
#define mm_ror_ps(vec, i)
Definition mat4.h:21
Different curves.
Definition angularpfeedbackloop.h:17
static const __m128 _id_z
Definition vec3.h:31
__forceinline vec3 cross(const vec3 &v0, const vec3 &v1)
Definition vec3.h:441
static const __m128 _id_x
Definition vec3.h:29
__forceinline mat4 rotationz(scalar angle)
Definition mat4.h:1074
__forceinline mat4 rotationyawpitchroll(scalar yaw, scalar pitch, scalar roll)
Definition mat4.h:1093
__forceinline mat4 ortholh(scalar w, scalar h, scalar zn, scalar zf)
Definition mat4.h:799
__forceinline vec3 splat_z(const vec3 &v)
Definition vec3.h:847
__forceinline scalar length3(const vec4 &v)
Definition vec4.h:397
__forceinline mat4 rotationy(scalar angle)
Definition mat4.h:1055
__forceinline vec3 splat_x(const vec3 &v)
Definition vec3.h:825
__forceinline mat4 perspoffcenterlh(scalar l, scalar r, scalar b, scalar t, scalar zn, scalar zf)
Definition mat4.h:942
__forceinline mat4 orthooffcenterlh(scalar l, scalar r, scalar t, scalar b, scalar zn, scalar zf)
Definition mat4.h:829
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:926
__forceinline vec3 multiply(const vec3 &v0, const vec3 &v1)
Definition vec3.h:399
__forceinline scalar angle(const vec3 &v0, const vec3 &v1)
Definition vec3.h:532
__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:1171
__forceinline mat4 rotationaxis(const vec3 &axis, scalar angle)
Definition mat4.h:978
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:1147
__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 vec3 permute(const vec3 &v0, const vec3 &v1, unsigned int i0, unsigned int i1, unsigned int i2)
Definition vec3.h:858
__forceinline mat4 orthorh(scalar w, scalar h, scalar zn, scalar zf)
Definition mat4.h:814
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:580
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:1036
__forceinline mat4 persplh(scalar w, scalar h, scalar zn, scalar zf)
Definition mat4.h:910
__forceinline mat4 scaling(scalar scale)
Definition mat4.h:1103
__forceinline mat4 perspfovrh(scalar fovy, scalar aspect, scalar zn, scalar zf)
Definition mat4.h:886
static const __m128 _id_w
Definition vec3.h:32
__forceinline mat4 perspfovlh(scalar fovy, scalar aspect, scalar zn, scalar zf)
Definition mat4.h:863
__forceinline vec3 splat_y(const vec3 &v)
Definition vec3.h:836
__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:1199
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:846
__forceinline mat4 lookatlh(const point &eye, const point &at, const vector &up)
Definition mat4.h:554
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:441
mat4 affine(const vec3 &scale, const vec3 &rotationCenter, const quat &rotation, const vec3 &translation)
Definition mat4.cc:117
__forceinline scalar cos(scalar x)
Definition scalar.h:191
bool ispointinside(const vec4 &p, const mat4 &m)
Definition mat4.cc:224
static const __m128 _mask_xyz
Definition vec3.h:37
__forceinline scalar sin(scalar x)
Definition scalar.h:182
static const __m128i maskY
Definition mat4.h:31
static const __m128 _id_y
Definition vec3.h:30
__forceinline mat4 transpose(const mat4 &m)
Definition mat4.h:1180
__forceinline mat4 perspoffcenterrh(scalar l, scalar r, scalar b, scalar t, scalar zn, scalar zf)
Definition mat4.h:960
__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 inverse(const mat4 &m)
Definition mat4.h:458
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:40
float x
Definition vec3.h:96
float z
Definition vec3.h:96
__m128 vec
Definition vec3.h:98
float y
Definition vec3.h:96
A 4D vector.
Definition vec4.h:24
__m128 vec
Definition vec4.h:97
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:146