From 27cc9c3351c74aa8ca61dca9db0ef7537d6ed96a Mon Sep 17 00:00:00 2001 From: Luigi Castelli Date: Sat, 31 Aug 2019 23:30:15 +0200 Subject: [PATCH] vec: some useful functions (#103) These functions are added: - abs(): absolute value - fract(): fractional part - norm_one(): L1 norm - norm_inf(): infinity norm - hadd(): horizontal add - hmax(): horizontal max --- include/cglm/call/vec3.h | 20 ++++++++++++ include/cglm/call/vec4.h | 20 ++++++++++++ include/cglm/simd/arm.h | 34 +++++++++++++++++++++ include/cglm/simd/x86.h | 50 ++++++++++++++++++++++++++++++ include/cglm/struct/vec3-ext.h | 44 ++++++++++++++++++++++++++ include/cglm/struct/vec3.h | 41 +++++++++++++++++++++++++ include/cglm/struct/vec4-ext.h | 44 ++++++++++++++++++++++++++ include/cglm/struct/vec4.h | 41 +++++++++++++++++++++++++ include/cglm/vec3-ext.h | 44 ++++++++++++++++++++++++++ include/cglm/vec3.h | 45 +++++++++++++++++++++++++++ include/cglm/vec4-ext.h | 56 ++++++++++++++++++++++++++++++++++ include/cglm/vec4.h | 53 ++++++++++++++++++++++++++++++++ src/vec3.c | 30 ++++++++++++++++++ src/vec4.c | 30 ++++++++++++++++++ 14 files changed, 552 insertions(+) diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index 851417f..69fc0e2 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -55,6 +55,14 @@ glmc_vec3_norm(vec3 v); CGLM_EXPORT float glmc_vec3_norm2(vec3 v); + +CGLM_EXPORT +float +glmc_vec3_norm_one(vec3 v); + +CGLM_EXPORT +float +glmc_vec3_norm_inf(vec3 v); CGLM_EXPORT void @@ -281,6 +289,18 @@ glmc_vec3_isvalid(vec3 v); CGLM_EXPORT void glmc_vec3_sign(vec3 v, vec3 dest); + +CGLM_EXPORT +void +glmc_vec3_abs(vec3 v, vec3 dest); + +CGLM_EXPORT +void +glmc_vec3_fract(vec3 v, vec3 dest); + +CGLM_EXPORT +float +glmc_vec3_hadd(vec3 v); CGLM_EXPORT void diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index c8702e2..28a3734 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -56,6 +56,14 @@ glmc_vec4_norm(vec4 v); CGLM_EXPORT float glmc_vec4_norm2(vec4 v); + +CGLM_EXPORT +float +glmc_vec4_norm_one(vec4 v); + +CGLM_EXPORT +float +glmc_vec4_norm_inf(vec4 v); CGLM_EXPORT void @@ -258,6 +266,18 @@ glmc_vec4_isvalid(vec4 v); CGLM_EXPORT void glmc_vec4_sign(vec4 v, vec4 dest); + +CGLM_EXPORT +void +glmc_vec4_abs(vec4 v, vec4 dest); + +CGLM_EXPORT +void +glmc_vec4_fract(vec4 v, vec4 dest); + +CGLM_EXPORT +float +glmc_vec4_hadd(vec4 v); CGLM_EXPORT void diff --git a/include/cglm/simd/arm.h b/include/cglm/simd/arm.h index 65dd3bb..d0e5072 100644 --- a/include/cglm/simd/arm.h +++ b/include/cglm/simd/arm.h @@ -13,6 +13,12 @@ #define glmm_load(p) vld1q_f32(p) #define glmm_store(p, a) vst1q_f32(p, a) +static inline +float32x4_t +glmm_abs(float32x4_t v) { + return vabsq_f32(v); +} + static inline float glmm_hadd(float32x4_t v) { @@ -25,6 +31,22 @@ glmm_hadd(float32x4_t v) { #endif } +static inline +float +glmm_hmin(float32x4_t v) { + v = vpmin_f32(vget_low_f32(v), vget_high_f32(v)); + v = vpmin_f32(v, v); + return vget_lane_f32(v, 0); +} + +static inline +float +glmm_hmax(float32x4_t v) { + v = vpmax_f32(vget_low_f32(v), vget_high_f32(v)); + v = vpmax_f32(v, v); + return vget_lane_f32(v, 0); +} + static inline float glmm_dot(float32x4_t a, float32x4_t b) { @@ -43,5 +65,17 @@ glmm_norm2(float32x4_t a) { return glmm_dot(a, a); } +static inline +float +glmm_norm_one(float32x4_t a) { + return glmm_hadd(glmm_abs(a)); +} + +static inline +float +glmm_norm_inf(float32x4_t a) { + return glmm_hmax(glmm_abs(a)); +} + #endif #endif /* cglm_simd_arm_h */ diff --git a/include/cglm/simd/x86.h b/include/cglm/simd/x86.h index 418cde0..1360e20 100644 --- a/include/cglm/simd/x86.h +++ b/include/cglm/simd/x86.h @@ -42,6 +42,12 @@ # endif #endif +static inline +__m128 +glmm_abs(__m128 x) { + return _mm_andnot_ps(_mm_set1_ps(-0.0f), x); +} + static inline __m128 glmm_vhadds(__m128 v) { @@ -68,6 +74,38 @@ glmm_hadd(__m128 v) { return _mm_cvtss_f32(glmm_vhadds(v)); } +static inline +__m128 +glmm_vhmin(__m128 v) { + __m128 x0, x1, x2; + x0 = _mm_movehl_ps(v, v); /* [2, 3, 2, 3] */ + x1 = _mm_min_ps(x0, v); /* [0|2, 1|3, 2|2, 3|3] */ + x2 = glmm_shuff1x(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */ + return _mm_min_ss(x1, x2); +} + +static inline +float +glmm_hmin(__m128 v) { + return _mm_cvtss_f32(glmm_vhmin(v)); +} + +static inline +__m128 +glmm_vhmax(__m128 v) { + __m128 x0, x1, x2; + x0 = _mm_movehl_ps(v, v); /* [2, 3, 2, 3] */ + x1 = _mm_max_ps(x0, v); /* [0|2, 1|3, 2|2, 3|3] */ + x2 = glmm_shuff1x(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */ + return _mm_max_ss(x1, x2); +} + +static inline +float +glmm_hmax(__m128 v) { + return _mm_cvtss_f32(glmm_vhmax(v)); +} + static inline __m128 glmm_vdots(__m128 a, __m128 b) { @@ -119,6 +157,18 @@ glmm_norm2(__m128 a) { return _mm_cvtss_f32(glmm_vhadds(_mm_mul_ps(a, a))); } +static inline +float +glmm_norm_one(__m128 a) { + return _mm_cvtss_f32(glmm_vhadds(glmm_abs(a))); +} + +static inline +float +glmm_norm_inf(__m128 a) { + return _mm_cvtss_f32(glmm_vhmax(glmm_abs(a))); +} + static inline __m128 glmm_load3(float v[3]) { diff --git a/include/cglm/struct/vec3-ext.h b/include/cglm/struct/vec3-ext.h index 055805e..8e5ca70 100644 --- a/include/cglm/struct/vec3-ext.h +++ b/include/cglm/struct/vec3-ext.h @@ -24,6 +24,9 @@ CGLM_INLINE bool glms_vec3_isinf(vec3s v); CGLM_INLINE bool glms_vec3_isvalid(vec3s v); CGLM_INLINE vec3s glms_vec3_sign(vec3s v); + CGLM_INLINE vec3s glms_vec3_abs(vec3s v); + CGLM_INLINE vec3s glms_vec3_fract(vec3s v); + CGLM_INLINE float glms_vec3_hadd(vec3s v); CGLM_INLINE vec3s glms_vec3_sqrt(vec3s v); */ @@ -196,6 +199,47 @@ glms_vec3_sign(vec3s v) { return r; } +/*! + * @brief absolute value of each vector item + * + * @param[in] v vector + * @return destination vector + */ +CGLM_INLINE +vec3s +glms_vec3_abs(vec3s v) { + vec3s r; + glm_vec3_abs(v.raw, r.raw); + return r; +} + +/*! + * @brief fractional part of each vector item + * + * @param[in] v vector + * @return dest destination vector + */ +CGLM_INLINE +vec3s +glms_vec3_fract(vec3s v) { + vec3s r; + glm_vec3_fract(v.raw, r.raw); + return r; +} + +/*! + * @brief vector reduction by summation + * @warning could overflow + * + * @param[in] v vector + * @return sum of all vector's elements + */ +CGLM_INLINE +float +glms_vec3_hadd(vec3s v) { + return glm_vec3_hadd(v.raw); +} + /*! * @brief square root of each vector item * diff --git a/include/cglm/struct/vec3.h b/include/cglm/struct/vec3.h index 305ad44..0cd2f5c 100644 --- a/include/cglm/struct/vec3.h +++ b/include/cglm/struct/vec3.h @@ -24,6 +24,8 @@ CGLM_INLINE float glms_vec3_dot(vec3s a, vec3s b); CGLM_INLINE float glms_vec3_norm2(vec3s v); CGLM_INLINE float glms_vec3_norm(vec3s v); + CGLM_INLINE float glms_vec3_norm_one(vec3s v); + CGLM_INLINE float glms_vec3_norm_inf(vec3s v); CGLM_INLINE vec3s glms_vec3_add(vec3s a, vec3s b); CGLM_INLINE vec3s glms_vec3_adds(vec3s a, float s); CGLM_INLINE vec3s glms_vec3_sub(vec3s a, vec3s b); @@ -212,6 +214,45 @@ glms_vec3_norm(vec3s v) { return glm_vec3_norm(v.raw); } +/*! + * @brief L1 norm of vec3 + * Also known as Manhattan Distance or Taxicab norm. + * L1 Norm is the sum of the magnitudes of the vectors in a space. + * It is calculated as the sum of the absolute values of the vector components. + * In this norm, all the components of the vector are weighted equally. + * + * This computes: + * R = |v[0]| + |v[1]| + |v[2]| + * + * @param[in] v vector + * + * @return L1 norm + */ +CGLM_INLINE +float +glms_vec3_norm_one(vec3s v) { + return glm_vec3_norm_one(v.raw); +} + +/*! + * @brief Infinity norm of vec3 + * Also known as Maximum norm. + * Infinity Norm is the largest magnitude among each element of a vector. + * It is calculated as the maximum of the absolute values of the vector components. + * + * This computes: + * inf norm = max(|v[0]|, |v[1]|, |v[2]|) + * + * @param[in] v vector + * + * @return Infinity norm + */ +CGLM_INLINE +float +glms_vec3_norm_inf(vec3s v) { + return glm_vec3_norm_inf(v.raw); +} + /*! * @brief add a vector to b vector store result in dest * diff --git a/include/cglm/struct/vec4-ext.h b/include/cglm/struct/vec4-ext.h index 371956d..d5cddec 100644 --- a/include/cglm/struct/vec4-ext.h +++ b/include/cglm/struct/vec4-ext.h @@ -24,6 +24,9 @@ CGLM_INLINE bool glms_vec4_isinf(vec4s v); CGLM_INLINE bool glms_vec4_isvalid(vec4s v); CGLM_INLINE vec4s glms_vec4_sign(vec4s v); + CGLM_INLINE vec4s glms_vec4_abs(vec4s v); + CGLM_INLINE vec4s glms_vec4_fract(vec4s v); + CGLM_INLINE float glms_vec4_hadd(vec4s v); CGLM_INLINE vec4s glms_vec4_sqrt(vec4s v); */ @@ -196,6 +199,47 @@ glms_vec4_sign(vec4s v) { return r; } +/*! + * @brief absolute value of each vector item + * + * @param[in] v vector + * @returns destination vector + */ +CGLM_INLINE +vec4s +glms_vec4_abs(vec4s v) { + vec4s r; + glm_vec4_abs(v.raw, r.raw); + return r; +} + +/*! + * @brief fractional part of each vector item + * + * @param[in] v vector + * @returns dest destination vector + */ +CGLM_INLINE +vec4s +glms_vec4_fract(vec4s v) { + vec4s r; + glm_vec4_fract(v.raw, r.raw); + return r; +} + +/*! + * @brief vector reduction by summation + * @warning could overflow + * + * @param[in] v vector + * @return sum of all vector's elements + */ +CGLM_INLINE +float +glms_vec4_hadd(vec4s v) { + return glm_vec4_hadd(v.raw); +} + /*! * @brief square root of each vector item * diff --git a/include/cglm/struct/vec4.h b/include/cglm/struct/vec4.h index 17a4898..7137cfa 100644 --- a/include/cglm/struct/vec4.h +++ b/include/cglm/struct/vec4.h @@ -24,6 +24,8 @@ CGLM_INLINE float glms_vec4_dot(vec4s a, vec4s b); CGLM_INLINE float glms_vec4_norm2(vec4s v); CGLM_INLINE float glms_vec4_norm(vec4s v); + CGLM_INLINE float glms_vec4_norm_one(vec4s v); + CGLM_INLINE float glms_vec4_norm_inf(vec4s v); CGLM_INLINE vec4s glms_vec4_add(vec4s a, vec4s b); CGLM_INLINE vec4s glms_vec4_adds(vec4s v, float s); CGLM_INLINE vec4s glms_vec4_sub(vec4s a, vec4s b); @@ -241,6 +243,45 @@ glms_vec4_norm(vec4s v) { return glm_vec4_norm(v.raw); } +/*! + * @brief L1 norm of vec4 + * Also known as Manhattan Distance or Taxicab norm. + * L1 Norm is the sum of the magnitudes of the vectors in a space. + * It is calculated as the sum of the absolute values of the vector components. + * In this norm, all the components of the vector are weighted equally. + * + * This computes: + * R = |v[0]| + |v[1]| + |v[2]| + |v[3]| + * + * @param[in] v vector + * + * @return L1 norm + */ +CGLM_INLINE +float +glms_vec4_norm_one(vec4s v) { + return glm_vec4_norm_one(v.raw); +} + +/*! + * @brief Infinity norm of vec4 + * Also known as Maximum norm. + * Infinity Norm is the largest magnitude among each element of a vector. + * It is calculated as the maximum of the absolute values of the vector components. + * + * This computes: + * inf norm = max(|v[0]|, |v[1]|, |v[2]|, |v[3]|) + * + * @param[in] v vector + * + * @return Infinity norm + */ +CGLM_INLINE +float +glms_vec4_norm_inf(vec4s v) { + return glm_vec4_norm_inf(v.raw); +} + /*! * @brief add b vector to a vector store result in dest * diff --git a/include/cglm/vec3-ext.h b/include/cglm/vec3-ext.h index 6b8d5f0..240c33d 100644 --- a/include/cglm/vec3-ext.h +++ b/include/cglm/vec3-ext.h @@ -24,6 +24,9 @@ CGLM_INLINE bool glm_vec3_isinf(vec3 v); CGLM_INLINE bool glm_vec3_isvalid(vec3 v); CGLM_INLINE void glm_vec3_sign(vec3 v, vec3 dest); + CGLM_INLINE void glm_vec3_abs(vec3 v, vec3 dest); + CGLM_INLINE void glm_vec3_fract(vec3 v, vec3 dest); + CGLM_INLINE float glm_vec3_hadd(vec3 v); CGLM_INLINE void glm_vec3_sqrt(vec3 v, vec3 dest); */ @@ -211,6 +214,47 @@ glm_vec3_sign(vec3 v, vec3 dest) { dest[2] = glm_signf(v[2]); } +/*! + * @brief absolute value of each vector item + * + * @param[in] v vector + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec3_abs(vec3 v, vec3 dest) { + dest[0] = fabsf(v[0]); + dest[1] = fabsf(v[1]); + dest[2] = fabsf(v[2]); +} + +/*! + * @brief fractional part of each vector item + * + * @param[in] v vector + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec3_fract(vec3 v, vec3 dest) { + dest[0] = fminf(v[0] - floorf(v[0]), 0x1.fffffep-1f); + dest[1] = fminf(v[1] - floorf(v[1]), 0x1.fffffep-1f); + dest[2] = fminf(v[2] - floorf(v[2]), 0x1.fffffep-1f); +} + +/*! + * @brief vector reduction by summation + * @warning could overflow + * + * @param[in] v vector + * @return sum of all vector's elements + */ +CGLM_INLINE +float +glm_vec3_hadd(vec3 v) { + return v[0] + v[1] + v[2]; +} + /*! * @brief square root of each vector item * diff --git a/include/cglm/vec3.h b/include/cglm/vec3.h index cc6d552..2bb6231 100644 --- a/include/cglm/vec3.h +++ b/include/cglm/vec3.h @@ -23,6 +23,8 @@ CGLM_INLINE float glm_vec3_dot(vec3 a, vec3 b); CGLM_INLINE float glm_vec3_norm2(vec3 v); CGLM_INLINE float glm_vec3_norm(vec3 v); + CGLM_INLINE float glm_vec3_norm_one(vec3 v); + CGLM_INLINE float glm_vec3_norm_inf(vec3 v); CGLM_INLINE void glm_vec3_add(vec3 a, vec3 b, vec3 dest); CGLM_INLINE void glm_vec3_adds(vec3 a, float s, vec3 dest); CGLM_INLINE void glm_vec3_sub(vec3 a, vec3 b, vec3 dest); @@ -213,6 +215,49 @@ glm_vec3_norm(vec3 v) { return sqrtf(glm_vec3_norm2(v)); } +/*! + * @brief L1 norm of vec3 + * Also known as Manhattan Distance or Taxicab norm. + * L1 Norm is the sum of the magnitudes of the vectors in a space. + * It is calculated as the sum of the absolute values of the vector components. + * In this norm, all the components of the vector are weighted equally. + * + * This computes: + * R = |v[0]| + |v[1]| + |v[2]| + * + * @param[in] v vector + * + * @return L1 norm + */ +CGLM_INLINE +float +glm_vec3_norm_one(vec3 v) { + vec3 t; + glm_vec3_abs(v, t); + return glm_vec3_hadd(t); +} + +/*! + * @brief infinity norm of vec3 + * Also known as Maximum norm. + * Infinity Norm is the largest magnitude among each element of a vector. + * It is calculated as the maximum of the absolute values of the vector components. + * + * This computes: + * inf norm = max(|v[0]|, |v[1]|, |v[2]|) + * + * @param[in] v vector + * + * @return infinity norm + */ +CGLM_INLINE +float +glm_vec3_norm_inf(vec3 v) { + vec3 t; + glm_vec3_abs(v, t); + return glm_vec3_max(t); +} + /*! * @brief add a vector to b vector store result in dest * diff --git a/include/cglm/vec4-ext.h b/include/cglm/vec4-ext.h index 3ef71d6..583376b 100644 --- a/include/cglm/vec4-ext.h +++ b/include/cglm/vec4-ext.h @@ -24,6 +24,9 @@ CGLM_INLINE bool glm_vec4_isinf(vec4 v); CGLM_INLINE bool glm_vec4_isvalid(vec4 v); CGLM_INLINE void glm_vec4_sign(vec4 v, vec4 dest); + CGLM_INLINE void glm_vec4_abs(vec4 v, vec4 dest); + CGLM_INLINE void glm_vec4_fract(vec4 v, vec4 dest); + CGLM_INLINE float glm_vec4_hadd(vec4 v); CGLM_INLINE void glm_vec4_sqrt(vec4 v, vec4 dest); */ @@ -237,6 +240,59 @@ glm_vec4_sign(vec4 v, vec4 dest) { #endif } +/*! + * @brief absolute value of each vector item + * + * @param[in] v vector + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec4_abs(vec4 v, vec4 dest) { +#if defined( __SSE__ ) || defined( __SSE2__ ) + glmm_store(dest, glmm_abs(glmm_load(v))); +#elif defined(CGLM_NEON_FP) + vst1q_f32(dest, vabsq_f32(vld1q_f32(a))); +#else + dest[0] = fabsf(v[0]); + dest[1] = fabsf(v[1]); + dest[2] = fabsf(v[2]); + dest[3] = fabsf(v[3]); +#endif +} + +/*! + * @brief fractional part of each vector item + * + * @param[in] v vector + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec4_fract(vec4 v, vec4 dest) { + dest[0] = fminf(v[0] - floorf(v[0]), 0x1.fffffep-1f); + dest[1] = fminf(v[1] - floorf(v[1]), 0x1.fffffep-1f); + dest[2] = fminf(v[2] - floorf(v[2]), 0x1.fffffep-1f); + dest[3] = fminf(v[3] - floorf(v[3]), 0x1.fffffep-1f); +} + +/*! + * @brief vector reduction by summation + * @warning could overflow + * + * @param[in] v vector + * @return sum of all vector's elements + */ +CGLM_INLINE +float +glm_vec4_hadd(vec4 v) { +#if defined( __SSE__ ) || defined( __SSE2__ ) + return glmm_hadd(glmm_load(v)); +#else + return v[0] + v[1] + v[2] + v[3]; +#endif +} + /*! * @brief square root of each vector item * diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index 05835ff..34c1057 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -22,6 +22,8 @@ CGLM_INLINE float glm_vec4_dot(vec4 a, vec4 b); CGLM_INLINE float glm_vec4_norm2(vec4 v); CGLM_INLINE float glm_vec4_norm(vec4 v); + CGLM_INLINE float glm_vec4_norm_one(vec4 v); + CGLM_INLINE float glm_vec4_norm_inf(vec4 v); CGLM_INLINE void glm_vec4_add(vec4 a, vec4 b, vec4 dest); CGLM_INLINE void glm_vec4_adds(vec4 v, float s, vec4 dest); CGLM_INLINE void glm_vec4_sub(vec4 a, vec4 b, vec4 dest); @@ -257,6 +259,57 @@ glm_vec4_norm(vec4 v) { #endif } +/*! + * @brief L1 norm of vec4 + * Also known as Manhattan Distance or Taxicab norm. + * L1 Norm is the sum of the magnitudes of the vectors in a space. + * It is calculated as the sum of the absolute values of the vector components. + * In this norm, all the components of the vector are weighted equally. + * + * This computes: + * L1 norm = |v[0]| + |v[1]| + |v[2]| + |v[3]| + * + * @param[in] v vector + * + * @return L1 norm + */ +CGLM_INLINE +float +glm_vec4_norm_one(vec4 v) { +#if defined(CGLM_SIMD) + return glmm_norm_one(glmm_load(v)); +#else + vec4 t; + glm_vec4_abs(v, t); + return glm_vec4_hadd(t); +#endif +} + +/*! + * @brief infinity norm of vec4 + * Also known as Maximum norm. + * Infinity Norm is the largest magnitude among each element of a vector. + * It is calculated as the maximum of the absolute values of the vector components. + * + * This computes: + * inf norm = max(|v[0]|, |v[1]|, |v[2]|, |v[3]|) + * + * @param[in] v vector + * + * @return infinity norm + */ +CGLM_INLINE +float +glm_vec4_norm_inf(vec4 v) { +#if defined(CGLM_SIMD) + return glmm_norm_inf(glmm_load(v)); +#else + vec4 t; + glm_vec4_abs(v, t); + return glm_vec4_max(t); +#endif +} + /*! * @brief add b vector to a vector store result in dest * diff --git a/src/vec3.c b/src/vec3.c index 5e79260..4ce7112 100644 --- a/src/vec3.c +++ b/src/vec3.c @@ -74,6 +74,18 @@ glmc_vec3_norm2(vec3 v) { return glm_vec3_norm2(v); } +CGLM_EXPORT +float +glmc_vec3_norm_one(vec3 v) { + return glm_vec3_norm_one(v); +} + +CGLM_EXPORT +float +glmc_vec3_norm_inf(vec3 v) { + return glm_vec3_norm_inf(v); +} + CGLM_EXPORT void glmc_vec3_add(vec3 a, vec3 b, vec3 dest) { @@ -382,6 +394,24 @@ glmc_vec3_sign(vec3 v, vec3 dest) { glm_vec3_sign(v, dest); } +CGLM_EXPORT +void +glmc_vec3_abs(vec3 v, vec3 dest) { + glm_vec3_abs(v, dest); +} + +CGLM_EXPORT +void +glmc_vec3_fract(vec3 v, vec3 dest) { + glm_vec3_fract(v, dest); +} + +CGLM_EXPORT +float +glmc_vec3_hadd(vec3 v) { + return glm_vec3_hadd(v); +} + CGLM_EXPORT void glmc_vec3_sqrt(vec3 v, vec3 dest) { diff --git a/src/vec4.c b/src/vec4.c index d1c4d08..f08cd94 100644 --- a/src/vec4.c +++ b/src/vec4.c @@ -74,6 +74,18 @@ glmc_vec4_norm2(vec4 v) { return glm_vec4_norm2(v); } +CGLM_EXPORT +float +glmc_vec4_norm_one(vec4 v) { + return glm_vec4_norm_one(v); +} + +CGLM_EXPORT +float +glmc_vec4_norm_inf(vec4 v) { + return glm_vec4_norm_inf(v); +} + CGLM_EXPORT void glmc_vec4_add(vec4 a, vec4 b, vec4 dest) { @@ -346,6 +358,24 @@ glmc_vec4_sign(vec4 v, vec4 dest) { glm_vec4_sign(v, dest); } +CGLM_EXPORT +void +glmc_vec4_abs(vec4 v, vec4 dest) { + glm_vec4_abs(v, dest); +} + +CGLM_EXPORT +void +glmc_vec4_fract(vec4 v, vec4 dest) { + glm_vec4_fract(v, dest); +} + +CGLM_EXPORT +float +glmc_vec4_hadd(vec4 v) { + return glm_vec4_hadd(v); +} + CGLM_EXPORT void glmc_vec4_sqrt(vec4 v, vec4 dest) {