vec: minnadd and maxadd helpers

This commit is contained in:
Recep Aslantas
2018-11-29 10:50:24 +03:00
parent 4e08b7e335
commit 6d6954b208
9 changed files with 184 additions and 18 deletions

View File

@@ -55,6 +55,8 @@ Functions:
#. :c:func:`glm_vec3_subadd` #. :c:func:`glm_vec3_subadd`
#. :c:func:`glm_vec3_muladd` #. :c:func:`glm_vec3_muladd`
#. :c:func:`glm_vec3_muladds` #. :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`
#. :c:func:`glm_vec3_flipsign_to` #. :c:func:`glm_vec3_flipsign_to`
#. :c:func:`glm_vec3_inv` #. :c:func:`glm_vec3_inv`
@@ -273,6 +275,26 @@ Functions documentation
| *[in]* **s** scalar | *[in]* **s** scalar
| *[out]* **dest** dest += (a * b) | *[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) .. c:function:: void glm_vec3_flipsign(vec3 v)
**DEPRACATED!** **DEPRACATED!**

View File

@@ -43,6 +43,8 @@ Functions:
#. :c:func:`glm_vec4_subadd` #. :c:func:`glm_vec4_subadd`
#. :c:func:`glm_vec4_muladd` #. :c:func:`glm_vec4_muladd`
#. :c:func:`glm_vec4_muladds` #. :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`
#. :c:func:`glm_vec4_flipsign_to` #. :c:func:`glm_vec4_flipsign_to`
#. :c:func:`glm_vec4_inv` #. :c:func:`glm_vec4_inv`
@@ -262,6 +264,26 @@ Functions documentation
| *[in]* **s** scalar | *[in]* **s** scalar
| *[out]* **dest** dest += (a * b) | *[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) .. c:function:: void glm_vec4_flipsign(vec4 v)
**DEPRACATED!** **DEPRACATED!**

View File

@@ -23,7 +23,7 @@
CGLM_INLINE CGLM_INLINE
void void
glm_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]) { 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[0][0], xa);
glm_vec3_scale(m[0], box[1][0], xb); 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[0][2], za);
glm_vec3_scale(m[2], box[1][2], zb); glm_vec3_scale(m[2], box[1][2], zb);
/* min(xa, xb) + min(ya, yb) + min(za, zb) + translation */ /* translation + min(xa, xb) + min(ya, yb) + min(za, zb) */
glm_vec3_minv(xa, xb, v[0]); glm_vec3(m[3], v[0]);
glm_vec3_minv(ya, yb, tmp); glm_vec3_minadd(xa, xb, v[0]);
glm_vec3_add(v[0], tmp, v[0]); glm_vec3_minadd(ya, yb, v[0]);
glm_vec3_minv(za, zb, tmp); glm_vec3_minadd(za, zb, v[0]);
glm_vec3_add(v[0], tmp, v[0]);
glm_vec3_add(v[0], m[3], v[0]);
/* max(xa, xb) + max(ya, yb) + max(za, zb) + translation */ /* translation + max(xa, xb) + max(ya, yb) + max(za, zb) */
glm_vec3_maxv(xa, xb, v[1]); glm_vec3(m[3], v[1]);
glm_vec3_maxv(ya, yb, tmp); glm_vec3_maxadd(xa, xb, v[1]);
glm_vec3_add(v[1], tmp, v[1]); glm_vec3_maxadd(ya, yb, v[1]);
glm_vec3_maxv(za, zb, tmp); glm_vec3_maxadd(za, zb, v[1]);
glm_vec3_add(v[1], tmp, v[1]);
glm_vec3_add(v[1], m[3], v[1]);
glm_vec3_copy(v[0], dest[0]); glm_vec3_copy(v[0], dest[0]);
glm_vec3_copy(v[1], dest[1]); glm_vec3_copy(v[1], dest[1]);

View File

@@ -112,6 +112,14 @@ CGLM_EXPORT
void void
glmc_vec3_muladds(vec3 a, float s, vec3 dest); 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 CGLM_EXPORT
void void
glmc_vec3_negate(vec3 v); glmc_vec3_negate(vec3 v);

View File

@@ -117,6 +117,14 @@ CGLM_EXPORT
void void
glmc_vec4_muladds(vec4 a, float s, vec4 dest); 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 CGLM_EXPORT
void void
glmc_vec4_negate(vec4 v); glmc_vec4_negate(vec4 v);

View File

@@ -37,6 +37,8 @@
CGLM_INLINE void glm_vec3_subadd(vec3 a, vec3 b, vec3 dest); 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_muladd(vec3 a, vec3 b, vec3 dest);
CGLM_INLINE void glm_vec3_muladds(vec3 a, float s, 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(vec3 v);
CGLM_INLINE void glm_vec3_flipsign_to(vec3 v, vec3 dest); CGLM_INLINE void glm_vec3_flipsign_to(vec3 v, vec3 dest);
CGLM_INLINE void glm_vec3_negate_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; 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 * @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) */ /* from + s * (to - from) */
glm_vec3_broadcast(glm_clamp_zo(t), s); glm_vec3_broadcast(glm_clamp_zo(t), s);
glm_vec3_sub(to, from, v); glm_vec3_sub(to, from, v);
glm_vec3_mulv(s, v, v); glm_vec3_mul(s, v, v);
glm_vec3_add(from, v, dest); glm_vec3_add(from, v, dest);
} }

View File

@@ -34,6 +34,9 @@
CGLM_INLINE void glm_vec4_addadd(vec4 a, vec4 b, vec4 dest); 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_subadd(vec4 a, vec4 b, vec4 dest);
CGLM_INLINE void glm_vec4_muladd(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_negate(vec4 v);
CGLM_INLINE void glm_vec4_inv(vec4 v); CGLM_INLINE void glm_vec4_inv(vec4 v);
CGLM_INLINE void glm_vec4_inv_to(vec4 v, vec4 dest); 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_clamp(vec4 v, float minVal, float maxVal);
CGLM_INLINE void glm_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest) CGLM_INLINE void glm_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest)
DEPRECATED: DEPRECATED:
glm_vec4_dup glm_vec4_dup
glm_vec4_flipsign glm_vec4_flipsign
@@ -521,6 +523,54 @@ glm_vec4_muladds(vec4 a, float s, vec4 dest) {
#endif #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 * @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) */ /* from + s * (to - from) */
glm_vec4_broadcast(glm_clamp_zo(t), s); glm_vec4_broadcast(glm_clamp_zo(t), s);
glm_vec4_sub(to, from, v); glm_vec4_sub(to, from, v);
glm_vec4_mulv(s, v, v); glm_vec4_mul(s, v, v);
glm_vec4_add(from, v, dest); glm_vec4_add(from, v, dest);
} }

View File

@@ -146,6 +146,18 @@ glmc_vec3_muladds(vec3 a, float s, vec3 dest) {
glm_vec3_muladds(a, s, 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 CGLM_EXPORT
void void
glmc_vec3_negate(vec3 v) { glmc_vec3_negate(vec3 v) {

View File

@@ -152,6 +152,18 @@ glmc_vec4_muladds(vec4 a, float s, vec4 dest) {
glm_vec4_muladds(a, s, 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 CGLM_EXPORT
void void
glmc_vec4_negate(vec4 v) { glmc_vec4_negate(vec4 v) {