diff --git a/include/cglm/call/vec2.h b/include/cglm/call/vec2.h index 2fbd3ee..0284a8c 100644 --- a/include/cglm/call/vec2.h +++ b/include/cglm/call/vec2.h @@ -201,6 +201,10 @@ CGLM_EXPORT void glmc_vec2_mods(vec2 v, float s, vec2 dest); +CGLM_EXPORT +void +glmc_vec2_swizzle(vec2 v, int mask, vec2 dest); + CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest); diff --git a/include/cglm/common.h b/include/cglm/common.h index af1116f..11588cf 100644 --- a/include/cglm/common.h +++ b/include/cglm/common.h @@ -51,6 +51,7 @@ #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)) +#define GLM_SHUFFLE2(y, x) (((y) << 2) | (x)) #include "types.h" #include "simd/intrin.h" diff --git a/include/cglm/vec2.h b/include/cglm/vec2.h index 090e5e8..655fb4b 100644 --- a/include/cglm/vec2.h +++ b/include/cglm/vec2.h @@ -53,6 +53,7 @@ CGLM_INLINE void glm_vec2_maxv(vec2 v1, vec2 v2, vec2 dest) CGLM_INLINE void glm_vec2_minv(vec2 v1, vec2 v2, vec2 dest) CGLM_INLINE void glm_vec2_clamp(vec2 v, float minVal, float maxVal) + CGLM_INLINE void glm_vec2_swizzle(vec2 v, int mask, vec2 dest) CGLM_INLINE void glm_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) CGLM_INLINE void glm_vec2_step(vec2 edge, vec2 x, vec2 dest) CGLM_INLINE void glm_vec2_make(float * restrict src, vec2 dest) @@ -680,6 +681,24 @@ glm_vec2_clamp(vec2 v, float minval, float maxval) { v[1] = glm_clamp(v[1], minval, maxval); } +/*! + * @brief swizzle vector components + * + * @param[in] v source + * @param[in] mask mask + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec2_swizzle(vec2 v, int mask, vec2 dest) { + vec2 t; + + t[0] = v[(mask & (3 << 0))]; + t[1] = v[(mask & (3 << 2)) >> 2]; + + glm_vec2_copy(t, dest); +} + /*! * @brief linear interpolation between two vector * diff --git a/src/vec2.c b/src/vec2.c index a9d59b5..479c41e 100644 --- a/src/vec2.c +++ b/src/vec2.c @@ -308,6 +308,13 @@ void glmc_vec2_stepr(vec2 edge, float v, vec2 dest) { glm_vec2_stepr(edge, v, dest); } + +CGLM_EXPORT +void +glmc_vec2_swizzle(vec2 v, int mask, vec2 dest) { + glm_vec2_swizzle(v, mask, dest); +} + CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) { diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index 80f24fa..026c387 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -737,6 +737,21 @@ TEST_IMPL(GLM_PREFIX, vec2_mods) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, vec2_swizzle) { + vec2 v; + + v[0] = 1; + v[1] = 2; + + GLM(vec2_swizzle)(v, GLM_SHUFFLE2(1, 0), v); + ASSERTIFY(test_assert_vec2_eq(v, (vec2){2, 1})) + + GLM(vec2_swizzle)(v, GLM_SHUFFLE2(0, 0), v); + ASSERTIFY(test_assert_vec2_eq(v, (vec2){1, 1})) + + TEST_SUCCESS +} + TEST_IMPL(GLM_PREFIX, vec2_lerp) { vec2 v1 = {-100.0f, -200.0f}; vec2 v2 = {100.0f, 200.0f};