28#ifndef OZZ_OZZ_BASE_MATHS_SOA_FLOAT4X4_H_
29#define OZZ_OZZ_BASE_MATHS_SOA_FLOAT4X4_H_
33#include "ozz/base/maths/soa_float.h"
34#include "ozz/base/maths/soa_quaternion.h"
35#include "ozz/base/platform.h"
55 {zero, one, zero, zero},
56 {zero, zero, one, zero},
57 {zero, zero, zero, one}}};
67 {zero, _v.y, zero, zero},
68 {zero, zero, _v.z, zero},
69 {zero, zero, zero, one}}};
76 assert(AreAllTrue(IsNormalizedEst(_q)));
93 {{one - two * (yy + zz), two * (xy + zw), two * (xz - yw), zero},
94 {two * (xy - zw), one - two * (xx + zz), two * (yz + xw), zero},
95 {two * (xz + yw), two * (yz - xw), one - two * (xx + yy), zero},
96 {zero, zero, zero, one}}};
105 assert(AreAllTrue(IsNormalizedEst(_quaternion)));
111 const SimdFloat4 xx = _quaternion.x * _quaternion.x;
112 const SimdFloat4 xy = _quaternion.x * _quaternion.y;
113 const SimdFloat4 xz = _quaternion.x * _quaternion.z;
114 const SimdFloat4 xw = _quaternion.x * _quaternion.w;
115 const SimdFloat4 yy = _quaternion.y * _quaternion.y;
116 const SimdFloat4 yz = _quaternion.y * _quaternion.z;
117 const SimdFloat4 yw = _quaternion.y * _quaternion.w;
118 const SimdFloat4 zz = _quaternion.z * _quaternion.z;
119 const SimdFloat4 zw = _quaternion.z * _quaternion.w;
122 {{_scale.x * (one - two * (yy + zz)), _scale.x * two * (xy + zw),
123 _scale.x * two * (xz - yw), zero},
124 {_scale.y * two * (xy - zw), _scale.y * (one - two * (xx + zz)),
125 _scale.y * two * (yz + xw), zero},
126 {_scale.z * two * (xz + yw), _scale.z * two * (yz - xw),
127 _scale.z * (one - two * (xx + yy)), zero},
128 {_translation.x, _translation.y, _translation.z, one}}};
136 {{_m.cols[0].x, _m.cols[1].x, _m.cols[2].x, _m.cols[3].x},
137 {_m.cols[0].y, _m.cols[1].y, _m.cols[2].y, _m.cols[3].y},
138 {_m.cols[0].z, _m.cols[1].z, _m.cols[2].z, _m.cols[3].z},
139 {_m.cols[0].w, _m.cols[1].w, _m.cols[2].w, _m.cols[3].w}}};
147OZZ_INLINE SoaFloat4x4 Invert(
const SoaFloat4x4& _m,
148 SimdInt4* _invertible =
nullptr) {
149 const SoaFloat4* cols = _m.cols;
150 const SimdFloat4 a00 = cols[2].z * cols[3].w - cols[3].z * cols[2].w;
151 const SimdFloat4 a01 = cols[2].y * cols[3].w - cols[3].y * cols[2].w;
152 const SimdFloat4 a02 = cols[2].y * cols[3].z - cols[3].y * cols[2].z;
153 const SimdFloat4 a03 = cols[2].x * cols[3].w - cols[3].x * cols[2].w;
154 const SimdFloat4 a04 = cols[2].x * cols[3].z - cols[3].x * cols[2].z;
155 const SimdFloat4 a05 = cols[2].x * cols[3].y - cols[3].x * cols[2].y;
156 const SimdFloat4 a06 = cols[1].z * cols[3].w - cols[3].z * cols[1].w;
157 const SimdFloat4 a07 = cols[1].y * cols[3].w - cols[3].y * cols[1].w;
158 const SimdFloat4 a08 = cols[1].y * cols[3].z - cols[3].y * cols[1].z;
159 const SimdFloat4 a09 = cols[1].x * cols[3].w - cols[3].x * cols[1].w;
160 const SimdFloat4 a10 = cols[1].x * cols[3].z - cols[3].x * cols[1].z;
161 const SimdFloat4 a11 = cols[1].y * cols[3].w - cols[3].y * cols[1].w;
162 const SimdFloat4 a12 = cols[1].x * cols[3].y - cols[3].x * cols[1].y;
163 const SimdFloat4 a13 = cols[1].z * cols[2].w - cols[2].z * cols[1].w;
164 const SimdFloat4 a14 = cols[1].y * cols[2].w - cols[2].y * cols[1].w;
165 const SimdFloat4 a15 = cols[1].y * cols[2].z - cols[2].y * cols[1].z;
166 const SimdFloat4 a16 = cols[1].x * cols[2].w - cols[2].x * cols[1].w;
167 const SimdFloat4 a17 = cols[1].x * cols[2].z - cols[2].x * cols[1].z;
168 const SimdFloat4 a18 = cols[1].x * cols[2].y - cols[2].x * cols[1].y;
170 const SimdFloat4 b0x = cols[1].y * a00 - cols[1].z * a01 + cols[1].w * a02;
171 const SimdFloat4 b1x = -cols[1].x * a00 + cols[1].z * a03 - cols[1].w * a04;
172 const SimdFloat4 b2x = cols[1].x * a01 - cols[1].y * a03 + cols[1].w * a05;
173 const SimdFloat4 b3x = -cols[1].x * a02 + cols[1].y * a04 - cols[1].z * a05;
175 const SimdFloat4 b0y = -cols[0].y * a00 + cols[0].z * a01 - cols[0].w * a02;
176 const SimdFloat4 b1y = cols[0].x * a00 - cols[0].z * a03 + cols[0].w * a04;
177 const SimdFloat4 b2y = -cols[0].x * a01 + cols[0].y * a03 - cols[0].w * a05;
178 const SimdFloat4 b3y = cols[0].x * a02 - cols[0].y * a04 + cols[0].z * a05;
180 const SimdFloat4 b0z = cols[0].y * a06 - cols[0].z * a07 + cols[0].w * a08;
181 const SimdFloat4 b1z = -cols[0].x * a06 + cols[0].z * a09 - cols[0].w * a10;
182 const SimdFloat4 b2z = cols[0].x * a11 - cols[0].y * a09 + cols[0].w * a12;
183 const SimdFloat4 b3z = -cols[0].x * a08 + cols[0].y * a10 - cols[0].z * a12;
185 const SimdFloat4 b0w = -cols[0].y * a13 + cols[0].z * a14 - cols[0].w * a15;
186 const SimdFloat4 b1w = cols[0].x * a13 - cols[0].z * a16 + cols[0].w * a17;
187 const SimdFloat4 b2w = -cols[0].x * a14 + cols[0].y * a16 - cols[0].w * a18;
188 const SimdFloat4 b3w = cols[0].x * a15 - cols[0].y * a17 + cols[0].z * a18;
190 const SimdFloat4 det =
191 cols[0].x * b0x + cols[0].y * b1x + cols[0].z * b2x + cols[0].w * b3x;
192 const SimdInt4 invertible = CmpNe(det, simd_float4::zero());
193 assert((_invertible || AreAllTrue(invertible)) &&
"Matrix is not invertible");
194 if (_invertible !=
nullptr) {
195 *_invertible = invertible;
197 const SimdFloat4 inv_det =
198 Select(invertible, RcpEstNR(det), simd_float4::zero());
200 const SoaFloat4x4 ret = {
201 {{b0x * inv_det, b0y * inv_det, b0z * inv_det, b0w * inv_det},
202 {b1x * inv_det, b1y * inv_det, b1z * inv_det, b1w * inv_det},
203 {b2x * inv_det, b2y * inv_det, b2z * inv_det, b2w * inv_det},
204 {b3x * inv_det, b3y * inv_det, b3z * inv_det, b3w * inv_det}}};
211OZZ_INLINE SoaFloat4x4 Scale(
const SoaFloat4x4& _m,
const SoaFloat4& _v) {
212 const SoaFloat4x4 ret = {{{_m.cols[0].x * _v.x, _m.cols[0].y * _v.x,
213 _m.cols[0].z * _v.x, _m.cols[0].w * _v.x},
214 {_m.cols[1].x * _v.y, _m.cols[1].y * _v.y,
215 _m.cols[1].z * _v.y, _m.cols[1].w * _v.y},
216 {_m.cols[2].x * _v.z, _m.cols[2].y * _v.z,
217 _m.cols[2].z * _v.z, _m.cols[2].w * _v.z},
228 _m.cols[0].x * _v.x + _m.cols[1].x * _v.y + _m.cols[2].x * _v.z +
230 _m.cols[0].y * _v.x + _m.cols[1].y * _v.y + _m.cols[2].y * _v.z +
232 _m.cols[0].z * _v.x + _m.cols[1].z * _v.y + _m.cols[2].z * _v.z +
234 _m.cols[0].w * _v.x + _m.cols[1].w * _v.y + _m.cols[2].w * _v.z +
235 _m.cols[3].w * _v.w};
243 {_a * _b.cols[0], _a * _b.cols[1], _a * _b.cols[2], _a * _b.cols[3]}};
251 {{_a.cols[0].x + _b.cols[0].x, _a.cols[0].y + _b.cols[0].y,
252 _a.cols[0].z + _b.cols[0].z, _a.cols[0].w + _b.cols[0].w},
253 {_a.cols[1].x + _b.cols[1].x, _a.cols[1].y + _b.cols[1].y,
254 _a.cols[1].z + _b.cols[1].z, _a.cols[1].w + _b.cols[1].w},
255 {_a.cols[2].x + _b.cols[2].x, _a.cols[2].y + _b.cols[2].y,
256 _a.cols[2].z + _b.cols[2].z, _a.cols[2].w + _b.cols[2].w},
257 {_a.cols[3].x + _b.cols[3].x, _a.cols[3].y + _b.cols[3].y,
258 _a.cols[3].z + _b.cols[3].z, _a.cols[3].w + _b.cols[3].w}}};
266 {{_a.cols[0].x - _b.cols[0].x, _a.cols[0].y - _b.cols[0].y,
267 _a.cols[0].z - _b.cols[0].z, _a.cols[0].w - _b.cols[0].w},
268 {_a.cols[1].x - _b.cols[1].x, _a.cols[1].y - _b.cols[1].y,
269 _a.cols[1].z - _b.cols[1].z, _a.cols[1].w - _b.cols[1].w},
270 {_a.cols[2].x - _b.cols[2].x, _a.cols[2].y - _b.cols[2].y,
271 _a.cols[2].z - _b.cols[2].z, _a.cols[2].w - _b.cols[2].w},
272 {_a.cols[3].x - _b.cols[3].x, _a.cols[3].y - _b.cols[3].y,
273 _a.cols[3].z - _b.cols[3].z, _a.cols[3].w - _b.cols[3].w}}};
Definition simd_math_config.h:121
Definition soa_float.h:69
Definition soa_float.h:114
Definition soa_float4x4.h:46
Definition soa_quaternion.h:39