From 63eaee504988d547fe17d59e86debebbff7af381 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sun, 17 Dec 2017 16:55:04 +0300 Subject: [PATCH] vec: implement min and max --- include/cglm/call/vec3.h | 8 +++++ include/cglm/call/vec4.h | 8 +++++ include/cglm/vec3.h | 54 +++++++++++++++++++++++++++++++++ include/cglm/vec4-ext.h | 1 + include/cglm/vec4.h | 64 ++++++++++++++++++++++++++++++++++++++++ include/cglm/version.h | 2 +- src/vec3.c | 12 ++++++++ src/vec4.c | 12 ++++++++ 8 files changed, 160 insertions(+), 1 deletion(-) diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index 0a8901e..a637d7e 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -96,6 +96,14 @@ CGLM_EXPORT float glmc_vec_distance(vec3 v1, vec3 v2); +CGLM_EXPORT +void +glmc_vec_maxv(vec3 v1, vec3 v2, vec3 dest); + +CGLM_EXPORT +void +glmc_vec_minv(vec3 v1, vec3 v2, vec3 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index 3b0b95e..084fce2 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -77,6 +77,14 @@ CGLM_EXPORT float glmc_vec4_distance(vec4 v1, vec4 v2); +CGLM_EXPORT +void +glmc_vec4_maxv(vec4 v1, vec4 v2, vec4 dest); + +CGLM_EXPORT +void +glmc_vec4_minv(vec4 v1, vec4 v2, vec4 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/vec3.h b/include/cglm/vec3.h index 64a0aaa..e6dff8f 100644 --- a/include/cglm/vec3.h +++ b/include/cglm/vec3.h @@ -40,6 +40,8 @@ CGLM_INLINE void glm_vec_rotate_m4(mat4 m, vec3 v, vec3 dest); CGLM_INLINE void glm_vec_proj(vec3 a, vec3 b, vec3 dest); CGLM_INLINE void glm_vec_center(vec3 v1, vec3 v2, vec3 dest); + CGLM_INLINE void glm_vec_maxv(vec3 v1, vec3 v2, vec3 dest); + CGLM_INLINE void glm_vec_minv(vec3 v1, vec3 v2, vec3 dest); */ #ifndef cglm_vec3_h @@ -402,4 +404,56 @@ glm_vec_distance(vec3 v1, vec3 v2) { + glm_pow2(v2[2] - v1[2])); } +/*! + * @brief max values of vectors + * + * @param[in] v1 vector1 + * @param[in] v2 vector2 + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec_maxv(vec3 v1, vec3 v2, vec3 dest) { + if (v1[0] > v2[0]) + dest[0] = v1[0]; + else + dest[0] = v2[0]; + + if (v1[1] > v2[1]) + dest[1] = v1[1]; + else + dest[1] = v2[1]; + + if (v1[2] > v2[2]) + dest[2] = v1[2]; + else + dest[2] = v2[2]; +} + +/*! + * @brief min values of vectors + * + * @param[in] v1 vector1 + * @param[in] v2 vector2 + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec_minv(vec3 v1, vec3 v2, vec3 dest) { + if (v1[0] < v2[0]) + dest[0] = v1[0]; + else + dest[0] = v2[0]; + + if (v1[1] < v2[1]) + dest[1] = v1[1]; + else + dest[1] = v2[1]; + + if (v1[2] < v2[2]) + dest[2] = v1[2]; + else + dest[2] = v2[2]; +} + #endif /* cglm_vec3_h */ diff --git a/include/cglm/vec4-ext.h b/include/cglm/vec4-ext.h index 0e6e59e..6410e41 100644 --- a/include/cglm/vec4-ext.h +++ b/include/cglm/vec4-ext.h @@ -26,6 +26,7 @@ #define cglm_vec4_ext_h #include "common.h" +#include "vec3-ext.h" #include #include #include diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index 5a01a95..9417aec 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -35,6 +35,8 @@ CGLM_INLINE void glm_vec4_normalize(vec4 v); CGLM_INLINE void glm_vec4_normalize_to(vec4 vec, vec4 dest); CGLM_INLINE float glm_vec4_distance(vec4 v1, vec4 v2); + CGLM_INLINE void glm_vec4_maxv(vec4 v1, vec4 v2, vec4 dest); + CGLM_INLINE void glm_vec4_minv(vec4 v1, vec4 v2, vec4 dest); */ #ifndef cglm_vec4_h @@ -318,4 +320,66 @@ glm_vec4_distance(vec4 v1, vec4 v2) { + glm_pow2(v2[3] - v1[3])); } +/*! + * @brief max values of vectors + * + * @param[in] v1 vector1 + * @param[in] v2 vector2 + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec4_maxv(vec4 v1, vec4 v2, vec4 dest) { + if (v1[0] > v2[0]) + dest[0] = v1[0]; + else + dest[0] = v2[0]; + + if (v1[1] > v2[1]) + dest[1] = v1[1]; + else + dest[1] = v2[1]; + + if (v1[2] > v2[2]) + dest[2] = v1[2]; + else + dest[2] = v2[2]; + + if (v1[3] > v2[3]) + dest[3] = v1[3]; + else + dest[3] = v2[3]; +} + +/*! + * @brief min values of vectors + * + * @param[in] v1 vector1 + * @param[in] v2 vector2 + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec4_minv(vec4 v1, vec4 v2, vec4 dest) { + if (v1[0] < v2[0]) + dest[0] = v1[0]; + else + dest[0] = v2[0]; + + if (v1[1] < v2[1]) + dest[1] = v1[1]; + else + dest[1] = v2[1]; + + if (v1[2] < v2[2]) + dest[2] = v1[2]; + else + dest[2] = v2[2]; + + if (v1[3] < v2[3]) + dest[3] = v1[3]; + else + dest[3] = v2[3]; +} + #endif /* cglm_vec4_h */ diff --git a/include/cglm/version.h b/include/cglm/version.h index 7cf6459..7542985 100644 --- a/include/cglm/version.h +++ b/include/cglm/version.h @@ -10,6 +10,6 @@ #define CGLM_VERSION_MAJOR 0 #define CGLM_VERSION_MINOR 3 -#define CGLM_VERSION_PATCH 1 +#define CGLM_VERSION_PATCH 2 #endif /* cglm_version_h */ diff --git a/src/vec3.c b/src/vec3.c index 1b617b7..f377d88 100644 --- a/src/vec3.c +++ b/src/vec3.c @@ -127,3 +127,15 @@ float glmc_vec_distance(vec3 v1, vec3 v2) { return glm_vec_distance(v1, v2); } + +CGLM_EXPORT +void +glmc_vec_maxv(vec3 v1, vec3 v2, vec3 dest) { + glm_vec_minv(v1, v2, dest); +} + +CGLM_EXPORT +void +glmc_vec_minv(vec3 v1, vec3 v2, vec3 dest) { + glm_vec_maxv(v1, v2, dest); +} diff --git a/src/vec4.c b/src/vec4.c index 4d1624a..279652d 100644 --- a/src/vec4.c +++ b/src/vec4.c @@ -97,3 +97,15 @@ float glmc_vec4_distance(vec4 v1, vec4 v2) { return glm_vec4_distance(v1, v2); } + +CGLM_EXPORT +void +glmc_vec4_maxv(vec4 v1, vec4 v2, vec4 dest) { + glm_vec4_minv(v1, v2, dest); +} + +CGLM_EXPORT +void +glmc_vec4_minv(vec4 v1, vec4 v2, vec4 dest) { + glm_vec4_maxv(v1, v2, dest); +}