From 6d6954b208f9e93787b22da5c83ca05d1697a503 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 29 Nov 2018 10:50:24 +0300 Subject: [PATCH] vec: `minnadd` and `maxadd` helpers --- docs/source/vec3.rst | 22 ++++++++++++++++ docs/source/vec4.rst | 22 ++++++++++++++++ include/cglm/box.h | 26 ++++++++----------- include/cglm/call/vec3.h | 8 ++++++ include/cglm/call/vec4.h | 8 ++++++ include/cglm/vec3.h | 38 +++++++++++++++++++++++++++- include/cglm/vec4.h | 54 ++++++++++++++++++++++++++++++++++++++-- src/vec3.c | 12 +++++++++ src/vec4.c | 12 +++++++++ 9 files changed, 184 insertions(+), 18 deletions(-) diff --git a/docs/source/vec3.rst b/docs/source/vec3.rst index d8f7ced..a625f5c 100644 --- a/docs/source/vec3.rst +++ b/docs/source/vec3.rst @@ -55,6 +55,8 @@ Functions: #. :c:func:`glm_vec3_subadd` #. :c:func:`glm_vec3_muladd` #. :c:func:`glm_vec3_muladds` +#. :c:func:`glm_vec3_maxadd` +#. :c:func:`glm_vec3_minadd` #. :c:func:`glm_vec3_flipsign` #. :c:func:`glm_vec3_flipsign_to` #. :c:func:`glm_vec3_inv` @@ -273,6 +275,26 @@ Functions documentation | *[in]* **s** scalar | *[out]* **dest** dest += (a * b) +.. c:function:: void glm_vec3_maxadd(vec3 a, vec3 b, vec3 dest) + + | add max of two vector to result/dest + | it applies += operator so dest must be initialized + + Parameters: + | *[in]* **a** vector 1 + | *[in]* **b** vector 2 + | *[out]* **dest** dest += (a * b) + +.. c:function:: void glm_vec3_minadd(vec3 a, vec3 b, vec3 dest) + + | add min of two vector to result/dest + | it applies += operator so dest must be initialized + + Parameters: + | *[in]* **a** vector 1 + | *[in]* **b** vector 2 + | *[out]* **dest** dest += (a * b) + .. c:function:: void glm_vec3_flipsign(vec3 v) **DEPRACATED!** diff --git a/docs/source/vec4.rst b/docs/source/vec4.rst index 99f65cc..5bb1ac7 100644 --- a/docs/source/vec4.rst +++ b/docs/source/vec4.rst @@ -43,6 +43,8 @@ Functions: #. :c:func:`glm_vec4_subadd` #. :c:func:`glm_vec4_muladd` #. :c:func:`glm_vec4_muladds` +#. :c:func:`glm_vec4_maxadd` +#. :c:func:`glm_vec4_minadd` #. :c:func:`glm_vec4_flipsign` #. :c:func:`glm_vec4_flipsign_to` #. :c:func:`glm_vec4_inv` @@ -262,6 +264,26 @@ Functions documentation | *[in]* **s** scalar | *[out]* **dest** dest += (a * b) +.. c:function:: void glm_vec4_maxadd(vec4 a, vec4 b, vec4 dest) + + | add max of two vector to result/dest + | it applies += operator so dest must be initialized + + Parameters: + | *[in]* **a** vector 1 + | *[in]* **b** vector 2 + | *[out]* **dest** dest += (a * b) + +.. c:function:: void glm_vec4_minadd(vec4 a, vec4 b, vec4 dest) + + | add min of two vector to result/dest + | it applies += operator so dest must be initialized + + Parameters: + | *[in]* **a** vector 1 + | *[in]* **b** vector 2 + | *[out]* **dest** dest += (a * b) + .. c:function:: void glm_vec4_flipsign(vec4 v) **DEPRACATED!** diff --git a/include/cglm/box.h b/include/cglm/box.h index 0fec3ee..2250c2a 100644 --- a/include/cglm/box.h +++ b/include/cglm/box.h @@ -23,7 +23,7 @@ CGLM_INLINE void glm_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]) { - vec3 v[2], xa, xb, ya, yb, za, zb, tmp; + vec3 v[2], xa, xb, ya, yb, za, zb; glm_vec3_scale(m[0], box[0][0], xa); glm_vec3_scale(m[0], box[1][0], xb); @@ -34,21 +34,17 @@ glm_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]) { glm_vec3_scale(m[2], box[0][2], za); glm_vec3_scale(m[2], box[1][2], zb); - /* min(xa, xb) + min(ya, yb) + min(za, zb) + translation */ - glm_vec3_minv(xa, xb, v[0]); - glm_vec3_minv(ya, yb, tmp); - glm_vec3_add(v[0], tmp, v[0]); - glm_vec3_minv(za, zb, tmp); - glm_vec3_add(v[0], tmp, v[0]); - glm_vec3_add(v[0], m[3], v[0]); + /* translation + min(xa, xb) + min(ya, yb) + min(za, zb) */ + glm_vec3(m[3], v[0]); + glm_vec3_minadd(xa, xb, v[0]); + glm_vec3_minadd(ya, yb, v[0]); + glm_vec3_minadd(za, zb, v[0]); - /* max(xa, xb) + max(ya, yb) + max(za, zb) + translation */ - glm_vec3_maxv(xa, xb, v[1]); - glm_vec3_maxv(ya, yb, tmp); - glm_vec3_add(v[1], tmp, v[1]); - glm_vec3_maxv(za, zb, tmp); - glm_vec3_add(v[1], tmp, v[1]); - glm_vec3_add(v[1], m[3], v[1]); + /* translation + max(xa, xb) + max(ya, yb) + max(za, zb) */ + glm_vec3(m[3], v[1]); + glm_vec3_maxadd(xa, xb, v[1]); + glm_vec3_maxadd(ya, yb, v[1]); + glm_vec3_maxadd(za, zb, v[1]); glm_vec3_copy(v[0], dest[0]); glm_vec3_copy(v[1], dest[1]); diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index 106257e..5b77170 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -112,6 +112,14 @@ CGLM_EXPORT void glmc_vec3_muladds(vec3 a, float s, vec3 dest); +CGLM_EXPORT +void +glmc_vec3_maxadd(vec3 a, vec3 b, vec3 dest); + +CGLM_EXPORT +void +glmc_vec3_minadd(vec3 a, vec3 b, vec3 dest); + CGLM_EXPORT void glmc_vec3_negate(vec3 v); diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index 1923da6..9a72510 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -117,6 +117,14 @@ CGLM_EXPORT void glmc_vec4_muladds(vec4 a, float s, vec4 dest); +CGLM_EXPORT +void +glmc_vec4_maxadd(vec4 a, vec4 b, vec4 dest); + +CGLM_EXPORT +void +glmc_vec4_minadd(vec4 a, vec4 b, vec4 dest); + CGLM_EXPORT void glmc_vec4_negate(vec4 v); diff --git a/include/cglm/vec3.h b/include/cglm/vec3.h index d311c27..04d697b 100644 --- a/include/cglm/vec3.h +++ b/include/cglm/vec3.h @@ -37,6 +37,8 @@ CGLM_INLINE void glm_vec3_subadd(vec3 a, vec3 b, vec3 dest); CGLM_INLINE void glm_vec3_muladd(vec3 a, vec3 b, vec3 dest); CGLM_INLINE void glm_vec3_muladds(vec3 a, float s, vec3 dest); + CGLM_INLINE void glm_vec3_maxadd(vec3 a, vec3 b, vec3 dest); + CGLM_INLINE void glm_vec3_minadd(vec3 a, vec3 b, vec3 dest); CGLM_INLINE void glm_vec3_flipsign(vec3 v); CGLM_INLINE void glm_vec3_flipsign_to(vec3 v, vec3 dest); CGLM_INLINE void glm_vec3_negate_to(vec3 v, vec3 dest); @@ -419,6 +421,40 @@ glm_vec3_muladds(vec3 a, float s, vec3 dest) { dest[2] += a[2] * s; } +/*! + * @brief add max of two vector to result/dest + * + * it applies += operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @param[out] dest dest += max(a, b) + */ +CGLM_INLINE +void +glm_vec3_maxadd(vec3 a, vec3 b, vec3 dest) { + dest[0] += glm_max(a[0], b[0]); + dest[1] += glm_max(a[1], b[1]); + dest[2] += glm_max(a[2], b[2]); +} + +/*! + * @brief add min of two vector to result/dest + * + * it applies += operator so dest must be initialized + * + * @param[in] a vector + * @param[in] s scalar + * @param[out] dest dest += min(a, b) + */ +CGLM_INLINE +void +glm_vec3_minadd(vec3 a, vec3 b, vec3 dest) { + dest[0] += glm_min(a[0], b[0]); + dest[1] += glm_min(a[1], b[1]); + dest[2] += glm_min(a[2], b[2]); +} + /*! * @brief negate vector components and store result in dest * @@ -732,7 +768,7 @@ glm_vec3_lerp(vec3 from, vec3 to, float t, vec3 dest) { /* from + s * (to - from) */ glm_vec3_broadcast(glm_clamp_zo(t), s); glm_vec3_sub(to, from, v); - glm_vec3_mulv(s, v, v); + glm_vec3_mul(s, v, v); glm_vec3_add(from, v, dest); } diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index 2e3f6cf..5391047 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -34,6 +34,9 @@ CGLM_INLINE void glm_vec4_addadd(vec4 a, vec4 b, vec4 dest); CGLM_INLINE void glm_vec4_subadd(vec4 a, vec4 b, vec4 dest); CGLM_INLINE void glm_vec4_muladd(vec4 a, vec4 b, vec4 dest); + CGLM_INLINE void glm_vec4_muladds(vec4 a, float s, vec4 dest); + CGLM_INLINE void glm_vec4_maxadd(vec4 a, vec4 b, vec4 dest); + CGLM_INLINE void glm_vec4_minadd(vec4 a, vec4 b, vec4 dest); CGLM_INLINE void glm_vec4_negate(vec4 v); CGLM_INLINE void glm_vec4_inv(vec4 v); CGLM_INLINE void glm_vec4_inv_to(vec4 v, vec4 dest); @@ -45,7 +48,6 @@ CGLM_INLINE void glm_vec4_clamp(vec4 v, float minVal, float maxVal); CGLM_INLINE void glm_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest) - DEPRECATED: glm_vec4_dup glm_vec4_flipsign @@ -521,6 +523,54 @@ glm_vec4_muladds(vec4 a, float s, vec4 dest) { #endif } +/*! + * @brief add max of two vector to result/dest + * + * it applies += operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @param[out] dest dest += max(a, b) + */ +CGLM_INLINE +void +glm_vec4_maxadd(vec4 a, vec4 b, vec4 dest) { +#if defined( __SSE__ ) || defined( __SSE2__ ) + glmm_store(dest, _mm_add_ps(glmm_load(dest), + _mm_max_ps(glmm_load(a), + glmm_load(b)))); +#else + dest[0] += glm_max(a[0], b[0]); + dest[1] += glm_max(a[1], b[1]); + dest[2] += glm_max(a[2], b[2]); + dest[3] += glm_max(a[3], b[3]); +#endif +} + +/*! + * @brief add min of two vector to result/dest + * + * it applies += operator so dest must be initialized + * + * @param[in] a vector + * @param[in] s scalar + * @param[out] dest dest += min(a, b) + */ +CGLM_INLINE +void +glm_vec4_minadd(vec4 a, vec4 b, vec4 dest) { +#if defined( __SSE__ ) || defined( __SSE2__ ) + glmm_store(dest, _mm_add_ps(glmm_load(dest), + _mm_min_ps(glmm_load(a), + glmm_load(b)))); +#else + dest[0] += glm_min(a[0], b[0]); + dest[1] += glm_min(a[1], b[1]); + dest[2] += glm_min(a[2], b[2]); + dest[3] += glm_min(a[3], b[3]); +#endif +} + /*! * @brief negate vector components and store result in dest * @@ -694,7 +744,7 @@ glm_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest) { /* from + s * (to - from) */ glm_vec4_broadcast(glm_clamp_zo(t), s); glm_vec4_sub(to, from, v); - glm_vec4_mulv(s, v, v); + glm_vec4_mul(s, v, v); glm_vec4_add(from, v, dest); } diff --git a/src/vec3.c b/src/vec3.c index 1b6ef3c..7b20888 100644 --- a/src/vec3.c +++ b/src/vec3.c @@ -146,6 +146,18 @@ glmc_vec3_muladds(vec3 a, float s, vec3 dest) { glm_vec3_muladds(a, s, dest); } +CGLM_EXPORT +void +glmc_vec3_maxadd(vec3 a, vec3 b, vec3 dest) { + glm_vec3_maxadd(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec3_minadd(vec3 a, vec3 b, vec3 dest) { + glm_vec3_minadd(a, b, dest); +} + CGLM_EXPORT void glmc_vec3_negate(vec3 v) { diff --git a/src/vec4.c b/src/vec4.c index 97b0da4..1a49710 100644 --- a/src/vec4.c +++ b/src/vec4.c @@ -152,6 +152,18 @@ glmc_vec4_muladds(vec4 a, float s, vec4 dest) { glm_vec4_muladds(a, s, dest); } +CGLM_EXPORT +void +glmc_vec4_maxadd(vec4 a, vec4 b, vec4 dest) { + glm_vec4_maxadd(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec4_minadd(vec4 a, vec4 b, vec4 dest) { + glm_vec4_minadd(a, b, dest); +} + CGLM_EXPORT void glmc_vec4_negate(vec4 v) {