mirror of
https://github.com/recp/cglm.git
synced 2025-10-03 16:51:35 +00:00
normalize: norm == 0.0f to norm < FLT_EPSILON, improving handling of very small vectors to prevent instability and overflow
This commit is contained in:
@@ -37,6 +37,14 @@
|
||||
# define CGLM_INLINE static inline __attribute((always_inline))
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__) || defined(__clang__)
|
||||
# define CGLM_UNLIKELY(expr) __builtin_expect(!!(expr), 0)
|
||||
# define CGLM_LIKELY(expr) __builtin_expect(!!(expr), 1)
|
||||
#else
|
||||
# define CGLM_UNLIKELY(expr) (expr)
|
||||
# define CGLM_LIKELY(expr) (expr)
|
||||
#endif
|
||||
|
||||
#define GLM_SHUFFLE4(z, y, x, w) (((z) << 6) | ((y) << 4) | ((x) << 2) | (w))
|
||||
#define GLM_SHUFFLE3(z, y, x) (((z) << 4) | ((y) << 2) | (x))
|
||||
|
||||
|
@@ -33,7 +33,7 @@ void
|
||||
glm_plane_normalize(vec4 plane) {
|
||||
float norm;
|
||||
|
||||
if ((norm = glm_vec3_norm(plane)) == 0.0f) {
|
||||
if (CGLM_UNLIKELY((norm = glm_vec3_norm(plane)) < FLT_EPSILON)) {
|
||||
glm_vec4_zero(plane);
|
||||
return;
|
||||
}
|
||||
|
@@ -278,7 +278,7 @@ glm_vec2_scale_as(vec2 v, float s, vec2 dest) {
|
||||
float norm;
|
||||
norm = glm_vec2_norm(v);
|
||||
|
||||
if (norm == 0.0f) {
|
||||
if (CGLM_UNLIKELY(norm < FLT_EPSILON)) {
|
||||
glm_vec2_zero(dest);
|
||||
return;
|
||||
}
|
||||
@@ -542,7 +542,7 @@ glm_vec2_normalize(vec2 v) {
|
||||
|
||||
norm = glm_vec2_norm(v);
|
||||
|
||||
if (norm == 0.0f) {
|
||||
if (CGLM_UNLIKELY(norm < FLT_EPSILON)) {
|
||||
v[0] = v[1] = 0.0f;
|
||||
return;
|
||||
}
|
||||
@@ -563,7 +563,7 @@ glm_vec2_normalize_to(vec2 v, vec2 dest) {
|
||||
|
||||
norm = glm_vec2_norm(v);
|
||||
|
||||
if (norm == 0.0f) {
|
||||
if (CGLM_UNLIKELY(norm < FLT_EPSILON)) {
|
||||
glm_vec2_zero(dest);
|
||||
return;
|
||||
}
|
||||
|
@@ -372,7 +372,7 @@ glm_vec3_scale_as(vec3 v, float s, vec3 dest) {
|
||||
float norm;
|
||||
norm = glm_vec3_norm(v);
|
||||
|
||||
if (norm == 0.0f) {
|
||||
if (CGLM_UNLIKELY(norm < FLT_EPSILON)) {
|
||||
glm_vec3_zero(dest);
|
||||
return;
|
||||
}
|
||||
@@ -651,7 +651,7 @@ glm_vec3_normalize(vec3 v) {
|
||||
|
||||
norm = glm_vec3_norm(v);
|
||||
|
||||
if (norm == 0.0f) {
|
||||
if (CGLM_UNLIKELY(norm < FLT_EPSILON)) {
|
||||
v[0] = v[1] = v[2] = 0.0f;
|
||||
return;
|
||||
}
|
||||
@@ -672,7 +672,7 @@ glm_vec3_normalize_to(vec3 v, vec3 dest) {
|
||||
|
||||
norm = glm_vec3_norm(v);
|
||||
|
||||
if (norm == 0.0f) {
|
||||
if (CGLM_UNLIKELY(norm < FLT_EPSILON)) {
|
||||
glm_vec3_zero(dest);
|
||||
return;
|
||||
}
|
||||
|
@@ -487,7 +487,7 @@ glm_vec4_scale_as(vec4 v, float s, vec4 dest) {
|
||||
float norm;
|
||||
norm = glm_vec4_norm(v);
|
||||
|
||||
if (norm == 0.0f) {
|
||||
if (CGLM_UNLIKELY(norm < FLT_EPSILON)) {
|
||||
glm_vec4_zero(dest);
|
||||
return;
|
||||
}
|
||||
@@ -918,7 +918,7 @@ glm_vec4_normalize_to(vec4 v, vec4 dest) {
|
||||
/* dot = _mm_cvtss_f32(xdot); */
|
||||
dot = wasm_f32x4_extract_lane(xdot, 0);
|
||||
|
||||
if (dot == 0.0f) {
|
||||
if (CGLM_UNLIKELY(dot < FLT_EPSILON)) {
|
||||
glmm_store(dest, wasm_f32x4_const_splat(0.f));
|
||||
return;
|
||||
}
|
||||
@@ -932,7 +932,7 @@ glm_vec4_normalize_to(vec4 v, vec4 dest) {
|
||||
xdot = glmm_vdot(x0, x0);
|
||||
dot = _mm_cvtss_f32(xdot);
|
||||
|
||||
if (dot == 0.0f) {
|
||||
if (CGLM_UNLIKELY(dot < FLT_EPSILON)) {
|
||||
glmm_store(dest, _mm_setzero_ps());
|
||||
return;
|
||||
}
|
||||
@@ -943,7 +943,7 @@ glm_vec4_normalize_to(vec4 v, vec4 dest) {
|
||||
|
||||
norm = glm_vec4_norm(v);
|
||||
|
||||
if (norm == 0.0f) {
|
||||
if (CGLM_UNLIKELY(norm < FLT_EPSILON)) {
|
||||
glm_vec4_zero(dest);
|
||||
return;
|
||||
}
|
||||
|
Reference in New Issue
Block a user