RavEngine
Loading...
Searching...
No Matches
PxVecMathAoSScalarInline.h
1// Redistribution and use in source and binary forms, with or without
2// modification, are permitted provided that the following conditions
3// are met:
4// * Redistributions of source code must retain the above copyright
5// notice, this list of conditions and the following disclaimer.
6// * Redistributions in binary form must reproduce the above copyright
7// notice, this list of conditions and the following disclaimer in the
8// documentation and/or other materials provided with the distribution.
9// * Neither the name of NVIDIA CORPORATION nor the names of its
10// contributors may be used to endorse or promote products derived
11// from this software without specific prior written permission.
12//
13// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24//
25// Copyright (c) 2008-2022 NVIDIA Corporation. All rights reserved.
26// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
27// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
28
29#ifndef PX_VEC_MATH_AOS_SCALAR_INLINE_H
30#define PX_VEC_MATH_AOS_SCALAR_INLINE_H
31
32#if COMPILE_VECTOR_INTRINSICS
33#error Scalar version should not be included when using vector intrinsics.
34#endif
35
36#if !PX_DOXYGEN
37namespace physx
38{
39#endif
40namespace aos
41{
42
43#define BOOL_TO_U32(b) PxU32(- PxI32(b))
44#define TRUE_TO_U32 PxU32(-1)
45#define FALSE_TO_U32 PxU32(0)
46
47#define BOOL_TO_U16(b) PxU16(- PxI32(b))
48
49#define PX_VECMATH_ASSERT_ENABLED 0
50
51#if PX_VECMATH_ASSERT_ENABLED
52#define VECMATHAOS_ASSERT(x) { PX_ASSERT(x); }
53#else
54#define VECMATHAOS_ASSERT(x)
55#endif
56
60
61namespace internalScalarSimd
62{
63PX_FORCE_INLINE PxF32 FStore(const FloatV a)
64{
65 return a.x;
66}
67
68PX_FORCE_INLINE bool hasZeroElementInFloatV(const FloatV a)
69{
70 return (0 == a.x);
71}
72
73PX_FORCE_INLINE bool hasZeroElementInVec3V(const Vec3V a)
74{
75 return (0 == a.x || 0 == a.y || 0 == a.z);
76}
77
78PX_FORCE_INLINE bool hasZeroElementInVec4V(const Vec4V a)
79{
80 return (0 == a.x || 0 == a.y || 0 == a.z || 0 == a.w);
81}
82}
83
84namespace vecMathTests
85{
86// PT: this function returns an invalid Vec3V (W!=0.0f) just for unit-testing 'isValidVec3V'
87PX_FORCE_INLINE Vec3V getInvalidVec3V()
88{
89 Vec3V tmp;
90 tmp.x = tmp.y = tmp.z = 0.0f;
91 tmp.pad = 1.0f;
92 return tmp;
93}
94
95PX_FORCE_INLINE bool allElementsEqualFloatV(const FloatV a, const FloatV b)
96{
97 return (a.x == b.x);
98}
99
100PX_FORCE_INLINE bool allElementsEqualVec3V(const Vec3V a, const Vec3V b)
101{
102 return (a.x == b.x && a.y == b.y && a.z == b.z);
103}
104
105PX_FORCE_INLINE bool allElementsEqualVec4V(const Vec4V a, const Vec4V b)
106{
107 return (a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w);
108}
109
110PX_FORCE_INLINE bool allElementsEqualBoolV(const BoolV a, const BoolV b)
111{
112 return (a.ux == b.ux && a.uy == b.uy && a.uz == b.uz && a.uw == b.uw);
113}
114
115PX_FORCE_INLINE bool allElementsEqualVecU32V(const VecU32V a, const VecU32V b)
116{
117 return (a.u32[0] == b.u32[0] && a.u32[1] == b.u32[1] && a.u32[2] == b.u32[2] && a.u32[3] == b.u32[3]);
118}
119
120PX_FORCE_INLINE bool allElementsEqualVecI32V(const VecI32V a, const VecI32V b)
121{
122 return (a.i32[0] == b.i32[0] && a.i32[1] == b.i32[1] && a.i32[2] == b.i32[2] && a.i32[3] == b.i32[3]);
123}
124
125#define VECMATH_AOS_EPSILON (1e-3f)
126
127PX_FORCE_INLINE bool allElementsNearEqualFloatV(const FloatV a, const FloatV b)
128{
129 const PxF32 cx = a.x - b.x;
130 return (cx > -VECMATH_AOS_EPSILON && cx < VECMATH_AOS_EPSILON);
131}
132
133PX_FORCE_INLINE bool allElementsNearEqualVec3V(const Vec3V a, const Vec3V b)
134{
135 const PxF32 cx = a.x - b.x;
136 const PxF32 cy = a.y - b.y;
137 const PxF32 cz = a.z - b.z;
138 return (cx > -VECMATH_AOS_EPSILON && cx < VECMATH_AOS_EPSILON && cy > -VECMATH_AOS_EPSILON &&
139 cy < VECMATH_AOS_EPSILON && cz > -VECMATH_AOS_EPSILON && cz < VECMATH_AOS_EPSILON);
140}
141
142PX_FORCE_INLINE bool allElementsNearEqualVec4V(const Vec4V a, const Vec4V b)
143{
144 const PxF32 cx = a.x - b.x;
145 const PxF32 cy = a.y - b.y;
146 const PxF32 cz = a.z - b.z;
147 const PxF32 cw = a.w - b.w;
148 return (cx > -VECMATH_AOS_EPSILON && cx < VECMATH_AOS_EPSILON && cy > -VECMATH_AOS_EPSILON &&
149 cy < VECMATH_AOS_EPSILON && cz > -VECMATH_AOS_EPSILON && cz < VECMATH_AOS_EPSILON &&
150 cw > -VECMATH_AOS_EPSILON && cw < VECMATH_AOS_EPSILON);
151}
152}
153
155
156PX_FORCE_INLINE bool isValidVec3V(const Vec3V a)
157{
158 return a.pad == 0.f;
159}
160
161PX_FORCE_INLINE bool isFiniteFloatV(const FloatV a)
162{
163 return PxIsFinite(a.x);
164}
165
166PX_FORCE_INLINE bool isFiniteVec3V(const Vec3V a)
167{
168 return PxIsFinite(a.x) && PxIsFinite(a.y) && PxIsFinite(a.z);
169}
170
171PX_FORCE_INLINE bool isFiniteVec4V(const Vec4V a)
172{
173 return PxIsFinite(a.x) && PxIsFinite(a.y) && PxIsFinite(a.z) && PxIsFinite(a.w);
174}
175
179
180PX_FORCE_INLINE FloatV FLoad(const PxF32 f)
181{
182 return FloatV(f);
183}
184
185PX_FORCE_INLINE Vec3V V3Load(const PxF32 f)
186{
187 return Vec3V(f, f, f);
188}
189
190PX_FORCE_INLINE Vec4V V4Load(const PxF32 f)
191{
192 return Vec4V(f, f, f, f);
193}
194
195PX_FORCE_INLINE BoolV BLoad(const bool f)
196{
197#if PX_ARM
198 // SD: Android ARM builds fail if this is done with a cast.
199 // Might also fail because of something else but the select
200 // operator here seems to fix everything that failed in release builds.
201 return f ? BTTTT() : BFFFF();
202#else
203 return BoolV(BOOL_TO_U32(f), BOOL_TO_U32(f), BOOL_TO_U32(f), BOOL_TO_U32(f));
204#endif
205}
206
207PX_FORCE_INLINE Vec3V V3LoadA(const PxVec3& f)
208{
209 return Vec3V(f.x, f.y, f.z);
210}
211
212PX_FORCE_INLINE Vec3V V3LoadU(const PxVec3& f)
213{
214 return Vec3V(f.x, f.y, f.z);
215}
216
217PX_FORCE_INLINE Vec3V V3LoadUnsafeA(const PxVec3& f)
218{
219 return Vec3V(f.x, f.y, f.z);
220}
221
222PX_FORCE_INLINE Vec3V V3LoadA(const PxF32* const f)
223{
224 return Vec3V(f[0], f[1], f[2]);
225}
226
227PX_FORCE_INLINE Vec3V V3LoadU(const PxF32* const f)
228{
229 return Vec3V(f[0], f[1], f[2]);
230}
231
232PX_FORCE_INLINE Vec3V Vec3V_From_Vec4V(Vec4V f)
233{
234 return Vec3V(f.x, f.y, f.z);
235}
236
237PX_FORCE_INLINE Vec3V Vec3V_From_Vec4V_WUndefined(const Vec4V v)
238{
239 return Vec3V(v.x, v.y, v.z);
240}
241
242PX_FORCE_INLINE Vec4V Vec4V_From_Vec3V(Vec3V f)
243{
244 return Vec4V(f.x, f.y, f.z, 0.0f);
245}
246
247PX_FORCE_INLINE Vec4V Vec4V_From_FloatV(FloatV f)
248{
249 return Vec4V(f.x, f.x, f.x, f.x);
250}
251
252PX_FORCE_INLINE Vec3V Vec3V_From_FloatV(FloatV f)
253{
254 return Vec3V(f.x, f.x, f.x);
255}
256
257PX_FORCE_INLINE Vec3V Vec3V_From_FloatV_WUndefined(FloatV f)
258{
259 return Vec3V(f.x, f.x, f.x);
260}
261
262PX_FORCE_INLINE Vec4V V4LoadA(const PxF32* const f)
263{
264 return Vec4V(f[0], f[1], f[2], f[3]);
265}
266
267PX_FORCE_INLINE void V4StoreA(const Vec4V a, PxF32* f)
268{
269 *reinterpret_cast<Vec4V*>(f) = a;
270}
271
272PX_FORCE_INLINE void V4StoreU(const Vec4V a, PxF32* f)
273{
274 *reinterpret_cast<PxVec4*>(f) = *reinterpret_cast<const PxVec4*>(&a.x);
275}
276
277PX_FORCE_INLINE void BStoreA(const BoolV a, PxU32* f)
278{
279 *reinterpret_cast<BoolV*>(f) = a;
280}
281
282PX_FORCE_INLINE void U4StoreA(const VecU32V uv, PxU32* u)
283{
284 *reinterpret_cast<VecU32V*>(u) = uv;
285}
286
287PX_FORCE_INLINE void I4StoreA(const VecI32V iv, PxI32* i)
288{
289 *reinterpret_cast<VecI32V*>(i) = iv;
290}
291
292PX_FORCE_INLINE Vec4V V4LoadU(const PxF32* const f)
293{
294 return Vec4V(f[0], f[1], f[2], f[3]);
295}
296
297PX_FORCE_INLINE Vec4V Vec4V_From_PxVec3_WUndefined(const PxVec3& f)
298{
299 return Vec4V(f[0], f[1], f[2], 0.0f);
300}
301
302PX_FORCE_INLINE BoolV BLoad(const bool* const f)
303{
304 return BoolV(BOOL_TO_U32(f[0]), BOOL_TO_U32(f[1]), BOOL_TO_U32(f[2]), BOOL_TO_U32(f[3]));
305}
306
307PX_FORCE_INLINE void FStore(const FloatV a, PxF32* PX_RESTRICT f)
308{
309 *f = a.x;
310}
311
312PX_FORCE_INLINE void V3StoreA(const Vec3V a, PxVec3& f)
313{
314 f = PxVec3(a.x, a.y, a.z);
315}
316
317PX_FORCE_INLINE void V3StoreU(const Vec3V a, PxVec3& f)
318{
319 f = PxVec3(a.x, a.y, a.z);
320}
321
322PX_FORCE_INLINE void Store_From_BoolV(const BoolV b, PxU32* b2)
323{
324 *b2 = b.ux;
325}
326
328// FLOATV
330
331PX_FORCE_INLINE FloatV FZero()
332{
333 return FLoad(0.0f);
334}
335
336PX_FORCE_INLINE FloatV FOne()
337{
338 return FLoad(1.0f);
339}
340
341PX_FORCE_INLINE FloatV FHalf()
342{
343 return FLoad(0.5f);
344}
345
346PX_FORCE_INLINE FloatV FEps()
347{
348 return FLoad(PX_EPS_REAL);
349}
350
351PX_FORCE_INLINE FloatV FEps6()
352{
353 return FLoad(1e-6f);
354}
355
357PX_FORCE_INLINE FloatV FMax()
358{
359 return FLoad(PX_MAX_REAL);
360}
362
363PX_FORCE_INLINE FloatV FNegMax()
364{
365 return FLoad(-PX_MAX_REAL);
366}
367
368PX_FORCE_INLINE FloatV FNeg(const FloatV f)
369{
370 return FloatV(-f.x);
371}
372
373PX_FORCE_INLINE FloatV FAdd(const FloatV a, const FloatV b)
374{
375 return FloatV(a.x + b.x);
376}
377
378PX_FORCE_INLINE FloatV FSub(const FloatV a, const FloatV b)
379{
380 return FloatV(a.x - b.x);
381}
382
383PX_FORCE_INLINE FloatV FMul(const FloatV a, const FloatV b)
384{
385 return FloatV(a.x * b.x);
386}
387
388PX_FORCE_INLINE FloatV FDiv(const FloatV a, const FloatV b)
389{
390 VECMATHAOS_ASSERT(b.x != 0.0f);
391 return FloatV(a.x / b.x);
392}
393
394PX_FORCE_INLINE FloatV FDivFast(const FloatV a, const FloatV b)
395{
396 VECMATHAOS_ASSERT(b.x != 0.0f);
397 return FloatV(a.x / b.x);
398}
399
400PX_FORCE_INLINE FloatV FRecip(const FloatV a)
401{
402 VECMATHAOS_ASSERT(a.x != 0.0f);
403 return 1.0f / a.x;
404}
405
406PX_FORCE_INLINE FloatV FRecipFast(const FloatV a)
407{
408 VECMATHAOS_ASSERT(a.x != 0.0f);
409 return 1.0f / a.x;
410}
411
412PX_FORCE_INLINE FloatV FRsqrt(const FloatV a)
413{
414 VECMATHAOS_ASSERT(a.x != 0.0f);
415 return PxRecipSqrt(a.x);
416}
417
418PX_FORCE_INLINE FloatV FSqrt(const FloatV a)
419{
420 return PxSqrt(a.x);
421}
422
423PX_FORCE_INLINE FloatV FRsqrtFast(const FloatV a)
424{
425 VECMATHAOS_ASSERT(a.x != 0.0f);
426 return PxRecipSqrt(a.x);
427}
428
429PX_FORCE_INLINE FloatV FScaleAdd(const FloatV a, const FloatV b, const FloatV c)
430{
431 return FAdd(FMul(a, b), c);
432}
433
434PX_FORCE_INLINE FloatV FNegScaleSub(const FloatV a, const FloatV b, const FloatV c)
435{
436 return FSub(c, FMul(a, b));
437}
438
439PX_FORCE_INLINE FloatV FAbs(const FloatV a)
440{
441 return FloatV(PxAbs(a.x));
442}
443
444PX_FORCE_INLINE FloatV FSel(const BoolV c, const FloatV a, const FloatV b)
445{
446 return FloatV(c.ux ? a.x : b.x);
447}
448
449PX_FORCE_INLINE BoolV FIsGrtr(const FloatV a, const FloatV b)
450{
451 return BLoad(a.x > b.x);
452}
453
454PX_FORCE_INLINE BoolV FIsGrtrOrEq(const FloatV a, const FloatV b)
455{
456 return BLoad(a.x >= b.x);
457}
458
459PX_FORCE_INLINE BoolV FIsEq(const FloatV a, const FloatV b)
460{
461 return BLoad(a.x == b.x);
462}
463
464PX_FORCE_INLINE FloatV FMax(const FloatV a, const FloatV b)
465{
466 return (a.x > b.x ? FloatV(a.x) : FloatV(b.x));
467}
468
469PX_FORCE_INLINE FloatV FMin(const FloatV a, const FloatV b)
470{
471 return (a.x > b.x ? FloatV(b.x) : FloatV(a.x));
472}
473
474PX_FORCE_INLINE FloatV FClamp(const FloatV a, const FloatV minV, const FloatV maxV)
475{
476 return FMax(FMin(a, maxV), minV);
477}
478
479PX_FORCE_INLINE PxU32 FAllGrtr(const FloatV a, const FloatV b)
480{
481 return BOOL_TO_U32(a.x > b.x);
482}
483
484PX_FORCE_INLINE PxU32 FAllGrtrOrEq(const FloatV a, const FloatV b)
485{
486 return BOOL_TO_U32(a.x >= b.x);
487}
488PX_FORCE_INLINE PxU32 FAllEq(const FloatV a, const FloatV b)
489{
490 return BOOL_TO_U32(a.x == b.x);
491}
492
493PX_FORCE_INLINE FloatV FRound(const FloatV a)
494{
495 return floorf(a.x + 0.5f);
496}
497
498PX_FORCE_INLINE FloatV FSin(const FloatV a)
499{
500 return sinf(a.x);
501}
502
503PX_FORCE_INLINE FloatV FCos(const FloatV a)
504{
505 return cosf(a.x);
506}
507
508PX_FORCE_INLINE PxU32 FOutOfBounds(const FloatV a, const FloatV min, const FloatV max)
509{
510 return BOOL_TO_U32(a.x > max.x || a.x < min.x);
511}
512
513PX_FORCE_INLINE PxU32 FInBounds(const FloatV a, const FloatV min, const FloatV max)
514{
515 return BOOL_TO_U32(a.x >= min.x && a.x <= max.x);
516}
517
518PX_FORCE_INLINE PxU32 FOutOfBounds(const FloatV a, const FloatV bounds)
519{
520 return FOutOfBounds(a, FNeg(bounds), bounds);
521}
522
523PX_FORCE_INLINE PxU32 FInBounds(const FloatV a, const FloatV bounds)
524{
525 return FInBounds(a, FNeg(bounds), bounds);
526}
527
529// VEC3V
531
532PX_FORCE_INLINE Vec3V V3Splat(const FloatV f)
533{
534 return Vec3V(f.x, f.x, f.x);
535}
536
537PX_FORCE_INLINE Vec3V V3Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z)
538{
539 return Vec3V(x.x, y.x, z.x);
540}
541
542PX_FORCE_INLINE Vec3V V3UnitX()
543{
544 return Vec3V(1.0f, 0.0f, 0.0f);
545}
546
547PX_FORCE_INLINE Vec3V V3UnitY()
548{
549 return Vec3V(0.0f, 1.0f, 0.0f);
550}
551
552PX_FORCE_INLINE Vec3V V3UnitZ()
553{
554 return Vec3V(0.0f, 0.0f, 1.0f);
555}
556
557PX_FORCE_INLINE FloatV V3GetX(const Vec3V f)
558{
559 return FloatV(f.x);
560}
561
562PX_FORCE_INLINE FloatV V3GetY(const Vec3V f)
563{
564 return FloatV(f.y);
565}
566
567PX_FORCE_INLINE FloatV V3GetZ(const Vec3V f)
568{
569 return FloatV(f.z);
570}
571
572PX_FORCE_INLINE Vec3V V3SetX(const Vec3V v, const FloatV f)
573{
574 return Vec3V(f.x, v.y, v.z);
575}
576
577PX_FORCE_INLINE Vec3V V3SetY(const Vec3V v, const FloatV f)
578{
579 return Vec3V(v.x, f.x, v.z);
580}
581
582PX_FORCE_INLINE Vec3V V3SetZ(const Vec3V v, const FloatV f)
583{
584 return Vec3V(v.x, v.y, f.x);
585}
586
587PX_FORCE_INLINE Vec3V V3ColX(const Vec3V a, const Vec3V b, const Vec3V c)
588{
589 return Vec3V(a.x, b.x, c.x);
590}
591
592PX_FORCE_INLINE Vec3V V3ColY(const Vec3V a, const Vec3V b, const Vec3V c)
593{
594 return Vec3V(a.y, b.y, c.y);
595}
596
597PX_FORCE_INLINE Vec3V V3ColZ(const Vec3V a, const Vec3V b, const Vec3V c)
598{
599 return Vec3V(a.z, b.z, c.z);
600}
601
602PX_FORCE_INLINE Vec3V V3Zero()
603{
604 return V3Load(0.0f);
605}
606
607PX_FORCE_INLINE Vec3V V3One()
608{
609 return V3Load(1.0f);
610}
611
612PX_FORCE_INLINE Vec3V V3Eps()
613{
614 return V3Load(PX_EPS_REAL);
615}
616
617PX_FORCE_INLINE Vec3V V3Neg(const Vec3V c)
618{
619 return Vec3V(-c.x, -c.y, -c.z);
620}
621
622PX_FORCE_INLINE Vec3V V3Add(const Vec3V a, const Vec3V b)
623{
624 return Vec3V(a.x + b.x, a.y + b.y, a.z + b.z);
625}
626
627PX_FORCE_INLINE Vec3V V3Sub(const Vec3V a, const Vec3V b)
628{
629 return Vec3V(a.x - b.x, a.y - b.y, a.z - b.z);
630}
631
632PX_FORCE_INLINE Vec3V V3Scale(const Vec3V a, const FloatV b)
633{
634 return Vec3V(a.x * b.x, a.y * b.x, a.z * b.x);
635}
636
637PX_FORCE_INLINE Vec3V V3Mul(const Vec3V a, const Vec3V b)
638{
639 return Vec3V(a.x * b.x, a.y * b.y, a.z * b.z);
640}
641
642PX_FORCE_INLINE Vec3V V3ScaleInv(const Vec3V a, const FloatV b)
643{
644 const PxF32 bInv = 1.0f / b.x;
645 return Vec3V(a.x * bInv, a.y * bInv, a.z * bInv);
646}
647
648PX_FORCE_INLINE Vec3V V3Div(const Vec3V a, const Vec3V b)
649{
650 return Vec3V(a.x / b.x, a.y / b.y, a.z / b.z);
651}
652
653PX_FORCE_INLINE Vec3V V3ScaleInvFast(const Vec3V a, const FloatV b)
654{
655 const PxF32 bInv = 1.0f / b.x;
656 return Vec3V(a.x * bInv, a.y * bInv, a.z * bInv);
657}
658
659PX_FORCE_INLINE Vec3V V3DivFast(const Vec3V a, const Vec3V b)
660{
661 return Vec3V(a.x / b.x, a.y / b.y, a.z / b.z);
662}
663
664PX_FORCE_INLINE Vec3V V3Recip(const Vec3V a)
665{
666 return Vec3V(1.0f / a.x, 1.0f / a.y, 1.0f / a.z);
667}
668
669PX_FORCE_INLINE Vec3V V3RecipFast(const Vec3V a)
670{
671 return Vec3V(1.0f / a.x, 1.0f / a.y, 1.0f / a.z);
672}
673
674PX_FORCE_INLINE Vec3V V3Rsqrt(const Vec3V a)
675{
676 return Vec3V(PxRecipSqrt(a.x), PxRecipSqrt(a.y), PxRecipSqrt(a.z));
677}
678
679PX_FORCE_INLINE Vec3V V3RsqrtFast(const Vec3V a)
680{
681 return Vec3V(PxRecipSqrt(a.x), PxRecipSqrt(a.y), PxRecipSqrt(a.z));
682}
683
684PX_FORCE_INLINE Vec3V V3ScaleAdd(const Vec3V a, const FloatV b, const Vec3V c)
685{
686 return V3Add(V3Scale(a, b), c);
687}
688
689PX_FORCE_INLINE Vec3V V3NegScaleSub(const Vec3V a, const FloatV b, const Vec3V c)
690{
691 return V3Sub(c, V3Scale(a, b));
692}
693
694PX_FORCE_INLINE Vec3V V3MulAdd(const Vec3V a, const Vec3V b, const Vec3V c)
695{
696 return V3Add(V3Mul(a, b), c);
697}
698
699PX_FORCE_INLINE Vec3V V3NegMulSub(const Vec3V a, const Vec3V b, const Vec3V c)
700{
701 return V3Sub(c, V3Mul(a, b));
702}
703
704PX_FORCE_INLINE FloatV V3Dot(const Vec3V a, const Vec3V b)
705{
706 return FloatV(a.x * b.x + a.y * b.y + a.z * b.z);
707}
708
709PX_FORCE_INLINE VecCrossV V3PrepareCross(const Vec3VArg normal)
710{
711 return normal;
712}
713
714PX_FORCE_INLINE Vec3V V3Cross(const Vec3V a, const Vec3V b)
715{
716 return Vec3V(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
717}
718
719PX_FORCE_INLINE FloatV V3Length(const Vec3V a)
720{
721 return FloatV(PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z));
722}
723
724PX_FORCE_INLINE FloatV V3LengthSq(const Vec3V a)
725{
726 return FloatV(a.x * a.x + a.y * a.y + a.z * a.z);
727}
728
729PX_FORCE_INLINE Vec3V V3Normalize(const Vec3V a)
730{
731 VECMATHAOS_ASSERT(a.x != 0 || a.y != 0 || a.z != 0);
732 const PxF32 lengthInv = 1.0f / PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z);
733 return Vec3V(a.x * lengthInv, a.y * lengthInv, a.z * lengthInv);
734}
735
736PX_FORCE_INLINE Vec3V V3NormalizeSafe(const Vec3V a, const Vec3V unsafeReturnValue)
737{
738 const PxF32 length = PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z);
739 if(PX_EPS_REAL >= length)
740 {
741 return unsafeReturnValue;
742 }
743 else
744 {
745 const PxF32 lengthInv = 1.0f / length;
746 return Vec3V(a.x * lengthInv, a.y * lengthInv, a.z * lengthInv);
747 }
748}
749
750PX_FORCE_INLINE Vec3V V3NormalizeFast(const Vec3V a)
751{
752 VECMATHAOS_ASSERT(a.x != 0 || a.y != 0 || a.z != 0);
753 const PxF32 lengthInv = 1.0f / PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z);
754 return Vec3V(a.x * lengthInv, a.y * lengthInv, a.z * lengthInv);
755}
756
757PX_FORCE_INLINE Vec3V V3Sel(const BoolV c, const Vec3V a, const Vec3V b)
758{
759 return Vec3V(c.ux ? a.x : b.x, c.uy ? a.y : b.y, c.uz ? a.z : b.z);
760}
761
762PX_FORCE_INLINE BoolV V3IsGrtr(const Vec3V a, const Vec3V b)
763{
764 return BoolV(BOOL_TO_U32(a.x > b.x), BOOL_TO_U32(a.y > b.y), BOOL_TO_U32(a.z > b.z), FALSE_TO_U32);
765}
766
767PX_FORCE_INLINE BoolV V3IsGrtrOrEq(const Vec3V a, const Vec3V b)
768{
769 return BoolV(BOOL_TO_U32(a.x >= b.x), BOOL_TO_U32(a.y >= b.y), BOOL_TO_U32(a.z >= b.z), TRUE_TO_U32);
770}
771
772PX_FORCE_INLINE BoolV V3IsEq(const Vec3V a, const Vec3V b)
773{
774 return BoolV(BOOL_TO_U32(a.x == b.x), BOOL_TO_U32(a.y == b.y), BOOL_TO_U32(a.z == b.z), TRUE_TO_U32);
775}
776
777PX_FORCE_INLINE Vec3V V3Max(const Vec3V a, const Vec3V b)
778{
779 return Vec3V(a.x > b.x ? a.x : b.x, a.y > b.y ? a.y : b.y, a.z > b.z ? a.z : b.z);
780}
781
782PX_FORCE_INLINE Vec3V V3Min(const Vec3V a, const Vec3V b)
783{
784 return Vec3V(a.x < b.x ? a.x : b.x, a.y < b.y ? a.y : b.y, a.z < b.z ? a.z : b.z);
785}
786
787PX_FORCE_INLINE FloatV V3ExtractMax(const Vec3V a)
788{
789 const PxF32 t0 = (a.x >= a.y) ? a.x : a.y;
790 return t0 >= a.z ? t0 : a.z;
791}
792
793PX_FORCE_INLINE FloatV V3ExtractMin(const Vec3V a)
794{
795 const PxF32 t0 = (a.x <= a.y) ? a.x : a.y;
796 return t0 <= a.z ? t0 : a.z;
797}
798
799// return (a >= 0.0f) ? 1.0f : -1.0f;
800PX_FORCE_INLINE Vec3V V3Sign(const Vec3V a)
801{
802 return Vec3V((a.x >= 0.f ? 1.f : -1.f), (a.y >= 0.f ? 1.f : -1.f), (a.z >= 0.f ? 1.f : -1.f));
803}
804
805PX_FORCE_INLINE Vec3V V3Clamp(const Vec3V a, const Vec3V minV, const Vec3V maxV)
806{
807 return V3Max(V3Min(a, maxV), minV);
808}
809
810PX_FORCE_INLINE Vec3V V3Abs(const Vec3V a)
811{
812 return V3Max(a, V3Neg(a));
813}
814
815PX_FORCE_INLINE PxU32 V3AllGrtr(const Vec3V a, const Vec3V b)
816{
817 return BOOL_TO_U32((a.x > b.x) & (a.y > b.y) & (a.z > b.z));
818}
819
820PX_FORCE_INLINE PxU32 V3AllGrtrOrEq(const Vec3V a, const Vec3V b)
821{
822 return BOOL_TO_U32((a.x >= b.x) & (a.y >= b.y) & (a.z >= b.z));
823}
824
825PX_FORCE_INLINE PxU32 V3AllEq(const Vec3V a, const Vec3V b)
826{
827 return BOOL_TO_U32((a.x == b.x) & (a.y == b.y) & (a.z == b.z));
828}
829
830PX_FORCE_INLINE Vec3V V3Round(const Vec3V a)
831{
832 return Vec3V(floorf(a.x + 0.5f), floorf(a.y + 0.5f), floorf(a.z + 0.5f));
833}
834
835PX_FORCE_INLINE Vec3V V3Sin(const Vec3V a)
836{
837 return Vec3V(sinf(a.x), sinf(a.y), sinf(a.z));
838}
839
840PX_FORCE_INLINE Vec3V V3Cos(const Vec3V a)
841{
842 return Vec3V(cosf(a.x), cosf(a.y), cosf(a.z));
843}
844
845PX_FORCE_INLINE Vec3V V3PermYZZ(const Vec3V a)
846{
847 return Vec3V(a.y, a.z, a.z);
848}
849
850PX_FORCE_INLINE Vec3V V3PermXYX(const Vec3V a)
851{
852 return Vec3V(a.x, a.y, a.x);
853}
854
855PX_FORCE_INLINE Vec3V V3PermYZX(const Vec3V a)
856{
857 return Vec3V(a.y, a.z, a.x);
858}
859
860PX_FORCE_INLINE Vec3V V3PermZXY(const Vec3V a)
861{
862 return Vec3V(a.z, a.x, a.y);
863}
864
865PX_FORCE_INLINE Vec3V V3PermZZY(const Vec3V a)
866{
867 return Vec3V(a.z, a.z, a.y);
868}
869
870PX_FORCE_INLINE Vec3V V3PermYXX(const Vec3V a)
871{
872 return Vec3V(a.y, a.x, a.x);
873}
874
875PX_FORCE_INLINE Vec3V V3Perm_Zero_1Z_0Y(const Vec3V v0, const Vec3V v1)
876{
877 return Vec3V(0.0f, v1.z, v0.y);
878}
879
880PX_FORCE_INLINE Vec3V V3Perm_0Z_Zero_1X(const Vec3V v0, const Vec3V v1)
881{
882 return Vec3V(v0.z, 0.0f, v1.x);
883}
884
885PX_FORCE_INLINE Vec3V V3Perm_1Y_0X_Zero(const Vec3V v0, const Vec3V v1)
886{
887 return Vec3V(v1.y, v0.x, 0.0f);
888}
889
890PX_FORCE_INLINE FloatV V3SumElems(const Vec3V a)
891{
892 return FloatV(a.x + a.y + a.z);
893}
894
895PX_FORCE_INLINE PxU32 V3OutOfBounds(const Vec3V a, const Vec3V min, const Vec3V max)
896{
897 return BOOL_TO_U32(a.x > max.x || a.y > max.y || a.z > max.z || a.x < min.x || a.y < min.y || a.z < min.z);
898}
899
900PX_FORCE_INLINE PxU32 V3InBounds(const Vec3V a, const Vec3V min, const Vec3V max)
901{
902 return BOOL_TO_U32(a.x <= max.x && a.y <= max.y && a.z <= max.z && a.x >= min.x && a.y >= min.y && a.z >= min.z);
903}
904
905PX_FORCE_INLINE PxU32 V3OutOfBounds(const Vec3V a, const Vec3V bounds)
906{
907 return V3OutOfBounds(a, V3Neg(bounds), bounds);
908}
909
910PX_FORCE_INLINE PxU32 V3InBounds(const Vec3V a, const Vec3V bounds)
911{
912 return V3InBounds(a, V3Neg(bounds), bounds);
913}
914
915PX_FORCE_INLINE void V3Transpose(Vec3V& col0, Vec3V& col1, Vec3V& col2)
916{
917 const PxF32 t01 = col0.y, t02 = col0.z, t12 = col1.z;
918 col0.y = col1.x;
919 col0.z = col2.x;
920 col1.z = col2.y;
921 col1.x = t01;
922 col2.x = t02;
923 col2.y = t12;
924}
925
927// VEC4V
929
930PX_FORCE_INLINE Vec4V V4Splat(const FloatV f)
931{
932 return Vec4V(f.x, f.x, f.x, f.x);
933}
934
935PX_FORCE_INLINE Vec4V V4Merge(const FloatV* const floatVArray)
936{
937 return Vec4V(floatVArray[0].x, floatVArray[1].x, floatVArray[2].x, floatVArray[3].x);
938}
939
940PX_FORCE_INLINE Vec4V V4Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z, const FloatVArg w)
941{
942 return Vec4V(x.x, y.x, z.x, w.x);
943}
944
945PX_FORCE_INLINE Vec4V V4MergeW(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w)
946{
947 return Vec4V(x.w, y.w, z.w, w.w);
948}
949
950PX_FORCE_INLINE Vec4V V4MergeZ(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w)
951{
952 return Vec4V(x.z, y.z, z.z, w.z);
953}
954
955PX_FORCE_INLINE Vec4V V4MergeY(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w)
956{
957 return Vec4V(x.y, y.y, z.y, w.y);
958}
959
960PX_FORCE_INLINE Vec4V V4MergeX(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w)
961{
962 return Vec4V(x.x, y.x, z.x, w.x);
963}
964
965PX_FORCE_INLINE Vec4V V4UnpackXY(const Vec4VArg a, const Vec4VArg b)
966{
967 return Vec4V(a.x, b.x, a.y, b.y);
968}
969
970PX_FORCE_INLINE Vec4V V4UnpackZW(const Vec4VArg a, const Vec4VArg b)
971{
972 return Vec4V(a.z, b.z, a.w, b.w);
973}
974
975PX_FORCE_INLINE Vec4V V4UnitX()
976{
977 return Vec4V(1.0f, 0.0f, 0.0f, 0.0f);
978}
979
980PX_FORCE_INLINE Vec4V V4UnitY()
981{
982 return Vec4V(0.0f, 1.0f, 0.0f, 0.0f);
983}
984
985PX_FORCE_INLINE Vec4V V4UnitZ()
986{
987 return Vec4V(0.0f, 0.0f, 1.0f, 0.0f);
988}
989
990PX_FORCE_INLINE Vec4V V4UnitW()
991{
992 return Vec4V(0.0f, 0.0f, 0.0f, 1.0f);
993}
994
995PX_FORCE_INLINE FloatV V4GetX(const Vec4V f)
996{
997 return FloatV(f.x);
998}
999
1000PX_FORCE_INLINE FloatV V4GetY(const Vec4V f)
1001{
1002 return FloatV(f.y);
1003}
1004
1005PX_FORCE_INLINE FloatV V4GetZ(const Vec4V f)
1006{
1007 return FloatV(f.z);
1008}
1009
1010PX_FORCE_INLINE FloatV V4GetW(const Vec4V f)
1011{
1012 return FloatV(f.w);
1013}
1014
1015PX_FORCE_INLINE Vec4V V4SetX(const Vec4V v, const FloatV f)
1016{
1017 return Vec4V(f.x, v.y, v.z, v.w);
1018}
1019
1020PX_FORCE_INLINE Vec4V V4SetY(const Vec4V v, const FloatV f)
1021{
1022 return Vec4V(v.x, f.x, v.z, v.w);
1023}
1024
1025PX_FORCE_INLINE Vec4V V4SetZ(const Vec4V v, const FloatV f)
1026{
1027 return Vec4V(v.x, v.y, f.x, v.w);
1028}
1029
1030PX_FORCE_INLINE Vec4V V4SetW(const Vec4V v, const FloatV f)
1031{
1032 return Vec4V(v.x, v.y, v.z, f.x);
1033}
1034
1035PX_FORCE_INLINE Vec4V V4SetW(const Vec3V v, const FloatV f)
1036{
1037 return Vec4V(v.x, v.y, v.z, f.x);
1038}
1039
1040PX_FORCE_INLINE Vec4V V4ClearW(const Vec4V v)
1041{
1042 return Vec4V(v.x, v.y, v.z, 0.0f);
1043}
1044
1045PX_FORCE_INLINE Vec4V V4PermYXWZ(const Vec4V v)
1046{
1047 return Vec4V(v.y, v.x, v.w, v.z);
1048}
1049
1050PX_FORCE_INLINE Vec4V V4PermXZXZ(const Vec4V v)
1051{
1052 return Vec4V(v.x, v.z, v.x, v.z);
1053}
1054
1055PX_FORCE_INLINE Vec4V V4PermYWYW(const Vec4V v)
1056{
1057 return Vec4V(v.y, v.w, v.y, v.w);
1058}
1059
1060PX_FORCE_INLINE Vec4V V4PermYZXW(const Vec4V v)
1061{
1062 return Vec4V(v.y, v.z, v.x, v.w);
1063}
1064
1065PX_FORCE_INLINE Vec4V V4PermZWXY(const Vec4V v)
1066{
1067 return Vec4V(v.z, v.w, v.x, v.y);
1068}
1069
1070template <PxU8 _x, PxU8 _y, PxU8 _z, PxU8 _w>
1071PX_FORCE_INLINE Vec4V V4Perm(const Vec4V v)
1072{
1073 const PxF32 f[4] = { v.x, v.y, v.z, v.w };
1074 return Vec4V(f[_x], f[_y], f[_z], f[_w]);
1075}
1076
1077PX_FORCE_INLINE Vec4V V4Zero()
1078{
1079 return V4Load(0.0f);
1080}
1081
1082PX_FORCE_INLINE Vec4V V4One()
1083{
1084 return V4Load(1.0f);
1085}
1086
1087PX_FORCE_INLINE Vec4V V4Eps()
1088{
1089 return V4Load(PX_EPS_REAL);
1090}
1091
1092PX_FORCE_INLINE Vec4V V4Neg(const Vec4V c)
1093{
1094 return Vec4V(-c.x, -c.y, -c.z, -c.w);
1095}
1096
1097PX_FORCE_INLINE Vec4V V4Add(const Vec4V a, const Vec4V b)
1098{
1099 return Vec4V(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
1100}
1101
1102PX_FORCE_INLINE Vec4V V4Sub(const Vec4V a, const Vec4V b)
1103{
1104 return Vec4V(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
1105}
1106
1107PX_FORCE_INLINE Vec4V V4Scale(const Vec4V a, const FloatV b)
1108{
1109 return Vec4V(a.x * b.x, a.y * b.x, a.z * b.x, a.w * b.x);
1110}
1111
1112PX_FORCE_INLINE Vec4V V4Mul(const Vec4V a, const Vec4V b)
1113{
1114 return Vec4V(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);
1115}
1116
1117PX_FORCE_INLINE Vec4V V4ScaleInv(const Vec4V a, const FloatV b)
1118{
1119 const PxF32 bInv = 1.0f / b.x;
1120 return Vec4V(a.x * bInv, a.y * bInv, a.z * bInv, a.w * bInv);
1121}
1122
1123PX_FORCE_INLINE Vec4V V4Div(const Vec4V a, const Vec4V b)
1124{
1125 VECMATHAOS_ASSERT(b.x != 0 && b.y != 0 && b.z != 0 && b.w != 0);
1126 return Vec4V(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w);
1127}
1128
1129PX_FORCE_INLINE Vec4V V4ScaleInvFast(const Vec4V a, const FloatV b)
1130{
1131 const PxF32 bInv = 1.0f / b.x;
1132 return Vec4V(a.x * bInv, a.y * bInv, a.z * bInv, a.w * bInv);
1133}
1134
1135PX_FORCE_INLINE Vec4V V4DivFast(const Vec4V a, const Vec4V b)
1136{
1137 return Vec4V(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w);
1138}
1139
1140PX_FORCE_INLINE Vec4V V4Recip(const Vec4V a)
1141{
1142 return Vec4V(1.0f / a.x, 1.0f / a.y, 1.0f / a.z, 1.0f / a.w);
1143}
1144
1145PX_FORCE_INLINE Vec4V V4RecipFast(const Vec4V a)
1146{
1147 return Vec4V(1.0f / a.x, 1.0f / a.y, 1.0f / a.z, 1.0f / a.w);
1148}
1149
1150PX_FORCE_INLINE Vec4V V4Rsqrt(const Vec4V a)
1151{
1152 return Vec4V(PxRecipSqrt(a.x), PxRecipSqrt(a.y), PxRecipSqrt(a.z), PxRecipSqrt(a.w));
1153}
1154
1155PX_FORCE_INLINE Vec4V V4RsqrtFast(const Vec4V a)
1156{
1157 return Vec4V(PxRecipSqrt(a.x), PxRecipSqrt(a.y), PxRecipSqrt(a.z), PxRecipSqrt(a.w));
1158}
1159
1160PX_FORCE_INLINE Vec4V V4Sqrt(const Vec4V a)
1161{
1162 return Vec4V(PxSqrt(a.x), PxSqrt(a.y), PxSqrt(a.z), PxSqrt(a.w));
1163}
1164
1165PX_FORCE_INLINE Vec4V V4ScaleAdd(const Vec4V a, const FloatV b, const Vec4V c)
1166{
1167 return V4Add(V4Scale(a, b), c);
1168}
1169
1170PX_FORCE_INLINE Vec4V V4NegScaleSub(const Vec4V a, const FloatV b, const Vec4V c)
1171{
1172 return V4Sub(c, V4Scale(a, b));
1173}
1174
1175PX_FORCE_INLINE Vec4V V4MulAdd(const Vec4V a, const Vec4V b, const Vec4V c)
1176{
1177 return V4Add(V4Mul(a, b), c);
1178}
1179
1180PX_FORCE_INLINE Vec4V V4NegMulSub(const Vec4V a, const Vec4V b, const Vec4V c)
1181{
1182 return V4Sub(c, V4Mul(a, b));
1183}
1184
1185PX_FORCE_INLINE FloatV V4SumElements(const Vec4V a)
1186{
1187 return FloatV(a.x + a.y + a.z + a.w);
1188}
1189
1190PX_FORCE_INLINE FloatV V4Dot(const Vec4V a, const Vec4V b)
1191{
1192 return FloatV(a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w);
1193}
1194
1195PX_FORCE_INLINE FloatV V4Dot3(const Vec4V a, const Vec4V b)
1196{
1197 return FloatV(a.x * b.x + a.y * b.y + a.z * b.z);
1198}
1199
1200PX_FORCE_INLINE Vec4V V4Cross(const Vec4V a, const Vec4V b)
1201{
1202 return Vec4V(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x, 0.0f);
1203}
1204
1205PX_FORCE_INLINE FloatV V4Length(const Vec4V a)
1206{
1207 return FloatV(PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z + a.w * a.w));
1208}
1209
1210PX_FORCE_INLINE FloatV V4LengthSq(const Vec4V a)
1211{
1212 return V4Dot(a, a);
1213}
1214
1215PX_FORCE_INLINE Vec4V V4Normalize(const Vec4V a)
1216{
1217 VECMATHAOS_ASSERT(0 != a.x || 0 != a.y || 0 != a.z || 0 != a.w);
1218 const FloatV length = FloatV(V4Length(a));
1219 return V4ScaleInv(a, length);
1220}
1221
1222PX_FORCE_INLINE Vec4V V4NormalizeSafe(const Vec4V a, const Vec4V unsafeReturnValue)
1223{
1224 const FloatV length = FloatV(V4Length(a));
1225 if(PX_EPS_REAL >= length.x)
1226 {
1227 return unsafeReturnValue;
1228 }
1229 else
1230 {
1231 return V4ScaleInv(a, length);
1232 }
1233}
1234PX_FORCE_INLINE Vec4V V4NormalizeFast(const Vec4V a)
1235{
1236 VECMATHAOS_ASSERT(0 != a.x || 0 != a.y || 0 != a.z || 0 != a.w);
1237 const FloatV length = FloatV(V4Length(a));
1238 return V4ScaleInv(a, length);
1239}
1240
1241PX_FORCE_INLINE Vec4V V4Sel(const BoolV c, const Vec4V a, const Vec4V b)
1242{
1243 return Vec4V(c.ux ? a.x : b.x, c.uy ? a.y : b.y, c.uz ? a.z : b.z, c.uw ? a.w : b.w);
1244}
1245
1246PX_FORCE_INLINE BoolV V4IsGrtr(const Vec4V a, const Vec4V b)
1247{
1248 return BoolV(BOOL_TO_U32(a.x > b.x), BOOL_TO_U32(a.y > b.y), BOOL_TO_U32(a.z > b.z), BOOL_TO_U32(a.w > b.w));
1249}
1250
1251PX_FORCE_INLINE BoolV V4IsGrtrOrEq(const Vec4V a, const Vec4V b)
1252{
1253 return BoolV(BOOL_TO_U32(a.x >= b.x), BOOL_TO_U32(a.y >= b.y), BOOL_TO_U32(a.z >= b.z), BOOL_TO_U32(a.w >= b.w));
1254}
1255
1256PX_FORCE_INLINE BoolV V4IsEq(const Vec4V a, const Vec4V b)
1257{
1258 return BoolV(BOOL_TO_U32(a.x == b.x), BOOL_TO_U32(a.y == b.y), BOOL_TO_U32(a.z == b.z), BOOL_TO_U32(a.w == b.w));
1259}
1260
1261PX_FORCE_INLINE Vec4V V4Max(const Vec4V a, const Vec4V b)
1262{
1263 return Vec4V(a.x > b.x ? a.x : b.x, a.y > b.y ? a.y : b.y, a.z > b.z ? a.z : b.z, a.w > b.w ? a.w : b.w);
1264}
1265
1266PX_FORCE_INLINE Vec4V V4Min(const Vec4V a, const Vec4V b)
1267{
1268 return Vec4V(a.x < b.x ? a.x : b.x, a.y < b.y ? a.y : b.y, a.z < b.z ? a.z : b.z, a.w < b.w ? a.w : b.w);
1269}
1270
1271PX_FORCE_INLINE FloatV V4ExtractMax(const Vec4V a)
1272{
1273 const PxF32 t0 = (a.x >= a.y) ? a.x : a.y;
1274 const PxF32 t1 = (a.z >= a.w) ? a.x : a.w;
1275 return t0 >= t1 ? t0 : t1;
1276}
1277
1278PX_FORCE_INLINE FloatV V4ExtractMin(const Vec4V a)
1279{
1280 const PxF32 t0 = (a.x <= a.y) ? a.x : a.y;
1281 const PxF32 t1 = (a.z <= a.w) ? a.x : a.w;
1282 return t0 <= t1 ? t0 : t1;
1283}
1284
1285PX_FORCE_INLINE Vec4V V4Clamp(const Vec4V a, const Vec4V minV, const Vec4V maxV)
1286{
1287 return V4Max(V4Min(a, maxV), minV);
1288}
1289
1290PX_FORCE_INLINE Vec4V V4Round(const Vec4V a)
1291{
1292 return Vec4V(floorf(a.x + 0.5f), floorf(a.y + 0.5f), floorf(a.z + 0.5f), floorf(a.w + 0.5f));
1293}
1294
1295PX_FORCE_INLINE Vec4V V4Sin(const Vec4V a)
1296{
1297 return Vec4V(sinf(a.x), sinf(a.y), sinf(a.z), sinf(a.w));
1298}
1299
1300PX_FORCE_INLINE Vec4V V4Cos(const Vec4V a)
1301{
1302 return Vec4V(cosf(a.x), cosf(a.y), cosf(a.z), cosf(a.w));
1303}
1304
1305PX_FORCE_INLINE PxU32 V4AllGrtr(const Vec4V a, const Vec4V b)
1306{
1307 return BOOL_TO_U32((a.x > b.x) & (a.y > b.y) & (a.z > b.z) & (a.w > b.w));
1308}
1309
1310PX_FORCE_INLINE PxU32 V4AllGrtrOrEq(const Vec4V a, const Vec4V b)
1311{
1312 return BOOL_TO_U32((a.x >= b.x) & (a.y >= b.y) & (a.z >= b.z) & (a.w >= b.w));
1313}
1314
1315PX_FORCE_INLINE PxU32 V4AllGrtrOrEq3(const Vec4V a, const Vec4V b)
1316{
1317 return BOOL_TO_U32((a.x >= b.x) & (a.y >= b.y) & (a.z >= b.z));
1318}
1319
1320PX_FORCE_INLINE PxU32 V4AllEq(const Vec4V a, const Vec4V b)
1321{
1322 return BOOL_TO_U32((a.x == b.x) & (a.y == b.y) & (a.z == b.z) & (a.w == b.w));
1323}
1324
1325PX_FORCE_INLINE PxU32 V4AnyGrtr3(const Vec4V a, const Vec4V b)
1326{
1327 return BOOL_TO_U32((a.x > b.x) | (a.y > b.y) | (a.z > b.z));
1328}
1329
1330PX_FORCE_INLINE void V4Transpose(Vec4V& col0, Vec4V& col1, Vec4V& col2, Vec4V& col3)
1331{
1332 const PxF32 t01 = col0.y, t02 = col0.z, t03 = col0.w;
1333 const PxF32 t12 = col1.z, t13 = col1.w;
1334 const PxF32 t23 = col2.w;
1335 col0.y = col1.x;
1336 col0.z = col2.x;
1337 col0.w = col3.x;
1338 col1.z = col2.y;
1339 col1.w = col3.y;
1340 col2.w = col3.z;
1341 col1.x = t01;
1342 col2.x = t02;
1343 col3.x = t03;
1344 col2.y = t12;
1345 col3.y = t13;
1346 col3.z = t23;
1347}
1348
1349PX_FORCE_INLINE BoolV BFFFF()
1350{
1351 return BoolV(FALSE_TO_U32, FALSE_TO_U32, FALSE_TO_U32, FALSE_TO_U32);
1352}
1353PX_FORCE_INLINE BoolV BFFFT()
1354{
1355 return BoolV(FALSE_TO_U32, FALSE_TO_U32, FALSE_TO_U32, TRUE_TO_U32);
1356}
1357PX_FORCE_INLINE BoolV BFFTF()
1358{
1359 return BoolV(FALSE_TO_U32, FALSE_TO_U32, TRUE_TO_U32, FALSE_TO_U32);
1360}
1361PX_FORCE_INLINE BoolV BFFTT()
1362{
1363 return BoolV(FALSE_TO_U32, FALSE_TO_U32, TRUE_TO_U32, TRUE_TO_U32);
1364}
1365PX_FORCE_INLINE BoolV BFTFF()
1366{
1367 return BoolV(FALSE_TO_U32, TRUE_TO_U32, FALSE_TO_U32, FALSE_TO_U32);
1368}
1369PX_FORCE_INLINE BoolV BFTFT()
1370{
1371 return BoolV(FALSE_TO_U32, TRUE_TO_U32, FALSE_TO_U32, TRUE_TO_U32);
1372}
1373PX_FORCE_INLINE BoolV BFTTF()
1374{
1375 return BoolV(FALSE_TO_U32, TRUE_TO_U32, TRUE_TO_U32, FALSE_TO_U32);
1376}
1377PX_FORCE_INLINE BoolV BFTTT()
1378{
1379 return BoolV(FALSE_TO_U32, TRUE_TO_U32, TRUE_TO_U32, TRUE_TO_U32);
1380}
1381PX_FORCE_INLINE BoolV BTFFF()
1382{
1383 return BoolV(TRUE_TO_U32, FALSE_TO_U32, FALSE_TO_U32, FALSE_TO_U32);
1384}
1385PX_FORCE_INLINE BoolV BTFFT()
1386{
1387 return BoolV(TRUE_TO_U32, FALSE_TO_U32, FALSE_TO_U32, TRUE_TO_U32);
1388}
1389PX_FORCE_INLINE BoolV BTFTF()
1390{
1391 return BoolV(TRUE_TO_U32, FALSE_TO_U32, TRUE_TO_U32, FALSE_TO_U32);
1392}
1393PX_FORCE_INLINE BoolV BTFTT()
1394{
1395 return BoolV(TRUE_TO_U32, FALSE_TO_U32, TRUE_TO_U32, TRUE_TO_U32);
1396}
1397PX_FORCE_INLINE BoolV BTTFF()
1398{
1399 return BoolV(TRUE_TO_U32, TRUE_TO_U32, FALSE_TO_U32, FALSE_TO_U32);
1400}
1401PX_FORCE_INLINE BoolV BTTFT()
1402{
1403 return BoolV(TRUE_TO_U32, TRUE_TO_U32, FALSE_TO_U32, TRUE_TO_U32);
1404}
1405PX_FORCE_INLINE BoolV BTTTF()
1406{
1407 return BoolV(TRUE_TO_U32, TRUE_TO_U32, TRUE_TO_U32, FALSE_TO_U32);
1408}
1409PX_FORCE_INLINE BoolV BTTTT()
1410{
1411 return BoolV(TRUE_TO_U32, TRUE_TO_U32, TRUE_TO_U32, TRUE_TO_U32);
1412}
1413
1414PX_FORCE_INLINE BoolV BXMask()
1415{
1416 return BTFFF();
1417}
1418PX_FORCE_INLINE BoolV BYMask()
1419{
1420 return BFTFF();
1421}
1422PX_FORCE_INLINE BoolV BZMask()
1423{
1424 return BFFTF();
1425}
1426PX_FORCE_INLINE BoolV BWMask()
1427{
1428 return BFFFT();
1429}
1430
1431PX_FORCE_INLINE BoolV BGetX(const BoolV a)
1432{
1433 return BoolV(a.ux, a.ux, a.ux, a.ux);
1434}
1435
1436PX_FORCE_INLINE BoolV BGetY(const BoolV a)
1437{
1438 return BoolV(a.uy, a.uy, a.uy, a.uy);
1439}
1440
1441PX_FORCE_INLINE BoolV BGetZ(const BoolV a)
1442{
1443 return BoolV(a.uz, a.uz, a.uz, a.uz);
1444}
1445
1446PX_FORCE_INLINE BoolV BGetW(const BoolV a)
1447{
1448 return BoolV(a.uw, a.uw, a.uw, a.uw);
1449}
1450
1451PX_FORCE_INLINE BoolV BSetX(const BoolV v, const BoolV f)
1452{
1453 return BoolV(f.ux, v.uy, v.uz, v.uw);
1454}
1455
1456PX_FORCE_INLINE BoolV BSetY(const BoolV v, const BoolV f)
1457{
1458 return BoolV(v.ux, f.uy, v.uz, v.uw);
1459}
1460
1461PX_FORCE_INLINE BoolV BSetZ(const BoolV v, const BoolV f)
1462{
1463 return BoolV(v.ux, v.uy, f.uz, v.uw);
1464}
1465
1466PX_FORCE_INLINE BoolV BSetW(const BoolV v, const BoolV f)
1467{
1468 return BoolV(v.ux, v.uy, v.uz, f.uw);
1469}
1470
1471template <int index>
1472BoolV BSplatElement(BoolV a)
1473{
1474 PxU32* b = reinterpret_cast<PxU32*>(&a);
1475 return BoolV(b[index], b[index], b[index], b[index]);
1476}
1477
1478PX_FORCE_INLINE BoolV BAnd(const BoolV a, const BoolV b)
1479{
1480 return BoolV(BOOL_TO_U32(a.ux && b.ux), BOOL_TO_U32(a.uy && b.uy), BOOL_TO_U32(a.uz && b.uz), BOOL_TO_U32(a.uw && b.uw));
1481}
1482
1483PX_FORCE_INLINE BoolV BAndNot(const BoolV a, const BoolV b)
1484{
1485 return BoolV(a.ux & ~b.ux, a.uy & ~b.uy, a.uz & ~b.uz, a.uw & ~b.uw);
1486}
1487
1488PX_FORCE_INLINE BoolV BNot(const BoolV a)
1489{
1490 return BoolV(~a.ux, ~a.uy, ~a.uz, ~a.uw);
1491}
1492
1493PX_FORCE_INLINE BoolV BOr(const BoolV a, const BoolV b)
1494{
1495 return BoolV(BOOL_TO_U32(a.ux || b.ux), BOOL_TO_U32(a.uy || b.uy), BOOL_TO_U32(a.uz || b.uz), BOOL_TO_U32(a.uw || b.uw));
1496}
1497
1498PX_FORCE_INLINE PxU32 BAllEq(const BoolV a, const BoolV b)
1499{
1500 return (a.ux == b.ux && a.uy == b.uy && a.uz == b.uz && a.uw == b.uw ? 1 : 0);
1501}
1502
1503PX_FORCE_INLINE PxU32 BAllEqTTTT(const BoolV a)
1504{
1505 return BAllEq(a, BTTTT());
1506}
1507
1508PX_FORCE_INLINE PxU32 BAllEqFFFF(const BoolV a)
1509{
1510 return BAllEq(a, BFFFF());
1511}
1512
1513PX_FORCE_INLINE BoolV BAllTrue4(const BoolV a)
1514{
1515 return (a.ux & a.uy & a.uz & a.uw) ? BTTTT() : BFFFF();
1516}
1517
1518PX_FORCE_INLINE BoolV BAnyTrue4(const BoolV a)
1519{
1520 return (a.ux | a.uy | a.uz | a.uw) ? BTTTT() : BFFFF();
1521}
1522
1523PX_FORCE_INLINE BoolV BAllTrue3(const BoolV a)
1524{
1525 return (a.ux & a.uy & a.uz) ? BTTTT() : BFFFF();
1526}
1527
1528PX_FORCE_INLINE BoolV BAnyTrue3(const BoolV a)
1529{
1530 return (a.ux | a.uy | a.uz) ? BTTTT() : BFFFF();
1531}
1532
1533PX_FORCE_INLINE PxU32 BGetBitMask(const BoolV a)
1534{
1535 return (a.ux & 1) | (a.uy & 2) | (a.uz & 4) | (a.uw & 8);
1536}
1537
1539// MAT33V
1541
1542PX_FORCE_INLINE Vec3V M33MulV3(const Mat33V& a, const Vec3V b)
1543{
1544 return Vec3V(a.col0.x * b.x + a.col1.x * b.y + a.col2.x * b.z, a.col0.y * b.x + a.col1.y * b.y + a.col2.y * b.z,
1545 a.col0.z * b.x + a.col1.z * b.y + a.col2.z * b.z);
1546}
1547
1548PX_FORCE_INLINE Vec3V M33TrnspsMulV3(const Mat33V& a, const Vec3V b)
1549{
1550 return Vec3V(a.col0.x * b.x + a.col0.y * b.y + a.col0.z * b.z, a.col1.x * b.x + a.col1.y * b.y + a.col1.z * b.z,
1551 a.col2.x * b.x + a.col2.y * b.y + a.col2.z * b.z);
1552}
1553
1554PX_FORCE_INLINE Vec3V M33MulV3AddV3(const Mat33V& A, const Vec3V b, const Vec3V c)
1555{
1556 const FloatV x = V3GetX(b);
1557 const FloatV y = V3GetY(b);
1558 const FloatV z = V3GetZ(b);
1559 Vec3V result = V3ScaleAdd(A.col0, x, c);
1560 result = V3ScaleAdd(A.col1, y, result);
1561 return V3ScaleAdd(A.col2, z, result);
1562}
1563
1564PX_FORCE_INLINE Mat33V M33MulM33(const Mat33V& a, const Mat33V& b)
1565{
1566 return Mat33V(M33MulV3(a, b.col0), M33MulV3(a, b.col1), M33MulV3(a, b.col2));
1567}
1568
1569PX_FORCE_INLINE Mat33V M33Add(const Mat33V& a, const Mat33V& b)
1570{
1571 return Mat33V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2));
1572}
1573
1574PX_FORCE_INLINE Mat33V M33Scale(const Mat33V& a, const FloatV& b)
1575{
1576 return Mat33V(V3Scale(a.col0, b), V3Scale(a.col1, b), V3Scale(a.col2, b));
1577}
1578
1579PX_FORCE_INLINE Mat33V M33Sub(const Mat33V& a, const Mat33V& b)
1580{
1581 return Mat33V(V3Sub(a.col0, b.col0), V3Sub(a.col1, b.col1), V3Sub(a.col2, b.col2));
1582}
1583
1584PX_FORCE_INLINE Mat33V M33Neg(const Mat33V& a)
1585{
1586 return Mat33V(V3Neg(a.col0), V3Neg(a.col1), V3Neg(a.col2));
1587}
1588
1589PX_FORCE_INLINE Mat33V M33Abs(const Mat33V& a)
1590{
1591 return Mat33V(V3Abs(a.col0), V3Abs(a.col1), V3Abs(a.col2));
1592}
1593
1594PX_FORCE_INLINE Mat33V M33Diagonal(const Vec3VArg d)
1595{
1596 const Vec3V x = V3Mul(V3UnitX(), d);
1597 const Vec3V y = V3Mul(V3UnitY(), d);
1598 const Vec3V z = V3Mul(V3UnitZ(), d);
1599 return Mat33V(x, y, z);
1600}
1601
1602PX_FORCE_INLINE Mat33V M33Inverse(const Mat33V& a)
1603{
1604 const PxF32 det = a.col0.x * (a.col1.y * a.col2.z - a.col1.z * a.col2.y) -
1605 a.col1.x * (a.col0.y * a.col2.z - a.col2.y * a.col0.z) +
1606 a.col2.x * (a.col0.y * a.col1.z - a.col1.y * a.col0.z);
1607
1608 const PxF32 invDet = 1.0f / det;
1609
1610 Mat33V ret;
1611 ret.col0.x = invDet * (a.col1.y * a.col2.z - a.col2.y * a.col1.z);
1612 ret.col0.y = invDet * (a.col2.y * a.col0.z - a.col0.y * a.col2.z);
1613 ret.col0.z = invDet * (a.col0.y * a.col1.z - a.col1.y * a.col0.z);
1614
1615 ret.col1.x = invDet * (a.col2.x * a.col1.z - a.col1.x * a.col2.z);
1616 ret.col1.y = invDet * (a.col0.x * a.col2.z - a.col2.x * a.col0.z);
1617 ret.col1.z = invDet * (a.col1.x * a.col0.z - a.col0.x * a.col1.z);
1618
1619 ret.col2.x = invDet * (a.col1.x * a.col2.y - a.col2.x * a.col1.y);
1620 ret.col2.y = invDet * (a.col2.x * a.col0.y - a.col0.x * a.col2.y);
1621 ret.col2.z = invDet * (a.col0.x * a.col1.y - a.col1.x * a.col0.y);
1622
1623 return ret;
1624}
1625
1626PX_FORCE_INLINE Mat33V Mat33V_From_PxMat33(const PxMat33& m)
1627{
1628 return Mat33V(V3LoadU(m.column0), V3LoadU(m.column1), V3LoadU(m.column2));
1629}
1630
1631PX_FORCE_INLINE void PxMat33_From_Mat33V(const Mat33V& m, PxMat33& out)
1632{
1633 PX_ASSERT((size_t(&out) & 15) == 0);
1634 V3StoreU(m.col0, out.column0);
1635 V3StoreU(m.col1, out.column1);
1636 V3StoreU(m.col2, out.column2);
1637}
1638
1639PX_FORCE_INLINE Mat33V M33Trnsps(const Mat33V& a)
1640{
1641 return Mat33V(Vec3V(a.col0.x, a.col1.x, a.col2.x), Vec3V(a.col0.y, a.col1.y, a.col2.y),
1642 Vec3V(a.col0.z, a.col1.z, a.col2.z));
1643}
1644
1645PX_FORCE_INLINE Mat33V M33Identity()
1646{
1647 return Mat33V(V3UnitX(), V3UnitY(), V3UnitZ());
1648}
1649
1651// MAT34V
1653
1654PX_FORCE_INLINE Vec3V M34MulV3(const Mat34V& a, const Vec3V b)
1655{
1656 return Vec3V(a.col0.x * b.x + a.col1.x * b.y + a.col2.x * b.z + a.col3.x,
1657 a.col0.y * b.x + a.col1.y * b.y + a.col2.y * b.z + a.col3.y,
1658 a.col0.z * b.x + a.col1.z * b.y + a.col2.z * b.z + a.col3.z);
1659}
1660
1661PX_FORCE_INLINE Vec3V M34Mul33V3(const Mat34V& a, const Vec3V b)
1662{
1663 return Vec3V(a.col0.x * b.x + a.col1.x * b.y + a.col2.x * b.z, a.col0.y * b.x + a.col1.y * b.y + a.col2.y * b.z,
1664 a.col0.z * b.x + a.col1.z * b.y + a.col2.z * b.z);
1665}
1666
1667PX_FORCE_INLINE Vec3V M34TrnspsMul33V3(const Mat34V& a, const Vec3V b)
1668{
1669 return Vec3V(a.col0.x * b.x + a.col0.y * b.y + a.col0.z * b.z, a.col1.x * b.x + a.col1.y * b.y + a.col1.z * b.z,
1670 a.col2.x * b.x + a.col2.y * b.y + a.col2.z * b.z);
1671}
1672
1673PX_FORCE_INLINE Mat34V M34MulM34(const Mat34V& a, const Mat34V& b)
1674{
1675 return Mat34V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2), M34MulV3(a, b.col3));
1676}
1677
1678PX_FORCE_INLINE Mat33V M34MulM33(const Mat34V& a, const Mat33V& b)
1679{
1680 return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
1681}
1682
1683PX_FORCE_INLINE Mat33V M34Mul33V3(const Mat34V& a, const Mat33V& b)
1684{
1685 return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
1686}
1687
1688PX_FORCE_INLINE Mat33V M34Mul33MM34(const Mat34V& a, const Mat34V& b)
1689{
1690 return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
1691}
1692
1693PX_FORCE_INLINE Mat34V M34Add(const Mat34V& a, const Mat34V& b)
1694{
1695 return Mat34V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2), V3Add(a.col3, b.col3));
1696}
1697
1698PX_FORCE_INLINE Mat33V M34Trnsps33(const Mat34V& a)
1699{
1700 return Mat33V(Vec3V(a.col0.x, a.col1.x, a.col2.x), Vec3V(a.col0.y, a.col1.y, a.col2.y),
1701 Vec3V(a.col0.z, a.col1.z, a.col2.z));
1702}
1703
1705// MAT44V
1707
1708PX_FORCE_INLINE Vec4V M44MulV4(const Mat44V& a, const Vec4V b)
1709{
1710 return Vec4V(a.col0.x * b.x + a.col1.x * b.y + a.col2.x * b.z + a.col3.x * b.w,
1711 a.col0.y * b.x + a.col1.y * b.y + a.col2.y * b.z + a.col3.y * b.w,
1712 a.col0.z * b.x + a.col1.z * b.y + a.col2.z * b.z + a.col3.z * b.w,
1713 a.col0.w * b.x + a.col1.w * b.y + a.col2.w * b.z + a.col3.w * b.w);
1714}
1715
1716PX_FORCE_INLINE Vec4V M44TrnspsMulV4(const Mat44V& a, const Vec4V b)
1717{
1718 return Vec4V(a.col0.x * b.x + a.col0.y * b.y + a.col0.z * b.z + a.col0.w * b.w,
1719 a.col1.x * b.x + a.col1.y * b.y + a.col1.z * b.z + a.col1.w * b.w,
1720 a.col2.x * b.x + a.col2.y * b.y + a.col2.z * b.z + a.col2.w * b.w,
1721 a.col3.x * b.x + a.col3.y * b.y + a.col3.z * b.z + a.col3.w * b.w);
1722}
1723
1724PX_FORCE_INLINE Mat44V M44MulM44(const Mat44V& a, const Mat44V& b)
1725{
1726 return Mat44V(M44MulV4(a, b.col0), M44MulV4(a, b.col1), M44MulV4(a, b.col2), M44MulV4(a, b.col3));
1727}
1728
1729PX_FORCE_INLINE Mat44V M44Add(const Mat44V& a, const Mat44V& b)
1730{
1731 return Mat44V(V4Add(a.col0, b.col0), V4Add(a.col1, b.col1), V4Add(a.col2, b.col2), V4Add(a.col3, b.col3));
1732}
1733
1734PX_FORCE_INLINE Mat44V M44Inverse(const Mat44V& a)
1735{
1736 PxF32 tmp[12];
1737 PxF32 dst[16];
1738 PxF32 det;
1739
1740 const PxF32 src[16] = { a.col0.x, a.col0.y, a.col0.z, a.col0.w, a.col1.x, a.col1.y, a.col1.z, a.col1.w,
1741 a.col2.x, a.col2.y, a.col2.z, a.col2.w, a.col3.x, a.col3.y, a.col3.z, a.col3.w };
1742
1743 tmp[0] = src[10] * src[15];
1744 tmp[1] = src[11] * src[14];
1745 tmp[2] = src[9] * src[15];
1746 tmp[3] = src[11] * src[13];
1747 tmp[4] = src[9] * src[14];
1748 tmp[5] = src[10] * src[13];
1749 tmp[6] = src[8] * src[15];
1750 tmp[7] = src[11] * src[12];
1751 tmp[8] = src[8] * src[14];
1752 tmp[9] = src[10] * src[12];
1753 tmp[10] = src[8] * src[13];
1754 tmp[11] = src[9] * src[12];
1755
1756 dst[0] = tmp[0] * src[5] + tmp[3] * src[6] + tmp[4] * src[7];
1757 dst[0] -= tmp[1] * src[5] + tmp[2] * src[6] + tmp[5] * src[7];
1758 dst[1] = tmp[1] * src[4] + tmp[6] * src[6] + tmp[9] * src[7];
1759 dst[1] -= tmp[0] * src[4] + tmp[7] * src[6] + tmp[8] * src[7];
1760 dst[2] = tmp[2] * src[4] + tmp[7] * src[5] + tmp[10] * src[7];
1761 dst[2] -= tmp[3] * src[4] + tmp[6] * src[5] + tmp[11] * src[7];
1762 dst[3] = tmp[5] * src[4] + tmp[8] * src[5] + tmp[11] * src[6];
1763 dst[3] -= tmp[4] * src[4] + tmp[9] * src[5] + tmp[10] * src[6];
1764 dst[4] = tmp[1] * src[1] + tmp[2] * src[2] + tmp[5] * src[3];
1765 dst[4] -= tmp[0] * src[1] + tmp[3] * src[2] + tmp[4] * src[3];
1766 dst[5] = tmp[0] * src[0] + tmp[7] * src[2] + tmp[8] * src[3];
1767 dst[5] -= tmp[1] * src[0] + tmp[6] * src[2] + tmp[9] * src[3];
1768 dst[6] = tmp[3] * src[0] + tmp[6] * src[1] + tmp[11] * src[3];
1769 dst[6] -= tmp[2] * src[0] + tmp[7] * src[1] + tmp[10] * src[3];
1770 dst[7] = tmp[4] * src[0] + tmp[9] * src[1] + tmp[10] * src[2];
1771 dst[7] -= tmp[5] * src[0] + tmp[8] * src[1] + tmp[11] * src[2];
1772
1773 tmp[0] = src[2] * src[7];
1774 tmp[1] = src[3] * src[6];
1775 tmp[2] = src[1] * src[7];
1776 tmp[3] = src[3] * src[5];
1777 tmp[4] = src[1] * src[6];
1778 tmp[5] = src[2] * src[5];
1779 tmp[6] = src[0] * src[7];
1780 tmp[7] = src[3] * src[4];
1781 tmp[8] = src[0] * src[6];
1782 tmp[9] = src[2] * src[4];
1783 tmp[10] = src[0] * src[5];
1784 tmp[11] = src[1] * src[4];
1785
1786 dst[8] = tmp[0] * src[13] + tmp[3] * src[14] + tmp[4] * src[15];
1787 dst[8] -= tmp[1] * src[13] + tmp[2] * src[14] + tmp[5] * src[15];
1788 dst[9] = tmp[1] * src[12] + tmp[6] * src[14] + tmp[9] * src[15];
1789 dst[9] -= tmp[0] * src[12] + tmp[7] * src[14] + tmp[8] * src[15];
1790 dst[10] = tmp[2] * src[12] + tmp[7] * src[13] + tmp[10] * src[15];
1791 dst[10] -= tmp[3] * src[12] + tmp[6] * src[13] + tmp[11] * src[15];
1792 dst[11] = tmp[5] * src[12] + tmp[8] * src[13] + tmp[11] * src[14];
1793 dst[11] -= tmp[4] * src[12] + tmp[9] * src[13] + tmp[10] * src[14];
1794 dst[12] = tmp[2] * src[10] + tmp[5] * src[11] + tmp[1] * src[9];
1795 dst[12] -= tmp[4] * src[11] + tmp[0] * src[9] + tmp[3] * src[10];
1796 dst[13] = tmp[8] * src[11] + tmp[0] * src[8] + tmp[7] * src[10];
1797 dst[13] -= tmp[6] * src[10] + tmp[9] * src[11] + tmp[1] * src[8];
1798 dst[14] = tmp[6] * src[9] + tmp[11] * src[11] + tmp[3] * src[8];
1799 dst[14] -= tmp[10] * src[11] + tmp[2] * src[8] + tmp[7] * src[9];
1800 dst[15] = tmp[10] * src[10] + tmp[4] * src[8] + tmp[9] * src[9];
1801 dst[15] -= tmp[8] * src[9] + tmp[11] * src[10] + tmp[5] * src[8];
1802
1803 det = src[0] * dst[0] + src[1] * dst[1] + src[2] * dst[2] + src[3] * dst[3];
1804
1805 det = 1.0f / det;
1806 for(PxU32 j = 0; j < 16; j++)
1807 {
1808 dst[j] *= det;
1809 }
1810
1811 return Mat44V(Vec4V(dst[0], dst[4], dst[8], dst[12]), Vec4V(dst[1], dst[5], dst[9], dst[13]),
1812 Vec4V(dst[2], dst[6], dst[10], dst[14]), Vec4V(dst[3], dst[7], dst[11], dst[15]));
1813}
1814
1815PX_FORCE_INLINE Mat44V M44Trnsps(const Mat44V& a)
1816{
1817 return Mat44V(Vec4V(a.col0.x, a.col1.x, a.col2.x, a.col3.x), Vec4V(a.col0.y, a.col1.y, a.col2.y, a.col3.y),
1818 Vec4V(a.col0.z, a.col1.z, a.col2.z, a.col3.z), Vec4V(a.col0.w, a.col1.w, a.col2.w, a.col3.w));
1819}
1820
1821PX_FORCE_INLINE Vec4V V4LoadXYZW(const PxF32& x, const PxF32& y, const PxF32& z, const PxF32& w)
1822{
1823 return Vec4V(x, y, z, w);
1824}
1825
1826/*
1827PX_FORCE_INLINE VecU16V V4U32PK(VecU32V a, VecU32V b)
1828{
1829 return VecU16V(
1830 PxU16(PxClamp<PxU32>((a).u32[0], 0, 0xFFFF)),
1831 PxU16(PxClamp<PxU32>((a).u32[1], 0, 0xFFFF)),
1832 PxU16(PxClamp<PxU32>((a).u32[2], 0, 0xFFFF)),
1833 PxU16(PxClamp<PxU32>((a).u32[3], 0, 0xFFFF)),
1834 PxU16(PxClamp<PxU32>((b).u32[0], 0, 0xFFFF)),
1835 PxU16(PxClamp<PxU32>((b).u32[1], 0, 0xFFFF)),
1836 PxU16(PxClamp<PxU32>((b).u32[2], 0, 0xFFFF)),
1837 PxU16(PxClamp<PxU32>((b).u32[3], 0, 0xFFFF)));
1838}
1839*/
1840
1841PX_FORCE_INLINE VecU32V V4U32Sel(const BoolV c, const VecU32V a, const VecU32V b)
1842{
1843 return VecU32V(c.ux ? a.u32[0] : b.u32[0], c.uy ? a.u32[1] : b.u32[1], c.uz ? a.u32[2] : b.u32[2],
1844 c.uw ? a.u32[3] : b.u32[3]);
1845}
1846
1847PX_FORCE_INLINE VecU32V V4U32or(VecU32V a, VecU32V b)
1848{
1849 return VecU32V((a).u32[0] | (b).u32[0], (a).u32[1] | (b).u32[1], (a).u32[2] | (b).u32[2], (a).u32[3] | (b).u32[3]);
1850}
1851
1852PX_FORCE_INLINE VecU32V V4U32xor(VecU32V a, VecU32V b)
1853{
1854 return VecU32V((a).u32[0] ^ (b).u32[0], (a).u32[1] ^ (b).u32[1], (a).u32[2] ^ (b).u32[2], (a).u32[3] ^ (b).u32[3]);
1855}
1856
1857PX_FORCE_INLINE VecU32V V4U32and(VecU32V a, VecU32V b)
1858{
1859 return VecU32V((a).u32[0] & (b).u32[0], (a).u32[1] & (b).u32[1], (a).u32[2] & (b).u32[2], (a).u32[3] & (b).u32[3]);
1860}
1861
1862PX_FORCE_INLINE VecU32V V4U32Andc(VecU32V a, VecU32V b)
1863{
1864 return VecU32V((a).u32[0] & ~(b).u32[0], (a).u32[1] & ~(b).u32[1], (a).u32[2] & ~(b).u32[2],
1865 (a).u32[3] & ~(b).u32[3]);
1866}
1867
1868/*
1869PX_FORCE_INLINE VecU16V V4U16Or(VecU16V a, VecU16V b)
1870{
1871 return VecU16V(
1872 (a).u16[0]|(b).u16[0], (a).u16[1]|(b).u16[1], (a).u16[2]|(b).u16[2], (a).u16[3]|(b).u16[3],
1873 (a).u16[4]|(b).u16[4], (a).u16[5]|(b).u16[5], (a).u16[6]|(b).u16[6], (a).u16[7]|(b).u16[7]);
1874}
1875*/
1876
1877/*
1878PX_FORCE_INLINE VecU16V V4U16And(VecU16V a, VecU16V b)
1879{
1880 return VecU16V(
1881 (a).u16[0]&(b).u16[0], (a).u16[1]&(b).u16[1], (a).u16[2]&(b).u16[2], (a).u16[3]&(b).u16[3],
1882 (a).u16[4]&(b).u16[4], (a).u16[5]&(b).u16[5], (a).u16[6]&(b).u16[6], (a).u16[7]&(b).u16[7]);
1883}
1884*/
1885
1886/*
1887PX_FORCE_INLINE VecU16V V4U16Andc(VecU16V a, VecU16V b)
1888{
1889 return VecU16V(
1890 (a).u16[0]&~(b).u16[0], (a).u16[1]&~(b).u16[1], (a).u16[2]&~(b).u16[2], (a).u16[3]&~(b).u16[3],
1891 (a).u16[4]&~(b).u16[4], (a).u16[5]&~(b).u16[5], (a).u16[6]&~(b).u16[6], (a).u16[7]&~(b).u16[7]);
1892}
1893*/
1894
1895/*
1896template<int a> PX_FORCE_INLINE VecI32V V4ISplat()
1897{
1898 return VecI32V(a, a, a, a);
1899}
1900
1901template<PxU32 a> PX_FORCE_INLINE VecU32V V4USplat()
1902{
1903 return VecU32V(a, a, a, a);
1904}
1905*/
1906
1907/*
1908PX_FORCE_INLINE void V4U16StoreAligned(VecU16V val, VecU16V* address)
1909{
1910 *address = val;
1911}
1912*/
1913
1914PX_FORCE_INLINE void V4U32StoreAligned(VecU32V val, VecU32V* address)
1915{
1916 *address = val;
1917}
1918
1919PX_FORCE_INLINE Vec4V V4Andc(const Vec4V a, const VecU32V b)
1920{
1921 VecU32V r = V4U32Andc(*reinterpret_cast<const VecU32V*>(&a), b);
1922 return (*reinterpret_cast<const Vec4V*>(&r));
1923}
1924
1925PX_FORCE_INLINE VecU32V V4IsGrtrV32u(const Vec4V a, const Vec4V b)
1926{
1927 return VecU32V(a.x > b.x ? 0xFFFFffff : 0, a.y > b.y ? 0xFFFFffff : 0, a.z > b.z ? 0xFFFFffff : 0,
1928 a.w > b.w ? 0xFFFFffff : 0);
1929}
1930
1931PX_FORCE_INLINE VecU16V V4U16LoadAligned(VecU16V* addr)
1932{
1933 return *addr;
1934}
1935
1936PX_FORCE_INLINE VecU16V V4U16LoadUnaligned(VecU16V* addr)
1937{
1938 return *addr;
1939}
1940
1941PX_FORCE_INLINE VecU16V V4U16CompareGt(VecU16V a, VecU16V b)
1942{
1943 return VecU16V
1944 (
1945 BOOL_TO_U16(a.u16[0] > b.u16[0]), BOOL_TO_U16(a.u16[1] > b.u16[1]), BOOL_TO_U16(a.u16[2] > b.u16[2]), BOOL_TO_U16(a.u16[3] > b.u16[3]),
1946 BOOL_TO_U16(a.u16[4] > b.u16[4]), BOOL_TO_U16(a.u16[5] > b.u16[5]), BOOL_TO_U16(a.u16[6] > b.u16[6]), BOOL_TO_U16(a.u16[7] > b.u16[7])
1947 );
1948}
1949
1950PX_FORCE_INLINE VecU16V V4I16CompareGt(VecU16V a, VecU16V b)
1951{
1952 return VecU16V
1953 (
1954 BOOL_TO_U16(a.i16[0] > b.i16[0]), BOOL_TO_U16(a.i16[1] > b.i16[1]), BOOL_TO_U16(a.i16[2] > b.i16[2]), BOOL_TO_U16(a.i16[3] > b.i16[3]),
1955 BOOL_TO_U16(a.i16[4] > b.i16[4]), BOOL_TO_U16(a.i16[5] > b.i16[5]), BOOL_TO_U16(a.i16[6] > b.i16[6]), BOOL_TO_U16(a.i16[7] > b.i16[7])
1956 );
1957}
1958
1959PX_FORCE_INLINE Vec4V Vec4V_From_VecU32V(VecU32V a)
1960{
1961 return Vec4V(PxF32((a).u32[0]), PxF32((a).u32[1]), PxF32((a).u32[2]), PxF32((a).u32[3]));
1962}
1963
1964PX_FORCE_INLINE Vec4V Vec4V_From_VecI32V(VecI32V a)
1965{
1966 return Vec4V(PxF32((a).i32[0]), PxF32((a).i32[1]), PxF32((a).i32[2]), PxF32((a).i32[3]));
1967}
1968
1969PX_FORCE_INLINE VecI32V VecI32V_From_Vec4V(Vec4V a)
1970{
1971 float* data = reinterpret_cast<float*>(&a);
1972 return VecI32V(PxI32(data[0]), PxI32(data[1]), PxI32(data[2]), PxI32(data[3]));
1973}
1974
1975PX_FORCE_INLINE Vec4V Vec4V_ReinterpretFrom_VecU32V(VecU32V a)
1976{
1977 Vec4V b = *reinterpret_cast<Vec4V*>(&a);
1978 return b;
1979}
1980
1981PX_FORCE_INLINE Vec4V Vec4V_ReinterpretFrom_VecI32V(VecI32V a)
1982{
1983 Vec4V b = *reinterpret_cast<Vec4V*>(&a);
1984 return b;
1985}
1986
1987PX_FORCE_INLINE VecU32V VecU32V_ReinterpretFrom_Vec4V(Vec4V a)
1988{
1989 VecU32V b = *reinterpret_cast<VecU32V*>(&a);
1990 return b;
1991}
1992
1993PX_FORCE_INLINE VecI32V VecI32V_ReinterpretFrom_Vec4V(Vec4V a)
1994{
1995 VecI32V b = *reinterpret_cast<VecI32V*>(&a);
1996 return b;
1997}
1998
1999template <int index>
2000PX_FORCE_INLINE VecU32V V4U32SplatElement(VecU32V a)
2001{
2002 return VecU32V((a).u32[index], (a).u32[index], (a).u32[index], (a).u32[index]);
2003}
2004
2005template <int index>
2006PX_FORCE_INLINE VecU32V V4U32SplatElement(BoolV a)
2007{
2008 const PxU32 u = (&a.ux)[index];
2009 return VecU32V(u, u, u, u);
2010}
2011
2012template <int index>
2013PX_FORCE_INLINE Vec4V V4SplatElement(Vec4V a)
2014{
2015 float* data = reinterpret_cast<float*>(&a);
2016 return Vec4V(data[index], data[index], data[index], data[index]);
2017}
2018
2019PX_FORCE_INLINE VecU32V U4LoadXYZW(PxU32 x, PxU32 y, PxU32 z, PxU32 w)
2020{
2021 return VecU32V(x, y, z, w);
2022}
2023
2024PX_FORCE_INLINE Vec4V V4Abs(const Vec4V a)
2025{
2026 return V4Max(a, V4Neg(a));
2027}
2028
2029PX_FORCE_INLINE BoolV V4IsEqU32(const VecU32V a, const VecU32V b)
2030{
2031 return BoolV(BOOL_TO_U32(a.u32[0] == b.u32[0]), BOOL_TO_U32(a.u32[1] == b.u32[1]), BOOL_TO_U32(a.u32[2] == b.u32[2]), BOOL_TO_U32(a.u32[3] == b.u32[3]));
2032}
2033
2034PX_FORCE_INLINE VecU32V U4Load(const PxU32 i)
2035{
2036 return VecU32V(i, i, i, i);
2037}
2038
2039PX_FORCE_INLINE VecU32V U4LoadU(const PxU32* i)
2040{
2041 return VecU32V(i[0], i[1], i[2], i[3]);
2042}
2043
2044PX_FORCE_INLINE VecU32V U4LoadA(const PxU32* i)
2045{
2046 return VecU32V(i[0], i[1], i[2], i[3]);
2047}
2048
2049PX_FORCE_INLINE VecI32V I4LoadXYZW(const PxI32& x, const PxI32& y, const PxI32& z, const PxI32& w)
2050{
2051 return VecI32V(x, y, z, w);
2052}
2053
2054PX_FORCE_INLINE VecI32V I4Load(const PxI32 i)
2055{
2056 return VecI32V(i, i, i, i);
2057}
2058
2059PX_FORCE_INLINE VecI32V I4LoadU(const PxI32* i)
2060{
2061 return VecI32V(i[0], i[1], i[2], i[3]);
2062}
2063
2064PX_FORCE_INLINE VecI32V I4LoadA(const PxI32* i)
2065{
2066 return VecI32V(i[0], i[1], i[2], i[3]);
2067}
2068
2069PX_FORCE_INLINE VecI32V VecI32V_Add(const VecI32VArg a, const VecI32VArg b)
2070{
2071 return VecI32V(a.i32[0] + b.i32[0], a.i32[1] + b.i32[1], a.i32[2] + b.i32[2], a.i32[3] + b.i32[3]);
2072}
2073
2074PX_FORCE_INLINE VecI32V VecI32V_Sub(const VecI32VArg a, const VecI32VArg b)
2075{
2076 return VecI32V(a.i32[0] - b.i32[0], a.i32[1] - b.i32[1], a.i32[2] - b.i32[2], a.i32[3] - b.i32[3]);
2077}
2078
2079PX_FORCE_INLINE BoolV VecI32V_IsGrtr(const VecI32VArg a, const VecI32VArg b)
2080{
2081 return BoolV(BOOL_TO_U32(a.i32[0] > b.i32[0]), BOOL_TO_U32(a.i32[1] > b.i32[1]), BOOL_TO_U32(a.i32[2] > b.i32[2]), BOOL_TO_U32(a.i32[3] > b.i32[3]));
2082}
2083
2084PX_FORCE_INLINE BoolV VecI32V_IsEq(const VecI32VArg a, const VecI32VArg b)
2085{
2086 return BoolV(BOOL_TO_U32(a.i32[0] == b.i32[0]), BOOL_TO_U32(a.i32[1] == b.i32[1]), BOOL_TO_U32(a.i32[2] == b.i32[2]), BOOL_TO_U32(a.i32[3] == b.i32[3]));
2087}
2088
2089PX_FORCE_INLINE VecI32V V4I32Sel(const BoolV c, const VecI32V a, const VecI32V b)
2090{
2091 return VecI32V(c.ux ? a.i32[0] : b.i32[0], c.uy ? a.i32[1] : b.i32[1], c.uz ? a.i32[2] : b.i32[2],
2092 c.uw ? a.i32[3] : b.i32[3]);
2093}
2094
2095PX_FORCE_INLINE VecI32V VecI32V_Zero()
2096{
2097 return VecI32V(0, 0, 0, 0);
2098}
2099
2100PX_FORCE_INLINE VecI32V VecI32V_One()
2101{
2102 return VecI32V(1, 1, 1, 1);
2103}
2104
2105PX_FORCE_INLINE VecI32V VecI32V_Two()
2106{
2107 return VecI32V(2, 2, 2, 2);
2108}
2109
2110PX_FORCE_INLINE VecI32V VecI32V_MinusOne()
2111{
2112 return VecI32V(-1, -1, -1, -1);
2113}
2114
2115PX_FORCE_INLINE VecU32V U4Zero()
2116{
2117 return VecU32V(0, 0, 0, 0);
2118}
2119
2120PX_FORCE_INLINE VecU32V U4One()
2121{
2122 return VecU32V(1, 1, 1, 1);
2123}
2124
2125PX_FORCE_INLINE VecU32V U4Two()
2126{
2127 return VecU32V(2, 2, 2, 2);
2128}
2129
2130PX_FORCE_INLINE VecShiftV VecI32V_PrepareShift(const VecI32VArg shift)
2131{
2132 return shift;
2133}
2134
2135PX_FORCE_INLINE VecI32V VecI32V_LeftShift(const VecI32VArg a, const VecShiftVArg count)
2136{
2137 return VecI32V(a.i32[0] << count.i32[0], a.i32[1] << count.i32[1], a.i32[2] << count.i32[2], a.i32[3]
2138 << count.i32[3]);
2139}
2140
2141PX_FORCE_INLINE VecI32V VecI32V_RightShift(const VecI32VArg a, const VecShiftVArg count)
2142{
2143 return VecI32V(a.i32[0] >> count.i32[0], a.i32[1] >> count.i32[1], a.i32[2] >> count.i32[2],
2144 a.i32[3] >> count.i32[3]);
2145}
2146
2147PX_FORCE_INLINE VecI32V VecI32V_LeftShift(const VecI32VArg a, const PxU32 count)
2148{
2149 return VecI32V(a.i32[0] << count, a.i32[1] << count, a.i32[2] << count, a.i32[3] << count);
2150}
2151
2152PX_FORCE_INLINE VecI32V VecI32V_RightShift(const VecI32VArg a, const PxU32 count)
2153{
2154 return VecI32V(a.i32[0] >> count, a.i32[1] >> count, a.i32[2] >> count, a.i32[3] >> count);
2155}
2156
2157PX_FORCE_INLINE VecI32V VecI32V_And(const VecI32VArg a, const VecI32VArg b)
2158{
2159 return VecI32V(a.i32[0] & b.i32[0], a.i32[1] & b.i32[1], a.i32[2] & b.i32[2], a.i32[3] & b.i32[3]);
2160}
2161
2162PX_FORCE_INLINE VecI32V VecI32V_Or(const VecI32VArg a, const VecI32VArg b)
2163{
2164 return VecI32V(a.i32[0] | b.i32[0], a.i32[1] | b.i32[1], a.i32[2] | b.i32[2], a.i32[3] | b.i32[3]);
2165}
2166
2167PX_FORCE_INLINE VecI32V VecI32V_GetX(const VecI32VArg a)
2168{
2169 return VecI32V(a.i32[0], a.i32[0], a.i32[0], a.i32[0]);
2170}
2171
2172PX_FORCE_INLINE VecI32V VecI32V_GetY(const VecI32VArg a)
2173{
2174 return VecI32V(a.i32[1], a.i32[1], a.i32[1], a.i32[1]);
2175}
2176
2177PX_FORCE_INLINE VecI32V VecI32V_GetZ(const VecI32VArg a)
2178{
2179 return VecI32V(a.i32[2], a.i32[2], a.i32[2], a.i32[2]);
2180}
2181
2182PX_FORCE_INLINE VecI32V VecI32V_GetW(const VecI32VArg a)
2183{
2184 return VecI32V(a.i32[3], a.i32[3], a.i32[3], a.i32[3]);
2185}
2186
2187PX_FORCE_INLINE VecI32V VecI32V_Sel(const BoolV c, const VecI32VArg a, const VecI32VArg b)
2188{
2189 return VecI32V(c.ux ? a.i32[0] : b.i32[0], c.uy ? a.i32[1] : b.i32[1], c.uz ? a.i32[2] : b.i32[2],
2190 c.uw ? a.i32[3] : b.i32[3]);
2191}
2192
2193PX_FORCE_INLINE VecI32V VecI32V_Merge(const VecI32VArg a, const VecI32VArg b, const VecI32VArg c, const VecI32VArg d)
2194{
2195 return VecI32V(a.i32[0], b.i32[0], c.i32[0], d.i32[0]);
2196}
2197
2198PX_FORCE_INLINE void PxI32_From_VecI32V(const VecI32VArg a, PxI32* i)
2199{
2200 *i = a.i32[0];
2201}
2202
2203PX_FORCE_INLINE VecI32V VecI32V_From_BoolV(const BoolVArg b)
2204{
2205 return VecI32V(PxI32(b.ux), PxI32(b.uy), PxI32(b.uz), PxI32(b.uw));
2206}
2207
2208PX_FORCE_INLINE VecU32V VecU32V_From_BoolV(const BoolVArg b)
2209{
2210 return VecU32V(b.ux, b.uy, b.uz, b.uw);
2211}
2212
2213PX_FORCE_INLINE void QuatGetMat33V(const QuatVArg q, Vec3V& column0, Vec3V& column1, Vec3V& column2)
2214{
2215 const FloatV one = FOne();
2216 const FloatV x = V4GetX(q);
2217 const FloatV y = V4GetY(q);
2218 const FloatV z = V4GetZ(q);
2219 const FloatV w = V4GetW(q);
2220
2221 const FloatV x2 = FAdd(x, x);
2222 const FloatV y2 = FAdd(y, y);
2223 const FloatV z2 = FAdd(z, z);
2224
2225 const FloatV xx = FMul(x2, x);
2226 const FloatV yy = FMul(y2, y);
2227 const FloatV zz = FMul(z2, z);
2228
2229 const FloatV xy = FMul(x2, y);
2230 const FloatV xz = FMul(x2, z);
2231 const FloatV xw = FMul(x2, w);
2232
2233 const FloatV yz = FMul(y2, z);
2234 const FloatV yw = FMul(y2, w);
2235 const FloatV zw = FMul(z2, w);
2236
2237 const FloatV v = FSub(one, xx);
2238
2239 column0 = V3Merge(FSub(FSub(one, yy), zz), FAdd(xy, zw), FSub(xz, yw));
2240 column1 = V3Merge(FSub(xy, zw), FSub(v, zz), FAdd(yz, xw));
2241 column2 = V3Merge(FAdd(xz, yw), FSub(yz, xw), FSub(v, yy));
2242}
2243
2244
2245// not used
2246
2247/*
2248PX_FORCE_INLINE Vec4V V4LoadAligned(Vec4V* addr)
2249{
2250 return *addr;
2251}
2252*/
2253
2254/*
2255PX_FORCE_INLINE Vec4V V4LoadUnaligned(Vec4V* addr)
2256{
2257 return *addr;
2258}
2259*/
2260
2261/*
2262PX_FORCE_INLINE Vec4V V4Ceil(const Vec4V a)
2263{
2264 return Vec4V(PxCeil(a.x), PxCeil(a.y), PxCeil(a.z), PxCeil(a.w));
2265}
2266
2267PX_FORCE_INLINE Vec4V V4Floor(const Vec4V a)
2268{
2269 return Vec4V(PxFloor(a.x), PxFloor(a.y), PxFloor(a.z), PxFloor(a.w));
2270}
2271*/
2272
2273/*
2274PX_FORCE_INLINE VecU32V V4ConvertToU32VSaturate(const Vec4V a, PxU32 power)
2275{
2276 PX_ASSERT(power == 0 && "Non-zero power not supported in convertToU32VSaturate");
2277 PX_UNUSED(power); // prevent warning in release builds
2278 PxF32 ffffFFFFasFloat = PxF32(0xFFFF0000);
2279 return VecU32V(
2280 PxU32(PxClamp<PxF32>((a).x, 0.0f, ffffFFFFasFloat)),
2281 PxU32(PxClamp<PxF32>((a).y, 0.0f, ffffFFFFasFloat)),
2282 PxU32(PxClamp<PxF32>((a).z, 0.0f, ffffFFFFasFloat)),
2283 PxU32(PxClamp<PxF32>((a).w, 0.0f, ffffFFFFasFloat)));
2284}
2285*/
2286
2287} // namespace aos
2288#if !PX_DOXYGEN
2289} // namespace physx
2290#endif
2291
2292#endif
2293
#define PX_RESTRICT
Definition PxPreprocessor.h:355
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
int32 i32
Definition fwd.hpp:62
uint32 u32
Definition fwd.hpp:122
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
PX_CUDA_CALLABLE PX_FORCE_INLINE float PxAbs(float a)
abs returns the absolute value of its argument.
Definition PxMath.h:109
PX_CUDA_CALLABLE PX_FORCE_INLINE float PxRecipSqrt(float a)
reciprocal square root.
Definition PxMath.h:158
PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxIsFinite(float f)
returns true if the passed number is a finite floating point number as opposed to INF,...
Definition PxMath.h:326
PX_CUDA_CALLABLE PX_FORCE_INLINE float PxSqrt(float a)
Square root.
Definition PxMath.h:146