From 8c81443f24478ce08ce57b97a7ee57c1106f7072 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 21 Mar 2024 00:18:02 +0300 Subject: [PATCH] reflect --- include/cglm/vec2.h | 17 ++++++++++++++++- include/cglm/vec3.h | 16 ++++++++++++++++ include/cglm/vec4.h | 20 ++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/include/cglm/vec2.h b/include/cglm/vec2.h index 5abf616..98e540b 100644 --- a/include/cglm/vec2.h +++ b/include/cglm/vec2.h @@ -55,7 +55,7 @@ CGLM_INLINE void glm_vec2_clamp(vec2 v, float minVal, float maxVal) CGLM_INLINE void glm_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) CGLM_INLINE void glm_vec2_make(float * restrict src, vec2 dest) - + CGLM_INLINE void glm_vec2_reflect(vec2 I, vec2 N, vec2 dest) */ #ifndef cglm_vec2_h @@ -712,4 +712,19 @@ glm_vec2_make(const float * __restrict src, vec2 dest) { dest[0] = src[0]; dest[1] = src[1]; } +/*! + * @brief reflection vector using an incident ray and a surface normal + * + * @param[in] I incident vector + * @param[in] N normalized normal vector + * @param[out] dest destination vector for the reflection result + */ +CGLM_INLINE +void +glm_vec2_reflect(vec2 I, vec2 N, vec2 dest) { + vec2 temp; + glm_vec2_scale(N, 2.0f * glm_vec2_dot(I, N), temp); + glm_vec2_sub(I, temp, dest); +} + #endif /* cglm_vec2_h */ diff --git a/include/cglm/vec3.h b/include/cglm/vec3.h index a53cd28..017d1bd 100644 --- a/include/cglm/vec3.h +++ b/include/cglm/vec3.h @@ -80,6 +80,7 @@ CGLM_INLINE void glm_vec3_smoothinterpc(vec3 from, vec3 to, float t, vec3 dest); 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); Convenient: CGLM_INLINE void glm_cross(vec3 a, vec3 b, vec3 d); @@ -1202,4 +1203,19 @@ glm_vec3_make(const float * __restrict src, vec3 dest) { dest[2] = src[2]; } +/*! + * @brief reflection vector using an incident ray and a surface normal + * + * @param[in] I incident vector + * @param[in] N normalized normal vector + * @param[out] dest reflection result + */ +CGLM_INLINE +void +glm_vec3_reflect(vec3 I, vec3 N, vec3 dest) { + vec3 temp; + glm_vec3_scale(N, 2.0f * glm_vec3_dot(I, N), temp); + glm_vec3_sub(I, temp, dest); +} + #endif /* cglm_vec3_h */ diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index 8dd5b85..db1bd9c 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -65,6 +65,7 @@ CGLM_INLINE void glm_vec4_smoothinterpc(vec4 from, vec4 to, float t, vec4 dest); CGLM_INLINE void glm_vec4_swizzle(vec4 v, int mask, vec4 dest); CGLM_INLINE void glm_vec4_make(float * restrict src, vec4 dest); + CGLM_INLINE void glm_vec4_reflect(vec4 I, vec4 N, vec4 dest); DEPRECATED: glm_vec4_dup @@ -1304,4 +1305,23 @@ glm_vec4_make(const float * __restrict src, vec4 dest) { dest[2] = src[2]; dest[3] = src[3]; } +/*! + * @brief reflection vector using an incident ray and a surface normal + * + * @param[in] I incident vector + * @param[in] N normalized normal vector + * @param[out] dest destination vector for the reflection result + */ +CGLM_INLINE +void +glm_vec4_reflect(vec4 I, vec4 N, vec4 dest) { + vec4 temp; + + /* TODO: direct simd touch */ + glm_vec4_scale(N, 2.0f * glm_vec4_dot(I, N), temp); + glm_vec4_sub(I, temp, dest); + + dest[3] = I[3]; +} + #endif /* cglm_vec4_h */