From 7696374f1e66b8c89026bc3977421fa74a10e101 Mon Sep 17 00:00:00 2001 From: BeeverFeever Date: Mon, 4 Dec 2023 21:32:19 +1100 Subject: [PATCH 01/10] Vector subtraction functions Add subtraction family of functions for vectors. --- include/cglm/call/vec2.h | 24 +++++ include/cglm/call/vec3.h | 24 +++++ include/cglm/call/vec4.h | 24 +++++ include/cglm/struct/vec2.h | 102 +++++++++++++++++++++ include/cglm/struct/vec3.h | 102 +++++++++++++++++++++ include/cglm/struct/vec4.h | 102 +++++++++++++++++++++ include/cglm/vec2.h | 102 +++++++++++++++++++++ include/cglm/vec3.h | 108 ++++++++++++++++++++++ include/cglm/vec4.h | 178 +++++++++++++++++++++++++++++++++++++ src/vec2.c | 37 ++++++++ src/vec3.c | 36 ++++++++ src/vec4.c | 36 ++++++++ 12 files changed, 875 insertions(+) diff --git a/include/cglm/call/vec2.h b/include/cglm/call/vec2.h index 87ca60b..34a5597 100644 --- a/include/cglm/call/vec2.h +++ b/include/cglm/call/vec2.h @@ -105,6 +105,30 @@ CGLM_EXPORT void glmc_vec2_minadd(vec2 a, vec2 b, vec2 dest); +CGLM_EXPORT +void +glmc_vec2_subsub(vec2 a, vec2 b, vec2 dest); + +CGLM_EXPORT +void +glmc_vec2_addsub(vec2 a, vec2 b, vec2 dest); + +CGLM_EXPORT +void +glmc_vec2_mulsub(vec2 a, vec2 b, vec2 dest); + +CGLM_EXPORT +void +glmc_vec2_mulsubs(vec2 a, float s, vec2 dest); + +CGLM_EXPORT +void +glmc_vec2_maxsub(vec2 a, vec2 b, vec2 dest); + +CGLM_EXPORT +void +glmc_vec2_minsub(vec2 a, vec2 b, vec2 dest); + CGLM_EXPORT void glmc_vec2_negate_to(vec2 v, vec2 dest); diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index 099fe4c..e6dc7f9 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -132,6 +132,30 @@ CGLM_EXPORT void glmc_vec3_minadd(vec3 a, vec3 b, vec3 dest); +CGLM_EXPORT +void +glmc_vec3_subsub(vec3 a, vec3 b, vec3 dest); + +CGLM_EXPORT +void +glmc_vec3_addsub(vec3 a, vec3 b, vec3 dest); + +CGLM_EXPORT +void +glmc_vec3_mulsub(vec3 a, vec3 b, vec3 dest); + +CGLM_EXPORT +void +glmc_vec3_mulsubs(vec3 a, float s, vec3 dest); + +CGLM_EXPORT +void +glmc_vec3_maxsub(vec3 a, vec3 b, vec3 dest); + +CGLM_EXPORT +void +glmc_vec3_minsub(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 6bda5db..549bc7b 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -133,6 +133,30 @@ CGLM_EXPORT void glmc_vec4_minadd(vec4 a, vec4 b, vec4 dest); +CGLM_EXPORT +void +glmc_vec4_subsub(vec4 a, vec4 b, vec4 dest); + +CGLM_EXPORT +void +glmc_vec4_subadd(vec4 a, vec4 b, vec4 dest); + +CGLM_EXPORT +void +glmc_vec4_mulsub(vec4 a, vec4 b, vec4 dest); + +CGLM_EXPORT +void +glmc_vec4_mulsubs(vec4 a, float s, vec4 dest); + +CGLM_EXPORT +void +glmc_vec4_maxsub(vec4 a, vec4 b, vec4 dest); + +CGLM_EXPORT +void +glmc_vec4_minsub(vec4 a, vec4 b, vec4 dest); + CGLM_EXPORT void glmc_vec4_negate(vec4 v); diff --git a/include/cglm/struct/vec2.h b/include/cglm/struct/vec2.h index d999404..33bdd9b 100644 --- a/include/cglm/struct/vec2.h +++ b/include/cglm/struct/vec2.h @@ -37,6 +37,12 @@ CGLM_INLINE vec2s glms_vec2_muladds(vec2s a, float s, vec2s dest) CGLM_INLINE vec2s glms_vec2_maxadd(vec2s a, vec2s b, vec2s dest) CGLM_INLINE vec2s glms_vec2_minadd(vec2s a, vec2s b, vec2s dest) + CGLM_INLINE vec2s glms_vec2_subsub(vec2s a, vec2s b, vec2s dest) + CGLM_INLINE vec2s glms_vec2_addsub(vec2s a, vec2s b, vec2s dest) + CGLM_INLINE vec2s glms_vec2_mulsub(vec2s a, vec2s b, vec2s dest) + CGLM_INLINE vec2s glms_vec2_mulsubs(vec2s a, float s, vec2s dest) + CGLM_INLINE vec2s glms_vec2_maxsub(vec2s a, vec2s b, vec2s dest) + CGLM_INLINE vec2s glms_vec2_minsub(vec2s a, vec2s b, vec2s dest) CGLM_INLINE vec2s glms_vec2_negate(vec2s v) CGLM_INLINE vec2s glms_vec2_normalize(vec2s v) CGLM_INLINE vec2s glms_vec2_rotate(vec2s v, float angle, vec2s axis) @@ -430,6 +436,102 @@ glms_vec2_(minadd)(vec2s a, vec2s b, vec2s dest) { return dest; } +/*! + * @brief sub two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= (a - b) + */ +CGLM_INLINE +vec2s +glms_vec2_(subsub)(vec2s a, vec2s b, vec2s dest) { + glm_vec2_subsub(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief add two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= (a + b) + */ +CGLM_INLINE +vec2s +glms_vec2_(addsub)(vec2s a, vec2s b, vec2s dest) { + glm_vec2_addsub(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief mul two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= (a * b) + */ +CGLM_INLINE +vec2s +glms_vec2_(mulsub)(vec2s a, vec2s b, vec2s dest) { + glm_vec2_mulsub(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief mul vector with scalar and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector + * @param[in] s scalar + * @returns dest -= (a * b) + */ +CGLM_INLINE +vec2s +glms_vec2_(mulsubs)(vec2s a, float s, vec2s dest) { + glm_vec2_mulsubs(a.raw, s, dest.raw); + return dest; +} + +/*! + * @brief sub max of two vectors to dest + * + * it applies += operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= max(a, b) + */ +CGLM_INLINE +vec2s +glms_vec2_(maxsub)(vec2s a, vec2s b, vec2s dest) { + glm_vec2_maxsub(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief sub min of two vectors to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= min(a, b) + */ +CGLM_INLINE +vec2s +glms_vec2_(minsub)(vec2s a, vec2s b, vec2s dest) { + glm_vec2_minsub(a.raw, b.raw, dest.raw); + return dest; +} + /*! * @brief negate vector components * diff --git a/include/cglm/struct/vec3.h b/include/cglm/struct/vec3.h index 0b9713a..6e04023 100644 --- a/include/cglm/struct/vec3.h +++ b/include/cglm/struct/vec3.h @@ -41,6 +41,12 @@ CGLM_INLINE vec3s glms_vec3_muladds(vec3s a, float s, vec3s dest); CGLM_INLINE vec3s glms_vec3_maxadd(vec3s a, vec3s b, vec3s dest); CGLM_INLINE vec3s glms_vec3_minadd(vec3s a, vec3s b, vec3s dest); + CGLM_INLINE vec3s glms_vec3_subsub(vec3s a, vec3s b, vec3s dest); + CGLM_INLINE vec3s glms_vec3_addsub(vec3s a, vec3s b, vec3s dest); + CGLM_INLINE vec3s glms_vec3_mulsub(vec3s a, vec3s b, vec3s dest); + CGLM_INLINE vec3s glms_vec3_mulsubs(vec3s a, float s, vec3s dest); + CGLM_INLINE vec3s glms_vec3_maxsub(vec3s a, vec3s b, vec3s dest); + CGLM_INLINE vec3s glms_vec3_minsub(vec3s a, vec3s b, vec3s dest); CGLM_INLINE vec3s glms_vec3_flipsign(vec3s v); CGLM_INLINE vec3s glms_vec3_negate(vec3s v); CGLM_INLINE vec3s glms_vec3_normalize(vec3s v); @@ -484,6 +490,102 @@ glms_vec3_(minadd)(vec3s a, vec3s b, vec3s dest) { return dest; } +/*! + * @brief sub two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= (a - b) + */ +CGLM_INLINE +vec3s +glms_vec3_(subsub)(vec3s a, vec3s b, vec3s dest) { + glm_vec3_subsub(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief add two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= (a + b) + */ +CGLM_INLINE +vec3s +glms_vec3_(addsub)(vec3s a, vec3s b, vec3s dest) { + glm_vec3_addsub(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief mul two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= (a * b) + */ +CGLM_INLINE +vec3s +glms_vec3_(mulsub)(vec3s a, vec3s b, vec3s dest) { + glm_vec3_mulsub(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief mul vector with scalar and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector + * @param[in] s scalar + * @returns dest -= (a * b) + */ +CGLM_INLINE +vec3s +glms_vec3_(mulsubs)(vec3s a, float s, vec3s dest) { + glm_vec3_mulsubs(a.raw, s, dest.raw); + return dest; +} + +/*! + * @brief sub max of two vectors to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= max(a, b) + */ +CGLM_INLINE +vec3s +glms_vec3_(maxsub)(vec3s a, vec3s b, vec3s dest) { + glm_vec3_maxsub(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief sub min of two vectors to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= min(a, b) + */ +CGLM_INLINE +vec3s +glms_vec3_(minsub)(vec3s a, vec3s b, vec3s dest) { + glm_vec3_minsub(a.raw, b.raw, dest.raw); + return dest; +} + /*! * @brief negate vector components and store result in dest * diff --git a/include/cglm/struct/vec4.h b/include/cglm/struct/vec4.h index 1a6b359..aef09c7 100644 --- a/include/cglm/struct/vec4.h +++ b/include/cglm/struct/vec4.h @@ -41,6 +41,12 @@ CGLM_INLINE vec4s glms_vec4_muladds(vec4s a, float s, vec4s dest); CGLM_INLINE vec4s glms_vec4_maxadd(vec4s a, vec4s b, vec4s dest); CGLM_INLINE vec4s glms_vec4_minadd(vec4s a, vec4s b, vec4s dest); + CGLM_INLINE vec4s glms_vec4_subsub(vec4s a, vec4s b, vec4s dest); + CGLM_INLINE vec4s glms_vec4_addsub(vec4s a, vec4s b, vec4s dest); + CGLM_INLINE vec4s glms_vec4_mulsub(vec4s a, vec4s b, vec4s dest); + CGLM_INLINE vec4s glms_vec4_mulsubs(vec4s a, float s, vec4s dest); + CGLM_INLINE vec4s glms_vec4_maxsub(vec4s a, vec4s b, vec4s dest); + CGLM_INLINE vec4s glms_vec4_minsub(vec4s a, vec4s b, vec4s dest); CGLM_INLINE vec4s glms_vec4_negate(vec4s v); CGLM_INLINE vec4s glms_vec4_normalize(vec4s v); CGLM_INLINE float glms_vec4_distance(vec4s a, vec4s b); @@ -513,6 +519,102 @@ glms_vec4_(minadd)(vec4s a, vec4s b, vec4s dest) { return dest; } +/*! + * @brief sub two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= (a + b) + */ +CGLM_INLINE +vec4s +glms_vec4_(subsub)(vec4s a, vec4s b, vec4s dest) { + glm_vec4_subsub(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief add two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= (a + b) + */ +CGLM_INLINE +vec4s +glms_vec4_(addsub)(vec4s a, vec4s b, vec4s dest) { + glm_vec4_addsub(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief mul two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= (a * b) + */ +CGLM_INLINE +vec4s +glms_vec4_(mulsub)(vec4s a, vec4s b, vec4s dest) { + glm_vec4_mulsub(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief mul vector with scalar and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector + * @param[in] s scalar + * @returns dest -= (a * b) + */ +CGLM_INLINE +vec4s +glms_vec4_(mulsubs)(vec4s a, float s, vec4s dest) { + glm_vec4_mulsubs(a.raw, s, dest.raw); + return dest; +} + +/*! + * @brief sub max of two vectors to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= max(a, b) + */ +CGLM_INLINE +vec4s +glms_vec4_(maxsub)(vec4s a, vec4s b, vec4s dest) { + glm_vec4_maxsub(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief sub min of two vectors to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @returns dest -= min(a, b) + */ +CGLM_INLINE +vec4s +glms_vec4_(minsub)(vec4s a, vec4s b, vec4s dest) { + glm_vec4_minsub(a.raw, b.raw, dest.raw); + return dest; +} + /*! * @brief negate vector components and store result in dest * diff --git a/include/cglm/vec2.h b/include/cglm/vec2.h index 5d5fd8a..ee5a8de 100644 --- a/include/cglm/vec2.h +++ b/include/cglm/vec2.h @@ -36,6 +36,12 @@ CGLM_INLINE void glm_vec2_muladds(vec2 a, float s, vec2 dest) CGLM_INLINE void glm_vec2_maxadd(vec2 a, vec2 b, vec2 dest) CGLM_INLINE void glm_vec2_minadd(vec2 a, vec2 b, vec2 dest) + CGLM_INLINE void glm_vec2_subsub(vec2 a, vec2 b, vec2 dest) + CGLM_INLINE void glm_vec2_addsub(vec2 a, vec2 b, vec2 dest) + CGLM_INLINE void glm_vec2_mulsub(vec2 a, vec2 b, vec2 dest) + CGLM_INLINE void glm_vec2_mulsubs(vec2 a, float s, vec2 dest) + CGLM_INLINE void glm_vec2_maxsub(vec2 a, vec2 b, vec2 dest) + CGLM_INLINE void glm_vec2_minsub(vec2 a, vec2 b, vec2 dest) CGLM_INLINE void glm_vec2_negate_to(vec2 v, vec2 dest) CGLM_INLINE void glm_vec2_negate(vec2 v) CGLM_INLINE void glm_vec2_normalize(vec2 v) @@ -403,6 +409,102 @@ glm_vec2_minadd(vec2 a, vec2 b, vec2 dest) { dest[1] += glm_min(a[1], b[1]); } +/*! + * @brief sub two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @param[out] dest dest -= (a - b) + */ +CGLM_INLINE +void +glm_vec2_subsub(vec2 a, vec2 b, vec2 dest) { + dest[0] -= a[0] - b[0]; + dest[1] -= a[1] - b[1]; +} + +/*! + * @brief add two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @param[out] dest dest -= (a + b) + */ +CGLM_INLINE +void +glm_vec2_addsub(vec2 a, vec2 b, vec2 dest) { + dest[0] -= a[0] + b[0]; + dest[1] -= a[1] + b[1]; +} + +/*! + * @brief mul two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @param[out] dest dest -= (a * b) + */ +CGLM_INLINE +void +glm_vec2_mulsub(vec2 a, vec2 b, vec2 dest) { + dest[0] -= a[0] * b[0]; + dest[1] -= a[1] * b[1]; +} + +/*! + * @brief mul vector with scalar and sub result to sum + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector + * @param[in] s scalar + * @param[out] dest dest -= (a * b) + */ +CGLM_INLINE +void +glm_vec2_mulsubs(vec2 a, float s, vec2 dest) { + dest[0] -= a[0] * s; + dest[1] -= a[1] * s; +} + +/*! + * @brief sub max of two vectors 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_vec2_maxsub(vec2 a, vec2 b, vec2 dest) { + dest[0] -= glm_max(a[0], b[0]); + dest[1] -= glm_max(a[1], b[1]); +} + +/*! + * @brief sub min of two vectors 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 -= min(a, b) + */ +CGLM_INLINE +void +glm_vec2_minsub(vec2 a, vec2 b, vec2 dest) { + dest[0] -= glm_min(a[0], b[0]); + dest[1] -= glm_min(a[1], b[1]); +} + /*! * @brief negate vector components and store result in dest * diff --git a/include/cglm/vec3.h b/include/cglm/vec3.h index c610226..569c3d2 100644 --- a/include/cglm/vec3.h +++ b/include/cglm/vec3.h @@ -40,6 +40,12 @@ 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_subsub(vec3 a, vec3 b, vec3 dest); + CGLM_INLINE void glm_vec3_addsub(vec3 a, vec3 b, vec3 dest); + CGLM_INLINE void glm_vec3_mulsub(vec3 a, vec3 b, vec3 dest); + CGLM_INLINE void glm_vec3_mulsubs(vec3 a, float s, vec3 dest); + CGLM_INLINE void glm_vec3_maxsub(vec3 a, vec3 b, vec3 dest); + CGLM_INLINE void glm_vec3_minsub(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); @@ -503,6 +509,108 @@ glm_vec3_minadd(vec3 a, vec3 b, vec3 dest) { dest[2] += glm_min(a[2], b[2]); } +/*! + * @brief sub two vectors and sub result to dest + * + * it applies += operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @param[out] dest dest -= (a - b) + */ +CGLM_INLINE +void +glm_vec3_subsub(vec3 a, vec3 b, vec3 dest) { + dest[0] -= a[0] - b[0]; + dest[1] -= a[1] - b[1]; + dest[2] -= a[2] - b[2]; +} + +/*! + * @brief add two vectors and sub result to dest + * + * it applies += operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @param[out] dest dest -= (a + b) + */ +CGLM_INLINE +void +glm_vec3_addsub(vec3 a, vec3 b, vec3 dest) { + dest[0] -= a[0] + b[0]; + dest[1] -= a[1] + b[1]; + dest[2] -= a[2] + b[2]; +} + +/*! + * @brief mul two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @param[out] dest dest -= (a * b) + */ +CGLM_INLINE +void +glm_vec3_mulsub(vec3 a, vec3 b, vec3 dest) { + dest[0] -= a[0] * b[0]; + dest[1] -= a[1] * b[1]; + dest[2] -= a[2] * b[2]; +} + +/*! + * @brief mul vector with scalar and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector + * @param[in] s scalar + * @param[out] dest dest -= (a * b) + */ +CGLM_INLINE +void +glm_vec3_mulsubs(vec3 a, float s, vec3 dest) { + dest[0] -= a[0] * s; + dest[1] -= a[1] * s; + dest[2] -= a[2] * s; +} + +/*! + * @brief sub max of two vectors 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_maxsub(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 sub min of two vectors 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 -= min(a, b) + */ +CGLM_INLINE +void +glm_vec3_minsub(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 * diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index ae99ff6..0f283ab 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -39,6 +39,12 @@ 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_subsub(vec4 a, vec4 b, vec4 dest); + CGLM_INLINE void glm_vec4_addsub(vec4 a, vec4 b, vec4 dest); + CGLM_INLINE void glm_vec4_mulsub(vec4 a, vec4 b, vec4 dest); + CGLM_INLINE void glm_vec4_mulsubs(vec4 a, float s, vec4 dest); + CGLM_INLINE void glm_vec4_maxsub(vec4 a, vec4 b, vec4 dest); + CGLM_INLINE void glm_vec4_minsub(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); @@ -698,6 +704,178 @@ glm_vec4_minadd(vec4 a, vec4 b, vec4 dest) { #endif } +/*! + * @brief sub two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @param[out] dest dest -= (a - b) + */ +CGLM_INLINE +void +glm_vec4_subsub(vec4 a, vec4 b, vec4 dest) { +#if defined(__wasm__) && defined(__wasm_simd128__) + glmm_store(dest, wasm_f32x4_sub( + glmm_load(dest), + wasm_f32x4_sub(glmm_load(a), glmm_load(b)))); +#elif defined( __SSE__ ) || defined( __SSE2__ ) + glmm_store(dest, _mm_sub_ps(glmm_load(dest), + _mm_sub_ps(glmm_load(a), + glmm_load(b)))); +#elif defined(CGLM_NEON_FP) + vst1q_f32(dest, vsubq_f32(vld1q_f32(dest), + vsubq_f32(vld1q_f32(a), + vld1q_f32(b)))); +#else + dest[0] -= a[0] - b[0]; + dest[1] -= a[1] - b[1]; + dest[2] -= a[2] - b[2]; + dest[3] -= a[3] - b[3]; +#endif +} + +/*! + * @brief add two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @param[out] dest dest -= (a + b) + */ +CGLM_INLINE +void +glm_vec4_addsub(vec4 a, vec4 b, vec4 dest) { +#if defined(__wasm__) && defined(__wasm_simd128__) + glmm_store(dest, wasm_f32x4_add( + glmm_load(dest), + wasm_f32x4_sub(glmm_load(a), glmm_load(b)))); +#elif defined( __SSE__ ) || defined( __SSE2__ ) + glmm_store(dest, _mm_add_ps(glmm_load(dest), + _mm_sub_ps(glmm_load(a), + glmm_load(b)))); +#elif defined(CGLM_NEON_FP) + vst1q_f32(dest, vaddq_f32(vld1q_f32(dest), + vsubq_f32(vld1q_f32(a), + vld1q_f32(b)))); +#else + dest[0] += a[0] - b[0]; + dest[1] += a[1] - b[1]; + dest[2] += a[2] - b[2]; + dest[3] += a[3] - b[3]; +#endif +} + +/*! + * @brief mul two vectors and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @param[out] dest dest -= (a * b) + */ +CGLM_INLINE +void +glm_vec4_mulsub(vec4 a, vec4 b, vec4 dest) { +#if defined(CGLM_SIMD) + glmm_store(dest, glmm_fmsub(glmm_load(a), glmm_load(b), glmm_load(dest))); +#else + dest[0] -= a[0] * b[0]; + dest[1] -= a[1] * b[1]; + dest[2] -= a[2] * b[2]; + dest[3] -= a[3] * b[3]; +#endif +} + +/*! + * @brief mul vector with scalar and sub result to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector + * @param[in] s scalar + * @param[out] dest dest -= (a * b) + */ +CGLM_INLINE +void +glm_vec4_mulsubs(vec4 a, float s, vec4 dest) { +#if defined(CGLM_SIMD) + glmm_store(dest, glmm_fmsub(glmm_load(a), glmm_set1(s), glmm_load(dest))); +#else + dest[0] -= a[0] * s; + dest[1] -= a[1] * s; + dest[2] -= a[2] * s; + dest[3] -= a[3] * s; +#endif +} + +/*! + * @brief sub max of two vectors to 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_maxsub(vec4 a, vec4 b, vec4 dest) { +#if defined(__wasm__) && defined(__wasm_simd128__) + glmm_store(dest, wasm_f32x4_sub( + glmm_load(dest), + wasm_f32x4_pmax(glmm_load(a), glmm_load(b)))); +#elif defined( __SSE__ ) || defined( __SSE2__ ) + glmm_store(dest, _mm_sub_ps(glmm_load(dest), + _mm_max_ps(glmm_load(a), + glmm_load(b)))); +#elif defined(CGLM_NEON_FP) + vst1q_f32(dest, vsubq_f32(vld1q_f32(dest), + vmaxq_f32(vld1q_f32(a), + vld1q_f32(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 sub min of two vectors to dest + * + * it applies -= operator so dest must be initialized + * + * @param[in] a vector 1 + * @param[in] b vector 2 + * @param[out] dest dest -= min(a, b) + */ +CGLM_INLINE +void +glm_vec4_minsub(vec4 a, vec4 b, vec4 dest) { +#if defined(__wasm__) && defined(__wasm_simd128__) + glmm_store(dest, wasm_f32x4_sub( + glmm_load(dest), + wasm_f32x4_pmin(glmm_load(a), glmm_load(b)))); +#elif defined( __SSE__ ) || defined( __SSE2__ ) + glmm_store(dest, _mm_sub_ps(glmm_load(dest), + _mm_min_ps(glmm_load(a), + glmm_load(b)))); +#elif defined(CGLM_NEON_FP) + vst1q_f32(dest, vsubq_f32(vld1q_f32(dest), + vminq_f32(vld1q_f32(a), + vld1q_f32(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 * diff --git a/src/vec2.c b/src/vec2.c index 07adf3e..bd2e526 100644 --- a/src/vec2.c +++ b/src/vec2.c @@ -164,6 +164,43 @@ glmc_vec2_minadd(vec2 a, vec2 b, vec2 dest) { glm_vec2_minadd(a, b, dest); } +CGLM_EXPORT +void +glmc_vec2_subsub(vec2 a, vec2 b, vec2 dest) { + glm_vec2_subsub(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec2_addsub(vec2 a, vec2 b, vec2 dest) { + glm_vec2_addsub(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec2_mulsub(vec2 a, vec2 b, vec2 dest) { + glm_vec2_mulsub(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec2_mulsubs(vec2 a, float s, vec2 dest) { + glm_vec2_mulsubs(a, s, dest); +} + +CGLM_EXPORT +void +glmc_vec2_maxsub(vec2 a, vec2 b, vec2 dest) { + glm_vec2_maxsub(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec2_minsub(vec2 a, vec2 b, vec2 dest) { + glm_vec2_minsub(a, b, dest); +} + + CGLM_EXPORT void glmc_vec2_negate_to(vec2 v, vec2 dest) { diff --git a/src/vec3.c b/src/vec3.c index e515e89..780f96a 100644 --- a/src/vec3.c +++ b/src/vec3.c @@ -176,6 +176,42 @@ glmc_vec3_minadd(vec3 a, vec3 b, vec3 dest) { glm_vec3_minadd(a, b, dest); } +CGLM_EXPORT +void +glmc_vec3_subsub(vec3 a, vec3 b, vec3 dest) { + glm_vec3_subsub(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec3_addsub(vec3 a, vec3 b, vec3 dest) { + glm_vec3_addsub(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec3_mulsub(vec3 a, vec3 b, vec3 dest) { + glm_vec3_mulsub(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec3_mulsubs(vec3 a, float s, vec3 dest) { + glm_vec3_mulsubs(a, s, dest); +} + +CGLM_EXPORT +void +glmc_vec3_maxsub(vec3 a, vec3 b, vec3 dest) { + glm_vec3_maxsub(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec3_minsub(vec3 a, vec3 b, vec3 dest) { + glm_vec3_minsub(a, b, dest); +} + CGLM_EXPORT void glmc_vec3_negate(vec3 v) { diff --git a/src/vec4.c b/src/vec4.c index 88ae54b..72fc407 100644 --- a/src/vec4.c +++ b/src/vec4.c @@ -176,6 +176,42 @@ glmc_vec4_minadd(vec4 a, vec4 b, vec4 dest) { glm_vec4_minadd(a, b, dest); } +CGLM_EXPORT +void +glmc_vec4_subsub(vec4 a, vec4 b, vec4 dest) { + glm_vec4_subsub(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec4_addsub(vec4 a, vec4 b, vec4 dest) { + glm_vec4_addsub(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec4_mulsub(vec4 a, vec4 b, vec4 dest) { + glm_vec4_mulsub(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec4_mulsubs(vec4 a, float s, vec4 dest) { + glm_vec4_mulsubs(a, s, dest); +} + +CGLM_EXPORT +void +glmc_vec4_maxsub(vec4 a, vec4 b, vec4 dest) { + glm_vec4_maxsub(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec4_minsub(vec4 a, vec4 b, vec4 dest) { + glm_vec4_minsub(a, b, dest); +} + CGLM_EXPORT void glmc_vec4_negate(vec4 v) { From 15f29e05eb24b2919cf41c783cea8badc659b4ac Mon Sep 17 00:00:00 2001 From: BeeverFeever Date: Mon, 4 Dec 2023 23:28:29 +1100 Subject: [PATCH 02/10] Fixed missed function --- include/cglm/call/vec4.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index 549bc7b..9585feb 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -139,7 +139,7 @@ glmc_vec4_subsub(vec4 a, vec4 b, vec4 dest); CGLM_EXPORT void -glmc_vec4_subadd(vec4 a, vec4 b, vec4 dest); +glmc_vec4_addsub(vec4 a, vec4 b, vec4 dest); CGLM_EXPORT void From f8b6573de8f023402deb49f8df700e3a35541fb5 Mon Sep 17 00:00:00 2001 From: BeeverFeever Date: Mon, 4 Dec 2023 23:28:56 +1100 Subject: [PATCH 03/10] Write tests for new functions --- test/src/test_vec2.h | 84 ++++++++++++++++++++++++++++++++++++++ test/src/test_vec3.h | 90 +++++++++++++++++++++++++++++++++++++++++ test/src/test_vec4.h | 96 ++++++++++++++++++++++++++++++++++++++++++++ test/tests.h | 18 +++++++++ 4 files changed, 288 insertions(+) diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index 0c59db2..92ab8a2 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -365,6 +365,90 @@ TEST_IMPL(GLM_PREFIX, vec2_minadd) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, vec2_subsub) { + vec2 v1 = {2.0f, -3.0f}, + v2 = {-3.0f, 4.0f}, + v3 = {1.0f, 2.0f}, + v4 = {1.0f, 2.0f}; + + GLM(vec2_subsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - v1[0] - v2[0], v4[0])) + ASSERT(test_eq(v3[1] - v1[1] - v2[1], v4[1])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec2_addsub) { + vec2 v1 = {2.0f, -3.0f}, + v2 = {-3.0f, 4.0f}, + v3 = {1.0f, 2.0f}, + v4 = {1.0f, 2.0f}; + + GLM(vec2_addsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - v1[0] + v2[0], v4[0])) + ASSERT(test_eq(v3[1] - v1[1] + v2[1], v4[1])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec2_mulsub) { + vec2 v1 = {2.0f, -3.0f}, + v2 = {-3.0f, 4.0f}, + v3 = {1.0f, 2.0f}, + v4 = {1.0f, 2.0f}; + + GLM(vec2_mulsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - v1[0] * v2[0], v4[0])) + ASSERT(test_eq(v3[1] - v1[1] * v2[1], v4[1])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec2_mulsubs) { + vec2 v1 = {2.0f, -3.0f}, + v2 = {1.0f, 2.0f}, + v3 = {1.0f, 2.0f}; + float s = 9.0f; + + GLM(vec2_mulsubs)(v1, s, v3); + + ASSERT(test_eq(v2[0] - v1[0] * s, v3[0])) + ASSERT(test_eq(v2[1] - v1[1] * s, v3[1])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec2_maxsub) { + vec2 v1 = {2.0f, -3.0f}, + v2 = {-3.0f, 4.0f}, + v3 = {1.0f, 2.0f}, + v4 = {1.0f, 2.0f}; + + GLM(vec2_maxsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - glm_max(v1[0], v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - glm_max(v1[1], v2[1]), v4[1])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec2_minsub) { + vec2 v1 = {2.0f, -3.0f}, + v2 = {-3.0f, 4.0f}, + v3 = {1.0f, 2.0f}, + v4 = {1.0f, 2.0f}; + + GLM(vec2_minsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - glm_min(v1[0], v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - glm_min(v1[1], v2[1]), v4[1])) + + TEST_SUCCESS +} + TEST_IMPL(GLM_PREFIX, vec2_negate_to) { vec2 v1 = {2.0f, -3.0f}, v2 = {-3.0f, 4.0f}, diff --git a/test/src/test_vec3.h b/test/src/test_vec3.h index bc908cd..800f8c9 100644 --- a/test/src/test_vec3.h +++ b/test/src/test_vec3.h @@ -567,6 +567,96 @@ TEST_IMPL(GLM_PREFIX, vec3_minadd) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, vec3_subsub) { + vec3 v1 = {2.0f, -3.0f, 4.0f}, + v2 = {-3.0f, 4.0f, -5.0f}, + v3 = {1.0f, 2.0f, 3.0f}, + v4 = {1.0f, 2.0f, 3.0f}; + + GLM(vec3_subsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - v1[0] - v2[0], v4[0])) + ASSERT(test_eq(v3[1] - v1[1] - v2[1], v4[1])) + ASSERT(test_eq(v3[2] - v1[2] - v2[2], v4[2])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec3_addsub) { + vec3 v1 = {2.0f, -3.0f, 4.0f}, + v2 = {-3.0f, 4.0f, -5.0f}, + v3 = {1.0f, 2.0f, 3.0f}, + v4 = {1.0f, 2.0f, 3.0f}; + + GLM(vec3_addsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - v1[0] + v2[0], v4[0])) + ASSERT(test_eq(v3[1] - v1[1] + v2[1], v4[1])) + ASSERT(test_eq(v3[2] - v1[2] + v2[2], v4[2])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec3_mulsub) { + vec3 v1 = {2.0f, -3.0f, 4.0f}, + v2 = {-3.0f, 4.0f, -5.0f}, + v3 = {1.0f, 2.0f, 3.0f}, + v4 = {1.0f, 2.0f, 3.0f}; + + GLM(vec3_mulsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - v1[0] * v2[0], v4[0])) + ASSERT(test_eq(v3[1] - v1[1] * v2[1], v4[1])) + ASSERT(test_eq(v3[2] - v1[2] * v2[2], v4[2])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec3_mulsubs) { + vec3 v1 = {2.0f, -3.0f, 4.0f}, + v2 = {1.0f, 2.0f, 3.0f}, + v3 = {1.0f, 2.0f, 3.0f}; + float s = 9.0f; + + GLM(vec3_mulsubs)(v1, s, v3); + + ASSERT(test_eq(v2[0] - v1[0] * s, v3[0])) + ASSERT(test_eq(v2[1] - v1[1] * s, v3[1])) + ASSERT(test_eq(v2[2] - v1[2] * s, v3[2])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec3_maxsub) { + vec3 v1 = {2.0f, -3.0f, 4.0f}, + v2 = {-3.0f, 4.0f, -5.0f}, + v3 = {1.0f, 2.0f, 3.0f}, + v4 = {1.0f, 2.0f, 3.0f}; + + GLM(vec3_maxsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - glm_max(v1[0], v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - glm_max(v1[1], v2[1]), v4[1])) + ASSERT(test_eq(v3[2] - glm_max(v1[2], v2[2]), v4[2])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec3_minsub) { + vec3 v1 = {2.0f, -3.0f, 4.0f}, + v2 = {-3.0f, 4.0f, -5.0f}, + v3 = {1.0f, 2.0f, 3.0f}, + v4 = {1.0f, 2.0f, 3.0f}; + + GLM(vec3_minsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - glm_min(v1[0], v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - glm_min(v1[1], v2[1]), v4[1])) + ASSERT(test_eq(v3[2] - glm_min(v1[2], v2[2]), v4[2])) + + TEST_SUCCESS +} + TEST_IMPL(GLM_PREFIX, vec3_negate_to) { vec3 v1 = {2.0f, -3.0f, 4.0f}, v2 = {-3.0f, 4.0f, -5.0f}, diff --git a/test/src/test_vec4.h b/test/src/test_vec4.h index 5684e2d..3573baf 100644 --- a/test/src/test_vec4.h +++ b/test/src/test_vec4.h @@ -554,6 +554,102 @@ TEST_IMPL(GLM_PREFIX, vec4_minadd) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, vec4_subsub) { + vec4 v1 = {2.0f, -3.0f, 4.0f, 4.0f}, + v2 = {-3.0f, 4.0f, -5.0f, 20.0f}, + v3 = {1.0f, 2.0f, 3.0f, 130.0f}, + v4 = {1.0f, 2.0f, 3.0f, 130.0f}; + + GLM(vec4_subsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - v1[0] - v2[0], v4[0])) + ASSERT(test_eq(v3[1] - v1[1] - v2[1], v4[1])) + ASSERT(test_eq(v3[2] - v1[2] - v2[2], v4[2])) + ASSERT(test_eq(v3[3] - v1[3] - v2[3], v4[3])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec4_addsub) { + vec4 v1 = {2.0f, -3.0f, 4.0f, 4.0f}, + v2 = {-3.0f, 4.0f, -5.0f, 20.0f}, + v3 = {1.0f, 2.0f, 3.0f, 130.0f}, + v4 = {1.0f, 2.0f, 3.0f, 130.0f}; + + GLM(vec4_addsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - v1[0] + v2[0], v4[0])) + ASSERT(test_eq(v3[1] - v1[1] + v2[1], v4[1])) + ASSERT(test_eq(v3[2] - v1[2] + v2[2], v4[2])) + ASSERT(test_eq(v3[3] - v1[3] + v2[3], v4[3])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec4_mulsub) { + vec4 v1 = {2.0f, -3.0f, 4.0f, 4.0f}, + v2 = {-3.0f, 4.0f, -5.0f, 20.0f}, + v3 = {1.0f, 2.0f, 3.0f, 130.0f}, + v4 = {1.0f, 2.0f, 3.0f, 130.0f}; + + GLM(vec4_mulsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - v1[0] * v2[0], v4[0])) + ASSERT(test_eq(v3[1] - v1[1] * v2[1], v4[1])) + ASSERT(test_eq(v3[2] - v1[2] * v2[2], v4[2])) + ASSERT(test_eq(v3[3] - v1[3] * v2[3], v4[3])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec4_mulsubs) { + vec4 v1 = {2.0f, -3.0f, 4.0f, 4.0f}, + v2 = {-3.0f, 4.0f, -5.0f, 20.0f}, + v3 = {-3.0f, 4.0f, -5.0f, 20.0f}; + float s = 9.0f; + + GLM(vec4_mulsubs)(v1, s, v3); + + ASSERT(test_eq(v2[0] - v1[0] * s, v3[0])) + ASSERT(test_eq(v2[1] - v1[1] * s, v3[1])) + ASSERT(test_eq(v2[2] - v1[2] * s, v3[2])) + ASSERT(test_eq(v2[3] - v1[3] * s, v3[3])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec4_maxsub) { + vec4 v1 = {2.0f, -3.0f, 4.0f, 4.0f}, + v2 = {-3.0f, 4.0f, -5.0f, 20.0f}, + v3 = {1.0f, 2.0f, 3.0f, 130.0f}, + v4 = {1.0f, 2.0f, 3.0f, 130.0f}; + + GLM(vec4_maxsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - glm_max(v1[0], v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - glm_max(v1[1], v2[1]), v4[1])) + ASSERT(test_eq(v3[2] - glm_max(v1[2], v2[2]), v4[2])) + ASSERT(test_eq(v3[3] - glm_max(v1[3], v2[3]), v4[3])) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec4_minsub) { + vec4 v1 = {2.0f, -3.0f, 4.0f, 4.0f}, + v2 = {-3.0f, 4.0f, -5.0f, 20.0f}, + v3 = {1.0f, 2.0f, 3.0f, 130.0f}, + v4 = {1.0f, 2.0f, 3.0f, 130.0f}; + + GLM(vec4_minsub)(v1, v2, v4); + + ASSERT(test_eq(v3[0] - glm_min(v1[0], v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - glm_min(v1[1], v2[1]), v4[1])) + ASSERT(test_eq(v3[2] - glm_min(v1[2], v2[2]), v4[2])) + ASSERT(test_eq(v3[3] - glm_min(v1[3], v2[3]), v4[3])) + + TEST_SUCCESS +} + TEST_IMPL(GLM_PREFIX, vec4_negate_to) { vec4 v1 = {2.0f, -3.0f, 4.0f, 60.0f}, v2 = {-3.0f, 4.0f, -5.0f, 34.0f}, diff --git a/test/tests.h b/test/tests.h index d32ec40..56723b1 100644 --- a/test/tests.h +++ b/test/tests.h @@ -480,6 +480,12 @@ TEST_DECLARE(glm_vec2_muladd) TEST_DECLARE(glm_vec2_muladds) TEST_DECLARE(glm_vec2_maxadd) TEST_DECLARE(glm_vec2_minadd) +TEST_DECLARE(glm_vec2_subsub) +TEST_DECLARE(glm_vec2_addsub) +TEST_DECLARE(glm_vec2_mulsub) +TEST_DECLARE(glm_vec2_mulsubs) +TEST_DECLARE(glm_vec2_maxsub) +TEST_DECLARE(glm_vec2_minsub) TEST_DECLARE(glm_vec2_negate_to) TEST_DECLARE(glm_vec2_negate) TEST_DECLARE(glm_vec2_normalize) @@ -584,6 +590,12 @@ TEST_DECLARE(glm_vec3_muladd) TEST_DECLARE(glm_vec3_muladds) TEST_DECLARE(glm_vec3_maxadd) TEST_DECLARE(glm_vec3_minadd) +TEST_DECLARE(glm_vec3_subsub) +TEST_DECLARE(glm_vec3_addsub) +TEST_DECLARE(glm_vec3_mulsub) +TEST_DECLARE(glm_vec3_mulsubs) +TEST_DECLARE(glm_vec3_maxsub) +TEST_DECLARE(glm_vec3_minsub) TEST_DECLARE(glm_vec3_negate_to) TEST_DECLARE(glm_vec3_negate) TEST_DECLARE(glm_vec3_normalize) @@ -745,6 +757,12 @@ TEST_DECLARE(glm_vec4_muladd) TEST_DECLARE(glm_vec4_muladds) TEST_DECLARE(glm_vec4_maxadd) TEST_DECLARE(glm_vec4_minadd) +TEST_DECLARE(glm_vec4_subsub) +TEST_DECLARE(glm_vec4_addsub) +TEST_DECLARE(glm_vec4_mulsub) +TEST_DECLARE(glm_vec4_mulsubs) +TEST_DECLARE(glm_vec4_maxsub) +TEST_DECLARE(glm_vec4_minsub) TEST_DECLARE(glm_vec4_negate_to) TEST_DECLARE(glm_vec4_negate) TEST_DECLARE(glm_vec4_normalize) From 39602ef4d7bcae546dac10513381a6077255aee5 Mon Sep 17 00:00:00 2001 From: BeeverFeever Date: Tue, 5 Dec 2023 18:49:10 +1100 Subject: [PATCH 04/10] Fix vec4 functions --- include/cglm/vec4.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index 0f283ab..8e5bba6 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -761,10 +761,10 @@ glm_vec4_addsub(vec4 a, vec4 b, vec4 dest) { vsubq_f32(vld1q_f32(a), vld1q_f32(b)))); #else - dest[0] += a[0] - b[0]; - dest[1] += a[1] - b[1]; - dest[2] += a[2] - b[2]; - dest[3] += a[3] - b[3]; + dest[0] -= a[0] + b[0]; + dest[1] -= a[1] + b[1]; + dest[2] -= a[2] + b[2]; + dest[3] -= a[3] + b[3]; #endif } @@ -781,7 +781,7 @@ CGLM_INLINE void glm_vec4_mulsub(vec4 a, vec4 b, vec4 dest) { #if defined(CGLM_SIMD) - glmm_store(dest, glmm_fmsub(glmm_load(a), glmm_load(b), glmm_load(dest))); + glmm_store(dest, glmm_fnmsub(glmm_load(a), glmm_load(b), glmm_load(dest))); #else dest[0] -= a[0] * b[0]; dest[1] -= a[1] * b[1]; @@ -803,7 +803,7 @@ CGLM_INLINE void glm_vec4_mulsubs(vec4 a, float s, vec4 dest) { #if defined(CGLM_SIMD) - glmm_store(dest, glmm_fmsub(glmm_load(a), glmm_set1(s), glmm_load(dest))); + glmm_store(dest, glmm_fnmsub(glmm_load(a), glmm_set1(s), glmm_load(dest))); #else dest[0] -= a[0] * s; dest[1] -= a[1] * s; From 22140d8e1bef1bbb3c6f765d7f7eb820d2d2c349 Mon Sep 17 00:00:00 2001 From: BeeverFeever Date: Tue, 5 Dec 2023 19:48:54 +1100 Subject: [PATCH 05/10] Fix test --- test/src/test_vec4.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/src/test_vec4.h b/test/src/test_vec4.h index 3573baf..8a89f6b 100644 --- a/test/src/test_vec4.h +++ b/test/src/test_vec4.h @@ -562,10 +562,10 @@ TEST_IMPL(GLM_PREFIX, vec4_subsub) { GLM(vec4_subsub)(v1, v2, v4); - ASSERT(test_eq(v3[0] - v1[0] - v2[0], v4[0])) - ASSERT(test_eq(v3[1] - v1[1] - v2[1], v4[1])) - ASSERT(test_eq(v3[2] - v1[2] - v2[2], v4[2])) - ASSERT(test_eq(v3[3] - v1[3] - v2[3], v4[3])) + ASSERT(test_eq(v3[0] - (v1[0] - v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - (v1[1] - v2[1]), v4[1])) + ASSERT(test_eq(v3[2] - (v1[2] - v2[2]), v4[2])) + ASSERT(test_eq(v3[3] - (v1[3] - v2[3]), v4[3])) TEST_SUCCESS } From 865faad116cfda4e284b1625a73d096339b10240 Mon Sep 17 00:00:00 2001 From: BeeverFeever Date: Sun, 10 Dec 2023 15:49:59 +1100 Subject: [PATCH 06/10] Fix simd versions --- include/cglm/vec4.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index 8e5bba6..1ce7317 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -749,16 +749,16 @@ CGLM_INLINE void glm_vec4_addsub(vec4 a, vec4 b, vec4 dest) { #if defined(__wasm__) && defined(__wasm_simd128__) - glmm_store(dest, wasm_f32x4_add( + glmm_store(dest, wasm_f32x4_sub( glmm_load(dest), - wasm_f32x4_sub(glmm_load(a), glmm_load(b)))); + wasm_f32x4_add(glmm_load(a), glmm_load(b)))); #elif defined( __SSE__ ) || defined( __SSE2__ ) - glmm_store(dest, _mm_add_ps(glmm_load(dest), - _mm_sub_ps(glmm_load(a), + glmm_store(dest, _mm_sub_ps(glmm_load(dest), + _mm_add_ps(glmm_load(a), glmm_load(b)))); #elif defined(CGLM_NEON_FP) - vst1q_f32(dest, vaddq_f32(vld1q_f32(dest), - vsubq_f32(vld1q_f32(a), + vst1q_f32(dest, vsubq_f32(vld1q_f32(dest), + vaddq_f32(vld1q_f32(a), vld1q_f32(b)))); #else dest[0] -= a[0] + b[0]; From 8a1d1cf35df973612d17f203355d2c545a7f7de7 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sun, 10 Dec 2023 10:06:36 +0300 Subject: [PATCH 07/10] fix glmm_fmsub() on arm-neon --- include/cglm/simd/arm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/cglm/simd/arm.h b/include/cglm/simd/arm.h index 328c7e3..1a7c2ea 100644 --- a/include/cglm/simd/arm.h +++ b/include/cglm/simd/arm.h @@ -177,7 +177,7 @@ glmm_fmsub(float32x4_t a, float32x4_t b, float32x4_t c) { #if CGLM_ARM64 return vfmsq_f32(c, a, b); #else - return vmlsq_f32(c, a, b); + return vmlsq_f32(vnegq_f32(c), a, b); #endif } From 4c4a69ddfe1f673aea363b93abcf6a473e8ca53c Mon Sep 17 00:00:00 2001 From: BeeverFeever Date: Mon, 11 Dec 2023 01:08:10 +1100 Subject: [PATCH 08/10] Should be all --- include/cglm/vec4.h | 4 ++-- test/src/test_vec2.h | 8 ++++---- test/src/test_vec3.h | 12 ++++++------ test/src/test_vec4.h | 26 +++++++++++++------------- test/tests.h | 18 ++++++++++++++++++ 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index 1ce7317..fef1e7d 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -781,7 +781,7 @@ CGLM_INLINE void glm_vec4_mulsub(vec4 a, vec4 b, vec4 dest) { #if defined(CGLM_SIMD) - glmm_store(dest, glmm_fnmsub(glmm_load(a), glmm_load(b), glmm_load(dest))); + glmm_store(dest, glmm_fnmadd(glmm_load(a), glmm_load(b), glmm_load(dest))); #else dest[0] -= a[0] * b[0]; dest[1] -= a[1] * b[1]; @@ -803,7 +803,7 @@ CGLM_INLINE void glm_vec4_mulsubs(vec4 a, float s, vec4 dest) { #if defined(CGLM_SIMD) - glmm_store(dest, glmm_fnmsub(glmm_load(a), glmm_set1(s), glmm_load(dest))); + glmm_store(dest, glmm_fnmadd(glmm_load(a), glmm_set1(s), glmm_load(dest))); #else dest[0] -= a[0] * s; dest[1] -= a[1] * s; diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index 92ab8a2..aa75b1c 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -373,8 +373,8 @@ TEST_IMPL(GLM_PREFIX, vec2_subsub) { GLM(vec2_subsub)(v1, v2, v4); - ASSERT(test_eq(v3[0] - v1[0] - v2[0], v4[0])) - ASSERT(test_eq(v3[1] - v1[1] - v2[1], v4[1])) + ASSERT(test_eq(v3[0] - (v1[0] - v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - (v1[1] - v2[1]), v4[1])) TEST_SUCCESS } @@ -387,8 +387,8 @@ TEST_IMPL(GLM_PREFIX, vec2_addsub) { GLM(vec2_addsub)(v1, v2, v4); - ASSERT(test_eq(v3[0] - v1[0] + v2[0], v4[0])) - ASSERT(test_eq(v3[1] - v1[1] + v2[1], v4[1])) + ASSERT(test_eq(v3[0] - (v1[0] + v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - (v1[1] + v2[1]), v4[1])) TEST_SUCCESS } diff --git a/test/src/test_vec3.h b/test/src/test_vec3.h index 800f8c9..65570c0 100644 --- a/test/src/test_vec3.h +++ b/test/src/test_vec3.h @@ -575,9 +575,9 @@ TEST_IMPL(GLM_PREFIX, vec3_subsub) { GLM(vec3_subsub)(v1, v2, v4); - ASSERT(test_eq(v3[0] - v1[0] - v2[0], v4[0])) - ASSERT(test_eq(v3[1] - v1[1] - v2[1], v4[1])) - ASSERT(test_eq(v3[2] - v1[2] - v2[2], v4[2])) + ASSERT(test_eq(v3[0] - (v1[0] - v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - (v1[1] - v2[1]), v4[1])) + ASSERT(test_eq(v3[2] - (v1[2] - v2[2]), v4[2])) TEST_SUCCESS } @@ -590,9 +590,9 @@ TEST_IMPL(GLM_PREFIX, vec3_addsub) { GLM(vec3_addsub)(v1, v2, v4); - ASSERT(test_eq(v3[0] - v1[0] + v2[0], v4[0])) - ASSERT(test_eq(v3[1] - v1[1] + v2[1], v4[1])) - ASSERT(test_eq(v3[2] - v1[2] + v2[2], v4[2])) + ASSERT(test_eq(v3[0] - (v1[0] + v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - (v1[1] + v2[1]), v4[1])) + ASSERT(test_eq(v3[2] - (v1[2] + v2[2]), v4[2])) TEST_SUCCESS } diff --git a/test/src/test_vec4.h b/test/src/test_vec4.h index 8a89f6b..cf73b67 100644 --- a/test/src/test_vec4.h +++ b/test/src/test_vec4.h @@ -578,10 +578,10 @@ TEST_IMPL(GLM_PREFIX, vec4_addsub) { GLM(vec4_addsub)(v1, v2, v4); - ASSERT(test_eq(v3[0] - v1[0] + v2[0], v4[0])) - ASSERT(test_eq(v3[1] - v1[1] + v2[1], v4[1])) - ASSERT(test_eq(v3[2] - v1[2] + v2[2], v4[2])) - ASSERT(test_eq(v3[3] - v1[3] + v2[3], v4[3])) + ASSERT(test_eq(v3[0] - (v1[0] + v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - (v1[1] + v2[1]), v4[1])) + ASSERT(test_eq(v3[2] - (v1[2] + v2[2]), v4[2])) + ASSERT(test_eq(v3[3] - (v1[3] + v2[3]), v4[3])) TEST_SUCCESS } @@ -594,11 +594,11 @@ TEST_IMPL(GLM_PREFIX, vec4_mulsub) { GLM(vec4_mulsub)(v1, v2, v4); - ASSERT(test_eq(v3[0] - v1[0] * v2[0], v4[0])) - ASSERT(test_eq(v3[1] - v1[1] * v2[1], v4[1])) - ASSERT(test_eq(v3[2] - v1[2] * v2[2], v4[2])) - ASSERT(test_eq(v3[3] - v1[3] * v2[3], v4[3])) - + ASSERT(test_eq(v3[0] - (v1[0] * v2[0]), v4[0])) + ASSERT(test_eq(v3[1] - (v1[1] * v2[1]), v4[1])) + ASSERT(test_eq(v3[2] - (v1[2] * v2[2]), v4[2])) + ASSERT(test_eq(v3[3] - (v1[3] * v2[3]), v4[3])) + TEST_SUCCESS } @@ -610,10 +610,10 @@ TEST_IMPL(GLM_PREFIX, vec4_mulsubs) { GLM(vec4_mulsubs)(v1, s, v3); - ASSERT(test_eq(v2[0] - v1[0] * s, v3[0])) - ASSERT(test_eq(v2[1] - v1[1] * s, v3[1])) - ASSERT(test_eq(v2[2] - v1[2] * s, v3[2])) - ASSERT(test_eq(v2[3] - v1[3] * s, v3[3])) + ASSERT(test_eq(v2[0] - (v1[0] * s), v3[0])) + ASSERT(test_eq(v2[1] - (v1[1] * s), v3[1])) + ASSERT(test_eq(v2[2] - (v1[2] * s), v3[2])) + ASSERT(test_eq(v2[3] - (v1[3] * s), v3[3])) TEST_SUCCESS } diff --git a/test/tests.h b/test/tests.h index 56723b1..00b053a 100644 --- a/test/tests.h +++ b/test/tests.h @@ -1475,6 +1475,12 @@ TEST_LIST { TEST_ENTRY(glm_vec2_muladds) TEST_ENTRY(glm_vec2_maxadd) TEST_ENTRY(glm_vec2_minadd) + TEST_ENTRY(glm_vec2_subsub) + TEST_ENTRY(glm_vec2_addsub) + TEST_ENTRY(glm_vec2_mulsub) + TEST_ENTRY(glm_vec2_mulsubs) + TEST_ENTRY(glm_vec2_maxsub) + TEST_ENTRY(glm_vec2_minsub) TEST_ENTRY(glm_vec2_negate_to) TEST_ENTRY(glm_vec2_negate) TEST_ENTRY(glm_vec2_normalize) @@ -1577,6 +1583,12 @@ TEST_LIST { TEST_ENTRY(glm_vec3_muladds) TEST_ENTRY(glm_vec3_maxadd) TEST_ENTRY(glm_vec3_minadd) + TEST_ENTRY(glm_vec3_subsub) + TEST_ENTRY(glm_vec3_addsub) + TEST_ENTRY(glm_vec3_mulsub) + TEST_ENTRY(glm_vec3_mulsubs) + TEST_ENTRY(glm_vec3_maxsub) + TEST_ENTRY(glm_vec3_minsub) TEST_ENTRY(glm_vec3_negate_to) TEST_ENTRY(glm_vec3_negate) TEST_ENTRY(glm_vec3_normalize) @@ -1738,6 +1750,12 @@ TEST_LIST { TEST_ENTRY(glm_vec4_muladds) TEST_ENTRY(glm_vec4_maxadd) TEST_ENTRY(glm_vec4_minadd) + TEST_ENTRY(glm_vec4_subsub) + TEST_ENTRY(glm_vec4_addsub) + TEST_ENTRY(glm_vec4_mulsub) + TEST_ENTRY(glm_vec4_mulsubs) + TEST_ENTRY(glm_vec4_maxsub) + TEST_ENTRY(glm_vec4_minsub) TEST_ENTRY(glm_vec4_negate_to) TEST_ENTRY(glm_vec4_negate) TEST_ENTRY(glm_vec4_normalize) From dd9235dfee81ee2136d50361ce6ef581591daf71 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sun, 10 Dec 2023 17:13:11 +0300 Subject: [PATCH 09/10] fix glmm_fmsub() on arm-neon --- include/cglm/simd/arm.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/cglm/simd/arm.h b/include/cglm/simd/arm.h index 1a7c2ea..0cfa63f 100644 --- a/include/cglm/simd/arm.h +++ b/include/cglm/simd/arm.h @@ -175,9 +175,9 @@ static inline float32x4_t glmm_fmsub(float32x4_t a, float32x4_t b, float32x4_t c) { #if CGLM_ARM64 - return vfmsq_f32(c, a, b); + return vfmsq_f32(c, vnegq_f32(a), b); #else - return vmlsq_f32(vnegq_f32(c), a, b); + return vmlsq_f32(c, vnegq_f32(a), b); #endif } From 673263265ba9bbdd4e210489ce08b35b05bdc7c6 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sun, 10 Dec 2023 20:28:39 +0300 Subject: [PATCH 10/10] fix glmm_fmsub() on arm-neon --- include/cglm/simd/arm.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/include/cglm/simd/arm.h b/include/cglm/simd/arm.h index 0cfa63f..1adc735 100644 --- a/include/cglm/simd/arm.h +++ b/include/cglm/simd/arm.h @@ -174,11 +174,7 @@ glmm_fnmadd(float32x4_t a, float32x4_t b, float32x4_t c) { static inline float32x4_t glmm_fmsub(float32x4_t a, float32x4_t b, float32x4_t c) { -#if CGLM_ARM64 - return vfmsq_f32(c, vnegq_f32(a), b); -#else - return vmlsq_f32(c, vnegq_f32(a), b); -#endif + return glmm_fmadd(vnegq_f32(c), a, b); } static inline