From ef6134263e852363d8f412d55f5cd63c88caad48 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Wed, 28 Nov 2018 14:48:12 +0300 Subject: [PATCH] vec: improve angle between two vector * because `acosf()` may return NaN if cosine/dot is out of range --- include/cglm/vec3.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/include/cglm/vec3.h b/include/cglm/vec3.h index 4534969..5dfe612 100644 --- a/include/cglm/vec3.h +++ b/include/cglm/vec3.h @@ -548,11 +548,18 @@ glm_vec_normalize_to(vec3 vec, vec3 dest) { CGLM_INLINE float glm_vec_angle(vec3 v1, vec3 v2) { - float norm; + float norm, dot; /* maybe compiler generate approximation instruction (rcp) */ norm = 1.0f / (glm_vec_norm(v1) * glm_vec_norm(v2)); - return acosf(glm_vec_dot(v1, v2) * norm); + dot = glm_vec_dot(v1, v2) * norm; + + if (dot > 1.0f) + return 0.0f; + else if (dot < -1.0f) + return CGLM_PI; + + return acosf(dot); } /*!