18void Vec3::CheckW()
const
20#ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
28#ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
29 #if defined(JPH_USE_SSE)
30 return _mm_shuffle_ps(inValue, inValue, _MM_SHUFFLE(2, 2, 1, 0));
31 #elif defined(JPH_USE_NEON)
32 return JPH_NEON_SHUFFLE_F32x4(inValue, inValue, 0, 1, 2, 2);
33 #elif defined(JPH_USE_RVV)
35 const vfloat32m1_t v = __riscv_vle32_v_f32m1(inValue.mData, 3);
36 __riscv_vse32_v_f32m1(value.mData, v, 3);
37 value.mData[3] = value.mData[2];
41 value.mData[0] = inValue.mData[0];
42 value.mData[1] = inValue.mData[1];
43 value.mData[2] = inValue.mData[2];
44 value.mData[3] = inValue.mData[2];
53 mValue(sFixW(inRHS.mValue))
59#if defined(JPH_USE_SSE)
60 Type x = _mm_load_ss(&inV.
x);
61 Type y = _mm_load_ss(&inV.
y);
62 Type z = _mm_load_ss(&inV.
z);
63 Type xy = _mm_unpacklo_ps(x, y);
64 mValue = _mm_shuffle_ps(
xy, z, _MM_SHUFFLE(0, 0, 1, 0));
65#elif defined(JPH_USE_NEON)
66 float32x2_t
xy = vld1_f32(&inV.
x);
67 float32x2_t zz = vdup_n_f32(inV.
z);
69#elif defined(JPH_USE_RVV)
70 const vfloat32m1_t v = __riscv_vle32_v_f32m1(&inV.
x, 3);
71 __riscv_vse32_v_f32m1(
mF32, v, 3);
83#if defined(JPH_USE_SSE)
84 mValue = _mm_set_ps(inZ, inZ, inY, inX);
85#elif defined(JPH_USE_NEON)
87 uint32x2_t zz = vreinterpret_u32_f32(vdup_n_f32(inZ));
88 mValue = vreinterpretq_f32_u32(vcombine_u32(
xy, zz));
89#elif defined(JPH_USE_RVV)
90 const float aggregated[4] = { inX, inY, inZ, inZ };
91 const vfloat32m1_t v = __riscv_vle32_v_f32m1(aggregated, 4);
92 __riscv_vse32_v_f32m1(
mF32, v, 4);
101template<u
int32 SwizzleX, u
int32 SwizzleY, u
int32 SwizzleZ>
104 static_assert(SwizzleX <= 3,
"SwizzleX template parameter out of range");
105 static_assert(SwizzleY <= 3,
"SwizzleY template parameter out of range");
106 static_assert(SwizzleZ <= 3,
"SwizzleZ template parameter out of range");
108#if defined(JPH_USE_SSE)
109 return _mm_shuffle_ps(
mValue,
mValue, _MM_SHUFFLE(SwizzleZ, SwizzleZ, SwizzleY, SwizzleX));
110#elif defined(JPH_USE_NEON)
111 return JPH_NEON_SHUFFLE_F32x4(
mValue,
mValue, SwizzleX, SwizzleY, SwizzleZ, SwizzleZ);
112#elif defined(JPH_USE_RVV)
114 const vfloat32m1_t data = __riscv_vle32_v_f32m1(
mF32, 4);
115 const uint32 stored_indices[4] = { SwizzleX, SwizzleY, SwizzleZ, SwizzleZ };
116 const vuint32m1_t index = __riscv_vle32_v_u32m1(stored_indices, 4);
117 const vfloat32m1_t swizzled = __riscv_vrgather_vv_f32m1(data, index, 4);
118 __riscv_vse32_v_f32m1(v.
mF32, swizzled, 4);
127#if defined(JPH_USE_SSE)
128 return _mm_setzero_ps();
129#elif defined(JPH_USE_NEON)
130 return vdupq_n_f32(0);
131#elif defined(JPH_USE_RVV)
133 const vfloat32m1_t zero_vec = __riscv_vfmv_v_f_f32m1(0.0f, 3);
134 __riscv_vse32_v_f32m1(v.
mF32, zero_vec, 3);
137 return Vec3(0, 0, 0);
143#if defined(JPH_USE_SSE)
144 return _mm_set1_ps(inV);
145#elif defined(JPH_USE_NEON)
146 return vdupq_n_f32(inV);
147#elif defined(JPH_USE_RVV)
149 const vfloat32m1_t v = __riscv_vfmv_v_f_f32m1(inV, 3);
150 __riscv_vse32_v_f32m1(vec.
mF32, v, 3);
153 return Vec3(inV, inV, inV);
164 return sReplicate(numeric_limits<float>::quiet_NaN());
169#if defined(JPH_USE_SSE)
170 Type v = _mm_loadu_ps(&inV.
x);
171#elif defined(JPH_USE_NEON)
172 Type v = vld1q_f32(&inV.
x);
173#elif defined(JPH_USE_RVV)
175 const vfloat32m1_t rvv = __riscv_vle32_v_f32m1(&inV.
x, 3);
176 __riscv_vse32_v_f32m1(v.mData, rvv, 3);
178 Type v = { inV.
x, inV.
y, inV.
z };
185#if defined(JPH_USE_SSE)
187#elif defined(JPH_USE_NEON)
189#elif defined(JPH_USE_RVV)
191 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(inV1.
mF32, 3);
192 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
193 const vfloat32m1_t min = __riscv_vfmin_vv_f32m1(v1, v2, 3);
194 __riscv_vse32_v_f32m1(res.
mF32, min, 3);
205#if defined(JPH_USE_SSE)
207#elif defined(JPH_USE_NEON)
209#elif defined(JPH_USE_RVV)
211 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(inV1.
mF32, 3);
212 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
213 const vfloat32m1_t max = __riscv_vfmax_vv_f32m1(v1, v2, 3);
214 __riscv_vse32_v_f32m1(res.
mF32, max, 3);
225 return sMax(
sMin(inV, inMax), inMin);
230#if defined(JPH_USE_SSE)
231 return _mm_castps_si128(_mm_cmpeq_ps(inV1.
mValue, inV2.
mValue));
232#elif defined(JPH_USE_NEON)
234#elif defined(JPH_USE_RVV)
236 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(inV1.
mF32, 3);
237 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
238 const vbool32_t mask = __riscv_vmfeq_vv_f32m1_b32(v1, v2, 3);
239 const vuint32m1_t zeros = __riscv_vmv_v_x_u32m1(0x0, 3);
240 const vuint32m1_t merged = __riscv_vmerge_vxm_u32m1(zeros, 0xFFFFFFFF, mask, 3);
241 __riscv_vse32_v_u32m1(res.
mU32, merged, 3);
247 inV1.
mF32[1] == inV2.
mF32[1]? 0xffffffffu : 0,
255#if defined(JPH_USE_SSE)
256 return _mm_castps_si128(_mm_cmplt_ps(inV1.
mValue, inV2.
mValue));
257#elif defined(JPH_USE_NEON)
259#elif defined(JPH_USE_RVV)
261 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(inV1.
mF32, 3);
262 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
263 const vbool32_t mask = __riscv_vmflt_vv_f32m1_b32(v1, v2, 3);
264 const vuint32m1_t zeros = __riscv_vmv_v_x_u32m1(0x0, 3);
265 const vuint32m1_t merged = __riscv_vmerge_vxm_u32m1(zeros, 0xFFFFFFFF, mask, 3);
266 __riscv_vse32_v_u32m1(res.
mU32, merged, 3);
272 inV1.
mF32[1] < inV2.
mF32[1]? 0xffffffffu : 0,
280#if defined(JPH_USE_SSE)
281 return _mm_castps_si128(_mm_cmple_ps(inV1.
mValue, inV2.
mValue));
282#elif defined(JPH_USE_NEON)
284#elif defined(JPH_USE_RVV)
286 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(inV1.
mF32, 3);
287 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
288 const vbool32_t mask = __riscv_vmfle_vv_f32m1_b32(v1, v2, 3);
289 const vuint32m1_t zeros = __riscv_vmv_v_x_u32m1(0x0, 3);
290 const vuint32m1_t merged = __riscv_vmerge_vxm_u32m1(zeros, 0xFFFFFFFF, mask, 3);
291 __riscv_vse32_v_u32m1(res.
mU32, merged, 3);
297 inV1.
mF32[1] <= inV2.
mF32[1]? 0xffffffffu : 0,
305#if defined(JPH_USE_SSE)
306 return _mm_castps_si128(_mm_cmpgt_ps(inV1.
mValue, inV2.
mValue));
307#elif defined(JPH_USE_NEON)
309#elif defined(JPH_USE_RVV)
311 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(inV1.
mF32, 3);
312 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
313 const vbool32_t mask = __riscv_vmfgt_vv_f32m1_b32(v1, v2, 3);
314 const vuint32m1_t zeros = __riscv_vmv_v_x_u32m1(0x0, 3);
315 const vuint32m1_t merged = __riscv_vmerge_vxm_u32m1(zeros, 0xFFFFFFFF, mask, 3);
316 __riscv_vse32_v_u32m1(res.
mU32, merged, 3);
322 inV1.
mF32[1] > inV2.
mF32[1]? 0xffffffffu : 0,
330#if defined(JPH_USE_SSE)
331 return _mm_castps_si128(_mm_cmpge_ps(inV1.
mValue, inV2.
mValue));
332#elif defined(JPH_USE_NEON)
334#elif defined(JPH_USE_RVV)
336 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(inV1.
mF32, 3);
337 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
338 const vbool32_t mask = __riscv_vmfge_vv_f32m1_b32(v1, v2, 3);
339 const vuint32m1_t zeros = __riscv_vmv_v_x_u32m1(0x0, 3);
340 const vuint32m1_t merged = __riscv_vmerge_vxm_u32m1(zeros, 0xFFFFFFFF, mask, 3);
341 __riscv_vse32_v_u32m1(res.
mU32, merged, 3);
347 inV1.
mF32[1] >= inV2.
mF32[1]? 0xffffffffu : 0,
358 #elif defined(JPH_USE_NEON)
360 #elif defined(JPH_USE_RVV)
362 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(inMul1.
mF32, 3);
363 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inMul2.
mF32, 3);
364 const vfloat32m1_t rvv_add = __riscv_vle32_v_f32m1(inAdd.
mF32, 3);
365 const vfloat32m1_t fmadd = __riscv_vfmacc_vv_f32m1(rvv_add, v1, v2, 3);
366 __riscv_vse32_v_f32m1(res.
mF32, fmadd, 3);
369 return inMul1 * inMul2 + inAdd;
372 return inMul1 * inMul2 + inAdd;
378#if defined(JPH_USE_SSE4_1) && !defined(JPH_PLATFORM_WASM)
381#elif defined(JPH_USE_SSE)
382 __m128 is_set = _mm_castsi128_ps(_mm_srai_epi32(inControl.
mValue, 31));
383 Type v = _mm_or_ps(_mm_and_ps(is_set, inSet.
mValue), _mm_andnot_ps(is_set, inNotSet.
mValue));
385#elif defined(JPH_USE_NEON)
386 Type v = vbslq_f32(vreinterpretq_u32_s32(vshrq_n_s32(vreinterpretq_s32_u32(inControl.
mValue), 31)), inSet.
mValue, inNotSet.
mValue);
388#elif defined(JPH_USE_RVV)
390 const vuint32m1_t control = __riscv_vle32_v_u32m1(inControl.
mU32, 3);
391 const vfloat32m1_t not_set = __riscv_vle32_v_f32m1(inNotSet.
mF32, 3);
392 const vfloat32m1_t set = __riscv_vle32_v_f32m1(inSet.
mF32, 3);
395 const vuint32m1_t r = __riscv_vand_vx_u32m1(control, 0x80000000u, 3);
396 const vbool32_t rvv_mask = __riscv_vmsne_vx_u32m1_b32(r, 0x0, 3);
397 const vfloat32m1_t merged = __riscv_vmerge_vvm_f32m1(not_set, set, rvv_mask, 3);
398 __riscv_vse32_v_f32m1(masked.
mF32, merged, 3);
402 for (
int i = 0; i < 3; i++)
403 result.
mF32[i] = (inControl.
mU32[i] & 0x80000000u) ? inSet.
mF32[i] : inNotSet.
mF32[i];
404#ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
413#if defined(JPH_USE_SSE)
415#elif defined(JPH_USE_NEON)
416 return vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(inV1.
mValue), vreinterpretq_u32_f32(inV2.
mValue)));
417#elif defined(JPH_USE_RVV)
419 const vuint32m1_t v1 = __riscv_vle32_v_u32m1(
reinterpret_cast<const uint32 *
>(inV1.
mF32), 3);
420 const vuint32m1_t v2 = __riscv_vle32_v_u32m1(
reinterpret_cast<const uint32 *
>(inV2.
mF32), 3);
421 const vuint32m1_t res = __riscv_vor_vv_u32m1(v1, v2, 3);
422 __riscv_vse32_v_u32m1(
reinterpret_cast<uint32 *
>(or_result.
mF32), res, 3);
431#if defined(JPH_USE_SSE)
433#elif defined(JPH_USE_NEON)
434 return vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(inV1.
mValue), vreinterpretq_u32_f32(inV2.
mValue)));
435#elif defined(JPH_USE_RVV)
437 const vuint32m1_t v1 = __riscv_vle32_v_u32m1(
reinterpret_cast<const uint32 *
>(inV1.
mF32), 3);
438 const vuint32m1_t v2 = __riscv_vle32_v_u32m1(
reinterpret_cast<const uint32 *
>(inV2.
mF32), 3);
439 const vuint32m1_t res = __riscv_vxor_vv_u32m1(v1, v2, 3);
440 __riscv_vse32_v_u32m1(
reinterpret_cast<uint32 *
>(xor_result.
mF32), res, 3);
449#if defined(JPH_USE_SSE)
451#elif defined(JPH_USE_NEON)
452 return vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(inV1.
mValue), vreinterpretq_u32_f32(inV2.
mValue)));
453#elif defined(JPH_USE_RVV)
455 const vuint32m1_t v1 = __riscv_vle32_v_u32m1(
reinterpret_cast<const uint32 *
>(inV1.
mF32), 3);
456 const vuint32m1_t v2 = __riscv_vle32_v_u32m1(
reinterpret_cast<const uint32 *
>(inV2.
mF32), 3);
457 const vuint32m1_t res = __riscv_vand_vv_u32m1(v1, v2, 3);
458 __riscv_vse32_v_u32m1(
reinterpret_cast<uint32 *
>(and_result.
mF32), res, 3);
472template <
class Random>
477 float z = -1.0f + 2.0f * float(inRandom() - inRandom.min()) / float(inRandom.max() - inRandom.min());
478 float r = JPH::Sqrt(1.0f -
Square(z));
479 float theta = 2.0f * JPH_PI * float(inRandom() - inRandom.min()) / float(inRandom.max() - inRandom.min());
492 return (inV2 - *
this).LengthSq() <= inMaxDistSq;
502#if defined(JPH_USE_SSE)
504#elif defined(JPH_USE_NEON)
506#elif defined(JPH_USE_RVV)
508 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(
mF32, 3);
509 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
510 const vfloat32m1_t mul = __riscv_vfmul_vv_f32m1(v1, v2, 3);
511 __riscv_vse32_v_f32m1(res.
mF32, mul, 3);
520#if defined(JPH_USE_SSE)
521 return _mm_mul_ps(
mValue, _mm_set1_ps(inV2));
522#elif defined(JPH_USE_NEON)
523 return vmulq_n_f32(
mValue, inV2);
524#elif defined(JPH_USE_RVV)
526 const vfloat32m1_t src = __riscv_vle32_v_f32m1(
mF32, 3);
527 const vfloat32m1_t mul = __riscv_vfmul_vf_f32m1(src, inV2, 3);
528 __riscv_vse32_v_f32m1(res.
mF32, mul, 3);
537#if defined(JPH_USE_SSE)
538 return _mm_mul_ps(_mm_set1_ps(inV1), inV2.
mValue);
539#elif defined(JPH_USE_NEON)
540 return vmulq_n_f32(inV2.
mValue, inV1);
541#elif defined(JPH_USE_RVV)
543 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
544 const vfloat32m1_t mul = __riscv_vfmul_vf_f32m1(v1, inV1, 3);
545 __riscv_vse32_v_f32m1(res.
mF32, mul, 3);
554#if defined(JPH_USE_SSE)
555 return _mm_div_ps(
mValue, _mm_set1_ps(inV2));
556#elif defined(JPH_USE_NEON)
557 return vdivq_f32(
mValue, vdupq_n_f32(inV2));
558#elif defined(JPH_USE_RVV)
560 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(
mF32, 3);
561 const vfloat32m1_t div = __riscv_vfdiv_vf_f32m1(v1, inV2, 3);
562 __riscv_vse32_v_f32m1(res.
mF32, div, 3);
571#if defined(JPH_USE_SSE)
573#elif defined(JPH_USE_NEON)
575#elif defined(JPH_USE_RVV)
576 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(
mF32, 3);
577 const vfloat32m1_t res = __riscv_vfmul_vf_f32m1(v1, inV2, 3);
578 __riscv_vse32_v_f32m1(
mF32, res, 3);
580 for (
int i = 0; i < 3; ++i)
582 #ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
591#if defined(JPH_USE_SSE)
593#elif defined(JPH_USE_NEON)
595#elif defined(JPH_USE_RVV)
596 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(
mF32, 3);
597 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
598 const vfloat32m1_t rvv_res = __riscv_vfmul_vv_f32m1(v1, v2, 3);
599 __riscv_vse32_v_f32m1(
mF32, rvv_res, 3);
601 for (
int i = 0; i < 3; ++i)
603 #ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
612#if defined(JPH_USE_SSE)
614#elif defined(JPH_USE_NEON)
616#elif defined(JPH_USE_RVV)
617 const vfloat32m1_t v = __riscv_vle32_v_f32m1(
mF32, 3);
618 const vfloat32m1_t res = __riscv_vfdiv_vf_f32m1(v, inV2, 3);
619 __riscv_vse32_v_f32m1(
mF32, res, 3);
621 for (
int i = 0; i < 3; ++i)
623 #ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
632#if defined(JPH_USE_SSE)
634#elif defined(JPH_USE_NEON)
636#elif defined(JPH_USE_RVV)
638 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(
mF32, 3);
639 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
640 const vfloat32m1_t rvv_add = __riscv_vfadd_vv_f32m1(v1, v2, 3);
641 __riscv_vse32_v_f32m1(res.
mF32, rvv_add, 3);
650#if defined(JPH_USE_SSE)
652#elif defined(JPH_USE_NEON)
654#elif defined(JPH_USE_RVV)
655 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(
mF32, 3);
656 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
657 const vfloat32m1_t rvv_add = __riscv_vfadd_vv_f32m1(v1, v2, 3);
658 __riscv_vse32_v_f32m1(
mF32, rvv_add, 3);
660 for (
int i = 0; i < 3; ++i)
662 #ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
671#if defined(JPH_USE_SSE)
672 return _mm_sub_ps(_mm_setzero_ps(),
mValue);
673#elif defined(JPH_USE_NEON)
674 #ifdef JPH_CROSS_PLATFORM_DETERMINISTIC
675 return vsubq_f32(vdupq_n_f32(0),
mValue);
679#elif defined(JPH_USE_RVV)
680 #ifdef JPH_CROSS_PLATFORM_DETERMINISTIC
682 const vfloat32m1_t rvv_zero = __riscv_vfmv_v_f_f32m1(0.0f, 3);
683 const vfloat32m1_t v = __riscv_vle32_v_f32m1(
mF32, 3);
684 const vfloat32m1_t rvv_neg = __riscv_vfsub_vv_f32m1(rvv_zero, v, 3);
685 __riscv_vse32_v_f32m1(res.
mF32, rvv_neg, 3);
689 const vfloat32m1_t v = __riscv_vle32_v_f32m1(
mF32, 3);
690 const vfloat32m1_t rvv_neg = __riscv_vfsgnjn_vv_f32m1(v, v, 3);
691 __riscv_vse32_v_f32m1(res.
mF32, rvv_neg, 3);
695 #ifdef JPH_CROSS_PLATFORM_DETERMINISTIC
705#if defined(JPH_USE_SSE)
707#elif defined(JPH_USE_NEON)
709#elif defined(JPH_USE_RVV)
711 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(
mF32, 3);
712 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
713 const vfloat32m1_t rvv_sub = __riscv_vfsub_vv_f32m1(v1, v2, 3);
714 __riscv_vse32_v_f32m1(res.
mF32, rvv_sub, 3);
723#if defined(JPH_USE_SSE)
725#elif defined(JPH_USE_NEON)
727#elif defined(JPH_USE_RVV)
728 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(
mF32, 3);
729 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
730 const vfloat32m1_t rvv_sub = __riscv_vfsub_vv_f32m1(v1, v2, 3);
731 __riscv_vse32_v_f32m1(
mF32, rvv_sub, 3);
733 for (
int i = 0; i < 3; ++i)
735 #ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
745#if defined(JPH_USE_SSE)
747#elif defined(JPH_USE_NEON)
749#elif defined(JPH_USE_RVV)
751 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(
mF32, 3);
752 const vfloat32m1_t v2 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
753 const vfloat32m1_t rvv_div = __riscv_vfdiv_vv_f32m1(v1, v2, 3);
754 __riscv_vse32_v_f32m1(res.
mF32, rvv_div, 3);
763#if defined(JPH_USE_SSE)
764 return _mm_shuffle_ps(
mValue,
mValue, _MM_SHUFFLE(0, 0, 0, 0));
765#elif defined(JPH_USE_NEON)
766 return vdupq_laneq_f32(
mValue, 0);
767#elif defined(JPH_USE_RVV)
769 const vfloat32m1_t splat = __riscv_vfmv_v_f_f32m1(
mF32[0], 4);
770 __riscv_vse32_v_f32m1(vec.
mF32, splat, 4);
779#if defined(JPH_USE_SSE)
780 return _mm_shuffle_ps(
mValue,
mValue, _MM_SHUFFLE(1, 1, 1, 1));
781#elif defined(JPH_USE_NEON)
782 return vdupq_laneq_f32(
mValue, 1);
783#elif defined(JPH_USE_RVV)
785 const vfloat32m1_t splat = __riscv_vfmv_v_f_f32m1(
mF32[1], 4);
786 __riscv_vse32_v_f32m1(vec.
mF32, splat, 4);
795#if defined(JPH_USE_SSE)
796 return _mm_shuffle_ps(
mValue,
mValue, _MM_SHUFFLE(2, 2, 2, 2));
797#elif defined(JPH_USE_NEON)
798 return vdupq_laneq_f32(
mValue, 2);
799#elif defined(JPH_USE_RVV)
801 const vfloat32m1_t splat = __riscv_vfmv_v_f_f32m1(
mF32[2], 4);
802 __riscv_vse32_v_f32m1(vec.
mF32, splat, 4);
821#if defined(JPH_USE_AVX512)
823#elif defined(JPH_USE_SSE)
824 return _mm_max_ps(_mm_sub_ps(_mm_setzero_ps(),
mValue),
mValue);
825#elif defined(JPH_USE_NEON)
827#elif defined(JPH_USE_RVV)
829 const vfloat32m1_t v = __riscv_vle32_v_f32m1(
mF32, 3);
830 const vfloat32m1_t rvv_abs = __riscv_vfsgnj_vf_f32m1(v, 1.0, 3);
831 __riscv_vse32_v_f32m1(res.
mF32, rvv_abs, 3);
851 return inA * inB - inC * inD;
857#if defined(JPH_USE_SSE)
858 Type t1 = _mm_shuffle_ps(inV2.
mValue, inV2.
mValue, _MM_SHUFFLE(0, 0, 2, 1));
859 t1 = _mm_mul_ps(t1,
mValue);
861 t2 = _mm_mul_ps(t2, inV2.
mValue);
862 Type t3 = _mm_sub_ps(t1, t2);
863 return _mm_shuffle_ps(t3, t3, _MM_SHUFFLE(0, 0, 2, 1));
864#elif defined(JPH_USE_NEON)
866 t1 = vmulq_f32(t1,
mValue);
868 t2 = vmulq_f32(t2, inV2.
mValue);
869 Type t3 = vsubq_f32(t1, t2);
870 return JPH_NEON_SHUFFLE_F32x4(t3, t3, 1, 2, 0, 0);
871#elif defined(JPH_USE_RVV)
872 const uint32 indices[3] = { 1, 2, 0 };
873 const vuint32m1_t gather_indices = __riscv_vle32_v_u32m1(indices, 3);
874 const vfloat32m1_t v0 = __riscv_vle32_v_f32m1(
mF32, 3);
875 const vfloat32m1_t v1 = __riscv_vle32_v_f32m1(inV2.
mF32, 3);
876 vfloat32m1_t t0 = __riscv_vrgather_vv_f32m1(v1, gather_indices, 3);
877 t0 = __riscv_vfmul_vv_f32m1(t0, v0, 3);
878 vfloat32m1_t t1 = __riscv_vrgather_vv_f32m1(v0, gather_indices, 3);
879 t1 = __riscv_vfmul_vv_f32m1(t1, v1, 3);
880 const vfloat32m1_t sub = __riscv_vfsub_vv_f32m1(t0, t1, 3);
881 const vfloat32m1_t cross = __riscv_vrgather_vv_f32m1(sub, gather_indices, 3);
884 __riscv_vse32_v_f32m1(cross_result.
mF32, cross, 3);
901#if defined(JPH_USE_SSE4_1)
902 #ifdef JPH_CROSS_PLATFORM_DETERMINISTIC
903 Type val = _mm_blend_ps(
mValue, _mm_setzero_ps(), 0x8);
904 Type shuf = _mm_movehdup_ps(val);
905 Type sums = _mm_add_ps(val, shuf);
906 shuf = _mm_movehl_ps(shuf, sums);
912 sums = _mm_add_ps(sums, shuf);
913 return _mm_cvtss_f32(sums);
914#elif defined(JPH_USE_NEON)
916 return vaddvq_f32(v);
917#elif defined(JPH_USE_RVV)
918 const vfloat32m1_t zeros = __riscv_vfmv_v_f_f32m1(0.0f, 3);
919 const vfloat32m1_t v = __riscv_vle32_v_f32m1(
mF32, 3);
920 const vfloat32m1_t sum = __riscv_vfredosum_vs_f32m1_f32m1(v, zeros, 3);
921 return __riscv_vfmv_f_s_f32m1_f32(sum);
923 #ifdef JPH_CROSS_PLATFORM_DETERMINISTIC
933 return (*
this * inV2).ReduceSum();
958#if defined(JPH_USE_SSE)
959 return _mm_sqrt_ps(
mValue);
960#elif defined(JPH_USE_NEON)
961 return vsqrtq_f32(
mValue);
962#elif defined(JPH_USE_RVV)
964 const vfloat32m1_t v = __riscv_vle32_v_f32m1(
mF32, 3);
965 const vfloat32m1_t rvv_sqrt = __riscv_vfsqrt_v_f32m1(v, 3);
966 __riscv_vse32_v_f32m1(res.
mF32, rvv_sqrt, 3);
980#if defined(JPH_USE_SSE4_1) && !defined(JPH_PLATFORM_WASM)
982 Type shuf = _mm_movehdup_ps(mul);
983 Type sums = _mm_add_ps(mul, shuf);
984 shuf = _mm_movehl_ps(mul, mul);
985 sums = _mm_add_ps(sums, shuf);
986 Type len_sq = _mm_shuffle_ps(sums, sums, _MM_SHUFFLE(0, 0, 0, 0));
990 Type is_zero = _mm_cmple_ps(len_sq, _mm_set1_ps(FLT_MIN));
991#ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
992 if (_mm_movemask_ps(is_zero) == 0xf)
995 return _mm_div_ps(
mValue, _mm_sqrt_ps(len_sq));
997 return _mm_blendv_ps(_mm_div_ps(
mValue, _mm_sqrt_ps(len_sq)), inZeroValue.
mValue, is_zero);
999#elif defined(JPH_USE_NEON)
1001 mul = vsetq_lane_f32(0, mul, 3);
1002 float32x4_t len_sq = vdupq_n_f32(vaddvq_f32(mul));
1003 uint32x4_t is_zero = vcleq_f32(len_sq, vdupq_n_f32(FLT_MIN));
1004 return vbslq_f32(is_zero, inZeroValue.
mValue, vdivq_f32(
mValue, vsqrtq_f32(len_sq)));
1005#elif defined(JPH_USE_RVV)
1006 const vfloat32m1_t src = __riscv_vle32_v_f32m1(
mF32, 3);
1007 const vfloat32m1_t zeros = __riscv_vfmv_v_f_f32m1(0.0f, 3);
1008 const vfloat32m1_t mul = __riscv_vfmul_vv_f32m1(src, src, 3);
1009 const vfloat32m1_t sum = __riscv_vfredosum_vs_f32m1_f32m1(mul, zeros, 3);
1010 const float dot = __riscv_vfmv_f_s_f32m1_f32(sum);
1014 const vfloat32m1_t splat = __riscv_vrgather_vx_f32m1(sum, 0, 3);
1015 const vfloat32m1_t length = __riscv_vfsqrt_v_f32m1(splat, 3);
1018 const vfloat32m1_t norm = __riscv_vfdiv_vv_f32m1(src, length, 3);
1019 __riscv_vse32_v_f32m1(v.
mF32, norm, 3);
1023 if (len_sq <= FLT_MIN)
1026 return *
this / JPH::Sqrt(len_sq);
1032 return abs(
LengthSq() - 1.0f) <= inTolerance;
1037#if defined(JPH_USE_AVX512)
1038 return (_mm_fpclass_ps_mask(
mValue, 0b10000001) & 0x7) != 0;
1039#elif defined(JPH_USE_SSE)
1040 return (_mm_movemask_ps(_mm_cmpunord_ps(
mValue,
mValue)) & 0x7) != 0;
1041#elif defined(JPH_USE_NEON)
1042 uint32x4_t mask = JPH_NEON_UINT32x4(1, 1, 1, 0);
1044 return vaddvq_u32(vandq_u32(is_equal, mask)) != 3;
1045#elif defined(JPH_USE_RVV)
1046 const vfloat32m1_t v = __riscv_vle32_v_f32m1(
mF32, 3);
1047 const vbool32_t mask = __riscv_vmfeq_vv_f32m1_b32(v, v, 3);
1048 const uint32 eq = __riscv_vcpop_m_b32(mask, 3);
1051 return isnan(
mF32[0]) || isnan(
mF32[1]) || isnan(
mF32[2]);
1057#if defined(JPH_USE_SSE)
1058 _mm_store_ss(&outV->
x,
mValue);
1060 _mm_store_ss(&outV->
y, t.
mValue);
1062 _mm_store_ss(&outV->
z, t.
mValue);
1063#elif defined(JPH_USE_NEON)
1064 float32x2_t
xy = vget_low_f32(
mValue);
1065 vst1_f32(&outV->
x,
xy);
1066 vst1q_lane_f32(&outV->
z,
mValue, 2);
1067#elif defined(JPH_USE_RVV)
1068 const vfloat32m1_t v = __riscv_vle32_v_f32m1(
mF32, 3);
1069 __riscv_vse32_v_f32m1(&outV->
x, v, 3);
1079#if defined(JPH_USE_SSE)
1080 return _mm_cvttps_epi32(
mValue);
1081#elif defined(JPH_USE_NEON)
1082 return vcvtq_u32_f32(
mValue);
1083#elif defined(JPH_USE_RVV)
1085 const vfloat32m1_t v = __riscv_vle32_v_f32m1(
mF32, 4);
1086 const vuint32m1_t cast = __riscv_vfcvt_rtz_xu_f_v_u32m1(v, 4);
1087 __riscv_vse32_v_u32m1(res.
mU32, cast, 4);
1096#if defined(JPH_USE_SSE)
1098#elif defined(JPH_USE_NEON)
1099 return vreinterpretq_u32_f32(
mValue);
1101 return *
reinterpret_cast<const UVec4 *
>(
this);
1121#if defined(JPH_USE_SSE)
1125 __m128 zero = _mm_setzero_ps();
1126 __m128 neg = _mm_sub_ps(zero,
mValue);
1127 __m128 perp_x = _mm_shuffle_ps(_mm_unpackhi_ps(
mValue, zero), neg, _MM_SHUFFLE(0, 0, 1, 0));
1128 __m128 perp_y = _mm_shuffle_ps(_mm_unpackhi_ps(zero,
mValue), neg, _MM_SHUFFLE(1, 1, 1, 0));
1132 __m128 xx = _mm_shuffle_ps(sq, sq, _MM_SHUFFLE(0, 0, 0, 0));
1133 __m128 yy = _mm_shuffle_ps(sq, sq, _MM_SHUFFLE(1, 1, 1, 1));
1134 __m128 zz = _mm_shuffle_ps(sq, sq, _MM_SHUFFLE(2, 2, 2, 2));
1135 __m128 x_gt_y = _mm_cmpgt_ps(xx, yy);
1138#if defined(JPH_USE_SSE4_1) && !defined(JPH_PLATFORM_WASM)
1139 __m128 result = _mm_blendv_ps(perp_y, perp_x, x_gt_y);
1141 __m128 result = _mm_or_ps(_mm_and_ps(x_gt_y, perp_x), _mm_andnot_ps(x_gt_y, perp_y));
1145 __m128 len = _mm_sqrt_ps(_mm_add_ps(_mm_max_ps(xx, yy), zz));
1146 return _mm_div_ps(result, len);
1149 float xx = x * x, yy = y * y, zz = z * z;
1150#ifdef JPH_CROSS_PLATFORM_DETERMINISTIC
1151 Vec3 perp_x(z, 0.0f, 0.0f - x);
1152 Vec3 perp_y(0.0f, z, 0.0f - y);
1154 Vec3 perp_x(z, 0.0f, -x);
1155 Vec3 perp_y(0.0f, z, -y);
1157 return (xx > yy ? perp_x : perp_y) / JPH::Sqrt(max(xx, yy) + zz);
1163#if defined(JPH_USE_AVX512)
1164 Type one = _mm_set1_ps(1.0f);
1165 return _mm_or_ps(_mm_fixupimm_ps(
mValue,
mValue, _mm_set1_epi32(0xA9A90100), 0), one);
1166#elif defined(JPH_USE_SSE)
1167 Type minus_one = _mm_set1_ps(-1.0f);
1168 Type one = _mm_set1_ps(1.0f);
1169 return _mm_or_ps(_mm_and_ps(
mValue, minus_one), one);
1170#elif defined(JPH_USE_NEON)
1171 Type minus_one = vdupq_n_f32(-1.0f);
1172 Type one = vdupq_n_f32(1.0f);
1173 return vreinterpretq_f32_u32(vorrq_u32(vandq_u32(vreinterpretq_u32_f32(
mValue), vreinterpretq_u32_f32(minus_one)), vreinterpretq_u32_f32(one)));
1174#elif defined(JPH_USE_RVV)
1176 const vfloat32m1_t rvv_in = __riscv_vle32_v_f32m1(
mF32, 3);
1177 const vfloat32m1_t rvv_one = __riscv_vfmv_v_f_f32m1(1.0, 3);
1178 const vfloat32m1_t rvv_signs = __riscv_vfsgnj_vv_f32m1(rvv_one, rvv_in, 3);
1179 __riscv_vse32_v_f32m1(res.
mF32, rvv_signs, 3);
1182 return Vec3(std::signbit(
mF32[0])? -1.0f : 1.0f,
1183 std::signbit(
mF32[1])? -1.0f : 1.0f,
1184 std::signbit(
mF32[2])? -1.0f : 1.0f);
1188template <
int X,
int Y,
int Z>
1191 static_assert(X == 1 || X == -1,
"X must be 1 or -1");
1192 static_assert(Y == 1 || Y == -1,
"Y must be 1 or -1");
1193 static_assert(Z == 1 || Z == -1,
"Z must be 1 or -1");
1194 return Vec3::sXor(*
this,
Vec3(X > 0? 0.0f : -0.0f, Y > 0? 0.0f : -0.0f, Z > 0? 0.0f : -0.0f));
1199 constexpr float cOneOverSqrt2 = 0.70710678f;
1200 constexpr uint cNumBits = 14;
1201 constexpr uint cMask = (1 << cNumBits) - 1;
1202 constexpr uint cMaxValue = cMask - 1;
1203 constexpr float cScale = float(cMaxValue) / (2.0f * cOneOverSqrt2);
1209 if (v[max_element] < 0.0f)
1211 value = 0x80000000u;
1216 value |= max_element << 29;
1220 switch (max_element)
1231 value |= compressed.
GetX();
1232 value |= compressed.
GetY() << cNumBits;
1238 constexpr float cOneOverSqrt2 = 0.70710678f;
1239 constexpr uint cNumBits = 14;
1240 constexpr uint cMask = (1u << cNumBits) - 1;
1241 constexpr uint cMaxValue = cMask - 1;
1242 constexpr int cHalfMaxValue = int(cMaxValue >> 1);
1243 constexpr float cScale = 2.0f * cOneOverSqrt2 / float(cMaxValue);
1246 Vec3 v =
Vec3(
float(
int(inValue & cMask) - cHalfMaxValue),
float(
int((inValue >> cNumBits) & cMask) - cHalfMaxValue), 0) * cScale;
1253 if ((inValue & 0x80000000u) != 0)
1257 switch ((inValue >> 29) & 3)
#define JPH_SUPPRESS_WARNINGS_STD_BEGIN
Definition Core.h:439
#define JPH_SUPPRESS_WARNINGS_STD_END
Definition Core.h:452
std::uint64_t uint64
Definition Core.h:515
unsigned int uint
Definition Core.h:510
#define JPH_NAMESPACE_END
Definition Core.h:434
std::uint32_t uint32
Definition Core.h:513
#define JPH_NAMESPACE_BEGIN
Definition Core.h:428
#define xy
Definition HLSLToCPP.h:511
#define JPH_MAKE_HASHABLE(type,...)
Definition HashCombine.h:223
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
JPH_INLINE constexpr T Square(T inV)
Square a value.
Definition Math.h:70
JPH_INLINE constexpr To BitCast(const From &inValue)
Simple implementation of C++20 std::bit_cast.
Definition Math.h:239
@ SWIZZLE_Z
Use the Z component.
Definition Swizzle.h:14
@ SWIZZLE_X
Use the X component.
Definition Swizzle.h:12
@ SWIZZLE_UNUSED
We always use the Z component when we don't specifically want to initialize a value,...
Definition Swizzle.h:16
@ SWIZZLE_Y
Use the Y component.
Definition Swizzle.h:13
Vec3 operator*(float inV1, Vec3Arg inV2)
Definition Vec3.inl:535
Class that holds 3 floats. Used as a storage class. Convert to Vec3 for calculations.
Definition Float3.h:13
float y
Definition Float3.h:39
float z
Definition Float3.h:40
float x
Definition Float3.h:38
JPH_INLINE UVec4 Swizzle() const
Swizzle the elements in inV.
JPH_INLINE uint32 GetY() const
Definition UVec4.h:103
static JPH_INLINE UVec4 sAnd(UVec4Arg inV1, UVec4Arg inV2)
Logical and (component wise)
Definition UVec4.inl:292
static JPH_INLINE UVec4 sOr(UVec4Arg inV1, UVec4Arg inV2)
Logical or (component wise)
Definition UVec4.inl:250
JPH_INLINE bool TestAllXYZTrue() const
Test if X, Y and Z components are true (true is when highest bit of component is set)
Definition UVec4.inl:663
Type mValue
Definition UVec4.h:223
JPH_INLINE uint32 GetX() const
Get individual components.
Definition UVec4.h:102
static JPH_INLINE UVec4 sXor(UVec4Arg inV1, UVec4Arg inV2)
Logical xor (component wise)
Definition UVec4.inl:271
JPH_INLINE Vec4 ReinterpretAsFloat() const
Reinterpret UVec4 as a Vec4 (doesn't change the bits)
Definition UVec4.inl:527
uint32 mU32[4]
Definition UVec4.h:224
JPH_INLINE bool IsClose(Vec3Arg inV2, float inMaxDistSq=1.0e-12f) const
Test if two vectors are close.
Definition Vec3.inl:490
static JPH_INLINE Vec3 sMax(Vec3Arg inV1, Vec3Arg inV2)
Return the maximum of each of the components.
Definition Vec3.inl:203
JPH_INLINE float Dot(Vec3Arg inV2) const
Dot product.
Definition Vec3.inl:931
JPH_INLINE Vec3 Normalized() const
Normalize vector.
Definition Vec3.inl:973
static JPH_INLINE Type sFixW(Type inValue)
Internal helper function that ensures that the Z component is replicated to the W component to preven...
Vec4::Type Type
Definition Vec3.h:27
JPH_INLINE bool operator==(Vec3Arg inV2) const
Comparison.
Definition Vec3.inl:485
JPH_INLINE Vec4 SplatX() const
Replicate the X component to all components.
Definition Vec3.inl:761
static JPH_INLINE Vec3 sMin(Vec3Arg inV1, Vec3Arg inV2)
Return the minimum value of each of the components.
Definition Vec3.inl:183
JPH_INLINE Vec3 Cross(Vec3Arg inV2) const
Cross product.
Definition Vec3.inl:855
JPH_INLINE Vec3 GetNormalizedPerpendicular() const
Get normalized vector that is perpendicular to this vector.
Definition Vec3.inl:1119
static Vec3 sRandom(Random &inRandom)
Get random unit vector.
Definition Vec3.inl:473
JPH_INLINE float GetX() const
Get individual components.
Definition Vec3.h:127
JPH_INLINE bool IsNormalized(float inTolerance=1.0e-6f) const
Test if vector is normalized.
Definition Vec3.inl:1030
static JPH_INLINE Vec3 sXor(Vec3Arg inV1, Vec3Arg inV2)
Logical xor (component wise)
Definition Vec3.inl:429
static JPH_INLINE Vec3 sDecompressUnitVector(uint32 inValue)
Decompress a unit vector from a 32 bit value.
Definition Vec3.inl:1236
JPH_INLINE float Length() const
Length of vector.
Definition Vec3.inl:951
static JPH_INLINE UVec4 sGreaterOrEqual(Vec3Arg inV1, Vec3Arg inV2)
Greater than or equal (component wise)
Definition Vec3.inl:328
JPH_INLINE float ReduceMin() const
Get the minimum of X, Y and Z.
Definition Vec3.inl:1105
JPH_INLINE Vec3 & operator-=(Vec3Arg inV2)
Subtract two float vectors (component wise)
Definition Vec3.inl:721
JPH_INLINE float ReduceMax() const
Get the maximum of X, Y and Z.
Definition Vec3.inl:1112
static JPH_INLINE Vec3 sDifferenceOfProducts(Vec3Arg inA, Vec3Arg inB, Vec3Arg inC, Vec3Arg inD)
Calculates inA * inB - inC * inD with more precision when FMA instructions are available....
Definition Vec3.inl:843
static JPH_INLINE UVec4 sLessOrEqual(Vec3Arg inV1, Vec3Arg inV2)
Less than or equal (component wise)
Definition Vec3.inl:278
JPH_INLINE Vec3 operator/(float inV2) const
Divide vector by float.
Definition Vec3.inl:552
friend JPH_INLINE Vec3 operator*(float inV1, Vec3Arg inV2)
Multiply vector with float.
Definition Vec3.inl:535
JPH_INLINE int GetLowestComponentIndex() const
Get index of component with lowest value.
Definition Vec3.inl:809
JPH_INLINE Vec3 & operator/=(float inV2)
Divide vector by float.
Definition Vec3.inl:610
JPH_INLINE Vec4 DotV4(Vec3Arg inV2) const
Dot product, returns the dot product in X, Y, Z and W components.
Definition Vec3.inl:941
JPH_INLINE Vec3 Abs() const
Return the absolute value of each of the components.
Definition Vec3.inl:819
static JPH_INLINE Vec3 sOne()
Vector with all ones.
Definition Vec3.inl:157
JPH_INLINE Vec3 Reciprocal() const
Reciprocal vector (1 / value) for each of the components.
Definition Vec3.inl:838
JPH_INLINE Vec3 NormalizedOr(Vec3Arg inZeroValue) const
Normalize vector or return inZeroValue if the length of the vector is zero.
Definition Vec3.inl:978
JPH_INLINE Vec3 FlipSign() const
Flips the signs of the components, e.g. FlipSign<-1, 1, -1>() will flip the signs of the X and Z comp...
Definition Vec3.inl:1189
JPH_INLINE Vec3 operator+(Vec3Arg inV2) const
Add two float vectors (component wise)
Definition Vec3.inl:630
JPH_INLINE float ReduceSum() const
Get the sum of X, Y and Z.
Definition Vec3.inl:898
JPH_INLINE uint32 CompressUnitVector() const
Compress a unit vector to a 32 bit value, precision is around 10^-4.
Definition Vec3.inl:1197
JPH_INLINE Vec4 SplatZ() const
Replicate the Z component to all components.
Definition Vec3.inl:793
JPH_INLINE Vec3 CrossPrecise(Vec3Arg inV2) const
Cross product (more precise version when FMA is available)
Definition Vec3.inl:893
static JPH_INLINE Vec3 sOr(Vec3Arg inV1, Vec3Arg inV2)
Logical or (component wise)
Definition Vec3.inl:411
static JPH_INLINE UVec4 sGreater(Vec3Arg inV1, Vec3Arg inV2)
Greater than (component wise)
Definition Vec3.inl:303
JPH_INLINE void SetZ(float inZ)
Definition Vec3.h:135
static JPH_INLINE Vec3 sAnd(Vec3Arg inV1, Vec3Arg inV2)
Logical and (component wise)
Definition Vec3.inl:447
JPH_INLINE void CheckW() const
Internal helper function that checks that W is equal to Z, so e.g. dividing by it should not generate...
static JPH_INLINE Vec3 sUnitSpherical(float inTheta, float inPhi)
Definition Vec3.inl:465
JPH_INLINE UVec4 ToInt() const
Convert each component from a float to an int.
Definition Vec3.inl:1077
Type mValue
Definition Vec3.h:308
JPH_INLINE float GetY() const
Definition Vec3.h:128
JPH_INLINE Vec4 SplatY() const
Replicate the Y component to all components.
Definition Vec3.inl:777
JPH_INLINE Vec3 operator-() const
Negate.
Definition Vec3.inl:669
JPH_INLINE void StoreFloat3(Float3 *outV) const
Store 3 floats to memory.
Definition Vec3.inl:1055
JPH_INLINE float LengthSq() const
Squared length of vector.
Definition Vec3.inl:946
float mF32[4]
Definition Vec3.h:309
static JPH_INLINE UVec4 sEquals(Vec3Arg inV1, Vec3Arg inV2)
Equals (component wise)
Definition Vec3.inl:228
JPH_INLINE bool IsNearZero(float inMaxDistSq=1.0e-12f) const
Test if vector is near zero.
Definition Vec3.inl:495
static JPH_INLINE Vec3 sZero()
Vector with all zeros.
Definition Vec3.inl:125
static JPH_INLINE UVec4 sLess(Vec3Arg inV1, Vec3Arg inV2)
Less than (component wise)
Definition Vec3.inl:253
static JPH_INLINE Vec3 sReplicate(float inV)
Replicate inV across all components.
Definition Vec3.inl:141
static JPH_INLINE Vec3 sClamp(Vec3Arg inV, Vec3Arg inMin, Vec3Arg inMax)
Clamp a vector between min and max (component wise)
Definition Vec3.inl:223
JPH_INLINE Vec3 & operator*=(float inV2)
Multiply vector with float.
Definition Vec3.inl:569
JPH_INLINE Vec3 & operator+=(Vec3Arg inV2)
Add two float vectors (component wise)
Definition Vec3.inl:648
static JPH_INLINE Vec3 sSelect(Vec3Arg inNotSet, Vec3Arg inSet, UVec4Arg inControl)
Component wise select, returns inNotSet when highest bit of inControl = 0 and inSet when highest bit ...
Definition Vec3.inl:376
JPH_INLINE bool IsNaN() const
Test if vector contains NaN elements.
Definition Vec3.inl:1035
JPH_INLINE Vec3 Sqrt() const
Component wise square root.
Definition Vec3.inl:956
JPH_INLINE UVec4 ReinterpretAsInt() const
Reinterpret Vec3 as a UVec4 (doesn't change the bits)
Definition Vec3.inl:1094
JPH_INLINE Vec3 DotV(Vec3Arg inV2) const
Dot product, returns the dot product in X, Y and Z components.
Definition Vec3.inl:936
static JPH_INLINE Vec3 sLoadFloat3Unsafe(const Float3 &inV)
Load 3 floats from memory (reads 32 bits extra which it doesn't use)
Definition Vec3.inl:167
JPH_INLINE float GetZ() const
Definition Vec3.h:129
JPH_INLINE Vec3 GetSign() const
Get vector that contains the sign of each element (returns 1.0f if positive, -1.0f if negative)
Definition Vec3.inl:1161
static JPH_INLINE Vec3 sNaN()
Vector with all NaN's.
Definition Vec3.inl:162
Vec3()=default
Constructor.
JPH_INLINE int GetHighestComponentIndex() const
Get index of component with highest value.
Definition Vec3.inl:814
static JPH_INLINE Vec3 sFusedMultiplyAdd(Vec3Arg inMul1, Vec3Arg inMul2, Vec3Arg inAdd)
Calculates inMul1 * inMul2 + inAdd.
Definition Vec3.inl:353
JPH_INLINE Vec3 Swizzle() const
Swizzle the elements in inV.
float mF32[4]
Definition Vec4.h:318
JPH_INLINE float GetX() const
Get individual components.
Definition Vec4.h:119
JPH_INLINE float GetY() const
Definition Vec4.h:120
static JPH_INLINE Vec4 sReplicate(float inV)
Replicate inV across all components.
Definition Vec4.inl:97
void SinCos(Vec4 &outSin, Vec4 &outCos) const
Calculate the sine and cosine for each element of this vector (input in radians)
Definition Vec4.inl:1171