mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
swizzle support
This commit is contained in:
@@ -54,6 +54,9 @@
|
|||||||
|
|
||||||
#define glm__memzero(type, dest, size) glm__memset(type, dest, size, 0)
|
#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 "types.h"
|
||||||
#include "simd/intrin.h"
|
#include "simd/intrin.h"
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,7 @@
|
|||||||
CGLM_INLINE void glm_vec_maxv(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);
|
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_ortho(vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_vec_swizzle(vec3 v, int mask, vec3 dest);
|
||||||
|
|
||||||
Convenient:
|
Convenient:
|
||||||
CGLM_INLINE void glm_cross(vec3 a, vec3 b, vec3 d);
|
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_ZUP (vec3){0.0f, 0.0f, 1.0f}
|
||||||
#define GLM_XUP (vec3){1.0f, 0.0f, 0.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
|
* @brief init vec3 using vec4
|
||||||
*
|
*
|
||||||
@@ -528,4 +534,25 @@ glm_normalize_to(vec3 v, vec3 dest) {
|
|||||||
glm_vec_normalize_to(v, 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 */
|
#endif /* cglm_vec3_h */
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
CGLM_INLINE float glm_vec4_distance(vec4 v1, vec4 v2);
|
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_maxv(vec4 v1, vec4 v2, vec4 dest);
|
||||||
CGLM_INLINE void glm_vec4_minv(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
|
#ifndef cglm_vec4_h
|
||||||
@@ -57,6 +58,12 @@
|
|||||||
#define GLM_VEC4_ONE (vec4)GLM_VEC4_ONE_INIT
|
#define GLM_VEC4_ONE (vec4)GLM_VEC4_ONE_INIT
|
||||||
#define GLM_VEC4_BLACK (vec4)GLM_VEC4_BLACK_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
|
* @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]);
|
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 */
|
#endif /* cglm_vec4_h */
|
||||||
|
|||||||
Reference in New Issue
Block a user