diff --git a/include/cglm/call/vec2.h b/include/cglm/call/vec2.h index f951663..96f4bd6 100644 --- a/include/cglm/call/vec2.h +++ b/include/cglm/call/vec2.h @@ -197,6 +197,10 @@ CGLM_EXPORT void glmc_vec2_make(const float * __restrict src, vec2 dest); +CGLM_EXPORT +void +glmc_vec2_reflect(vec2 I, vec2 N, vec2 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index f3ab653..34d2cdd 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -334,6 +334,10 @@ CGLM_EXPORT void glmc_vec3_make(const float * __restrict src, vec3 dest); +CGLM_EXPORT +void +glmc_vec3_reflect(vec3 I, vec3 N, vec3 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index 644facf..1e6639b 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -311,6 +311,10 @@ CGLM_EXPORT void glmc_vec4_make(const float * __restrict src, vec4 dest); +CGLM_EXPORT +void +glmc_vec4_reflect(vec4 I, vec4 N, vec4 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/struct/vec2.h b/include/cglm/struct/vec2.h index 99db56a..ca31153 100644 --- a/include/cglm/struct/vec2.h +++ b/include/cglm/struct/vec2.h @@ -54,6 +54,7 @@ CGLM_INLINE vec2s glms_vec2_clamp(vec2s v, float minVal, float maxVal) CGLM_INLINE vec2s glms_vec2_lerp(vec2s from, vec2s to, float t) CGLM_INLINE vec2s glms_vec2_make(float * restrict src) + CGLM_INLINE vec2s glms_vec2_reflect(vec2s I, vec2s N) */ #ifndef cglms_vec2s_h @@ -691,4 +692,19 @@ glms_vec2_(make)(const float * __restrict src) { return dest; } +/*! + * @brief reflection vector using an incident ray and a surface normal + * + * @param[in] I incident vector + * @param[in] N normalized normal vector + * @returns reflection result + */ +CGLM_INLINE +vec2s +glms_vec2_(reflect)(vec2s I, vec2s N) { + vec2s dest; + glm_vec2_reflect(I.raw, N.raw, dest.raw); + return dest; +} + #endif /* cglms_vec2s_h */ diff --git a/include/cglm/struct/vec3.h b/include/cglm/struct/vec3.h index 2cd208f..9763367 100644 --- a/include/cglm/struct/vec3.h +++ b/include/cglm/struct/vec3.h @@ -76,6 +76,7 @@ CGLM_INLINE vec3s glms_vec3_smoothinterpc(vec3s from, vec3s to, float t); CGLM_INLINE vec3s glms_vec3_swizzle(vec3s v, int mask); CGLM_INLINE vec3s glms_vec3_make(float * restrict src); + CGLM_INLINE vec3s glms_vec3_reflect(vec3s I, vec3s N); Convenient: CGLM_INLINE vec3s glms_cross(vec3s a, vec3s b); @@ -1083,4 +1084,19 @@ glms_vec3_(make)(const float * __restrict src) { return dest; } +/*! + * @brief reflection vector using an incident ray and a surface normal + * + * @param[in] I incident vector + * @param[in] N normalized normal vector + * @returns reflection result + */ +CGLM_INLINE +vec3s +glms_vec3_(reflect)(vec3s I, vec3s N) { + vec3s dest; + glm_vec3_reflect(I.raw, N.raw, dest.raw); + return dest; +} + #endif /* cglms_vec3s_h */ diff --git a/include/cglm/struct/vec4.h b/include/cglm/struct/vec4.h index c4f200d..836454d 100644 --- a/include/cglm/struct/vec4.h +++ b/include/cglm/struct/vec4.h @@ -67,6 +67,7 @@ CGLM_INLINE vec4s glms_vec4_cubic(float s); CGLM_INLINE vec4s glms_vec4_swizzle(vec4s v, int mask); CGLM_INLINE vec4s glms_vec4_make(float * restrict src); + CGLM_INLINE vec4s glms_vec4_reflect(vec4s I, vec4s N); */ #ifndef cglms_vec4s_h @@ -927,4 +928,19 @@ glms_vec4_(make)(const float * __restrict src) { return dest; } +/*! + * @brief reflection vector using an incident ray and a surface normal + * + * @param[in] I incident vector + * @param[in] N normalized normal vector + * @returns reflection result + */ +CGLM_INLINE +vec4s +glms_vec4_(reflect)(vec4s I, vec4s N) { + vec4s dest; + glm_vec4_reflect(I.raw, N.raw, dest.raw); + return dest; +} + #endif /* cglms_vec4s_h */ diff --git a/include/cglm/vec3.h b/include/cglm/vec3.h index 017d1bd..47228cc 100644 --- a/include/cglm/vec3.h +++ b/include/cglm/vec3.h @@ -81,6 +81,7 @@ CGLM_INLINE void glm_vec3_swizzle(vec3 v, int mask, vec3 dest); CGLM_INLINE void glm_vec3_make(float * restrict src, vec3 dest); CGLM_INLINE void glm_vec3_reflect(vec3 I, vec3 N, vec3 dest); + CGLM_INLINE void glm_vec3_refract(vec3 I, vec3 N, float ior, vec3 dest); Convenient: CGLM_INLINE void glm_cross(vec3 a, vec3 b, vec3 d); diff --git a/src/vec2.c b/src/vec2.c index 5a23ff5..abdc6fc 100644 --- a/src/vec2.c +++ b/src/vec2.c @@ -302,3 +302,9 @@ void glmc_vec2_make(const float * __restrict src, vec2 dest) { glm_vec2_make(src, dest); } + +CGLM_EXPORT +void +glmc_vec2_reflect(vec2 I, vec2 N, vec2 dest) { + glm_vec2_reflect(I, N, dest); +} diff --git a/src/vec3.c b/src/vec3.c index 86660c8..765dd04 100644 --- a/src/vec3.c +++ b/src/vec3.c @@ -459,3 +459,15 @@ void glmc_vec3_make(const float * __restrict src, vec3 dest) { glm_vec3_make(src, dest); } + +CGLM_EXPORT +void +glmc_vec3_reflect(vec3 I, vec3 N, vec3 dest) { + glm_vec3_reflect(I, N, dest); +} + +CGLM_EXPORT +void +glmc_vec3_faceforward(vec3 N, vec3 I, vec3 Nref, vec3 dest) { + glm_vec3_faceforward(N, I, Nref, dest); +} diff --git a/src/vec4.c b/src/vec4.c index 2fcd4ca..281fdb0 100644 --- a/src/vec4.c +++ b/src/vec4.c @@ -423,3 +423,9 @@ void glmc_vec4_make(const float * __restrict src, vec4 dest) { glm_vec4_make(src, dest); } + +CGLM_EXPORT +void +glmc_vec4_reflect(vec4 I, vec4 N, vec4 dest) { + glm_vec4_reflect(I, N, dest); +}