mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-14 16:14:38 +00:00
add normal safety
wrap safety around normal checks, this was done on the scalar math may as well do it here just in case. Ad the impl.inl files to libraries so they can actually be found.
This commit is contained in:
parent
5a6467d54a
commit
8c1acbd1da
7 changed files with 61 additions and 14 deletions
|
|
@ -85,9 +85,8 @@ namespace math_backend::float3
|
||||||
inline void float3_normalize_impl(float* a)
|
inline void float3_normalize_impl(float* a)
|
||||||
{
|
{
|
||||||
f32x4 va = v_load3_vec(a);
|
f32x4 va = v_load3_vec(a);
|
||||||
f32x4 invLen = v_rsqrt_nr(v_dot3(va, va)); // fully abstracted
|
f32x4 vr = v_normalize3(va);
|
||||||
f32x4 vnorm = v_mul(va, invLen);
|
v_store3(a, vr);
|
||||||
v_store3(a, vnorm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normalize with magnitude: r = normalize(a) * r
|
// Normalize with magnitude: r = normalize(a) * r
|
||||||
|
|
|
||||||
|
|
@ -183,8 +183,15 @@ namespace
|
||||||
|
|
||||||
inline f32x4 v_normalize3(f32x4 v)
|
inline f32x4 v_normalize3(f32x4 v)
|
||||||
{
|
{
|
||||||
f32x4 inv = v_rsqrt_nr(v_dot3(v, v));
|
const f32x4 zero = _mm_setzero_ps();
|
||||||
return _mm_mul_ps(v, inv);
|
const f32x4 fallback = _mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f); // {0,0,1,0}
|
||||||
|
f32x4 dot = v_dot3(v, v);
|
||||||
|
|
||||||
|
f32x4 inv = v_rsqrt_nr(dot);
|
||||||
|
f32x4 isZero = _mm_cmpeq_ps(dot, zero);
|
||||||
|
f32x4 norm = _mm_mul_ps(v, inv);
|
||||||
|
|
||||||
|
return _mm_blendv_ps(norm, fallback, isZero);
|
||||||
}
|
}
|
||||||
|
|
||||||
// adds all 4 lanes together.
|
// adds all 4 lanes together.
|
||||||
|
|
|
||||||
|
|
@ -183,8 +183,15 @@ namespace
|
||||||
|
|
||||||
inline f32x4 v_normalize3(f32x4 v)
|
inline f32x4 v_normalize3(f32x4 v)
|
||||||
{
|
{
|
||||||
f32x4 inv = v_rsqrt_nr(v_dot3(v, v));
|
const f32x4 zero = _mm_setzero_ps();
|
||||||
return _mm_mul_ps(v, inv);
|
const f32x4 fallback = _mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f); // {0,0,1,0}
|
||||||
|
f32x4 dot = v_dot3(v, v);
|
||||||
|
|
||||||
|
f32x4 inv = v_rsqrt_nr(dot);
|
||||||
|
f32x4 isZero = _mm_cmpeq_ps(dot, zero);
|
||||||
|
f32x4 norm = _mm_mul_ps(v, inv);
|
||||||
|
|
||||||
|
return _mm_blendv_ps(norm, fallback, isZero);
|
||||||
}
|
}
|
||||||
|
|
||||||
// adds all 4 lanes together.
|
// adds all 4 lanes together.
|
||||||
|
|
|
||||||
|
|
@ -205,8 +205,19 @@ namespace
|
||||||
|
|
||||||
inline f32x4 v_normalize3(f32x4 v)
|
inline f32x4 v_normalize3(f32x4 v)
|
||||||
{
|
{
|
||||||
f32x4 inv = v_rsqrt_nr(v_dot3(v,v));
|
const float32x4_t zero = vdupq_n_f32(0.0f);
|
||||||
return vmulq_f32(v, inv);
|
const float32x4_t fallback = {0.0f, 0.0f, 1.0f, 0.0f};
|
||||||
|
|
||||||
|
f32x4 dot = v_dot3(v, v);
|
||||||
|
|
||||||
|
// dot == 0?
|
||||||
|
uint32x4_t isZero = vceqq_f32(dot, zero);
|
||||||
|
|
||||||
|
f32x4 inv = v_rsqrt_nr(dot);
|
||||||
|
f32x4 norm = vmulq_f32(v, inv);
|
||||||
|
|
||||||
|
// Select fallback when zero
|
||||||
|
return vbslq_f32(isZero, fallback, norm);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline f32x4 v_hadd4(f32x4 a)
|
inline f32x4 v_hadd4(f32x4 a)
|
||||||
|
|
|
||||||
|
|
@ -216,8 +216,22 @@ namespace
|
||||||
|
|
||||||
inline f32x4 v_normalize3(f32x4 v)
|
inline f32x4 v_normalize3(f32x4 v)
|
||||||
{
|
{
|
||||||
f32x4 inv = v_rsqrt_nr(v_dot3(v, v));
|
const f32x4 zero = _mm_setzero_ps();
|
||||||
return _mm_mul_ps(v, inv);
|
const f32x4 fallback = _mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f); // {0,0,1,0}
|
||||||
|
f32x4 dot = v_dot3(v, v);
|
||||||
|
|
||||||
|
f32x4 inv = v_rsqrt_nr(dot);
|
||||||
|
f32x4 isZero = _mm_cmpeq_ps(dot, zero);
|
||||||
|
|
||||||
|
f32x4 norm = _mm_mul_ps(v, inv);
|
||||||
|
|
||||||
|
// vbsl equivalent
|
||||||
|
f32x4 result = _mm_or_ps(
|
||||||
|
_mm_and_ps(isZero, fallback),
|
||||||
|
_mm_andnot_ps(isZero, norm)
|
||||||
|
);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// adds all 4 lanes together.
|
// adds all 4 lanes together.
|
||||||
|
|
|
||||||
|
|
@ -195,8 +195,15 @@ namespace
|
||||||
|
|
||||||
inline f32x4 v_normalize3(f32x4 v)
|
inline f32x4 v_normalize3(f32x4 v)
|
||||||
{
|
{
|
||||||
f32x4 inv = v_rsqrt_nr(v_dot3(v, v));
|
const f32x4 zero = _mm_setzero_ps();
|
||||||
return _mm_mul_ps(v, inv);
|
const f32x4 fallback = _mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f); // {0,0,1,0}
|
||||||
|
f32x4 dot = v_dot3(v, v);
|
||||||
|
|
||||||
|
f32x4 inv = v_rsqrt_nr(dot);
|
||||||
|
f32x4 isZero = _mm_cmpeq_ps(dot, zero);
|
||||||
|
f32x4 norm = _mm_mul_ps(v, inv);
|
||||||
|
|
||||||
|
return _mm_blendv_ps(norm, fallback, isZero);
|
||||||
}
|
}
|
||||||
|
|
||||||
// adds all 4 lanes together.
|
// adds all 4 lanes together.
|
||||||
|
|
|
||||||
|
|
@ -142,7 +142,9 @@ function(add_math_backend name compile_defs)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(math_${name} OBJECT ${SRC})
|
file(GLOB_RECURSE INL CONFIGURE_DEPENDS "math/impl/*.inl")
|
||||||
|
|
||||||
|
add_library(math_${name} OBJECT ${SRC} ${INL})
|
||||||
|
|
||||||
message(STATUS "adding math library for isa ${name}")
|
message(STATUS "adding math library for isa ${name}")
|
||||||
target_include_directories(math_${name} PUBLIC
|
target_include_directories(math_${name} PUBLIC
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue