diff --git a/include/call/cglmc-vec.h b/include/call/cglmc-vec.h index f358d51..5d9ce0d 100644 --- a/include/call/cglmc-vec.h +++ b/include/call/cglmc-vec.h @@ -94,6 +94,18 @@ CGLM_EXPORT void glmc_vec_scale(vec3 v, float s, vec3 dest); +CGLM_EXPORT +void +glmc_vec4_scale(vec4 v, float s, vec4 dest); + +CGLM_EXPORT +void +glmc_vec_scale_as(vec3 v, float s, vec3 dest); + +CGLM_EXPORT +void +glmc_vec4_scale_as(vec3 v, float s, vec3 dest); + CGLM_EXPORT void glmc_vec_flipsign(vec3 v); @@ -102,10 +114,6 @@ CGLM_EXPORT void glmc_vec4_flipsign(vec4 v); -CGLM_EXPORT -void -glmc_vec4_scale(vec4 v, float s, vec4 dest); - CGLM_EXPORT float glmc_vec_angle(vec3 v1, vec3 v2) diff --git a/include/cglm-vec.h b/include/cglm-vec.h index 9b8b746..0c02c71 100644 --- a/include/cglm-vec.h +++ b/include/cglm-vec.h @@ -249,7 +249,7 @@ glm_vec4_sub(vec4 v1, vec4 v2, vec4 dest) { } /*! - * @brief multiply vec3 vector with scalar + * @brief multiply/scale vec3 vector with scalar: result = v * s * * @param[in] v vector * @param[in] s scalar @@ -263,6 +263,70 @@ glm_vec_scale(vec3 v, float s, vec3 dest) { dest[2] = v[2] * s; } +/*! + * @brief multiply/scale vec4 vector with scalar: result = v * s + * + * @param[in] v vector + * @param[in] s scalar + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec4_scale(vec4 v, float s, vec4 dest) { +#if defined( __SSE__ ) || defined( __SSE2__ ) + _mm_store_ps(dest, + _mm_mul_ps(_mm_load_ps(v), + _mm_set1_ps(s))); +#else + dest[0] = v[0] * s; + dest[1] = v[1] * s; + dest[2] = v[2] * s; + dest[3] = v[3] * s; +#endif +} + +/*! + * @brief make vec3 vector scale as specified: result = unit(v) * s + * + * @param[in] v vector + * @param[in] s scalar + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec_scale_as(vec3 v, float s, vec3 dest) { + float norm; + norm = glm_vec_norm(v); + + if (norm == 0) { + glm_vec_copy(v, dest); + return; + } + + glm_vec_scale(v, s / norm, dest); +} + +/*! + * @brief make vec4 vector scale as specified: result = unit(v) * s + * + * @param[in] v vector + * @param[in] s scalar + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec4_scale_as(vec4 v, float s, vec4 dest) { + float norm; + norm = glm_vec4_norm(v); + + if (norm == 0) { + glm_vec4_copy(v, dest); + return; + } + + glm_vec4_scale(v, s / norm, dest); +} + /*! * @brief flip sign of all vec3 members * @@ -299,28 +363,6 @@ glm_vec4_flipsign(vec4 v) { #endif } -/*! - * @brief multiply vec4 vector with scalar - * - * @param[in] v vector - * @param[in] s scalar - * @param[out] dest destination vector - */ -CGLM_INLINE -void -glm_vec4_scale(vec4 v, float s, vec4 dest) { -#if defined( __SSE__ ) || defined( __SSE2__ ) - _mm_store_ps(dest, - _mm_mul_ps(_mm_load_ps(v), - _mm_set1_ps(s))); -#else - dest[0] = v[0] * s; - dest[1] = v[1] * s; - dest[2] = v[2] * s; - dest[3] = v[3] * s; -#endif -} - /*! * @brief normalize vec3 and store result in same vec * diff --git a/src/cglm-vec.c b/src/cglm-vec.c index 503a3a2..f32c533 100644 --- a/src/cglm-vec.c +++ b/src/cglm-vec.c @@ -121,6 +121,24 @@ glmc_vec_scale(vec3 v, float s, vec3 dest) { glm_vec_scale(v, s, dest); } +CGLM_EXPORT +void +glmc_vec4_scale(vec4 v, float s, vec4 dest) { + glm_vec4_scale(v, s, dest); +} + +CGLM_EXPORT +void +glmc_vec_scale_as(vec3 v, float s, vec3 dest) { + glm_vec_scale_as(v, s, dest); +} + +CGLM_EXPORT +void +glmc_vec4_scale_as(vec3 v, float s, vec3 dest) { + glm_vec4_scale_as(v, s, dest); +} + CGLM_EXPORT void glmc_vec_flipsign(vec3 v) { @@ -133,12 +151,6 @@ glmc_vec4_flipsign(vec4 v) { glm_vec4_flipsign(v); } -CGLM_EXPORT -void -glmc_vec4_scale(vec4 v, float s, vec4 dest) { - glm_vec4_scale(v, s, dest); -} - CGLM_EXPORT float glmc_vec_angle(vec3 v1, vec3 v2) {