From 090f940f502c9ef0e9309e5f015629334a0120d8 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sat, 20 Jan 2018 18:38:26 +0300 Subject: [PATCH] swizzle support --- include/cglm/common.h | 3 +++ include/cglm/vec3.h | 27 +++++++++++++++++++++++++++ include/cglm/vec4.h | 29 +++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/include/cglm/common.h b/include/cglm/common.h index f0eb965..84a09b6 100644 --- a/include/cglm/common.h +++ b/include/cglm/common.h @@ -54,6 +54,9 @@ #define glm__memzero(type, dest, size) glm__memset(type, dest, size, 0) +#define GLM_SHUFFLE4(z, y, x, w) (((z) << 6) | ((y) << 4) | ((x) << 2) | (w)) +#define GLM_SHUFFLE3(z, y, x) (((z) << 4) | ((y) << 2) | (x)) + #include "types.h" #include "simd/intrin.h" diff --git a/include/cglm/vec3.h b/include/cglm/vec3.h index ebcedcf..e5559e1 100644 --- a/include/cglm/vec3.h +++ b/include/cglm/vec3.h @@ -44,6 +44,7 @@ CGLM_INLINE void glm_vec_maxv(vec3 v1, vec3 v2, vec3 dest); CGLM_INLINE void glm_vec_minv(vec3 v1, vec3 v2, vec3 dest); CGLM_INLINE void glm_vec_ortho(vec3 v, vec3 dest); + CGLM_INLINE void glm_vec_swizzle(vec3 v, int mask, vec3 dest); Convenient: CGLM_INLINE void glm_cross(vec3 a, vec3 b, vec3 d); @@ -69,6 +70,11 @@ #define GLM_ZUP (vec3){0.0f, 0.0f, 1.0f} #define GLM_XUP (vec3){1.0f, 0.0f, 0.0f} +#define GLM_XXX GLM_SHUFFLE3(0, 0, 0) +#define GLM_YYY GLM_SHUFFLE3(1, 1, 1) +#define GLM_ZZZ GLM_SHUFFLE3(2, 2, 2) +#define GLM_ZYX GLM_SHUFFLE3(0, 1, 2) + /*! * @brief init vec3 using vec4 * @@ -528,4 +534,25 @@ glm_normalize_to(vec3 v, vec3 dest) { glm_vec_normalize_to(v, dest); } +/*! + * @brief swizzle vector components + * + * you can use existin masks e.g. GLM_XXX, GLM_ZYX + * + * @param[in] v source + * @param[in] mask mask + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec_swizzle(vec3 v, int mask, vec3 dest) { + vec3 t; + + t[0] = v[(mask & (3 << 0))]; + t[1] = v[(mask & (3 << 2)) >> 2]; + t[2] = v[(mask & (3 << 4)) >> 4]; + + glm_vec_copy(t, dest); +} + #endif /* cglm_vec3_h */ diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index e76bfac..a92758a 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -38,6 +38,7 @@ 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); + CGLM_INLINE void glm_vec4_swizzle(vec4 v, int mask, vec4 dest); */ #ifndef cglm_vec4_h @@ -57,6 +58,12 @@ #define GLM_VEC4_ONE (vec4)GLM_VEC4_ONE_INIT #define GLM_VEC4_BLACK (vec4)GLM_VEC4_BLACK_INIT +#define GLM_XXXX GLM_SHUFFLE4(0, 0, 0, 0) +#define GLM_YYYY GLM_SHUFFLE4(1, 1, 1, 1) +#define GLM_ZZZZ GLM_SHUFFLE4(2, 2, 2, 2) +#define GLM_WWWW GLM_SHUFFLE4(3, 3, 3, 3) +#define GLM_WZYX GLM_SHUFFLE4(0, 1, 2, 3) + /*! * @brief init vec4 using vec3 * @@ -369,4 +376,26 @@ glm_vec4_minv(vec4 v1, vec4 v2, vec4 dest) { dest[3] = glm_min(v1[3], v2[3]); } +/*! + * @brief swizzle vector components + * + * you can use existin masks e.g. GLM_XXXX, GLM_WZYX + * + * @param[in] v source + * @param[in] mask mask + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec4_swizzle(vec4 v, int mask, vec4 dest) { + vec4 t; + + t[0] = v[(mask & (3 << 0))]; + t[1] = v[(mask & (3 << 2)) >> 2]; + t[2] = v[(mask & (3 << 4)) >> 4]; + t[3] = v[(mask & (3 << 6)) >> 6]; + + glm_vec4_copy(t, dest); +} + #endif /* cglm_vec4_h */