diff --git a/include/call/cglmc-vec.h b/include/call/cglmc-vec.h index 33c787e..6768658 100644 --- a/include/call/cglmc-vec.h +++ b/include/call/cglmc-vec.h @@ -117,6 +117,14 @@ CGLM_EXPORT void glmc_vec_proj(vec3 a, vec3 b, vec3 dest); +CGLM_EXPORT +float +glmc_vec_distance(vec3 v1, vec3 v2); + +CGLM_EXPORT +float +glmc_vec4_distance(vec4 v1, vec4 v2); + #ifdef __cplusplus } #endif diff --git a/include/cglm-util.h b/include/cglm-util.h index b2f28a6..7633b7f 100644 --- a/include/cglm-util.h +++ b/include/cglm-util.h @@ -45,4 +45,10 @@ glm_make_deg(float *rad) { *rad = *rad * 180.0f / CGLM_PI; } +CGLM_INLINE +float +glm_pow2(float x) { + return x * x; +} + #endif /* cglm_util_h */ diff --git a/include/cglm-vec.h b/include/cglm-vec.h index be706a6..c0ff7b9 100644 --- a/include/cglm-vec.h +++ b/include/cglm-vec.h @@ -16,6 +16,7 @@ #include "cglm-common.h" #include "cglm-vec-ext.h" #include "arch/simd/cglm-intrin.h" +#include "cglm-util.h" /*! * @brief copy all members of [a] to [dest] @@ -493,4 +494,21 @@ glm_vec_proj(vec3 a, vec3 b, vec3 dest) { dest); } +CGLM_INLINE +float +glm_vec_distance(vec3 v1, vec3 v2) { + return sqrtf(glm_pow2(v2[0] - v1[0]) + + glm_pow2(v2[1] - v1[1]) + + glm_pow2(v2[2] - v1[2])); +} + +CGLM_INLINE +float +glm_vec4_distance(vec4 v1, vec4 v2) { + return sqrtf(glm_pow2(v2[0] - v1[0]) + + glm_pow2(v2[1] - v1[1]) + + glm_pow2(v2[2] - v1[2]) + + glm_pow2(v2[3] - v1[3])); +} + #endif /* cglm_vec_h */ diff --git a/src/cglm-vec.c b/src/cglm-vec.c index 530b482..ad854c9 100644 --- a/src/cglm-vec.c +++ b/src/cglm-vec.c @@ -162,3 +162,15 @@ void glmc_vec_proj(vec3 a, vec3 b, vec3 dest) { glm_vec_proj(a, b, dest); } + +CGLM_EXPORT +float +glmc_vec_distance(vec3 v1, vec3 v2) { + return glm_vec_distance(v1, v2); +} + +CGLM_EXPORT +float +glmc_vec4_distance(vec4 v1, vec4 v2) { + return glm_vec4_distance(v1, v2); +}