From eb3a51e591c1abc8a55af8409eaae119ee2bb3a9 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Mon, 22 Apr 2024 21:33:31 +0300 Subject: [PATCH 001/128] win: suppress C4996; use snprintf() instead of sprintf() --- include/cglm/io.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/cglm/io.h b/include/cglm/io.h index b95751b..baa80f1 100644 --- a/include/cglm/io.h +++ b/include/cglm/io.h @@ -132,9 +132,9 @@ glm_mat4_print(mat4 matrix, for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT) - cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]); + cwi = snprintf(buff, sizeof(buff), "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]); else - cwi = sprintf(buff, "% g", (double)matrix[i][j]); + cwi = snprintf(buff, sizeof(buff), "% g", (double)matrix[i][j]); cw[i] = GLM_MAX(cw[i], cwi); } } @@ -175,9 +175,9 @@ glm_mat3_print(mat3 matrix, for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT) - cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]); + cwi = snprintf(buff, sizeof(buff), "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]); else - cwi = sprintf(buff, "% g", (double)matrix[i][j]); + cwi = snprintf(buff, sizeof(buff), "% g", (double)matrix[i][j]); cw[i] = GLM_MAX(cw[i], cwi); } } @@ -217,9 +217,9 @@ glm_mat2_print(mat2 matrix, for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT) - cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]); + cwi = snprintf(buff, sizeof(buff), "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]); else - cwi = sprintf(buff, "% g", (double)matrix[i][j]); + cwi = snprintf(buff, sizeof(buff), "% g", (double)matrix[i][j]); cw[i] = GLM_MAX(cw[i], cwi); } } From cd5ed1f4c49745d0c3d318521fc6739ae98bec21 Mon Sep 17 00:00:00 2001 From: John Choi Date: Fri, 10 May 2024 22:32:25 -0500 Subject: [PATCH 002/128] added quat_slerp_longest --- docs/source/quat.rst | 12 ++++++++++ include/cglm/call/quat.h | 4 ++++ include/cglm/quat.h | 47 ++++++++++++++++++++++++++++++++++++++ include/cglm/struct/quat.h | 18 +++++++++++++++ src/quat.c | 6 +++++ 5 files changed, 87 insertions(+) diff --git a/docs/source/quat.rst b/docs/source/quat.rst index c52a235..8497099 100644 --- a/docs/source/quat.rst +++ b/docs/source/quat.rst @@ -55,6 +55,7 @@ Functions: #. :c:func:`glm_quat_lerp` #. :c:func:`glm_quat_nlerp` #. :c:func:`glm_quat_slerp` +#. :c:func:`glm_quat_slerp_longest` #. :c:func:`glm_quat_look` #. :c:func:`glm_quat_for` #. :c:func:`glm_quat_forp` @@ -351,6 +352,17 @@ Functions documentation | *[in]* **t** interpolant (amount) clamped between 0 and 1 | *[out]* **dest** result quaternion +.. c:function:: void glm_quat_slerp_longest(versor q, versor r, float t, versor dest) + + | interpolates between two quaternions + | using spherical linear interpolation (SLERP) and always takes the longest path + + Parameters: + | *[in]* **from** from + | *[in]* **to** to + | *[in]* **t** interpolant (amount) clamped between 0 and 1 + | *[out]* **dest** result quaternion + .. c:function:: void glm_quat_look(vec3 eye, versor ori, mat4 dest) | creates view matrix using quaternion as camera orientation diff --git a/include/cglm/call/quat.h b/include/cglm/call/quat.h index acf4313..4244d36 100644 --- a/include/cglm/call/quat.h +++ b/include/cglm/call/quat.h @@ -133,6 +133,10 @@ CGLM_EXPORT void glmc_quat_slerp(versor q, versor r, float t, versor dest); +CGLM_EXPORT +void +glmc_quat_slerp_longest(versor q, versor r, float t, versor dest); + CGLM_EXPORT void glmc_quat_look(vec3 eye, versor ori, mat4 dest); diff --git a/include/cglm/quat.h b/include/cglm/quat.h index 18892d3..0630ebb 100644 --- a/include/cglm/quat.h +++ b/include/cglm/quat.h @@ -39,6 +39,7 @@ CGLM_INLINE void glm_quat_lerp(versor from, versor to, float t, versor dest); CGLM_INLINE void glm_quat_lerpc(versor from, versor to, float t, versor dest); CGLM_INLINE void glm_quat_slerp(versor q, versor r, float t, versor dest); + CGLM_INLINE void glm_quat_slerp_longest(versor q, versor r, float t, versor dest); CGLM_INLINE void glm_quat_nlerp(versor q, versor r, float t, versor dest); CGLM_INLINE void glm_quat_look(vec3 eye, versor ori, mat4 dest); CGLM_INLINE void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest); @@ -742,6 +743,52 @@ glm_quat_slerp(versor from, versor to, float t, versor dest) { glm_vec4_scale(q1, 1.0f / sinTheta, dest); } +/*! + * @brief interpolates between two quaternions + * using spherical linear interpolation (SLERP) and always takes the long path + * + * @param[in] from from + * @param[in] to to + * @param[in] t amout + * @param[out] dest result quaternion + */ +CGLM_INLINE +void +glm_quat_slerp_longest(versor from, versor to, float t, versor dest) { + CGLM_ALIGN(16) vec4 q1, q2; + float cosTheta, sinTheta, angle; + + cosTheta = glm_quat_dot(from, to); + glm_quat_copy(from, q1); + + if (fabsf(cosTheta) >= 1.0f) { + glm_quat_copy(q1, dest); + return; + } + +//NOTE THAT ONLY THIS CHANGED + if (!(cosTheta < 0.0f)) { + glm_vec4_negate(q1); + cosTheta = -cosTheta; + } + + sinTheta = sqrtf(1.0f - cosTheta * cosTheta); + + /* LERP to avoid zero division */ + if (fabsf(sinTheta) < 0.001f) { + glm_quat_lerp(from, to, t, dest); + return; + } + + /* SLERP */ + angle = acosf(cosTheta); + glm_vec4_scale(q1, sinf((1.0f - t) * angle), q1); + glm_vec4_scale(to, sinf(t * angle), q2); + + glm_vec4_add(q1, q2, q1); + glm_vec4_scale(q1, 1.0f / sinTheta, dest); +} + /*! * @brief creates view matrix using quaternion as camera orientation * diff --git a/include/cglm/struct/quat.h b/include/cglm/struct/quat.h index 859b664..ff87740 100644 --- a/include/cglm/struct/quat.h +++ b/include/cglm/struct/quat.h @@ -37,6 +37,7 @@ CGLM_INLINE versors glms_quat_lerpc(versors from, versors to, float t) CGLM_INLINE versors glms_quat_nlerp(versors from, versors to, float t) CGLM_INLINE versors glms_quat_slerp(versors from, versors to, float t) + CGLM_INLINE versors glms_quat_slerp_longest(versors from, versors to, float t) CGLM_INLINE mat4s. glms_quat_look(vec3s eye, versors ori) CGLM_INLINE versors glms_quat_for(vec3s dir, vec3s fwd, vec3s up) CGLM_INLINE versors glms_quat_forp(vec3s from, vec3s to, vec3s fwd, vec3s up) @@ -457,6 +458,23 @@ glms_quat_(slerp)(versors from, versors to, float t) { return dest; } +/*! + * @brief interpolates between two quaternions + * using spherical linear interpolation (SLERP) and always takes the longest path + * + * @param[in] from from + * @param[in] to to + * @param[in] t amout + * @returns result quaternion + */ +CGLM_INLINE +versors +glms_quat_(slerp_longest)(versors from, versors to, float t) { + versors dest; + glm_quat_slerp_longest(from.raw, to.raw, t, dest.raw); + return dest; +} + /*! * @brief creates view matrix using quaternion as camera orientation * diff --git a/src/quat.c b/src/quat.c index 56cda30..3f41286 100644 --- a/src/quat.c +++ b/src/quat.c @@ -188,6 +188,12 @@ glmc_quat_slerp(versor from, versor to, float t, versor dest) { glm_quat_slerp(from, to, t, dest); } +CGLM_EXPORT +void +glmc_quat_slerp_longest(versor from, versor to, float t, versor dest) { + glm_quat_slerp_longest(from, to, t, dest); +} + CGLM_EXPORT void glmc_quat_look(vec3 eye, versor ori, mat4 dest) { From c5b2afc1c447c46400a87a1ebb670a5eb8224a4f Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Mon, 13 May 2024 17:20:28 +0300 Subject: [PATCH 003/128] Update quat.h --- include/cglm/quat.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/cglm/quat.h b/include/cglm/quat.h index 0630ebb..777e793 100644 --- a/include/cglm/quat.h +++ b/include/cglm/quat.h @@ -766,7 +766,7 @@ glm_quat_slerp_longest(versor from, versor to, float t, versor dest) { return; } -//NOTE THAT ONLY THIS CHANGED + /* longest path */ if (!(cosTheta < 0.0f)) { glm_vec4_negate(q1); cosTheta = -cosTheta; From 5b2c37f73bee2ea5b289a2424bf242e5522bf42c Mon Sep 17 00:00:00 2001 From: Kaz <87723604+not-kaz@users.noreply.github.com> Date: Sun, 9 Jun 2024 11:06:18 +0200 Subject: [PATCH 004/128] Fixed 'missing-prototypes' warnings for some vec2 funcs. Using gcc and missing-prototypes flag shows warnings for: glmc_vec2_fill, glmc_vec2_eq and glmc_vec2_eqv. Seems they were not added to call/vec2.h for some reason. This should fix the warnings. --- include/cglm/call/vec2.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/cglm/call/vec2.h b/include/cglm/call/vec2.h index 507f042..4264887 100644 --- a/include/cglm/call/vec2.h +++ b/include/cglm/call/vec2.h @@ -17,6 +17,18 @@ CGLM_EXPORT void glmc_vec2(float * __restrict v, vec2 dest); +CGLM_EXPORT +void +glmc_vec2_fill(vec2 v, float val); + +CGLM_EXPORT +bool +glmc_vec2_eq(vec2 v, float val); + +CGLM_EXPORT +bool +glmc_vec2_eqv(vec2 a, vec2 b); + CGLM_EXPORT void glmc_vec2_copy(vec2 a, vec2 dest); From 07dc9520a4b9ee442138ab2286abceaf02a64b49 Mon Sep 17 00:00:00 2001 From: myfreeer Date: Wed, 3 Jul 2024 20:04:50 +0800 Subject: [PATCH 005/128] mat4: wasm simd128 for glm_mat4_inv The function `glm_mat4_inv_wasm` has been implemented, but not used in `glm_mat4_inv`. This commit adds a conditional macro to add the case of wasm and simd128 case for calling `glm_mat4_inv_wasm`. --- include/cglm/mat4.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/cglm/mat4.h b/include/cglm/mat4.h index 742b0cb..4d249b8 100644 --- a/include/cglm/mat4.h +++ b/include/cglm/mat4.h @@ -645,7 +645,9 @@ glm_mat4_det(mat4 mat) { CGLM_INLINE void glm_mat4_inv(mat4 mat, mat4 dest) { -#if defined( __SSE__ ) || defined( __SSE2__ ) +#if defined(__wasm__) && defined(__wasm_simd128__) + glm_mat4_inv_wasm(mat, dest); +#elif defined( __SSE__ ) || defined( __SSE2__ ) glm_mat4_inv_sse2(mat, dest); #elif defined(CGLM_NEON_FP) glm_mat4_inv_neon(mat, dest); From 068f6951b3ba102d214458085591a411c6b7b163 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Sun, 14 Jul 2024 09:10:19 +0700 Subject: [PATCH 006/128] Reduce typo count. --- docs/source/aabb2d.rst | 4 ++-- docs/source/affine-pre.rst | 2 +- docs/source/api_struct.rst | 2 +- docs/source/box.rst | 4 ++-- docs/source/quat.rst | 6 +++--- include/cglm/aabb2d.h | 4 ++-- include/cglm/affine-pre.h | 2 +- include/cglm/box.h | 4 ++-- include/cglm/quat.h | 4 ++-- include/cglm/struct/aabb2d.h | 4 ++-- include/cglm/struct/box.h | 4 ++-- include/cglm/struct/ivec2.h | 2 +- include/cglm/struct/ivec3.h | 4 ++-- include/cglm/struct/ivec4.h | 2 +- include/cglm/struct/quat.h | 4 ++-- 15 files changed, 26 insertions(+), 26 deletions(-) diff --git a/docs/source/aabb2d.rst b/docs/source/aabb2d.rst index ec6bd42..16d18c6 100644 --- a/docs/source/aabb2d.rst +++ b/docs/source/aabb2d.rst @@ -82,7 +82,7 @@ Functions documentation | crops a bounding box with another one. - this could be useful for gettng a bbox which fits with view frustum and + this could be useful for getting a bbox which fits with view frustum and object bounding boxes. In this case you crop view frustum box with objects box @@ -95,7 +95,7 @@ Functions documentation | crops a bounding box with another one. - this could be useful for gettng a bbox which fits with view frustum and + this could be useful for getting a bbox which fits with view frustum and object bounding boxes. In this case you crop view frustum box with objects box diff --git a/docs/source/affine-pre.rst b/docs/source/affine-pre.rst index 35e2c3a..c313fc9 100644 --- a/docs/source/affine-pre.rst +++ b/docs/source/affine-pre.rst @@ -117,7 +117,7 @@ Functions documentation If you need to rotate object around itself e.g. center of object or at some point [of object] then `glm_rotate_at()` would be better choice to do so. - Even if object's model transform is identiy, rotation may not be around + Even if object's model transform is identity, rotation may not be around center of object if object does not lay out at ORIGIN perfectly. Using `glm_rotate_at()` with center of bounding shape ( AABB, Sphere ... ) diff --git a/docs/source/api_struct.rst b/docs/source/api_struct.rst index 077e8de..f3e4e78 100644 --- a/docs/source/api_struct.rst +++ b/docs/source/api_struct.rst @@ -9,7 +9,7 @@ By default struct api adds `s` suffix to every type name e.g. vec3s, mat4s, vers Also struct api `s` suffix to namespace e.g. `glms_vec3_add`, `glms_mat4_mul` etc. By starting v0.9.0, struct api namespace is configurable. We can omit **glms_** namespace or -even change it with custom name to move existing api integrations to **cglm** more easliy... +even change it with custom name to move existing api integrations to **cglm** more easily... We can also add **s** to function names if we want e.g. `glms_vec3_add()` -> `vec3_add()` or `vec3s_add()`. By including **cglm/struct.h** header you will include all struct api. It will also include **cglm/cglm.h** too. diff --git a/docs/source/box.rst b/docs/source/box.rst index 76e0822..57632d9 100644 --- a/docs/source/box.rst +++ b/docs/source/box.rst @@ -62,7 +62,7 @@ Functions documentation | crops a bounding box with another one. - this could be useful for gettng a bbox which fits with view frustum and + this could be useful for getting a bbox which fits with view frustum and object bounding boxes. In this case you crop view frustum box with objects box @@ -75,7 +75,7 @@ Functions documentation | crops a bounding box with another one. - this could be useful for gettng a bbox which fits with view frustum and + this could be useful for getting a bbox which fits with view frustum and object bounding boxes. In this case you crop view frustum box with objects box diff --git a/docs/source/quat.rst b/docs/source/quat.rst index 8497099..eb6f987 100644 --- a/docs/source/quat.rst +++ b/docs/source/quat.rst @@ -11,9 +11,9 @@ Header: cglm/quat.h What you can do with quaternions with existing functions is (Some of them): -- You can rotate transform matrix using quaterion -- You can rotate vector using quaterion -- You can create view matrix using quaterion +- You can rotate transform matrix using quaternion +- You can rotate vector using quaternion +- You can create view matrix using quaternion - You can create a lookrotation (from source point to dest) Table of contents (click to go): diff --git a/include/cglm/aabb2d.h b/include/cglm/aabb2d.h index b50430c..27679a7 100644 --- a/include/cglm/aabb2d.h +++ b/include/cglm/aabb2d.h @@ -95,7 +95,7 @@ glm_aabb2d_merge(vec2 aabb1[2], vec2 aabb2[2], vec2 dest[2]) { /*! * @brief crops a bounding aabb with another one. * - * this could be useful for gettng a baabb which fits with view frustum and + * this could be useful for getting a baabb which fits with view frustum and * object bounding aabbes. In this case you crop view frustum aabb with objects * aabb * @@ -116,7 +116,7 @@ glm_aabb2d_crop(vec2 aabb[2], vec2 cropAabb[2], vec2 dest[2]) { /*! * @brief crops a bounding aabb with another one. * - * this could be useful for gettng a baabb which fits with view frustum and + * this could be useful for getting a baabb which fits with view frustum and * object bounding aabbes. In this case you crop view frustum aabb with objects * aabb * diff --git a/include/cglm/affine-pre.h b/include/cglm/affine-pre.h index f7ccf69..2fa77f7 100644 --- a/include/cglm/affine-pre.h +++ b/include/cglm/affine-pre.h @@ -215,7 +215,7 @@ glm_rotate_z(mat4 m, float angle, mat4 dest) { * If you need to rotate object around itself e.g. center of object or at * some point [of object] then `glm_rotate_at()` would be better choice to do so. * - * Even if object's model transform is identiy, rotation may not be around + * Even if object's model transform is identity, rotation may not be around * center of object if object does not lay out at ORIGIN perfectly. * * Using `glm_rotate_at()` with center of bounding shape ( AABB, Sphere ... ) diff --git a/include/cglm/box.h b/include/cglm/box.h index 8da24f0..8bba678 100644 --- a/include/cglm/box.h +++ b/include/cglm/box.h @@ -75,7 +75,7 @@ glm_aabb_merge(vec3 box1[2], vec3 box2[2], vec3 dest[2]) { /*! * @brief crops a bounding box with another one. * - * this could be useful for gettng a bbox which fits with view frustum and + * this could be useful for getting a bbox which fits with view frustum and * object bounding boxes. In this case you crop view frustum box with objects * box * @@ -98,7 +98,7 @@ glm_aabb_crop(vec3 box[2], vec3 cropBox[2], vec3 dest[2]) { /*! * @brief crops a bounding box with another one. * - * this could be useful for gettng a bbox which fits with view frustum and + * this could be useful for getting a bbox which fits with view frustum and * object bounding boxes. In this case you crop view frustum box with objects * box * diff --git a/include/cglm/quat.h b/include/cglm/quat.h index 777e793..cf1f325 100644 --- a/include/cglm/quat.h +++ b/include/cglm/quat.h @@ -123,7 +123,7 @@ glm_quat_identity_array(versor * __restrict q, size_t count) { } /*! - * @brief inits quaterion with raw values + * @brief inits quaternion with raw values * * @param[out] q quaternion * @param[in] x x @@ -749,7 +749,7 @@ glm_quat_slerp(versor from, versor to, float t, versor dest) { * * @param[in] from from * @param[in] to to - * @param[in] t amout + * @param[in] t amount * @param[out] dest result quaternion */ CGLM_INLINE diff --git a/include/cglm/struct/aabb2d.h b/include/cglm/struct/aabb2d.h index e66eb34..e60d16e 100644 --- a/include/cglm/struct/aabb2d.h +++ b/include/cglm/struct/aabb2d.h @@ -62,7 +62,7 @@ glms_aabb2d_(merge)(vec2s aabb1[2], vec2s aabb2[2], vec2s dest[2]) { /*! * @brief crops a bounding box with another one. * - * this could be useful for gettng a bbox which fits with view frustum and + * this could be useful for getting a bbox which fits with view frustum and * object bounding boxes. In this case you crop view frustum box with objects * box * @@ -86,7 +86,7 @@ glms_aabb2d_(crop)(vec2s aabb[2], vec2s cropAabb[2], vec2s dest[2]) { /*! * @brief crops a bounding box with another one. * - * this could be useful for gettng a bbox which fits with view frustum and + * this could be useful for getting a bbox which fits with view frustum and * object bounding boxes. In this case you crop view frustum box with objects * box * diff --git a/include/cglm/struct/box.h b/include/cglm/struct/box.h index 96ae03b..ac32328 100644 --- a/include/cglm/struct/box.h +++ b/include/cglm/struct/box.h @@ -62,7 +62,7 @@ glms_aabb_(merge)(vec3s box1[2], vec3s box2[2], vec3s dest[2]) { /*! * @brief crops a bounding box with another one. * - * this could be useful for gettng a bbox which fits with view frustum and + * this could be useful for getting a bbox which fits with view frustum and * object bounding boxes. In this case you crop view frustum box with objects * box * @@ -86,7 +86,7 @@ glms_aabb_(crop)(vec3s box[2], vec3s cropBox[2], vec3s dest[2]) { /*! * @brief crops a bounding box with another one. * - * this could be useful for gettng a bbox which fits with view frustum and + * this could be useful for getting a bbox which fits with view frustum and * object bounding boxes. In this case you crop view frustum box with objects * box * diff --git a/include/cglm/struct/ivec2.h b/include/cglm/struct/ivec2.h index ad1c416..d53c9f6 100644 --- a/include/cglm/struct/ivec2.h +++ b/include/cglm/struct/ivec2.h @@ -238,7 +238,7 @@ glms_ivec2_(subs)(ivec2s v, int s) { /*! * @brief multiply vector [a] with vector [b] and store result in [dest] * - * @param[in] a frist vector + * @param[in] a first vector * @param[in] b second vector * @returns destination */ diff --git a/include/cglm/struct/ivec3.h b/include/cglm/struct/ivec3.h index 3d24a1b..c2c5f3b 100644 --- a/include/cglm/struct/ivec3.h +++ b/include/cglm/struct/ivec3.h @@ -163,7 +163,7 @@ glms_ivec3_(dot)(ivec3s a, ivec3s b) { * @brief norm * norm (magnitude) of vec * * we can use this func instead of calling norm * norm, because it would call - * sqrtf fuction twice but with this func we can avoid func call, maybe this is + * sqrtf function twice but with this func we can avoid func call, maybe this is * not good name for this func * * @param[in] v vector @@ -253,7 +253,7 @@ glms_ivec3_(subs)(ivec3s v, int s) { /*! * @brief multiply vector [a] with vector [b] and store result in [dest] * - * @param[in] a frist vector + * @param[in] a first vector * @param[in] b second vector * @returns destination */ diff --git a/include/cglm/struct/ivec4.h b/include/cglm/struct/ivec4.h index e8f29a1..103e887 100644 --- a/include/cglm/struct/ivec4.h +++ b/include/cglm/struct/ivec4.h @@ -201,7 +201,7 @@ glms_ivec4_(subs)(ivec4s v, int s) { /*! * @brief multiply vector [a] with vector [b] and store result in [dest] * - * @param[in] a frist vector + * @param[in] a first vector * @param[in] b second vector * @returns destination */ diff --git a/include/cglm/struct/quat.h b/include/cglm/struct/quat.h index ff87740..d6789e4 100644 --- a/include/cglm/struct/quat.h +++ b/include/cglm/struct/quat.h @@ -105,7 +105,7 @@ glms_quat_(identity_array)(versors * __restrict q, size_t count) { } /*! - * @brief inits quaterion with raw values + * @brief inits quaternion with raw values * * @param[in] x x * @param[in] y y @@ -464,7 +464,7 @@ glms_quat_(slerp)(versors from, versors to, float t) { * * @param[in] from from * @param[in] to to - * @param[in] t amout + * @param[in] t amount * @returns result quaternion */ CGLM_INLINE From 48839a38a14a653c233693fa911348ce58d57167 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Mon, 15 Jul 2024 12:41:23 +0300 Subject: [PATCH 007/128] fix refract --- include/cglm/vec2.h | 2 +- include/cglm/vec3.h | 2 +- include/cglm/vec4.h | 2 +- test/src/test_vec2.h | 4 ++-- test/src/test_vec3.h | 4 ++-- test/src/test_vec4.h | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/include/cglm/vec2.h b/include/cglm/vec2.h index aaac759..98cd4df 100644 --- a/include/cglm/vec2.h +++ b/include/cglm/vec2.h @@ -749,7 +749,7 @@ glm_vec2_refract(vec2 v, vec2 n, float eta, vec2 dest) { ndi = glm_vec2_dot(n, v); eni = eta * ndi; - k = 1.0f + eta * eta - eni * eni; + k = 1.0f - eta * eta + eni * eni; if (k < 0.0f) { glm_vec2_zero(dest); diff --git a/include/cglm/vec3.h b/include/cglm/vec3.h index be4029b..e6a9898 100644 --- a/include/cglm/vec3.h +++ b/include/cglm/vec3.h @@ -1263,7 +1263,7 @@ glm_vec3_refract(vec3 v, vec3 n, float eta, vec3 dest) { ndi = glm_vec3_dot(n, v); eni = eta * ndi; - k = 1.0f + eta * eta - eni * eni; + k = 1.0f - eta * eta + eni * eni; if (k < 0.0f) { glm_vec3_zero(dest); diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index e24675f..b259235 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -1350,7 +1350,7 @@ glm_vec4_refract(vec4 v, vec4 n, float eta, vec4 dest) { ndi = glm_vec4_dot(n, v); eni = eta * ndi; - k = 1.0f + eta * eta - eni * eni; + k = 1.0f - eta * eta + eni * eni; if (k < 0.0f) { glm_vec4_zero(dest); diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index e7bfe88..966847b 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -792,7 +792,7 @@ TEST_IMPL(GLM_PREFIX, vec2_refract) { r = GLM(vec2_refract)(v, N, eta, dest); // In 2D, we expect a similar bending behavior as in 3D, so we check dest[1] if (!(dest[0] == 0.0f && dest[1] == 0.0f)) { - ASSERT(dest[1] < -sqrtf(0.5f)); // Refracted ray bends away from the normal + ASSERT(dest[1] < -0.3f); // Refracted ray bends away from the normal ASSERT(r == true); } else { ASSERT(dest[0] == 0.0f && dest[1] == 0.0f); // Total internal reflection @@ -809,7 +809,7 @@ TEST_IMPL(GLM_PREFIX, vec2_refract) { eta = 1.5f / 1.33f; r = GLM(vec2_refract)(v, N, eta, dest); ASSERT(r == true); - ASSERT(dest[1] < -sqrtf(0.5f)); // Expect bending towards the normal, less bending than air to glass + ASSERT(dest[1] < -0.6f); // Expect bending towards the normal, less bending than air to glass /* Diamond to Air (eta = 2.42 / 1.0) */ eta = 2.42f / 1.0f; diff --git a/test/src/test_vec3.h b/test/src/test_vec3.h index 7c057f3..ac50473 100644 --- a/test/src/test_vec3.h +++ b/test/src/test_vec3.h @@ -1901,7 +1901,7 @@ TEST_IMPL(GLM_PREFIX, vec3_refract) { eta = 1.33f / 1.0f; r = GLM(vec3_refract)(v, N, eta, dest); if (!(dest[0] == 0.0f && dest[1] == 0.0f && dest[2] == 0.0f)) { - ASSERT(dest[1] < -sqrtf(0.5f)); + ASSERT(dest[1] < -0.3f); ASSERT(r == true); } else { ASSERT(dest[0] == 0.0f && dest[1] == 0.0f && dest[2] == 0.0f); @@ -1922,7 +1922,7 @@ TEST_IMPL(GLM_PREFIX, vec3_refract) { /* Expect bending towards the normal, less bending than air to glass */ ASSERT(r == true); - ASSERT(dest[1] < -sqrtf(0.5f)); + ASSERT(dest[1] < -0.6f); /* Diamond to Air (eta = 2.42 / 1.0) */ eta = 2.42f / 1.0f; diff --git a/test/src/test_vec4.h b/test/src/test_vec4.h index 435c700..90122f2 100644 --- a/test/src/test_vec4.h +++ b/test/src/test_vec4.h @@ -1586,7 +1586,7 @@ TEST_IMPL(GLM_PREFIX, vec4_refract) { eta = 1.33f / 1.0f; r = GLM(vec4_refract)(v, N, eta, dest); if (!(dest[0] == 0.0f && dest[1] == 0.0f && dest[2] == 0.0f && dest[3] == 0.0f)) { - ASSERT(dest[1] < -sqrtf(0.5f)); + ASSERT(dest[1] < -0.3f); ASSERT(r == true); } else { ASSERT(dest[0] == 0.0f && dest[1] == 0.0f && dest[2] == 0.0f && dest[3] == 0.0f); @@ -1603,7 +1603,7 @@ TEST_IMPL(GLM_PREFIX, vec4_refract) { eta = 1.5f / 1.33f; r = GLM(vec4_refract)(v, N, eta, dest); ASSERT(r == true); - ASSERT(dest[1] < -sqrtf(0.5f)); // Expect bending towards the normal, less bending than air to glass + ASSERT(dest[1] < -0.6f); // Expect bending towards the normal, less bending than air to glass /* Diamond to Air (eta = 2.42 / 1.0) */ eta = 2.42f / 1.0f; From f82d570decded93592f86c62a8281ea0371fe928 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 27 Aug 2024 11:58:34 +0300 Subject: [PATCH 008/128] take -pedantic into account to validate CGLM_USE_ANONYMOUS_STRUCT --- include/cglm/types-struct.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/cglm/types-struct.h b/include/cglm/types-struct.h index 0a3ad0f..d93152e 100644 --- a/include/cglm/types-struct.h +++ b/include/cglm/types-struct.h @@ -24,6 +24,12 @@ /* The user has defined CGLM_NO_ANONYMOUS_STRUCT. This used to be the * only #define governing the use of anonymous structs, so for backward * compatibility, we still honor that choice and disable them. */ +# define CGLM_USE_ANONYMOUS_STRUCT 0 + /* Disable anonymous structs if strict ANSI mode is enabled for C89 or C99 */ +# elif defined(__STRICT_ANSI__) && \ + (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 201112L)) + /* __STRICT_ANSI__ is defined and we're in C89 + * or C99 mode (C11 or later not detected) */ # define CGLM_USE_ANONYMOUS_STRUCT 0 # elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \ (defined(__cplusplus) && __cplusplus >= 201103L) From 33e78ca2ad733a36da6528154eb4c46bacccd1c0 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 27 Aug 2024 12:13:28 +0300 Subject: [PATCH 009/128] suppress warns about va-args --- test/include/common.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/include/common.h b/test/include/common.h index cdeede2..1b03f34 100644 --- a/test/include/common.h +++ b/test/include/common.h @@ -106,7 +106,7 @@ typedef struct test_entry_t { #define TEST_IMPL_ARG3(arg1, arg2, arg3, ...) arg3 #define TEST_IMPL_CHOOSER(...) \ - EXPAND(TEST_IMPL_ARG3(__VA_ARGS__, TEST_IMPL_ARG2, TEST_IMPL_ARG1)) + EXPAND(TEST_IMPL_ARG3(__VA_ARGS__, TEST_IMPL_ARG2, TEST_IMPL_ARG1,)) #define TEST_IMPL(...) EXPAND(TEST_IMPL_CHOOSER(__VA_ARGS__)(__VA_ARGS__)) @@ -127,7 +127,7 @@ typedef struct test_entry_t { #define ASSERT_ARG2(expr, msg) ASSERT_EXT(expr, msg) #define ASSERT_ARG3(arg1, arg2, arg3, ...) arg3 -#define ASSERT_CHOOSER(...) ASSERT_ARG3(__VA_ARGS__, ASSERT_ARG2, ASSERT_ARG1) +#define ASSERT_CHOOSER(...) ASSERT_ARG3(__VA_ARGS__, ASSERT_ARG2, ASSERT_ARG1,) #define ASSERT(...) do { ASSERT_CHOOSER(__VA_ARGS__)(__VA_ARGS__) } while(0); #define ASSERTIFY(expr) do { \ test_status_t ts; \ From 2f619cdd6f5ce4a9b425babfdfce1af36bfda2af Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 27 Aug 2024 12:22:42 +0300 Subject: [PATCH 010/128] newlines --- include/cglm/aabb2d.h | 1 - include/cglm/call/aabb2d.h | 2 -- include/cglm/call/box.h | 1 - include/cglm/call/project.h | 2 -- include/cglm/call/vec4.h | 1 - include/cglm/handed/euler_to_quat_lh.h | 2 +- include/cglm/struct/aabb2d.h | 1 - src/euler.c | 1 - src/ivec2.c | 1 - src/ivec3.c | 1 - src/ivec4.c | 1 - test/src/test_euler_to_quat_lh.h | 2 -- test/src/test_euler_to_quat_rh.h | 2 -- test/src/test_ray.h | 1 - test/src/test_vec2.h | 1 - test/src/test_vec4.h | 1 - 16 files changed, 1 insertion(+), 20 deletions(-) diff --git a/include/cglm/aabb2d.h b/include/cglm/aabb2d.h index 27679a7..6369d08 100644 --- a/include/cglm/aabb2d.h +++ b/include/cglm/aabb2d.h @@ -268,4 +268,3 @@ glm_aabb2d_contains(vec2 aabb[2], vec2 other[2]) { } #endif /* cglm_aabb2d_h */ - diff --git a/include/cglm/call/aabb2d.h b/include/cglm/call/aabb2d.h index 950607e..e6f36a0 100644 --- a/include/cglm/call/aabb2d.h +++ b/include/cglm/call/aabb2d.h @@ -87,5 +87,3 @@ glmc_aabb2d_circle(vec2 aabb[2], vec3 s); } #endif #endif /* cglmc_aabb2d_h */ - - diff --git a/include/cglm/call/box.h b/include/cglm/call/box.h index afb7558..3617eed 100644 --- a/include/cglm/call/box.h +++ b/include/cglm/call/box.h @@ -76,4 +76,3 @@ glmc_aabb_sphere(vec3 box[2], vec4 s); } #endif #endif /* cglmc_box_h */ - diff --git a/include/cglm/call/project.h b/include/cglm/call/project.h index fcfcf2b..8fa7172 100644 --- a/include/cglm/call/project.h +++ b/include/cglm/call/project.h @@ -37,5 +37,3 @@ glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest); } #endif #endif /* cglmc_project_h */ - - diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index a976e94..9857473 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -323,4 +323,3 @@ glmc_vec4_refract(vec4 v, vec4 n, float eta, vec4 dest); } #endif #endif /* cglmc_vec4_h */ - diff --git a/include/cglm/handed/euler_to_quat_lh.h b/include/cglm/handed/euler_to_quat_lh.h index def40c9..1bb350b 100644 --- a/include/cglm/handed/euler_to_quat_lh.h +++ b/include/cglm/handed/euler_to_quat_lh.h @@ -164,4 +164,4 @@ glm_euler_zyx_quat_lh(vec3 angles, versor dest) { dest[3] = zc * yc * xc + zs * ys * xs; } -#endif /*cglm_euler_to_quat_lh_h*/ \ No newline at end of file +#endif /*cglm_euler_to_quat_lh_h*/ diff --git a/include/cglm/struct/aabb2d.h b/include/cglm/struct/aabb2d.h index e60d16e..71317fa 100644 --- a/include/cglm/struct/aabb2d.h +++ b/include/cglm/struct/aabb2d.h @@ -232,4 +232,3 @@ glms_aabb2d_(contains)(vec2s aabb[2], vec2s other[2]) { } #endif /* cglms_aabb2ds_h */ - diff --git a/src/euler.c b/src/euler.c index 2b0fe0f..8749ba5 100644 --- a/src/euler.c +++ b/src/euler.c @@ -97,4 +97,3 @@ void glmc_euler_zyx_quat(vec3 angles, versor dest) { glm_euler_zyx_quat(angles, dest); } - diff --git a/src/ivec2.c b/src/ivec2.c index 0e39b5b..2fd0993 100644 --- a/src/ivec2.c +++ b/src/ivec2.c @@ -247,4 +247,3 @@ void glmc_ivec2_abs(ivec2 v, ivec2 dest) { glm_ivec2_abs(v, dest); } - diff --git a/src/ivec3.c b/src/ivec3.c index 7644c99..4a2ea2f 100644 --- a/src/ivec3.c +++ b/src/ivec3.c @@ -253,4 +253,3 @@ void glmc_ivec3_abs(ivec3 v, ivec3 dest) { glm_ivec3_abs(v, dest); } - diff --git a/src/ivec4.c b/src/ivec4.c index 4f57a3b..1e976a6 100644 --- a/src/ivec4.c +++ b/src/ivec4.c @@ -199,4 +199,3 @@ void glmc_ivec4_abs(ivec4 v, ivec4 dest) { glm_ivec4_abs(v, dest); } - diff --git a/test/src/test_euler_to_quat_lh.h b/test/src/test_euler_to_quat_lh.h index faec48e..d4351b0 100644 --- a/test/src/test_euler_to_quat_lh.h +++ b/test/src/test_euler_to_quat_lh.h @@ -491,5 +491,3 @@ TEST_IMPL(GLM_PREFIX, euler_zyx_quat_lh) { } TEST_SUCCESS } - - diff --git a/test/src/test_euler_to_quat_rh.h b/test/src/test_euler_to_quat_rh.h index 221192e..6140a6b 100644 --- a/test/src/test_euler_to_quat_rh.h +++ b/test/src/test_euler_to_quat_rh.h @@ -571,5 +571,3 @@ TEST_IMPL(GLM_PREFIX, euler_zyx_quat_rh) { } TEST_SUCCESS } - - diff --git a/test/src/test_ray.h b/test/src/test_ray.h index 6f2bec5..ac47685 100644 --- a/test/src/test_ray.h +++ b/test/src/test_ray.h @@ -71,4 +71,3 @@ TEST_IMPL(GLM_PREFIX, ray_at) { TEST_SUCCESS } - diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index 966847b..870d6eb 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -825,4 +825,3 @@ TEST_IMPL(GLM_PREFIX, vec2_refract) { TEST_SUCCESS } - diff --git a/test/src/test_vec4.h b/test/src/test_vec4.h index 90122f2..a9a32b4 100644 --- a/test/src/test_vec4.h +++ b/test/src/test_vec4.h @@ -1619,4 +1619,3 @@ TEST_IMPL(GLM_PREFIX, vec4_refract) { TEST_SUCCESS } - From ad009d4e49b850c8cad2b3fb191c5a7b0fca9f2d Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 27 Aug 2024 12:29:43 +0300 Subject: [PATCH 011/128] doc: improve briefs --- include/cglm/struct/vec2-ext.h | 4 ++-- include/cglm/struct/vec3-ext.h | 4 ++-- include/cglm/vec2-ext.h | 4 ++-- include/cglm/vec3-ext.h | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/cglm/struct/vec2-ext.h b/include/cglm/struct/vec2-ext.h index f467aeb..7d77386 100644 --- a/include/cglm/struct/vec2-ext.h +++ b/include/cglm/struct/vec2-ext.h @@ -133,7 +133,7 @@ glms_vec2_min(vec2s v) { } /*! - * @brief check if all items are NaN (not a number) + * @brief check if one of items is NaN (not a number) * you should only use this in DEBUG mode or very critical asserts * * @param[in] v vector @@ -145,7 +145,7 @@ glms_vec2_(isnan)(vec2s v) { } /*! - * @brief check if all items are INFINITY + * @brief check if one of items is INFINITY * you should only use this in DEBUG mode or very critical asserts * * @param[in] v vector diff --git a/include/cglm/struct/vec3-ext.h b/include/cglm/struct/vec3-ext.h index 31fb6c2..1a3e88a 100644 --- a/include/cglm/struct/vec3-ext.h +++ b/include/cglm/struct/vec3-ext.h @@ -151,7 +151,7 @@ glms_vec3_(min)(vec3s v) { } /*! - * @brief check if all items are NaN (not a number) + * @brief check if one of items is NaN (not a number) * you should only use this in DEBUG mode or very critical asserts * * @param[in] v vector @@ -163,7 +163,7 @@ glms_vec3_(isnan)(vec3s v) { } /*! - * @brief check if all items are INFINITY + * @brief check if one of items is INFINITY * you should only use this in DEBUG mode or very critical asserts * * @param[in] v vector diff --git a/include/cglm/vec2-ext.h b/include/cglm/vec2-ext.h index 1015a39..4e4d899 100644 --- a/include/cglm/vec2-ext.h +++ b/include/cglm/vec2-ext.h @@ -128,7 +128,7 @@ glm_vec2_min(vec2 v) { } /*! - * @brief check if all items are NaN (not a number) + * @brief check if one of items is NaN (not a number) * you should only use this in DEBUG mode or very critical asserts * * @param[in] v vector @@ -140,7 +140,7 @@ glm_vec2_isnan(vec2 v) { } /*! - * @brief check if all items are INFINITY + * @brief check if one of items is INFINITY * you should only use this in DEBUG mode or very critical asserts * * @param[in] v vector diff --git a/include/cglm/vec3-ext.h b/include/cglm/vec3-ext.h index bea5583..d2e113a 100644 --- a/include/cglm/vec3-ext.h +++ b/include/cglm/vec3-ext.h @@ -164,7 +164,7 @@ glm_vec3_min(vec3 v) { } /*! - * @brief check if all items are NaN (not a number) + * @brief check if one of items is NaN (not a number) * you should only use this in DEBUG mode or very critical asserts * * @param[in] v vector @@ -176,7 +176,7 @@ glm_vec3_isnan(vec3 v) { } /*! - * @brief check if all items are INFINITY + * @brief check if one of items is INFINITY * you should only use this in DEBUG mode or very critical asserts * * @param[in] v vector From b0f35203f92263bde670a69a4b6c2b0447d1c9a6 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 27 Aug 2024 12:32:58 +0300 Subject: [PATCH 012/128] suppress warns --- test/src/test_vec3.h | 2 ++ test/src/test_vec4.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/test/src/test_vec3.h b/test/src/test_vec3.h index ac50473..92043dd 100644 --- a/test/src/test_vec3.h +++ b/test/src/test_vec3.h @@ -1673,7 +1673,9 @@ TEST_IMPL(GLM_PREFIX, vec3_eqv_eps) { TEST_IMPL(GLM_PREFIX, vec3_max) { vec3 v1 = {2.104f, -3.012f, -4.10f}, v2 = {-12.35f, -31.140f, -43.502f}; +#ifndef CGLM_FAST_MATH vec3 v3 = {INFINITY, 0.0f, 0.0f}/*, v4 = {NAN, INFINITY, 2.0f}*/; +#endif vec3 /*v5 = {NAN, -1.0f, -1.0f}, */v6 = {-1.0f, -11.0f, 11.0f}; ASSERT(test_eq(GLM(vec3_max)(v1), 2.104f)) diff --git a/test/src/test_vec4.h b/test/src/test_vec4.h index a9a32b4..f017a8a 100644 --- a/test/src/test_vec4.h +++ b/test/src/test_vec4.h @@ -1344,7 +1344,9 @@ TEST_IMPL(GLM_PREFIX, vec4_eqv_eps) { TEST_IMPL(GLM_PREFIX, vec4_max) { vec4 v1 = {2.104f, -3.012f, -4.10f, -4.10f}; vec4 v2 = {-12.35f, -31.140f, -43.502f, -43.502f}; +#ifndef CGLM_FAST_MATH vec4 v3 = {INFINITY, 0.0f, 0.0f, 0.0f}; +#endif // vec4 v4 = {NAN, INFINITY, 2.0f, 2.0f}; // vec4 v5 = {NAN, -1.0f, -1.0f, -1.0f}; vec4 v6 = {-1.0f, -11.0f, 11.0f, 11.0f}; From c12f318fabf14853174419f3892654612186c5c7 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 27 Aug 2024 13:40:34 +0300 Subject: [PATCH 013/128] supress fast-math warns --- include/cglm/vec2-ext.h | 8 ++++++++ include/cglm/vec3-ext.h | 8 ++++++++ include/cglm/vec4-ext.h | 8 ++++++++ test/src/test_vec3.h | 32 ++++++++++++++++++++++++++++++++ test/src/test_vec4.h | 4 ++++ 5 files changed, 60 insertions(+) diff --git a/include/cglm/vec2-ext.h b/include/cglm/vec2-ext.h index 4e4d899..ac6615e 100644 --- a/include/cglm/vec2-ext.h +++ b/include/cglm/vec2-ext.h @@ -136,7 +136,11 @@ glm_vec2_min(vec2 v) { CGLM_INLINE bool glm_vec2_isnan(vec2 v) { +#ifndef CGLM_FAST_MATH return isnan(v[0]) || isnan(v[1]); +#else + return false; +#endif } /*! @@ -148,7 +152,11 @@ glm_vec2_isnan(vec2 v) { CGLM_INLINE bool glm_vec2_isinf(vec2 v) { +#ifndef CGLM_FAST_MATH return isinf(v[0]) || isinf(v[1]); +#else + return false; +#endif } /*! diff --git a/include/cglm/vec3-ext.h b/include/cglm/vec3-ext.h index d2e113a..808d32c 100644 --- a/include/cglm/vec3-ext.h +++ b/include/cglm/vec3-ext.h @@ -172,7 +172,11 @@ glm_vec3_min(vec3 v) { CGLM_INLINE bool glm_vec3_isnan(vec3 v) { +#ifndef CGLM_FAST_MATH return isnan(v[0]) || isnan(v[1]) || isnan(v[2]); +#else + return false; +#endif } /*! @@ -184,7 +188,11 @@ glm_vec3_isnan(vec3 v) { CGLM_INLINE bool glm_vec3_isinf(vec3 v) { +#ifndef CGLM_FAST_MATH return isinf(v[0]) || isinf(v[1]) || isinf(v[2]); +#else + return false; +#endif } /*! diff --git a/include/cglm/vec4-ext.h b/include/cglm/vec4-ext.h index cc09ee1..e8678c3 100644 --- a/include/cglm/vec4-ext.h +++ b/include/cglm/vec4-ext.h @@ -186,7 +186,11 @@ glm_vec4_min(vec4 v) { CGLM_INLINE bool glm_vec4_isnan(vec4 v) { +#ifndef CGLM_FAST_MATH return isnan(v[0]) || isnan(v[1]) || isnan(v[2]) || isnan(v[3]); +#else + return false; +#endif } /*! @@ -198,7 +202,11 @@ glm_vec4_isnan(vec4 v) { CGLM_INLINE bool glm_vec4_isinf(vec4 v) { +#ifndef CGLM_FAST_MATH return isinf(v[0]) || isinf(v[1]) || isinf(v[2]) || isinf(v[3]); +#else + return false; +#endif } /*! diff --git a/test/src/test_vec3.h b/test/src/test_vec3.h index 92043dd..5e9c387 100644 --- a/test/src/test_vec3.h +++ b/test/src/test_vec3.h @@ -872,18 +872,30 @@ TEST_IMPL(GLM_PREFIX, vec3_angle) { float a; a = GLM(vec3_angle)(v1, v1); + +#ifndef CGLM_FAST_MATH ASSERT(!isinf(a)) ASSERT(!isnan(a)) +#endif + ASSERT(test_eq(a, 0.0f)) a = GLM(vec3_angle)(v1, v2); + +#ifndef CGLM_FAST_MATH ASSERT(!isinf(a)) ASSERT(!isnan(a)) +#endif + ASSERT(test_eq(a, GLM_PI_4f)) a = GLM(vec3_angle)(v1, v3); + +#ifndef CGLM_FAST_MATH ASSERT(!isinf(a)) ASSERT(!isnan(a)) +#endif + ASSERT(test_eq(a, GLM_PI_2f)) TEST_SUCCESS @@ -1227,23 +1239,39 @@ TEST_IMPL(GLM_PREFIX, vec3_ortho) { GLM(vec3_ortho)(v4, v8); a = glm_vec3_angle(v1, v5); + +#ifndef CGLM_FAST_MATH ASSERT(!isinf(a)) ASSERT(!isnan(a)) +#endif + ASSERT(test_eq(a, GLM_PI_2f)) a = glm_vec3_angle(v2, v6); + +#ifndef CGLM_FAST_MATH ASSERT(!isinf(a)) ASSERT(!isnan(a)) +#endif + ASSERT(test_eq(a, GLM_PI_2f)) a = glm_vec3_angle(v3, v7); + +#ifndef CGLM_FAST_MATH ASSERT(!isinf(a)) ASSERT(!isnan(a)) +#endif + ASSERT(test_eq(a, GLM_PI_2f)) a = glm_vec3_angle(v4, v8); + +#ifndef CGLM_FAST_MATH ASSERT(!isinf(a)) ASSERT(!isnan(a)) +#endif + ASSERT(test_eq(a, GLM_PI_2f)) TEST_SUCCESS @@ -1692,12 +1720,16 @@ TEST_IMPL(GLM_PREFIX, vec3_max) { TEST_IMPL(GLM_PREFIX, vec3_min) { vec3 v1 = {2.104f, -3.012f, -4.10f}, v2 = {-12.35f, -31.140f, -43.502f}; +#ifndef CGLM_FAST_MATH vec3 v3 = {INFINITY, 0.0f, 0.0f}/*, v4 = {NAN, INFINITY, 2.0f}*/; +#endif vec3 /*v5 = {NAN, -1.0f, -1.0f},*/ v6 = {-1.0f, -11.0f, 11.0f}; ASSERT(test_eq(GLM(vec3_min)(v1), -4.10f)) ASSERT(test_eq(GLM(vec3_min)(v2), -43.502f)) +#ifndef CGLM_FAST_MATH ASSERT(test_eq(GLM(vec3_min)(v3), 0.0f)) +#endif // ASSERT(isnan(GLM(vec3_min)(v4))) // ASSERT(isnan(GLM(vec3_min)(v5))) ASSERT(test_eq(GLM(vec3_min)(v6), -11.0f)) diff --git a/test/src/test_vec4.h b/test/src/test_vec4.h index f017a8a..cb34543 100644 --- a/test/src/test_vec4.h +++ b/test/src/test_vec4.h @@ -1366,14 +1366,18 @@ TEST_IMPL(GLM_PREFIX, vec4_max) { TEST_IMPL(GLM_PREFIX, vec4_min) { vec4 v1 = {2.104f, -3.012f, -4.10f, -4.10f}; vec4 v2 = {-12.35f, -31.140f, -43.502f, -43.502f}; +#ifndef CGLM_FAST_MATH vec4 v3 = {INFINITY, 0.0f, 0.0f, 0.0f}; +#endif // vec4 v4 = {NAN, INFINITY, 2.0f, 2.0f}; // vec4 v5 = {NAN, -1.0f, -1.0f, -1.0f}; vec4 v6 = {-1.0f, -11.0f, 11.0f, 11.0f}; ASSERT(test_eq(GLM(vec4_min)(v1), -4.10f)) ASSERT(test_eq(GLM(vec4_min)(v2), -43.502f)) +#ifndef CGLM_FAST_MATH ASSERT(test_eq(GLM(vec4_min)(v3), 0.0f)) +#endif // ASSERT(isnan(GLM(vec4_min)(v4))) // ASSERT(isnan(GLM(vec4_min)(v5))) ASSERT(test_eq(GLM(vec4_min)(v6), -11.0f)) From e930737807acb4cda7b3cb453e8785890e20bf05 Mon Sep 17 00:00:00 2001 From: Alex Belanger Date: Mon, 9 Sep 2024 10:06:09 -0400 Subject: [PATCH 014/128] Bump CMake minimum version to 3.13 --- CMakeLists.txt | 55 +++++++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 169296d..4632b56 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.8.2) +cmake_minimum_required(VERSION 3.13) project(cglm VERSION 0.9.5 HOMEPAGE_URL https://github.com/recp/cglm @@ -37,9 +37,10 @@ if(MSVC) if(NOT CMAKE_BUILD_TYPE MATCHES Debug) add_definitions(-DNDEBUG) add_compile_options(/W3 /Ox /Gy /Oi /TC) + foreach(flag_var - CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE - CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) + CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}") endforeach(flag_var) endif() @@ -56,6 +57,7 @@ get_directory_property(hasParent PARENT_DIRECTORY) if(NOT hasParent AND NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.") set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE) + # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() @@ -116,7 +118,7 @@ add_library(${PROJECT_NAME} src/clipspace/view_rh_zo.c src/clipspace/project_no.c src/clipspace/project_zo.c - ) +) if(CGLM_SHARED) add_definitions(-DCGLM_EXPORTS) @@ -125,8 +127,8 @@ else() endif() set_target_properties(${PROJECT_NAME} PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR}) + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR}) if(WIN32) # Because SOVERSION has no effect to file naming on Windows @@ -135,11 +137,11 @@ if(WIN32) endif() target_include_directories(${PROJECT_NAME} - PUBLIC - $ - $ - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/src + PUBLIC + $ + $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src ) # Target for header-only usage @@ -154,40 +156,43 @@ if(CGLM_USE_TEST) add_subdirectory(test) endif() -# Install +# Install install(TARGETS ${PROJECT_NAME} - EXPORT ${PROJECT_NAME} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + EXPORT ${PROJECT_NAME} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - PATTERN ".*" EXCLUDE) + PATTERN ".*" EXCLUDE) # Config export(TARGETS ${PROJECT_NAME} - NAMESPACE ${PROJECT_NAME}:: - FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + NAMESPACE ${PROJECT_NAME}:: + FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" ) -install(EXPORT ${PROJECT_NAME} - FILE "${PROJECT_NAME}Config.cmake" - NAMESPACE ${PROJECT_NAME}:: - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) +install(EXPORT ${PROJECT_NAME} + FILE "${PROJECT_NAME}Config.cmake" + NAMESPACE ${PROJECT_NAME}:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) set(PACKAGE_NAME ${PROJECT_NAME}) set(prefix ${CMAKE_INSTALL_PREFIX}) set(exec_prefix ${CMAKE_INSTALL_PREFIX}) -if (IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}") + +if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}") set(includedir "${CMAKE_INSTALL_INCLUDEDIR}") else() set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") endif() -if (IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") + +if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") set(libdir "${CMAKE_INSTALL_LIBDIR}") else() set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") endif() + set(PACKAGE_VERSION "${PROJECT_VERSION}") configure_file(cglm.pc.in cglm.pc @ONLY) From 5484259328a80e7f60d28f89235940f3cad581ea Mon Sep 17 00:00:00 2001 From: Alex Belanger Date: Mon, 9 Sep 2024 10:35:24 -0400 Subject: [PATCH 015/128] Undid the formatting. --- CMakeLists.txt | 53 +++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4632b56..01086fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,10 +37,9 @@ if(MSVC) if(NOT CMAKE_BUILD_TYPE MATCHES Debug) add_definitions(-DNDEBUG) add_compile_options(/W3 /Ox /Gy /Oi /TC) - foreach(flag_var - CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE - CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) + CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}") endforeach(flag_var) endif() @@ -57,7 +56,6 @@ get_directory_property(hasParent PARENT_DIRECTORY) if(NOT hasParent AND NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.") set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE) - # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() @@ -118,7 +116,7 @@ add_library(${PROJECT_NAME} src/clipspace/view_rh_zo.c src/clipspace/project_no.c src/clipspace/project_zo.c -) + ) if(CGLM_SHARED) add_definitions(-DCGLM_EXPORTS) @@ -127,8 +125,8 @@ else() endif() set_target_properties(${PROJECT_NAME} PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR}) + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR}) if(WIN32) # Because SOVERSION has no effect to file naming on Windows @@ -137,11 +135,11 @@ if(WIN32) endif() target_include_directories(${PROJECT_NAME} - PUBLIC - $ - $ - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/src + PUBLIC + $ + $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src ) # Target for header-only usage @@ -156,43 +154,40 @@ if(CGLM_USE_TEST) add_subdirectory(test) endif() -# Install +# Install install(TARGETS ${PROJECT_NAME} - EXPORT ${PROJECT_NAME} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + EXPORT ${PROJECT_NAME} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - PATTERN ".*" EXCLUDE) + PATTERN ".*" EXCLUDE) # Config export(TARGETS ${PROJECT_NAME} - NAMESPACE ${PROJECT_NAME}:: - FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + NAMESPACE ${PROJECT_NAME}:: + FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" ) -install(EXPORT ${PROJECT_NAME} - FILE "${PROJECT_NAME}Config.cmake" - NAMESPACE ${PROJECT_NAME}:: - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) +install(EXPORT ${PROJECT_NAME} + FILE "${PROJECT_NAME}Config.cmake" + NAMESPACE ${PROJECT_NAME}:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) set(PACKAGE_NAME ${PROJECT_NAME}) set(prefix ${CMAKE_INSTALL_PREFIX}) set(exec_prefix ${CMAKE_INSTALL_PREFIX}) - -if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}") +if (IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}") set(includedir "${CMAKE_INSTALL_INCLUDEDIR}") else() set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") endif() - -if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") +if (IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") set(libdir "${CMAKE_INSTALL_LIBDIR}") else() set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") endif() - set(PACKAGE_VERSION "${PROJECT_VERSION}") configure_file(cglm.pc.in cglm.pc @ONLY) From 054b2df0048e655b15bbf5621316c1baba20a66b Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 3 Dec 2024 14:27:06 +0300 Subject: [PATCH 016/128] vscode: disable formatOnSave --- .vscode/settings.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index e4a6b4f..3593466 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,7 @@ "restructuredtext.confPath": "${workspaceFolder}/docs/source", "workbench.colorTheme": "Default Light+ Experimental", "editor.fontSize": 14, + "editor.formatOnSave": false, "workbench.colorCustomizations": { "[Default Light*]": { "editor.background": "#fefefe", @@ -28,4 +29,4 @@ "editorGroupHeader.tabsBackground": "#1D1D25" } }, -} \ No newline at end of file +} From 9d079d3cc30955bd796768d90c92bccf5d96268a Mon Sep 17 00:00:00 2001 From: zorby Date: Mon, 30 Dec 2024 13:50:11 +0100 Subject: [PATCH 017/128] Restructure README --- BUILDING.md | 199 +++++++++++++++++++++++ README.md | 453 ++++++++-------------------------------------------- 2 files changed, 266 insertions(+), 386 deletions(-) create mode 100644 BUILDING.md diff --git a/BUILDING.md b/BUILDING.md new file mode 100644 index 0000000..01452f5 --- /dev/null +++ b/BUILDING.md @@ -0,0 +1,199 @@ +# Building the library + +cglm can be built using one of the following build systems: + +## CMake (All platforms) +```bash +$ mkdir build +$ cd build +$ cmake .. # [Optional] -DCGLM_SHARED=ON +$ make +$ sudo make install # [Optional] +``` + +### Options with defaults + +```CMake +option(CGLM_SHARED "Shared build" ON) +option(CGLM_STATIC "Static build" OFF) +option(CGLM_USE_C99 "" OFF) #Β C11 +option(CGLM_USE_TEST "Enable Tests" OFF) #Β for make check - make test +``` + +### Including in a CMake project + +#### Header only + +This requires no building or installation of cglm. + +* Example: + +``` cmake +cmake_minimum_required(VERSION 3.8.2) + +project() + +add_executable(${PROJECT_NAME} src/main.c) +target_link_libraries(${LIBRARY_NAME} PRIVATE + cglm_headers) + +add_subdirectory(external/cglm/ EXCLUDE_FROM_ALL) +``` + +#### Linked + +* Example: +```cmake +cmake_minimum_required(VERSION 3.8.2) + +project() + +add_executable(${PROJECT_NAME} src/main.c) +target_link_libraries(${LIBRARY_NAME} PRIVATE + cglm) + +add_subdirectory(external/cglm/) + +# or you can use find_package to configure cglm +``` + +### Using CMake to build for WebAssembly + +Since math functions like `sinf` are used, this can not be targeted at `wasm32-unknown-unknown`, one of [wasi-sdk](https://github.com/WebAssembly/wasi-sdk) or [emscripten](https://github.com/emscripten-core/emsdk) should be used. + +Should note that shared build is not yet supported for WebAssembly. + +For [simd128](https://github.com/WebAssembly/simd) support, add `-msimd128` to `CMAKE_C_FLAGS`, in command line `-DCMAKE_C_FLAGS="-msimd128"`. + +For tests, the cmake option `CGLM_USE_TEST` would still work, you'll need a wasi runtime for running tests, see our [ci config file](.github/workflows/cmake-wasm.yml) for a detailed example. + +#### WASI SDK + +```bash +$ cmake .. \ + -DCMAKE_TOOLCHAIN_FILE=/path/to/wasi-sdk-19.0/share/cmake/wasi-sdk.cmake \ + -DWASI_SDK_PREFIX=/path/to/wasi-sdk-19.0 +``` + +Where `/path/to/wasi-sdk-19.0/` is the path to extracted [wasi sdk](https://github.com/WebAssembly/wasi-sdk). + +In this case it would by default make a static build. + +#### Emscripten + +```bash +$ emcmake cmake .. \ + -DCMAKE_EXE_LINKER_FLAGS="-s STANDALONE_WASM" \ + -DCGLM_STATIC=ON +``` + +The `emcmake` here is the cmake wrapper for Emscripten from installed [emsdk](https://github.com/emscripten-core/emsdk). + +## Meson (All platforms) + +```bash +$ meson build # [Optional] --default-library=static +$ cd build +$ ninja +$ sudo ninja install # [Optional] +``` + +### Options with Defaults: + +```meson +c_std=c11 +buildtype=release +default_library=shared +build_tests=true #Β to run tests: ninja test +``` +### Including in a Meson project +* Example: +```meson +# Clone cglm or create a cglm.wrap under /subprojects +project('name', 'c') + +cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep') + +executable('exe', 'src/main.c', dependencies : cglm_dep) +``` + +## Swift (Swift Package Manager) + +Currently only default build options are supported. Add **cglm** dependency to your project: + +```swift +... +Package( + ... + dependencies: [ + ... + .package(url: "https://github.com/recp/cglm", .branch("master")), + ] + ... +) +``` + +Now add **cgml** as a dependency to your target. Product choices are: +- **cglm** for inlined version of the library which can be linked only statically +- **cglmc** for a compiled version of the library with no linking limitation + +```swift +... +.target( + ... + dependencies: [ + ... + .product(name: "cglm", package: "cglm"), + ] + ... +) +... +``` + +## Unix (Autotools) + +```bash +$ sh autogen.sh +$ ./configure +$ make +$ make check # [Optional] +$ [sudo] make install # [Optional] +``` + +This will also install pkg-config files so you can use +`pkg-config --cflags cglm` and `pkg-config --libs cglm` to retrieve compiler +and linker flags. + +The files will be installed into the given prefix (usually `/usr/local` by +default on Linux), but your pkg-config may not be configured to actually check +there. You can figure out where it's looking by running `pkg-config --variable +pc_path pkg-config` and change the path the files are installed to via +`./configure --with-pkgconfigdir=/your/path`. Alternatively, you can add the +prefix path to your `PKG_CONFIG_PATH` environment variable. + +## Windows (MSBuild) +Windows related build file and project files are located in `win` folder, +make sure you are inside `cglm/win` folder. +Code Analysis is enabled, so it may take awhile to build. + +```Powershell +$ cd win +$ .\build.bat +``` +if `msbuild` won't work (because of multi version VS) then try to build with `devenv`: +```Powershell +$ devenv cglm.sln /Build Release +``` + +### Running Tests on Windows + +You can see test project in same visual studio solution file. It is enough to run that project to run tests. + +# Building the documentation +First you need install Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html +then: +```bash +$ cd docs +$ sphinx-build source build +``` +it will compile docs into build folder, you can run index.html inside that function. \ No newline at end of file diff --git a/README.md b/README.md index 08bc3a5..a688d4d 100644 --- a/README.md +++ b/README.md @@ -39,61 +39,85 @@

-Highly optimized 2D|3D math library, also known as OpenGL Mathematics (glm) for `C`. cglm provides lot of utils to help math operations to be fast and quick to write. It is community friendly, feel free to bring any issues, bugs you faced. +Also known as OpenGL Mathematics (glm) for C, cglm provides fast and ergonomic math functions to ease graphics programming. It is community friendly – feel free to report any bugs and issues you face.
+If you're using C++, you might want to check out GLM

+ - Allocation-free + - Header-only + - SIMD-optimized + - API-agnostic + --- -#### πŸ“š Documentation +### πŸ“š Documentation -Almost all functions (inline versions) and parameters are documented inside the corresponding headers.
-Complete documentation: http://cglm.readthedocs.io +All functions and their parameters are documented above their declaration inside their corresponding headers.
+Alternatively, you can read the complete documentation [here](http://cglm.readthedocs.io). -#### πŸ“Œ Note for previous versions: +### πŸ”¨ Building -- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec3_copy` -- OpenGL related functions are dropped to make this lib platform/third-party independent -- make sure you have latest version and feel free to report bugs, troubles -- **[bugfix]** euler angles was implemented in reverse order (extrinsic) it was fixed, now they are intrinsic. Make sure that -you have the latest version -- **[major change]** by starting v0.4.0, quaternions are stored as [x, y, z, w], it was [w, x, y, z] in v0.3.5 and earlier versions -- **[api rename]** by starting v0.4.5, **glm_simd** functions are renamed to **glmm_** -- **[new option]** by starting v0.4.5, you can disable alignment requirement, check options in docs. -- **[major change]** by starting v0.5.0, vec3 functions use **glm_vec3_** namespace, it was **glm_vec_** until v0.5.0 -- **[major change]** by starting v0.5.1, built-in alignment is removed from **vec3** and **mat3** types -- **[major change]** by starting v0.7.3, inline print functions are disabled in release/production mode to eliminate print costs (see options in documentation). Print output also improved. You can disable colors if you need (see documentation) -- **[major change]** by starting v0.8.3, **cglm** supports alternative clipspace configurations e.g. Left Handed, Zero-to-One (_zo)... `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` is provided to control clipspace. You should be able to use **cglm** with Vulkan, DirectX and Metal now... see https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s +cglm can be used in it's entirety as a header-only library simply by including `cglm/cglm.h`. If you wish to link against it instead, it can be built using one of the supported build systems. Detailed information about building on individual platforms and build systems along with the instructions for building the documentation can be found in [BUILDING.md](./BUILDING.md). -#### πŸ“Œ Note for C++ developers: -If you are not aware of the original GLM library yet, you may also want to look at: -https://github.com/g-truc/glm +### βœ… Usage -#### πŸ“Œ Note for new comers (Important): -- `vec4` and `mat4` variables must be aligned. (There will be unaligned versions later) -- **in** and **[in, out]** parameters must be initialized (please). But **[out]** parameters not, initializing out param is also redundant -- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just include headers. -- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues... -- Welcome! +#### Header-only -#### πŸ“Œ Note for experienced developers: -- Since I'm testing this library in my projects, sometimes bugs occurs; finding that bug[s] and making improvements would be more easy with multiple developer/contributor and their projects or knowledge. Consider to make some tests if you suspect something is wrong and any feedbacks, contributions and bug reports are always welcome. +Include the `cglm/cglm.h` header and use functions with the `glm_` prefix. +```c +#include "cglm/cglm.h" -#### πŸ“Œ Allocations? -`cglm` doesn't alloc any memory on heap. So it doesn't provide any allocator. You should alloc memory for **out** parameters too if you pass pointer of memory location. Don't forget that **vec4** (also quat/**versor**) and **mat4** must be aligned (16-bytes), because *cglm* uses SIMD instructions to optimize most operations if available. +// ... -#### πŸ“Œ Returning vector or matrix... ? +vec2 vector; +glm_vec2_zero(vector); +``` -**cglm** supports both *ARRAY API* and *STRUCT API*, so you can return structs if you utilize struct api (`glms_`). +#### Struct API -
+Include `cglm/struct.h` and use `glms_`. +```c +#include "cglm/struct.h" + +// ... + +vec2s vector = glms_vec2_zero(); +``` + +#### Linked + +Include `cglm/call.h` and use `glmc_`. +```c +#include "cglm/call.h" + +// ... + +vec2 vector; +glmc_vec2_zero(vector); +``` + +### πŸ“Œ Migration notes: + +- `_dup` (duplicate) functions were renamed to `_copy`. For instance: `glm_vec_dup` -> `glm_vec3_copy`. +- OpenGL related functions were dropped to make cglm API independent. +- **[bugfix]** Euler angles had been previously implemented in reverse order (extrinsic). This was fixed to be intrinsic. +- **[major change]** Starting with **v0.4.0**, quaternions are stored as [x, y, z, w]. Previously it was [w, x, y, z]. +- **[api rename]** Starting with **v0.4.5**, `glm_simd_` functions are renamed to `glmm_`. +- **[new option]** Starting with **v0.4.5**, alignment requirements can be disabled. Read more in the documentation. +- **[major change]** Starting with **v0.5.0**, vec3 functions occupy the **glm_vec3_** namespace. This used to be **glm_vec_** in earlier versions. +- **[major change]** Starting with **v0.5.1**, `vec3` and `mat3` types are not aligned by default. +- **[major change]** Starting with **v0.7.3**, inline print functions are disabled by default in release mode to eliminate printing costs (see the Options chapter of the docs).
Colored output can be disabled (see documentation). +- **[major change]** Starting with **v0.8.3**, alternate clipspace configurations are supported. The `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` flags are provided to control clip depth and handedness. This makes it easier to incorporate cglm into projects using graphics APIs such as Vulkan or Metal. See https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s + +---
-
Like some other graphics libraries (especially OpenGL) this library use Column-Major layout to keep matrices in the memory.
+
Like other graphics libraries (especially OpenGL), cglm uses column-major layout to keep matrices in memory.
 
-
In the future the library may support an option to use row-major layout, CURRENTLY if you need to row-major layout you will need to transpose it.
+
While we might support row-major matrices in the future, currently if you need your matrices to be in row-major layout you have to transpose them.
@@ -102,64 +126,9 @@ https://github.com/g-truc/glm
-## πŸš€ Features -- **scalar** and **simd** (sse, avx, neon...) optimizations -- option to use different clipspaces e.g. Left Handed, Zero-to-One... (currently right handed negative-one is default) -- array api and struct api, you can use arrays or structs. -- general purpose matrix operations (mat4, mat3) -- chain matrix multiplication (square only) -- general purpose vector operations (cross, dot, rotate, proj, angle...) -- affine transformations -- matrix decomposition (extract rotation, scaling factor) -- optimized affine transform matrices (mul, rigid-body inverse) -- camera (lookat) -- projections (ortho, perspective) -- quaternions -- euler angles / yaw-pitch-roll to matrix -- extract euler angles -- inline or pre-compiled function call -- frustum (extract view frustum planes, corners...) -- bounding box (AABB in Frustum (culling), crop, merge...) -- bounding sphere -- project, unproject -- easing functions -- curves -- curve interpolation helpers (S*M*C, deCasteljau...) -- helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides -- ray intersection helpers -- and others... +--- -
- -You have two options to call a function/operation: inline or library call (link) -Almost all functions are marked inline (always_inline) so compiler will probably inline. -To call pre-compiled versions, just use `glmc_` (c stands for 'call') instead of `glm_`. - -```C - #include /* for inline */ - #include /* for library call (this also includes cglm.h) */ - - mat4 rot, trans, rt; - /* ... */ - glm_mul(trans, rot, rt); /* inline */ - glmc_mul(trans, rot, rt); /* call from library */ -``` -Most of math functions are optimized manually with SSE2 if available, if not? Dont worry there are non-sse versions of all operations - -You can pass matrices and vectors as array to functions rather than get address. - -```C - mat4 m = { - 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 - }; - - glm_translate(m, (vec3){1.0f, 0.0f, 0.0f}); -``` - -Library contains general purpose mat4 mul and inverse functions, and also contains some special forms (optimized) of these functions for affine transformations' matrices. If you want to multiply two affine transformation matrices you can use glm_mul instead of glm_mat4_mul and glm_inv_tr (ROT + TR) instead glm_mat4_inv +cglm contains general purpose mat4 product and inverse functions but also provides optimized versions for affine transformations. If you want to multiply two affine transformation matrices you can use glm_mul instead of glm_mat4_mul and glm_inv_tr (ROT + TR) instead glm_mat4_inv. ```C /* multiplication */ mat4 modelMat; @@ -171,7 +140,7 @@ glm_inv_tr(modelMat); ### Struct API -The struct API works as follows, note the `s` suffix on types, the `glms_` prefix on functions and the `GLMS_` prefix on constants: +The struct API works as follows (note the `s` suffix on types, `glms_` prefix on functions and `GLMS_` on constants): ```C #include @@ -180,300 +149,15 @@ mat4s mat = GLMS_MAT4_IDENTITY_INIT; mat4s inv = glms_mat4_inv(mat); ``` -Struct functions generally take their parameters as *values* and *return* their results, rather than taking pointers and writing to out parameters. That means your parameters can usually be `const`, if you're into that. - -The types used are actually unions that allow access to the same data multiple ways. One of those ways involves anonymous structures, available since C11. MSVC also supports it for earlier C versions out of the box and GCC/Clang do if you enable `-fms-extensions`. To explicitly enable these anonymous structures, `#define CGLM_USE_ANONYMOUS_STRUCT` to `1`, to disable them, to `0`. For backward compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` (value is irrelevant) to disable them. If you don't specify explicitly, cglm will do a best guess based on your compiler and the C version you're using. - -## πŸ”¨ Build - -### CMake (All platforms) -```bash -$ mkdir build -$ cd build -$ cmake .. # [Optional] -DCGLM_SHARED=ON -$ make -$ sudo make install # [Optional] -``` - -##### Cmake options with Defaults: - -```CMake -option(CGLM_SHARED "Shared build" ON) -option(CGLM_STATIC "Static build" OFF) -option(CGLM_USE_C99 "" OFF) #Β C11 -option(CGLM_USE_TEST "Enable Tests" OFF) #Β for make check - make test -``` - -#### Use as header-only library with your CMake project - -This requires no building or installation of cglm. - -* Example: - -``` cmake -cmake_minimum_required(VERSION 3.8.2) - -project() - -add_executable(${PROJECT_NAME} src/main.c) -target_link_libraries(${LIBRARY_NAME} PRIVATE - cglm_headers) - -add_subdirectory(external/cglm/ EXCLUDE_FROM_ALL) -``` - -#### Use with your CMake project -* Example: -```cmake -cmake_minimum_required(VERSION 3.8.2) - -project() - -add_executable(${PROJECT_NAME} src/main.c) -target_link_libraries(${LIBRARY_NAME} PRIVATE - cglm) - -add_subdirectory(external/cglm/) - -# or you can use find_package to configure cglm -``` - -#### Use CMake to build for WebAssembly - -Since math functions like `sinf` is used, this can not be targeted at `wasm32-unknown-unknown`, one of [wasi-sdk](https://github.com/WebAssembly/wasi-sdk) or [emscripten](https://github.com/emscripten-core/emsdk) should be used. - -Should note that shared build is not yet supported for WebAssembly. - -For [simd128](https://github.com/WebAssembly/simd) support, add `-msimd128` to `CMAKE_C_FLAGS`, in command line `-DCMAKE_C_FLAGS="-msimd128"`. - -For tests, the cmake option `CGLM_USE_TEST` would still work, you'll need a wasi runtime for running tests, see our [ci config file](.github/workflows/cmake-wasm.yml) for a detailed example. - -##### Use CMake and WASI SDK to build for WebAssembly - -```bash -$ cmake .. \ - -DCMAKE_TOOLCHAIN_FILE=/path/to/wasi-sdk-19.0/share/cmake/wasi-sdk.cmake \ - -DWASI_SDK_PREFIX=/path/to/wasi-sdk-19.0 -``` - -Where `/path/to/wasi-sdk-19.0/` is the path to extracted [wasi sdk](https://github.com/WebAssembly/wasi-sdk). - -In this case it would by default make a static build. - -##### Use CMake and Emscripten SDK to build for WebAssembly - -```bash -$ emcmake cmake .. \ - -DCMAKE_EXE_LINKER_FLAGS="-s STANDALONE_WASM" \ - -DCGLM_STATIC=ON -``` - -The `emcmake` here is the cmake wrapper for Emscripten from installed [emsdk](https://github.com/emscripten-core/emsdk). - -### Meson (All platforms) - -```bash -$ meson build # [Optional] --default-library=static -$ cd build -$ ninja -$ sudo ninja install # [Optional] -``` - -##### Meson options with Defaults: - -```meson -c_std=c11 -buildtype=release -default_library=shared -build_tests=true #Β to run tests: ninja test -``` -#### Use with your Meson project -* Example: -```meson -# Clone cglm or create a cglm.wrap under /subprojects -project('name', 'c') - -cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep') - -executable('exe', 'src/main.c', dependencies : cglm_dep) -``` - -### Swift (Swift Package Manager) - -Currently only default build options are supported. Add **cglm** dependency to your project: - -```swift -... -Package( - ... - dependencies: [ - ... - .package(url: "https://github.com/recp/cglm", .branch("master")), - ] - ... -) -``` - -Now add **cgml** as a dependency to your target. Product choices are: -- **cglm** for inlined version of the library which can be linked only statically -- **cglmc** for a compiled version of the library with no linking limitation - -```swift -... -.target( - ... - dependencies: [ - ... - .product(name: "cglm", package: "cglm"), - ] - ... -) -... -``` - -### Unix (Autotools) - -```bash -$ sh autogen.sh -$ ./configure -$ make -$ make check # [Optional] -$ [sudo] make install # [Optional] -``` - -This will also install pkg-config files so you can use -`pkg-config --cflags cglm` and `pkg-config --libs cglm` to retrieve compiler -and linker flags. - -The files will be installed into the given prefix (usually `/usr/local` by -default on Linux), but your pkg-config may not be configured to actually check -there. You can figure out where it's looking by running `pkg-config --variable -pc_path pkg-config` and change the path the files are installed to via -`./configure --with-pkgconfigdir=/your/path`. Alternatively, you can add the -prefix path to your `PKG_CONFIG_PATH` environment variable. - -### Windows (MSBuild) -Windows related build file and project files are located in `win` folder, -make sure you are inside `cglm/win` folder. -Code Analysis is enabled, so it may take awhile to build. - -```Powershell -$ cd win -$ .\build.bat -``` -if `msbuild` won't work (because of multi version VS) then try to build with `devenv`: -```Powershell -$ devenv cglm.sln /Build Release -``` - -#### Running Tests on Windows - -You can see test project in same visual studio solution file. It is enough to run that project to run tests. - -### Building Docs -First you need install Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html -then: -```bash -$ cd docs -$ sphinx-build source build -``` -it will compile docs into build folder, you can run index.html inside that function. - -## How to use -If you want to use the inline versions of functions, then include the main header -```C -#include -``` -the header will include all headers. Then call the func you want e.g. rotate vector by axis: -```C -glm_vec3_rotate(v1, glm_rad(45), (vec3){1.0f, 0.0f, 0.0f}); -``` -some functions are overloaded :) e.g you can normalize vector: -```C -glm_vec3_normalize(vec); -``` -this will normalize vec and store normalized vector into `vec` but if you will store normalized vector into another vector do this: -```C -glm_vec3_normalize_to(vec, result); -``` -like this function you may see `_to` postfix, this functions store results to another variables and save temp memory - - -to call pre-compiled versions include header with `c` postfix, c means call. Pre-compiled versions are just wrappers. -```C -#include -``` -this header will include all headers with c postfix. You need to call functions with c posfix: -```C -glmc_vec3_normalize(vec); -``` - -Function usage and parameters are documented inside related headers. You may see same parameter passed twice in some examples like this: -```C -glm_mat4_mul(m1, m2, m1); - -/* or */ -glm_mat4_mul(m1, m1, m1); -``` -the first two parameter are **[in]** and the last one is **[out]** parameter. After multiplying *m1* and *m2*, the result is stored in *m1*. This is why we send *m1* twice. You may store the result in a different matrix, this is just an example. - -### Example: Computing MVP matrix - -#### Option 1 -```C -mat4 proj, view, model, mvp; - -/* init proj, view and model ... */ - -glm_mat4_mul(proj, view, viewProj); -glm_mat4_mul(viewProj, model, mvp); -``` - -#### Option 2 -```C -mat4 proj, view, model, mvp; - -/* init proj, view and model ... */ - -glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp); -``` - -## How to send matrix to OpenGL - -mat4 is array of vec4 and vec4 is array of floats. `glUniformMatrix4fv` functions accecpts `float*` as `value` (last param), so you can cast mat4 to float* or you can pass first column of matrix as beginning of memory of matrix: - -Option 1: Send first column -```C -glUniformMatrix4fv(location, 1, GL_FALSE, matrix[0]); - -/* array of matrices */ -glUniformMatrix4fv(location, 1, GL_FALSE, matrix[0][0]); -``` - -Option 2: Cast matrix to pointer type (also valid for multiple dimensional arrays) -```C -glUniformMatrix4fv(location, 1, GL_FALSE, (float *)matrix); -``` - -You can pass matrices the same way to other APIs e.g. Vulkan, DX... - -## Notes - -- This library does not support double type... yet -- If headers are not working properly with your compiler, IDE please open an issue, because I'm using GCC and clang to test it maybe sometimes MSVC - -**TODO:** -- [ ] Unit tests (In Progress) -- [ ] Unit tests for comparing cglm with glm results -- [x] Add version info -- [ ] Unaligned operations (e.g. `glm_umat4_mul`) -- [x] Extra documentation -- [x] ARM Neon Arch +Struct functions generally take parameters *by copy* and *return* the results rather than taking pointers and writing to out parameters. That means your variables can usually be `const`, if you're into that. +The types used are actually unions that allow access to the same data in multiple ways. One of these involves anonymous structures available since C11. MSVC supports them in earlier versions out of the box and GCC/Clang as well if you enable `-fms-extensions`. +To explicitly enable anonymous structures #define `CGLM_USE_ANONYMOUS_STRUCT` as `1` or as `0` to disable them. +For backwards compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` to disable them. If you don't specify explicitly, cglm will attempt a best guess based on your compiler and C version. ## Contributors -This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. +This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)] @@ -498,6 +182,3 @@ Support this project by becoming a sponsor. Your logo will show up here with a l - -## License -MIT. check the LICENSE file From 7783acae100eeeddd6423c16c75f30e9c6fcbd5f Mon Sep 17 00:00:00 2001 From: zorby Date: Fri, 3 Jan 2025 10:40:17 +0100 Subject: [PATCH 018/128] Remove .vscode See issue #436. --- .vscode/c_cpp_properties.json | 20 -------------------- .vscode/settings.json | 32 -------------------------------- 2 files changed, 52 deletions(-) delete mode 100644 .vscode/c_cpp_properties.json delete mode 100644 .vscode/settings.json diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json deleted file mode 100644 index 7136a9e..0000000 --- a/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "configurations": [ - { - "name": "Mac", - "includePath": [ - "${workspaceFolder}/**" - ], - "defines": [], - "macFrameworkPath": [ - "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks" - ], - "compilerPath": "/usr/bin/clang", - "cStandard": "c23", - "cppStandard": "c++23", - "intelliSenseMode": "macos-clang-arm64", - "configurationProvider": "vector-of-bool.cmake-tools" - } - ], - "version": 4 -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 3593466..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools", - "restructuredtext.confPath": "${workspaceFolder}/docs/source", - "workbench.colorTheme": "Default Light+ Experimental", - "editor.fontSize": 14, - "editor.formatOnSave": false, - "workbench.colorCustomizations": { - "[Default Light*]": { - "editor.background": "#fefefe", - "sideBar.background": "#fefefe", - "sideBar.foreground": "#343436", - "sideBarTitle.foreground": "#343436", - "sideBar.border": "#e2e2e4", - "statusBar.background": "#fefefe", - "titleBar.activeBackground": "#fefefe", - "tab.activeBackground": "#f4fff4aa", - "tab.inactiveBackground": "#fefefe", - "activityBar.background": "#fefefe", - "editorGroupHeader.tabsBackground": "#fefefe" - }, - "[Default Dark*]": { - "editor.background": "#1D1D25", - "sideBar.background": "#1D1D25", - "statusBar.background": "#1D1D25", - "titleBar.activeBackground": "#1D1D25", - "tab.activeBackground": "#2C2C3A", - "tab.inactiveBackground": "#1D1D25", - "activityBar.background": "#1D1D25", - "editorGroupHeader.tabsBackground": "#1D1D25" - } - }, -} From 5a207d84bbcc095d2980524b8dbab5b09159a2ac Mon Sep 17 00:00:00 2001 From: zorby Date: Fri, 3 Jan 2025 10:43:47 +0100 Subject: [PATCH 019/128] Remove .gitmodules See issue #436. --- .gitmodules | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29..0000000 From bab7d7bb1218211d774cfe20bc32e895106b2909 Mon Sep 17 00:00:00 2001 From: zorby Date: Fri, 3 Jan 2025 17:09:44 +0100 Subject: [PATCH 020/128] Add .vscode to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8063137..879f459 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,4 @@ confdefs.h cmake-build-debug *.o.tmp xcode/* +.vscode \ No newline at end of file From 32a05a579b415044130b271871177243e51ffb5a Mon Sep 17 00:00:00 2001 From: zorby Date: Sat, 4 Jan 2025 11:22:52 +0100 Subject: [PATCH 021/128] README: Move Struct API chapter --- README.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index a688d4d..e5b17fd 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,23 @@ vec2 vector; glmc_vec2_zero(vector); ``` +### Struct API + +The struct API works as follows (note the `s` suffix on types, `glms_` prefix on functions and `GLMS_` on constants): + +```C +#include + +mat4s mat = GLMS_MAT4_IDENTITY_INIT; +mat4s inv = glms_mat4_inv(mat); +``` + +Struct functions generally take parameters *by copy* and *return* the results rather than taking pointers and writing to out parameters. That means your variables can usually be `const`, if you're into that. + +The types used are actually unions that allow access to the same data in multiple ways. One of these involves anonymous structures available since C11. MSVC supports them in earlier versions out of the box and GCC/Clang as well if you enable `-fms-extensions`. +To explicitly enable anonymous structures `#define CGLM_USE_ANONYMOUS_STRUCT 1`, or `0` to disable them. +For backwards compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` to disable them. If you don't specify explicitly, cglm will attempt a best guess based on your compiler and C version. + ### πŸ“Œ Migration notes: - `_dup` (duplicate) functions were renamed to `_copy`. For instance: `glm_vec_dup` -> `glm_vec3_copy`. @@ -138,23 +155,6 @@ glm_mul(T, R, modelMat); glm_inv_tr(modelMat); ``` -### Struct API - -The struct API works as follows (note the `s` suffix on types, `glms_` prefix on functions and `GLMS_` on constants): - -```C -#include - -mat4s mat = GLMS_MAT4_IDENTITY_INIT; -mat4s inv = glms_mat4_inv(mat); -``` - -Struct functions generally take parameters *by copy* and *return* the results rather than taking pointers and writing to out parameters. That means your variables can usually be `const`, if you're into that. - -The types used are actually unions that allow access to the same data in multiple ways. One of these involves anonymous structures available since C11. MSVC supports them in earlier versions out of the box and GCC/Clang as well if you enable `-fms-extensions`. -To explicitly enable anonymous structures #define `CGLM_USE_ANONYMOUS_STRUCT` as `1` or as `0` to disable them. -For backwards compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` to disable them. If you don't specify explicitly, cglm will attempt a best guess based on your compiler and C version. - ## Contributors This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)] From 7e51ed88e84ee5eb1686317aa05c406f14e64d2c Mon Sep 17 00:00:00 2001 From: zorby Date: Sat, 4 Jan 2025 11:23:37 +0100 Subject: [PATCH 022/128] README: Add Features --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index e5b17fd..b87f04a 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,29 @@ For backwards compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` to - **[major change]** Starting with **v0.7.3**, inline print functions are disabled by default in release mode to eliminate printing costs (see the Options chapter of the docs).
Colored output can be disabled (see documentation). - **[major change]** Starting with **v0.8.3**, alternate clipspace configurations are supported. The `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` flags are provided to control clip depth and handedness. This makes it easier to incorporate cglm into projects using graphics APIs such as Vulkan or Metal. See https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s +### πŸš€ Features + +- scalar and simd (sse, avx, neon...) optimizations +- general purpose matrix operations (mat4, mat3) +- chain matrix multiplication (square only) +- general purpose vector operations (cross, dot, rotate, proj, angle...) +- affine transformations +- matrix decomposition (extract rotation, scaling factor) +- optimized affine transform matrices (mul, rigid-body inverse) +- camera (lookat) +- projections (ortho, perspective) +- quaternions +- euler angles / yaw-pitch-roll to matrix +- extract euler angles +- frustum (extract view frustum planes, corners...) +- bounding box (AABB in Frustum (culling), crop, merge...) +- bounding sphere +- project, unproject +- easing functions +- curves +- curve interpolation helpers (SMC, deCasteljau...) +- comversion helpers from cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides +- ray intersection helpers --- From aae82c1d4ac8b499779fbb46dfb2321ad23ab579 Mon Sep 17 00:00:00 2001 From: zorby Date: Sat, 4 Jan 2025 11:48:55 +0100 Subject: [PATCH 023/128] README: Add chapter about alignment --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b87f04a..0f02789 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@

-Also known as OpenGL Mathematics (glm) for C, cglm provides fast and ergonomic math functions to ease graphics programming. It is community friendly – feel free to report any bugs and issues you face.
+A highly optimized 2D|3D math library. Also known as OpenGL Mathematics (glm) for C. cglm provides fast and ergonomic math functions to ease graphics programming. It is community friendly – feel free to report any bugs and issues you face.
If you're using C++, you might want to check out GLM

@@ -96,6 +96,10 @@ vec2 vector; glmc_vec2_zero(vector); ``` +### ❗ Alignment + +While cglm by default aligns what's necessary, it is possible to disable this by defining `CGLM_ALL_UNALIGNED`. If you're targeting machines with any kind of SIMD support, make sure that all `vec4`, `mat4` and `mat2` arguments you pass to cglm functions are aligned to prevent unexpected crashes, alternatively use the unaligned versions if present. + ### Struct API The struct API works as follows (note the `s` suffix on types, `glms_` prefix on functions and `GLMS_` on constants): From a4cd7e008d016cef80f5abb278ba5f7a3806b4f6 Mon Sep 17 00:00:00 2001 From: Marcin Date: Tue, 14 Jan 2025 17:31:35 +0000 Subject: [PATCH 024/128] initial impl --- include/cglm/perlin.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 include/cglm/perlin.h diff --git a/include/cglm/perlin.h b/include/cglm/perlin.h new file mode 100644 index 0000000..7c74590 --- /dev/null +++ b/include/cglm/perlin.h @@ -0,0 +1,28 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#ifndef cglm_perlin_h +#define cglm_perlin_h + +#include "vec4.h" +#include "vec4-ext.h" + + +/*! + * @brief Classic perlin noise + * + * @param[in] point 4D vector + * @returns perlin noise value + */ +CGLM_INLINE +float +glm_perlin(vec4 point) { + return point[0] + point[1] + point[2] + point[3]; +} + + +#endif /* cglm_perlin_h */ From 3e52d90ecbcd4c88afb227a9dfa049118dafe7e0 Mon Sep 17 00:00:00 2001 From: Marcin Date: Tue, 14 Jan 2025 17:32:46 +0000 Subject: [PATCH 025/128] boilerplate --- CMakeLists.txt | 1 + Makefile.am | 4 ++++ include/cglm/call.h | 1 + include/cglm/call/perlin.h | 23 +++++++++++++++++++++++ include/cglm/cglm.h | 1 + include/cglm/struct.h | 1 + include/cglm/struct/perlin.h | 33 +++++++++++++++++++++++++++++++++ meson.build | 1 + src/perlin.c | 15 +++++++++++++++ 9 files changed, 80 insertions(+) create mode 100644 include/cglm/call/perlin.h create mode 100644 include/cglm/struct/perlin.h create mode 100644 src/perlin.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 01086fa..3868b38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,6 +93,7 @@ add_library(${PROJECT_NAME} src/mat4x2.c src/mat4x3.c src/plane.c + src/perlin.c src/frustum.c src/box.c src/project.c diff --git a/Makefile.am b/Makefile.am index 2a8ce0e..f29bfb0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -67,6 +67,7 @@ cglm_HEADERS = include/cglm/version.h \ include/cglm/util.h \ include/cglm/quat.h \ include/cglm/plane.h \ + include/cglm/perlin.h \ include/cglm/frustum.h \ include/cglm/box.h \ include/cglm/aabb2d.h \ @@ -120,6 +121,7 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \ include/cglm/call/quat.h \ include/cglm/call/euler.h \ include/cglm/call/plane.h \ + include/cglm/call/perlin.h \ include/cglm/call/frustum.h \ include/cglm/call/box.h \ include/cglm/call/project.h \ @@ -210,6 +212,7 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \ include/cglm/struct/quat.h \ include/cglm/struct/euler.h \ include/cglm/struct/plane.h \ + include/cglm/struct/perlin.h \ include/cglm/struct/frustum.h \ include/cglm/struct/box.h \ include/cglm/struct/aabb2d.h \ @@ -261,6 +264,7 @@ libcglm_la_SOURCES=\ src/mat4x2.c \ src/mat4x3.c \ src/plane.c \ + src/perlin.c \ src/frustum.c \ src/box.c \ src/project.c \ diff --git a/include/cglm/call.h b/include/cglm/call.h index de775d2..b298052 100644 --- a/include/cglm/call.h +++ b/include/cglm/call.h @@ -32,6 +32,7 @@ extern "C" { #include "call/quat.h" #include "call/euler.h" #include "call/plane.h" +#include "call/perlin.h" #include "call/frustum.h" #include "call/aabb2d.h" #include "call/box.h" diff --git a/include/cglm/call/perlin.h b/include/cglm/call/perlin.h new file mode 100644 index 0000000..521e21d --- /dev/null +++ b/include/cglm/call/perlin.h @@ -0,0 +1,23 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#ifndef cglmc_perlin_h +#define cglmc_perlin_h +#ifdef __cplusplus +extern "C" { +#endif + +#include "../cglm.h" + +CGLM_EXPORT +float +glmc_perlin(vec4 point); + +#ifdef __cplusplus +} +#endif +#endif /* cglmc_perlin_h */ diff --git a/include/cglm/cglm.h b/include/cglm/cglm.h index 5e15a3c..8741422 100644 --- a/include/cglm/cglm.h +++ b/include/cglm/cglm.h @@ -30,6 +30,7 @@ #include "quat.h" #include "euler.h" #include "plane.h" +#include "perlin.h" #include "aabb2d.h" #include "box.h" #include "color.h" diff --git a/include/cglm/struct.h b/include/cglm/struct.h index 1426589..f03b9dd 100644 --- a/include/cglm/struct.h +++ b/include/cglm/struct.h @@ -31,6 +31,7 @@ extern "C" { #include "struct/affine.h" #include "struct/frustum.h" #include "struct/plane.h" +#include "struct/perlin.h" #include "struct/box.h" #include "struct/color.h" #include "struct/io.h" diff --git a/include/cglm/struct/perlin.h b/include/cglm/struct/perlin.h new file mode 100644 index 0000000..4897417 --- /dev/null +++ b/include/cglm/struct/perlin.h @@ -0,0 +1,33 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#ifndef cglms_perlins_h +#define cglms_perlins_h + +#include "../common.h" +#include "../types-struct.h" +#include "../perlin.h" +#include "vec4.h" + +/* + Functions: + CGLM_INLINE float glms_perlin(vec4s point); + */ + +/*! + * @brief Classic perlin noise + * + * @param[in] point 4D vector + * @returns perlin noise value + */ +CGLM_INLINE +float +glms_perlin(vec4s point) { + return glm_perlin(point.raw); +} + +#endif /* cglms_perlins_h */ diff --git a/meson.build b/meson.build index 3afdc4f..f79a007 100644 --- a/meson.build +++ b/meson.build @@ -56,6 +56,7 @@ cglm_src = files( 'src/mat4x2.c', 'src/mat4x3.c', 'src/plane.c', + 'src/perlin.c', 'src/frustum.c', 'src/box.c', 'src/project.c', diff --git a/src/perlin.c b/src/perlin.c new file mode 100644 index 0000000..5c57296 --- /dev/null +++ b/src/perlin.c @@ -0,0 +1,15 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#include "../include/cglm/cglm.h" +#include "../include/cglm/call.h" + +CGLM_EXPORT +float +glmc_perlin(vec4 p) { + return glm_perlin(p); +} From 98f53c750dcd6416ebd7185d311af5e75bc52c9f Mon Sep 17 00:00:00 2001 From: Marcin Date: Tue, 14 Jan 2025 17:32:56 +0000 Subject: [PATCH 026/128] test boilerplate --- test/src/test_perlin.h | 16 ++++++++++++++++ test/src/tests.c | 2 ++ test/tests.h | 8 ++++++++ 3 files changed, 26 insertions(+) create mode 100644 test/src/test_perlin.h diff --git a/test/src/test_perlin.h b/test/src/test_perlin.h new file mode 100644 index 0000000..3c9f2dc --- /dev/null +++ b/test/src/test_perlin.h @@ -0,0 +1,16 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#include "test_common.h" + +TEST_IMPL(GLM_PREFIX, perlin) { + vec4 p = {1.0f, 2.0f, 3.0f, 4.0f}; + + float out = GLM(perlin)(p); + ASSERT(test_eq(out, 10.0f)) + TEST_SUCCESS +} diff --git a/test/src/tests.c b/test/src/tests.c index 4d93294..a32dc97 100644 --- a/test/src/tests.c +++ b/test/src/tests.c @@ -30,6 +30,7 @@ #include "test_quat.h" #include "test_project.h" #include "test_plane.h" +#include "test_perlin.h" #include "test_affine.h" #include "test_affine2d.h" #include "test_affine_mat.h" @@ -69,6 +70,7 @@ #include "test_quat.h" #include "test_project.h" #include "test_plane.h" +#include "test_perlin.h" #include "test_affine.h" #include "test_affine2d.h" #include "test_affine_mat.h" diff --git a/test/tests.h b/test/tests.h index bcb2fda..62e7d07 100644 --- a/test/tests.h +++ b/test/tests.h @@ -356,6 +356,10 @@ TEST_DECLARE(glmc_project) TEST_DECLARE(glm_plane_normalize) TEST_DECLARE(glmc_plane_normalize) +/* perlin */ +TEST_DECLARE(glm_perlin) +TEST_DECLARE(glmc_perlin) + /* utils */ TEST_DECLARE(clamp) @@ -1533,6 +1537,10 @@ TEST_LIST { /* plane */ TEST_ENTRY(glm_plane_normalize) TEST_ENTRY(glmc_plane_normalize) + + /* perlin */ + TEST_ENTRY(glm_perlin) + TEST_ENTRY(glmc_perlin) /* utils */ TEST_ENTRY(clamp) From 8a2fd9cda92769c9acda12991153f0e2103744d1 Mon Sep 17 00:00:00 2001 From: Marcin Date: Tue, 14 Jan 2025 17:34:51 +0000 Subject: [PATCH 027/128] docs boilerplate --- docs/source/api_inline_array.rst | 1 + docs/source/perlin.rst | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 docs/source/perlin.rst diff --git a/docs/source/api_inline_array.rst b/docs/source/api_inline_array.rst index 5d8ead8..becb684 100644 --- a/docs/source/api_inline_array.rst +++ b/docs/source/api_inline_array.rst @@ -66,6 +66,7 @@ Follow the :doc:`build` documentation for this ivec4 color plane + perlin project util io diff --git a/docs/source/perlin.rst b/docs/source/perlin.rst new file mode 100644 index 0000000..0fb6fb4 --- /dev/null +++ b/docs/source/perlin.rst @@ -0,0 +1,29 @@ +.. default-domain:: C + +perlin +================================================================================ + +Header: cglm/perlin.h + +Classic Perlin noise implementation. + +Table of contents (click to go): +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Functions: + +1. :c:func:`glm_perlin` + + +Functions documentation +~~~~~~~~~~~~~~~~~~~~~~~ + +.. c:function:: float glm_perlin(vec4 point) + + | Classic Perlin noise + + Parameters: + | *[in]* **point** 4D point + + Returns: + | noise value From c3e16a53f4278e0ba21e9ed7f1a26c28731f3d93 Mon Sep 17 00:00:00 2001 From: Marcin Date: Tue, 14 Jan 2025 18:37:32 +0000 Subject: [PATCH 028/128] work in progress --- include/cglm/perlin.h | 208 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) diff --git a/include/cglm/perlin.h b/include/cglm/perlin.h index 7c74590..ea5704d 100644 --- a/include/cglm/perlin.h +++ b/include/cglm/perlin.h @@ -11,6 +11,80 @@ #include "vec4.h" #include "vec4-ext.h" +// Based on glm::detail::mod289 +// template +// GLM_FUNC_QUALIFIER T mod289(T const& x) +// { +// return x - floor(x * (static_cast(1.0) / static_cast(289.0))) * static_cast(289.0); +// } + +CGLM_INLINE +float +_glm_detail_mod289(float x) { + return x - floorf(x * (1.0f / 289.0f)) * 289.0f; +} + +// Based on glm::detail::permute +// template +// GLM_FUNC_QUALIFIER vec<4, T, Q> permute(vec<4, T, Q> const& x) +// { +// return mod289(((x * static_cast(34)) + static_cast(1)) * x); +// } +CGLM_INLINE +void +_glm_detail_permute(vec4 x, vec4 dest) { + dest[0] = _glm_detail_mod289(x[0] * 34.0f + 1.0f) * x[0]; + dest[1] = _glm_detail_mod289(x[1] * 34.0f + 1.0f) * x[1]; + dest[2] = _glm_detail_mod289(x[2] * 34.0f + 1.0f) * x[2]; + dest[3] = _glm_detail_mod289(x[3] * 34.0f + 1.0f) * x[3]; +} + +/*! + * @brief floor each element of v, result is written to dest + * + * @param[in] v vector + * @param[out] dest destination vector + */ +CGLM_INLINE +void +_glm_vec4_floor(vec4 x, vec4 dest) { + dest[0] = floorf(x[0]); + dest[1] = floorf(x[1]); + dest[2] = floorf(x[2]); + dest[3] = floorf(x[3]); +} + +/*! + * @brief mod v by a scalar, result is written to dest (dest = v % s) + * + * @param[in] v vector + * @param[in] s scalar + * @param[out] dest destination vector + */ +CGLM_INLINE +void +_glm_vec4_mods(vec4 x, float y, vec4 dest) { + dest[0] = fmodf(x[0], y); + dest[1] = fmodf(x[1], y); + dest[2] = fmodf(x[2], y); + dest[3] = fmodf(x[3], y); +} + +/*! + * @brief threshold function with scalar + * + * @param[in] edge threshold + * @param[in] x value to test against threshold + * @param[out] dest destination + */ +CGLM_INLINE +void +_glm_vec4_steps(vec4 edge, float x, vec4 dest) { + dest[0] = glm_step(edge[0], x); + dest[1] = glm_step(edge[1], x); + dest[2] = glm_step(edge[2], x); + dest[3] = glm_step(edge[3], x); +} /*! * @brief Classic perlin noise @@ -21,6 +95,140 @@ CGLM_INLINE float glm_perlin(vec4 point) { + // Integer part of p for indexing + vec4 Pi0 = {0.0f}; + _glm_vec4_floor(point, Pi0); // Pi0 = floor(point); + + // Integer part + 1 + vec4 Pi1 = {0.0f}; + glm_vec4_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; + + _glm_vec4_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); + _glm_vec4_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); + + // Fractional part of p for interpolation + vec4 Pf0; + glm_vec4_fract(point, Pf0); + + // Fractional part - 1.0 + vec4 Pf1; + glm_vec4_subs(Pf0, 1.0f, Pf1); + + vec4 ix = {Pi0[0], Pi1[0], Pi0[0], Pi1[0]}; + vec4 iy = {Pi0[1], Pi0[1], Pi1[1], Pi1[1]}; + vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; + vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; + vec4 iw0 = {Pi0[3], Pi0[3], Pi0[3], Pi0[3]}; + vec4 iw1 = {Pi1[3], Pi1[3], Pi1[3], Pi1[3]}; + + // ixy = permute(permute(ix) + iy) + vec4 ixy = {0.0f}; + _glm_detail_permute(ix, ixy); // ixy = permute(ix) + glm_vec4_add(ixy, iy, ixy); // ixy += iy; + _glm_detail_permute(ixy, ixy); // ixy = permute(ixy) + + // ixy0 = permute(ixy + iz0) + vec4 ixy0 = {0.0f}; + glm_vec4_add(ixy, iz0, ixy0); // ixy0 = ixy + iz0 + _glm_detail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) + + // ixy1 = permute(ixy + iz1) + vec4 ixy1 = {0.0f}; + glm_vec4_add(ixy, iz1, ixy1); // ixy1 = ixy, iz1 + _glm_detail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) + + // ixy00 = permute(ixy0 + iw0) + vec4 ixy00 = {0.0f}; + glm_vec4_add(ixy0, iw0, ixy00); // ixy00 = ixy0 + iw0 + _glm_detail_permute(ixy00, ixy00); // ixy00 = permute(ixy00) + + // ixy01 = permute(ixy0 + iw1) + vec4 ixy01 = {0.0f}; + glm_vec4_add(ixy0, iw1, ixy01); // ixy01 = ixy0 + iw1 + _glm_detail_permute(ixy01, ixy01); // ixy01 = permute(ixy01) + + // ixy10 = permute(ixy1 + iw0) + vec4 ixy10 = {0.0f}; + glm_vec4_add(ixy1, iw0, ixy10); // ixy10 = ixy1 + iw0 + _glm_detail_permute(ixy10, ixy10); // ixy10 = permute(ixy10) + + // ixy11 = permute(ixy1 + iw1) + vec4 ixy11 = {0.0f}; + glm_vec4_add(ixy1, iw1, ixy11); // ixy11 = ixy1 + iw1 + _glm_detail_permute(ixy11, ixy11); // ixy11 = permute(ixy11) + + // ------------ + + // gx00 = ixy00 / 7.0 + vec4 gx00 = {0.0f}; + glm_vec4_divs(ixy00, 7.0f, gx00); // gx00 = ixy00 / 7.0 + + // gy00 = fract(gx00) / 7.0 + vec4 gy00 = {0.0f}; + _glm_vec4_floor(gx00, gy00); // gy00 = floor(gx00) + glm_vec4_divs(gy00, 7.0f, gy00); // gy00 /= 7.0 + + // gz00 = floor(gy00) / 6.0 + vec4 gz00 = {0.0f}; + _glm_vec4_floor(gy00, gz00); // gz00 = floor(gy00) + glm_vec4_divs(gz00, 6.0f, gz00); // gz00 /= 6.0 + + // gx00 = fract(gx00) - 0.5f + glm_vec4_fract(gx00, gx00); // gx00 = fract(gx00) + glm_vec4_subs(gx00, 0.5f, gx00); // gx00 -= 0.5f + + // gy00 = fract(gy00) - 0.5f + glm_vec4_fract(gy00, gy00); // gy00 = fract(gy00) + glm_vec4_subs(gy00, 0.5f, gy00); // gy00 -= 0.5f + + // gz00 = fract(gz00) - 0.5f + glm_vec4_fract(gz00, gz00); // gz00 = fract(gz00) + glm_vec4_subs(gz00, 0.5f, gz00); // gz00 -= 0.5f + + // abs(gx00), abs(gy00), abs(gz00) + vec4 gx00a = {0.0f}; + glm_vec4_abs(gx00, gx00a); // gx00a = abs(gx00) + vec4 gy00a = {0.0f}; + glm_vec4_abs(gy00, gy00a); // gy00a = abs(gy00) + vec4 gz00a = {0.0f}; + glm_vec4_abs(gz00, gz00a); // gz00a = abs(gz00) + + // gw00 = 0.75 - abs(gx00) - abs(gy00) - abs(gz00) + vec4 gw00 = {0.75f}; // init to 0.75 + glm_vec4_sub(gw00, gx00a, gw00); // gw00 -= gx00a + glm_vec4_sub(gw00, gz00a, gw00); // gw00 -= gz00a + glm_vec4_sub(gw00, gy00a, gw00); // gw00 -= gy00a + + // sw00 = step(gw00, 0.0); + vec4 sw00 = {0.0f}; + _glm_vec4_steps(gw00, 0.0f, sw00); // sw00 = step(gw00, 0.0) + + // gx00 -= sw00 * (step(vec4(0), gx00) - T(0.5)); + vec4 temp = {0.0f}; // temp = 0.0 + glm_vec4_step(temp, gx00, temp); // temp = step(temp, gx00) + glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 + glm_vec4_mul(sw00, temp, temp); // temp *= sw00 + glm_vec4_sub(gx00, temp, gx00); // gx00 -= temp + + // gy00 -= sw00 * (step(vec4(0), gy00) - T(0.5)); + glm_vec4_zero(temp); // reset temp + glm_vec4_step(temp, gy00, temp); // temp = step(temp, gy00) + glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 + glm_vec4_mul(sw00, temp, temp); // temp *= sw00 + glm_vec4_sub(gy00, temp, gy00); // gy00 -= temp + + // ------------ + + // Work in progress... + + + + + + + + + return point[0] + point[1] + point[2] + point[3]; } From f3f75a27272ef5f8eabb9082620c7ee5c2eceafb Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 15 Jan 2025 11:53:02 +0000 Subject: [PATCH 029/128] impl but buggy --- include/cglm/perlin.h | 377 +++++++++++++++++++++++++++++++++--------- 1 file changed, 303 insertions(+), 74 deletions(-) diff --git a/include/cglm/perlin.h b/include/cglm/perlin.h index ea5704d..a7802b6 100644 --- a/include/cglm/perlin.h +++ b/include/cglm/perlin.h @@ -11,32 +11,65 @@ #include "vec4.h" #include "vec4-ext.h" +#include "vec2.h" +#include "vec2-ext.h" + // Based on glm::detail::mod289 // template // GLM_FUNC_QUALIFIER T mod289(T const& x) // { -// return x - floor(x * (static_cast(1.0) / static_cast(289.0))) * static_cast(289.0); +// return x - floor(x * (static_cast(1.0) / static_cast(289.0))) * static_cast(289.0); // } CGLM_INLINE float -_glm_detail_mod289(float x) { +_glm_perlinDetail_mod289(float x) { return x - floorf(x * (1.0f / 289.0f)) * 289.0f; } // Based on glm::detail::permute // template -// GLM_FUNC_QUALIFIER vec<4, T, Q> permute(vec<4, T, Q> const& x) -// { -// return mod289(((x * static_cast(34)) + static_cast(1)) * x); -// } +// GLM_FUNC_QUALIFIER vec<4, T, Q> permute(vec<4, T, Q> const& x) +// { +// return mod289(((x * static_cast(34)) + static_cast(1)) * x); +// } CGLM_INLINE void -_glm_detail_permute(vec4 x, vec4 dest) { - dest[0] = _glm_detail_mod289(x[0] * 34.0f + 1.0f) * x[0]; - dest[1] = _glm_detail_mod289(x[1] * 34.0f + 1.0f) * x[1]; - dest[2] = _glm_detail_mod289(x[2] * 34.0f + 1.0f) * x[2]; - dest[3] = _glm_detail_mod289(x[3] * 34.0f + 1.0f) * x[3]; +_glm_perlinDetail_permute(vec4 x, vec4 dest) { + dest[0] = _glm_perlinDetail_mod289(x[0] * 34.0f + 1.0f) * x[0]; + dest[1] = _glm_perlinDetail_mod289(x[1] * 34.0f + 1.0f) * x[1]; + dest[2] = _glm_perlinDetail_mod289(x[2] * 34.0f + 1.0f) * x[2]; + dest[3] = _glm_perlinDetail_mod289(x[3] * 34.0f + 1.0f) * x[3]; +} + + +// GLM_FUNC_QUALIFIER vec<4, T, Q> taylorInvSqrt(vec<4, T, Q> const& r) +// { +// return static_cast(1.79284291400159) - static_cast(0.85373472095314) * r; +// } + +CGLM_INLINE +void +_glm_perlinDetail_taylorInvSqrt(vec4 x, vec4 dest) { + dest[0] = 1.79284291400159f - 0.85373472095314f * x[0]; + dest[1] = 1.79284291400159f - 0.85373472095314f * x[1]; + dest[2] = 1.79284291400159f - 0.85373472095314f * x[2]; + dest[3] = 1.79284291400159f - 0.85373472095314f * x[3]; +} + +// template +// GLM_FUNC_QUALIFIER vec<4, T, Q> fade(vec<4, T, Q> const& t) +// { +// return (t * t * t) * (t * (t * static_cast(6) - static_cast(15)) + static_cast(10)); +// } + +CGLM_INLINE +void +_glm_perlinDetail_fade(vec4 t, vec4 dest) { + dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); + dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); + dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); + dest[3] = (t[3] * t[3] * t[3]) * (t[3] * (t[3] * 6.0f - 15.0f) + 10.0f); } /*! @@ -86,6 +119,104 @@ _glm_vec4_steps(vec4 edge, float x, vec4 dest) { dest[3] = glm_step(edge[3], x); } +/*! + * @brief set all elements of dest to value + * + * @param[in] vector threshold + * @param[in] x value + */ +CGLM_INLINE +void +_glm_vec4_sets(vec4 v, float x) { + v[0] = x; + v[1] = x; + v[2] = x; + v[3] = x; +} + +/*! + * @brief mul v by a scalar, result is written to dest (dest = v * s) + * + * @param[in] v vector + * @param[in] s scalar + * @param[out] dest destination vector + */ +CGLM_INLINE +void +_glm_vec4_muls(vec4 x, float y, vec4 dest) { + dest[0] = x[0] * y; + dest[1] = x[1] * y; + dest[2] = x[2] * y; + dest[3] = x[3] * y; +} + + +CGLM_INLINE +void +_glm_perlinDetail_xy2g( + vec4 ixy, + /* out */ + vec4 gx, + vec4 gy, + vec4 gz, + vec4 gw +) { + // gx = ixy / 7.0 + glm_vec4_divs(ixy, 7.0f, gx); // gx = ixy / 7.0 + + // gy = fract(gx) / 7.0 + _glm_vec4_floor(gx, gy); // gy = floor(gx) + glm_vec4_divs(gy, 7.0f, gy); // gy /= 7.0 + + // gz = floor(gy) / 6.0 + _glm_vec4_floor(gy, gz); // gz = floor(gy) + glm_vec4_divs(gz, 6.0f, gz); // gz /= 6.0 + + // gx = fract(gx) - 0.5f + glm_vec4_fract(gx, gx); // gx = fract(gx) + glm_vec4_subs(gx, 0.5f, gx); // gx -= 0.5f + + // gy = fract(gy) - 0.5f + glm_vec4_fract(gy, gy); // gy = fract(gy) + glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5f + + // gz = fract(gz) - 0.5f + glm_vec4_fract(gz, gz); // gz = fract(gz) + glm_vec4_subs(gz, 0.5f, gz); // gz -= 0.5f + + // abs(gx), abs(gy), abs(gz) + vec4 gxa = {0.0f}; + glm_vec4_abs(gx, gxa); // gxa = abs(gx) + vec4 gya = {0.0f}; + glm_vec4_abs(gy, gya); // gya = abs(gy) + vec4 gza = {0.0f}; + glm_vec4_abs(gz, gza); // gza = abs(gz) + + // gw = 0.75 - abs(gx) - abs(gy) - abs(gz) + _glm_vec4_sets(gw, 0.75f); // gw = 0.75 + glm_vec4_sub(gw, gxa, gw); // gw -= gxa + glm_vec4_sub(gw, gza, gw); // gw -= gza + glm_vec4_sub(gw, gya, gw); // gw -= gya + + // sw = step(gw, 0.0); + vec4 sw = {0.0f}; + _glm_vec4_steps(gw, 0.0f, sw); // sw = step(gw, 0.0) + + // gx -= sw * (step(vec4(0), gx) - T(0.5)); + vec4 temp = {0.0f}; // temp = 0.0 + glm_vec4_step(temp, gx, temp); // temp = step(temp, gx) + glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 + glm_vec4_mul(sw, temp, temp); // temp *= sw + glm_vec4_sub(gx, temp, gx); // gx -= temp + + // gy -= sw * (step(vec4(0), gy) - T(0.5)); + glm_vec4_zero(temp); // reset temp + glm_vec4_step(temp, gy, temp); // temp = step(temp, gy) + glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 + glm_vec4_mul(sw, temp, temp); // temp *= sw + glm_vec4_sub(gy, temp, gy); // gy -= temp +} + /*! * @brief Classic perlin noise * @@ -102,7 +233,7 @@ glm_perlin(vec4 point) { // Integer part + 1 vec4 Pi1 = {0.0f}; glm_vec4_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; - + _glm_vec4_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); _glm_vec4_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); @@ -123,113 +254,211 @@ glm_perlin(vec4 point) { // ixy = permute(permute(ix) + iy) vec4 ixy = {0.0f}; - _glm_detail_permute(ix, ixy); // ixy = permute(ix) + _glm_perlinDetail_permute(ix, ixy); // ixy = permute(ix) glm_vec4_add(ixy, iy, ixy); // ixy += iy; - _glm_detail_permute(ixy, ixy); // ixy = permute(ixy) + _glm_perlinDetail_permute(ixy, ixy); // ixy = permute(ixy) // ixy0 = permute(ixy + iz0) vec4 ixy0 = {0.0f}; glm_vec4_add(ixy, iz0, ixy0); // ixy0 = ixy + iz0 - _glm_detail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) + _glm_perlinDetail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) // ixy1 = permute(ixy + iz1) vec4 ixy1 = {0.0f}; glm_vec4_add(ixy, iz1, ixy1); // ixy1 = ixy, iz1 - _glm_detail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) + _glm_perlinDetail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) // ixy00 = permute(ixy0 + iw0) vec4 ixy00 = {0.0f}; glm_vec4_add(ixy0, iw0, ixy00); // ixy00 = ixy0 + iw0 - _glm_detail_permute(ixy00, ixy00); // ixy00 = permute(ixy00) + _glm_perlinDetail_permute(ixy00, ixy00); // ixy00 = permute(ixy00) // ixy01 = permute(ixy0 + iw1) vec4 ixy01 = {0.0f}; glm_vec4_add(ixy0, iw1, ixy01); // ixy01 = ixy0 + iw1 - _glm_detail_permute(ixy01, ixy01); // ixy01 = permute(ixy01) + _glm_perlinDetail_permute(ixy01, ixy01); // ixy01 = permute(ixy01) // ixy10 = permute(ixy1 + iw0) vec4 ixy10 = {0.0f}; glm_vec4_add(ixy1, iw0, ixy10); // ixy10 = ixy1 + iw0 - _glm_detail_permute(ixy10, ixy10); // ixy10 = permute(ixy10) + _glm_perlinDetail_permute(ixy10, ixy10); // ixy10 = permute(ixy10) // ixy11 = permute(ixy1 + iw1) vec4 ixy11 = {0.0f}; glm_vec4_add(ixy1, iw1, ixy11); // ixy11 = ixy1 + iw1 - _glm_detail_permute(ixy11, ixy11); // ixy11 = permute(ixy11) + _glm_perlinDetail_permute(ixy11, ixy11); // ixy11 = permute(ixy11) // ------------ - // gx00 = ixy00 / 7.0 vec4 gx00 = {0.0f}; - glm_vec4_divs(ixy00, 7.0f, gx00); // gx00 = ixy00 / 7.0 - - // gy00 = fract(gx00) / 7.0 vec4 gy00 = {0.0f}; - _glm_vec4_floor(gx00, gy00); // gy00 = floor(gx00) - glm_vec4_divs(gy00, 7.0f, gy00); // gy00 /= 7.0 - - // gz00 = floor(gy00) / 6.0 vec4 gz00 = {0.0f}; - _glm_vec4_floor(gy00, gz00); // gz00 = floor(gy00) - glm_vec4_divs(gz00, 6.0f, gz00); // gz00 /= 6.0 + vec4 gw00 = {0.0f}; + _glm_perlinDetail_xy2g(ixy00, gx00, gy00, gz00, gw00); - // gx00 = fract(gx00) - 0.5f - glm_vec4_fract(gx00, gx00); // gx00 = fract(gx00) - glm_vec4_subs(gx00, 0.5f, gx00); // gx00 -= 0.5f + vec4 gx01 = {0.0f}; + vec4 gy01 = {0.0f}; + vec4 gz01 = {0.0f}; + vec4 gw01 = {0.0f}; + _glm_perlinDetail_xy2g(ixy01, gx01, gy01, gz01, gw01); - // gy00 = fract(gy00) - 0.5f - glm_vec4_fract(gy00, gy00); // gy00 = fract(gy00) - glm_vec4_subs(gy00, 0.5f, gy00); // gy00 -= 0.5f + vec4 gx10 = {0.0f}; + vec4 gy10 = {0.0f}; + vec4 gz10 = {0.0f}; + vec4 gw10 = {0.0f}; + _glm_perlinDetail_xy2g(ixy10, gx10, gy10, gz10, gw10); - // gz00 = fract(gz00) - 0.5f - glm_vec4_fract(gz00, gz00); // gz00 = fract(gz00) - glm_vec4_subs(gz00, 0.5f, gz00); // gz00 -= 0.5f - - // abs(gx00), abs(gy00), abs(gz00) - vec4 gx00a = {0.0f}; - glm_vec4_abs(gx00, gx00a); // gx00a = abs(gx00) - vec4 gy00a = {0.0f}; - glm_vec4_abs(gy00, gy00a); // gy00a = abs(gy00) - vec4 gz00a = {0.0f}; - glm_vec4_abs(gz00, gz00a); // gz00a = abs(gz00) - - // gw00 = 0.75 - abs(gx00) - abs(gy00) - abs(gz00) - vec4 gw00 = {0.75f}; // init to 0.75 - glm_vec4_sub(gw00, gx00a, gw00); // gw00 -= gx00a - glm_vec4_sub(gw00, gz00a, gw00); // gw00 -= gz00a - glm_vec4_sub(gw00, gy00a, gw00); // gw00 -= gy00a - - // sw00 = step(gw00, 0.0); - vec4 sw00 = {0.0f}; - _glm_vec4_steps(gw00, 0.0f, sw00); // sw00 = step(gw00, 0.0) - - // gx00 -= sw00 * (step(vec4(0), gx00) - T(0.5)); - vec4 temp = {0.0f}; // temp = 0.0 - glm_vec4_step(temp, gx00, temp); // temp = step(temp, gx00) - glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 - glm_vec4_mul(sw00, temp, temp); // temp *= sw00 - glm_vec4_sub(gx00, temp, gx00); // gx00 -= temp - - // gy00 -= sw00 * (step(vec4(0), gy00) - T(0.5)); - glm_vec4_zero(temp); // reset temp - glm_vec4_step(temp, gy00, temp); // temp = step(temp, gy00) - glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 - glm_vec4_mul(sw00, temp, temp); // temp *= sw00 - glm_vec4_sub(gy00, temp, gy00); // gy00 -= temp + vec4 gx11 = {0.0f}; + vec4 gy11 = {0.0f}; + vec4 gz11 = {0.0f}; + vec4 gw11 = {0.0f}; + _glm_perlinDetail_xy2g(ixy11, gx11, gy11, gz11, gw11); // ------------ - // Work in progress... + vec4 g0000 = {gx00[0], gy00[0], gz00[0], gw00[0]}; // g0000 = vec4(gx00.x, gy00.x, gz00.x, gw00.x); + vec4 g1000 = {gx00[1], gy00[1], gz00[1], gw00[1]}; // g1000 = vec4(gx00.y, gy00.y, gz00.y, gw00.y); + vec4 g0100 = {gx00[2], gy00[2], gz00[2], gw00[2]}; // g0100 = vec4(gx00.z, gy00.z, gz00.z, gw00.z); + vec4 g1100 = {gx00[3], gy00[3], gz00[3], gw00[3]}; // g1100 = vec4(gx00.w, gy00.w, gz00.w, gw00.w); + vec4 g0010 = {gx10[0], gy10[0], gz10[0], gw10[0]}; // g0010 = vec4(gx10.x, gy10.x, gz10.x, gw10.x); + vec4 g1010 = {gx10[1], gy10[1], gz10[1], gw10[1]}; // g1010 = vec4(gx10.y, gy10.y, gz10.y, gw10.y); + vec4 g0110 = {gx10[2], gy10[2], gz10[2], gw10[2]}; // g0110 = vec4(gx10.z, gy10.z, gz10.z, gw10.z); + vec4 g1110 = {gx10[3], gy10[3], gz10[3], gw10[3]}; // g1110 = vec4(gx10.w, gy10.w, gz10.w, gw10.w); + vec4 g0001 = {gx01[0], gy01[0], gz01[0], gw01[0]}; // g0001 = vec4(gx01.x, gy01.x, gz01.x, gw01.x); + vec4 g1001 = {gx01[1], gy01[1], gz01[1], gw01[1]}; // g1001 = vec4(gx01.y, gy01.y, gz01.y, gw01.y); + vec4 g0101 = {gx01[2], gy01[2], gz01[2], gw01[2]}; // g0101 = vec4(gx01.z, gy01.z, gz01.z, gw01.z); + vec4 g1101 = {gx01[3], gy01[3], gz01[3], gw01[3]}; // g1101 = vec4(gx01.w, gy01.w, gz01.w, gw01.w); + vec4 g0011 = {gx11[0], gy11[0], gz11[0], gw11[0]}; // g0011 = vec4(gx11.x, gy11.x, gz11.x, gw11.x); + vec4 g1011 = {gx11[1], gy11[1], gz11[1], gw11[1]}; // g1011 = vec4(gx11.y, gy11.y, gz11.y, gw11.y); + vec4 g0111 = {gx11[2], gy11[2], gz11[2], gw11[2]}; // g0111 = vec4(gx11.z, gy11.z, gz11.z, gw11.z); + vec4 g1111 = {gx11[3], gy11[3], gz11[3], gw11[3]}; // g1111 = vec4(gx11.w, gy11.w, gz11.w, gw11.w); + // norm00 = taylorInvSqrt( + // vec4( + // dot(g0000, g0000), + // dot(g0100, g0100), + // dot(g1000, g1000), + // dot(g1100, g1100) + // ) + // ); + vec4 norm00 = {0.0f}; + norm00[0] = glm_vec4_dot(g0000, g0000); // norm00.x = dot(g0000, g0000) + norm00[1] = glm_vec4_dot(g0100, g0100); // norm00.y = dot(g0100, g0100) + norm00[2] = glm_vec4_dot(g1000, g1000); // norm00.z = dot(g1000, g1000) + norm00[3] = glm_vec4_dot(g1100, g1100); // norm00.w = dot(g1100, g1100) + _glm_perlinDetail_taylorInvSqrt(norm00, norm00); // norm00 = taylorInvSqrt(norm00) + _glm_vec4_muls(g0000, norm00[0], g0000); // g0000 *= norm00.x + _glm_vec4_muls(g0100, norm00[1], g0100); // g0100 *= norm00.y + _glm_vec4_muls(g1000, norm00[2], g1000); // g1000 *= norm00.z + _glm_vec4_muls(g1100, norm00[3], g1100); // g1100 *= norm00.w + vec4 norm01 = {0.0f}; + norm01[0] = glm_vec4_dot(g0001, g0001); // norm01.x = dot(g0001, g0001) + norm01[1] = glm_vec4_dot(g0101, g0101); // norm01.y = dot(g0101, g0101) + norm01[2] = glm_vec4_dot(g1001, g1001); // norm01.z = dot(g1001, g1001) + norm01[3] = glm_vec4_dot(g1101, g1101); // norm01.w = dot(g1101, g1101) + _glm_perlinDetail_taylorInvSqrt(norm01, norm01); // norm01 = taylorInvSqrt(norm01) + + _glm_vec4_muls(g0001, norm01[0], g0001); // g0001 *= norm01.x + _glm_vec4_muls(g0101, norm01[1], g0101); // g0101 *= norm01.y + _glm_vec4_muls(g1001, norm01[2], g1001); // g1001 *= norm01.z + _glm_vec4_muls(g1101, norm01[3], g1101); // g1101 *= norm01.w + + vec4 norm10 = {0.0f}; + norm10[0] = glm_vec4_dot(g0010, g0010); // norm10.x = dot(g0010, g0010) + norm10[1] = glm_vec4_dot(g0110, g0110); // norm10.y = dot(g0110, g0110) + norm10[2] = glm_vec4_dot(g1010, g1010); // norm10.z = dot(g1010, g1010) + norm10[3] = glm_vec4_dot(g1110, g1110); // norm10.w = dot(g1110, g1110) + _glm_perlinDetail_taylorInvSqrt(norm10, norm10); // norm10 = taylorInvSqrt(norm10) + + _glm_vec4_muls(g0010, norm10[0], g0010); // g0010 *= norm10.x + _glm_vec4_muls(g0110, norm10[1], g0110); // g0110 *= norm10.y + _glm_vec4_muls(g1010, norm10[2], g1010); // g1010 *= norm10.z + _glm_vec4_muls(g1110, norm10[3], g1110); // g1110 *= norm10.w + + vec4 norm11 = {0.0f}; + norm11[0] = glm_vec4_dot(g0011, g0011); // norm11.x = dot(g0011, g0011) + norm11[1] = glm_vec4_dot(g0111, g0111); // norm11.y = dot(g0111, g0111) + norm11[2] = glm_vec4_dot(g1011, g1011); // norm11.z = dot(g1011, g1011) + norm11[3] = glm_vec4_dot(g1111, g1111); // norm11.w = dot(g1111, g1111) + _glm_perlinDetail_taylorInvSqrt(norm11, norm11); // norm11 = taylorInvSqrt(norm11) + + _glm_vec4_muls(g0011, norm11[0], g0011); // g0011 *= norm11.x + _glm_vec4_muls(g0111, norm11[1], g0111); // g0111 *= norm11.y + _glm_vec4_muls(g1011, norm11[2], g1011); // g1011 *= norm11.z + _glm_vec4_muls(g1111, norm11[3], g1111); // g1111 *= norm11.w + + // ------------ + + float n0000 = glm_vec4_dot(g0000, Pf0); // n0000 = dot(g0000, Pf0) + + vec4 n1000d = {Pf1[0], Pf0[1], Pf0[2], Pf0[3]}; + float n1000 = glm_vec4_dot(g1000, n1000d); // n1000 = dot(g1000, vec4(Pf1.x, Pf0.y, Pf0.z, Pf0.w)) + vec4 n0100d = {Pf0[0], Pf1[1], Pf0[2], Pf0[3]}; + float n0100 = glm_vec4_dot(g0100, n0100d); // n0100 = dot(g0100, vec4(Pf0.x, Pf1.y, Pf0.z, Pf0.w)) + vec4 n1100d = {Pf1[0], Pf1[1], Pf0[2], Pf0[3]}; + float n1100 = glm_vec4_dot(g1100, n1100d); // n1100 = dot(g1100, vec4(Pf1.x, Pf1.y, Pf0.z, Pf0.w)) + vec4 n0010d = {Pf0[0], Pf0[1], Pf1[2], Pf0[3]}; + float n0010 = glm_vec4_dot(g0010, n0010d); // n0010 = dot(g0010, vec4(Pf0.x, Pf0.y, Pf1.z, Pf0.w)) + vec4 n1010d = {Pf1[0], Pf0[1], Pf1[2], Pf0[3]}; + float n1010 = glm_vec4_dot(g1010, n1010d); // n1010 = dot(g1010, vec4(Pf1.x, Pf0.y, Pf1.z, Pf0.w)) + vec4 n0110d = {Pf0[0], Pf1[1], Pf1[2], Pf0[3]}; + float n0110 = glm_vec4_dot(g0110, n0110d); // n0110 = dot(g0110, vec4(Pf0.x, Pf1.y, Pf1.z, Pf0.w)) + vec4 n1110d = {Pf1[0], Pf1[1], Pf1[2], Pf0[3]}; + float n1110 = glm_vec4_dot(g1110, n1110d); // n1110 = dot(g1110, vec4(Pf1.x, Pf1.y, Pf1.z, Pf0.w)) + vec4 n0001d = {Pf0[0], Pf0[1], Pf0[2], Pf1[3]}; + float n0001 = glm_vec4_dot(g0001, n0001d); // n0001 = dot(g0001, vec4(Pf0.x, Pf0.y, Pf0.z, Pf1.w)) + vec4 n1001d = {Pf1[0], Pf0[1], Pf0[2], Pf1[3]}; + float n1001 = glm_vec4_dot(g1001, n1001d); // n1001 = dot(g1001, vec4(Pf1.x, Pf0.y, Pf0.z, Pf1.w)) + vec4 n0101d = {Pf0[0], Pf1[1], Pf0[2], Pf1[3]}; + float n0101 = glm_vec4_dot(g0101, n0101d); // n0101 = dot(g0101, vec4(Pf0.x, Pf1.y, Pf0.z, Pf1.w)) + vec4 n1101d = {Pf1[0], Pf1[1], Pf0[2], Pf1[3]}; + float n1101 = glm_vec4_dot(g1101, n1101d); // n1101 = dot(g1101, vec4(Pf1.x, Pf1.y, Pf0.z, Pf1.w)) + vec4 n0011d = {Pf0[0], Pf0[1], Pf1[2], Pf1[3]}; + float n0011 = glm_vec4_dot(g0011, n0011d); // n0011 = dot(g0011, vec4(Pf0.x, Pf0.y, Pf1.z, Pf1.w)) + vec4 n1011d = {Pf1[0], Pf0[1], Pf1[2], Pf1[3]}; + float n1011 = glm_vec4_dot(g1011, n1011d); // n1011 = dot(g1011, vec4(Pf1.x, Pf0.y, Pf1.z, Pf1.w)) + vec4 n0111d = {Pf0[0], Pf1[1], Pf1[2], Pf1[3]}; + float n0111 = glm_vec4_dot(g0111, n0111d); // n0111 = dot(g0111, vec4(Pf0.x, Pf1.y, Pf1.z, Pf1.w)) + + float n1111 = glm_vec4_dot(g1111, Pf1); // n1111 = dot(g1111, Pf1) + + // ------------ + + // fade_xyzw = detail::fade(Pf0); + // n_0w = lerp( + // vec4(n0000, n1000, n0100, n1100), + // vec4(n0001, n1001, n0101, n1101), + // fade_xyzw.w, + // ); + + vec4 fade_xyzw = {0.0f}; + _glm_perlinDetail_fade(Pf0, fade_xyzw); // fade_xyzw = fade(Pf0) + vec4 n_0w1 = {n0000, n1000, n0100, n1100}; + vec4 n_0w2 = {n0001, n1001, n0101, n1101}; + vec4 n_0w = {0.0f}; + glm_vec4_lerp(n_0w1, n_0w2, fade_xyzw[3], n_0w); // n_0w = lerp(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w) + + vec4 n_1w1 = {n0010, n1010, n0110, n1110}; + vec4 n_1w2 = {n0011, n1011, n0111, n1111}; + vec4 n_1w = {0.0f}; + glm_vec4_lerp(n_1w1, n_1w2, fade_xyzw[3], n_1w); // n_1w = lerp(vec4(n0010, n1010, n0110, n1110), vec4(n0011, n1011, n0111, n1111), fade_xyzw.w) + + vec4 n_zw = {0.0f}; + glm_vec4_lerp(n_0w, n_1w, fade_xyzw[2], n_zw); // n_zw = lerp(n_0w, n_1w, fade_xyzw.z) + + vec2 n_yzw = {0.0f}; + vec2 n_yzw1 = {n_zw[0], n_zw[1]}; + vec2 n_yzw2 = {n_zw[2], n_zw[3]}; + glm_vec2_lerp(n_yzw1, n_yzw2, fade_xyzw[1], n_yzw); // n_yzw = lerp(vec2(n_zw.x, n_zw.y), vec2(n_zw.z, n_zw.w), fade_xyzw.y) + float n_xyzw = glm_lerp(n_yzw[0], n_yzw[1], fade_xyzw[0]); // n_xyzw = lerp(n_yzw.x, n_yzw.y, fade_xyzw.x) - - return point[0] + point[1] + point[2] + point[3]; + return n_xyzw * 2.2f; } From f19dc13e39aa7d044e216efa0766bf22cc44142b Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 15 Jan 2025 12:36:17 +0000 Subject: [PATCH 030/128] missed bracket --- include/cglm/perlin.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/cglm/perlin.h b/include/cglm/perlin.h index a7802b6..7080022 100644 --- a/include/cglm/perlin.h +++ b/include/cglm/perlin.h @@ -36,10 +36,10 @@ _glm_perlinDetail_mod289(float x) { CGLM_INLINE void _glm_perlinDetail_permute(vec4 x, vec4 dest) { - dest[0] = _glm_perlinDetail_mod289(x[0] * 34.0f + 1.0f) * x[0]; - dest[1] = _glm_perlinDetail_mod289(x[1] * 34.0f + 1.0f) * x[1]; - dest[2] = _glm_perlinDetail_mod289(x[2] * 34.0f + 1.0f) * x[2]; - dest[3] = _glm_perlinDetail_mod289(x[3] * 34.0f + 1.0f) * x[3]; + dest[0] = _glm_perlinDetail_mod289((x[0] * 34.0f + 1.0f) * x[0]); + dest[1] = _glm_perlinDetail_mod289((x[1] * 34.0f + 1.0f) * x[1]); + dest[2] = _glm_perlinDetail_mod289((x[2] * 34.0f + 1.0f) * x[2]); + dest[3] = _glm_perlinDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); } From fda5406ac00acb161bb32f51528be82e1e98ea7a Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 15 Jan 2025 12:38:08 +0000 Subject: [PATCH 031/128] unnecessary zero init --- include/cglm/perlin.h | 77 ++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/include/cglm/perlin.h b/include/cglm/perlin.h index 7080022..e36526f 100644 --- a/include/cglm/perlin.h +++ b/include/cglm/perlin.h @@ -185,11 +185,11 @@ _glm_perlinDetail_xy2g( glm_vec4_subs(gz, 0.5f, gz); // gz -= 0.5f // abs(gx), abs(gy), abs(gz) - vec4 gxa = {0.0f}; + vec4 gxa; glm_vec4_abs(gx, gxa); // gxa = abs(gx) - vec4 gya = {0.0f}; + vec4 gya; glm_vec4_abs(gy, gya); // gya = abs(gy) - vec4 gza = {0.0f}; + vec4 gza; glm_vec4_abs(gz, gza); // gza = abs(gz) // gw = 0.75 - abs(gx) - abs(gy) - abs(gz) @@ -199,7 +199,7 @@ _glm_perlinDetail_xy2g( glm_vec4_sub(gw, gya, gw); // gw -= gya // sw = step(gw, 0.0); - vec4 sw = {0.0f}; + vec4 sw; _glm_vec4_steps(gw, 0.0f, sw); // sw = step(gw, 0.0) // gx -= sw * (step(vec4(0), gx) - T(0.5)); @@ -227,11 +227,12 @@ CGLM_INLINE float glm_perlin(vec4 point) { // Integer part of p for indexing - vec4 Pi0 = {0.0f}; + vec4 Pi0; _glm_vec4_floor(point, Pi0); // Pi0 = floor(point); + // Integer part + 1 - vec4 Pi1 = {0.0f}; + vec4 Pi1; glm_vec4_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; _glm_vec4_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); @@ -253,65 +254,65 @@ glm_perlin(vec4 point) { vec4 iw1 = {Pi1[3], Pi1[3], Pi1[3], Pi1[3]}; // ixy = permute(permute(ix) + iy) - vec4 ixy = {0.0f}; + vec4 ixy; _glm_perlinDetail_permute(ix, ixy); // ixy = permute(ix) glm_vec4_add(ixy, iy, ixy); // ixy += iy; _glm_perlinDetail_permute(ixy, ixy); // ixy = permute(ixy) // ixy0 = permute(ixy + iz0) - vec4 ixy0 = {0.0f}; + vec4 ixy0; glm_vec4_add(ixy, iz0, ixy0); // ixy0 = ixy + iz0 _glm_perlinDetail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) // ixy1 = permute(ixy + iz1) - vec4 ixy1 = {0.0f}; + vec4 ixy1; glm_vec4_add(ixy, iz1, ixy1); // ixy1 = ixy, iz1 _glm_perlinDetail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) // ixy00 = permute(ixy0 + iw0) - vec4 ixy00 = {0.0f}; + vec4 ixy00; glm_vec4_add(ixy0, iw0, ixy00); // ixy00 = ixy0 + iw0 _glm_perlinDetail_permute(ixy00, ixy00); // ixy00 = permute(ixy00) // ixy01 = permute(ixy0 + iw1) - vec4 ixy01 = {0.0f}; + vec4 ixy01; glm_vec4_add(ixy0, iw1, ixy01); // ixy01 = ixy0 + iw1 _glm_perlinDetail_permute(ixy01, ixy01); // ixy01 = permute(ixy01) // ixy10 = permute(ixy1 + iw0) - vec4 ixy10 = {0.0f}; + vec4 ixy10; glm_vec4_add(ixy1, iw0, ixy10); // ixy10 = ixy1 + iw0 _glm_perlinDetail_permute(ixy10, ixy10); // ixy10 = permute(ixy10) // ixy11 = permute(ixy1 + iw1) - vec4 ixy11 = {0.0f}; + vec4 ixy11; glm_vec4_add(ixy1, iw1, ixy11); // ixy11 = ixy1 + iw1 _glm_perlinDetail_permute(ixy11, ixy11); // ixy11 = permute(ixy11) // ------------ - vec4 gx00 = {0.0f}; - vec4 gy00 = {0.0f}; - vec4 gz00 = {0.0f}; - vec4 gw00 = {0.0f}; + vec4 gx00; + vec4 gy00; + vec4 gz00; + vec4 gw00; _glm_perlinDetail_xy2g(ixy00, gx00, gy00, gz00, gw00); - vec4 gx01 = {0.0f}; - vec4 gy01 = {0.0f}; - vec4 gz01 = {0.0f}; - vec4 gw01 = {0.0f}; + vec4 gx01; + vec4 gy01; + vec4 gz01; + vec4 gw01; _glm_perlinDetail_xy2g(ixy01, gx01, gy01, gz01, gw01); - vec4 gx10 = {0.0f}; - vec4 gy10 = {0.0f}; - vec4 gz10 = {0.0f}; - vec4 gw10 = {0.0f}; + vec4 gx10; + vec4 gy10; + vec4 gz10; + vec4 gw10; _glm_perlinDetail_xy2g(ixy10, gx10, gy10, gz10, gw10); - vec4 gx11 = {0.0f}; - vec4 gy11 = {0.0f}; - vec4 gz11 = {0.0f}; - vec4 gw11 = {0.0f}; + vec4 gx11; + vec4 gy11; + vec4 gz11; + vec4 gw11; _glm_perlinDetail_xy2g(ixy11, gx11, gy11, gz11, gw11); // ------------ @@ -343,7 +344,7 @@ glm_perlin(vec4 point) { // ) // ); - vec4 norm00 = {0.0f}; + vec4 norm00; norm00[0] = glm_vec4_dot(g0000, g0000); // norm00.x = dot(g0000, g0000) norm00[1] = glm_vec4_dot(g0100, g0100); // norm00.y = dot(g0100, g0100) norm00[2] = glm_vec4_dot(g1000, g1000); // norm00.z = dot(g1000, g1000) @@ -355,7 +356,7 @@ glm_perlin(vec4 point) { _glm_vec4_muls(g1000, norm00[2], g1000); // g1000 *= norm00.z _glm_vec4_muls(g1100, norm00[3], g1100); // g1100 *= norm00.w - vec4 norm01 = {0.0f}; + vec4 norm01; norm01[0] = glm_vec4_dot(g0001, g0001); // norm01.x = dot(g0001, g0001) norm01[1] = glm_vec4_dot(g0101, g0101); // norm01.y = dot(g0101, g0101) norm01[2] = glm_vec4_dot(g1001, g1001); // norm01.z = dot(g1001, g1001) @@ -367,7 +368,7 @@ glm_perlin(vec4 point) { _glm_vec4_muls(g1001, norm01[2], g1001); // g1001 *= norm01.z _glm_vec4_muls(g1101, norm01[3], g1101); // g1101 *= norm01.w - vec4 norm10 = {0.0f}; + vec4 norm10; norm10[0] = glm_vec4_dot(g0010, g0010); // norm10.x = dot(g0010, g0010) norm10[1] = glm_vec4_dot(g0110, g0110); // norm10.y = dot(g0110, g0110) norm10[2] = glm_vec4_dot(g1010, g1010); // norm10.z = dot(g1010, g1010) @@ -379,7 +380,7 @@ glm_perlin(vec4 point) { _glm_vec4_muls(g1010, norm10[2], g1010); // g1010 *= norm10.z _glm_vec4_muls(g1110, norm10[3], g1110); // g1110 *= norm10.w - vec4 norm11 = {0.0f}; + vec4 norm11; norm11[0] = glm_vec4_dot(g0011, g0011); // norm11.x = dot(g0011, g0011) norm11[1] = glm_vec4_dot(g0111, g0111); // norm11.y = dot(g0111, g0111) norm11[2] = glm_vec4_dot(g1011, g1011); // norm11.z = dot(g1011, g1011) @@ -435,23 +436,23 @@ glm_perlin(vec4 point) { // fade_xyzw.w, // ); - vec4 fade_xyzw = {0.0f}; + vec4 fade_xyzw; _glm_perlinDetail_fade(Pf0, fade_xyzw); // fade_xyzw = fade(Pf0) vec4 n_0w1 = {n0000, n1000, n0100, n1100}; vec4 n_0w2 = {n0001, n1001, n0101, n1101}; - vec4 n_0w = {0.0f}; + vec4 n_0w; glm_vec4_lerp(n_0w1, n_0w2, fade_xyzw[3], n_0w); // n_0w = lerp(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w) vec4 n_1w1 = {n0010, n1010, n0110, n1110}; vec4 n_1w2 = {n0011, n1011, n0111, n1111}; - vec4 n_1w = {0.0f}; + vec4 n_1w; glm_vec4_lerp(n_1w1, n_1w2, fade_xyzw[3], n_1w); // n_1w = lerp(vec4(n0010, n1010, n0110, n1110), vec4(n0011, n1011, n0111, n1111), fade_xyzw.w) - vec4 n_zw = {0.0f}; + vec4 n_zw; glm_vec4_lerp(n_0w, n_1w, fade_xyzw[2], n_zw); // n_zw = lerp(n_0w, n_1w, fade_xyzw.z) - vec2 n_yzw = {0.0f}; + vec2 n_yzw; vec2 n_yzw1 = {n_zw[0], n_zw[1]}; vec2 n_yzw2 = {n_zw[2], n_zw[3]}; glm_vec2_lerp(n_yzw1, n_yzw2, fade_xyzw[1], n_yzw); // n_yzw = lerp(vec2(n_zw.x, n_zw.y), vec2(n_zw.z, n_zw.w), fade_xyzw.y) From b54dff01241e501ff1bbef1b18a4650414f28a9a Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 15 Jan 2025 12:38:15 +0000 Subject: [PATCH 032/128] minor comment --- include/cglm/perlin.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/cglm/perlin.h b/include/cglm/perlin.h index e36526f..b7afe8e 100644 --- a/include/cglm/perlin.h +++ b/include/cglm/perlin.h @@ -248,10 +248,10 @@ glm_perlin(vec4 point) { vec4 ix = {Pi0[0], Pi1[0], Pi0[0], Pi1[0]}; vec4 iy = {Pi0[1], Pi0[1], Pi1[1], Pi1[1]}; - vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; - vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; - vec4 iw0 = {Pi0[3], Pi0[3], Pi0[3], Pi0[3]}; - vec4 iw1 = {Pi1[3], Pi1[3], Pi1[3], Pi1[3]}; + vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; // iz0 = vec4(Pi0.z); + vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; // iz1 = vec4(Pi1.z); + vec4 iw0 = {Pi0[3], Pi0[3], Pi0[3], Pi0[3]}; // iw0 = vec4(Pi0.w); + vec4 iw1 = {Pi1[3], Pi1[3], Pi1[3], Pi1[3]}; // iw1 = vec4(Pi1.w); // ixy = permute(permute(ix) + iy) vec4 ixy; From 5d34a0449647903e2ec1bdcd11c93d4a52576ca0 Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 15 Jan 2025 12:50:23 +0000 Subject: [PATCH 033/128] refactor gNorm --- include/cglm/perlin.h | 275 ++++++++++++++++++++++-------------------- 1 file changed, 143 insertions(+), 132 deletions(-) diff --git a/include/cglm/perlin.h b/include/cglm/perlin.h index b7afe8e..3b79695 100644 --- a/include/cglm/perlin.h +++ b/include/cglm/perlin.h @@ -14,63 +14,8 @@ #include "vec2.h" #include "vec2-ext.h" -// Based on glm::detail::mod289 -// template -// GLM_FUNC_QUALIFIER T mod289(T const& x) -// { -// return x - floor(x * (static_cast(1.0) / static_cast(289.0))) * static_cast(289.0); -// } +////////////////////////////// -CGLM_INLINE -float -_glm_perlinDetail_mod289(float x) { - return x - floorf(x * (1.0f / 289.0f)) * 289.0f; -} - -// Based on glm::detail::permute -// template -// GLM_FUNC_QUALIFIER vec<4, T, Q> permute(vec<4, T, Q> const& x) -// { -// return mod289(((x * static_cast(34)) + static_cast(1)) * x); -// } -CGLM_INLINE -void -_glm_perlinDetail_permute(vec4 x, vec4 dest) { - dest[0] = _glm_perlinDetail_mod289((x[0] * 34.0f + 1.0f) * x[0]); - dest[1] = _glm_perlinDetail_mod289((x[1] * 34.0f + 1.0f) * x[1]); - dest[2] = _glm_perlinDetail_mod289((x[2] * 34.0f + 1.0f) * x[2]); - dest[3] = _glm_perlinDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); -} - - -// GLM_FUNC_QUALIFIER vec<4, T, Q> taylorInvSqrt(vec<4, T, Q> const& r) -// { -// return static_cast(1.79284291400159) - static_cast(0.85373472095314) * r; -// } - -CGLM_INLINE -void -_glm_perlinDetail_taylorInvSqrt(vec4 x, vec4 dest) { - dest[0] = 1.79284291400159f - 0.85373472095314f * x[0]; - dest[1] = 1.79284291400159f - 0.85373472095314f * x[1]; - dest[2] = 1.79284291400159f - 0.85373472095314f * x[2]; - dest[3] = 1.79284291400159f - 0.85373472095314f * x[3]; -} - -// template -// GLM_FUNC_QUALIFIER vec<4, T, Q> fade(vec<4, T, Q> const& t) -// { -// return (t * t * t) * (t * (t * static_cast(6) - static_cast(15)) + static_cast(10)); -// } - -CGLM_INLINE -void -_glm_perlinDetail_fade(vec4 t, vec4 dest) { - dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); - dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); - dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); - dest[3] = (t[3] * t[3] * t[3]) * (t[3] * (t[3] * 6.0f - 15.0f) + 10.0f); -} /*! * @brief floor each element of v, result is written to dest @@ -151,6 +96,93 @@ _glm_vec4_muls(vec4 x, float y, vec4 dest) { } +////////////////////////////// + + + +// Based on glm::detail::mod289 +// template +// GLM_FUNC_QUALIFIER T mod289(T const& x) +// { +// return x - floor(x * (static_cast(1.0) / static_cast(289.0))) * static_cast(289.0); +// } + +CGLM_INLINE +float +_glm_perlinDetail_mod289(float x) { + return x - floorf(x * (1.0f / 289.0f)) * 289.0f; +} + +// Based on glm::detail::permute +// template +// GLM_FUNC_QUALIFIER vec<4, T, Q> permute(vec<4, T, Q> const& x) +// { +// return mod289(((x * static_cast(34)) + static_cast(1)) * x); +// } +CGLM_INLINE +void +_glm_perlinDetail_permute(vec4 x, vec4 dest) { + dest[0] = _glm_perlinDetail_mod289((x[0] * 34.0f + 1.0f) * x[0]); + dest[1] = _glm_perlinDetail_mod289((x[1] * 34.0f + 1.0f) * x[1]); + dest[2] = _glm_perlinDetail_mod289((x[2] * 34.0f + 1.0f) * x[2]); + dest[3] = _glm_perlinDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); +} + + +// GLM_FUNC_QUALIFIER vec<4, T, Q> taylorInvSqrt(vec<4, T, Q> const& r) +// { +// return static_cast(1.79284291400159) - static_cast(0.85373472095314) * r; +// } + +CGLM_INLINE +void +_glm_perlinDetail_taylorInvSqrt(vec4 x, vec4 dest) { + dest[0] = 1.79284291400159f - 0.85373472095314f * x[0]; + dest[1] = 1.79284291400159f - 0.85373472095314f * x[1]; + dest[2] = 1.79284291400159f - 0.85373472095314f * x[2]; + dest[3] = 1.79284291400159f - 0.85373472095314f * x[3]; +} + +// template +// GLM_FUNC_QUALIFIER vec<4, T, Q> fade(vec<4, T, Q> const& t) +// { +// return (t * t * t) * (t * (t * static_cast(6) - static_cast(15)) + static_cast(10)); +// } + +CGLM_INLINE +void +_glm_perlinDetail_fade(vec4 t, vec4 dest) { + dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); + dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); + dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); + dest[3] = (t[3] * t[3] * t[3]) * (t[3] * (t[3] * 6.0f - 15.0f) + 10.0f); +} + +CGLM_INLINE +void +_glm_perlinDetail_gNorm(vec4 g0000, vec4 g0100, vec4 g1000, vec4 g1100) { + + // norm = taylorInvSqrt( + // vec4( + // dot(g0000, g0000), + // dot(g0100, g0100), + // dot(g1000, g1000), + // dot(g1100, g1100) + // ) + // ); + vec4 norm; + norm[0] = glm_vec4_dot(g0000, g0000); // norm.x = dot(g0000, g0000) + norm[1] = glm_vec4_dot(g0100, g0100); // norm.y = dot(g0100, g0100) + norm[2] = glm_vec4_dot(g1000, g1000); // norm.z = dot(g1000, g1000) + norm[3] = glm_vec4_dot(g1100, g1100); // norm.w = dot(g1100, g1100) + _glm_perlinDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) + + _glm_vec4_muls(g0000, norm[0], g0000); // g0000 *= norm.x + _glm_vec4_muls(g0100, norm[1], g0100); // g0100 *= norm.y + _glm_vec4_muls(g1000, norm[2], g1000); // g1000 *= norm.z + _glm_vec4_muls(g1100, norm[3], g1100); // g1100 *= norm.w +} + CGLM_INLINE void _glm_perlinDetail_xy2g( @@ -334,96 +366,70 @@ glm_perlin(vec4 point) { vec4 g0111 = {gx11[2], gy11[2], gz11[2], gw11[2]}; // g0111 = vec4(gx11.z, gy11.z, gz11.z, gw11.z); vec4 g1111 = {gx11[3], gy11[3], gz11[3], gw11[3]}; // g1111 = vec4(gx11.w, gy11.w, gz11.w, gw11.w); - - // norm00 = taylorInvSqrt( - // vec4( - // dot(g0000, g0000), - // dot(g0100, g0100), - // dot(g1000, g1000), - // dot(g1100, g1100) - // ) - // ); - - vec4 norm00; - norm00[0] = glm_vec4_dot(g0000, g0000); // norm00.x = dot(g0000, g0000) - norm00[1] = glm_vec4_dot(g0100, g0100); // norm00.y = dot(g0100, g0100) - norm00[2] = glm_vec4_dot(g1000, g1000); // norm00.z = dot(g1000, g1000) - norm00[3] = glm_vec4_dot(g1100, g1100); // norm00.w = dot(g1100, g1100) - _glm_perlinDetail_taylorInvSqrt(norm00, norm00); // norm00 = taylorInvSqrt(norm00) - - _glm_vec4_muls(g0000, norm00[0], g0000); // g0000 *= norm00.x - _glm_vec4_muls(g0100, norm00[1], g0100); // g0100 *= norm00.y - _glm_vec4_muls(g1000, norm00[2], g1000); // g1000 *= norm00.z - _glm_vec4_muls(g1100, norm00[3], g1100); // g1100 *= norm00.w - - vec4 norm01; - norm01[0] = glm_vec4_dot(g0001, g0001); // norm01.x = dot(g0001, g0001) - norm01[1] = glm_vec4_dot(g0101, g0101); // norm01.y = dot(g0101, g0101) - norm01[2] = glm_vec4_dot(g1001, g1001); // norm01.z = dot(g1001, g1001) - norm01[3] = glm_vec4_dot(g1101, g1101); // norm01.w = dot(g1101, g1101) - _glm_perlinDetail_taylorInvSqrt(norm01, norm01); // norm01 = taylorInvSqrt(norm01) - - _glm_vec4_muls(g0001, norm01[0], g0001); // g0001 *= norm01.x - _glm_vec4_muls(g0101, norm01[1], g0101); // g0101 *= norm01.y - _glm_vec4_muls(g1001, norm01[2], g1001); // g1001 *= norm01.z - _glm_vec4_muls(g1101, norm01[3], g1101); // g1101 *= norm01.w - - vec4 norm10; - norm10[0] = glm_vec4_dot(g0010, g0010); // norm10.x = dot(g0010, g0010) - norm10[1] = glm_vec4_dot(g0110, g0110); // norm10.y = dot(g0110, g0110) - norm10[2] = glm_vec4_dot(g1010, g1010); // norm10.z = dot(g1010, g1010) - norm10[3] = glm_vec4_dot(g1110, g1110); // norm10.w = dot(g1110, g1110) - _glm_perlinDetail_taylorInvSqrt(norm10, norm10); // norm10 = taylorInvSqrt(norm10) - - _glm_vec4_muls(g0010, norm10[0], g0010); // g0010 *= norm10.x - _glm_vec4_muls(g0110, norm10[1], g0110); // g0110 *= norm10.y - _glm_vec4_muls(g1010, norm10[2], g1010); // g1010 *= norm10.z - _glm_vec4_muls(g1110, norm10[3], g1110); // g1110 *= norm10.w - - vec4 norm11; - norm11[0] = glm_vec4_dot(g0011, g0011); // norm11.x = dot(g0011, g0011) - norm11[1] = glm_vec4_dot(g0111, g0111); // norm11.y = dot(g0111, g0111) - norm11[2] = glm_vec4_dot(g1011, g1011); // norm11.z = dot(g1011, g1011) - norm11[3] = glm_vec4_dot(g1111, g1111); // norm11.w = dot(g1111, g1111) - _glm_perlinDetail_taylorInvSqrt(norm11, norm11); // norm11 = taylorInvSqrt(norm11) - - _glm_vec4_muls(g0011, norm11[0], g0011); // g0011 *= norm11.x - _glm_vec4_muls(g0111, norm11[1], g0111); // g0111 *= norm11.y - _glm_vec4_muls(g1011, norm11[2], g1011); // g1011 *= norm11.z - _glm_vec4_muls(g1111, norm11[3], g1111); // g1111 *= norm11.w + _glm_perlinDetail_gNorm(g0000, g0100, g1000, g1100); + _glm_perlinDetail_gNorm(g0001, g0101, g1001, g1101); + _glm_perlinDetail_gNorm(g0010, g0110, g1010, g1110); + _glm_perlinDetail_gNorm(g0011, g0111, g1011, g1111); // ------------ float n0000 = glm_vec4_dot(g0000, Pf0); // n0000 = dot(g0000, Pf0) + // n1000 = dot(g1000, vec4(Pf1.x, Pf0.y, Pf0.z, Pf0.w)) vec4 n1000d = {Pf1[0], Pf0[1], Pf0[2], Pf0[3]}; - float n1000 = glm_vec4_dot(g1000, n1000d); // n1000 = dot(g1000, vec4(Pf1.x, Pf0.y, Pf0.z, Pf0.w)) + float n1000 = glm_vec4_dot(g1000, n1000d); + + // n0100 = dot(g0100, vec4(Pf0.x, Pf1.y, Pf0.z, Pf0.w)) vec4 n0100d = {Pf0[0], Pf1[1], Pf0[2], Pf0[3]}; - float n0100 = glm_vec4_dot(g0100, n0100d); // n0100 = dot(g0100, vec4(Pf0.x, Pf1.y, Pf0.z, Pf0.w)) + float n0100 = glm_vec4_dot(g0100, n0100d); + + // n1100 = dot(g1100, vec4(Pf1.x, Pf1.y, Pf0.z, Pf0.w)) vec4 n1100d = {Pf1[0], Pf1[1], Pf0[2], Pf0[3]}; - float n1100 = glm_vec4_dot(g1100, n1100d); // n1100 = dot(g1100, vec4(Pf1.x, Pf1.y, Pf0.z, Pf0.w)) + float n1100 = glm_vec4_dot(g1100, n1100d); + + // n0010 = dot(g0010, vec4(Pf0.x, Pf0.y, Pf1.z, Pf0.w)) vec4 n0010d = {Pf0[0], Pf0[1], Pf1[2], Pf0[3]}; - float n0010 = glm_vec4_dot(g0010, n0010d); // n0010 = dot(g0010, vec4(Pf0.x, Pf0.y, Pf1.z, Pf0.w)) + float n0010 = glm_vec4_dot(g0010, n0010d); + + // n1010 = dot(g1010, vec4(Pf1.x, Pf0.y, Pf1.z, Pf0.w)) vec4 n1010d = {Pf1[0], Pf0[1], Pf1[2], Pf0[3]}; - float n1010 = glm_vec4_dot(g1010, n1010d); // n1010 = dot(g1010, vec4(Pf1.x, Pf0.y, Pf1.z, Pf0.w)) + float n1010 = glm_vec4_dot(g1010, n1010d); + + // n0110 = dot(g0110, vec4(Pf0.x, Pf1.y, Pf1.z, Pf0.w)) vec4 n0110d = {Pf0[0], Pf1[1], Pf1[2], Pf0[3]}; - float n0110 = glm_vec4_dot(g0110, n0110d); // n0110 = dot(g0110, vec4(Pf0.x, Pf1.y, Pf1.z, Pf0.w)) + float n0110 = glm_vec4_dot(g0110, n0110d); + + // n1110 = dot(g1110, vec4(Pf1.x, Pf1.y, Pf1.z, Pf0.w)) vec4 n1110d = {Pf1[0], Pf1[1], Pf1[2], Pf0[3]}; - float n1110 = glm_vec4_dot(g1110, n1110d); // n1110 = dot(g1110, vec4(Pf1.x, Pf1.y, Pf1.z, Pf0.w)) + float n1110 = glm_vec4_dot(g1110, n1110d); + + // n0001 = dot(g0001, vec4(Pf0.x, Pf0.y, Pf0.z, Pf1.w)) vec4 n0001d = {Pf0[0], Pf0[1], Pf0[2], Pf1[3]}; - float n0001 = glm_vec4_dot(g0001, n0001d); // n0001 = dot(g0001, vec4(Pf0.x, Pf0.y, Pf0.z, Pf1.w)) + float n0001 = glm_vec4_dot(g0001, n0001d); + + // n1001 = dot(g1001, vec4(Pf1.x, Pf0.y, Pf0.z, Pf1.w)) vec4 n1001d = {Pf1[0], Pf0[1], Pf0[2], Pf1[3]}; - float n1001 = glm_vec4_dot(g1001, n1001d); // n1001 = dot(g1001, vec4(Pf1.x, Pf0.y, Pf0.z, Pf1.w)) + float n1001 = glm_vec4_dot(g1001, n1001d); + + // n0101 = dot(g0101, vec4(Pf0.x, Pf1.y, Pf0.z, Pf1.w)) vec4 n0101d = {Pf0[0], Pf1[1], Pf0[2], Pf1[3]}; - float n0101 = glm_vec4_dot(g0101, n0101d); // n0101 = dot(g0101, vec4(Pf0.x, Pf1.y, Pf0.z, Pf1.w)) + float n0101 = glm_vec4_dot(g0101, n0101d); + + // n1101 = dot(g1101, vec4(Pf1.x, Pf1.y, Pf0.z, Pf1.w)) vec4 n1101d = {Pf1[0], Pf1[1], Pf0[2], Pf1[3]}; - float n1101 = glm_vec4_dot(g1101, n1101d); // n1101 = dot(g1101, vec4(Pf1.x, Pf1.y, Pf0.z, Pf1.w)) + float n1101 = glm_vec4_dot(g1101, n1101d); + + // n0011 = dot(g0011, vec4(Pf0.x, Pf0.y, Pf1.z, Pf1.w)) vec4 n0011d = {Pf0[0], Pf0[1], Pf1[2], Pf1[3]}; - float n0011 = glm_vec4_dot(g0011, n0011d); // n0011 = dot(g0011, vec4(Pf0.x, Pf0.y, Pf1.z, Pf1.w)) + float n0011 = glm_vec4_dot(g0011, n0011d); + + // n1011 = dot(g1011, vec4(Pf1.x, Pf0.y, Pf1.z, Pf1.w)) vec4 n1011d = {Pf1[0], Pf0[1], Pf1[2], Pf1[3]}; - float n1011 = glm_vec4_dot(g1011, n1011d); // n1011 = dot(g1011, vec4(Pf1.x, Pf0.y, Pf1.z, Pf1.w)) + float n1011 = glm_vec4_dot(g1011, n1011d); + + // n0111 = dot(g0111, vec4(Pf0.x, Pf1.y, Pf1.z, Pf1.w)) vec4 n0111d = {Pf0[0], Pf1[1], Pf1[2], Pf1[3]}; - float n0111 = glm_vec4_dot(g0111, n0111d); // n0111 = dot(g0111, vec4(Pf0.x, Pf1.y, Pf1.z, Pf1.w)) + float n0111 = glm_vec4_dot(g0111, n0111d); float n1111 = glm_vec4_dot(g1111, Pf1); // n1111 = dot(g1111, Pf1) @@ -439,25 +445,30 @@ glm_perlin(vec4 point) { vec4 fade_xyzw; _glm_perlinDetail_fade(Pf0, fade_xyzw); // fade_xyzw = fade(Pf0) + // n_0w = lerp(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w) vec4 n_0w1 = {n0000, n1000, n0100, n1100}; vec4 n_0w2 = {n0001, n1001, n0101, n1101}; vec4 n_0w; - glm_vec4_lerp(n_0w1, n_0w2, fade_xyzw[3], n_0w); // n_0w = lerp(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w) + glm_vec4_lerp(n_0w1, n_0w2, fade_xyzw[3], n_0w); + // n_1w = lerp(vec4(n0010, n1010, n0110, n1110), vec4(n0011, n1011, n0111, n1111), fade_xyzw.w) vec4 n_1w1 = {n0010, n1010, n0110, n1110}; vec4 n_1w2 = {n0011, n1011, n0111, n1111}; vec4 n_1w; - glm_vec4_lerp(n_1w1, n_1w2, fade_xyzw[3], n_1w); // n_1w = lerp(vec4(n0010, n1010, n0110, n1110), vec4(n0011, n1011, n0111, n1111), fade_xyzw.w) + glm_vec4_lerp(n_1w1, n_1w2, fade_xyzw[3], n_1w); + // n_zw = lerp(n_0w, n_1w, fade_xyzw.z) vec4 n_zw; - glm_vec4_lerp(n_0w, n_1w, fade_xyzw[2], n_zw); // n_zw = lerp(n_0w, n_1w, fade_xyzw.z) + glm_vec4_lerp(n_0w, n_1w, fade_xyzw[2], n_zw); + // n_yzw = lerp(vec2(n_zw.x, n_zw.y), vec2(n_zw.z, n_zw.w), fade_xyzw.y) vec2 n_yzw; vec2 n_yzw1 = {n_zw[0], n_zw[1]}; vec2 n_yzw2 = {n_zw[2], n_zw[3]}; - glm_vec2_lerp(n_yzw1, n_yzw2, fade_xyzw[1], n_yzw); // n_yzw = lerp(vec2(n_zw.x, n_zw.y), vec2(n_zw.z, n_zw.w), fade_xyzw.y) + glm_vec2_lerp(n_yzw1, n_yzw2, fade_xyzw[1], n_yzw); - float n_xyzw = glm_lerp(n_yzw[0], n_yzw[1], fade_xyzw[0]); // n_xyzw = lerp(n_yzw.x, n_yzw.y, fade_xyzw.x) + // n_xyzw = lerp(n_yzw.x, n_yzw.y, fade_xyzw.x) + float n_xyzw = glm_lerp(n_yzw[0], n_yzw[1], fade_xyzw[0]); return n_xyzw * 2.2f; } From 71a0dc6c3530c4d923c02796b2458622f2a8b1ba Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 15 Jan 2025 13:13:48 +0000 Subject: [PATCH 034/128] minor reshuffle --- include/cglm/perlin.h | 116 ++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 66 deletions(-) diff --git a/include/cglm/perlin.h b/include/cglm/perlin.h index 3b79695..8911066 100644 --- a/include/cglm/perlin.h +++ b/include/cglm/perlin.h @@ -129,20 +129,6 @@ _glm_perlinDetail_permute(vec4 x, vec4 dest) { } -// GLM_FUNC_QUALIFIER vec<4, T, Q> taylorInvSqrt(vec<4, T, Q> const& r) -// { -// return static_cast(1.79284291400159) - static_cast(0.85373472095314) * r; -// } - -CGLM_INLINE -void -_glm_perlinDetail_taylorInvSqrt(vec4 x, vec4 dest) { - dest[0] = 1.79284291400159f - 0.85373472095314f * x[0]; - dest[1] = 1.79284291400159f - 0.85373472095314f * x[1]; - dest[2] = 1.79284291400159f - 0.85373472095314f * x[2]; - dest[3] = 1.79284291400159f - 0.85373472095314f * x[3]; -} - // template // GLM_FUNC_QUALIFIER vec<4, T, Q> fade(vec<4, T, Q> const& t) // { @@ -160,27 +146,42 @@ _glm_perlinDetail_fade(vec4 t, vec4 dest) { CGLM_INLINE void -_glm_perlinDetail_gNorm(vec4 g0000, vec4 g0100, vec4 g1000, vec4 g1100) { +_glm_perlinDetail_taylorInvSqrt(vec4 x, vec4 dest) { + dest[0] = 1.79284291400159f - 0.85373472095314f * x[0]; + dest[1] = 1.79284291400159f - 0.85373472095314f * x[1]; + dest[2] = 1.79284291400159f - 0.85373472095314f * x[2]; + dest[3] = 1.79284291400159f - 0.85373472095314f * x[3]; +} - // norm = taylorInvSqrt( - // vec4( - // dot(g0000, g0000), - // dot(g0100, g0100), - // dot(g1000, g1000), - // dot(g1100, g1100) - // ) - // ); +/*! + * @brief Normalize gradients inplace + * + * @param[in, out] g00__ gradient from point 00 + * @param[in, out] g01__ gradient from point 01 + * @param[in, out] g10__ gradient from point 10 + * @param[in, out] g11__ gradient from point 11 + */ +CGLM_INLINE +void +_glm_perlinDetail_gradNorm(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) { + + // norm = taylorInvSqrt(vec4( + // dot(g00__, g00__), + // dot(g01__, g01__), + // dot(g10__, g10__), + // dot(g11__, g11__) + // )); vec4 norm; - norm[0] = glm_vec4_dot(g0000, g0000); // norm.x = dot(g0000, g0000) - norm[1] = glm_vec4_dot(g0100, g0100); // norm.y = dot(g0100, g0100) - norm[2] = glm_vec4_dot(g1000, g1000); // norm.z = dot(g1000, g1000) - norm[3] = glm_vec4_dot(g1100, g1100); // norm.w = dot(g1100, g1100) + norm[0] = glm_vec4_dot(g00__, g00__); // norm.x = dot(g00__, g00__) + norm[1] = glm_vec4_dot(g01__, g01__); // norm.y = dot(g01__, g01__) + norm[2] = glm_vec4_dot(g10__, g10__); // norm.z = dot(g10__, g10__) + norm[3] = glm_vec4_dot(g11__, g11__); // norm.w = dot(g11__, g11__) _glm_perlinDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) - _glm_vec4_muls(g0000, norm[0], g0000); // g0000 *= norm.x - _glm_vec4_muls(g0100, norm[1], g0100); // g0100 *= norm.y - _glm_vec4_muls(g1000, norm[2], g1000); // g1000 *= norm.z - _glm_vec4_muls(g1100, norm[3], g1100); // g1100 *= norm.w + _glm_vec4_muls(g00__, norm[0], g00__); // g00__ *= norm.x + _glm_vec4_muls(g01__, norm[1], g01__); // g01__ *= norm.y + _glm_vec4_muls(g10__, norm[2], g10__); // g10__ *= norm.z + _glm_vec4_muls(g11__, norm[3], g11__); // g11__ *= norm.w } CGLM_INLINE @@ -262,7 +263,6 @@ glm_perlin(vec4 point) { vec4 Pi0; _glm_vec4_floor(point, Pi0); // Pi0 = floor(point); - // Integer part + 1 vec4 Pi1; glm_vec4_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; @@ -323,53 +323,44 @@ glm_perlin(vec4 point) { // ------------ - vec4 gx00; - vec4 gy00; - vec4 gz00; - vec4 gw00; + vec4 gx00, gy00, gz00, gw00; _glm_perlinDetail_xy2g(ixy00, gx00, gy00, gz00, gw00); - vec4 gx01; - vec4 gy01; - vec4 gz01; - vec4 gw01; + vec4 gx01, gy01, gz01, gw01; _glm_perlinDetail_xy2g(ixy01, gx01, gy01, gz01, gw01); - vec4 gx10; - vec4 gy10; - vec4 gz10; - vec4 gw10; + vec4 gx10, gy10, gz10, gw10; _glm_perlinDetail_xy2g(ixy10, gx10, gy10, gz10, gw10); - vec4 gx11; - vec4 gy11; - vec4 gz11; - vec4 gw11; + vec4 gx11, gy11, gz11, gw11; _glm_perlinDetail_xy2g(ixy11, gx11, gy11, gz11, gw11); // ------------ vec4 g0000 = {gx00[0], gy00[0], gz00[0], gw00[0]}; // g0000 = vec4(gx00.x, gy00.x, gz00.x, gw00.x); - vec4 g1000 = {gx00[1], gy00[1], gz00[1], gw00[1]}; // g1000 = vec4(gx00.y, gy00.y, gz00.y, gw00.y); vec4 g0100 = {gx00[2], gy00[2], gz00[2], gw00[2]}; // g0100 = vec4(gx00.z, gy00.z, gz00.z, gw00.z); + vec4 g1000 = {gx00[1], gy00[1], gz00[1], gw00[1]}; // g1000 = vec4(gx00.y, gy00.y, gz00.y, gw00.y); vec4 g1100 = {gx00[3], gy00[3], gz00[3], gw00[3]}; // g1100 = vec4(gx00.w, gy00.w, gz00.w, gw00.w); - vec4 g0010 = {gx10[0], gy10[0], gz10[0], gw10[0]}; // g0010 = vec4(gx10.x, gy10.x, gz10.x, gw10.x); - vec4 g1010 = {gx10[1], gy10[1], gz10[1], gw10[1]}; // g1010 = vec4(gx10.y, gy10.y, gz10.y, gw10.y); - vec4 g0110 = {gx10[2], gy10[2], gz10[2], gw10[2]}; // g0110 = vec4(gx10.z, gy10.z, gz10.z, gw10.z); - vec4 g1110 = {gx10[3], gy10[3], gz10[3], gw10[3]}; // g1110 = vec4(gx10.w, gy10.w, gz10.w, gw10.w); + vec4 g0001 = {gx01[0], gy01[0], gz01[0], gw01[0]}; // g0001 = vec4(gx01.x, gy01.x, gz01.x, gw01.x); - vec4 g1001 = {gx01[1], gy01[1], gz01[1], gw01[1]}; // g1001 = vec4(gx01.y, gy01.y, gz01.y, gw01.y); vec4 g0101 = {gx01[2], gy01[2], gz01[2], gw01[2]}; // g0101 = vec4(gx01.z, gy01.z, gz01.z, gw01.z); + vec4 g1001 = {gx01[1], gy01[1], gz01[1], gw01[1]}; // g1001 = vec4(gx01.y, gy01.y, gz01.y, gw01.y); vec4 g1101 = {gx01[3], gy01[3], gz01[3], gw01[3]}; // g1101 = vec4(gx01.w, gy01.w, gz01.w, gw01.w); + + vec4 g0010 = {gx10[0], gy10[0], gz10[0], gw10[0]}; // g0010 = vec4(gx10.x, gy10.x, gz10.x, gw10.x); + vec4 g0110 = {gx10[2], gy10[2], gz10[2], gw10[2]}; // g0110 = vec4(gx10.z, gy10.z, gz10.z, gw10.z); + vec4 g1010 = {gx10[1], gy10[1], gz10[1], gw10[1]}; // g1010 = vec4(gx10.y, gy10.y, gz10.y, gw10.y); + vec4 g1110 = {gx10[3], gy10[3], gz10[3], gw10[3]}; // g1110 = vec4(gx10.w, gy10.w, gz10.w, gw10.w); + vec4 g0011 = {gx11[0], gy11[0], gz11[0], gw11[0]}; // g0011 = vec4(gx11.x, gy11.x, gz11.x, gw11.x); - vec4 g1011 = {gx11[1], gy11[1], gz11[1], gw11[1]}; // g1011 = vec4(gx11.y, gy11.y, gz11.y, gw11.y); vec4 g0111 = {gx11[2], gy11[2], gz11[2], gw11[2]}; // g0111 = vec4(gx11.z, gy11.z, gz11.z, gw11.z); + vec4 g1011 = {gx11[1], gy11[1], gz11[1], gw11[1]}; // g1011 = vec4(gx11.y, gy11.y, gz11.y, gw11.y); vec4 g1111 = {gx11[3], gy11[3], gz11[3], gw11[3]}; // g1111 = vec4(gx11.w, gy11.w, gz11.w, gw11.w); - _glm_perlinDetail_gNorm(g0000, g0100, g1000, g1100); - _glm_perlinDetail_gNorm(g0001, g0101, g1001, g1101); - _glm_perlinDetail_gNorm(g0010, g0110, g1010, g1110); - _glm_perlinDetail_gNorm(g0011, g0111, g1011, g1111); + _glm_perlinDetail_gradNorm(g0000, g0100, g1000, g1100); + _glm_perlinDetail_gradNorm(g0001, g0101, g1001, g1101); + _glm_perlinDetail_gradNorm(g0010, g0110, g1010, g1110); + _glm_perlinDetail_gradNorm(g0011, g0111, g1011, g1111); // ------------ @@ -435,13 +426,6 @@ glm_perlin(vec4 point) { // ------------ - // fade_xyzw = detail::fade(Pf0); - // n_0w = lerp( - // vec4(n0000, n1000, n0100, n1100), - // vec4(n0001, n1001, n0101, n1101), - // fade_xyzw.w, - // ); - vec4 fade_xyzw; _glm_perlinDetail_fade(Pf0, fade_xyzw); // fade_xyzw = fade(Pf0) From 43c9f84c8cbd459c49548584033454189876df97 Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 15 Jan 2025 13:31:11 +0000 Subject: [PATCH 035/128] test_perlin --- test/src/test_perlin.h | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/test/src/test_perlin.h b/test/src/test_perlin.h index 3c9f2dc..0a86ca5 100644 --- a/test/src/test_perlin.h +++ b/test/src/test_perlin.h @@ -8,9 +8,36 @@ #include "test_common.h" TEST_IMPL(GLM_PREFIX, perlin) { - vec4 p = {1.0f, 2.0f, 3.0f, 4.0f}; + vec4 p1[] = { + {0.1f, 0.2f, 0.3f, 0.4f}, + {0.2f, 0.3f, 0.4f, 0.5f}, + {0.3f, 0.4f, 0.5f, 0.6f}, + {0.4f, 0.5f, 0.6f, 0.7f}, + {0.5f, 0.6f, 0.7f, 0.8f}, + {0.6f, 0.7f, 0.8f, 0.9f}, + {0.7f, 0.8f, 0.9f, 1.0f}, + {0.8f, 0.9f, 1.0f, 1.1f}, + {0.9f, 1.0f, 1.1f, 1.2f}, + {1.0f, 1.1f, 1.2f, 1.3f}, + }; + + // expected values calculated by glm::perlin + float e[] = { + -0.5091819763183594f, + -0.4375732541084290f, + -0.3212279379367828f, + -0.2279999703168869f, + -0.1577337533235550f, + -0.0445968918502331f, + 0.1069696992635727f, + 0.2067739963531494f, + 0.2106968611478806f, + 0.1397782564163208f + }; - float out = GLM(perlin)(p); - ASSERT(test_eq(out, 10.0f)) + for (int i = 0; i < 10; i++) { + ASSERT(test_eq(GLM(perlin)(p1[i]), e[i])); + } + TEST_SUCCESS } From a0d8803f7669d6a510cf437501d7fd4cd84c7c82 Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 15 Jan 2025 14:05:01 +0000 Subject: [PATCH 036/128] perlin.h -> noise.h --- CMakeLists.txt | 2 +- Makefile.am | 8 +-- docs/source/api_inline_array.rst | 2 +- docs/source/{perlin.rst => noise.rst} | 6 +-- include/cglm/call.h | 2 +- include/cglm/call/{perlin.h => noise.h} | 8 +-- include/cglm/cglm.h | 2 +- include/cglm/{perlin.h => noise.h} | 64 +++++++++++------------ include/cglm/struct.h | 2 +- include/cglm/struct/{perlin.h => noise.h} | 14 ++--- meson.build | 2 +- src/{perlin.c => noise.c} | 4 +- test/src/{test_perlin.h => test_noise.h} | 4 +- test/src/tests.c | 4 +- test/tests.h | 12 ++--- 15 files changed, 68 insertions(+), 68 deletions(-) rename docs/source/{perlin.rst => noise.rst} (81%) rename include/cglm/call/{perlin.h => noise.h} (72%) rename include/cglm/{perlin.h => noise.h} (87%) rename include/cglm/struct/{perlin.h => noise.h} (63%) rename src/{perlin.c => noise.c} (80%) rename test/src/{test_perlin.h => test_noise.h} (90%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3868b38..b8436a4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,7 +93,7 @@ add_library(${PROJECT_NAME} src/mat4x2.c src/mat4x3.c src/plane.c - src/perlin.c + src/noise.c src/frustum.c src/box.c src/project.c diff --git a/Makefile.am b/Makefile.am index f29bfb0..8420648 100644 --- a/Makefile.am +++ b/Makefile.am @@ -67,7 +67,7 @@ cglm_HEADERS = include/cglm/version.h \ include/cglm/util.h \ include/cglm/quat.h \ include/cglm/plane.h \ - include/cglm/perlin.h \ + include/cglm/noise.h \ include/cglm/frustum.h \ include/cglm/box.h \ include/cglm/aabb2d.h \ @@ -121,7 +121,7 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \ include/cglm/call/quat.h \ include/cglm/call/euler.h \ include/cglm/call/plane.h \ - include/cglm/call/perlin.h \ + include/cglm/call/noise.h \ include/cglm/call/frustum.h \ include/cglm/call/box.h \ include/cglm/call/project.h \ @@ -212,7 +212,7 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \ include/cglm/struct/quat.h \ include/cglm/struct/euler.h \ include/cglm/struct/plane.h \ - include/cglm/struct/perlin.h \ + include/cglm/struct/noise.h \ include/cglm/struct/frustum.h \ include/cglm/struct/box.h \ include/cglm/struct/aabb2d.h \ @@ -264,7 +264,7 @@ libcglm_la_SOURCES=\ src/mat4x2.c \ src/mat4x3.c \ src/plane.c \ - src/perlin.c \ + src/noise.c \ src/frustum.c \ src/box.c \ src/project.c \ diff --git a/docs/source/api_inline_array.rst b/docs/source/api_inline_array.rst index becb684..f989bfe 100644 --- a/docs/source/api_inline_array.rst +++ b/docs/source/api_inline_array.rst @@ -66,7 +66,7 @@ Follow the :doc:`build` documentation for this ivec4 color plane - perlin + noise project util io diff --git a/docs/source/perlin.rst b/docs/source/noise.rst similarity index 81% rename from docs/source/perlin.rst rename to docs/source/noise.rst index 0fb6fb4..8680fe0 100644 --- a/docs/source/perlin.rst +++ b/docs/source/noise.rst @@ -3,7 +3,7 @@ perlin ================================================================================ -Header: cglm/perlin.h +Header: cglm/noise.h Classic Perlin noise implementation. @@ -12,13 +12,13 @@ Table of contents (click to go): Functions: -1. :c:func:`glm_perlin` +1. :c:func:`glm_perlin_vec4` Functions documentation ~~~~~~~~~~~~~~~~~~~~~~~ -.. c:function:: float glm_perlin(vec4 point) +.. c:function:: float glm_perlin_vec4(vec4 point) | Classic Perlin noise diff --git a/include/cglm/call.h b/include/cglm/call.h index b298052..165f502 100644 --- a/include/cglm/call.h +++ b/include/cglm/call.h @@ -32,7 +32,7 @@ extern "C" { #include "call/quat.h" #include "call/euler.h" #include "call/plane.h" -#include "call/perlin.h" +#include "call/noise.h" #include "call/frustum.h" #include "call/aabb2d.h" #include "call/box.h" diff --git a/include/cglm/call/perlin.h b/include/cglm/call/noise.h similarity index 72% rename from include/cglm/call/perlin.h rename to include/cglm/call/noise.h index 521e21d..de1c673 100644 --- a/include/cglm/call/perlin.h +++ b/include/cglm/call/noise.h @@ -5,8 +5,8 @@ * Full license can be found in the LICENSE file */ -#ifndef cglmc_perlin_h -#define cglmc_perlin_h +#ifndef cglmc_noise_h +#define cglmc_noise_h #ifdef __cplusplus extern "C" { #endif @@ -15,9 +15,9 @@ extern "C" { CGLM_EXPORT float -glmc_perlin(vec4 point); +glmc_perlin_vec4(vec4 point); #ifdef __cplusplus } #endif -#endif /* cglmc_perlin_h */ +#endif /* cglmc_noise_h */ diff --git a/include/cglm/cglm.h b/include/cglm/cglm.h index 8741422..146ded0 100644 --- a/include/cglm/cglm.h +++ b/include/cglm/cglm.h @@ -30,7 +30,7 @@ #include "quat.h" #include "euler.h" #include "plane.h" -#include "perlin.h" +#include "noise.h" #include "aabb2d.h" #include "box.h" #include "color.h" diff --git a/include/cglm/perlin.h b/include/cglm/noise.h similarity index 87% rename from include/cglm/perlin.h rename to include/cglm/noise.h index 8911066..6954817 100644 --- a/include/cglm/perlin.h +++ b/include/cglm/noise.h @@ -5,8 +5,8 @@ * Full license can be found in the LICENSE file */ -#ifndef cglm_perlin_h -#define cglm_perlin_h +#ifndef cglm_noise_h +#define cglm_noise_h #include "vec4.h" #include "vec4-ext.h" @@ -109,7 +109,7 @@ _glm_vec4_muls(vec4 x, float y, vec4 dest) { CGLM_INLINE float -_glm_perlinDetail_mod289(float x) { +_glm_noiseDetail_mod289(float x) { return x - floorf(x * (1.0f / 289.0f)) * 289.0f; } @@ -121,11 +121,11 @@ _glm_perlinDetail_mod289(float x) { // } CGLM_INLINE void -_glm_perlinDetail_permute(vec4 x, vec4 dest) { - dest[0] = _glm_perlinDetail_mod289((x[0] * 34.0f + 1.0f) * x[0]); - dest[1] = _glm_perlinDetail_mod289((x[1] * 34.0f + 1.0f) * x[1]); - dest[2] = _glm_perlinDetail_mod289((x[2] * 34.0f + 1.0f) * x[2]); - dest[3] = _glm_perlinDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); +_glm_noiseDetail_permute(vec4 x, vec4 dest) { + dest[0] = _glm_noiseDetail_mod289((x[0] * 34.0f + 1.0f) * x[0]); + dest[1] = _glm_noiseDetail_mod289((x[1] * 34.0f + 1.0f) * x[1]); + dest[2] = _glm_noiseDetail_mod289((x[2] * 34.0f + 1.0f) * x[2]); + dest[3] = _glm_noiseDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); } @@ -137,7 +137,7 @@ _glm_perlinDetail_permute(vec4 x, vec4 dest) { CGLM_INLINE void -_glm_perlinDetail_fade(vec4 t, vec4 dest) { +_glm_noiseDetail_fade(vec4 t, vec4 dest) { dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); @@ -146,7 +146,7 @@ _glm_perlinDetail_fade(vec4 t, vec4 dest) { CGLM_INLINE void -_glm_perlinDetail_taylorInvSqrt(vec4 x, vec4 dest) { +_glm_noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) { dest[0] = 1.79284291400159f - 0.85373472095314f * x[0]; dest[1] = 1.79284291400159f - 0.85373472095314f * x[1]; dest[2] = 1.79284291400159f - 0.85373472095314f * x[2]; @@ -163,7 +163,7 @@ _glm_perlinDetail_taylorInvSqrt(vec4 x, vec4 dest) { */ CGLM_INLINE void -_glm_perlinDetail_gradNorm(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) { +_glm_noiseDetail_gradNorm(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) { // norm = taylorInvSqrt(vec4( // dot(g00__, g00__), @@ -176,7 +176,7 @@ _glm_perlinDetail_gradNorm(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) { norm[1] = glm_vec4_dot(g01__, g01__); // norm.y = dot(g01__, g01__) norm[2] = glm_vec4_dot(g10__, g10__); // norm.z = dot(g10__, g10__) norm[3] = glm_vec4_dot(g11__, g11__); // norm.w = dot(g11__, g11__) - _glm_perlinDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) + _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) _glm_vec4_muls(g00__, norm[0], g00__); // g00__ *= norm.x _glm_vec4_muls(g01__, norm[1], g01__); // g01__ *= norm.y @@ -186,7 +186,7 @@ _glm_perlinDetail_gradNorm(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) { CGLM_INLINE void -_glm_perlinDetail_xy2g( +_glm_noiseDetail_xy2g( vec4 ixy, /* out */ vec4 gx, @@ -258,7 +258,7 @@ _glm_perlinDetail_xy2g( */ CGLM_INLINE float -glm_perlin(vec4 point) { +glm_perlin_vec4(vec4 point) { // Integer part of p for indexing vec4 Pi0; _glm_vec4_floor(point, Pi0); // Pi0 = floor(point); @@ -287,53 +287,53 @@ glm_perlin(vec4 point) { // ixy = permute(permute(ix) + iy) vec4 ixy; - _glm_perlinDetail_permute(ix, ixy); // ixy = permute(ix) + _glm_noiseDetail_permute(ix, ixy); // ixy = permute(ix) glm_vec4_add(ixy, iy, ixy); // ixy += iy; - _glm_perlinDetail_permute(ixy, ixy); // ixy = permute(ixy) + _glm_noiseDetail_permute(ixy, ixy); // ixy = permute(ixy) // ixy0 = permute(ixy + iz0) vec4 ixy0; glm_vec4_add(ixy, iz0, ixy0); // ixy0 = ixy + iz0 - _glm_perlinDetail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) + _glm_noiseDetail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) // ixy1 = permute(ixy + iz1) vec4 ixy1; glm_vec4_add(ixy, iz1, ixy1); // ixy1 = ixy, iz1 - _glm_perlinDetail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) + _glm_noiseDetail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) // ixy00 = permute(ixy0 + iw0) vec4 ixy00; glm_vec4_add(ixy0, iw0, ixy00); // ixy00 = ixy0 + iw0 - _glm_perlinDetail_permute(ixy00, ixy00); // ixy00 = permute(ixy00) + _glm_noiseDetail_permute(ixy00, ixy00); // ixy00 = permute(ixy00) // ixy01 = permute(ixy0 + iw1) vec4 ixy01; glm_vec4_add(ixy0, iw1, ixy01); // ixy01 = ixy0 + iw1 - _glm_perlinDetail_permute(ixy01, ixy01); // ixy01 = permute(ixy01) + _glm_noiseDetail_permute(ixy01, ixy01); // ixy01 = permute(ixy01) // ixy10 = permute(ixy1 + iw0) vec4 ixy10; glm_vec4_add(ixy1, iw0, ixy10); // ixy10 = ixy1 + iw0 - _glm_perlinDetail_permute(ixy10, ixy10); // ixy10 = permute(ixy10) + _glm_noiseDetail_permute(ixy10, ixy10); // ixy10 = permute(ixy10) // ixy11 = permute(ixy1 + iw1) vec4 ixy11; glm_vec4_add(ixy1, iw1, ixy11); // ixy11 = ixy1 + iw1 - _glm_perlinDetail_permute(ixy11, ixy11); // ixy11 = permute(ixy11) + _glm_noiseDetail_permute(ixy11, ixy11); // ixy11 = permute(ixy11) // ------------ vec4 gx00, gy00, gz00, gw00; - _glm_perlinDetail_xy2g(ixy00, gx00, gy00, gz00, gw00); + _glm_noiseDetail_xy2g(ixy00, gx00, gy00, gz00, gw00); vec4 gx01, gy01, gz01, gw01; - _glm_perlinDetail_xy2g(ixy01, gx01, gy01, gz01, gw01); + _glm_noiseDetail_xy2g(ixy01, gx01, gy01, gz01, gw01); vec4 gx10, gy10, gz10, gw10; - _glm_perlinDetail_xy2g(ixy10, gx10, gy10, gz10, gw10); + _glm_noiseDetail_xy2g(ixy10, gx10, gy10, gz10, gw10); vec4 gx11, gy11, gz11, gw11; - _glm_perlinDetail_xy2g(ixy11, gx11, gy11, gz11, gw11); + _glm_noiseDetail_xy2g(ixy11, gx11, gy11, gz11, gw11); // ------------ @@ -357,10 +357,10 @@ glm_perlin(vec4 point) { vec4 g1011 = {gx11[1], gy11[1], gz11[1], gw11[1]}; // g1011 = vec4(gx11.y, gy11.y, gz11.y, gw11.y); vec4 g1111 = {gx11[3], gy11[3], gz11[3], gw11[3]}; // g1111 = vec4(gx11.w, gy11.w, gz11.w, gw11.w); - _glm_perlinDetail_gradNorm(g0000, g0100, g1000, g1100); - _glm_perlinDetail_gradNorm(g0001, g0101, g1001, g1101); - _glm_perlinDetail_gradNorm(g0010, g0110, g1010, g1110); - _glm_perlinDetail_gradNorm(g0011, g0111, g1011, g1111); + _glm_noiseDetail_gradNorm(g0000, g0100, g1000, g1100); + _glm_noiseDetail_gradNorm(g0001, g0101, g1001, g1101); + _glm_noiseDetail_gradNorm(g0010, g0110, g1010, g1110); + _glm_noiseDetail_gradNorm(g0011, g0111, g1011, g1111); // ------------ @@ -427,7 +427,7 @@ glm_perlin(vec4 point) { // ------------ vec4 fade_xyzw; - _glm_perlinDetail_fade(Pf0, fade_xyzw); // fade_xyzw = fade(Pf0) + _glm_noiseDetail_fade(Pf0, fade_xyzw); // fade_xyzw = fade(Pf0) // n_0w = lerp(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w) vec4 n_0w1 = {n0000, n1000, n0100, n1100}; @@ -458,4 +458,4 @@ glm_perlin(vec4 point) { } -#endif /* cglm_perlin_h */ +#endif /* cglm_noise_h */ diff --git a/include/cglm/struct.h b/include/cglm/struct.h index f03b9dd..31ca4e2 100644 --- a/include/cglm/struct.h +++ b/include/cglm/struct.h @@ -31,7 +31,7 @@ extern "C" { #include "struct/affine.h" #include "struct/frustum.h" #include "struct/plane.h" -#include "struct/perlin.h" +#include "struct/noise.h" #include "struct/box.h" #include "struct/color.h" #include "struct/io.h" diff --git a/include/cglm/struct/perlin.h b/include/cglm/struct/noise.h similarity index 63% rename from include/cglm/struct/perlin.h rename to include/cglm/struct/noise.h index 4897417..a6798c6 100644 --- a/include/cglm/struct/perlin.h +++ b/include/cglm/struct/noise.h @@ -5,17 +5,17 @@ * Full license can be found in the LICENSE file */ -#ifndef cglms_perlins_h -#define cglms_perlins_h +#ifndef cglms_noises_h +#define cglms_noises_h #include "../common.h" #include "../types-struct.h" -#include "../perlin.h" +#include "../noise.h" #include "vec4.h" /* Functions: - CGLM_INLINE float glms_perlin(vec4s point); + CGLM_INLINE float glms_perlin_vec4(vec4s point); */ /*! @@ -26,8 +26,8 @@ */ CGLM_INLINE float -glms_perlin(vec4s point) { - return glm_perlin(point.raw); +glms_perlin_vec4(vec4s point) { + return glm_perlin_vec4(point.raw); } -#endif /* cglms_perlins_h */ +#endif /* cglms_noises_h */ diff --git a/meson.build b/meson.build index f79a007..dcfdef1 100644 --- a/meson.build +++ b/meson.build @@ -56,7 +56,7 @@ cglm_src = files( 'src/mat4x2.c', 'src/mat4x3.c', 'src/plane.c', - 'src/perlin.c', + 'src/noise.c', 'src/frustum.c', 'src/box.c', 'src/project.c', diff --git a/src/perlin.c b/src/noise.c similarity index 80% rename from src/perlin.c rename to src/noise.c index 5c57296..0fff5f9 100644 --- a/src/perlin.c +++ b/src/noise.c @@ -10,6 +10,6 @@ CGLM_EXPORT float -glmc_perlin(vec4 p) { - return glm_perlin(p); +glmc_perlin_vec4(vec4 p) { + return glm_perlin_vec4(p); } diff --git a/test/src/test_perlin.h b/test/src/test_noise.h similarity index 90% rename from test/src/test_perlin.h rename to test/src/test_noise.h index 0a86ca5..62aecb9 100644 --- a/test/src/test_perlin.h +++ b/test/src/test_noise.h @@ -7,7 +7,7 @@ #include "test_common.h" -TEST_IMPL(GLM_PREFIX, perlin) { +TEST_IMPL(GLM_PREFIX, perlin_vec4) { vec4 p1[] = { {0.1f, 0.2f, 0.3f, 0.4f}, {0.2f, 0.3f, 0.4f, 0.5f}, @@ -36,7 +36,7 @@ TEST_IMPL(GLM_PREFIX, perlin) { }; for (int i = 0; i < 10; i++) { - ASSERT(test_eq(GLM(perlin)(p1[i]), e[i])); + ASSERT(test_eq(GLM(perlin_vec4)(p1[i]), e[i])); } TEST_SUCCESS diff --git a/test/src/tests.c b/test/src/tests.c index a32dc97..a4bfe7b 100644 --- a/test/src/tests.c +++ b/test/src/tests.c @@ -30,7 +30,7 @@ #include "test_quat.h" #include "test_project.h" #include "test_plane.h" -#include "test_perlin.h" +#include "test_noise.h" #include "test_affine.h" #include "test_affine2d.h" #include "test_affine_mat.h" @@ -70,7 +70,7 @@ #include "test_quat.h" #include "test_project.h" #include "test_plane.h" -#include "test_perlin.h" +#include "test_noise.h" #include "test_affine.h" #include "test_affine2d.h" #include "test_affine_mat.h" diff --git a/test/tests.h b/test/tests.h index 62e7d07..6980d49 100644 --- a/test/tests.h +++ b/test/tests.h @@ -356,9 +356,9 @@ TEST_DECLARE(glmc_project) TEST_DECLARE(glm_plane_normalize) TEST_DECLARE(glmc_plane_normalize) -/* perlin */ -TEST_DECLARE(glm_perlin) -TEST_DECLARE(glmc_perlin) +/* noise */ +TEST_DECLARE(glm_perlin_vec4) +TEST_DECLARE(glmc_perlin_vec4) /* utils */ TEST_DECLARE(clamp) @@ -1538,9 +1538,9 @@ TEST_LIST { TEST_ENTRY(glm_plane_normalize) TEST_ENTRY(glmc_plane_normalize) - /* perlin */ - TEST_ENTRY(glm_perlin) - TEST_ENTRY(glmc_perlin) + /* noise */ + TEST_ENTRY(glm_perlin_vec4) + TEST_ENTRY(glmc_perlin_vec4) /* utils */ TEST_ENTRY(clamp) From ae1bee74810ceb81723bad6e997cebc49e6a4896 Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 17 Jan 2025 14:46:07 +0000 Subject: [PATCH 037/128] doc --- include/cglm/noise.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index 6954817..ad47535 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -3,6 +3,14 @@ * * MIT License (MIT), http://opensource.org/licenses/MIT * Full license can be found in the LICENSE file + * + * Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": + * https://github.com/stegu/webgl-noise + * Following Stefan Gustavson's paper "Simplex noise demystified": + * http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf + * + * Implementation based on glm::glc::noise.hpp: + * https://github.com/g-truc/glm/blob/master/glm/gtc/noise.inl */ #ifndef cglm_noise_h From fbdc46b2050c028968abc17e60247ad4416dec95 Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 17 Jan 2025 14:48:21 +0000 Subject: [PATCH 038/128] more doc --- include/cglm/noise.h | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index ad47535..9478fd5 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -23,7 +23,7 @@ #include "vec2-ext.h" ////////////////////////////// - +// Proposed vec4_ext functions /*! * @brief floor each element of v, result is written to dest @@ -105,15 +105,7 @@ _glm_vec4_muls(vec4 x, float y, vec4 dest) { ////////////////////////////// - - - -// Based on glm::detail::mod289 -// template -// GLM_FUNC_QUALIFIER T mod289(T const& x) -// { -// return x - floor(x * (static_cast(1.0) / static_cast(289.0))) * static_cast(289.0); -// } +// GLM noise detail functions CGLM_INLINE float @@ -121,12 +113,6 @@ _glm_noiseDetail_mod289(float x) { return x - floorf(x * (1.0f / 289.0f)) * 289.0f; } -// Based on glm::detail::permute -// template -// GLM_FUNC_QUALIFIER vec<4, T, Q> permute(vec<4, T, Q> const& x) -// { -// return mod289(((x * static_cast(34)) + static_cast(1)) * x); -// } CGLM_INLINE void _glm_noiseDetail_permute(vec4 x, vec4 dest) { @@ -136,13 +122,6 @@ _glm_noiseDetail_permute(vec4 x, vec4 dest) { dest[3] = _glm_noiseDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); } - -// template -// GLM_FUNC_QUALIFIER vec<4, T, Q> fade(vec<4, T, Q> const& t) -// { -// return (t * t * t) * (t * (t * static_cast(6) - static_cast(15)) + static_cast(10)); -// } - CGLM_INLINE void _glm_noiseDetail_fade(vec4 t, vec4 dest) { @@ -258,6 +237,10 @@ _glm_noiseDetail_xy2g( glm_vec4_sub(gy, temp, gy); // gy -= temp } + +////////////////////////////// +// Perlin noise + /*! * @brief Classic perlin noise * From 5f241a2daf2d42816c75253e8167bb3192f2b362 Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 17 Jan 2025 15:46:30 +0000 Subject: [PATCH 039/128] glm_perlin_vec3 impl --- include/cglm/noise.h | 322 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 306 insertions(+), 16 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index 9478fd5..f414a3c 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -19,6 +19,9 @@ #include "vec4.h" #include "vec4-ext.h" +#include "vec3.h" +#include "vec3-ext.h" + #include "vec2.h" #include "vec2-ext.h" @@ -40,6 +43,20 @@ _glm_vec4_floor(vec4 x, vec4 dest) { dest[3] = floorf(x[3]); } +/*! + * @brief floor each element of v, result is written to dest + * + * @param[in] v vector + * @param[out] dest destination vector + */ +CGLM_INLINE +void +_glm_vec3_floor(vec3 x, vec3 dest) { + dest[0] = floorf(x[0]); + dest[1] = floorf(x[1]); + dest[2] = floorf(x[2]); +} + /*! * @brief mod v by a scalar, result is written to dest (dest = v % s) * @@ -56,6 +73,22 @@ _glm_vec4_mods(vec4 x, float y, vec4 dest) { dest[3] = fmodf(x[3], y); } +/*! + * @brief mod v by a scalar, result is written to dest (dest = v % s) + * + * @param[in] v vector + * @param[in] s scalar + * @param[out] dest destination vector + */ +CGLM_INLINE +void +_glm_vec3_mods(vec3 x, float y, vec3 dest) { + dest[0] = fmodf(x[0], y); + dest[1] = fmodf(x[1], y); + dest[2] = fmodf(x[2], y); +} + + /*! * @brief threshold function with scalar * @@ -72,6 +105,21 @@ _glm_vec4_steps(vec4 edge, float x, vec4 dest) { dest[3] = glm_step(edge[3], x); } +/*! + * @brief threshold function with scalar + * + * @param[in] edge threshold + * @param[in] x value to test against threshold + * @param[out] dest destination + */ +CGLM_INLINE +void +_glm_vec3_steps(vec3 edge, float x, vec3 dest) { + dest[0] = glm_step(edge[0], x); + dest[1] = glm_step(edge[1], x); + dest[2] = glm_step(edge[2], x); +} + /*! * @brief set all elements of dest to value * @@ -87,6 +135,20 @@ _glm_vec4_sets(vec4 v, float x) { v[3] = x; } +/*! + * @brief set all elements of dest to value + * + * @param[in] vector threshold + * @param[in] x value + */ +CGLM_INLINE +void +_glm_vec3_sets(vec3 v, float x) { + v[0] = x; + v[1] = x; + v[2] = x; +} + /*! * @brief mul v by a scalar, result is written to dest (dest = v * s) * @@ -103,6 +165,21 @@ _glm_vec4_muls(vec4 x, float y, vec4 dest) { dest[3] = x[3] * y; } +/*! + * @brief mul v by a scalar, result is written to dest (dest = v * s) + * + * @param[in] v vector + * @param[in] s scalar + * @param[out] dest destination vector + */ +CGLM_INLINE +void +_glm_vec3_muls(vec3 x, float y, vec3 dest) { + dest[0] = x[0] * y; + dest[1] = x[1] * y; + dest[2] = x[2] * y; +} + ////////////////////////////// // GLM noise detail functions @@ -124,13 +201,21 @@ _glm_noiseDetail_permute(vec4 x, vec4 dest) { CGLM_INLINE void -_glm_noiseDetail_fade(vec4 t, vec4 dest) { +_glm_noiseDetail_fade_vec4(vec4 t, vec4 dest) { dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); dest[3] = (t[3] * t[3] * t[3]) * (t[3] * (t[3] * 6.0f - 15.0f) + 10.0f); } +CGLM_INLINE +void +_glm_noiseDetail_fade_vec3(vec3 t, vec3 dest) { + dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); + dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); + dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); +} + CGLM_INLINE void _glm_noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) { @@ -141,7 +226,7 @@ _glm_noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) { } /*! - * @brief Normalize gradients inplace + * @brief Normalize 4D gradients inplace * * @param[in, out] g00__ gradient from point 00 * @param[in, out] g01__ gradient from point 01 @@ -150,7 +235,7 @@ _glm_noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) { */ CGLM_INLINE void -_glm_noiseDetail_gradNorm(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) { +_glm_noiseDetail_gradNorm_vec4(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) { // norm = taylorInvSqrt(vec4( // dot(g00__, g00__), @@ -171,9 +256,42 @@ _glm_noiseDetail_gradNorm(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) { _glm_vec4_muls(g11__, norm[3], g11__); // g11__ *= norm.w } + +/*! + * @brief Normalize 3D gradients inplace + * + * @param[in, out] g00__ gradient from point 00 + * @param[in, out] g01__ gradient from point 01 + * @param[in, out] g10__ gradient from point 10 + * @param[in, out] g11__ gradient from point 11 + */ CGLM_INLINE void -_glm_noiseDetail_xy2g( +_glm_noiseDetail_gradNorm_vec3(vec3 g00_, vec3 g01_, vec3 g10_, vec3 g11_) { + + // norm = taylorInvSqrt(vec4( + // dot(g00_, g00_), + // dot(g01_, g01_), + // dot(g10_, g10_), + // dot(g11_, g11_) + // )); + vec4 norm; + norm[0] = glm_vec3_dot(g00_, g00_); // norm.x = dot(g00_, g00_) + norm[1] = glm_vec3_dot(g01_, g01_); // norm.y = dot(g01_, g01_) + norm[2] = glm_vec3_dot(g10_, g10_); // norm.z = dot(g10_, g10_) + norm[3] = glm_vec3_dot(g11_, g11_); // norm.w = dot(g11_, g11_) + _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) + + _glm_vec3_muls(g00_, norm[0], g00_); // g00_ *= norm.x + _glm_vec3_muls(g01_, norm[1], g01_); // g01_ *= norm.y + _glm_vec3_muls(g10_, norm[2], g10_); // g10_ *= norm.z + _glm_vec3_muls(g11_, norm[3], g11_); // g11_ *= norm.w +} + + +CGLM_INLINE +void +_glm_noiseDetail_xy2gxyzw( vec4 ixy, /* out */ vec4 gx, @@ -205,11 +323,9 @@ _glm_noiseDetail_xy2g( glm_vec4_subs(gz, 0.5f, gz); // gz -= 0.5f // abs(gx), abs(gy), abs(gz) - vec4 gxa; + vec4 gxa, gya, gza; glm_vec4_abs(gx, gxa); // gxa = abs(gx) - vec4 gya; glm_vec4_abs(gy, gya); // gya = abs(gy) - vec4 gza; glm_vec4_abs(gz, gza); // gza = abs(gz) // gw = 0.75 - abs(gx) - abs(gy) - abs(gz) @@ -238,6 +354,59 @@ _glm_noiseDetail_xy2g( } +CGLM_INLINE +void +_glm_noiseDetail_xy2gxyz( + vec4 ixy, + /* out */ + vec4 gx, + vec4 gy, + vec4 gz +) { + // gx = ixy / 7.0 + glm_vec4_divs(ixy, 7.0f, gx); // gx = ixy / 7.0 + + // gy = fract(floor(gx0) / 7.0)) - 0.5; + _glm_vec4_floor(gx, gy); // gy = floor(gx) + glm_vec4_divs(gy, 7.0f, gy); // gy /= 7.0 + glm_vec4_fract(gy, gy); // gy = fract(gy) + glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5f + + // gx = fract(gx); + glm_vec4_fract(gx, gx); // gx = fract(gx) + + // abs(gx), abs(gy) + vec4 gxa, gya; + glm_vec4_abs(gx, gxa); // gxa = abs(gx) + glm_vec4_abs(gy, gya); // gya = abs(gy) + + + // gz = vec4(0.5) - abs(gx0) - abs(gy0); + _glm_vec4_sets(gz, 0.5f); // gz = 0.5 + glm_vec4_sub(gz, gxa, gz); // gz -= gxa + glm_vec4_sub(gz, gya, gz); // gz -= gya + + + // sz = step(gw, 0.0); + vec4 sz; + _glm_vec4_steps(gz, 0.0f, sz); // sz = step(gz, 0.0) + + // gx0 -= sz0 * (step(0.0, gx0) - T(0.5)); + vec4 temp = {0.0f}; // temp = 0.0 + glm_vec4_step(temp, gx, temp); // temp = step(temp, gx) + glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 + glm_vec4_mul(sz, temp, temp); // temp *= sz + glm_vec4_sub(gx, temp, gx); // gx -= temp + + // gy0 -= sz0 * (step(0.0, gy0) - T(0.5)); + glm_vec4_zero(temp); // reset temp + glm_vec4_step(temp, gy, temp); // temp = step(temp, gy) + glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 + glm_vec4_mul(sz, temp, temp); // temp *= sz + glm_vec4_sub(gy, temp, gy); // gy -= temp +} + + ////////////////////////////// // Perlin noise @@ -315,16 +484,16 @@ glm_perlin_vec4(vec4 point) { // ------------ vec4 gx00, gy00, gz00, gw00; - _glm_noiseDetail_xy2g(ixy00, gx00, gy00, gz00, gw00); + _glm_noiseDetail_xy2gxyzw(ixy00, gx00, gy00, gz00, gw00); vec4 gx01, gy01, gz01, gw01; - _glm_noiseDetail_xy2g(ixy01, gx01, gy01, gz01, gw01); + _glm_noiseDetail_xy2gxyzw(ixy01, gx01, gy01, gz01, gw01); vec4 gx10, gy10, gz10, gw10; - _glm_noiseDetail_xy2g(ixy10, gx10, gy10, gz10, gw10); + _glm_noiseDetail_xy2gxyzw(ixy10, gx10, gy10, gz10, gw10); vec4 gx11, gy11, gz11, gw11; - _glm_noiseDetail_xy2g(ixy11, gx11, gy11, gz11, gw11); + _glm_noiseDetail_xy2gxyzw(ixy11, gx11, gy11, gz11, gw11); // ------------ @@ -348,10 +517,10 @@ glm_perlin_vec4(vec4 point) { vec4 g1011 = {gx11[1], gy11[1], gz11[1], gw11[1]}; // g1011 = vec4(gx11.y, gy11.y, gz11.y, gw11.y); vec4 g1111 = {gx11[3], gy11[3], gz11[3], gw11[3]}; // g1111 = vec4(gx11.w, gy11.w, gz11.w, gw11.w); - _glm_noiseDetail_gradNorm(g0000, g0100, g1000, g1100); - _glm_noiseDetail_gradNorm(g0001, g0101, g1001, g1101); - _glm_noiseDetail_gradNorm(g0010, g0110, g1010, g1110); - _glm_noiseDetail_gradNorm(g0011, g0111, g1011, g1111); + _glm_noiseDetail_gradNorm_vec4(g0000, g0100, g1000, g1100); + _glm_noiseDetail_gradNorm_vec4(g0001, g0101, g1001, g1101); + _glm_noiseDetail_gradNorm_vec4(g0010, g0110, g1010, g1110); + _glm_noiseDetail_gradNorm_vec4(g0011, g0111, g1011, g1111); // ------------ @@ -418,7 +587,7 @@ glm_perlin_vec4(vec4 point) { // ------------ vec4 fade_xyzw; - _glm_noiseDetail_fade(Pf0, fade_xyzw); // fade_xyzw = fade(Pf0) + _glm_noiseDetail_fade_vec4(Pf0, fade_xyzw); // fade_xyzw = fade(Pf0) // n_0w = lerp(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w) vec4 n_0w1 = {n0000, n1000, n0100, n1100}; @@ -449,4 +618,125 @@ glm_perlin_vec4(vec4 point) { } +CGLM_INLINE +float +glm_perlin_vec3(vec3 point) { + // Integer part of p for indexing + vec3 Pi0; + _glm_vec3_floor(point, Pi0); // Pi0 = floor(point); + + // Integer part + 1 + vec3 Pi1; + glm_vec3_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; + + _glm_vec3_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); + _glm_vec3_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); + + // Fractional part of p for interpolation + vec3 Pf0; + glm_vec3_fract(point, Pf0); + + // Fractional part - 1.0 + vec3 Pf1; + glm_vec3_subs(Pf0, 1.0f, Pf1); + + vec4 ix = {Pi0[0], Pi1[0], Pi0[0], Pi1[0]}; + vec4 iy = {Pi0[1], Pi0[1], Pi1[1], Pi1[1]}; + vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; // iz0 = vec4(Pi0.z); + vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; // iz1 = vec4(Pi1.z); + + // ixy = permute(permute(ix) + iy) + vec4 ixy; + _glm_noiseDetail_permute(ix, ixy); // ixy = permute(ix) + glm_vec4_add(ixy, iy, ixy); // ixy += iy; + _glm_noiseDetail_permute(ixy, ixy); // ixy = permute(ixy) + + // ixy0 = permute(ixy + iz0) + vec4 ixy0; + glm_vec4_add(ixy, iz0, ixy0); // ixy0 = ixy + iz0 + _glm_noiseDetail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) + + // ixy1 = permute(ixy + iz1) + vec4 ixy1; + glm_vec4_add(ixy, iz1, ixy1); // ixy1 = ixy, iz1 + _glm_noiseDetail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) + + // ------------ + + vec4 gx0, gy0, gz0; + _glm_noiseDetail_xy2gxyz(ixy0, gx0, gy0, gz0); + + vec4 gx1, gy1, gz1; + _glm_noiseDetail_xy2gxyz(ixy1, gx1, gy1, gz1); + + // ------------ + + vec3 g000 = {gx0[0], gy0[0], gz0[0]}; // g000 = vec3(gx0.x, gy0.x, gz0.x); + vec3 g100 = {gx0[1], gy0[1], gz0[1]}; // g100 = vec3(gx0.y, gy0.y, gz0.y); + vec3 g010 = {gx0[2], gy0[2], gz0[2]}; // g010 = vec3(gx0.z, gy0.z, gz0.z); + vec3 g110 = {gx0[3], gy0[3], gz0[3]}; // g110 = vec3(gx0.w, gy0.w, gz0.w); + + vec3 g001 = {gx1[0], gy1[0], gz1[0]}; // g001 = vec3(gx1.x, gy1.x, gz1.x); + vec3 g101 = {gx1[1], gy1[1], gz1[1]}; // g101 = vec3(gx1.y, gy1.y, gz1.y); + vec3 g011 = {gx1[2], gy1[2], gz1[2]}; // g011 = vec3(gx1.z, gy1.z, gz1.z); + vec3 g111 = {gx1[3], gy1[3], gz1[3]}; // g111 = vec3(gx1.w, gy1.w, gz1.w); + + _glm_noiseDetail_gradNorm_vec3(g000, g100, g010, g110); + _glm_noiseDetail_gradNorm_vec3(g001, g101, g011, g111); + + // ------------ + + float n000 = glm_vec3_dot(g000, Pf0); // n000 = dot(g000, Pf0) + + // n100 = dot(g100, vec3(Pf1.x, Pf0.y, Pf0.z)) + vec3 n100d = {Pf1[0], Pf0[1], Pf0[2]}; + float n100 = glm_vec3_dot(g100, n100d); + + // n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z)) + vec3 n010d = {Pf0[0], Pf1[1], Pf0[2]}; + float n010 = glm_vec3_dot(g010, n010d); + + // n110 = dot(g110, vec3(Pf1.x, Pf1.y, Pf0.z)) + vec3 n110d = {Pf1[0], Pf1[1], Pf0[2]}; + float n110 = glm_vec3_dot(g110, n110d); + + // n001 = dot(g001, vec3(Pf0.x, Pf0.y, Pf1.z)) + vec3 n001d = {Pf0[0], Pf0[1], Pf1[2]}; + float n001 = glm_vec3_dot(g001, n001d); + + // n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z)) + vec3 n101d = {Pf1[0], Pf0[1], Pf1[2]}; + float n101 = glm_vec3_dot(g101, n101d); + + // n011 = dot(g011, vec3(Pf0.x, Pf1.y, Pf1.z)) + vec3 n011d = {Pf0[0], Pf1[1], Pf1[2]}; + float n011 = glm_vec3_dot(g011, n011d); + + float n111 = glm_vec3_dot(g111, Pf1); // n111 = dot(g111, Pf1) + + // ------------ + + vec3 fade_xyz; + _glm_noiseDetail_fade_vec3(Pf0, fade_xyz); // fade_xyz = fade(Pf0) + + // n_z = lerp(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); + vec4 n_z; + vec4 n_z1 = {n000, n100, n010, n110}; + vec4 n_z2 = {n001, n101, n011, n111}; + glm_vec4_lerp(n_z1, n_z2, fade_xyz[2], n_z); + + // vec2 n_yz = lerp(vec2(n_z.x, n_z.y), vec2(n_z.z, n_z.w), fade_xyz.y); + vec2 n_yz; + vec2 n_yz1 = {n_z[0], n_z[1]}; + vec2 n_yz2 = {n_z[2], n_z[3]}; + glm_vec2_lerp(n_yz1, n_yz2, fade_xyz[1], n_yz); + + // n_xyz = lerp(n_yz.x, n_yz.y, fade_xyz.x); + float n_xyz = glm_lerp(n_yz[0], n_yz[1], fade_xyz[0]); + + return n_xyz * 2.2f; +} + + + #endif /* cglm_noise_h */ From 585a999d7954d72100aa647ef1a06c904883b413 Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 17 Jan 2025 15:47:17 +0000 Subject: [PATCH 040/128] docs --- include/cglm/noise.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index f414a3c..f6c2bfd 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -618,6 +618,12 @@ glm_perlin_vec4(vec4 point) { } +/*! + * @brief Classic perlin noise + * + * @param[in] point 3D vector + * @returns perlin noise value + */ CGLM_INLINE float glm_perlin_vec3(vec3 point) { From f0529646b217b4f87c602a536fdd1812ee1f4a05 Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 17 Jan 2025 16:30:36 +0000 Subject: [PATCH 041/128] glm_perlin_vec3 boilerplate --- include/cglm/call/noise.h | 4 ++++ include/cglm/struct/noise.h | 12 ++++++++++++ src/noise.c | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/include/cglm/call/noise.h b/include/cglm/call/noise.h index de1c673..bf2e788 100644 --- a/include/cglm/call/noise.h +++ b/include/cglm/call/noise.h @@ -17,6 +17,10 @@ CGLM_EXPORT float glmc_perlin_vec4(vec4 point); +CGLM_EXPORT +float +glmc_perlin_vec3(vec3 point); + #ifdef __cplusplus } #endif diff --git a/include/cglm/struct/noise.h b/include/cglm/struct/noise.h index a6798c6..4b856f0 100644 --- a/include/cglm/struct/noise.h +++ b/include/cglm/struct/noise.h @@ -30,4 +30,16 @@ glms_perlin_vec4(vec4s point) { return glm_perlin_vec4(point.raw); } +/*! + * @brief Classic perlin noise + * + * @param[in] point 3D vector + * @returns perlin noise value + */ +CGLM_INLINE +float +glms_perlin_vec3(vec3s point) { + return glm_perlin_vec3(point.raw); +} + #endif /* cglms_noises_h */ diff --git a/src/noise.c b/src/noise.c index 0fff5f9..8be4738 100644 --- a/src/noise.c +++ b/src/noise.c @@ -13,3 +13,9 @@ float glmc_perlin_vec4(vec4 p) { return glm_perlin_vec4(p); } + +CGLM_EXPORT +float +glmc_perlin_vec3(vec3 p) { + return glm_perlin_vec3(p); +} \ No newline at end of file From 98ab6fcbe0c4b26fd18af8f650c9f5b10dde473a Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 17 Jan 2025 16:31:03 +0000 Subject: [PATCH 042/128] glm_perlin_vec3 test --- test/src/test_noise.h | 35 +++++++++++++++++++++++++++++++++++ test/tests.h | 4 ++++ 2 files changed, 39 insertions(+) diff --git a/test/src/test_noise.h b/test/src/test_noise.h index 62aecb9..8c4bb0d 100644 --- a/test/src/test_noise.h +++ b/test/src/test_noise.h @@ -41,3 +41,38 @@ TEST_IMPL(GLM_PREFIX, perlin_vec4) { TEST_SUCCESS } + +TEST_IMPL(GLM_PREFIX, perlin_vec3) { + vec3 p1[] = { + {0.1f, 0.2f, 0.3f}, + {0.2f, 0.3f, 0.4f}, + {0.3f, 0.4f, 0.5f}, + {0.4f, 0.5f, 0.6f}, + {0.5f, 0.6f, 0.7f}, + {0.6f, 0.7f, 0.8f}, + {0.7f, 0.8f, 0.9f}, + {0.8f, 0.9f, 1.0f}, + {0.9f, 1.0f, 1.1f}, + {1.0f, 1.1f, 1.2f}, + }; + + // expected values calculated by glm::perlin + float e[] = { + -0.2909241318702698f, + -0.4667602181434631f, + -0.4679279625415802f, + -0.2616460621356964f, + 0.0562822706997395f, + 0.3178773224353790f, + 0.3981811404228210f, + 0.3011017739772797f, + 0.1263920217752457f, + -0.0602480024099350f + }; + + for (int i = 0; i < 10; i++) { + ASSERT(test_eq(GLM(perlin_vec3)(p1[i]), e[i])); + } + + TEST_SUCCESS +} diff --git a/test/tests.h b/test/tests.h index 6980d49..841dbd3 100644 --- a/test/tests.h +++ b/test/tests.h @@ -359,6 +359,8 @@ TEST_DECLARE(glmc_plane_normalize) /* noise */ TEST_DECLARE(glm_perlin_vec4) TEST_DECLARE(glmc_perlin_vec4) +TEST_DECLARE(glm_perlin_vec3) +TEST_DECLARE(glmc_perlin_vec3) /* utils */ TEST_DECLARE(clamp) @@ -1541,6 +1543,8 @@ TEST_LIST { /* noise */ TEST_ENTRY(glm_perlin_vec4) TEST_ENTRY(glmc_perlin_vec4) + TEST_ENTRY(glm_perlin_vec3) + TEST_ENTRY(glmc_perlin_vec3) /* utils */ TEST_ENTRY(clamp) From ae82a493f7346a31136dd0cc1e0439dc2ffd06e6 Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 17 Jan 2025 16:37:10 +0000 Subject: [PATCH 043/128] note --- include/cglm/noise.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index f6c2bfd..4634417 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -363,6 +363,10 @@ _glm_noiseDetail_xy2gxyz( vec4 gy, vec4 gz ) { + // NOTE: This function is not *quite* analogous to _glm_noiseDetail_xy2gxyzw + // to try to match the output of glm::perlin. I think it might be a bug in + // in the original implementation, but for now I'm keeping it consistent. -MK + // gx = ixy / 7.0 glm_vec4_divs(ixy, 7.0f, gx); // gx = ixy / 7.0 @@ -379,7 +383,6 @@ _glm_noiseDetail_xy2gxyz( vec4 gxa, gya; glm_vec4_abs(gx, gxa); // gxa = abs(gx) glm_vec4_abs(gy, gya); // gya = abs(gy) - // gz = vec4(0.5) - abs(gx0) - abs(gy0); _glm_vec4_sets(gz, 0.5f); // gz = 0.5 From 83b67baa239f9dfbbd884166911b97558788ed81 Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 17 Jan 2025 16:39:53 +0000 Subject: [PATCH 044/128] glm_perlin_vec3 docs --- docs/source/noise.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/source/noise.rst b/docs/source/noise.rst index 8680fe0..c7ec198 100644 --- a/docs/source/noise.rst +++ b/docs/source/noise.rst @@ -13,6 +13,7 @@ Table of contents (click to go): Functions: 1. :c:func:`glm_perlin_vec4` +#. :c:func:`glm_perlin_vec3` Functions documentation @@ -27,3 +28,14 @@ Functions documentation Returns: | noise value + + +.. c:function:: float glm_perlin_vec3(vec3 point) + + | Classic Perlin noise + + Parameters: + | *[in]* **point** 3D point + + Returns: + | noise value From a98c270eee98b0ee6d2acd6c95b6488f94b63cf5 Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 17 Jan 2025 17:24:01 +0000 Subject: [PATCH 045/128] glm_perlin_vec2 impl --- include/cglm/noise.h | 191 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 178 insertions(+), 13 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index 4634417..19f9da4 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -216,6 +216,13 @@ _glm_noiseDetail_fade_vec3(vec3 t, vec3 dest) { dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); } +CGLM_INLINE +void +_glm_noiseDetail_fade_vec2(vec2 t, vec2 dest) { + dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); + dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); +} + CGLM_INLINE void _glm_noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) { @@ -260,10 +267,10 @@ _glm_noiseDetail_gradNorm_vec4(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) { /*! * @brief Normalize 3D gradients inplace * - * @param[in, out] g00__ gradient from point 00 - * @param[in, out] g01__ gradient from point 01 - * @param[in, out] g10__ gradient from point 10 - * @param[in, out] g11__ gradient from point 11 + * @param[in, out] g00_ gradient from point 00 + * @param[in, out] g01_ gradient from point 01 + * @param[in, out] g10_ gradient from point 10 + * @param[in, out] g11_ gradient from point 11 */ CGLM_INLINE void @@ -288,10 +295,41 @@ _glm_noiseDetail_gradNorm_vec3(vec3 g00_, vec3 g01_, vec3 g10_, vec3 g11_) { _glm_vec3_muls(g11_, norm[3], g11_); // g11_ *= norm.w } +/*! + * @brief Normalize 2D gradients inplace + * + * @param[in, out] g00 gradient from point 00 + * @param[in, out] g01 gradient from point 01 + * @param[in, out] g10 gradient from point 10 + * @param[in, out] g11 gradient from point 11 + */ +CGLM_INLINE +void +_glm_noiseDetail_gradNorm_vec2(vec3 g00, vec3 g01, vec3 g10, vec3 g11) { + + // norm = taylorInvSqrt(vec4( + // dot(g00, g00), + // dot(g01, g01), + // dot(g10, g10), + // dot(g11, g11) + // )); + vec4 norm; + norm[0] = glm_vec2_dot(g00, g00); // norm.x = dot(g00, g00) + norm[1] = glm_vec2_dot(g01, g01); // norm.y = dot(g01, g01) + norm[2] = glm_vec2_dot(g10, g10); // norm.z = dot(g10, g10) + norm[3] = glm_vec2_dot(g11, g11); // norm.w = dot(g11, g11) + _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) + + _glm_vec3_muls(g00, norm[0], g00); // g00 *= norm.x + _glm_vec3_muls(g01, norm[1], g01); // g01 *= norm.y + _glm_vec3_muls(g10, norm[2], g10); // g10 *= norm.z + _glm_vec3_muls(g11, norm[3], g11); // g11 *= norm.w +} + CGLM_INLINE void -_glm_noiseDetail_xy2gxyzw( +_glm_noiseDetail_i2gxyzw( vec4 ixy, /* out */ vec4 gx, @@ -356,14 +394,14 @@ _glm_noiseDetail_xy2gxyzw( CGLM_INLINE void -_glm_noiseDetail_xy2gxyz( +_glm_noiseDetail_i2gxyz( vec4 ixy, /* out */ vec4 gx, vec4 gy, vec4 gz ) { - // NOTE: This function is not *quite* analogous to _glm_noiseDetail_xy2gxyzw + // NOTE: This function is not *quite* analogous to _glm_noiseDetail_i2gxyzw // to try to match the output of glm::perlin. I think it might be a bug in // in the original implementation, but for now I'm keeping it consistent. -MK @@ -409,6 +447,39 @@ _glm_noiseDetail_xy2gxyz( glm_vec4_sub(gy, temp, gy); // gy -= temp } +CGLM_INLINE +void +_glm_noiseDetail_i2gxy( + vec4 i, + /* out */ + vec4 gx, + vec4 gy +) { + // vec<4, T, Q> gx = static_cast(2) * glm::fract(i / T(41)) - T(1); + // vec<4, T, Q> gy = glm::abs(gx) - T(0.5); + // vec<4, T, Q> tx = glm::floor(gx + T(0.5)); + // gx = gx - tx; + + + // gx = 2.0 * fract(i / 41.0) - 1.0; + glm_vec4_divs(i, 41.0f, gx); // gx = i / 41.0 + glm_vec4_fract(gx, gx); // gx = fract(gx) + _glm_vec4_muls(gx, 2.0f, gx); // gx *= 2.0 + glm_vec4_subs(gx, 1.0f, gx); // gx -= 1.0 + + // gy = abs(gx) - 0.5; + glm_vec4_abs(gx, gy); // gy = abs(gx) + glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5 + + // tx = floor(gx + 0.5); + vec4 tx; + glm_vec4_adds(gx, 0.5f, tx); // tx = gx + 0.5 + _glm_vec4_floor(tx, tx); // tx = floor(tx) + + // gx = gx - tx; + glm_vec4_sub(gx, tx, gx); // gx -= tx +} + ////////////////////////////// // Perlin noise @@ -448,6 +519,8 @@ glm_perlin_vec4(vec4 point) { vec4 iw0 = {Pi0[3], Pi0[3], Pi0[3], Pi0[3]}; // iw0 = vec4(Pi0.w); vec4 iw1 = {Pi1[3], Pi1[3], Pi1[3], Pi1[3]}; // iw1 = vec4(Pi1.w); + // ------------ + // ixy = permute(permute(ix) + iy) vec4 ixy; _glm_noiseDetail_permute(ix, ixy); // ixy = permute(ix) @@ -487,16 +560,16 @@ glm_perlin_vec4(vec4 point) { // ------------ vec4 gx00, gy00, gz00, gw00; - _glm_noiseDetail_xy2gxyzw(ixy00, gx00, gy00, gz00, gw00); + _glm_noiseDetail_i2gxyzw(ixy00, gx00, gy00, gz00, gw00); vec4 gx01, gy01, gz01, gw01; - _glm_noiseDetail_xy2gxyzw(ixy01, gx01, gy01, gz01, gw01); + _glm_noiseDetail_i2gxyzw(ixy01, gx01, gy01, gz01, gw01); vec4 gx10, gy10, gz10, gw10; - _glm_noiseDetail_xy2gxyzw(ixy10, gx10, gy10, gz10, gw10); + _glm_noiseDetail_i2gxyzw(ixy10, gx10, gy10, gz10, gw10); vec4 gx11, gy11, gz11, gw11; - _glm_noiseDetail_xy2gxyzw(ixy11, gx11, gy11, gz11, gw11); + _glm_noiseDetail_i2gxyzw(ixy11, gx11, gy11, gz11, gw11); // ------------ @@ -654,6 +727,8 @@ glm_perlin_vec3(vec3 point) { vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; // iz0 = vec4(Pi0.z); vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; // iz1 = vec4(Pi1.z); + // ------------ + // ixy = permute(permute(ix) + iy) vec4 ixy; _glm_noiseDetail_permute(ix, ixy); // ixy = permute(ix) @@ -673,10 +748,10 @@ glm_perlin_vec3(vec3 point) { // ------------ vec4 gx0, gy0, gz0; - _glm_noiseDetail_xy2gxyz(ixy0, gx0, gy0, gz0); + _glm_noiseDetail_i2gxyz(ixy0, gx0, gy0, gz0); vec4 gx1, gy1, gz1; - _glm_noiseDetail_xy2gxyz(ixy1, gx1, gy1, gz1); + _glm_noiseDetail_i2gxyz(ixy1, gx1, gy1, gz1); // ------------ @@ -746,6 +821,96 @@ glm_perlin_vec3(vec3 point) { return n_xyz * 2.2f; } +/*! + * @brief Classic perlin noise + * + * @param[in] point 2D vector + * @returns perlin noise value + */ +CGLM_INLINE +float +glm_perlin_vec2(vec2 point) { + + // Integer part of p for indexing + // Pi = floor(vec4(point.x, point.y, point.x, point.y)) + vec4(0.0, 0.0, 1.0, 1.0); + vec4 Pi = {point[0], point[1], point[0], point[1]}; // Pi = vec4(point.x, point.y, point.x, point.y) + _glm_vec4_floor(Pi, Pi); // Pi = floor(Pi) + Pi[2] += 1.0f; // Pi.z += 1.0 + Pi[3] += 1.0f; // Pi.w += 1.0 + + // Fractional part of p for interpolation + // vec<4, T, Q> Pf = glm::fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + vec4 Pf = {point[0], point[1], point[0], point[1]}; // Pf = vec4(point.x, point.y, point.x, point.y) + glm_vec4_fract(Pf, Pf); // Pf = fract(Pf) + Pf[2] -= 1.0f; // Pf.z -= 1.0 + Pf[3] -= 1.0f; // Pf.w -= 1.0 + + // Mod to avoid truncation effects in permutation + _glm_vec4_mods(Pi, 289.0f, Pi); // Pi = mod(Pi, 289.0f); + + vec4 ix = {Pi[0], Pi[2], Pi[0], Pi[2]}; // ix = vec4(Pi.x, Pi.z, Pi.x, Pi.z) + vec4 iy = {Pi[1], Pi[1], Pi[3], Pi[3]}; // iy = vec4(Pi.y, Pi.y, Pi.w, Pi.w) + vec4 fx = {Pf[0], Pf[2], Pf[0], Pf[2]}; // fx = vec4(Pf.x, Pf.z, Pf.x, Pf.z) + vec4 fy = {Pf[1], Pf[1], Pf[3], Pf[3]}; // fy = vec4(Pf.y, Pf.y, Pf.w, Pf.w) + + // ------------ + + // i = permute(permute(ix) + iy); + vec4 i; + _glm_noiseDetail_permute(ix, i); // i = permute(ix) + glm_vec4_add(i, iy, i); // i += iy; + _glm_noiseDetail_permute(i, i); // i = permute(i) + + // ------------ + + vec4 gx, gy; + _glm_noiseDetail_i2gxy(i, gx, gy); + + // ------------ + + vec2 g00 = {gx[0], gy[0]}; // g00 = vec2(gx.x, gy.x) + vec2 g10 = {gx[1], gy[1]}; // g10 = vec2(gx.y, gy.y) + vec2 g01 = {gx[2], gy[2]}; // g01 = vec2(gx.z, gy.z) + vec2 g11 = {gx[3], gy[3]}; // g11 = vec2(gx.w, gy.w) + + _glm_noiseDetail_gradNorm_vec2(g00, g10, g01, g11); + + // ------------ + + // n00 = dot(g00, vec2(fx.x, fy.x)) + vec2 n00d = {fx[0], fy[0]}; // n00d = vec2(fx.x, fy.x) + float n00 = glm_vec2_dot(g00, n00d); // n00 = dot(g00, n00d) + + // n10 = dot(g10, vec2(fx.y, fy.y)) + vec2 n10d = {fx[1], fy[1]}; // n10d = vec2(fx.y, fy.y) + float n10 = glm_vec2_dot(g10, n10d); // n10 = dot(g10, n10d) + + // n01 = dot(g01, vec2(fx.z, fy.z)) + vec2 n01d = {fx[2], fy[2]}; // n01d = vec2(fx.z, fy.z) + float n01 = glm_vec2_dot(g01, n01d); // n01 = dot(g01, n01d) + + // n11 = dot(g11, vec2(fx.w, fy.w)) + vec2 n11d = {fx[3], fy[3]}; // n11d = vec2(fx.w, fy.w) + float n11 = glm_vec2_dot(g11, n11d); // n11 = dot(g11, n11d) + + // ------------ + + // fade_xyz = fade(vec2(Pf.x, Pf.y)) + vec2 fade_xy = {Pf[0], Pf[1]}; // fade_xy = vec2(Pf.x, Pf.y) + _glm_noiseDetail_fade_vec2(fade_xy, fade_xy); // fade_xy = fade(fade_xy) + + // n_x = lerp(vec2(n00, n01), vec2(n10, n11), fade_xy.x); + vec2 n_x; + vec2 n_x1 = {n00, n01}; // n_x1 = vec2(n00, n01) + vec2 n_x2 = {n10, n11}; // n_x2 = vec2(n10, n11) + glm_vec2_lerp(n_x1, n_x2, fade_xy[0], n_x); // n_x = lerp(n_x1, n_x2, fade_xy.x) + + // T n_xy = mix(n_x.x, n_x.y, fade_xy.y); + // n_xy = lerp(n_x.x, n_x.y, fade_xy.y); + float n_xy = glm_lerp(n_x[0], n_x[1], fade_xy[1]); + + return n_xy * 2.3f; +} #endif /* cglm_noise_h */ From 1377a94a17f4ade1b25e121c683e189da261401d Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 17 Jan 2025 20:20:04 +0000 Subject: [PATCH 046/128] glm_perlin_vec2 boilerplate --- include/cglm/call/noise.h | 4 ++++ include/cglm/struct/noise.h | 12 ++++++++++++ src/noise.c | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/include/cglm/call/noise.h b/include/cglm/call/noise.h index bf2e788..6020c89 100644 --- a/include/cglm/call/noise.h +++ b/include/cglm/call/noise.h @@ -21,6 +21,10 @@ CGLM_EXPORT float glmc_perlin_vec3(vec3 point); +CGLM_EXPORT +float +glmc_perlin_vec2(vec2 point); + #ifdef __cplusplus } #endif diff --git a/include/cglm/struct/noise.h b/include/cglm/struct/noise.h index 4b856f0..3fd7d2e 100644 --- a/include/cglm/struct/noise.h +++ b/include/cglm/struct/noise.h @@ -42,4 +42,16 @@ glms_perlin_vec3(vec3s point) { return glm_perlin_vec3(point.raw); } +/*! + * @brief Classic perlin noise + * + * @param[in] point 2D vector + * @returns perlin noise value + */ +CGLM_INLINE +float +glms_perlin_vec2(vec2s point) { + return glm_perlin_vec2(point.raw); +} + #endif /* cglms_noises_h */ diff --git a/src/noise.c b/src/noise.c index 8be4738..70a8f3c 100644 --- a/src/noise.c +++ b/src/noise.c @@ -18,4 +18,10 @@ CGLM_EXPORT float glmc_perlin_vec3(vec3 p) { return glm_perlin_vec3(p); +} + +CGLM_EXPORT +float +glmc_perlin_vec2(vec2 p) { + return glm_perlin_vec2(p); } \ No newline at end of file From 9085ed020af965507255313cd77c752614ed8b67 Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 17 Jan 2025 20:20:13 +0000 Subject: [PATCH 047/128] glm_perlin_vec2 test --- test/src/test_noise.h | 40 ++++++++++++++++++++++++++++++++++++++++ test/tests.h | 4 ++++ 2 files changed, 44 insertions(+) diff --git a/test/src/test_noise.h b/test/src/test_noise.h index 8c4bb0d..95024fe 100644 --- a/test/src/test_noise.h +++ b/test/src/test_noise.h @@ -76,3 +76,43 @@ TEST_IMPL(GLM_PREFIX, perlin_vec3) { TEST_SUCCESS } + + +TEST_IMPL(GLM_PREFIX, perlin_vec2) { + vec2 p1[] = { + {0.1f, 0.2f}, + {0.2f, 0.3f}, + {0.3f, 0.4f}, + {0.4f, 0.5f}, + {0.5f, 0.6f}, + {0.6f, 0.7f}, + {0.7f, 0.8f}, + {0.8f, 0.9f}, + {0.9f, 1.0f}, + {1.0f, 1.1f}, + }; + + // expected values calculated by glm::perlin + float e[] = { + 0.2841092348098755f, + 0.2328013032674789f, + -0.0017980185803026f, + -0.3300299644470215f, + -0.5998955368995667f, + -0.6914522647857666f, + -0.5896517634391785f, + -0.3778679668903351f, + -0.1557840555906296f, + 0.0453133136034012f + }; + + for (int i = 0; i < 10; i++) { + ASSERT(test_eq(GLM(perlin_vec2)(p1[i]), e[i])); + } + + TEST_SUCCESS +} + + + + diff --git a/test/tests.h b/test/tests.h index 841dbd3..3ad1d97 100644 --- a/test/tests.h +++ b/test/tests.h @@ -361,6 +361,8 @@ TEST_DECLARE(glm_perlin_vec4) TEST_DECLARE(glmc_perlin_vec4) TEST_DECLARE(glm_perlin_vec3) TEST_DECLARE(glmc_perlin_vec3) +TEST_DECLARE(glm_perlin_vec2) +TEST_DECLARE(glmc_perlin_vec2) /* utils */ TEST_DECLARE(clamp) @@ -1545,6 +1547,8 @@ TEST_LIST { TEST_ENTRY(glmc_perlin_vec4) TEST_ENTRY(glm_perlin_vec3) TEST_ENTRY(glmc_perlin_vec3) + TEST_ENTRY(glm_perlin_vec2) + TEST_ENTRY(glmc_perlin_vec2) /* utils */ TEST_ENTRY(clamp) From f1a72241b1ad694105d13cf58c8fc91674d5657c Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 17 Jan 2025 20:34:47 +0000 Subject: [PATCH 048/128] docs --- docs/source/noise.rst | 19 +++++++++++++++++++ include/cglm/noise.h | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/source/noise.rst b/docs/source/noise.rst index c7ec198..0976eee 100644 --- a/docs/source/noise.rst +++ b/docs/source/noise.rst @@ -7,6 +7,14 @@ Header: cglm/noise.h Classic Perlin noise implementation. +Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": +https://github.com/stegu/webgl-noise +Following Stefan Gustavson's paper "Simplex noise demystified": +http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf + +Implementation based on glm::perlin function: +https://github.com/g-truc/glm/blob/master/glm/gtc/noise.inl + Table of contents (click to go): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -14,6 +22,7 @@ Functions: 1. :c:func:`glm_perlin_vec4` #. :c:func:`glm_perlin_vec3` +#. :c:func:`glm_perlin_vec2` Functions documentation @@ -39,3 +48,13 @@ Functions documentation Returns: | noise value + +.. c:function:: float glm_perlin_vec2(vec2 point) + + | Classic Perlin noise + + Parameters: + | *[in]* **point** 2D point + + Returns: + | noise value diff --git a/include/cglm/noise.h b/include/cglm/noise.h index 19f9da4..a118eae 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -9,7 +9,7 @@ * Following Stefan Gustavson's paper "Simplex noise demystified": * http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf * - * Implementation based on glm::glc::noise.hpp: + * Implementation based on glm::perlin function: * https://github.com/g-truc/glm/blob/master/glm/gtc/noise.inl */ From 606ecbceaa630f91b364e9fee46acd7371783cb9 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:06:42 +0000 Subject: [PATCH 049/128] vac_muls -> vec_scale --- include/cglm/noise.h | 58 ++++++++++---------------------------------- 1 file changed, 13 insertions(+), 45 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index a118eae..edcae8e 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -149,38 +149,6 @@ _glm_vec3_sets(vec3 v, float x) { v[2] = x; } -/*! - * @brief mul v by a scalar, result is written to dest (dest = v * s) - * - * @param[in] v vector - * @param[in] s scalar - * @param[out] dest destination vector - */ -CGLM_INLINE -void -_glm_vec4_muls(vec4 x, float y, vec4 dest) { - dest[0] = x[0] * y; - dest[1] = x[1] * y; - dest[2] = x[2] * y; - dest[3] = x[3] * y; -} - -/*! - * @brief mul v by a scalar, result is written to dest (dest = v * s) - * - * @param[in] v vector - * @param[in] s scalar - * @param[out] dest destination vector - */ -CGLM_INLINE -void -_glm_vec3_muls(vec3 x, float y, vec3 dest) { - dest[0] = x[0] * y; - dest[1] = x[1] * y; - dest[2] = x[2] * y; -} - - ////////////////////////////// // GLM noise detail functions @@ -257,10 +225,10 @@ _glm_noiseDetail_gradNorm_vec4(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) { norm[3] = glm_vec4_dot(g11__, g11__); // norm.w = dot(g11__, g11__) _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) - _glm_vec4_muls(g00__, norm[0], g00__); // g00__ *= norm.x - _glm_vec4_muls(g01__, norm[1], g01__); // g01__ *= norm.y - _glm_vec4_muls(g10__, norm[2], g10__); // g10__ *= norm.z - _glm_vec4_muls(g11__, norm[3], g11__); // g11__ *= norm.w + glm_vec4_scale(g00__, norm[0], g00__); // g00__ *= norm.x + glm_vec4_scale(g01__, norm[1], g01__); // g01__ *= norm.y + glm_vec4_scale(g10__, norm[2], g10__); // g10__ *= norm.z + glm_vec4_scale(g11__, norm[3], g11__); // g11__ *= norm.w } @@ -289,10 +257,10 @@ _glm_noiseDetail_gradNorm_vec3(vec3 g00_, vec3 g01_, vec3 g10_, vec3 g11_) { norm[3] = glm_vec3_dot(g11_, g11_); // norm.w = dot(g11_, g11_) _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) - _glm_vec3_muls(g00_, norm[0], g00_); // g00_ *= norm.x - _glm_vec3_muls(g01_, norm[1], g01_); // g01_ *= norm.y - _glm_vec3_muls(g10_, norm[2], g10_); // g10_ *= norm.z - _glm_vec3_muls(g11_, norm[3], g11_); // g11_ *= norm.w + glm_vec3_scale(g00_, norm[0], g00_); // g00_ *= norm.x + glm_vec3_scale(g01_, norm[1], g01_); // g01_ *= norm.y + glm_vec3_scale(g10_, norm[2], g10_); // g10_ *= norm.z + glm_vec3_scale(g11_, norm[3], g11_); // g11_ *= norm.w } /*! @@ -320,10 +288,10 @@ _glm_noiseDetail_gradNorm_vec2(vec3 g00, vec3 g01, vec3 g10, vec3 g11) { norm[3] = glm_vec2_dot(g11, g11); // norm.w = dot(g11, g11) _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) - _glm_vec3_muls(g00, norm[0], g00); // g00 *= norm.x - _glm_vec3_muls(g01, norm[1], g01); // g01 *= norm.y - _glm_vec3_muls(g10, norm[2], g10); // g10 *= norm.z - _glm_vec3_muls(g11, norm[3], g11); // g11 *= norm.w + glm_vec3_scale(g00, norm[0], g00); // g00 *= norm.x + glm_vec3_scale(g01, norm[1], g01); // g01 *= norm.y + glm_vec3_scale(g10, norm[2], g10); // g10 *= norm.z + glm_vec3_scale(g11, norm[3], g11); // g11 *= norm.w } @@ -464,7 +432,7 @@ _glm_noiseDetail_i2gxy( // gx = 2.0 * fract(i / 41.0) - 1.0; glm_vec4_divs(i, 41.0f, gx); // gx = i / 41.0 glm_vec4_fract(gx, gx); // gx = fract(gx) - _glm_vec4_muls(gx, 2.0f, gx); // gx *= 2.0 + glm_vec4_scale(gx, 2.0f, gx); // gx *= 2.0 glm_vec4_subs(gx, 1.0f, gx); // gx -= 1.0 // gy = abs(gx) - 0.5; From 2acdd1e4d0bd6dadd10f5cc1408af5ff33c34a20 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:06:55 +0000 Subject: [PATCH 050/128] fix _glm_noiseDetail_gradNorm_vec2 --- include/cglm/noise.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index edcae8e..3c42e18 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -273,7 +273,7 @@ _glm_noiseDetail_gradNorm_vec3(vec3 g00_, vec3 g01_, vec3 g10_, vec3 g11_) { */ CGLM_INLINE void -_glm_noiseDetail_gradNorm_vec2(vec3 g00, vec3 g01, vec3 g10, vec3 g11) { +_glm_noiseDetail_gradNorm_vec2(vec2 g00, vec2 g01, vec2 g10, vec2 g11) { // norm = taylorInvSqrt(vec4( // dot(g00, g00), @@ -288,10 +288,10 @@ _glm_noiseDetail_gradNorm_vec2(vec3 g00, vec3 g01, vec3 g10, vec3 g11) { norm[3] = glm_vec2_dot(g11, g11); // norm.w = dot(g11, g11) _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) - glm_vec3_scale(g00, norm[0], g00); // g00 *= norm.x - glm_vec3_scale(g01, norm[1], g01); // g01 *= norm.y - glm_vec3_scale(g10, norm[2], g10); // g10 *= norm.z - glm_vec3_scale(g11, norm[3], g11); // g11 *= norm.w + glm_vec2_scale(g00, norm[0], g00); // g00 *= norm.x + glm_vec2_scale(g01, norm[1], g01); // g01 *= norm.y + glm_vec2_scale(g10, norm[2], g10); // g10 *= norm.z + glm_vec2_scale(g11, norm[3], g11); // g11 *= norm.w } From 1637d2cef130c073f70937879c8cd1fd3c5f4ec7 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:23:10 +0000 Subject: [PATCH 051/128] move vec3_floor to ext --- include/cglm/noise.h | 16 +--------------- include/cglm/vec3-ext.h | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index 3c42e18..4d35145 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -43,20 +43,6 @@ _glm_vec4_floor(vec4 x, vec4 dest) { dest[3] = floorf(x[3]); } -/*! - * @brief floor each element of v, result is written to dest - * - * @param[in] v vector - * @param[out] dest destination vector - */ -CGLM_INLINE -void -_glm_vec3_floor(vec3 x, vec3 dest) { - dest[0] = floorf(x[0]); - dest[1] = floorf(x[1]); - dest[2] = floorf(x[2]); -} - /*! * @brief mod v by a scalar, result is written to dest (dest = v % s) * @@ -673,7 +659,7 @@ float glm_perlin_vec3(vec3 point) { // Integer part of p for indexing vec3 Pi0; - _glm_vec3_floor(point, Pi0); // Pi0 = floor(point); + glm_vec3_floor(point, Pi0); // Pi0 = floor(point); // Integer part + 1 vec3 Pi1; diff --git a/include/cglm/vec3-ext.h b/include/cglm/vec3-ext.h index 808d32c..a1ce049 100644 --- a/include/cglm/vec3-ext.h +++ b/include/cglm/vec3-ext.h @@ -26,6 +26,7 @@ CGLM_INLINE void glm_vec3_sign(vec3 v, vec3 dest); CGLM_INLINE void glm_vec3_abs(vec3 v, vec3 dest); CGLM_INLINE void glm_vec3_fract(vec3 v, vec3 dest); + CGLM_INLINE void glm_vec3_floor(vec3 v, vec3 dest); CGLM_INLINE float glm_vec3_hadd(vec3 v); CGLM_INLINE void glm_vec3_sqrt(vec3 v, vec3 dest); */ @@ -250,6 +251,20 @@ glm_vec3_fract(vec3 v, vec3 dest) { dest[2] = fminf(v[2] - floorf(v[2]), 0.999999940395355224609375f); } +/*! + * @brief floor of each vector item + * + * @param[in] v vector + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec3_floor(vec3 x, vec3 dest) { + dest[0] = floorf(x[0]); + dest[1] = floorf(x[1]); + dest[2] = floorf(x[2]); +} + /*! * @brief vector reduction by summation * @warning could overflow From 967c9e0a09c649d1747585ee322946d5f5f266ba Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:23:50 +0000 Subject: [PATCH 052/128] vec3_floor boilerplate --- include/cglm/call/vec3.h | 6 +++++- include/cglm/struct/vec3-ext.h | 14 ++++++++++++++ src/vec3.c | 6 ++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index bb5a5d7..89a9e4e 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -321,7 +321,11 @@ glmc_vec3_abs(vec3 v, vec3 dest); CGLM_EXPORT void glmc_vec3_fract(vec3 v, vec3 dest); - + +CGLM_EXPORT +void +glmc_vec3_floor(vec3 v, vec3 dest); + CGLM_EXPORT float glmc_vec3_hadd(vec3 v); diff --git a/include/cglm/struct/vec3-ext.h b/include/cglm/struct/vec3-ext.h index 1a3e88a..212953f 100644 --- a/include/cglm/struct/vec3-ext.h +++ b/include/cglm/struct/vec3-ext.h @@ -230,6 +230,20 @@ glms_vec3_(fract)(vec3s v) { return r; } +/*! + * @brief floor of each vector item + * + * @param[in] v vector + * @return dest destination vector + */ +CGLM_INLINE +vec3s +glms_vec3_(floor)(vec3s v) { + vec3s r; + glm_vec3_floor(v.raw, r.raw); + return r; +} + /*! * @brief vector reduction by summation * @warning could overflow diff --git a/src/vec3.c b/src/vec3.c index c1316dc..8427236 100644 --- a/src/vec3.c +++ b/src/vec3.c @@ -442,6 +442,12 @@ glmc_vec3_fract(vec3 v, vec3 dest) { glm_vec3_fract(v, dest); } +CGLM_EXPORT +void +glmc_vec3_floor(vec3 v, vec3 dest) { + glm_vec3_floor(v, dest); +} + CGLM_EXPORT float glmc_vec3_hadd(vec3 v) { From e66f2f3df409f0ed702bbed9a17591a0762df65f Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:24:02 +0000 Subject: [PATCH 053/128] vec3_floor test --- test/src/test_vec3.h | 13 +++++++++++++ test/tests.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/test/src/test_vec3.h b/test/src/test_vec3.h index 5e9c387..b3fdb51 100644 --- a/test/src/test_vec3.h +++ b/test/src/test_vec3.h @@ -1826,6 +1826,19 @@ TEST_IMPL(GLM_PREFIX, vec3_fract) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, vec3_floor) { + vec3 v1 = {2.104f, 3.012f, 4.10f}, v2 = {12.35f, 31.140f, 43.502f}, v3, v4; + vec3 v5 = {2.0f, 3.0f, 4.0f}, v6 = {12.0f, 31.0f, 43.0f}; + + GLM(vec3_floor)(v1, v3); + GLM(vec3_floor)(v2, v4); + + ASSERTIFY(test_assert_vec3_eq(v3, v5)) + ASSERTIFY(test_assert_vec3_eq(v4, v6)) + + TEST_SUCCESS +} + TEST_IMPL(GLM_PREFIX, vec3_hadd) { vec3 v1 = {2.0f, 3.0f, 4.0f}, v2 = {12.0f, 31.0f, 43.0f}; float r1, r2, r3, r4; diff --git a/test/tests.h b/test/tests.h index 3ad1d97..cc99ffd 100644 --- a/test/tests.h +++ b/test/tests.h @@ -692,6 +692,7 @@ TEST_DECLARE(glm_vec3_isvalid) TEST_DECLARE(glm_vec3_sign) TEST_DECLARE(glm_vec3_abs) TEST_DECLARE(glm_vec3_fract) +TEST_DECLARE(glm_vec3_floor) TEST_DECLARE(glm_vec3_hadd) TEST_DECLARE(glm_vec3_sqrt) TEST_DECLARE(glm_vec3_make) @@ -1876,6 +1877,7 @@ TEST_LIST { TEST_ENTRY(glm_vec3_sign) TEST_ENTRY(glm_vec3_abs) TEST_ENTRY(glm_vec3_fract) + TEST_ENTRY(glm_vec3_floor) TEST_ENTRY(glm_vec3_hadd) TEST_ENTRY(glm_vec3_sqrt) TEST_ENTRY(glm_vec3_make) From 2ba561cc926e90ec798f7318c95930086b6bd4f7 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:24:32 +0000 Subject: [PATCH 054/128] move vec4_floor to ext --- include/cglm/noise.h | 27 ++++++--------------------- include/cglm/vec4-ext.h | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index 4d35145..cb5e45b 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -28,21 +28,6 @@ ////////////////////////////// // Proposed vec4_ext functions -/*! - * @brief floor each element of v, result is written to dest - * - * @param[in] v vector - * @param[out] dest destination vector - */ -CGLM_INLINE -void -_glm_vec4_floor(vec4 x, vec4 dest) { - dest[0] = floorf(x[0]); - dest[1] = floorf(x[1]); - dest[2] = floorf(x[2]); - dest[3] = floorf(x[3]); -} - /*! * @brief mod v by a scalar, result is written to dest (dest = v % s) * @@ -295,11 +280,11 @@ _glm_noiseDetail_i2gxyzw( glm_vec4_divs(ixy, 7.0f, gx); // gx = ixy / 7.0 // gy = fract(gx) / 7.0 - _glm_vec4_floor(gx, gy); // gy = floor(gx) + glm_vec4_floor(gx, gy); // gy = floor(gx) glm_vec4_divs(gy, 7.0f, gy); // gy /= 7.0 // gz = floor(gy) / 6.0 - _glm_vec4_floor(gy, gz); // gz = floor(gy) + glm_vec4_floor(gy, gz); // gz = floor(gy) glm_vec4_divs(gz, 6.0f, gz); // gz /= 6.0 // gx = fract(gx) - 0.5f @@ -363,7 +348,7 @@ _glm_noiseDetail_i2gxyz( glm_vec4_divs(ixy, 7.0f, gx); // gx = ixy / 7.0 // gy = fract(floor(gx0) / 7.0)) - 0.5; - _glm_vec4_floor(gx, gy); // gy = floor(gx) + glm_vec4_floor(gx, gy); // gy = floor(gx) glm_vec4_divs(gy, 7.0f, gy); // gy /= 7.0 glm_vec4_fract(gy, gy); // gy = fract(gy) glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5f @@ -428,7 +413,7 @@ _glm_noiseDetail_i2gxy( // tx = floor(gx + 0.5); vec4 tx; glm_vec4_adds(gx, 0.5f, tx); // tx = gx + 0.5 - _glm_vec4_floor(tx, tx); // tx = floor(tx) + glm_vec4_floor(tx, tx); // tx = floor(tx) // gx = gx - tx; glm_vec4_sub(gx, tx, gx); // gx -= tx @@ -449,7 +434,7 @@ float glm_perlin_vec4(vec4 point) { // Integer part of p for indexing vec4 Pi0; - _glm_vec4_floor(point, Pi0); // Pi0 = floor(point); + glm_vec4_floor(point, Pi0); // Pi0 = floor(point); // Integer part + 1 vec4 Pi1; @@ -788,7 +773,7 @@ glm_perlin_vec2(vec2 point) { // Integer part of p for indexing // Pi = floor(vec4(point.x, point.y, point.x, point.y)) + vec4(0.0, 0.0, 1.0, 1.0); vec4 Pi = {point[0], point[1], point[0], point[1]}; // Pi = vec4(point.x, point.y, point.x, point.y) - _glm_vec4_floor(Pi, Pi); // Pi = floor(Pi) + glm_vec4_floor(Pi, Pi); // Pi = floor(Pi) Pi[2] += 1.0f; // Pi.z += 1.0 Pi[3] += 1.0f; // Pi.w += 1.0 diff --git a/include/cglm/vec4-ext.h b/include/cglm/vec4-ext.h index e8678c3..997bfd9 100644 --- a/include/cglm/vec4-ext.h +++ b/include/cglm/vec4-ext.h @@ -288,6 +288,21 @@ glm_vec4_fract(vec4 v, vec4 dest) { dest[3] = fminf(v[3] - floorf(v[3]), 0.999999940395355224609375f); } +/*! + * @brief floor of each vector item + * + * @param[in] v vector + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec4_floor(vec4 x, vec4 dest) { + dest[0] = floorf(x[0]); + dest[1] = floorf(x[1]); + dest[2] = floorf(x[2]); + dest[3] = floorf(x[3]); +} + /*! * @brief vector reduction by summation * @warning could overflow From c27ef7e93b37dd2d51cdacc257330beed826a87e Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:27:15 +0000 Subject: [PATCH 055/128] vec3_floor struct doc --- include/cglm/struct/vec3-ext.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/cglm/struct/vec3-ext.h b/include/cglm/struct/vec3-ext.h index 212953f..f9ce728 100644 --- a/include/cglm/struct/vec3-ext.h +++ b/include/cglm/struct/vec3-ext.h @@ -26,6 +26,7 @@ CGLM_INLINE vec3s glms_vec3_sign(vec3s v); CGLM_INLINE vec3s glms_vec3_abs(vec3s v); CGLM_INLINE vec3s glms_vec3_fract(vec3s v); + CGLM_INLINE vec3s glms_vec3_floor(vec3s v); CGLM_INLINE float glms_vec3_hadd(vec3s v); CGLM_INLINE vec3s glms_vec3_sqrt(vec3s v); */ From 68215526cf27d5371f35ee591fc66330cc1e680c Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:27:57 +0000 Subject: [PATCH 056/128] vec4_floor boilerplate --- include/cglm/call/vec4.h | 4 ++++ include/cglm/struct/vec4-ext.h | 15 +++++++++++++++ src/vec4.c | 6 ++++++ 3 files changed, 25 insertions(+) diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index 9857473..5c19b2b 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -299,6 +299,10 @@ CGLM_EXPORT void glmc_vec4_fract(vec4 v, vec4 dest); +CGLM_EXPORT +void +glmc_vec4_floor(vec4 v, vec4 dest); + CGLM_EXPORT float glmc_vec4_hadd(vec4 v); diff --git a/include/cglm/struct/vec4-ext.h b/include/cglm/struct/vec4-ext.h index 6f48d93..07e73a1 100644 --- a/include/cglm/struct/vec4-ext.h +++ b/include/cglm/struct/vec4-ext.h @@ -26,6 +26,7 @@ CGLM_INLINE vec4s glms_vec4_sign(vec4s v); CGLM_INLINE vec4s glms_vec4_abs(vec4s v); CGLM_INLINE vec4s glms_vec4_fract(vec4s v); + CGLM_INLINE float glms_vec4_floor(vec4s v); CGLM_INLINE float glms_vec4_hadd(vec4s v); CGLM_INLINE vec4s glms_vec4_sqrt(vec4s v); */ @@ -230,6 +231,20 @@ glms_vec4_(fract)(vec4s v) { return r; } +/*! + * @brief floor of each vector item + * + * @param[in] v vector + * @returns dest destination vector + */ +CGLM_INLINE +vec4s +glms_vec4_(floor)(vec4s v) { + vec4s r; + glm_vec4_floor(v.raw, r.raw); + return r; +} + /*! * @brief vector reduction by summation * @warning could overflow diff --git a/src/vec4.c b/src/vec4.c index cac6606..0cf4ed9 100644 --- a/src/vec4.c +++ b/src/vec4.c @@ -406,6 +406,12 @@ glmc_vec4_fract(vec4 v, vec4 dest) { glm_vec4_fract(v, dest); } +CGLM_EXPORT +void +glmc_vec4_floor(vec4 v, vec4 dest) { + glm_vec4_floor(v, dest); +} + CGLM_EXPORT float glmc_vec4_hadd(vec4 v) { From 52753672bb4a6a38a2a83a7a40e896862d408787 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:30:27 +0000 Subject: [PATCH 057/128] vec4_fract test --- test/src/test_vec4.h | 16 ++++++++++++++++ test/tests.h | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/test/src/test_vec4.h b/test/src/test_vec4.h index cb34543..e7ad793 100644 --- a/test/src/test_vec4.h +++ b/test/src/test_vec4.h @@ -1490,6 +1490,22 @@ TEST_IMPL(GLM_PREFIX, vec4_fract) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, vec4_floor) { + vec4 v1 = {2.104f, 3.012f, 4.10f, 4.10f}; + vec4 v2 = {12.35f, 31.140f, 43.502f, 43.502f}; + vec4 v3, v4; + vec4 v5 = {2.0f, 3.0f, 4.0f, 4.0f}; + vec4 v6 = {12.0f, 31.0f, 43.0f, 43.0f}; + + GLM(vec4_floor)(v1, v3); + GLM(vec4_floor)(v2, v4); + + ASSERTIFY(test_assert_vec4_eq(v3, v5)) + ASSERTIFY(test_assert_vec4_eq(v4, v6)) + + TEST_SUCCESS +} + TEST_IMPL(GLM_PREFIX, vec4_hadd) { vec4 v1 = {2.0f, 3.0f, 4.0f, 4.0f}, v2 = {12.0f, 31.0f, 43.0f, 43.0f}; float r1, r2, r3, r4; diff --git a/test/tests.h b/test/tests.h index cc99ffd..33ec303 100644 --- a/test/tests.h +++ b/test/tests.h @@ -863,6 +863,7 @@ TEST_DECLARE(glm_vec4_isvalid) TEST_DECLARE(glm_vec4_sign) TEST_DECLARE(glm_vec4_abs) TEST_DECLARE(glm_vec4_fract) +TEST_DECLARE(glm_vec4_floor) TEST_DECLARE(glm_vec4_hadd) TEST_DECLARE(glm_vec4_sqrt) TEST_DECLARE(glm_vec4_make) @@ -937,6 +938,7 @@ TEST_DECLARE(glmc_vec4_isvalid) TEST_DECLARE(glmc_vec4_sign) TEST_DECLARE(glmc_vec4_abs) TEST_DECLARE(glmc_vec4_fract) +TEST_DECLARE(glmc_vec4_floor) TEST_DECLARE(glmc_vec4_hadd) TEST_DECLARE(glmc_vec4_sqrt) TEST_DECLARE(glmc_vec4_make) @@ -2048,6 +2050,7 @@ TEST_LIST { TEST_ENTRY(glm_vec4_sign) TEST_ENTRY(glm_vec4_abs) TEST_ENTRY(glm_vec4_fract) + TEST_ENTRY(glm_vec4_floor) TEST_ENTRY(glm_vec4_hadd) TEST_ENTRY(glm_vec4_sqrt) TEST_ENTRY(glm_vec4_make) @@ -2122,6 +2125,7 @@ TEST_LIST { TEST_ENTRY(glmc_vec4_sign) TEST_ENTRY(glmc_vec4_abs) TEST_ENTRY(glmc_vec4_fract) + TEST_ENTRY(glmc_vec4_floor) TEST_ENTRY(glmc_vec4_hadd) TEST_ENTRY(glmc_vec4_sqrt) TEST_ENTRY(glmc_vec4_make) From a9fee1b4d796f884d39838a2afcec87a62f029c6 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:35:00 +0000 Subject: [PATCH 058/128] vec2_fract --- include/cglm/vec2-ext.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/cglm/vec2-ext.h b/include/cglm/vec2-ext.h index ac6615e..0175885 100644 --- a/include/cglm/vec2-ext.h +++ b/include/cglm/vec2-ext.h @@ -198,6 +198,18 @@ glm_vec2_abs(vec2 v, vec2 dest) { dest[1] = fabsf(v[1]); } +/*! + * @brief fractional part of each vector item + * + * @param[in] v vector + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec2_fract(vec2 v, vec2 dest) { + dest[0] = fminf(v[0] - floorf(v[0]), 0.999999940395355224609375f); + dest[1] = fminf(v[1] - floorf(v[1]), 0.999999940395355224609375f); +} /*! * @brief square root of each vector item * From 3c9eecd0be46431e5432c6887dda350eb7847e73 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:49:27 +0000 Subject: [PATCH 059/128] vec2_fract boilerplate --- include/cglm/call/vec2.h | 4 ++++ include/cglm/struct/vec2-ext.h | 14 ++++++++++++++ include/cglm/vec2-ext.h | 1 + src/vec2.c | 5 +++++ 4 files changed, 24 insertions(+) diff --git a/include/cglm/call/vec2.h b/include/cglm/call/vec2.h index 4264887..5814646 100644 --- a/include/cglm/call/vec2.h +++ b/include/cglm/call/vec2.h @@ -189,6 +189,10 @@ CGLM_EXPORT void glmc_vec2_abs(vec2 v, vec2 dest); +CGLM_EXPORT +void +glmc_vec2_fract(vec2 v, vec2 dest); + CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest); diff --git a/include/cglm/struct/vec2-ext.h b/include/cglm/struct/vec2-ext.h index 7d77386..6642538 100644 --- a/include/cglm/struct/vec2-ext.h +++ b/include/cglm/struct/vec2-ext.h @@ -23,6 +23,7 @@ CGLM_INLINE bool glms_vec2_isinf(vec2s v) CGLM_INLINE bool glms_vec2_isvalid(vec2s v) CGLM_INLINE vec2s glms_vec2_sign(vec2s v) + CGLM_INLINE vec2s glms_vec2_fract(vec2s v) CGLM_INLINE vec2s glms_vec2_sqrt(vec2s v) */ @@ -184,6 +185,19 @@ glms_vec2_(sign)(vec2s v) { return r; } +/*! + * @brief fractional part of each vector item + * + * @param[in] v vector + * @returns destination vector + */ +CGLM_INLINE +vec2s +glms_vec2_(fract)(vec2s v) { + vec2s r; + glm_vec2_fract(v.raw, r.raw); + return r; +} /*! * @brief square root of each vector item * diff --git a/include/cglm/vec2-ext.h b/include/cglm/vec2-ext.h index 0175885..6920080 100644 --- a/include/cglm/vec2-ext.h +++ b/include/cglm/vec2-ext.h @@ -20,6 +20,7 @@ CGLM_INLINE bool glm_vec2_isvalid(vec2 v); CGLM_INLINE void glm_vec2_sign(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_abs(vec2 v, vec2 dest); + CGLM_INLINE void glm_vec2_fract(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_sqrt(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) CGLM_INLINE void glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) diff --git a/src/vec2.c b/src/vec2.c index b124f86..4dfe71f 100644 --- a/src/vec2.c +++ b/src/vec2.c @@ -273,6 +273,11 @@ glmc_vec2_abs(vec2 v, vec2 dest) { glm_vec2_abs(v, dest); } +CGLM_EXPORT +void +glmc_vec2_fract(vec2 v, vec2 dest) { + glm_vec2_fract(v, dest); +} CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) { From c48befca376cba284a4ce85e04f3d0b7df16169f Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:49:59 +0000 Subject: [PATCH 060/128] vec2_fract test --- test/src/test_vec2.h | 12 ++++++++++++ test/tests.h | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index 870d6eb..5447273 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -688,6 +688,18 @@ TEST_IMPL(GLM_PREFIX, vec2_abs) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, vec2_fract) { + vec3 v1 = {2.104f, 3.012f}, v2 = {12.35f, 31.140f}, v3, v4; + vec3 v5 = {0.104f, 0.012f}, v6 = {0.35f, 0.140f}; + + GLM(vec2_fract)(v1, v3); + GLM(vec2_fract)(v2, v4); + + ASSERTIFY(test_assert_vec2_eq(v3, v5)) + ASSERTIFY(test_assert_vec2_eq(v4, v6)) + + TEST_SUCCESS +} TEST_IMPL(GLM_PREFIX, vec2_lerp) { vec2 v1 = {-100.0f, -200.0f}; vec2 v2 = {100.0f, 200.0f}; diff --git a/test/tests.h b/test/tests.h index 33ec303..deb951d 100644 --- a/test/tests.h +++ b/test/tests.h @@ -539,6 +539,7 @@ TEST_DECLARE(glm_vec2_maxv) TEST_DECLARE(glm_vec2_minv) TEST_DECLARE(glm_vec2_clamp) TEST_DECLARE(glm_vec2_abs) +TEST_DECLARE(glm_vec2_fract) TEST_DECLARE(glm_vec2_lerp) TEST_DECLARE(glm_vec2_complex_mul) TEST_DECLARE(glm_vec2_complex_div) @@ -587,6 +588,7 @@ TEST_DECLARE(glmc_vec2_maxv) TEST_DECLARE(glmc_vec2_minv) TEST_DECLARE(glmc_vec2_clamp) TEST_DECLARE(glmc_vec2_abs) +TEST_DECLARE(glmc_vec2_fract) TEST_DECLARE(glmc_vec2_lerp) TEST_DECLARE(glmc_vec2_complex_mul) TEST_DECLARE(glmc_vec2_complex_div) @@ -1727,6 +1729,7 @@ TEST_LIST { TEST_ENTRY(glm_vec2_maxv) TEST_ENTRY(glm_vec2_minv) TEST_ENTRY(glm_vec2_clamp) + TEST_ENTRY(glm_vec2_fract) TEST_ENTRY(glm_vec2_lerp) TEST_ENTRY(glm_vec2_complex_mul) TEST_ENTRY(glm_vec2_complex_div) @@ -1775,6 +1778,7 @@ TEST_LIST { TEST_ENTRY(glmc_vec2_minv) TEST_ENTRY(glmc_vec2_clamp) TEST_ENTRY(glmc_vec2_abs) + TEST_ENTRY(glmc_vec2_fract) TEST_ENTRY(glmc_vec2_lerp) TEST_ENTRY(glmc_vec2_complex_mul) TEST_ENTRY(glmc_vec2_complex_div) From 2890472a0bf738a4f205e99c5eb5ab704cd090b9 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:50:30 +0000 Subject: [PATCH 061/128] add missing test entry for vec2_abs --- test/tests.h | 1 + 1 file changed, 1 insertion(+) diff --git a/test/tests.h b/test/tests.h index deb951d..4fbba64 100644 --- a/test/tests.h +++ b/test/tests.h @@ -1729,6 +1729,7 @@ TEST_LIST { TEST_ENTRY(glm_vec2_maxv) TEST_ENTRY(glm_vec2_minv) TEST_ENTRY(glm_vec2_clamp) + TEST_ENTRY(glm_vec2_abs) TEST_ENTRY(glm_vec2_fract) TEST_ENTRY(glm_vec2_lerp) TEST_ENTRY(glm_vec2_complex_mul) From 9594d0cc861b6b36e58e48f586eec94de77e52c0 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:50:51 +0000 Subject: [PATCH 062/128] add missing glms_vec2_abs --- include/cglm/struct/vec2-ext.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/include/cglm/struct/vec2-ext.h b/include/cglm/struct/vec2-ext.h index 6642538..8da0986 100644 --- a/include/cglm/struct/vec2-ext.h +++ b/include/cglm/struct/vec2-ext.h @@ -23,6 +23,7 @@ CGLM_INLINE bool glms_vec2_isinf(vec2s v) CGLM_INLINE bool glms_vec2_isvalid(vec2s v) CGLM_INLINE vec2s glms_vec2_sign(vec2s v) + CGLM_INLINE vec2s glms_vec2_abs(vec2s v) CGLM_INLINE vec2s glms_vec2_fract(vec2s v) CGLM_INLINE vec2s glms_vec2_sqrt(vec2s v) */ @@ -185,6 +186,20 @@ glms_vec2_(sign)(vec2s v) { return r; } +/*! + * @brief fractional part of each vector item + * + * @param v vector + * @returns abs vector + */ +CGLM_INLINE +vec2s +glms_vec2_(abs)(vec2s v) { + vec2s r; + glm_vec2_abs(v.raw, r.raw); + return r; +} + /*! * @brief fractional part of each vector item * From bfaf413a5dcd46955d6e3696c0dfaa107bc010a8 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:51:19 +0000 Subject: [PATCH 063/128] vec2_floor impl --- include/cglm/vec2-ext.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/include/cglm/vec2-ext.h b/include/cglm/vec2-ext.h index 6920080..a0631f4 100644 --- a/include/cglm/vec2-ext.h +++ b/include/cglm/vec2-ext.h @@ -21,6 +21,7 @@ CGLM_INLINE void glm_vec2_sign(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_abs(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_fract(vec2 v, vec2 dest); + CGLM_INLINE void glm_vec2_floor(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_sqrt(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) CGLM_INLINE void glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) @@ -211,6 +212,20 @@ glm_vec2_fract(vec2 v, vec2 dest) { dest[0] = fminf(v[0] - floorf(v[0]), 0.999999940395355224609375f); dest[1] = fminf(v[1] - floorf(v[1]), 0.999999940395355224609375f); } + +/*! + * @brief floor of each vector item + * + * @param[in] v vector + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec2_floor(vec2 x, vec2 dest) { + dest[0] = floorf(x[0]); + dest[1] = floorf(x[1]); +} + /*! * @brief square root of each vector item * From 9a25fab6f09ac9aea48e2bc4a1b602d286ec76d9 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:51:32 +0000 Subject: [PATCH 064/128] vec2_floor boilerplate --- include/cglm/call/vec2.h | 4 ++++ include/cglm/struct/vec2-ext.h | 16 ++++++++++++++++ src/vec2.c | 7 +++++++ 3 files changed, 27 insertions(+) diff --git a/include/cglm/call/vec2.h b/include/cglm/call/vec2.h index 5814646..2fe5076 100644 --- a/include/cglm/call/vec2.h +++ b/include/cglm/call/vec2.h @@ -193,6 +193,10 @@ CGLM_EXPORT void glmc_vec2_fract(vec2 v, vec2 dest); +CGLM_EXPORT +void +glmc_vec2_floor(vec2 v, vec2 dest); + CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest); diff --git a/include/cglm/struct/vec2-ext.h b/include/cglm/struct/vec2-ext.h index 8da0986..907fa99 100644 --- a/include/cglm/struct/vec2-ext.h +++ b/include/cglm/struct/vec2-ext.h @@ -25,6 +25,7 @@ CGLM_INLINE vec2s glms_vec2_sign(vec2s v) CGLM_INLINE vec2s glms_vec2_abs(vec2s v) CGLM_INLINE vec2s glms_vec2_fract(vec2s v) + CGLM_INLINE vec2s glms_vec2_floor(vec2s v) CGLM_INLINE vec2s glms_vec2_sqrt(vec2s v) */ @@ -213,6 +214,21 @@ glms_vec2_(fract)(vec2s v) { glm_vec2_fract(v.raw, r.raw); return r; } + +/*! + * @brief floor of each vector item + * + * @param[in] v vector + * @returns destination vector + */ +CGLM_INLINE +vec2s +glms_vec2_(floor)(vec2s v) { + vec2s r; + glm_vec2_floor(v.raw, r.raw); + return r; +} + /*! * @brief square root of each vector item * diff --git a/src/vec2.c b/src/vec2.c index 4dfe71f..93742a0 100644 --- a/src/vec2.c +++ b/src/vec2.c @@ -278,6 +278,13 @@ void glmc_vec2_fract(vec2 v, vec2 dest) { glm_vec2_fract(v, dest); } + +CGLM_EXPORT +void +glmc_vec2_floor(vec2 v, vec2 dest) { + glm_vec2_floor(v, dest); +} + CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) { From 200b0875bac2e3c3ee9b1702a88b03f122b13654 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:51:40 +0000 Subject: [PATCH 065/128] vec2_floor test --- test/src/test_vec2.h | 15 +++++++++++++++ test/tests.h | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index 5447273..f94fab3 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -700,6 +700,21 @@ TEST_IMPL(GLM_PREFIX, vec2_fract) { TEST_SUCCESS } + +TEST_IMPL(GLM_PREFIX, vec2_floor) { + vec3 v1 = {2.104f, 3.012f}, v2 = {12.35f, 31.140f}, v3, v4; + vec3 v5 = {2.0f, 3.0f}, v6 = {12.0f, 31.0f}; + + GLM(vec2_floor)(v1, v3); + GLM(vec2_floor)(v2, v4); + + ASSERTIFY(test_assert_vec2_eq(v3, v5)) + ASSERTIFY(test_assert_vec2_eq(v4, v6)) + + TEST_SUCCESS +} + + TEST_IMPL(GLM_PREFIX, vec2_lerp) { vec2 v1 = {-100.0f, -200.0f}; vec2 v2 = {100.0f, 200.0f}; diff --git a/test/tests.h b/test/tests.h index 4fbba64..e9bf439 100644 --- a/test/tests.h +++ b/test/tests.h @@ -540,6 +540,7 @@ TEST_DECLARE(glm_vec2_minv) TEST_DECLARE(glm_vec2_clamp) TEST_DECLARE(glm_vec2_abs) TEST_DECLARE(glm_vec2_fract) +TEST_DECLARE(glm_vec2_floor) TEST_DECLARE(glm_vec2_lerp) TEST_DECLARE(glm_vec2_complex_mul) TEST_DECLARE(glm_vec2_complex_div) @@ -589,6 +590,7 @@ TEST_DECLARE(glmc_vec2_minv) TEST_DECLARE(glmc_vec2_clamp) TEST_DECLARE(glmc_vec2_abs) TEST_DECLARE(glmc_vec2_fract) +TEST_DECLARE(glmc_vec2_floor) TEST_DECLARE(glmc_vec2_lerp) TEST_DECLARE(glmc_vec2_complex_mul) TEST_DECLARE(glmc_vec2_complex_div) @@ -1731,6 +1733,7 @@ TEST_LIST { TEST_ENTRY(glm_vec2_clamp) TEST_ENTRY(glm_vec2_abs) TEST_ENTRY(glm_vec2_fract) + TEST_ENTRY(glm_vec2_floor) TEST_ENTRY(glm_vec2_lerp) TEST_ENTRY(glm_vec2_complex_mul) TEST_ENTRY(glm_vec2_complex_div) @@ -1780,6 +1783,7 @@ TEST_LIST { TEST_ENTRY(glmc_vec2_clamp) TEST_ENTRY(glmc_vec2_abs) TEST_ENTRY(glmc_vec2_fract) + TEST_ENTRY(glmc_vec2_floor) TEST_ENTRY(glmc_vec2_lerp) TEST_ENTRY(glmc_vec2_complex_mul) TEST_ENTRY(glmc_vec2_complex_div) From eaf2d7314e7ffc415b91fed325d78dc0cd777a0c Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:54:28 +0000 Subject: [PATCH 066/128] vec4-ext docs --- docs/source/vec4-ext.rst | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/source/vec4-ext.rst b/docs/source/vec4-ext.rst index 722424e..bf7eca2 100644 --- a/docs/source/vec4-ext.rst +++ b/docs/source/vec4-ext.rst @@ -23,6 +23,15 @@ Functions: #. :c:func:`glm_vec4_eqv_eps` #. :c:func:`glm_vec4_max` #. :c:func:`glm_vec4_min` +#. :c:func:`glm_vec4_isnan` +#. :c:func:`glm_vec4_isinf` +#. :c:func:`glm_vec4_isvalid` +#. :c:func:`glm_vec4_sign` +#. :c:func:`glm_vec4_abs` +#. :c:func:`glm_vec4_fract` +#. :c:func:`glm_vec4_floor` +#. :c:func:`glm_vec4_sqrt` + Functions documentation ~~~~~~~~~~~~~~~~~~~~~~~ @@ -129,6 +138,30 @@ Functions documentation | *[in]* **v** vector | *[out]* **dest** sign vector (only keeps signs as -1, 0, -1) +.. c:function:: void glm_vec4_abs(vec4 v, vec4 dest) + + absolute value of each vector item + + Parameters: + | *[in]* **v** vector + | *[out]* **dest** destination vector (abs(v)) + +.. c:function:: void glm_vec4_fract(vec4 v, vec4 dest) + + fractional part of each vector item + + Parameters: + | *[in]* **v** vector + | *[out]* **dest** destination vector (fract(v)) + +.. c:function:: void glm_vec4_floor(vec4 v, vec4 dest) + + floor of each vector item + + Parameters: + | *[in]* **v** vector + | *[out]* **dest** destination vector (floor(v)) + .. c:function:: void glm_vec4_sqrt(vec4 v, vec4 dest) square root of each vector item From b1192c8638aaff2d0d45060109f965a0cd5b25f4 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:55:30 +0000 Subject: [PATCH 067/128] vec3-ext docs --- docs/source/vec3-ext.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/source/vec3-ext.rst b/docs/source/vec3-ext.rst index f99e770..9668932 100644 --- a/docs/source/vec3-ext.rst +++ b/docs/source/vec3-ext.rst @@ -28,6 +28,8 @@ Functions: #. :c:func:`glm_vec3_isvalid` #. :c:func:`glm_vec3_sign` #. :c:func:`glm_vec3_abs` +#. :c:func:`glm_vec3_fract` +#. :c:func:`glm_vec3_floor` #. :c:func:`glm_vec3_sqrt` Functions documentation @@ -151,6 +153,22 @@ Functions documentation | *[in]* **v** vector | *[out]* **dest** destination vector +.. c:function:: void glm_vec3_fract(vec3 v, vec3 dest) + + fractional part of each vector item + + Parameters: + | *[in]* **v** vector + | *[out]* **dest** destination vector + +.. c:function:: void glm_vec3_floor(vec3 v, vec3 dest) + + floor of each vector item + + Parameters: + | *[in]* **v** vector + | *[out]* **dest** destination vector + .. c:function:: void glm_vec3_sqrt(vec3 v, vec3 dest) square root of each vector item From 651ad8ca32a012045f283344a6ae7d472ba04d1d Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 12:56:05 +0000 Subject: [PATCH 068/128] vec2-ext docs --- docs/source/vec2-ext.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/source/vec2-ext.rst b/docs/source/vec2-ext.rst index f8d8fe5..70ef4f6 100644 --- a/docs/source/vec2-ext.rst +++ b/docs/source/vec2-ext.rst @@ -27,6 +27,8 @@ Functions: #. :c:func:`glm_vec2_isvalid` #. :c:func:`glm_vec2_sign` #. :c:func:`glm_vec2_abs` +#. :c:func:`glm_vec2_fract` +#. :c:func:`glm_vec2_floor` #. :c:func:`glm_vec2_sqrt` Functions documentation @@ -134,6 +136,22 @@ Functions documentation | *[in]* **v** vector | *[out]* **dest** destination vector +.. c:function:: void glm_vec2_fract(vec2 v, vec2 dest) + + get fractional part of each vector item + + Parameters: + | *[in]* **v** vector + | *[out]* **dest** destination vector + +.. c:function:: void glm_vec2_floor(vec2 v, vec2 dest) + + floor value of each vector item + + Parameters: + | *[in]* **v** vector + | *[out]* **dest** destination vector + .. c:function:: void glm_vec2_sqrt(vec2 v, vec2 dest) square root of each vector item From 5a3a16d9addf7dd60c74005eb1e45b0f81bde778 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 13:17:42 +0000 Subject: [PATCH 069/128] double spaces in noise.h --- include/cglm/noise.h | 980 +++++++++++++++++++++---------------------- 1 file changed, 490 insertions(+), 490 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index cb5e45b..621a74a 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -38,10 +38,10 @@ CGLM_INLINE void _glm_vec4_mods(vec4 x, float y, vec4 dest) { - dest[0] = fmodf(x[0], y); - dest[1] = fmodf(x[1], y); - dest[2] = fmodf(x[2], y); - dest[3] = fmodf(x[3], y); + dest[0] = fmodf(x[0], y); + dest[1] = fmodf(x[1], y); + dest[2] = fmodf(x[2], y); + dest[3] = fmodf(x[3], y); } /*! @@ -54,9 +54,9 @@ _glm_vec4_mods(vec4 x, float y, vec4 dest) { CGLM_INLINE void _glm_vec3_mods(vec3 x, float y, vec3 dest) { - dest[0] = fmodf(x[0], y); - dest[1] = fmodf(x[1], y); - dest[2] = fmodf(x[2], y); + dest[0] = fmodf(x[0], y); + dest[1] = fmodf(x[1], y); + dest[2] = fmodf(x[2], y); } @@ -126,49 +126,49 @@ _glm_vec3_sets(vec3 v, float x) { CGLM_INLINE float _glm_noiseDetail_mod289(float x) { - return x - floorf(x * (1.0f / 289.0f)) * 289.0f; + return x - floorf(x * (1.0f / 289.0f)) * 289.0f; } CGLM_INLINE void _glm_noiseDetail_permute(vec4 x, vec4 dest) { - dest[0] = _glm_noiseDetail_mod289((x[0] * 34.0f + 1.0f) * x[0]); - dest[1] = _glm_noiseDetail_mod289((x[1] * 34.0f + 1.0f) * x[1]); - dest[2] = _glm_noiseDetail_mod289((x[2] * 34.0f + 1.0f) * x[2]); - dest[3] = _glm_noiseDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); + dest[0] = _glm_noiseDetail_mod289((x[0] * 34.0f + 1.0f) * x[0]); + dest[1] = _glm_noiseDetail_mod289((x[1] * 34.0f + 1.0f) * x[1]); + dest[2] = _glm_noiseDetail_mod289((x[2] * 34.0f + 1.0f) * x[2]); + dest[3] = _glm_noiseDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); } CGLM_INLINE void _glm_noiseDetail_fade_vec4(vec4 t, vec4 dest) { - dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); - dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); - dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); - dest[3] = (t[3] * t[3] * t[3]) * (t[3] * (t[3] * 6.0f - 15.0f) + 10.0f); + dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); + dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); + dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); + dest[3] = (t[3] * t[3] * t[3]) * (t[3] * (t[3] * 6.0f - 15.0f) + 10.0f); } CGLM_INLINE void _glm_noiseDetail_fade_vec3(vec3 t, vec3 dest) { - dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); - dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); - dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); + dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); + dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); + dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); } CGLM_INLINE void _glm_noiseDetail_fade_vec2(vec2 t, vec2 dest) { - dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); - dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); + dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); + dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); } CGLM_INLINE void _glm_noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) { - dest[0] = 1.79284291400159f - 0.85373472095314f * x[0]; - dest[1] = 1.79284291400159f - 0.85373472095314f * x[1]; - dest[2] = 1.79284291400159f - 0.85373472095314f * x[2]; - dest[3] = 1.79284291400159f - 0.85373472095314f * x[3]; + dest[0] = 1.79284291400159f - 0.85373472095314f * x[0]; + dest[1] = 1.79284291400159f - 0.85373472095314f * x[1]; + dest[2] = 1.79284291400159f - 0.85373472095314f * x[2]; + dest[3] = 1.79284291400159f - 0.85373472095314f * x[3]; } /*! @@ -183,23 +183,23 @@ CGLM_INLINE void _glm_noiseDetail_gradNorm_vec4(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) { - // norm = taylorInvSqrt(vec4( - // dot(g00__, g00__), - // dot(g01__, g01__), - // dot(g10__, g10__), - // dot(g11__, g11__) - // )); - vec4 norm; - norm[0] = glm_vec4_dot(g00__, g00__); // norm.x = dot(g00__, g00__) - norm[1] = glm_vec4_dot(g01__, g01__); // norm.y = dot(g01__, g01__) - norm[2] = glm_vec4_dot(g10__, g10__); // norm.z = dot(g10__, g10__) - norm[3] = glm_vec4_dot(g11__, g11__); // norm.w = dot(g11__, g11__) - _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) - - glm_vec4_scale(g00__, norm[0], g00__); // g00__ *= norm.x - glm_vec4_scale(g01__, norm[1], g01__); // g01__ *= norm.y - glm_vec4_scale(g10__, norm[2], g10__); // g10__ *= norm.z - glm_vec4_scale(g11__, norm[3], g11__); // g11__ *= norm.w + // norm = taylorInvSqrt(vec4( + // dot(g00__, g00__), + // dot(g01__, g01__), + // dot(g10__, g10__), + // dot(g11__, g11__) + // )); + vec4 norm; + norm[0] = glm_vec4_dot(g00__, g00__); // norm.x = dot(g00__, g00__) + norm[1] = glm_vec4_dot(g01__, g01__); // norm.y = dot(g01__, g01__) + norm[2] = glm_vec4_dot(g10__, g10__); // norm.z = dot(g10__, g10__) + norm[3] = glm_vec4_dot(g11__, g11__); // norm.w = dot(g11__, g11__) + _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) + + glm_vec4_scale(g00__, norm[0], g00__); // g00__ *= norm.x + glm_vec4_scale(g01__, norm[1], g01__); // g01__ *= norm.y + glm_vec4_scale(g10__, norm[2], g10__); // g10__ *= norm.z + glm_vec4_scale(g11__, norm[3], g11__); // g11__ *= norm.w } @@ -215,23 +215,23 @@ CGLM_INLINE void _glm_noiseDetail_gradNorm_vec3(vec3 g00_, vec3 g01_, vec3 g10_, vec3 g11_) { - // norm = taylorInvSqrt(vec4( - // dot(g00_, g00_), - // dot(g01_, g01_), - // dot(g10_, g10_), - // dot(g11_, g11_) - // )); - vec4 norm; - norm[0] = glm_vec3_dot(g00_, g00_); // norm.x = dot(g00_, g00_) - norm[1] = glm_vec3_dot(g01_, g01_); // norm.y = dot(g01_, g01_) - norm[2] = glm_vec3_dot(g10_, g10_); // norm.z = dot(g10_, g10_) - norm[3] = glm_vec3_dot(g11_, g11_); // norm.w = dot(g11_, g11_) - _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) - - glm_vec3_scale(g00_, norm[0], g00_); // g00_ *= norm.x - glm_vec3_scale(g01_, norm[1], g01_); // g01_ *= norm.y - glm_vec3_scale(g10_, norm[2], g10_); // g10_ *= norm.z - glm_vec3_scale(g11_, norm[3], g11_); // g11_ *= norm.w + // norm = taylorInvSqrt(vec4( + // dot(g00_, g00_), + // dot(g01_, g01_), + // dot(g10_, g10_), + // dot(g11_, g11_) + // )); + vec4 norm; + norm[0] = glm_vec3_dot(g00_, g00_); // norm.x = dot(g00_, g00_) + norm[1] = glm_vec3_dot(g01_, g01_); // norm.y = dot(g01_, g01_) + norm[2] = glm_vec3_dot(g10_, g10_); // norm.z = dot(g10_, g10_) + norm[3] = glm_vec3_dot(g11_, g11_); // norm.w = dot(g11_, g11_) + _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) + + glm_vec3_scale(g00_, norm[0], g00_); // g00_ *= norm.x + glm_vec3_scale(g01_, norm[1], g01_); // g01_ *= norm.y + glm_vec3_scale(g10_, norm[2], g10_); // g10_ *= norm.z + glm_vec3_scale(g11_, norm[3], g11_); // g11_ *= norm.w } /*! @@ -246,177 +246,177 @@ CGLM_INLINE void _glm_noiseDetail_gradNorm_vec2(vec2 g00, vec2 g01, vec2 g10, vec2 g11) { - // norm = taylorInvSqrt(vec4( - // dot(g00, g00), - // dot(g01, g01), - // dot(g10, g10), - // dot(g11, g11) - // )); - vec4 norm; - norm[0] = glm_vec2_dot(g00, g00); // norm.x = dot(g00, g00) - norm[1] = glm_vec2_dot(g01, g01); // norm.y = dot(g01, g01) - norm[2] = glm_vec2_dot(g10, g10); // norm.z = dot(g10, g10) - norm[3] = glm_vec2_dot(g11, g11); // norm.w = dot(g11, g11) - _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) - - glm_vec2_scale(g00, norm[0], g00); // g00 *= norm.x - glm_vec2_scale(g01, norm[1], g01); // g01 *= norm.y - glm_vec2_scale(g10, norm[2], g10); // g10 *= norm.z - glm_vec2_scale(g11, norm[3], g11); // g11 *= norm.w + // norm = taylorInvSqrt(vec4( + // dot(g00, g00), + // dot(g01, g01), + // dot(g10, g10), + // dot(g11, g11) + // )); + vec4 norm; + norm[0] = glm_vec2_dot(g00, g00); // norm.x = dot(g00, g00) + norm[1] = glm_vec2_dot(g01, g01); // norm.y = dot(g01, g01) + norm[2] = glm_vec2_dot(g10, g10); // norm.z = dot(g10, g10) + norm[3] = glm_vec2_dot(g11, g11); // norm.w = dot(g11, g11) + _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) + + glm_vec2_scale(g00, norm[0], g00); // g00 *= norm.x + glm_vec2_scale(g01, norm[1], g01); // g01 *= norm.y + glm_vec2_scale(g10, norm[2], g10); // g10 *= norm.z + glm_vec2_scale(g11, norm[3], g11); // g11 *= norm.w } CGLM_INLINE void _glm_noiseDetail_i2gxyzw( - vec4 ixy, - /* out */ - vec4 gx, - vec4 gy, - vec4 gz, - vec4 gw + vec4 ixy, + /* out */ + vec4 gx, + vec4 gy, + vec4 gz, + vec4 gw ) { - // gx = ixy / 7.0 - glm_vec4_divs(ixy, 7.0f, gx); // gx = ixy / 7.0 + // gx = ixy / 7.0 + glm_vec4_divs(ixy, 7.0f, gx); // gx = ixy / 7.0 - // gy = fract(gx) / 7.0 - glm_vec4_floor(gx, gy); // gy = floor(gx) - glm_vec4_divs(gy, 7.0f, gy); // gy /= 7.0 + // gy = fract(gx) / 7.0 + glm_vec4_floor(gx, gy); // gy = floor(gx) + glm_vec4_divs(gy, 7.0f, gy); // gy /= 7.0 - // gz = floor(gy) / 6.0 - glm_vec4_floor(gy, gz); // gz = floor(gy) - glm_vec4_divs(gz, 6.0f, gz); // gz /= 6.0 + // gz = floor(gy) / 6.0 + glm_vec4_floor(gy, gz); // gz = floor(gy) + glm_vec4_divs(gz, 6.0f, gz); // gz /= 6.0 - // gx = fract(gx) - 0.5f - glm_vec4_fract(gx, gx); // gx = fract(gx) - glm_vec4_subs(gx, 0.5f, gx); // gx -= 0.5f + // gx = fract(gx) - 0.5f + glm_vec4_fract(gx, gx); // gx = fract(gx) + glm_vec4_subs(gx, 0.5f, gx); // gx -= 0.5f - // gy = fract(gy) - 0.5f - glm_vec4_fract(gy, gy); // gy = fract(gy) - glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5f + // gy = fract(gy) - 0.5f + glm_vec4_fract(gy, gy); // gy = fract(gy) + glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5f - // gz = fract(gz) - 0.5f - glm_vec4_fract(gz, gz); // gz = fract(gz) - glm_vec4_subs(gz, 0.5f, gz); // gz -= 0.5f + // gz = fract(gz) - 0.5f + glm_vec4_fract(gz, gz); // gz = fract(gz) + glm_vec4_subs(gz, 0.5f, gz); // gz -= 0.5f - // abs(gx), abs(gy), abs(gz) - vec4 gxa, gya, gza; - glm_vec4_abs(gx, gxa); // gxa = abs(gx) - glm_vec4_abs(gy, gya); // gya = abs(gy) - glm_vec4_abs(gz, gza); // gza = abs(gz) + // abs(gx), abs(gy), abs(gz) + vec4 gxa, gya, gza; + glm_vec4_abs(gx, gxa); // gxa = abs(gx) + glm_vec4_abs(gy, gya); // gya = abs(gy) + glm_vec4_abs(gz, gza); // gza = abs(gz) - // gw = 0.75 - abs(gx) - abs(gy) - abs(gz) - _glm_vec4_sets(gw, 0.75f); // gw = 0.75 - glm_vec4_sub(gw, gxa, gw); // gw -= gxa - glm_vec4_sub(gw, gza, gw); // gw -= gza - glm_vec4_sub(gw, gya, gw); // gw -= gya + // gw = 0.75 - abs(gx) - abs(gy) - abs(gz) + _glm_vec4_sets(gw, 0.75f); // gw = 0.75 + glm_vec4_sub(gw, gxa, gw); // gw -= gxa + glm_vec4_sub(gw, gza, gw); // gw -= gza + glm_vec4_sub(gw, gya, gw); // gw -= gya - // sw = step(gw, 0.0); - vec4 sw; - _glm_vec4_steps(gw, 0.0f, sw); // sw = step(gw, 0.0) + // sw = step(gw, 0.0); + vec4 sw; + _glm_vec4_steps(gw, 0.0f, sw); // sw = step(gw, 0.0) - // gx -= sw * (step(vec4(0), gx) - T(0.5)); - vec4 temp = {0.0f}; // temp = 0.0 - glm_vec4_step(temp, gx, temp); // temp = step(temp, gx) - glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 - glm_vec4_mul(sw, temp, temp); // temp *= sw - glm_vec4_sub(gx, temp, gx); // gx -= temp + // gx -= sw * (step(vec4(0), gx) - T(0.5)); + vec4 temp = {0.0f}; // temp = 0.0 + glm_vec4_step(temp, gx, temp); // temp = step(temp, gx) + glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 + glm_vec4_mul(sw, temp, temp); // temp *= sw + glm_vec4_sub(gx, temp, gx); // gx -= temp - // gy -= sw * (step(vec4(0), gy) - T(0.5)); - glm_vec4_zero(temp); // reset temp - glm_vec4_step(temp, gy, temp); // temp = step(temp, gy) - glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 - glm_vec4_mul(sw, temp, temp); // temp *= sw - glm_vec4_sub(gy, temp, gy); // gy -= temp + // gy -= sw * (step(vec4(0), gy) - T(0.5)); + glm_vec4_zero(temp); // reset temp + glm_vec4_step(temp, gy, temp); // temp = step(temp, gy) + glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 + glm_vec4_mul(sw, temp, temp); // temp *= sw + glm_vec4_sub(gy, temp, gy); // gy -= temp } CGLM_INLINE void _glm_noiseDetail_i2gxyz( - vec4 ixy, - /* out */ - vec4 gx, - vec4 gy, - vec4 gz + vec4 ixy, + /* out */ + vec4 gx, + vec4 gy, + vec4 gz ) { - // NOTE: This function is not *quite* analogous to _glm_noiseDetail_i2gxyzw - // to try to match the output of glm::perlin. I think it might be a bug in - // in the original implementation, but for now I'm keeping it consistent. -MK - - // gx = ixy / 7.0 - glm_vec4_divs(ixy, 7.0f, gx); // gx = ixy / 7.0 + // NOTE: This function is not *quite* analogous to _glm_noiseDetail_i2gxyzw + // to try to match the output of glm::perlin. I think it might be a bug in + // in the original implementation, but for now I'm keeping it consistent. -MK + + // gx = ixy / 7.0 + glm_vec4_divs(ixy, 7.0f, gx); // gx = ixy / 7.0 - // gy = fract(floor(gx0) / 7.0)) - 0.5; - glm_vec4_floor(gx, gy); // gy = floor(gx) - glm_vec4_divs(gy, 7.0f, gy); // gy /= 7.0 - glm_vec4_fract(gy, gy); // gy = fract(gy) - glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5f + // gy = fract(floor(gx0) / 7.0)) - 0.5; + glm_vec4_floor(gx, gy); // gy = floor(gx) + glm_vec4_divs(gy, 7.0f, gy); // gy /= 7.0 + glm_vec4_fract(gy, gy); // gy = fract(gy) + glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5f - // gx = fract(gx); - glm_vec4_fract(gx, gx); // gx = fract(gx) + // gx = fract(gx); + glm_vec4_fract(gx, gx); // gx = fract(gx) - // abs(gx), abs(gy) - vec4 gxa, gya; - glm_vec4_abs(gx, gxa); // gxa = abs(gx) - glm_vec4_abs(gy, gya); // gya = abs(gy) + // abs(gx), abs(gy) + vec4 gxa, gya; + glm_vec4_abs(gx, gxa); // gxa = abs(gx) + glm_vec4_abs(gy, gya); // gya = abs(gy) - // gz = vec4(0.5) - abs(gx0) - abs(gy0); - _glm_vec4_sets(gz, 0.5f); // gz = 0.5 - glm_vec4_sub(gz, gxa, gz); // gz -= gxa - glm_vec4_sub(gz, gya, gz); // gz -= gya + // gz = vec4(0.5) - abs(gx0) - abs(gy0); + _glm_vec4_sets(gz, 0.5f); // gz = 0.5 + glm_vec4_sub(gz, gxa, gz); // gz -= gxa + glm_vec4_sub(gz, gya, gz); // gz -= gya - - // sz = step(gw, 0.0); - vec4 sz; - _glm_vec4_steps(gz, 0.0f, sz); // sz = step(gz, 0.0) + + // sz = step(gw, 0.0); + vec4 sz; + _glm_vec4_steps(gz, 0.0f, sz); // sz = step(gz, 0.0) - // gx0 -= sz0 * (step(0.0, gx0) - T(0.5)); - vec4 temp = {0.0f}; // temp = 0.0 - glm_vec4_step(temp, gx, temp); // temp = step(temp, gx) - glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 - glm_vec4_mul(sz, temp, temp); // temp *= sz - glm_vec4_sub(gx, temp, gx); // gx -= temp + // gx0 -= sz0 * (step(0.0, gx0) - T(0.5)); + vec4 temp = {0.0f}; // temp = 0.0 + glm_vec4_step(temp, gx, temp); // temp = step(temp, gx) + glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 + glm_vec4_mul(sz, temp, temp); // temp *= sz + glm_vec4_sub(gx, temp, gx); // gx -= temp - // gy0 -= sz0 * (step(0.0, gy0) - T(0.5)); - glm_vec4_zero(temp); // reset temp - glm_vec4_step(temp, gy, temp); // temp = step(temp, gy) - glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 - glm_vec4_mul(sz, temp, temp); // temp *= sz - glm_vec4_sub(gy, temp, gy); // gy -= temp + // gy0 -= sz0 * (step(0.0, gy0) - T(0.5)); + glm_vec4_zero(temp); // reset temp + glm_vec4_step(temp, gy, temp); // temp = step(temp, gy) + glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 + glm_vec4_mul(sz, temp, temp); // temp *= sz + glm_vec4_sub(gy, temp, gy); // gy -= temp } CGLM_INLINE void _glm_noiseDetail_i2gxy( - vec4 i, - /* out */ - vec4 gx, - vec4 gy + vec4 i, + /* out */ + vec4 gx, + vec4 gy ) { - // vec<4, T, Q> gx = static_cast(2) * glm::fract(i / T(41)) - T(1); - // vec<4, T, Q> gy = glm::abs(gx) - T(0.5); - // vec<4, T, Q> tx = glm::floor(gx + T(0.5)); - // gx = gx - tx; - + // vec<4, T, Q> gx = static_cast(2) * glm::fract(i / T(41)) - T(1); + // vec<4, T, Q> gy = glm::abs(gx) - T(0.5); + // vec<4, T, Q> tx = glm::floor(gx + T(0.5)); + // gx = gx - tx; + - // gx = 2.0 * fract(i / 41.0) - 1.0; - glm_vec4_divs(i, 41.0f, gx); // gx = i / 41.0 - glm_vec4_fract(gx, gx); // gx = fract(gx) - glm_vec4_scale(gx, 2.0f, gx); // gx *= 2.0 - glm_vec4_subs(gx, 1.0f, gx); // gx -= 1.0 + // gx = 2.0 * fract(i / 41.0) - 1.0; + glm_vec4_divs(i, 41.0f, gx); // gx = i / 41.0 + glm_vec4_fract(gx, gx); // gx = fract(gx) + glm_vec4_scale(gx, 2.0f, gx); // gx *= 2.0 + glm_vec4_subs(gx, 1.0f, gx); // gx -= 1.0 - // gy = abs(gx) - 0.5; - glm_vec4_abs(gx, gy); // gy = abs(gx) - glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5 + // gy = abs(gx) - 0.5; + glm_vec4_abs(gx, gy); // gy = abs(gx) + glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5 - // tx = floor(gx + 0.5); - vec4 tx; - glm_vec4_adds(gx, 0.5f, tx); // tx = gx + 0.5 - glm_vec4_floor(tx, tx); // tx = floor(tx) + // tx = floor(gx + 0.5); + vec4 tx; + glm_vec4_adds(gx, 0.5f, tx); // tx = gx + 0.5 + glm_vec4_floor(tx, tx); // tx = floor(tx) - // gx = gx - tx; - glm_vec4_sub(gx, tx, gx); // gx -= tx + // gx = gx - tx; + glm_vec4_sub(gx, tx, gx); // gx -= tx } @@ -432,204 +432,204 @@ _glm_noiseDetail_i2gxy( CGLM_INLINE float glm_perlin_vec4(vec4 point) { - // Integer part of p for indexing - vec4 Pi0; - glm_vec4_floor(point, Pi0); // Pi0 = floor(point); + // Integer part of p for indexing + vec4 Pi0; + glm_vec4_floor(point, Pi0); // Pi0 = floor(point); - // Integer part + 1 - vec4 Pi1; - glm_vec4_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; + // Integer part + 1 + vec4 Pi1; + glm_vec4_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; - _glm_vec4_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); - _glm_vec4_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); + _glm_vec4_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); + _glm_vec4_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); - // Fractional part of p for interpolation - vec4 Pf0; - glm_vec4_fract(point, Pf0); + // Fractional part of p for interpolation + vec4 Pf0; + glm_vec4_fract(point, Pf0); - // Fractional part - 1.0 - vec4 Pf1; - glm_vec4_subs(Pf0, 1.0f, Pf1); + // Fractional part - 1.0 + vec4 Pf1; + glm_vec4_subs(Pf0, 1.0f, Pf1); - vec4 ix = {Pi0[0], Pi1[0], Pi0[0], Pi1[0]}; - vec4 iy = {Pi0[1], Pi0[1], Pi1[1], Pi1[1]}; - vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; // iz0 = vec4(Pi0.z); - vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; // iz1 = vec4(Pi1.z); - vec4 iw0 = {Pi0[3], Pi0[3], Pi0[3], Pi0[3]}; // iw0 = vec4(Pi0.w); - vec4 iw1 = {Pi1[3], Pi1[3], Pi1[3], Pi1[3]}; // iw1 = vec4(Pi1.w); + vec4 ix = {Pi0[0], Pi1[0], Pi0[0], Pi1[0]}; + vec4 iy = {Pi0[1], Pi0[1], Pi1[1], Pi1[1]}; + vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; // iz0 = vec4(Pi0.z); + vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; // iz1 = vec4(Pi1.z); + vec4 iw0 = {Pi0[3], Pi0[3], Pi0[3], Pi0[3]}; // iw0 = vec4(Pi0.w); + vec4 iw1 = {Pi1[3], Pi1[3], Pi1[3], Pi1[3]}; // iw1 = vec4(Pi1.w); - // ------------ + // ------------ - // ixy = permute(permute(ix) + iy) - vec4 ixy; - _glm_noiseDetail_permute(ix, ixy); // ixy = permute(ix) - glm_vec4_add(ixy, iy, ixy); // ixy += iy; - _glm_noiseDetail_permute(ixy, ixy); // ixy = permute(ixy) + // ixy = permute(permute(ix) + iy) + vec4 ixy; + _glm_noiseDetail_permute(ix, ixy); // ixy = permute(ix) + glm_vec4_add(ixy, iy, ixy); // ixy += iy; + _glm_noiseDetail_permute(ixy, ixy); // ixy = permute(ixy) - // ixy0 = permute(ixy + iz0) - vec4 ixy0; - glm_vec4_add(ixy, iz0, ixy0); // ixy0 = ixy + iz0 - _glm_noiseDetail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) + // ixy0 = permute(ixy + iz0) + vec4 ixy0; + glm_vec4_add(ixy, iz0, ixy0); // ixy0 = ixy + iz0 + _glm_noiseDetail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) - // ixy1 = permute(ixy + iz1) - vec4 ixy1; - glm_vec4_add(ixy, iz1, ixy1); // ixy1 = ixy, iz1 - _glm_noiseDetail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) + // ixy1 = permute(ixy + iz1) + vec4 ixy1; + glm_vec4_add(ixy, iz1, ixy1); // ixy1 = ixy, iz1 + _glm_noiseDetail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) - // ixy00 = permute(ixy0 + iw0) - vec4 ixy00; - glm_vec4_add(ixy0, iw0, ixy00); // ixy00 = ixy0 + iw0 - _glm_noiseDetail_permute(ixy00, ixy00); // ixy00 = permute(ixy00) + // ixy00 = permute(ixy0 + iw0) + vec4 ixy00; + glm_vec4_add(ixy0, iw0, ixy00); // ixy00 = ixy0 + iw0 + _glm_noiseDetail_permute(ixy00, ixy00); // ixy00 = permute(ixy00) - // ixy01 = permute(ixy0 + iw1) - vec4 ixy01; - glm_vec4_add(ixy0, iw1, ixy01); // ixy01 = ixy0 + iw1 - _glm_noiseDetail_permute(ixy01, ixy01); // ixy01 = permute(ixy01) + // ixy01 = permute(ixy0 + iw1) + vec4 ixy01; + glm_vec4_add(ixy0, iw1, ixy01); // ixy01 = ixy0 + iw1 + _glm_noiseDetail_permute(ixy01, ixy01); // ixy01 = permute(ixy01) - // ixy10 = permute(ixy1 + iw0) - vec4 ixy10; - glm_vec4_add(ixy1, iw0, ixy10); // ixy10 = ixy1 + iw0 - _glm_noiseDetail_permute(ixy10, ixy10); // ixy10 = permute(ixy10) + // ixy10 = permute(ixy1 + iw0) + vec4 ixy10; + glm_vec4_add(ixy1, iw0, ixy10); // ixy10 = ixy1 + iw0 + _glm_noiseDetail_permute(ixy10, ixy10); // ixy10 = permute(ixy10) - // ixy11 = permute(ixy1 + iw1) - vec4 ixy11; - glm_vec4_add(ixy1, iw1, ixy11); // ixy11 = ixy1 + iw1 - _glm_noiseDetail_permute(ixy11, ixy11); // ixy11 = permute(ixy11) + // ixy11 = permute(ixy1 + iw1) + vec4 ixy11; + glm_vec4_add(ixy1, iw1, ixy11); // ixy11 = ixy1 + iw1 + _glm_noiseDetail_permute(ixy11, ixy11); // ixy11 = permute(ixy11) - // ------------ + // ------------ - vec4 gx00, gy00, gz00, gw00; - _glm_noiseDetail_i2gxyzw(ixy00, gx00, gy00, gz00, gw00); + vec4 gx00, gy00, gz00, gw00; + _glm_noiseDetail_i2gxyzw(ixy00, gx00, gy00, gz00, gw00); - vec4 gx01, gy01, gz01, gw01; - _glm_noiseDetail_i2gxyzw(ixy01, gx01, gy01, gz01, gw01); + vec4 gx01, gy01, gz01, gw01; + _glm_noiseDetail_i2gxyzw(ixy01, gx01, gy01, gz01, gw01); - vec4 gx10, gy10, gz10, gw10; - _glm_noiseDetail_i2gxyzw(ixy10, gx10, gy10, gz10, gw10); + vec4 gx10, gy10, gz10, gw10; + _glm_noiseDetail_i2gxyzw(ixy10, gx10, gy10, gz10, gw10); - vec4 gx11, gy11, gz11, gw11; - _glm_noiseDetail_i2gxyzw(ixy11, gx11, gy11, gz11, gw11); + vec4 gx11, gy11, gz11, gw11; + _glm_noiseDetail_i2gxyzw(ixy11, gx11, gy11, gz11, gw11); - // ------------ + // ------------ - vec4 g0000 = {gx00[0], gy00[0], gz00[0], gw00[0]}; // g0000 = vec4(gx00.x, gy00.x, gz00.x, gw00.x); - vec4 g0100 = {gx00[2], gy00[2], gz00[2], gw00[2]}; // g0100 = vec4(gx00.z, gy00.z, gz00.z, gw00.z); - vec4 g1000 = {gx00[1], gy00[1], gz00[1], gw00[1]}; // g1000 = vec4(gx00.y, gy00.y, gz00.y, gw00.y); - vec4 g1100 = {gx00[3], gy00[3], gz00[3], gw00[3]}; // g1100 = vec4(gx00.w, gy00.w, gz00.w, gw00.w); + vec4 g0000 = {gx00[0], gy00[0], gz00[0], gw00[0]}; // g0000 = vec4(gx00.x, gy00.x, gz00.x, gw00.x); + vec4 g0100 = {gx00[2], gy00[2], gz00[2], gw00[2]}; // g0100 = vec4(gx00.z, gy00.z, gz00.z, gw00.z); + vec4 g1000 = {gx00[1], gy00[1], gz00[1], gw00[1]}; // g1000 = vec4(gx00.y, gy00.y, gz00.y, gw00.y); + vec4 g1100 = {gx00[3], gy00[3], gz00[3], gw00[3]}; // g1100 = vec4(gx00.w, gy00.w, gz00.w, gw00.w); - vec4 g0001 = {gx01[0], gy01[0], gz01[0], gw01[0]}; // g0001 = vec4(gx01.x, gy01.x, gz01.x, gw01.x); - vec4 g0101 = {gx01[2], gy01[2], gz01[2], gw01[2]}; // g0101 = vec4(gx01.z, gy01.z, gz01.z, gw01.z); - vec4 g1001 = {gx01[1], gy01[1], gz01[1], gw01[1]}; // g1001 = vec4(gx01.y, gy01.y, gz01.y, gw01.y); - vec4 g1101 = {gx01[3], gy01[3], gz01[3], gw01[3]}; // g1101 = vec4(gx01.w, gy01.w, gz01.w, gw01.w); + vec4 g0001 = {gx01[0], gy01[0], gz01[0], gw01[0]}; // g0001 = vec4(gx01.x, gy01.x, gz01.x, gw01.x); + vec4 g0101 = {gx01[2], gy01[2], gz01[2], gw01[2]}; // g0101 = vec4(gx01.z, gy01.z, gz01.z, gw01.z); + vec4 g1001 = {gx01[1], gy01[1], gz01[1], gw01[1]}; // g1001 = vec4(gx01.y, gy01.y, gz01.y, gw01.y); + vec4 g1101 = {gx01[3], gy01[3], gz01[3], gw01[3]}; // g1101 = vec4(gx01.w, gy01.w, gz01.w, gw01.w); - vec4 g0010 = {gx10[0], gy10[0], gz10[0], gw10[0]}; // g0010 = vec4(gx10.x, gy10.x, gz10.x, gw10.x); - vec4 g0110 = {gx10[2], gy10[2], gz10[2], gw10[2]}; // g0110 = vec4(gx10.z, gy10.z, gz10.z, gw10.z); - vec4 g1010 = {gx10[1], gy10[1], gz10[1], gw10[1]}; // g1010 = vec4(gx10.y, gy10.y, gz10.y, gw10.y); - vec4 g1110 = {gx10[3], gy10[3], gz10[3], gw10[3]}; // g1110 = vec4(gx10.w, gy10.w, gz10.w, gw10.w); - - vec4 g0011 = {gx11[0], gy11[0], gz11[0], gw11[0]}; // g0011 = vec4(gx11.x, gy11.x, gz11.x, gw11.x); - vec4 g0111 = {gx11[2], gy11[2], gz11[2], gw11[2]}; // g0111 = vec4(gx11.z, gy11.z, gz11.z, gw11.z); - vec4 g1011 = {gx11[1], gy11[1], gz11[1], gw11[1]}; // g1011 = vec4(gx11.y, gy11.y, gz11.y, gw11.y); - vec4 g1111 = {gx11[3], gy11[3], gz11[3], gw11[3]}; // g1111 = vec4(gx11.w, gy11.w, gz11.w, gw11.w); + vec4 g0010 = {gx10[0], gy10[0], gz10[0], gw10[0]}; // g0010 = vec4(gx10.x, gy10.x, gz10.x, gw10.x); + vec4 g0110 = {gx10[2], gy10[2], gz10[2], gw10[2]}; // g0110 = vec4(gx10.z, gy10.z, gz10.z, gw10.z); + vec4 g1010 = {gx10[1], gy10[1], gz10[1], gw10[1]}; // g1010 = vec4(gx10.y, gy10.y, gz10.y, gw10.y); + vec4 g1110 = {gx10[3], gy10[3], gz10[3], gw10[3]}; // g1110 = vec4(gx10.w, gy10.w, gz10.w, gw10.w); + + vec4 g0011 = {gx11[0], gy11[0], gz11[0], gw11[0]}; // g0011 = vec4(gx11.x, gy11.x, gz11.x, gw11.x); + vec4 g0111 = {gx11[2], gy11[2], gz11[2], gw11[2]}; // g0111 = vec4(gx11.z, gy11.z, gz11.z, gw11.z); + vec4 g1011 = {gx11[1], gy11[1], gz11[1], gw11[1]}; // g1011 = vec4(gx11.y, gy11.y, gz11.y, gw11.y); + vec4 g1111 = {gx11[3], gy11[3], gz11[3], gw11[3]}; // g1111 = vec4(gx11.w, gy11.w, gz11.w, gw11.w); - _glm_noiseDetail_gradNorm_vec4(g0000, g0100, g1000, g1100); - _glm_noiseDetail_gradNorm_vec4(g0001, g0101, g1001, g1101); - _glm_noiseDetail_gradNorm_vec4(g0010, g0110, g1010, g1110); - _glm_noiseDetail_gradNorm_vec4(g0011, g0111, g1011, g1111); + _glm_noiseDetail_gradNorm_vec4(g0000, g0100, g1000, g1100); + _glm_noiseDetail_gradNorm_vec4(g0001, g0101, g1001, g1101); + _glm_noiseDetail_gradNorm_vec4(g0010, g0110, g1010, g1110); + _glm_noiseDetail_gradNorm_vec4(g0011, g0111, g1011, g1111); - // ------------ + // ------------ - float n0000 = glm_vec4_dot(g0000, Pf0); // n0000 = dot(g0000, Pf0) + float n0000 = glm_vec4_dot(g0000, Pf0); // n0000 = dot(g0000, Pf0) - // n1000 = dot(g1000, vec4(Pf1.x, Pf0.y, Pf0.z, Pf0.w)) - vec4 n1000d = {Pf1[0], Pf0[1], Pf0[2], Pf0[3]}; - float n1000 = glm_vec4_dot(g1000, n1000d); - - // n0100 = dot(g0100, vec4(Pf0.x, Pf1.y, Pf0.z, Pf0.w)) - vec4 n0100d = {Pf0[0], Pf1[1], Pf0[2], Pf0[3]}; - float n0100 = glm_vec4_dot(g0100, n0100d); - - // n1100 = dot(g1100, vec4(Pf1.x, Pf1.y, Pf0.z, Pf0.w)) - vec4 n1100d = {Pf1[0], Pf1[1], Pf0[2], Pf0[3]}; - float n1100 = glm_vec4_dot(g1100, n1100d); - - // n0010 = dot(g0010, vec4(Pf0.x, Pf0.y, Pf1.z, Pf0.w)) - vec4 n0010d = {Pf0[0], Pf0[1], Pf1[2], Pf0[3]}; - float n0010 = glm_vec4_dot(g0010, n0010d); + // n1000 = dot(g1000, vec4(Pf1.x, Pf0.y, Pf0.z, Pf0.w)) + vec4 n1000d = {Pf1[0], Pf0[1], Pf0[2], Pf0[3]}; + float n1000 = glm_vec4_dot(g1000, n1000d); + + // n0100 = dot(g0100, vec4(Pf0.x, Pf1.y, Pf0.z, Pf0.w)) + vec4 n0100d = {Pf0[0], Pf1[1], Pf0[2], Pf0[3]}; + float n0100 = glm_vec4_dot(g0100, n0100d); + + // n1100 = dot(g1100, vec4(Pf1.x, Pf1.y, Pf0.z, Pf0.w)) + vec4 n1100d = {Pf1[0], Pf1[1], Pf0[2], Pf0[3]}; + float n1100 = glm_vec4_dot(g1100, n1100d); + + // n0010 = dot(g0010, vec4(Pf0.x, Pf0.y, Pf1.z, Pf0.w)) + vec4 n0010d = {Pf0[0], Pf0[1], Pf1[2], Pf0[3]}; + float n0010 = glm_vec4_dot(g0010, n0010d); - // n1010 = dot(g1010, vec4(Pf1.x, Pf0.y, Pf1.z, Pf0.w)) - vec4 n1010d = {Pf1[0], Pf0[1], Pf1[2], Pf0[3]}; - float n1010 = glm_vec4_dot(g1010, n1010d); + // n1010 = dot(g1010, vec4(Pf1.x, Pf0.y, Pf1.z, Pf0.w)) + vec4 n1010d = {Pf1[0], Pf0[1], Pf1[2], Pf0[3]}; + float n1010 = glm_vec4_dot(g1010, n1010d); - // n0110 = dot(g0110, vec4(Pf0.x, Pf1.y, Pf1.z, Pf0.w)) - vec4 n0110d = {Pf0[0], Pf1[1], Pf1[2], Pf0[3]}; - float n0110 = glm_vec4_dot(g0110, n0110d); + // n0110 = dot(g0110, vec4(Pf0.x, Pf1.y, Pf1.z, Pf0.w)) + vec4 n0110d = {Pf0[0], Pf1[1], Pf1[2], Pf0[3]}; + float n0110 = glm_vec4_dot(g0110, n0110d); - // n1110 = dot(g1110, vec4(Pf1.x, Pf1.y, Pf1.z, Pf0.w)) - vec4 n1110d = {Pf1[0], Pf1[1], Pf1[2], Pf0[3]}; - float n1110 = glm_vec4_dot(g1110, n1110d); + // n1110 = dot(g1110, vec4(Pf1.x, Pf1.y, Pf1.z, Pf0.w)) + vec4 n1110d = {Pf1[0], Pf1[1], Pf1[2], Pf0[3]}; + float n1110 = glm_vec4_dot(g1110, n1110d); - // n0001 = dot(g0001, vec4(Pf0.x, Pf0.y, Pf0.z, Pf1.w)) - vec4 n0001d = {Pf0[0], Pf0[1], Pf0[2], Pf1[3]}; - float n0001 = glm_vec4_dot(g0001, n0001d); + // n0001 = dot(g0001, vec4(Pf0.x, Pf0.y, Pf0.z, Pf1.w)) + vec4 n0001d = {Pf0[0], Pf0[1], Pf0[2], Pf1[3]}; + float n0001 = glm_vec4_dot(g0001, n0001d); - // n1001 = dot(g1001, vec4(Pf1.x, Pf0.y, Pf0.z, Pf1.w)) - vec4 n1001d = {Pf1[0], Pf0[1], Pf0[2], Pf1[3]}; - float n1001 = glm_vec4_dot(g1001, n1001d); + // n1001 = dot(g1001, vec4(Pf1.x, Pf0.y, Pf0.z, Pf1.w)) + vec4 n1001d = {Pf1[0], Pf0[1], Pf0[2], Pf1[3]}; + float n1001 = glm_vec4_dot(g1001, n1001d); - // n0101 = dot(g0101, vec4(Pf0.x, Pf1.y, Pf0.z, Pf1.w)) - vec4 n0101d = {Pf0[0], Pf1[1], Pf0[2], Pf1[3]}; - float n0101 = glm_vec4_dot(g0101, n0101d); + // n0101 = dot(g0101, vec4(Pf0.x, Pf1.y, Pf0.z, Pf1.w)) + vec4 n0101d = {Pf0[0], Pf1[1], Pf0[2], Pf1[3]}; + float n0101 = glm_vec4_dot(g0101, n0101d); - // n1101 = dot(g1101, vec4(Pf1.x, Pf1.y, Pf0.z, Pf1.w)) - vec4 n1101d = {Pf1[0], Pf1[1], Pf0[2], Pf1[3]}; - float n1101 = glm_vec4_dot(g1101, n1101d); + // n1101 = dot(g1101, vec4(Pf1.x, Pf1.y, Pf0.z, Pf1.w)) + vec4 n1101d = {Pf1[0], Pf1[1], Pf0[2], Pf1[3]}; + float n1101 = glm_vec4_dot(g1101, n1101d); - // n0011 = dot(g0011, vec4(Pf0.x, Pf0.y, Pf1.z, Pf1.w)) - vec4 n0011d = {Pf0[0], Pf0[1], Pf1[2], Pf1[3]}; - float n0011 = glm_vec4_dot(g0011, n0011d); + // n0011 = dot(g0011, vec4(Pf0.x, Pf0.y, Pf1.z, Pf1.w)) + vec4 n0011d = {Pf0[0], Pf0[1], Pf1[2], Pf1[3]}; + float n0011 = glm_vec4_dot(g0011, n0011d); - // n1011 = dot(g1011, vec4(Pf1.x, Pf0.y, Pf1.z, Pf1.w)) - vec4 n1011d = {Pf1[0], Pf0[1], Pf1[2], Pf1[3]}; - float n1011 = glm_vec4_dot(g1011, n1011d); + // n1011 = dot(g1011, vec4(Pf1.x, Pf0.y, Pf1.z, Pf1.w)) + vec4 n1011d = {Pf1[0], Pf0[1], Pf1[2], Pf1[3]}; + float n1011 = glm_vec4_dot(g1011, n1011d); - // n0111 = dot(g0111, vec4(Pf0.x, Pf1.y, Pf1.z, Pf1.w)) - vec4 n0111d = {Pf0[0], Pf1[1], Pf1[2], Pf1[3]}; - float n0111 = glm_vec4_dot(g0111, n0111d); + // n0111 = dot(g0111, vec4(Pf0.x, Pf1.y, Pf1.z, Pf1.w)) + vec4 n0111d = {Pf0[0], Pf1[1], Pf1[2], Pf1[3]}; + float n0111 = glm_vec4_dot(g0111, n0111d); - float n1111 = glm_vec4_dot(g1111, Pf1); // n1111 = dot(g1111, Pf1) + float n1111 = glm_vec4_dot(g1111, Pf1); // n1111 = dot(g1111, Pf1) - // ------------ + // ------------ - vec4 fade_xyzw; - _glm_noiseDetail_fade_vec4(Pf0, fade_xyzw); // fade_xyzw = fade(Pf0) - - // n_0w = lerp(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w) - vec4 n_0w1 = {n0000, n1000, n0100, n1100}; - vec4 n_0w2 = {n0001, n1001, n0101, n1101}; - vec4 n_0w; - glm_vec4_lerp(n_0w1, n_0w2, fade_xyzw[3], n_0w); - - // n_1w = lerp(vec4(n0010, n1010, n0110, n1110), vec4(n0011, n1011, n0111, n1111), fade_xyzw.w) - vec4 n_1w1 = {n0010, n1010, n0110, n1110}; - vec4 n_1w2 = {n0011, n1011, n0111, n1111}; - vec4 n_1w; - glm_vec4_lerp(n_1w1, n_1w2, fade_xyzw[3], n_1w); - - // n_zw = lerp(n_0w, n_1w, fade_xyzw.z) - vec4 n_zw; - glm_vec4_lerp(n_0w, n_1w, fade_xyzw[2], n_zw); - - // n_yzw = lerp(vec2(n_zw.x, n_zw.y), vec2(n_zw.z, n_zw.w), fade_xyzw.y) - vec2 n_yzw; - vec2 n_yzw1 = {n_zw[0], n_zw[1]}; - vec2 n_yzw2 = {n_zw[2], n_zw[3]}; - glm_vec2_lerp(n_yzw1, n_yzw2, fade_xyzw[1], n_yzw); + vec4 fade_xyzw; + _glm_noiseDetail_fade_vec4(Pf0, fade_xyzw); // fade_xyzw = fade(Pf0) + + // n_0w = lerp(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w) + vec4 n_0w1 = {n0000, n1000, n0100, n1100}; + vec4 n_0w2 = {n0001, n1001, n0101, n1101}; + vec4 n_0w; + glm_vec4_lerp(n_0w1, n_0w2, fade_xyzw[3], n_0w); + + // n_1w = lerp(vec4(n0010, n1010, n0110, n1110), vec4(n0011, n1011, n0111, n1111), fade_xyzw.w) + vec4 n_1w1 = {n0010, n1010, n0110, n1110}; + vec4 n_1w2 = {n0011, n1011, n0111, n1111}; + vec4 n_1w; + glm_vec4_lerp(n_1w1, n_1w2, fade_xyzw[3], n_1w); + + // n_zw = lerp(n_0w, n_1w, fade_xyzw.z) + vec4 n_zw; + glm_vec4_lerp(n_0w, n_1w, fade_xyzw[2], n_zw); + + // n_yzw = lerp(vec2(n_zw.x, n_zw.y), vec2(n_zw.z, n_zw.w), fade_xyzw.y) + vec2 n_yzw; + vec2 n_yzw1 = {n_zw[0], n_zw[1]}; + vec2 n_yzw2 = {n_zw[2], n_zw[3]}; + glm_vec2_lerp(n_yzw1, n_yzw2, fade_xyzw[1], n_yzw); - // n_xyzw = lerp(n_yzw.x, n_yzw.y, fade_xyzw.x) - float n_xyzw = glm_lerp(n_yzw[0], n_yzw[1], fade_xyzw[0]); + // n_xyzw = lerp(n_yzw.x, n_yzw.y, fade_xyzw.x) + float n_xyzw = glm_lerp(n_yzw[0], n_yzw[1], fade_xyzw[0]); - return n_xyzw * 2.2f; + return n_xyzw * 2.2f; } @@ -642,122 +642,122 @@ glm_perlin_vec4(vec4 point) { CGLM_INLINE float glm_perlin_vec3(vec3 point) { - // Integer part of p for indexing - vec3 Pi0; - glm_vec3_floor(point, Pi0); // Pi0 = floor(point); + // Integer part of p for indexing + vec3 Pi0; + glm_vec3_floor(point, Pi0); // Pi0 = floor(point); - // Integer part + 1 - vec3 Pi1; - glm_vec3_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; + // Integer part + 1 + vec3 Pi1; + glm_vec3_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; - _glm_vec3_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); - _glm_vec3_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); + _glm_vec3_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); + _glm_vec3_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); - // Fractional part of p for interpolation - vec3 Pf0; - glm_vec3_fract(point, Pf0); + // Fractional part of p for interpolation + vec3 Pf0; + glm_vec3_fract(point, Pf0); - // Fractional part - 1.0 - vec3 Pf1; - glm_vec3_subs(Pf0, 1.0f, Pf1); + // Fractional part - 1.0 + vec3 Pf1; + glm_vec3_subs(Pf0, 1.0f, Pf1); - vec4 ix = {Pi0[0], Pi1[0], Pi0[0], Pi1[0]}; - vec4 iy = {Pi0[1], Pi0[1], Pi1[1], Pi1[1]}; - vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; // iz0 = vec4(Pi0.z); - vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; // iz1 = vec4(Pi1.z); + vec4 ix = {Pi0[0], Pi1[0], Pi0[0], Pi1[0]}; + vec4 iy = {Pi0[1], Pi0[1], Pi1[1], Pi1[1]}; + vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; // iz0 = vec4(Pi0.z); + vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; // iz1 = vec4(Pi1.z); - // ------------ + // ------------ - // ixy = permute(permute(ix) + iy) - vec4 ixy; - _glm_noiseDetail_permute(ix, ixy); // ixy = permute(ix) - glm_vec4_add(ixy, iy, ixy); // ixy += iy; - _glm_noiseDetail_permute(ixy, ixy); // ixy = permute(ixy) + // ixy = permute(permute(ix) + iy) + vec4 ixy; + _glm_noiseDetail_permute(ix, ixy); // ixy = permute(ix) + glm_vec4_add(ixy, iy, ixy); // ixy += iy; + _glm_noiseDetail_permute(ixy, ixy); // ixy = permute(ixy) - // ixy0 = permute(ixy + iz0) - vec4 ixy0; - glm_vec4_add(ixy, iz0, ixy0); // ixy0 = ixy + iz0 - _glm_noiseDetail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) + // ixy0 = permute(ixy + iz0) + vec4 ixy0; + glm_vec4_add(ixy, iz0, ixy0); // ixy0 = ixy + iz0 + _glm_noiseDetail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) - // ixy1 = permute(ixy + iz1) - vec4 ixy1; - glm_vec4_add(ixy, iz1, ixy1); // ixy1 = ixy, iz1 - _glm_noiseDetail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) + // ixy1 = permute(ixy + iz1) + vec4 ixy1; + glm_vec4_add(ixy, iz1, ixy1); // ixy1 = ixy, iz1 + _glm_noiseDetail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) - // ------------ + // ------------ - vec4 gx0, gy0, gz0; - _glm_noiseDetail_i2gxyz(ixy0, gx0, gy0, gz0); + vec4 gx0, gy0, gz0; + _glm_noiseDetail_i2gxyz(ixy0, gx0, gy0, gz0); - vec4 gx1, gy1, gz1; - _glm_noiseDetail_i2gxyz(ixy1, gx1, gy1, gz1); + vec4 gx1, gy1, gz1; + _glm_noiseDetail_i2gxyz(ixy1, gx1, gy1, gz1); - // ------------ + // ------------ - vec3 g000 = {gx0[0], gy0[0], gz0[0]}; // g000 = vec3(gx0.x, gy0.x, gz0.x); - vec3 g100 = {gx0[1], gy0[1], gz0[1]}; // g100 = vec3(gx0.y, gy0.y, gz0.y); - vec3 g010 = {gx0[2], gy0[2], gz0[2]}; // g010 = vec3(gx0.z, gy0.z, gz0.z); - vec3 g110 = {gx0[3], gy0[3], gz0[3]}; // g110 = vec3(gx0.w, gy0.w, gz0.w); + vec3 g000 = {gx0[0], gy0[0], gz0[0]}; // g000 = vec3(gx0.x, gy0.x, gz0.x); + vec3 g100 = {gx0[1], gy0[1], gz0[1]}; // g100 = vec3(gx0.y, gy0.y, gz0.y); + vec3 g010 = {gx0[2], gy0[2], gz0[2]}; // g010 = vec3(gx0.z, gy0.z, gz0.z); + vec3 g110 = {gx0[3], gy0[3], gz0[3]}; // g110 = vec3(gx0.w, gy0.w, gz0.w); - vec3 g001 = {gx1[0], gy1[0], gz1[0]}; // g001 = vec3(gx1.x, gy1.x, gz1.x); - vec3 g101 = {gx1[1], gy1[1], gz1[1]}; // g101 = vec3(gx1.y, gy1.y, gz1.y); - vec3 g011 = {gx1[2], gy1[2], gz1[2]}; // g011 = vec3(gx1.z, gy1.z, gz1.z); - vec3 g111 = {gx1[3], gy1[3], gz1[3]}; // g111 = vec3(gx1.w, gy1.w, gz1.w); + vec3 g001 = {gx1[0], gy1[0], gz1[0]}; // g001 = vec3(gx1.x, gy1.x, gz1.x); + vec3 g101 = {gx1[1], gy1[1], gz1[1]}; // g101 = vec3(gx1.y, gy1.y, gz1.y); + vec3 g011 = {gx1[2], gy1[2], gz1[2]}; // g011 = vec3(gx1.z, gy1.z, gz1.z); + vec3 g111 = {gx1[3], gy1[3], gz1[3]}; // g111 = vec3(gx1.w, gy1.w, gz1.w); - _glm_noiseDetail_gradNorm_vec3(g000, g100, g010, g110); - _glm_noiseDetail_gradNorm_vec3(g001, g101, g011, g111); + _glm_noiseDetail_gradNorm_vec3(g000, g100, g010, g110); + _glm_noiseDetail_gradNorm_vec3(g001, g101, g011, g111); - // ------------ + // ------------ - float n000 = glm_vec3_dot(g000, Pf0); // n000 = dot(g000, Pf0) + float n000 = glm_vec3_dot(g000, Pf0); // n000 = dot(g000, Pf0) - // n100 = dot(g100, vec3(Pf1.x, Pf0.y, Pf0.z)) - vec3 n100d = {Pf1[0], Pf0[1], Pf0[2]}; - float n100 = glm_vec3_dot(g100, n100d); + // n100 = dot(g100, vec3(Pf1.x, Pf0.y, Pf0.z)) + vec3 n100d = {Pf1[0], Pf0[1], Pf0[2]}; + float n100 = glm_vec3_dot(g100, n100d); - // n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z)) - vec3 n010d = {Pf0[0], Pf1[1], Pf0[2]}; - float n010 = glm_vec3_dot(g010, n010d); + // n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z)) + vec3 n010d = {Pf0[0], Pf1[1], Pf0[2]}; + float n010 = glm_vec3_dot(g010, n010d); - // n110 = dot(g110, vec3(Pf1.x, Pf1.y, Pf0.z)) - vec3 n110d = {Pf1[0], Pf1[1], Pf0[2]}; - float n110 = glm_vec3_dot(g110, n110d); + // n110 = dot(g110, vec3(Pf1.x, Pf1.y, Pf0.z)) + vec3 n110d = {Pf1[0], Pf1[1], Pf0[2]}; + float n110 = glm_vec3_dot(g110, n110d); - // n001 = dot(g001, vec3(Pf0.x, Pf0.y, Pf1.z)) - vec3 n001d = {Pf0[0], Pf0[1], Pf1[2]}; - float n001 = glm_vec3_dot(g001, n001d); + // n001 = dot(g001, vec3(Pf0.x, Pf0.y, Pf1.z)) + vec3 n001d = {Pf0[0], Pf0[1], Pf1[2]}; + float n001 = glm_vec3_dot(g001, n001d); - // n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z)) - vec3 n101d = {Pf1[0], Pf0[1], Pf1[2]}; - float n101 = glm_vec3_dot(g101, n101d); + // n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z)) + vec3 n101d = {Pf1[0], Pf0[1], Pf1[2]}; + float n101 = glm_vec3_dot(g101, n101d); - // n011 = dot(g011, vec3(Pf0.x, Pf1.y, Pf1.z)) - vec3 n011d = {Pf0[0], Pf1[1], Pf1[2]}; - float n011 = glm_vec3_dot(g011, n011d); + // n011 = dot(g011, vec3(Pf0.x, Pf1.y, Pf1.z)) + vec3 n011d = {Pf0[0], Pf1[1], Pf1[2]}; + float n011 = glm_vec3_dot(g011, n011d); - float n111 = glm_vec3_dot(g111, Pf1); // n111 = dot(g111, Pf1) + float n111 = glm_vec3_dot(g111, Pf1); // n111 = dot(g111, Pf1) - // ------------ + // ------------ - vec3 fade_xyz; - _glm_noiseDetail_fade_vec3(Pf0, fade_xyz); // fade_xyz = fade(Pf0) + vec3 fade_xyz; + _glm_noiseDetail_fade_vec3(Pf0, fade_xyz); // fade_xyz = fade(Pf0) - // n_z = lerp(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); - vec4 n_z; - vec4 n_z1 = {n000, n100, n010, n110}; - vec4 n_z2 = {n001, n101, n011, n111}; - glm_vec4_lerp(n_z1, n_z2, fade_xyz[2], n_z); + // n_z = lerp(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); + vec4 n_z; + vec4 n_z1 = {n000, n100, n010, n110}; + vec4 n_z2 = {n001, n101, n011, n111}; + glm_vec4_lerp(n_z1, n_z2, fade_xyz[2], n_z); - // vec2 n_yz = lerp(vec2(n_z.x, n_z.y), vec2(n_z.z, n_z.w), fade_xyz.y); - vec2 n_yz; - vec2 n_yz1 = {n_z[0], n_z[1]}; - vec2 n_yz2 = {n_z[2], n_z[3]}; - glm_vec2_lerp(n_yz1, n_yz2, fade_xyz[1], n_yz); + // vec2 n_yz = lerp(vec2(n_z.x, n_z.y), vec2(n_z.z, n_z.w), fade_xyz.y); + vec2 n_yz; + vec2 n_yz1 = {n_z[0], n_z[1]}; + vec2 n_yz2 = {n_z[2], n_z[3]}; + glm_vec2_lerp(n_yz1, n_yz2, fade_xyz[1], n_yz); - // n_xyz = lerp(n_yz.x, n_yz.y, fade_xyz.x); - float n_xyz = glm_lerp(n_yz[0], n_yz[1], fade_xyz[0]); + // n_xyz = lerp(n_yz.x, n_yz.y, fade_xyz.x); + float n_xyz = glm_lerp(n_yz[0], n_yz[1], fade_xyz[0]); - return n_xyz * 2.2f; + return n_xyz * 2.2f; } /*! @@ -770,85 +770,85 @@ CGLM_INLINE float glm_perlin_vec2(vec2 point) { - // Integer part of p for indexing - // Pi = floor(vec4(point.x, point.y, point.x, point.y)) + vec4(0.0, 0.0, 1.0, 1.0); - vec4 Pi = {point[0], point[1], point[0], point[1]}; // Pi = vec4(point.x, point.y, point.x, point.y) - glm_vec4_floor(Pi, Pi); // Pi = floor(Pi) - Pi[2] += 1.0f; // Pi.z += 1.0 - Pi[3] += 1.0f; // Pi.w += 1.0 + // Integer part of p for indexing + // Pi = floor(vec4(point.x, point.y, point.x, point.y)) + vec4(0.0, 0.0, 1.0, 1.0); + vec4 Pi = {point[0], point[1], point[0], point[1]}; // Pi = vec4(point.x, point.y, point.x, point.y) + glm_vec4_floor(Pi, Pi); // Pi = floor(Pi) + Pi[2] += 1.0f; // Pi.z += 1.0 + Pi[3] += 1.0f; // Pi.w += 1.0 - // Fractional part of p for interpolation - // vec<4, T, Q> Pf = glm::fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); - vec4 Pf = {point[0], point[1], point[0], point[1]}; // Pf = vec4(point.x, point.y, point.x, point.y) - glm_vec4_fract(Pf, Pf); // Pf = fract(Pf) - Pf[2] -= 1.0f; // Pf.z -= 1.0 - Pf[3] -= 1.0f; // Pf.w -= 1.0 + // Fractional part of p for interpolation + // vec<4, T, Q> Pf = glm::fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + vec4 Pf = {point[0], point[1], point[0], point[1]}; // Pf = vec4(point.x, point.y, point.x, point.y) + glm_vec4_fract(Pf, Pf); // Pf = fract(Pf) + Pf[2] -= 1.0f; // Pf.z -= 1.0 + Pf[3] -= 1.0f; // Pf.w -= 1.0 - // Mod to avoid truncation effects in permutation - _glm_vec4_mods(Pi, 289.0f, Pi); // Pi = mod(Pi, 289.0f); + // Mod to avoid truncation effects in permutation + _glm_vec4_mods(Pi, 289.0f, Pi); // Pi = mod(Pi, 289.0f); - vec4 ix = {Pi[0], Pi[2], Pi[0], Pi[2]}; // ix = vec4(Pi.x, Pi.z, Pi.x, Pi.z) - vec4 iy = {Pi[1], Pi[1], Pi[3], Pi[3]}; // iy = vec4(Pi.y, Pi.y, Pi.w, Pi.w) - vec4 fx = {Pf[0], Pf[2], Pf[0], Pf[2]}; // fx = vec4(Pf.x, Pf.z, Pf.x, Pf.z) - vec4 fy = {Pf[1], Pf[1], Pf[3], Pf[3]}; // fy = vec4(Pf.y, Pf.y, Pf.w, Pf.w) + vec4 ix = {Pi[0], Pi[2], Pi[0], Pi[2]}; // ix = vec4(Pi.x, Pi.z, Pi.x, Pi.z) + vec4 iy = {Pi[1], Pi[1], Pi[3], Pi[3]}; // iy = vec4(Pi.y, Pi.y, Pi.w, Pi.w) + vec4 fx = {Pf[0], Pf[2], Pf[0], Pf[2]}; // fx = vec4(Pf.x, Pf.z, Pf.x, Pf.z) + vec4 fy = {Pf[1], Pf[1], Pf[3], Pf[3]}; // fy = vec4(Pf.y, Pf.y, Pf.w, Pf.w) - // ------------ + // ------------ - // i = permute(permute(ix) + iy); - vec4 i; - _glm_noiseDetail_permute(ix, i); // i = permute(ix) - glm_vec4_add(i, iy, i); // i += iy; - _glm_noiseDetail_permute(i, i); // i = permute(i) + // i = permute(permute(ix) + iy); + vec4 i; + _glm_noiseDetail_permute(ix, i); // i = permute(ix) + glm_vec4_add(i, iy, i); // i += iy; + _glm_noiseDetail_permute(i, i); // i = permute(i) - // ------------ + // ------------ - vec4 gx, gy; - _glm_noiseDetail_i2gxy(i, gx, gy); + vec4 gx, gy; + _glm_noiseDetail_i2gxy(i, gx, gy); - // ------------ + // ------------ - vec2 g00 = {gx[0], gy[0]}; // g00 = vec2(gx.x, gy.x) - vec2 g10 = {gx[1], gy[1]}; // g10 = vec2(gx.y, gy.y) - vec2 g01 = {gx[2], gy[2]}; // g01 = vec2(gx.z, gy.z) - vec2 g11 = {gx[3], gy[3]}; // g11 = vec2(gx.w, gy.w) + vec2 g00 = {gx[0], gy[0]}; // g00 = vec2(gx.x, gy.x) + vec2 g10 = {gx[1], gy[1]}; // g10 = vec2(gx.y, gy.y) + vec2 g01 = {gx[2], gy[2]}; // g01 = vec2(gx.z, gy.z) + vec2 g11 = {gx[3], gy[3]}; // g11 = vec2(gx.w, gy.w) - _glm_noiseDetail_gradNorm_vec2(g00, g10, g01, g11); + _glm_noiseDetail_gradNorm_vec2(g00, g10, g01, g11); - // ------------ + // ------------ - // n00 = dot(g00, vec2(fx.x, fy.x)) - vec2 n00d = {fx[0], fy[0]}; // n00d = vec2(fx.x, fy.x) - float n00 = glm_vec2_dot(g00, n00d); // n00 = dot(g00, n00d) + // n00 = dot(g00, vec2(fx.x, fy.x)) + vec2 n00d = {fx[0], fy[0]}; // n00d = vec2(fx.x, fy.x) + float n00 = glm_vec2_dot(g00, n00d); // n00 = dot(g00, n00d) - // n10 = dot(g10, vec2(fx.y, fy.y)) - vec2 n10d = {fx[1], fy[1]}; // n10d = vec2(fx.y, fy.y) - float n10 = glm_vec2_dot(g10, n10d); // n10 = dot(g10, n10d) + // n10 = dot(g10, vec2(fx.y, fy.y)) + vec2 n10d = {fx[1], fy[1]}; // n10d = vec2(fx.y, fy.y) + float n10 = glm_vec2_dot(g10, n10d); // n10 = dot(g10, n10d) - // n01 = dot(g01, vec2(fx.z, fy.z)) - vec2 n01d = {fx[2], fy[2]}; // n01d = vec2(fx.z, fy.z) - float n01 = glm_vec2_dot(g01, n01d); // n01 = dot(g01, n01d) + // n01 = dot(g01, vec2(fx.z, fy.z)) + vec2 n01d = {fx[2], fy[2]}; // n01d = vec2(fx.z, fy.z) + float n01 = glm_vec2_dot(g01, n01d); // n01 = dot(g01, n01d) - // n11 = dot(g11, vec2(fx.w, fy.w)) - vec2 n11d = {fx[3], fy[3]}; // n11d = vec2(fx.w, fy.w) - float n11 = glm_vec2_dot(g11, n11d); // n11 = dot(g11, n11d) + // n11 = dot(g11, vec2(fx.w, fy.w)) + vec2 n11d = {fx[3], fy[3]}; // n11d = vec2(fx.w, fy.w) + float n11 = glm_vec2_dot(g11, n11d); // n11 = dot(g11, n11d) - // ------------ + // ------------ - // fade_xyz = fade(vec2(Pf.x, Pf.y)) - vec2 fade_xy = {Pf[0], Pf[1]}; // fade_xy = vec2(Pf.x, Pf.y) - _glm_noiseDetail_fade_vec2(fade_xy, fade_xy); // fade_xy = fade(fade_xy) + // fade_xyz = fade(vec2(Pf.x, Pf.y)) + vec2 fade_xy = {Pf[0], Pf[1]}; // fade_xy = vec2(Pf.x, Pf.y) + _glm_noiseDetail_fade_vec2(fade_xy, fade_xy); // fade_xy = fade(fade_xy) - // n_x = lerp(vec2(n00, n01), vec2(n10, n11), fade_xy.x); - vec2 n_x; - vec2 n_x1 = {n00, n01}; // n_x1 = vec2(n00, n01) - vec2 n_x2 = {n10, n11}; // n_x2 = vec2(n10, n11) - glm_vec2_lerp(n_x1, n_x2, fade_xy[0], n_x); // n_x = lerp(n_x1, n_x2, fade_xy.x) + // n_x = lerp(vec2(n00, n01), vec2(n10, n11), fade_xy.x); + vec2 n_x; + vec2 n_x1 = {n00, n01}; // n_x1 = vec2(n00, n01) + vec2 n_x2 = {n10, n11}; // n_x2 = vec2(n10, n11) + glm_vec2_lerp(n_x1, n_x2, fade_xy[0], n_x); // n_x = lerp(n_x1, n_x2, fade_xy.x) - // T n_xy = mix(n_x.x, n_x.y, fade_xy.y); - // n_xy = lerp(n_x.x, n_x.y, fade_xy.y); - float n_xy = glm_lerp(n_x[0], n_x[1], fade_xy[1]); + // T n_xy = mix(n_x.x, n_x.y, fade_xy.y); + // n_xy = lerp(n_x.x, n_x.y, fade_xy.y); + float n_xy = glm_lerp(n_x[0], n_x[1], fade_xy[1]); - return n_xy * 2.3f; + return n_xy * 2.3f; } From 66d51e57719c1f0dfde5cd4643faab08ab42b55b Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 13:18:12 +0000 Subject: [PATCH 070/128] double spaces in other files --- include/cglm/vec2-ext.h | 4 ++-- include/cglm/vec3-ext.h | 6 +++--- include/cglm/vec4-ext.h | 8 ++++---- src/noise.c | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/cglm/vec2-ext.h b/include/cglm/vec2-ext.h index a0631f4..3aeac97 100644 --- a/include/cglm/vec2-ext.h +++ b/include/cglm/vec2-ext.h @@ -222,8 +222,8 @@ glm_vec2_fract(vec2 v, vec2 dest) { CGLM_INLINE void glm_vec2_floor(vec2 x, vec2 dest) { - dest[0] = floorf(x[0]); - dest[1] = floorf(x[1]); + dest[0] = floorf(x[0]); + dest[1] = floorf(x[1]); } /*! diff --git a/include/cglm/vec3-ext.h b/include/cglm/vec3-ext.h index a1ce049..d374659 100644 --- a/include/cglm/vec3-ext.h +++ b/include/cglm/vec3-ext.h @@ -260,9 +260,9 @@ glm_vec3_fract(vec3 v, vec3 dest) { CGLM_INLINE void glm_vec3_floor(vec3 x, vec3 dest) { - dest[0] = floorf(x[0]); - dest[1] = floorf(x[1]); - dest[2] = floorf(x[2]); + dest[0] = floorf(x[0]); + dest[1] = floorf(x[1]); + dest[2] = floorf(x[2]); } /*! diff --git a/include/cglm/vec4-ext.h b/include/cglm/vec4-ext.h index 997bfd9..6e56171 100644 --- a/include/cglm/vec4-ext.h +++ b/include/cglm/vec4-ext.h @@ -297,10 +297,10 @@ glm_vec4_fract(vec4 v, vec4 dest) { CGLM_INLINE void glm_vec4_floor(vec4 x, vec4 dest) { - dest[0] = floorf(x[0]); - dest[1] = floorf(x[1]); - dest[2] = floorf(x[2]); - dest[3] = floorf(x[3]); + dest[0] = floorf(x[0]); + dest[1] = floorf(x[1]); + dest[2] = floorf(x[2]); + dest[3] = floorf(x[3]); } /*! diff --git a/src/noise.c b/src/noise.c index 70a8f3c..f464202 100644 --- a/src/noise.c +++ b/src/noise.c @@ -11,17 +11,17 @@ CGLM_EXPORT float glmc_perlin_vec4(vec4 p) { - return glm_perlin_vec4(p); + return glm_perlin_vec4(p); } CGLM_EXPORT float glmc_perlin_vec3(vec3 p) { - return glm_perlin_vec3(p); + return glm_perlin_vec3(p); } CGLM_EXPORT float glmc_perlin_vec2(vec2 p) { - return glm_perlin_vec2(p); + return glm_perlin_vec2(p); } \ No newline at end of file From 35af0c04fecef111a90470bc552def38230e04b3 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 13:18:27 +0000 Subject: [PATCH 071/128] remove extra spaces from vec3.h and vec4.h --- include/cglm/call/vec3.h | 26 +++++++++++++------------- include/cglm/call/vec4.h | 34 +++++++++++++++++----------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index 89a9e4e..4f6e21d 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -55,7 +55,7 @@ glmc_vec3_norm(vec3 v); CGLM_EXPORT float glmc_vec3_norm2(vec3 v); - + CGLM_EXPORT float glmc_vec3_norm_one(vec3 v); @@ -211,15 +211,15 @@ glmc_vec3_clamp(vec3 v, float minVal, float maxVal); CGLM_EXPORT void glmc_vec3_ortho(vec3 v, vec3 dest); - + CGLM_EXPORT void glmc_vec3_lerp(vec3 from, vec3 to, float t, vec3 dest); - + CGLM_EXPORT void glmc_vec3_lerpc(vec3 from, vec3 to, float t, vec3 dest); - + CGLM_INLINE void glmc_vec3_mix(vec3 from, vec3 to, float t, vec3 dest) { @@ -231,27 +231,27 @@ void glmc_vec3_mixc(vec3 from, vec3 to, float t, vec3 dest) { glmc_vec3_lerpc(from, to, t, dest); } - + CGLM_EXPORT void glmc_vec3_step_uni(float edge, vec3 x, vec3 dest); - + CGLM_EXPORT void glmc_vec3_step(vec3 edge, vec3 x, vec3 dest); - + CGLM_EXPORT void glmc_vec3_smoothstep_uni(float edge0, float edge1, vec3 x, vec3 dest); - + CGLM_EXPORT void glmc_vec3_smoothstep(vec3 edge0, vec3 edge1, vec3 x, vec3 dest); - + CGLM_EXPORT void glmc_vec3_smoothinterp(vec3 from, vec3 to, float t, vec3 dest); - + CGLM_EXPORT void glmc_vec3_smoothinterpc(vec3 from, vec3 to, float t, vec3 dest); @@ -265,7 +265,7 @@ glmc_vec3_mulv(vec3 a, vec3 b, vec3 d); CGLM_EXPORT void glmc_vec3_broadcast(float val, vec3 d); - + CGLM_EXPORT void glmc_vec3_fill(vec3 v, float val); @@ -313,11 +313,11 @@ glmc_vec3_isvalid(vec3 v); CGLM_EXPORT void glmc_vec3_sign(vec3 v, vec3 dest); - + CGLM_EXPORT void glmc_vec3_abs(vec3 v, vec3 dest); - + CGLM_EXPORT void glmc_vec3_fract(vec3 v, vec3 dest); diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index 5c19b2b..657e8c0 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -56,7 +56,7 @@ glmc_vec4_norm(vec4 v); CGLM_EXPORT float glmc_vec4_norm2(vec4 v); - + CGLM_EXPORT float glmc_vec4_norm_one(vec4 v); @@ -164,11 +164,11 @@ glmc_vec4_negate(vec4 v); CGLM_EXPORT void glmc_vec4_negate_to(vec4 v, vec4 dest); - + CGLM_EXPORT float glmc_vec4_distance(vec4 a, vec4 b); - + CGLM_EXPORT float glmc_vec4_distance2(vec4 a, vec4 b); @@ -184,15 +184,15 @@ glmc_vec4_minv(vec4 a, vec4 b, vec4 dest); CGLM_EXPORT void glmc_vec4_clamp(vec4 v, float minVal, float maxVal); - + CGLM_EXPORT void glmc_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest); - + CGLM_EXPORT void glmc_vec4_lerpc(vec4 from, vec4 to, float t, vec4 dest); - + CGLM_INLINE void glmc_vec4_mix(vec4 from, vec4 to, float t, vec4 dest) { @@ -204,27 +204,27 @@ void glmc_vec4_mixc(vec4 from, vec4 to, float t, vec4 dest) { glmc_vec4_lerpc(from, to, t, dest); } - + CGLM_EXPORT void glmc_vec4_step_uni(float edge, vec4 x, vec4 dest); - + CGLM_EXPORT void glmc_vec4_step(vec4 edge, vec4 x, vec4 dest); - + CGLM_EXPORT void glmc_vec4_smoothstep_uni(float edge0, float edge1, vec4 x, vec4 dest); - + CGLM_EXPORT void glmc_vec4_smoothstep(vec4 edge0, vec4 edge1, vec4 x, vec4 dest); - + CGLM_EXPORT void glmc_vec4_smoothinterp(vec4 from, vec4 to, float t, vec4 dest); - + CGLM_EXPORT void glmc_vec4_smoothinterpc(vec4 from, vec4 to, float t, vec4 dest); @@ -242,7 +242,7 @@ glmc_vec4_mulv(vec4 a, vec4 b, vec4 d); CGLM_EXPORT void glmc_vec4_broadcast(float val, vec4 d); - + CGLM_EXPORT void glmc_vec4_fill(vec4 v, float val); @@ -290,19 +290,19 @@ glmc_vec4_isvalid(vec4 v); CGLM_EXPORT void glmc_vec4_sign(vec4 v, vec4 dest); - + CGLM_EXPORT void glmc_vec4_abs(vec4 v, vec4 dest); - + CGLM_EXPORT void glmc_vec4_fract(vec4 v, vec4 dest); - + CGLM_EXPORT void glmc_vec4_floor(vec4 v, vec4 dest); - + CGLM_EXPORT float glmc_vec4_hadd(vec4 v); From 0483362f5ca29e16ca7957f56bc49245c1addd0a Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 16:47:07 +0000 Subject: [PATCH 072/128] move mods to ext --- include/cglm/noise.h | 42 +++++------------------------------------ include/cglm/vec2-ext.h | 15 +++++++++++++++ include/cglm/vec3-ext.h | 16 ++++++++++++++++ include/cglm/vec4-ext.h | 17 +++++++++++++++++ 4 files changed, 53 insertions(+), 37 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index 621a74a..f687b6e 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -28,38 +28,6 @@ ////////////////////////////// // Proposed vec4_ext functions -/*! - * @brief mod v by a scalar, result is written to dest (dest = v % s) - * - * @param[in] v vector - * @param[in] s scalar - * @param[out] dest destination vector - */ -CGLM_INLINE -void -_glm_vec4_mods(vec4 x, float y, vec4 dest) { - dest[0] = fmodf(x[0], y); - dest[1] = fmodf(x[1], y); - dest[2] = fmodf(x[2], y); - dest[3] = fmodf(x[3], y); -} - -/*! - * @brief mod v by a scalar, result is written to dest (dest = v % s) - * - * @param[in] v vector - * @param[in] s scalar - * @param[out] dest destination vector - */ -CGLM_INLINE -void -_glm_vec3_mods(vec3 x, float y, vec3 dest) { - dest[0] = fmodf(x[0], y); - dest[1] = fmodf(x[1], y); - dest[2] = fmodf(x[2], y); -} - - /*! * @brief threshold function with scalar * @@ -440,8 +408,8 @@ glm_perlin_vec4(vec4 point) { vec4 Pi1; glm_vec4_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; - _glm_vec4_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); - _glm_vec4_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); + glm_vec4_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); + glm_vec4_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); // Fractional part of p for interpolation vec4 Pf0; @@ -650,8 +618,8 @@ glm_perlin_vec3(vec3 point) { vec3 Pi1; glm_vec3_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; - _glm_vec3_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); - _glm_vec3_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); + glm_vec3_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); + glm_vec3_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); // Fractional part of p for interpolation vec3 Pf0; @@ -785,7 +753,7 @@ glm_perlin_vec2(vec2 point) { Pf[3] -= 1.0f; // Pf.w -= 1.0 // Mod to avoid truncation effects in permutation - _glm_vec4_mods(Pi, 289.0f, Pi); // Pi = mod(Pi, 289.0f); + glm_vec4_mods(Pi, 289.0f, Pi); // Pi = mod(Pi, 289.0f); vec4 ix = {Pi[0], Pi[2], Pi[0], Pi[2]}; // ix = vec4(Pi.x, Pi.z, Pi.x, Pi.z) vec4 iy = {Pi[1], Pi[1], Pi[3], Pi[3]}; // iy = vec4(Pi.y, Pi.y, Pi.w, Pi.w) diff --git a/include/cglm/vec2-ext.h b/include/cglm/vec2-ext.h index 3aeac97..0f80c67 100644 --- a/include/cglm/vec2-ext.h +++ b/include/cglm/vec2-ext.h @@ -22,6 +22,7 @@ CGLM_INLINE void glm_vec2_abs(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_fract(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_floor(vec2 v, vec2 dest); + CGLM_INLINE float glm_vec2_mods(vec2 v, float s, vec2 dest); CGLM_INLINE void glm_vec2_sqrt(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) CGLM_INLINE void glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) @@ -226,6 +227,20 @@ glm_vec2_floor(vec2 x, vec2 dest) { dest[1] = floorf(x[1]); } +/*! + * @brief mod of each vector item, result is written to dest (dest = v % s) + * + * @param[in] v vector + * @param[in] s scalar + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec2_mods(vec2 x, float y, vec2 dest) { + dest[0] = fmodf(x[0], y); + dest[1] = fmodf(x[1], y); +} + /*! * @brief square root of each vector item * diff --git a/include/cglm/vec3-ext.h b/include/cglm/vec3-ext.h index d374659..cb8cc49 100644 --- a/include/cglm/vec3-ext.h +++ b/include/cglm/vec3-ext.h @@ -27,6 +27,7 @@ CGLM_INLINE void glm_vec3_abs(vec3 v, vec3 dest); CGLM_INLINE void glm_vec3_fract(vec3 v, vec3 dest); CGLM_INLINE void glm_vec3_floor(vec3 v, vec3 dest); + CGLM_INLINE float glm_vec3_mods(vec3 v, float s, vec3 dest); CGLM_INLINE float glm_vec3_hadd(vec3 v); CGLM_INLINE void glm_vec3_sqrt(vec3 v, vec3 dest); */ @@ -265,6 +266,21 @@ glm_vec3_floor(vec3 x, vec3 dest) { dest[2] = floorf(x[2]); } +/*! + * @brief mod of each vector item, result is written to dest (dest = v % s) + * + * @param[in] v vector + * @param[in] s scalar + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec3_mods(vec3 x, float y, vec3 dest) { + dest[0] = fmodf(x[0], y); + dest[1] = fmodf(x[1], y); + dest[2] = fmodf(x[2], y); +} + /*! * @brief vector reduction by summation * @warning could overflow diff --git a/include/cglm/vec4-ext.h b/include/cglm/vec4-ext.h index 6e56171..e19ac6c 100644 --- a/include/cglm/vec4-ext.h +++ b/include/cglm/vec4-ext.h @@ -26,6 +26,7 @@ CGLM_INLINE void glm_vec4_sign(vec4 v, vec4 dest); CGLM_INLINE void glm_vec4_abs(vec4 v, vec4 dest); CGLM_INLINE void glm_vec4_fract(vec4 v, vec4 dest); + CGLM_INLINE float glm_vec4_mods(vec4 v, float val); CGLM_INLINE float glm_vec4_hadd(vec4 v); CGLM_INLINE void glm_vec4_sqrt(vec4 v, vec4 dest); */ @@ -303,6 +304,22 @@ glm_vec4_floor(vec4 x, vec4 dest) { dest[3] = floorf(x[3]); } +/*! + * @brief mod of each vector item, result is written to dest (dest = v % s) + * + * @param[in] v vector + * @param[in] s scalar + * @param[out] dest destination vector + */ +CGLM_INLINE +void +glm_vec4_mods(vec4 x, float y, vec4 dest) { + dest[0] = fmodf(x[0], y); + dest[1] = fmodf(x[1], y); + dest[2] = fmodf(x[2], y); + dest[3] = fmodf(x[3], y); +} + /*! * @brief vector reduction by summation * @warning could overflow From fbf0014c8218566de476826619698bd6abf9d497 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 16:47:20 +0000 Subject: [PATCH 073/128] missing vec4_floor doc --- include/cglm/vec4-ext.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/cglm/vec4-ext.h b/include/cglm/vec4-ext.h index e19ac6c..b303106 100644 --- a/include/cglm/vec4-ext.h +++ b/include/cglm/vec4-ext.h @@ -26,6 +26,7 @@ CGLM_INLINE void glm_vec4_sign(vec4 v, vec4 dest); CGLM_INLINE void glm_vec4_abs(vec4 v, vec4 dest); CGLM_INLINE void glm_vec4_fract(vec4 v, vec4 dest); + CGLM_INLINE void glm_vec4_floor(vec4 v, vec4 dest); CGLM_INLINE float glm_vec4_mods(vec4 v, float val); CGLM_INLINE float glm_vec4_hadd(vec4 v); CGLM_INLINE void glm_vec4_sqrt(vec4 v, vec4 dest); From e14c730d5c9ef63163d64f9635452a77f4c60c84 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 16:47:35 +0000 Subject: [PATCH 074/128] mods boilerplate --- include/cglm/call/vec2.h | 4 ++++ include/cglm/call/vec3.h | 4 ++++ include/cglm/call/vec4.h | 4 ++++ include/cglm/struct/vec2-ext.h | 15 +++++++++++++++ include/cglm/struct/vec3-ext.h | 15 +++++++++++++++ include/cglm/struct/vec4-ext.h | 15 +++++++++++++++ src/vec2.c | 6 ++++++ src/vec3.c | 6 ++++++ src/vec4.c | 6 ++++++ 9 files changed, 75 insertions(+) diff --git a/include/cglm/call/vec2.h b/include/cglm/call/vec2.h index 2fe5076..413d261 100644 --- a/include/cglm/call/vec2.h +++ b/include/cglm/call/vec2.h @@ -197,6 +197,10 @@ CGLM_EXPORT void glmc_vec2_floor(vec2 v, vec2 dest); +CGLM_EXPORT +void +glmc_vec2_mods(vec2 v, float s, vec2 dest); + CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest); diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index 4f6e21d..660e464 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -326,6 +326,10 @@ CGLM_EXPORT void glmc_vec3_floor(vec3 v, vec3 dest); +CGLM_EXPORT +void +glmc_vec3_mods(vec3 v, float s, vec3 dest); + CGLM_EXPORT float glmc_vec3_hadd(vec3 v); diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index 657e8c0..c756700 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -303,6 +303,10 @@ CGLM_EXPORT void glmc_vec4_floor(vec4 v, vec4 dest); +CGLM_EXPORT +void +glmc_vec4_mods(vec4 v, float s, vec4 dest); + CGLM_EXPORT float glmc_vec4_hadd(vec4 v); diff --git a/include/cglm/struct/vec2-ext.h b/include/cglm/struct/vec2-ext.h index 907fa99..d1bf953 100644 --- a/include/cglm/struct/vec2-ext.h +++ b/include/cglm/struct/vec2-ext.h @@ -229,6 +229,21 @@ glms_vec2_(floor)(vec2s v) { return r; } +/*! + * @brief mod of each vector item by scalar + * + * @param[in] v vector + * @param[in] s scalar + * @returns destination vector + */ +CGLM_INLINE +vec2s +glms_vec2_(mods)(vec2s v, float s) { + vec2s r; + glm_vec2_mods(v.raw, s, r.raw); + return r; +} + /*! * @brief square root of each vector item * diff --git a/include/cglm/struct/vec3-ext.h b/include/cglm/struct/vec3-ext.h index f9ce728..bdaa42c 100644 --- a/include/cglm/struct/vec3-ext.h +++ b/include/cglm/struct/vec3-ext.h @@ -245,6 +245,21 @@ glms_vec3_(floor)(vec3s v) { return r; } +/*! + * @brief mod of each vector item by scalar + * + * @param[in] v vector + * @param[in] s scalar + * @returns destination vector + */ +CGLM_INLINE +vec3s +glms_vec3_(mods)(vec3s v, float s) { + vec3s r; + glm_vec3_mods(v.raw, s, r.raw); + return r; +} + /*! * @brief vector reduction by summation * @warning could overflow diff --git a/include/cglm/struct/vec4-ext.h b/include/cglm/struct/vec4-ext.h index 07e73a1..c6dd983 100644 --- a/include/cglm/struct/vec4-ext.h +++ b/include/cglm/struct/vec4-ext.h @@ -245,6 +245,21 @@ glms_vec4_(floor)(vec4s v) { return r; } +/*! + * @brief mod of each vector item by scalar + * + * @param[in] v vector + * @param[in] s scalar + * @returns destination vector + */ +CGLM_INLINE +vec4s +glms_vec4_(mods)(vec4s v, float s) { + vec4s r; + glm_vec4_mods(v.raw, s, r.raw); + return r; +} + /*! * @brief vector reduction by summation * @warning could overflow diff --git a/src/vec2.c b/src/vec2.c index 93742a0..f7b0b5a 100644 --- a/src/vec2.c +++ b/src/vec2.c @@ -285,6 +285,12 @@ glmc_vec2_floor(vec2 v, vec2 dest) { glm_vec2_floor(v, dest); } +CGLM_EXPORT +void +glmc_vec2_mods(vec2 v, float s, vec2 dest) { + glm_vec2_mods(v, s, dest); +} + CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) { diff --git a/src/vec3.c b/src/vec3.c index 8427236..2901580 100644 --- a/src/vec3.c +++ b/src/vec3.c @@ -448,6 +448,12 @@ glmc_vec3_floor(vec3 v, vec3 dest) { glm_vec3_floor(v, dest); } +CGLM_EXPORT +void +glmc_vec3_mods(vec3 v, float s, vec3 dest) { + glm_vec3_mods(v, s, dest); +} + CGLM_EXPORT float glmc_vec3_hadd(vec3 v) { diff --git a/src/vec4.c b/src/vec4.c index 0cf4ed9..7d5e052 100644 --- a/src/vec4.c +++ b/src/vec4.c @@ -412,6 +412,12 @@ glmc_vec4_floor(vec4 v, vec4 dest) { glm_vec4_floor(v, dest); } +CGLM_EXPORT +void +glmc_vec4_mods(vec4 v, float s, vec4 dest) { + glm_vec4_mods(v, s, dest); +} + CGLM_EXPORT float glmc_vec4_hadd(vec4 v) { From 32e7d5cceb3477df62c0dd7a8a9961eee7433e65 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 16:52:23 +0000 Subject: [PATCH 075/128] mods test --- test/src/test_vec2.h | 22 ++++++++++++++++++++++ test/src/test_vec3.h | 23 +++++++++++++++++++++++ test/src/test_vec4.h | 25 +++++++++++++++++++++++++ test/tests.h | 12 ++++++++++++ 4 files changed, 82 insertions(+) diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index f94fab3..949e30e 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -714,6 +714,28 @@ TEST_IMPL(GLM_PREFIX, vec2_floor) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, vec2_mods) { + vec2 v1 = {2.104f, 3.012f}, v2 = {12.35f, 31.140f}, v3, v4; + vec2 v5 = {0.104f, 0.012f}, v6 = {0.35f, 0.140f}; + + /* Mod 1 - leaves just the fractional part */ + GLM(vec2_mods)(v1, 1.0f, v3); + GLM(vec2_mods)(v2, 1.0f, v4); + + ASSERTIFY(test_assert_vec2_eq(v3, v5)) + ASSERTIFY(test_assert_vec2_eq(v4, v6)) + + /* Mod 2 - parity + fractional part */ + GLM(vec2_mods)(v1, 2.0f, v3); + GLM(vec2_mods)(v2, 2.0f, v4); + + vec2 v7 = {0.104f, 1.012f}, v8 = {0.35f, 1.140f}; + + ASSERTIFY(test_assert_vec2_eq(v3, v7)) + ASSERTIFY(test_assert_vec2_eq(v4, v8)) + + TEST_SUCCESS +} TEST_IMPL(GLM_PREFIX, vec2_lerp) { vec2 v1 = {-100.0f, -200.0f}; diff --git a/test/src/test_vec3.h b/test/src/test_vec3.h index b3fdb51..ac25c33 100644 --- a/test/src/test_vec3.h +++ b/test/src/test_vec3.h @@ -1839,6 +1839,29 @@ TEST_IMPL(GLM_PREFIX, vec3_floor) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, vec3_mods) { + vec3 v1 = {2.104f, 3.012f, 4.10f}, v2 = {12.35f, 31.140f, 43.502f}, v3, v4; + vec3 v5 = {0.104f, 0.012f, 0.10f}, v6 = {0.35f, 0.140f, 0.502f}; + + /* Mod 1 - leaves just the fractional part */ + GLM(vec3_mods)(v1, 1.0f, v3); + GLM(vec3_mods)(v2, 1.0f, v4); + + ASSERTIFY(test_assert_vec3_eq(v3, v5)) + ASSERTIFY(test_assert_vec3_eq(v4, v6)) + + /* Mod 2 - parity + fractional part */ + GLM(vec3_mods)(v1, 2.0f, v3); + GLM(vec3_mods)(v2, 2.0f, v4); + + vec3 v7 = {0.104f, 1.012f, 0.10f}, v8 = {0.35f, 1.140f, 1.502f}; + + ASSERTIFY(test_assert_vec3_eq(v3, v7)) + ASSERTIFY(test_assert_vec3_eq(v4, v8)) + + TEST_SUCCESS +} + TEST_IMPL(GLM_PREFIX, vec3_hadd) { vec3 v1 = {2.0f, 3.0f, 4.0f}, v2 = {12.0f, 31.0f, 43.0f}; float r1, r2, r3, r4; diff --git a/test/src/test_vec4.h b/test/src/test_vec4.h index e7ad793..ce4b1a4 100644 --- a/test/src/test_vec4.h +++ b/test/src/test_vec4.h @@ -1506,6 +1506,31 @@ TEST_IMPL(GLM_PREFIX, vec4_floor) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, vec4_mods) { + vec4 v1 = {2.104f, 3.012f, 4.10f, 5.78f}, v2 = {12.35f, 31.140f, 43.502f, 198.999f}; + vec4 v3, v4; + vec4 v5 = {0.104f, 0.012f, 0.10f, 0.78f}, v6 = {0.35f, 0.140f, 0.502f, 0.999f}; + + /* Mod 1 - leaves just the fractional part */ + GLM(vec4_mods)(v1, 1.0f, v3); + GLM(vec4_mods)(v2, 1.0f, v4); + + ASSERTIFY(test_assert_vec4_eq(v3, v5)) + ASSERTIFY(test_assert_vec4_eq(v4, v6)) + + /* Mod 2 - parity + fractional part */ + GLM(vec4_mods)(v1, 2.0f, v3); + GLM(vec4_mods)(v2, 2.0f, v4); + + vec4 v7 = {0.104f, 1.012f, 0.10f, 1.78f}, v8 = {0.35f, 1.140f, 1.502f, 0.999f}; + + ASSERTIFY(test_assert_vec4_eq(v3, v7)) + ASSERTIFY(test_assert_vec4_eq(v4, v8)) + + TEST_SUCCESS +} + + TEST_IMPL(GLM_PREFIX, vec4_hadd) { vec4 v1 = {2.0f, 3.0f, 4.0f, 4.0f}, v2 = {12.0f, 31.0f, 43.0f, 43.0f}; float r1, r2, r3, r4; diff --git a/test/tests.h b/test/tests.h index e9bf439..9106ba6 100644 --- a/test/tests.h +++ b/test/tests.h @@ -541,6 +541,7 @@ TEST_DECLARE(glm_vec2_clamp) TEST_DECLARE(glm_vec2_abs) TEST_DECLARE(glm_vec2_fract) TEST_DECLARE(glm_vec2_floor) +TEST_DECLARE(glm_vec2_mods) TEST_DECLARE(glm_vec2_lerp) TEST_DECLARE(glm_vec2_complex_mul) TEST_DECLARE(glm_vec2_complex_div) @@ -591,6 +592,7 @@ TEST_DECLARE(glmc_vec2_clamp) TEST_DECLARE(glmc_vec2_abs) TEST_DECLARE(glmc_vec2_fract) TEST_DECLARE(glmc_vec2_floor) +TEST_DECLARE(glmc_vec2_mods) TEST_DECLARE(glmc_vec2_lerp) TEST_DECLARE(glmc_vec2_complex_mul) TEST_DECLARE(glmc_vec2_complex_div) @@ -697,6 +699,7 @@ TEST_DECLARE(glm_vec3_sign) TEST_DECLARE(glm_vec3_abs) TEST_DECLARE(glm_vec3_fract) TEST_DECLARE(glm_vec3_floor) +TEST_DECLARE(glm_vec3_mods) TEST_DECLARE(glm_vec3_hadd) TEST_DECLARE(glm_vec3_sqrt) TEST_DECLARE(glm_vec3_make) @@ -776,6 +779,7 @@ TEST_DECLARE(glmc_vec3_isvalid) TEST_DECLARE(glmc_vec3_sign) TEST_DECLARE(glmc_vec3_abs) TEST_DECLARE(glmc_vec3_fract) +TEST_DECLARE(glmc_vec3_mods) TEST_DECLARE(glmc_vec3_hadd) TEST_DECLARE(glmc_vec3_sqrt) TEST_DECLARE(glmc_vec3_make) @@ -868,6 +872,7 @@ TEST_DECLARE(glm_vec4_sign) TEST_DECLARE(glm_vec4_abs) TEST_DECLARE(glm_vec4_fract) TEST_DECLARE(glm_vec4_floor) +TEST_DECLARE(glm_vec4_mods) TEST_DECLARE(glm_vec4_hadd) TEST_DECLARE(glm_vec4_sqrt) TEST_DECLARE(glm_vec4_make) @@ -943,6 +948,7 @@ TEST_DECLARE(glmc_vec4_sign) TEST_DECLARE(glmc_vec4_abs) TEST_DECLARE(glmc_vec4_fract) TEST_DECLARE(glmc_vec4_floor) +TEST_DECLARE(glmc_vec4_mods) TEST_DECLARE(glmc_vec4_hadd) TEST_DECLARE(glmc_vec4_sqrt) TEST_DECLARE(glmc_vec4_make) @@ -1734,6 +1740,7 @@ TEST_LIST { TEST_ENTRY(glm_vec2_abs) TEST_ENTRY(glm_vec2_fract) TEST_ENTRY(glm_vec2_floor) + TEST_ENTRY(glm_vec2_mods) TEST_ENTRY(glm_vec2_lerp) TEST_ENTRY(glm_vec2_complex_mul) TEST_ENTRY(glm_vec2_complex_div) @@ -1784,6 +1791,7 @@ TEST_LIST { TEST_ENTRY(glmc_vec2_abs) TEST_ENTRY(glmc_vec2_fract) TEST_ENTRY(glmc_vec2_floor) + TEST_ENTRY(glmc_vec2_mods) TEST_ENTRY(glmc_vec2_lerp) TEST_ENTRY(glmc_vec2_complex_mul) TEST_ENTRY(glmc_vec2_complex_div) @@ -1889,6 +1897,7 @@ TEST_LIST { TEST_ENTRY(glm_vec3_abs) TEST_ENTRY(glm_vec3_fract) TEST_ENTRY(glm_vec3_floor) + TEST_ENTRY(glm_vec3_mods) TEST_ENTRY(glm_vec3_hadd) TEST_ENTRY(glm_vec3_sqrt) TEST_ENTRY(glm_vec3_make) @@ -1968,6 +1977,7 @@ TEST_LIST { TEST_ENTRY(glmc_vec3_sign) TEST_ENTRY(glmc_vec3_abs) TEST_ENTRY(glmc_vec3_fract) + TEST_ENTRY(glmc_vec3_mods) TEST_ENTRY(glmc_vec3_hadd) TEST_ENTRY(glmc_vec3_sqrt) TEST_ENTRY(glmc_vec3_make) @@ -2060,6 +2070,7 @@ TEST_LIST { TEST_ENTRY(glm_vec4_abs) TEST_ENTRY(glm_vec4_fract) TEST_ENTRY(glm_vec4_floor) + TEST_ENTRY(glm_vec4_mods) TEST_ENTRY(glm_vec4_hadd) TEST_ENTRY(glm_vec4_sqrt) TEST_ENTRY(glm_vec4_make) @@ -2135,6 +2146,7 @@ TEST_LIST { TEST_ENTRY(glmc_vec4_abs) TEST_ENTRY(glmc_vec4_fract) TEST_ENTRY(glmc_vec4_floor) + TEST_ENTRY(glmc_vec4_mods) TEST_ENTRY(glmc_vec4_hadd) TEST_ENTRY(glmc_vec4_sqrt) TEST_ENTRY(glmc_vec4_make) From a986a4d7419ff554e6d14d52c41624080e2a3b5a Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 16:52:31 +0000 Subject: [PATCH 076/128] add missing floor tests --- test/tests.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/tests.h b/test/tests.h index 9106ba6..6ceadf9 100644 --- a/test/tests.h +++ b/test/tests.h @@ -779,6 +779,7 @@ TEST_DECLARE(glmc_vec3_isvalid) TEST_DECLARE(glmc_vec3_sign) TEST_DECLARE(glmc_vec3_abs) TEST_DECLARE(glmc_vec3_fract) +TEST_DECLARE(glmc_vec3_floor) TEST_DECLARE(glmc_vec3_mods) TEST_DECLARE(glmc_vec3_hadd) TEST_DECLARE(glmc_vec3_sqrt) @@ -1977,6 +1978,7 @@ TEST_LIST { TEST_ENTRY(glmc_vec3_sign) TEST_ENTRY(glmc_vec3_abs) TEST_ENTRY(glmc_vec3_fract) + TEST_ENTRY(glmc_vec3_floor) TEST_ENTRY(glmc_vec3_mods) TEST_ENTRY(glmc_vec3_hadd) TEST_ENTRY(glmc_vec3_sqrt) From 6620adcc16d51e9068f04e6da09941addcd1422c Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 16:52:55 +0000 Subject: [PATCH 077/128] fix invalid types in vec2_frac/floor --- test/src/test_vec2.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index 949e30e..8aab10a 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -689,8 +689,8 @@ TEST_IMPL(GLM_PREFIX, vec2_abs) { } TEST_IMPL(GLM_PREFIX, vec2_fract) { - vec3 v1 = {2.104f, 3.012f}, v2 = {12.35f, 31.140f}, v3, v4; - vec3 v5 = {0.104f, 0.012f}, v6 = {0.35f, 0.140f}; + vec2 v1 = {2.104f, 3.012f}, v2 = {12.35f, 31.140f}, v3, v4; + vec2 v5 = {0.104f, 0.012f}, v6 = {0.35f, 0.140f}; GLM(vec2_fract)(v1, v3); GLM(vec2_fract)(v2, v4); @@ -702,8 +702,8 @@ TEST_IMPL(GLM_PREFIX, vec2_fract) { } TEST_IMPL(GLM_PREFIX, vec2_floor) { - vec3 v1 = {2.104f, 3.012f}, v2 = {12.35f, 31.140f}, v3, v4; - vec3 v5 = {2.0f, 3.0f}, v6 = {12.0f, 31.0f}; + vec2 v1 = {2.104f, 3.012f}, v2 = {12.35f, 31.140f}, v3, v4; + vec2 v5 = {2.0f, 3.0f}, v6 = {12.0f, 31.0f}; GLM(vec2_floor)(v1, v3); GLM(vec2_floor)(v2, v4); From 0e0eff71ce2d0cb23ef520fa9bd9ab38a5a1e436 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 16:53:11 +0000 Subject: [PATCH 078/128] correct vec4_mods doc --- include/cglm/vec4-ext.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/cglm/vec4-ext.h b/include/cglm/vec4-ext.h index b303106..965d3d1 100644 --- a/include/cglm/vec4-ext.h +++ b/include/cglm/vec4-ext.h @@ -27,7 +27,7 @@ CGLM_INLINE void glm_vec4_abs(vec4 v, vec4 dest); CGLM_INLINE void glm_vec4_fract(vec4 v, vec4 dest); CGLM_INLINE void glm_vec4_floor(vec4 v, vec4 dest); - CGLM_INLINE float glm_vec4_mods(vec4 v, float val); + CGLM_INLINE float glm_vec4_mods(vec4 v, float s, vec4 dest); CGLM_INLINE float glm_vec4_hadd(vec4 v); CGLM_INLINE void glm_vec4_sqrt(vec4 v, vec4 dest); */ From c2ebef38670d1ed7b67845b40c723bd61f900a24 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:05:24 +0000 Subject: [PATCH 079/128] change steps -> stepr and move to ext --- include/cglm/noise.h | 35 ++--------------------------------- include/cglm/vec2-ext.h | 32 ++++++++++++++++++++++++++++++++ include/cglm/vec3-ext.h | 34 ++++++++++++++++++++++++++++++++++ include/cglm/vec4-ext.h | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 33 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index f687b6e..64e8e22 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -28,37 +28,6 @@ ////////////////////////////// // Proposed vec4_ext functions -/*! - * @brief threshold function with scalar - * - * @param[in] edge threshold - * @param[in] x value to test against threshold - * @param[out] dest destination - */ -CGLM_INLINE -void -_glm_vec4_steps(vec4 edge, float x, vec4 dest) { - dest[0] = glm_step(edge[0], x); - dest[1] = glm_step(edge[1], x); - dest[2] = glm_step(edge[2], x); - dest[3] = glm_step(edge[3], x); -} - -/*! - * @brief threshold function with scalar - * - * @param[in] edge threshold - * @param[in] x value to test against threshold - * @param[out] dest destination - */ -CGLM_INLINE -void -_glm_vec3_steps(vec3 edge, float x, vec3 dest) { - dest[0] = glm_step(edge[0], x); - dest[1] = glm_step(edge[1], x); - dest[2] = glm_step(edge[2], x); -} - /*! * @brief set all elements of dest to value * @@ -281,7 +250,7 @@ _glm_noiseDetail_i2gxyzw( // sw = step(gw, 0.0); vec4 sw; - _glm_vec4_steps(gw, 0.0f, sw); // sw = step(gw, 0.0) + glm_vec4_stepr(gw, 0.0f, sw); // sw = step(gw, 0.0) // gx -= sw * (step(vec4(0), gx) - T(0.5)); vec4 temp = {0.0f}; // temp = 0.0 @@ -337,7 +306,7 @@ _glm_noiseDetail_i2gxyz( // sz = step(gw, 0.0); vec4 sz; - _glm_vec4_steps(gz, 0.0f, sz); // sz = step(gz, 0.0) + glm_vec4_stepr(gz, 0.0f, sz); // sz = step(gz, 0.0) // gx0 -= sz0 * (step(0.0, gx0) - T(0.5)); vec4 temp = {0.0f}; // temp = 0.0 diff --git a/include/cglm/vec2-ext.h b/include/cglm/vec2-ext.h index 0f80c67..4322618 100644 --- a/include/cglm/vec2-ext.h +++ b/include/cglm/vec2-ext.h @@ -23,6 +23,8 @@ CGLM_INLINE void glm_vec2_fract(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_floor(vec2 v, vec2 dest); CGLM_INLINE float glm_vec2_mods(vec2 v, float s, vec2 dest); + CGLM_INLINE float glm_vec2_steps(float edge, vec2 v, vec2 dest); + CGLM_INLINE void glm_vec2_stepr(vec2 edge, float v, vec2 dest); CGLM_INLINE void glm_vec2_sqrt(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) CGLM_INLINE void glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) @@ -271,6 +273,36 @@ glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) { dest[1] = ti; } +/*! + * @brief threshold each vector item with scalar + * condition is: (x[i] < edge) ? 0.0 : 1.0 + * + * @param[in] edge threshold + * @param[in] x vector to test against threshold + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec2_steps(float edge, vec2 x, vec2 dest) { + dest[0] = glm_step(edge, x[0]); + dest[1] = glm_step(edge, x[1]); +} + +/*! + * @brief threshold a value with *vector* as the threshold + * condition is: (x < edge[i]) ? 0.0 : 1.0 + * + * @param[in] edge threshold vector + * @param[in] x value to test against threshold + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec2_stepr(vec2 edge, float x, vec2 dest) { + dest[0] = glm_step(edge[0], x); + dest[1] = glm_step(edge[1], x); +} + /*! * @brief treat vectors as complex numbers and divide them as such. * diff --git a/include/cglm/vec3-ext.h b/include/cglm/vec3-ext.h index cb8cc49..6b8c041 100644 --- a/include/cglm/vec3-ext.h +++ b/include/cglm/vec3-ext.h @@ -28,6 +28,8 @@ CGLM_INLINE void glm_vec3_fract(vec3 v, vec3 dest); CGLM_INLINE void glm_vec3_floor(vec3 v, vec3 dest); CGLM_INLINE float glm_vec3_mods(vec3 v, float s, vec3 dest); + CGLM_INLINE float glm_vec3_steps(float edge, vec3 v, vec3 dest); + CGLM_INLINE void glm_vec3_stepr(vec3 edge, float v, vec3 dest); CGLM_INLINE float glm_vec3_hadd(vec3 v); CGLM_INLINE void glm_vec3_sqrt(vec3 v, vec3 dest); */ @@ -281,6 +283,38 @@ glm_vec3_mods(vec3 x, float y, vec3 dest) { dest[2] = fmodf(x[2], y); } +/*! + * @brief threshold each vector item with scalar + * condition is: (x[i] < edge) ? 0.0 : 1.0 + * + * @param[in] edge threshold + * @param[in] x vector to test against threshold + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec3_steps(float edge, vec3 x, vec3 dest) { + dest[0] = glm_step(edge, x[0]); + dest[1] = glm_step(edge, x[1]); + dest[2] = glm_step(edge, x[2]); +} + +/*! + * @brief threshold a value with *vector* as the threshold + * condition is: (x < edge[i]) ? 0.0 : 1.0 + * + * @param[in] edge threshold vector + * @param[in] x value to test against threshold + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec3_stepr(vec3 edge, float x, vec3 dest) { + dest[0] = glm_step(edge[0], x); + dest[1] = glm_step(edge[1], x); + dest[2] = glm_step(edge[2], x); +} + /*! * @brief vector reduction by summation * @warning could overflow diff --git a/include/cglm/vec4-ext.h b/include/cglm/vec4-ext.h index 965d3d1..1f03eea 100644 --- a/include/cglm/vec4-ext.h +++ b/include/cglm/vec4-ext.h @@ -28,6 +28,8 @@ CGLM_INLINE void glm_vec4_fract(vec4 v, vec4 dest); CGLM_INLINE void glm_vec4_floor(vec4 v, vec4 dest); CGLM_INLINE float glm_vec4_mods(vec4 v, float s, vec4 dest); + CGLM_INLINE float glm_vec4_steps(float edge, vec4 v, vec4 dest); + CGLM_INLINE void glm_vec4_stepr(vec4 edge, float v, vec4 dest); CGLM_INLINE float glm_vec4_hadd(vec4 v); CGLM_INLINE void glm_vec4_sqrt(vec4 v, vec4 dest); */ @@ -321,6 +323,40 @@ glm_vec4_mods(vec4 x, float y, vec4 dest) { dest[3] = fmodf(x[3], y); } +/*! + * @brief threshold each vector item with scalar + * condition is: (x[i] < edge) ? 0.0 : 1.0 + * + * @param[in] edge threshold + * @param[in] x vector to test against threshold + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec4_steps(float edge, vec4 x, vec4 dest) { + dest[0] = glm_step(edge, x[0]); + dest[1] = glm_step(edge, x[1]); + dest[2] = glm_step(edge, x[2]); + dest[3] = glm_step(edge, x[3]); +} + +/*! + * @brief threshold a value with *vector* as the threshold + * condition is: (x < edge[i]) ? 0.0 : 1.0 + * + * @param[in] edge threshold vector + * @param[in] x value to test against threshold + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec4_stepr(vec4 edge, float x, vec4 dest) { + dest[0] = glm_step(edge[0], x); + dest[1] = glm_step(edge[1], x); + dest[2] = glm_step(edge[2], x); + dest[3] = glm_step(edge[3], x); +} + /*! * @brief vector reduction by summation * @warning could overflow From 9a1206f3f15ae6956eeeccef237385ab0762bc0d Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:08:34 +0000 Subject: [PATCH 080/128] steps and stepr boilerplate --- include/cglm/call/vec2.h | 8 ++++++++ include/cglm/call/vec3.h | 8 ++++++++ include/cglm/call/vec4.h | 8 ++++++++ include/cglm/struct/vec2-ext.h | 34 ++++++++++++++++++++++++++++++++++ include/cglm/struct/vec3-ext.h | 34 ++++++++++++++++++++++++++++++++++ include/cglm/struct/vec4-ext.h | 34 ++++++++++++++++++++++++++++++++++ src/vec2.c | 12 ++++++++++++ 7 files changed, 138 insertions(+) diff --git a/include/cglm/call/vec2.h b/include/cglm/call/vec2.h index 413d261..a0c32ce 100644 --- a/include/cglm/call/vec2.h +++ b/include/cglm/call/vec2.h @@ -205,6 +205,14 @@ CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest); +CGLM_EXPORT +void +glmc_vec2_steps(float edge, vec2 x, vec2 dest); + +CGLM_EXPORT +void +glmc_vec2_stepr(vec2 edge, float x, vec2 dest); + CGLM_EXPORT void glmc_vec2_complex_mul(vec2 a, vec2 b, vec2 dest); diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index 660e464..70aa1ab 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -330,6 +330,14 @@ CGLM_EXPORT void glmc_vec3_mods(vec3 v, float s, vec3 dest); +CGLM_EXPORT +void +glmc_vec3_steps(float edge, vec3 x, vec3 dest); + +CGLM_EXPORT +void +glmc_vec3_stepr(vec3 edge, float x, vec3 dest); + CGLM_EXPORT float glmc_vec3_hadd(vec3 v); diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index c756700..cf00cc0 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -307,6 +307,14 @@ CGLM_EXPORT void glmc_vec4_mods(vec4 v, float s, vec4 dest); +CGLM_EXPORT +void +glmc_vec4_steps(float edge, vec4 x, vec4 dest); + +CGLM_EXPORT +void +glmc_vec4_stepr(vec4 edge, float x, vec4 dest); + CGLM_EXPORT float glmc_vec4_hadd(vec4 v); diff --git a/include/cglm/struct/vec2-ext.h b/include/cglm/struct/vec2-ext.h index d1bf953..7825538 100644 --- a/include/cglm/struct/vec2-ext.h +++ b/include/cglm/struct/vec2-ext.h @@ -26,6 +26,8 @@ CGLM_INLINE vec2s glms_vec2_abs(vec2s v) CGLM_INLINE vec2s glms_vec2_fract(vec2s v) CGLM_INLINE vec2s glms_vec2_floor(vec2s v) + CGLM_INLINE vec2s glms_vec2_steps(float edge, vec2s v) + CGLM_INLINE vec2s glms_vec2_stepr(vec2s edge, float v) CGLM_INLINE vec2s glms_vec2_sqrt(vec2s v) */ @@ -244,6 +246,38 @@ glms_vec2_(mods)(vec2s v, float s) { return r; } +/*! + * @brief threshold each vector item with scalar + * condition is: (x[i] < edge) ? 0.0 : 1.0 + * + * @param[in] edge threshold + * @param[in] x vector to test against threshold + * @returns destination + */ +CGLM_INLINE +vec2s +glms_vec2_(steps)(float edge, vec2s x) { + vec2s r; + glm_vec2_steps(edge, x.raw, r.raw); + return r; +} + +/*! + * @brief threshold a value with *vector* as the threshold + * condition is: (x < edge[i]) ? 0.0 : 1.0 + * + * @param[in] edge threshold vector + * @param[in] x value to test against threshold + * @returns destination + */ +CGLM_INLINE +vec2s +glms_vec2_(stepr)(vec2s edge, float x) { + vec2s r; + glm_vec2_stepr(edge.raw, x, r.raw); + return r; +} + /*! * @brief square root of each vector item * diff --git a/include/cglm/struct/vec3-ext.h b/include/cglm/struct/vec3-ext.h index bdaa42c..66a987a 100644 --- a/include/cglm/struct/vec3-ext.h +++ b/include/cglm/struct/vec3-ext.h @@ -27,6 +27,8 @@ CGLM_INLINE vec3s glms_vec3_abs(vec3s v); CGLM_INLINE vec3s glms_vec3_fract(vec3s v); CGLM_INLINE vec3s glms_vec3_floor(vec3s v); + CGLM_INLINE vec3s glms_vec3_steps(float edge, vec3s v); + CGLM_INLINE vec3s glms_vec3_stepr(vec3s edge, float v); CGLM_INLINE float glms_vec3_hadd(vec3s v); CGLM_INLINE vec3s glms_vec3_sqrt(vec3s v); */ @@ -260,6 +262,38 @@ glms_vec3_(mods)(vec3s v, float s) { return r; } +/*! + * @brief threshold each vector item with scalar + * condition is: (x[i] < edge) ? 0.0 : 1.0 + * + * @param[in] edge threshold + * @param[in] x vector to test against threshold + * @returns destination + */ +CGLM_INLINE +vec3s +glms_vec3_(steps)(float edge, vec3s x) { + vec3s r; + glm_vec3_steps(edge, x.raw, r.raw); + return r; +} + +/*! + * @brief threshold a value with *vector* as the threshold + * condition is: (x < edge[i]) ? 0.0 : 1.0 + * + * @param[in] edge threshold vector + * @param[in] x value to test against threshold + * @returns destination + */ +CGLM_INLINE +vec3s +glms_vec3_(stepr)(vec3s edge, float x) { + vec3s r; + glm_vec3_stepr(edge.raw, x, r.raw); + return r; +} + /*! * @brief vector reduction by summation * @warning could overflow diff --git a/include/cglm/struct/vec4-ext.h b/include/cglm/struct/vec4-ext.h index c6dd983..3b61431 100644 --- a/include/cglm/struct/vec4-ext.h +++ b/include/cglm/struct/vec4-ext.h @@ -27,6 +27,8 @@ CGLM_INLINE vec4s glms_vec4_abs(vec4s v); CGLM_INLINE vec4s glms_vec4_fract(vec4s v); CGLM_INLINE float glms_vec4_floor(vec4s v); + CGLM_INLINE float glms_vec4_steps(float edge, vec4s v); + CGLM_INLINE void glms_vec4_stepr(vec4s edge, float v); CGLM_INLINE float glms_vec4_hadd(vec4s v); CGLM_INLINE vec4s glms_vec4_sqrt(vec4s v); */ @@ -260,6 +262,38 @@ glms_vec4_(mods)(vec4s v, float s) { return r; } +/*! + * @brief threshold each vector item with scalar + * condition is: (x[i] < edge) ? 0.0 : 1.0 + * + * @param[in] edge threshold + * @param[in] x vector to test against threshold + * @returns destination + */ +CGLM_INLINE +vec4s +glms_vec4_(steps)(float edge, vec4s x) { + vec4s r; + glm_vec4_steps(edge, x.raw, r.raw); + return r; +} + +/*! + * @brief threshold a value with *vector* as the threshold + * condition is: (x < edge[i]) ? 0.0 : 1.0 + * + * @param[in] edge threshold vector + * @param[in] x value to test against threshold + * @returns destination + */ +CGLM_INLINE +vec4s +glms_vec4_(stepr)(vec4s edge, float x) { + vec4s r; + glm_vec4_stepr(edge.raw, x, r.raw); + return r; +} + /*! * @brief vector reduction by summation * @warning could overflow diff --git a/src/vec2.c b/src/vec2.c index f7b0b5a..079992d 100644 --- a/src/vec2.c +++ b/src/vec2.c @@ -291,6 +291,18 @@ glmc_vec2_mods(vec2 v, float s, vec2 dest) { glm_vec2_mods(v, s, dest); } +CGLM_EXPORT +void +glmc_vec2_step(vec2 edge, vec2 v, vec2 dest) { + glm_vec2_step(edge, v, dest); +} + +CGLM_EXPORT +void +glmc_vec2_steps(float edge, vec2 v, vec2 dest) { + glm_vec2_steps(edge, v, dest); +} + CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) { From 4ca0c536af5d3a4aa513d44a707b91088f66d245 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:09:53 +0000 Subject: [PATCH 081/128] steps and stepr test --- test/src/test_vec2.h | 37 ++++++++++++++++++++++++++++++++++++ test/src/test_vec3.h | 30 +++++++++++++++++++++++++---- test/src/test_vec4.h | 45 ++++++++++++++++++++++++++++++++++++++++---- test/tests.h | 32 +++++++++++++++++++++++-------- 4 files changed, 128 insertions(+), 16 deletions(-) diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index 8aab10a..7b8d94d 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -753,6 +753,43 @@ TEST_IMPL(GLM_PREFIX, vec2_lerp) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, vec2_steps) { + vec2 v1 = {-100.0f, -200.0f}; + vec2 v2; + + GLM(vec2_steps)(-2.5f, v1, v2); + ASSERT(test_eq(v2[0], 0.0f)) + ASSERT(test_eq(v2[1], 0.0f)) + + GLM(vec2_steps)(-150.0f, v1, v2); + ASSERT(test_eq(v2[0], 1.0f)) + ASSERT(test_eq(v2[1], 0.0f)) + + GLM(vec2_steps)(-300.0f, v1, v2); + ASSERT(test_eq(v2[0], 1.0f)) + ASSERT(test_eq(v2[1], 1.0f)) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec2_stepr) { + vec2 v1 = {-2.5f, -150.0f}; + vec2 v2; + + GLM(vec2_stepr)(v1, -200.0f, v2); + ASSERT(test_eq(v2[0], 0.0f)) + ASSERT(test_eq(v2[1], 0.0f)) + + GLM(vec2_stepr)(v1, -150.0f, v2); + ASSERT(test_eq(v2[0], 0.0f)) + ASSERT(test_eq(v2[1], 1.0f)) + + GLM(vec2_stepr)(v1, 0.0f, v2); + ASSERT(test_eq(v2[0], 1.0f)) + ASSERT(test_eq(v2[1], 1.0f)) + + TEST_SUCCESS +} TEST_IMPL(GLM_PREFIX, vec2_complex_mul) { vec2 v1 = { 3.0f, 5.0f }, v2 = { 7.0f, 11.0f }, diff --git a/test/src/test_vec3.h b/test/src/test_vec3.h index ac25c33..2e0f8a0 100644 --- a/test/src/test_vec3.h +++ b/test/src/test_vec3.h @@ -1393,21 +1393,43 @@ TEST_IMPL(GLM_PREFIX, vec3_mixc) { TEST_SUCCESS } -TEST_IMPL(GLM_PREFIX, vec3_step_uni) { +TEST_IMPL(GLM_PREFIX, vec3_steps) { vec3 v1 = {-100.0f, -200.0f, -10.0f}; vec3 v2; - GLM(vec3_step_uni)(-2.5f, v1, v2); + GLM(vec3_steps)(-2.5f, v1, v2); ASSERT(test_eq(v2[0], 0.0f)) ASSERT(test_eq(v2[1], 0.0f)) ASSERT(test_eq(v2[2], 0.0f)) - GLM(vec3_step_uni)(-10.0f, v1, v2); + GLM(vec3_steps)(-10.0f, v1, v2); ASSERT(test_eq(v2[0], 0.0f)) ASSERT(test_eq(v2[1], 0.0f)) ASSERT(test_eq(v2[2], 1.0f)) - GLM(vec3_step_uni)(-1000.0f, v1, v2); + GLM(vec3_steps)(-1000.0f, v1, v2); + ASSERT(test_eq(v2[0], 1.0f)) + ASSERT(test_eq(v2[1], 1.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec3_stepr) { + vec3 v1 = {-2.5f, -10.0f, -1000.0f}; + vec3 v2; + + GLM(vec3_stepr)(v1, -100.0f, v2); + ASSERT(test_eq(v2[0], 0.0f)) + ASSERT(test_eq(v2[1], 0.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + GLM(vec3_stepr)(v1, -5.0f, v2); + ASSERT(test_eq(v2[0], 0.0f)) + ASSERT(test_eq(v2[1], 1.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + GLM(vec3_stepr)(v1, -1.0f, v2); ASSERT(test_eq(v2[0], 1.0f)) ASSERT(test_eq(v2[1], 1.0f)) ASSERT(test_eq(v2[2], 1.0f)) diff --git a/test/src/test_vec4.h b/test/src/test_vec4.h index ce4b1a4..4e87b72 100644 --- a/test/src/test_vec4.h +++ b/test/src/test_vec4.h @@ -980,23 +980,60 @@ TEST_IMPL(GLM_PREFIX, vec4_mixc) { TEST_SUCCESS } -TEST_IMPL(GLM_PREFIX, vec4_step_uni) { +TEST_IMPL(GLM_PREFIX, vec4_steps) { vec4 v1 = {-100.0f, -200.0f, -10.0f, -10.0f}; vec4 v2; - GLM(vec4_step_uni)(-2.5f, v1, v2); + GLM(vec4_steps)(-2.5f, v1, v2); ASSERT(test_eq(v2[0], 0.0f)) ASSERT(test_eq(v2[1], 0.0f)) ASSERT(test_eq(v2[2], 0.0f)) ASSERT(test_eq(v2[3], 0.0f)) - GLM(vec4_step_uni)(-10.0f, v1, v2); + GLM(vec4_steps)(-10.0f, v1, v2); ASSERT(test_eq(v2[0], 0.0f)) ASSERT(test_eq(v2[1], 0.0f)) ASSERT(test_eq(v2[2], 1.0f)) ASSERT(test_eq(v2[3], 1.0f)) - GLM(vec4_step_uni)(-1000.0f, v1, v2); + GLM(vec4_steps)(-1000.0f, v1, v2); + ASSERT(test_eq(v2[0], 1.0f)) + ASSERT(test_eq(v2[1], 1.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + ASSERT(test_eq(v2[3], 1.0f)) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec4_stepr) { + vec4 v1 = {-2.5f, -100.0f, -200.0f, -300.0f}; + vec4 v2; + + GLM(vec4_stepr)(v1, -1000.0f, v2); + ASSERT(test_eq(v2[0], 0.0f)) + ASSERT(test_eq(v2[1], 0.0f)) + ASSERT(test_eq(v2[2], 0.0f)) + ASSERT(test_eq(v2[3], 0.0f)) + + GLM(vec4_stepr)(v1, -250.0f, v2); + ASSERT(test_eq(v2[0], 0.0f)) + ASSERT(test_eq(v2[1], 0.0f)) + ASSERT(test_eq(v2[2], 0.0f)) + ASSERT(test_eq(v2[3], 1.0f)) + + GLM(vec4_stepr)(v1, -150.0f, v2); + ASSERT(test_eq(v2[0], 0.0f)) + ASSERT(test_eq(v2[1], 0.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + ASSERT(test_eq(v2[3], 1.0f)) + + GLM(vec4_stepr)(v1, -10.0f, v2); + ASSERT(test_eq(v2[0], 0.0f)) + ASSERT(test_eq(v2[1], 1.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + ASSERT(test_eq(v2[3], 1.0f)) + + GLM(vec4_stepr)(v1, 0.0f, v2); ASSERT(test_eq(v2[0], 1.0f)) ASSERT(test_eq(v2[1], 1.0f)) ASSERT(test_eq(v2[2], 1.0f)) diff --git a/test/tests.h b/test/tests.h index 6ceadf9..3059c0d 100644 --- a/test/tests.h +++ b/test/tests.h @@ -542,6 +542,8 @@ TEST_DECLARE(glm_vec2_abs) TEST_DECLARE(glm_vec2_fract) TEST_DECLARE(glm_vec2_floor) TEST_DECLARE(glm_vec2_mods) +TEST_DECLARE(glm_vec2_steps) +TEST_DECLARE(glm_vec2_stepr) TEST_DECLARE(glm_vec2_lerp) TEST_DECLARE(glm_vec2_complex_mul) TEST_DECLARE(glm_vec2_complex_div) @@ -593,6 +595,8 @@ TEST_DECLARE(glmc_vec2_abs) TEST_DECLARE(glmc_vec2_fract) TEST_DECLARE(glmc_vec2_floor) TEST_DECLARE(glmc_vec2_mods) +TEST_DECLARE(glmc_vec2_steps) +TEST_DECLARE(glmc_vec2_stepr) TEST_DECLARE(glmc_vec2_lerp) TEST_DECLARE(glmc_vec2_complex_mul) TEST_DECLARE(glmc_vec2_complex_div) @@ -676,7 +680,6 @@ TEST_DECLARE(glm_vec3_ortho) TEST_DECLARE(glm_vec3_clamp) TEST_DECLARE(glm_vec3_mix) TEST_DECLARE(glm_vec3_mixc) -TEST_DECLARE(glm_vec3_step_uni) TEST_DECLARE(glm_vec3_step) TEST_DECLARE(glm_vec3_smoothstep_uni) TEST_DECLARE(glm_vec3_smoothstep) @@ -700,6 +703,8 @@ TEST_DECLARE(glm_vec3_abs) TEST_DECLARE(glm_vec3_fract) TEST_DECLARE(glm_vec3_floor) TEST_DECLARE(glm_vec3_mods) +TEST_DECLARE(glm_vec3_steps) +TEST_DECLARE(glm_vec3_stepr) TEST_DECLARE(glm_vec3_hadd) TEST_DECLARE(glm_vec3_sqrt) TEST_DECLARE(glm_vec3_make) @@ -757,7 +762,6 @@ TEST_DECLARE(glmc_vec3_ortho) TEST_DECLARE(glmc_vec3_clamp) TEST_DECLARE(glmc_vec3_mix) TEST_DECLARE(glmc_vec3_mixc) -TEST_DECLARE(glmc_vec3_step_uni) TEST_DECLARE(glmc_vec3_step) TEST_DECLARE(glmc_vec3_smoothstep_uni) TEST_DECLARE(glmc_vec3_smoothstep) @@ -781,6 +785,8 @@ TEST_DECLARE(glmc_vec3_abs) TEST_DECLARE(glmc_vec3_fract) TEST_DECLARE(glmc_vec3_floor) TEST_DECLARE(glmc_vec3_mods) +TEST_DECLARE(glmc_vec3_steps) +TEST_DECLARE(glmc_vec3_stepr) TEST_DECLARE(glmc_vec3_hadd) TEST_DECLARE(glmc_vec3_sqrt) TEST_DECLARE(glmc_vec3_make) @@ -849,7 +855,6 @@ TEST_DECLARE(glm_vec4_lerp) TEST_DECLARE(glm_vec4_lerpc) TEST_DECLARE(glm_vec4_mix) TEST_DECLARE(glm_vec4_mixc) -TEST_DECLARE(glm_vec4_step_uni) TEST_DECLARE(glm_vec4_step) TEST_DECLARE(glm_vec4_smoothstep_uni) TEST_DECLARE(glm_vec4_smoothstep) @@ -874,6 +879,8 @@ TEST_DECLARE(glm_vec4_abs) TEST_DECLARE(glm_vec4_fract) TEST_DECLARE(glm_vec4_floor) TEST_DECLARE(glm_vec4_mods) +TEST_DECLARE(glm_vec4_steps) +TEST_DECLARE(glm_vec4_stepr) TEST_DECLARE(glm_vec4_hadd) TEST_DECLARE(glm_vec4_sqrt) TEST_DECLARE(glm_vec4_make) @@ -925,7 +932,6 @@ TEST_DECLARE(glmc_vec4_lerp) TEST_DECLARE(glmc_vec4_lerpc) TEST_DECLARE(glmc_vec4_mix) TEST_DECLARE(glmc_vec4_mixc) -TEST_DECLARE(glmc_vec4_step_uni) TEST_DECLARE(glmc_vec4_step) TEST_DECLARE(glmc_vec4_smoothstep_uni) TEST_DECLARE(glmc_vec4_smoothstep) @@ -950,6 +956,8 @@ TEST_DECLARE(glmc_vec4_abs) TEST_DECLARE(glmc_vec4_fract) TEST_DECLARE(glmc_vec4_floor) TEST_DECLARE(glmc_vec4_mods) +TEST_DECLARE(glmc_vec4_steps) +TEST_DECLARE(glmc_vec4_stepr) TEST_DECLARE(glmc_vec4_hadd) TEST_DECLARE(glmc_vec4_sqrt) TEST_DECLARE(glmc_vec4_make) @@ -1742,6 +1750,8 @@ TEST_LIST { TEST_ENTRY(glm_vec2_fract) TEST_ENTRY(glm_vec2_floor) TEST_ENTRY(glm_vec2_mods) + TEST_ENTRY(glm_vec2_steps) + TEST_ENTRY(glm_vec2_stepr) TEST_ENTRY(glm_vec2_lerp) TEST_ENTRY(glm_vec2_complex_mul) TEST_ENTRY(glm_vec2_complex_div) @@ -1793,6 +1803,8 @@ TEST_LIST { TEST_ENTRY(glmc_vec2_fract) TEST_ENTRY(glmc_vec2_floor) TEST_ENTRY(glmc_vec2_mods) + TEST_ENTRY(glmc_vec2_steps) + TEST_ENTRY(glmc_vec2_stepr) TEST_ENTRY(glmc_vec2_lerp) TEST_ENTRY(glmc_vec2_complex_mul) TEST_ENTRY(glmc_vec2_complex_div) @@ -1875,7 +1887,6 @@ TEST_LIST { TEST_ENTRY(glm_vec3_clamp) TEST_ENTRY(glm_vec3_mix) TEST_ENTRY(glm_vec3_mixc) - TEST_ENTRY(glm_vec3_step_uni) TEST_ENTRY(glm_vec3_step) TEST_ENTRY(glm_vec3_smoothstep_uni) TEST_ENTRY(glm_vec3_smoothstep) @@ -1899,6 +1910,8 @@ TEST_LIST { TEST_ENTRY(glm_vec3_fract) TEST_ENTRY(glm_vec3_floor) TEST_ENTRY(glm_vec3_mods) + TEST_ENTRY(glm_vec3_steps) + TEST_ENTRY(glm_vec3_stepr) TEST_ENTRY(glm_vec3_hadd) TEST_ENTRY(glm_vec3_sqrt) TEST_ENTRY(glm_vec3_make) @@ -1956,7 +1969,6 @@ TEST_LIST { TEST_ENTRY(glmc_vec3_clamp) TEST_ENTRY(glmc_vec3_mix) TEST_ENTRY(glmc_vec3_mixc) - TEST_ENTRY(glmc_vec3_step_uni) TEST_ENTRY(glmc_vec3_step) TEST_ENTRY(glmc_vec3_smoothstep_uni) TEST_ENTRY(glmc_vec3_smoothstep) @@ -1980,6 +1992,8 @@ TEST_LIST { TEST_ENTRY(glmc_vec3_fract) TEST_ENTRY(glmc_vec3_floor) TEST_ENTRY(glmc_vec3_mods) + TEST_ENTRY(glmc_vec3_steps) + TEST_ENTRY(glmc_vec3_stepr) TEST_ENTRY(glmc_vec3_hadd) TEST_ENTRY(glmc_vec3_sqrt) TEST_ENTRY(glmc_vec3_make) @@ -2048,7 +2062,6 @@ TEST_LIST { TEST_ENTRY(glm_vec4_lerpc) TEST_ENTRY(glm_vec4_mix) TEST_ENTRY(glm_vec4_mixc) - TEST_ENTRY(glm_vec4_step_uni) TEST_ENTRY(glm_vec4_step) TEST_ENTRY(glm_vec4_smoothstep_uni) TEST_ENTRY(glm_vec4_smoothstep) @@ -2073,6 +2086,8 @@ TEST_LIST { TEST_ENTRY(glm_vec4_fract) TEST_ENTRY(glm_vec4_floor) TEST_ENTRY(glm_vec4_mods) + TEST_ENTRY(glm_vec4_steps) + TEST_ENTRY(glm_vec4_stepr) TEST_ENTRY(glm_vec4_hadd) TEST_ENTRY(glm_vec4_sqrt) TEST_ENTRY(glm_vec4_make) @@ -2124,7 +2139,6 @@ TEST_LIST { TEST_ENTRY(glmc_vec4_lerpc) TEST_ENTRY(glmc_vec4_mix) TEST_ENTRY(glmc_vec4_mixc) - TEST_ENTRY(glmc_vec4_step_uni) TEST_ENTRY(glmc_vec4_step) TEST_ENTRY(glmc_vec4_smoothstep_uni) TEST_ENTRY(glmc_vec4_smoothstep) @@ -2149,6 +2163,8 @@ TEST_LIST { TEST_ENTRY(glmc_vec4_fract) TEST_ENTRY(glmc_vec4_floor) TEST_ENTRY(glmc_vec4_mods) + TEST_ENTRY(glmc_vec4_steps) + TEST_ENTRY(glmc_vec4_stepr) TEST_ENTRY(glmc_vec4_hadd) TEST_ENTRY(glmc_vec4_sqrt) TEST_ENTRY(glmc_vec4_make) From 6c0e3e94602299f8eaff0c1ede4efd984d10b402 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:15:07 +0000 Subject: [PATCH 082/128] deprecate step_uni in favour of steps This seems to be the newer naming system --- include/cglm/call/vec3.h | 7 +++++-- include/cglm/call/vec4.h | 7 +++++-- include/cglm/struct/vec3.h | 22 ++++++---------------- include/cglm/struct/vec4.h | 22 ++++++---------------- include/cglm/vec3.h | 18 ++---------------- include/cglm/vec4.h | 19 ++----------------- src/vec3.c | 18 ++++++++++++------ src/vec4.c | 6 ------ 8 files changed, 38 insertions(+), 81 deletions(-) diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index 70aa1ab..ff4d494 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -232,9 +232,12 @@ glmc_vec3_mixc(vec3 from, vec3 to, float t, vec3 dest) { glmc_vec3_lerpc(from, to, t, dest); } -CGLM_EXPORT +/* DEPRECATED */ +CGLM_INLINE void -glmc_vec3_step_uni(float edge, vec3 x, vec3 dest); +glmc_vec3_step_uni(float edge, vec3 x, vec3 dest) { + glmc_vec3_steps(edge, x, dest); +} CGLM_EXPORT void diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index cf00cc0..a747276 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -205,9 +205,12 @@ glmc_vec4_mixc(vec4 from, vec4 to, float t, vec4 dest) { glmc_vec4_lerpc(from, to, t, dest); } -CGLM_EXPORT +/* DEPRECATED */ +CGLM_INLINE void -glmc_vec4_step_uni(float edge, vec4 x, vec4 dest); +glmc_vec4_step_uni(float edge, vec4 x, vec4 dest) { + glmc_vec4_steps(edge, x, dest); +} CGLM_EXPORT void diff --git a/include/cglm/struct/vec3.h b/include/cglm/struct/vec3.h index 536af03..a1d901e 100644 --- a/include/cglm/struct/vec3.h +++ b/include/cglm/struct/vec3.h @@ -68,7 +68,6 @@ CGLM_INLINE vec3s glms_vec3_lerpc(vec3s from, vec3s to, float t); CGLM_INLINE vec3s glms_vec3_mix(vec3s from, vec3s to, float t); CGLM_INLINE vec3s glms_vec3_mixc(vec3s from, vec3s to, float t); - CGLM_INLINE vec3s glms_vec3_step_uni(float edge, vec3s x); CGLM_INLINE vec3s glms_vec3_step(vec3s edge, vec3s x); CGLM_INLINE vec3s glms_vec3_smoothstep_uni(float edge0, float edge1, vec3s x); CGLM_INLINE vec3s glms_vec3_smoothstep(vec3s edge0, vec3s edge1, vec3s x); @@ -84,6 +83,9 @@ CGLM_INLINE vec3s glms_cross(vec3s a, vec3s b); CGLM_INLINE float glms_dot(vec3s a, vec3s b); CGLM_INLINE vec3s glms_normalize(vec3s v); + + Deprecated: + glms_vec3_step_uni --> use glms_vec3_steps */ #ifndef cglms_vec3s_h @@ -95,6 +97,9 @@ #include "../vec3.h" #include "vec3-ext.h" +/* DEPRECATED! */ +#define glms_vec3_step_uni(edge, x) glms_vec3_steps(edge, x) + #define GLMS_VEC3_ONE_INIT {GLM_VEC3_ONE_INIT} #define GLMS_VEC3_ZERO_INIT {GLM_VEC3_ZERO_INIT} @@ -910,21 +915,6 @@ glms_vec3_(mixc)(vec3s from, vec3s to, float t) { return r; } -/*! - * @brief threshold function (unidimensional) - * - * @param[in] edge threshold - * @param[in] x value to test against threshold - * @returns 0.0 if x < edge, else 1.0 - */ -CGLM_INLINE -vec3s -glms_vec3_(step_uni)(float edge, vec3s x) { - vec3s r; - glm_vec3_step_uni(edge, x.raw, r.raw); - return r; -} - /*! * @brief threshold function * diff --git a/include/cglm/struct/vec4.h b/include/cglm/struct/vec4.h index 8b2ef00..a64c1a3 100644 --- a/include/cglm/struct/vec4.h +++ b/include/cglm/struct/vec4.h @@ -58,7 +58,6 @@ CGLM_INLINE vec4s glms_vec4_lerpc(vec4s from, vec4s to, float t); CGLM_INLINE vec4s glms_vec4_mix(vec4s from, vec4s to, float t); CGLM_INLINE vec4s glms_vec4_mixc(vec4s from, vec4s to, float t); - CGLM_INLINE vec4s glms_vec4_step_uni(float edge, vec4s x); CGLM_INLINE vec4s glms_vec4_step(vec4s edge, vec4s x); CGLM_INLINE vec4s glms_vec4_smoothstep_uni(float edge0, float edge1, vec4s x); CGLM_INLINE vec4s glms_vec4_smoothstep(vec4s edge0, vec4s edge1, vec4s x); @@ -69,6 +68,9 @@ CGLM_INLINE vec4s glms_vec4_make(float * restrict src); CGLM_INLINE vec4s glms_vec4_reflect(vec4s v, vec4s n); CGLM_INLINE bool glms_vec4_refract(vec4s v, vec4s n, float eta, vec4s *dest) + + Deprecated: + glms_vec4_step_uni --> use glms_vec4_steps */ #ifndef cglms_vec4s_h @@ -80,6 +82,9 @@ #include "../vec4.h" #include "vec4-ext.h" +/* DEPRECATED! */ +#define glms_vec4_step_uni(edge, x) glms_vec4_steps(edge, x) + #define GLMS_VEC4_ONE_INIT {GLM_VEC4_ONE_INIT} #define GLMS_VEC4_BLACK_INIT {GLM_VEC4_BLACK_INIT} #define GLMS_VEC4_ZERO_INIT {GLM_VEC4_ZERO_INIT} @@ -786,21 +791,6 @@ glms_vec4_(mixc)(vec4s from, vec4s to, float t) { return r; } -/*! - * @brief threshold function (unidimensional) - * - * @param[in] edge threshold - * @param[in] x value to test against threshold - * @returns 0.0 if x < edge, else 1.0 - */ -CGLM_INLINE -vec4s -glms_vec4_(step_uni)(float edge, vec4s x) { - vec4s r; - glm_vec4_step_uni(edge, x.raw, r.raw); - return r; -} - /*! * @brief threshold function * diff --git a/include/cglm/vec3.h b/include/cglm/vec3.h index e6a9898..1350818 100644 --- a/include/cglm/vec3.h +++ b/include/cglm/vec3.h @@ -72,7 +72,6 @@ CGLM_INLINE void glm_vec3_lerpc(vec3 from, vec3 to, float t, vec3 dest); CGLM_INLINE void glm_vec3_mix(vec3 from, vec3 to, float t, vec3 dest); CGLM_INLINE void glm_vec3_mixc(vec3 from, vec3 to, float t, vec3 dest); - CGLM_INLINE void glm_vec3_step_uni(float edge, vec3 x, vec3 dest); CGLM_INLINE void glm_vec3_step(vec3 edge, vec3 x, vec3 dest); CGLM_INLINE void glm_vec3_smoothstep_uni(float edge0, float edge1, vec3 x, vec3 dest); CGLM_INLINE void glm_vec3_smoothstep(vec3 edge0, vec3 edge1, vec3 x, vec3 dest); @@ -97,6 +96,7 @@ glm_vec3_inv glm_vec3_inv_to glm_vec3_mulv + glm_vec3_step_uni --> use glm_vec3_steps */ #ifndef cglm_vec3_h @@ -114,6 +114,7 @@ #define glm_vec3_inv(v) glm_vec3_negate(v) #define glm_vec3_inv_to(v, dest) glm_vec3_negate_to(v, dest) #define glm_vec3_mulv(a, b, d) glm_vec3_mul(a, b, d) +#define glm_vec3_step_uni(edge, x, dest) glm_vec3_steps(edge, x, dest) #define GLM_VEC3_ONE_INIT {1.0f, 1.0f, 1.0f} #define GLM_VEC3_ZERO_INIT {0.0f, 0.0f, 0.0f} @@ -1012,21 +1013,6 @@ glm_vec3_mixc(vec3 from, vec3 to, float t, vec3 dest) { glm_vec3_lerpc(from, to, t, dest); } -/*! - * @brief threshold function (unidimensional) - * - * @param[in] edge threshold - * @param[in] x value to test against threshold - * @param[out] dest destination - */ -CGLM_INLINE -void -glm_vec3_step_uni(float edge, vec3 x, vec3 dest) { - dest[0] = glm_step(edge, x[0]); - dest[1] = glm_step(edge, x[1]); - dest[2] = glm_step(edge, x[2]); -} - /*! * @brief threshold function * diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index b259235..9203f03 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -57,7 +57,6 @@ CGLM_INLINE void glm_vec4_clamp(vec4 v, float minVal, float maxVal); CGLM_INLINE void glm_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest); CGLM_INLINE void glm_vec4_lerpc(vec4 from, vec4 to, float t, vec4 dest); - CGLM_INLINE void glm_vec4_step_uni(float edge, vec4 x, vec4 dest); CGLM_INLINE void glm_vec4_step(vec4 edge, vec4 x, vec4 dest); CGLM_INLINE void glm_vec4_smoothstep_uni(float edge0, float edge1, vec4 x, vec4 dest); CGLM_INLINE void glm_vec4_smoothstep(vec4 edge0, vec4 edge1, vec4 x, vec4 dest); @@ -75,6 +74,7 @@ glm_vec4_inv glm_vec4_inv_to glm_vec4_mulv + glm_vec4_step_uni --> use glm_vec4_steps */ #ifndef cglm_vec4_h @@ -92,6 +92,7 @@ #define glm_vec4_inv(v) glm_vec4_negate(v) #define glm_vec4_inv_to(v, dest) glm_vec4_negate_to(v, dest) #define glm_vec4_mulv(a, b, d) glm_vec4_mul(a, b, d) +#define glm_vec4_step_uni(edge, x, dest) glm_vec4_steps(edge, x, dest) #define GLM_VEC4_ONE_INIT {1.0f, 1.0f, 1.0f, 1.0f} #define GLM_VEC4_BLACK_INIT {0.0f, 0.0f, 0.0f, 1.0f} @@ -1148,22 +1149,6 @@ glm_vec4_mixc(vec4 from, vec4 to, float t, vec4 dest) { glm_vec4_lerpc(from, to, t, dest); } -/*! - * @brief threshold function (unidimensional) - * - * @param[in] edge threshold - * @param[in] x value to test against threshold - * @param[out] dest destination - */ -CGLM_INLINE -void -glm_vec4_step_uni(float edge, vec4 x, vec4 dest) { - dest[0] = glm_step(edge, x[0]); - dest[1] = glm_step(edge, x[1]); - dest[2] = glm_step(edge, x[2]); - dest[3] = glm_step(edge, x[3]); -} - /*! * @brief threshold function * diff --git a/src/vec3.c b/src/vec3.c index 2901580..b1d3945 100644 --- a/src/vec3.c +++ b/src/vec3.c @@ -308,12 +308,6 @@ glmc_vec3_lerpc(vec3 from, vec3 to, float t, vec3 dest) { glm_vec3_lerpc(from, to, t, dest); } -CGLM_EXPORT -void -glmc_vec3_step_uni(float edge, vec3 x, vec3 dest) { - glm_vec3_step_uni(edge, x, dest); -} - CGLM_EXPORT void glmc_vec3_step(vec3 edge, vec3 x, vec3 dest) { @@ -454,6 +448,18 @@ glmc_vec3_mods(vec3 v, float s, vec3 dest) { glm_vec3_mods(v, s, dest); } +CGLM_EXPORT +void +glmc_vec3_steps(float edge, vec3 v, vec3 dest) { + glm_vec3_steps(edge, v, dest); +} + +CGLM_EXPORT +void +glmc_vec3_stepr(vec3 edge, float v, vec3 dest) { + glm_vec3_stepr(edge, v, dest); +} + CGLM_EXPORT float glmc_vec3_hadd(vec3 v) { diff --git a/src/vec4.c b/src/vec4.c index 7d5e052..65d33c9 100644 --- a/src/vec4.c +++ b/src/vec4.c @@ -266,12 +266,6 @@ glmc_vec4_lerpc(vec4 from, vec4 to, float t, vec4 dest) { glm_vec4_lerpc(from, to, t, dest); } -CGLM_EXPORT -void -glmc_vec4_step_uni(float edge, vec4 x, vec4 dest) { - glm_vec4_step_uni(edge, x, dest); -} - CGLM_EXPORT void glmc_vec4_step(vec4 edge, vec4 x, vec4 dest) { From 8e691570523ae5b01af71559dfe889936893df39 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:15:33 +0000 Subject: [PATCH 083/128] missing vec4 steps and stepr --- src/vec4.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/vec4.c b/src/vec4.c index 65d33c9..1e6a7d0 100644 --- a/src/vec4.c +++ b/src/vec4.c @@ -412,6 +412,18 @@ glmc_vec4_mods(vec4 v, float s, vec4 dest) { glm_vec4_mods(v, s, dest); } +CGLM_EXPORT +void +glmc_vec4_steps(float edge, vec4 v, vec4 dest) { + glm_vec4_steps(edge, v, dest); +} + +CGLM_EXPORT +void +glmc_vec4_stepr(vec4 edge, float v, vec4 dest) { + glm_vec4_stepr(edge, v, dest); +} + CGLM_EXPORT float glmc_vec4_hadd(vec4 v) { From fb469c779db086e33fb394ec4e1b69e21d691cac Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:16:01 +0000 Subject: [PATCH 084/128] missing doc --- include/cglm/struct/vec3-ext.h | 1 + include/cglm/struct/vec4-ext.h | 1 + 2 files changed, 2 insertions(+) diff --git a/include/cglm/struct/vec3-ext.h b/include/cglm/struct/vec3-ext.h index 66a987a..6cd8ca0 100644 --- a/include/cglm/struct/vec3-ext.h +++ b/include/cglm/struct/vec3-ext.h @@ -27,6 +27,7 @@ CGLM_INLINE vec3s glms_vec3_abs(vec3s v); CGLM_INLINE vec3s glms_vec3_fract(vec3s v); CGLM_INLINE vec3s glms_vec3_floor(vec3s v); + CGLM_INLINE vec3s glms_vec3_mods(vec3s v, float s); CGLM_INLINE vec3s glms_vec3_steps(float edge, vec3s v); CGLM_INLINE vec3s glms_vec3_stepr(vec3s edge, float v); CGLM_INLINE float glms_vec3_hadd(vec3s v); diff --git a/include/cglm/struct/vec4-ext.h b/include/cglm/struct/vec4-ext.h index 3b61431..f57348e 100644 --- a/include/cglm/struct/vec4-ext.h +++ b/include/cglm/struct/vec4-ext.h @@ -27,6 +27,7 @@ CGLM_INLINE vec4s glms_vec4_abs(vec4s v); CGLM_INLINE vec4s glms_vec4_fract(vec4s v); CGLM_INLINE float glms_vec4_floor(vec4s v); + CGLM_INLINE float glms_vec4_mods(vec4s v, float s); CGLM_INLINE float glms_vec4_steps(float edge, vec4s v); CGLM_INLINE void glms_vec4_stepr(vec4s edge, float v); CGLM_INLINE float glms_vec4_hadd(vec4s v); From 5cffcf74c4eac0c6ef6cdb07b3f1b7a391598c0f Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:17:11 +0000 Subject: [PATCH 085/128] missing glmc_vec2_stepr --- src/vec2.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vec2.c b/src/vec2.c index 079992d..a9d59b5 100644 --- a/src/vec2.c +++ b/src/vec2.c @@ -303,6 +303,11 @@ glmc_vec2_steps(float edge, vec2 v, vec2 dest) { glm_vec2_steps(edge, v, dest); } +CGLM_EXPORT +void +glmc_vec2_stepr(vec2 edge, float v, vec2 dest) { + glm_vec2_stepr(edge, v, dest); +} CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) { From 6bc980f3d904aa08badd16ee743e944b9915f928 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:17:58 +0000 Subject: [PATCH 086/128] add missing vec2 step --- include/cglm/call/vec2.h | 4 ++++ include/cglm/struct/vec2.h | 16 ++++++++++++++++ include/cglm/vec2.h | 15 +++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/include/cglm/call/vec2.h b/include/cglm/call/vec2.h index a0c32ce..2fbd3ee 100644 --- a/include/cglm/call/vec2.h +++ b/include/cglm/call/vec2.h @@ -205,6 +205,10 @@ CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest); +CGLM_EXPORT +void +glmc_vec2_step(vec2 edge, vec2 x, vec2 dest); + CGLM_EXPORT void glmc_vec2_steps(float edge, vec2 x, vec2 dest); diff --git a/include/cglm/struct/vec2.h b/include/cglm/struct/vec2.h index e1190e2..40ed659 100644 --- a/include/cglm/struct/vec2.h +++ b/include/cglm/struct/vec2.h @@ -53,6 +53,7 @@ CGLM_INLINE vec2s glms_vec2_minv(vec2s a, vec2s b) 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_step(vec2s edge, vec2s x) CGLM_INLINE vec2s glms_vec2_make(float * restrict src) CGLM_INLINE vec2s glms_vec2_reflect(vec2s v, vec2s n) CGLM_INLINE bool glms_vec2_refract(vec2s v, vec2s n, float eta, vec2s *dest) @@ -679,6 +680,21 @@ glms_vec2_(lerp)(vec2s from, vec2s to, float t) { return r; } +/*! + * @brief threshold function + * + * @param[in] edge threshold + * @param[in] x value to test against threshold + * @returns destination + */ +CGLM_INLINE +vec2s +glms_vec2_(step)(vec2s edge, vec2s x) { + vec2s r; + glm_vec2_step(edge.raw, x.raw, r.raw); + return r; +} + /*! * @brief Create two dimensional vector from pointer * diff --git a/include/cglm/vec2.h b/include/cglm/vec2.h index 98cd4df..090e5e8 100644 --- a/include/cglm/vec2.h +++ b/include/cglm/vec2.h @@ -54,6 +54,7 @@ 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_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) CGLM_INLINE void glm_vec2_reflect(vec2 v, vec2 n, vec2 dest) CGLM_INLINE void glm_vec2_refract(vec2 v, vec2 n, float eta, vec2 dest) @@ -701,6 +702,20 @@ glm_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) { glm_vec2_add(from, v, dest); } +/*! + * @brief threshold function + * + * @param[in] edge threshold + * @param[in] x value to test against threshold + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_vec2_step(vec2 edge, vec2 x, vec2 dest) { + dest[0] = glm_step(edge[0], x[0]); + dest[1] = glm_step(edge[1], x[1]); +} + /*! * @brief Create two dimensional vector from pointer * From f50736aee7f0cf267cc9f981e0c604d676ce9a2f Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:18:11 +0000 Subject: [PATCH 087/128] vec2_step test --- test/src/test_vec2.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index 7b8d94d..80f24fa 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -790,6 +790,29 @@ TEST_IMPL(GLM_PREFIX, vec2_stepr) { TEST_SUCCESS } + +TEST_IMPL(GLM_PREFIX, vec2_step) { + vec2 v1 = {-100.0f, -200.0f}; + vec2 s1 = {-100.0f, 0.0f}; + vec2 s2 = {100.0f, -220.0f}; + vec2 s3 = {100.0f, 200.0f}; + vec2 v2; + + GLM(vec2_step)(s1, v1, v2); + ASSERT(test_eq(v2[0], 1.0f)) + ASSERT(test_eq(v2[1], 0.0f)) + + GLM(vec2_step)(s2, v1, v2); + ASSERT(test_eq(v2[0], 0.0f)) + ASSERT(test_eq(v2[1], 1.0f)) + + GLM(vec2_step)(s3, v1, v2); + ASSERT(test_eq(v2[0], 0.0f)) + ASSERT(test_eq(v2[1], 0.0f)) + + TEST_SUCCESS +} + TEST_IMPL(GLM_PREFIX, vec2_complex_mul) { vec2 v1 = { 3.0f, 5.0f }, v2 = { 7.0f, 11.0f }, From 8493a6c0d389e62dc5fa0a1d335d07f305169cc2 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:26:29 +0000 Subject: [PATCH 088/128] fix cglm_vec3/4_swizzle --- include/cglm/call/vec3.h | 4 ++++ include/cglm/call/vec4.h | 4 ++++ src/vec3.c | 6 ++++++ src/vec4.c | 6 ++++++ test/src/test_vec3.h | 8 ++++---- test/src/test_vec4.h | 10 +++++----- 6 files changed, 29 insertions(+), 9 deletions(-) diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index ff4d494..4a5a622 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -259,6 +259,10 @@ CGLM_EXPORT void glmc_vec3_smoothinterpc(vec3 from, vec3 to, float t, vec3 dest); +CGLM_EXPORT +void +glmc_vec3_swizzle(vec3 v, int mask, vec3 dest); + /* ext */ CGLM_EXPORT diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index a747276..4420cab 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -236,6 +236,10 @@ CGLM_EXPORT void glmc_vec4_cubic(float s, vec4 dest); +CGLM_EXPORT +void +glmc_vec4_swizzle(vec4 v, int mask, vec4 dest); + /* ext */ CGLM_EXPORT diff --git a/src/vec3.c b/src/vec3.c index b1d3945..a8c1083 100644 --- a/src/vec3.c +++ b/src/vec3.c @@ -338,6 +338,12 @@ glmc_vec3_smoothinterpc(vec3 from, vec3 to, float t, vec3 dest) { glm_vec3_smoothinterpc(from, to, t, dest); } +CGLM_EXPORT +void +glmc_vec3_swizzle(vec3 v, int mask, vec3 dest) { + glm_vec3_swizzle(v, mask, dest); +} + /* ext */ CGLM_EXPORT diff --git a/src/vec4.c b/src/vec4.c index 1e6a7d0..4b08abf 100644 --- a/src/vec4.c +++ b/src/vec4.c @@ -302,6 +302,12 @@ glmc_vec4_cubic(float s, vec4 dest) { glm_vec4_cubic(s, dest); } +CGLM_EXPORT +void +glmc_vec4_swizzle(vec4 v, int mask, vec4 dest) { + glm_vec4_swizzle(v, mask, dest); +} + /* ext */ CGLM_EXPORT diff --git a/test/src/test_vec3.h b/test/src/test_vec3.h index 2e0f8a0..4d963d5 100644 --- a/test/src/test_vec3.h +++ b/test/src/test_vec3.h @@ -1574,24 +1574,24 @@ TEST_IMPL(GLM_PREFIX, vec3_swizzle) { v[1] = 2; v[2] = 3; - glm_vec3_swizzle(v, GLM_ZYX, v); + GLM(vec3_swizzle)(v, GLM_ZYX, v); ASSERTIFY(test_assert_vec3_eq(v, (vec3){3, 2, 1})) - glm_vec3_swizzle(v, GLM_XXX, v); + GLM(vec3_swizzle)(v, GLM_XXX, v); ASSERTIFY(test_assert_vec3_eq(v, (vec3){3, 3, 3})) v[0] = 1; v[1] = 2; v[2] = 3; - glm_vec3_swizzle(v, GLM_YYY, v); + GLM(vec3_swizzle)(v, GLM_YYY, v); ASSERTIFY(test_assert_vec3_eq(v, (vec3){2, 2, 2})) v[0] = 1; v[1] = 2; v[2] = 3; - glm_vec3_swizzle(v, GLM_ZZZ, v); + GLM(vec3_swizzle)(v, GLM_ZZZ, v); ASSERTIFY(test_assert_vec3_eq(v, (vec3){3, 3, 3})) TEST_SUCCESS diff --git a/test/src/test_vec4.h b/test/src/test_vec4.h index 4e87b72..417babb 100644 --- a/test/src/test_vec4.h +++ b/test/src/test_vec4.h @@ -1221,10 +1221,10 @@ TEST_IMPL(GLM_PREFIX, vec4_swizzle) { v[2] = 3; v[3] = 4; - glm_vec4_swizzle(v, GLM_WZYX, v); + GLM(vec4_swizzle)(v, GLM_WZYX, v); ASSERTIFY(test_assert_vec4_eq(v, (vec4){4, 3, 2, 1})) - glm_vec4_swizzle(v, GLM_XXXX, v); + GLM(vec4_swizzle)(v, GLM_XXXX, v); ASSERTIFY(test_assert_vec4_eq(v, (vec4){4, 4, 4, 4})) v[0] = 1; @@ -1232,7 +1232,7 @@ TEST_IMPL(GLM_PREFIX, vec4_swizzle) { v[2] = 3; v[3] = 4; - glm_vec4_swizzle(v, GLM_YYYY, v); + GLM(vec4_swizzle)(v, GLM_YYYY, v); ASSERTIFY(test_assert_vec4_eq(v, (vec4){2, 2, 2, 2})) v[0] = 1; @@ -1240,7 +1240,7 @@ TEST_IMPL(GLM_PREFIX, vec4_swizzle) { v[2] = 3; v[3] = 4; - glm_vec4_swizzle(v, GLM_ZZZZ, v); + GLM(vec4_swizzle)(v, GLM_ZZZZ, v); ASSERTIFY(test_assert_vec4_eq(v, (vec4){3, 3, 3, 3})) v[0] = 1; @@ -1248,7 +1248,7 @@ TEST_IMPL(GLM_PREFIX, vec4_swizzle) { v[2] = 3; v[3] = 4; - glm_vec4_swizzle(v, GLM_WWWW, v); + GLM(vec4_swizzle)(v, GLM_WWWW, v); ASSERTIFY(test_assert_vec4_eq(v, (vec4){4, 4, 4, 4})) TEST_SUCCESS From b45bf1d5714b415776965c499af107803e27422e Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:27:02 +0000 Subject: [PATCH 089/128] switch deprecation in cglm/call.h to #define --- include/cglm/call/vec3.h | 8 +------- include/cglm/call/vec4.h | 8 +------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index 4a5a622..640fac7 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -19,6 +19,7 @@ extern "C" { #define glmc_vec3_flipsign_to(v, dest) glmc_vec3_negate_to(v, dest) #define glmc_vec3_inv(v) glmc_vec3_negate(v) #define glmc_vec3_inv_to(v, dest) glmc_vec3_negate_to(v, dest) +#define glmc_vec3_step_uni(edge, x, dest) glmc_vec3_steps(edge, x, dest); CGLM_EXPORT void @@ -232,13 +233,6 @@ glmc_vec3_mixc(vec3 from, vec3 to, float t, vec3 dest) { glmc_vec3_lerpc(from, to, t, dest); } -/* DEPRECATED */ -CGLM_INLINE -void -glmc_vec3_step_uni(float edge, vec3 x, vec3 dest) { - glmc_vec3_steps(edge, x, dest); -} - CGLM_EXPORT void glmc_vec3_step(vec3 edge, vec3 x, vec3 dest); diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index 4420cab..22eee24 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -20,6 +20,7 @@ extern "C" { #define glmc_vec4_flipsign_to(v, dest) glmc_vec4_negate_to(v, dest) #define glmc_vec4_inv(v) glmc_vec4_negate(v) #define glmc_vec4_inv_to(v, dest) glmc_vec4_negate_to(v, dest) +#define glmc_vec4_step_uni(edge, x, dest) glmc_vec4_steps(edge, x, dest) CGLM_EXPORT void @@ -205,13 +206,6 @@ glmc_vec4_mixc(vec4 from, vec4 to, float t, vec4 dest) { glmc_vec4_lerpc(from, to, t, dest); } -/* DEPRECATED */ -CGLM_INLINE -void -glmc_vec4_step_uni(float edge, vec4 x, vec4 dest) { - glmc_vec4_steps(edge, x, dest); -} - CGLM_EXPORT void glmc_vec4_step(vec4 edge, vec4 x, vec4 dest); From 4b0e7dadd6ae2302bb7d34a08a3d45029f1a9041 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:27:21 +0000 Subject: [PATCH 090/128] vec2 swizzle --- include/cglm/call/vec2.h | 4 ++++ include/cglm/common.h | 1 + include/cglm/vec2.h | 19 +++++++++++++++++++ src/vec2.c | 7 +++++++ test/src/test_vec2.h | 15 +++++++++++++++ 5 files changed, 46 insertions(+) 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}; From 082f1878dd26d4dc0a828824f35496dcb6c7c692 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:27:28 +0000 Subject: [PATCH 091/128] glms_vec2_mods doc --- include/cglm/struct/vec2-ext.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/cglm/struct/vec2-ext.h b/include/cglm/struct/vec2-ext.h index 7825538..246132f 100644 --- a/include/cglm/struct/vec2-ext.h +++ b/include/cglm/struct/vec2-ext.h @@ -26,6 +26,7 @@ CGLM_INLINE vec2s glms_vec2_abs(vec2s v) CGLM_INLINE vec2s glms_vec2_fract(vec2s v) CGLM_INLINE vec2s glms_vec2_floor(vec2s v) + CGLM_INLINE vec2s glms_vec2_mods(vec2s v, float s) CGLM_INLINE vec2s glms_vec2_steps(float edge, vec2s v) CGLM_INLINE vec2s glms_vec2_stepr(vec2s edge, float v) CGLM_INLINE vec2s glms_vec2_sqrt(vec2s v) From f32f18a373b8968680751ca95b7cd7827016c762 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 19:29:01 +0000 Subject: [PATCH 092/128] sets -> fill --- include/cglm/noise.h | 33 ++------------------------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index 64e8e22..dd096f4 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -28,35 +28,6 @@ ////////////////////////////// // Proposed vec4_ext functions -/*! - * @brief set all elements of dest to value - * - * @param[in] vector threshold - * @param[in] x value - */ -CGLM_INLINE -void -_glm_vec4_sets(vec4 v, float x) { - v[0] = x; - v[1] = x; - v[2] = x; - v[3] = x; -} - -/*! - * @brief set all elements of dest to value - * - * @param[in] vector threshold - * @param[in] x value - */ -CGLM_INLINE -void -_glm_vec3_sets(vec3 v, float x) { - v[0] = x; - v[1] = x; - v[2] = x; -} - ////////////////////////////// // GLM noise detail functions @@ -243,7 +214,7 @@ _glm_noiseDetail_i2gxyzw( glm_vec4_abs(gz, gza); // gza = abs(gz) // gw = 0.75 - abs(gx) - abs(gy) - abs(gz) - _glm_vec4_sets(gw, 0.75f); // gw = 0.75 + glm_vec4_fill(gw, 0.75f); // gw = 0.75 glm_vec4_sub(gw, gxa, gw); // gw -= gxa glm_vec4_sub(gw, gza, gw); // gw -= gza glm_vec4_sub(gw, gya, gw); // gw -= gya @@ -299,7 +270,7 @@ _glm_noiseDetail_i2gxyz( glm_vec4_abs(gy, gya); // gya = abs(gy) // gz = vec4(0.5) - abs(gx0) - abs(gy0); - _glm_vec4_sets(gz, 0.5f); // gz = 0.5 + glm_vec4_fill(gz, 0.5f); // gz = 0.5 glm_vec4_sub(gz, gxa, gz); // gz -= gxa glm_vec4_sub(gz, gya, gz); // gz -= gya From fa7bc07ae9cda0698457c295cdf52b604b7cc6ac Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 20:05:08 +0000 Subject: [PATCH 093/128] changed noiseDetail to #defines _glm_noiseDetail_mod289 _glm_noiseDetail_permute _glm_noiseDetail_fade_vec4 _glm_noiseDetail_fade_vec3 _glm_noiseDetail_fade_vec2 _glm_noiseDetail_taylorInvSqrt _glm_noiseDetail_gradNorm_vec4 _glm_noiseDetail_gradNorm_vec3 _glm_noiseDetail_gradNorm_vec2 _glm_noiseDetail_i2gxyzw _glm_noiseDetail_i2gxyz _glm_noiseDetail_i2gxy --- include/cglm/noise.h | 502 +++++++++++++++++++------------------------ 1 file changed, 216 insertions(+), 286 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index dd096f4..a7e30df 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -25,311 +25,227 @@ #include "vec2.h" #include "vec2-ext.h" -////////////////////////////// -// Proposed vec4_ext functions +#define _glm_noiseDetail_mod289(x) (x - floorf(x * (1.0f / 289.0f)) * 289.0f) -////////////////////////////// -// GLM noise detail functions - -CGLM_INLINE -float -_glm_noiseDetail_mod289(float x) { - return x - floorf(x * (1.0f / 289.0f)) * 289.0f; +/* _glm_noiseDetail_permute(vec4 x, vec4 dest) */ +#define _glm_noiseDetail_permute(x, dest) { \ + dest[0] = _glm_noiseDetail_mod289((x[0] * 34.0f + 1.0f) * x[0]); \ + dest[1] = _glm_noiseDetail_mod289((x[1] * 34.0f + 1.0f) * x[1]); \ + dest[2] = _glm_noiseDetail_mod289((x[2] * 34.0f + 1.0f) * x[2]); \ + dest[3] = _glm_noiseDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); \ } -CGLM_INLINE -void -_glm_noiseDetail_permute(vec4 x, vec4 dest) { - dest[0] = _glm_noiseDetail_mod289((x[0] * 34.0f + 1.0f) * x[0]); - dest[1] = _glm_noiseDetail_mod289((x[1] * 34.0f + 1.0f) * x[1]); - dest[2] = _glm_noiseDetail_mod289((x[2] * 34.0f + 1.0f) * x[2]); - dest[3] = _glm_noiseDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); +/* _glm_noiseDetail_fade_vec4(vec4 t, vec4 dest) */ +#define _glm_noiseDetail_fade_vec4(t, dest) { \ + dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); \ + dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); \ + dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); \ + dest[3] = (t[3] * t[3] * t[3]) * (t[3] * (t[3] * 6.0f - 15.0f) + 10.0f); \ } -CGLM_INLINE -void -_glm_noiseDetail_fade_vec4(vec4 t, vec4 dest) { - dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); - dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); - dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); - dest[3] = (t[3] * t[3] * t[3]) * (t[3] * (t[3] * 6.0f - 15.0f) + 10.0f); +/* _glm_noiseDetail_fade_vec3(vec3 t, vec3 dest) */ +#define _glm_noiseDetail_fade_vec3(t, dest) { \ + dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); \ + dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); \ + dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); \ } -CGLM_INLINE -void -_glm_noiseDetail_fade_vec3(vec3 t, vec3 dest) { - dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); - dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); - dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); +/* _glm_noiseDetail_fade_vec2(vec2 t, vec2 dest) */ +#define _glm_noiseDetail_fade_vec2(t, dest) { \ + dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); \ + dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); \ } -CGLM_INLINE -void -_glm_noiseDetail_fade_vec2(vec2 t, vec2 dest) { - dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); - dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); +/* _glm_noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) */ +#define _glm_noiseDetail_taylorInvSqrt(x, dest) { \ + dest[0] = 1.79284291400159f - 0.85373472095314f * x[0]; \ + dest[1] = 1.79284291400159f - 0.85373472095314f * x[1]; \ + dest[2] = 1.79284291400159f - 0.85373472095314f * x[2]; \ + dest[3] = 1.79284291400159f - 0.85373472095314f * x[3]; \ } -CGLM_INLINE -void -_glm_noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) { - dest[0] = 1.79284291400159f - 0.85373472095314f * x[0]; - dest[1] = 1.79284291400159f - 0.85373472095314f * x[1]; - dest[2] = 1.79284291400159f - 0.85373472095314f * x[2]; - dest[3] = 1.79284291400159f - 0.85373472095314f * x[3]; +/* norm = taylorInvSqrt(vec4( + * dot(g00__, g00__), + * dot(g01__, g01__), + * dot(g10__, g10__), + * dot(g11__, g11__) + * )); +*/ + +/* _glm_noiseDetail_gradNorm_vec4(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) */ +#define _glm_noiseDetail_gradNorm_vec4(g00__, g01__, g10__, g11__) { \ + vec4 norm; \ + norm[0] = glm_vec4_dot(g00__, g00__); /* norm.x = dot(g00__, g00__) */ \ + norm[1] = glm_vec4_dot(g01__, g01__); /* norm.y = dot(g01__, g01__) */ \ + norm[2] = glm_vec4_dot(g10__, g10__); /* norm.z = dot(g10__, g10__) */ \ + norm[3] = glm_vec4_dot(g11__, g11__); /* norm.w = dot(g11__, g11__) */ \ + _glm_noiseDetail_taylorInvSqrt(norm, norm); /* norm = taylorInvSqrt(norm) */ \ + \ + glm_vec4_scale(g00__, norm[0], g00__); /* g00__ *= norm.x */ \ + glm_vec4_scale(g01__, norm[1], g01__); /* g01__ *= norm.y */ \ + glm_vec4_scale(g10__, norm[2], g10__); /* g10__ *= norm.z */ \ + glm_vec4_scale(g11__, norm[3], g11__); /* g11__ *= norm.w */ \ } -/*! - * @brief Normalize 4D gradients inplace - * - * @param[in, out] g00__ gradient from point 00 - * @param[in, out] g01__ gradient from point 01 - * @param[in, out] g10__ gradient from point 10 - * @param[in, out] g11__ gradient from point 11 +/* _glm_noiseDetail_gradNorm_vec3(vec3 g00_, vec3 g01_, vec3 g10_, vec3 g11_) */ +#define _glm_noiseDetail_gradNorm_vec3(g00_, g01_, g10_, g11_) { \ + vec4 norm; \ + norm[0] = glm_vec3_dot(g00_, g00_); /* norm.x = dot(g00_, g00_) */ \ + norm[1] = glm_vec3_dot(g01_, g01_); /* norm.y = dot(g01_, g01_) */ \ + norm[2] = glm_vec3_dot(g10_, g10_); /* norm.z = dot(g10_, g10_) */ \ + norm[3] = glm_vec3_dot(g11_, g11_); /* norm.w = dot(g11_, g11_) */ \ + _glm_noiseDetail_taylorInvSqrt(norm, norm); /* norm = taylorInvSqrt(norm) */ \ + \ + glm_vec3_scale(g00_, norm[0], g00_); /* g00_ *= norm.x */ \ + glm_vec3_scale(g01_, norm[1], g01_); /* g01_ *= norm.y */ \ + glm_vec3_scale(g10_, norm[2], g10_); /* g10_ *= norm.z */ \ + glm_vec3_scale(g11_, norm[3], g11_); /* g11_ *= norm.w */ \ +} + +/* _glm_noiseDetail_gradNorm_vec2(vec2 g00, vec2 g01, vec2 g10, vec2 g11) */ +#define _glm_noiseDetail_gradNorm_vec2(g00, g01, g10, g11) { \ + vec4 norm; \ + norm[0] = glm_vec2_dot(g00, g00); /* norm.x = dot(g00, g00) */ \ + norm[1] = glm_vec2_dot(g01, g01); /* norm.y = dot(g01, g01) */ \ + norm[2] = glm_vec2_dot(g10, g10); /* norm.z = dot(g10, g10) */ \ + norm[3] = glm_vec2_dot(g11, g11); /* norm.w = dot(g11, g11) */ \ + _glm_noiseDetail_taylorInvSqrt(norm, norm); /* norm = taylorInvSqrt(norm) */ \ + \ + glm_vec2_scale(g00, norm[0], g00); /* g00 *= norm.x */ \ + glm_vec2_scale(g01, norm[1], g01); /* g01 *= norm.y */ \ + glm_vec2_scale(g10, norm[2], g10); /* g10 *= norm.z */ \ + glm_vec2_scale(g11, norm[3], g11); /* g11 *= norm.w */ \ +} + +/* _glm_noiseDetail_i2gxyzw(vec4 ixy, vec4 gx, vec4 gy, vec4 gz, vec4 gw) */ +#define _glm_noiseDetail_i2gxyzw(ixy, gx, gy, gz, gw) { \ + /* gx = ixy / 7.0 */ \ + glm_vec4_divs(ixy, 7.0f, gx); /* gx = ixy / 7.0 */ \ + \ + /* gy = fract(gx) / 7.0 */ \ + glm_vec4_floor(gx, gy); /* gy = floor(gx) */ \ + glm_vec4_divs(gy, 7.0f, gy); /* gy /= 7.0 */ \ + \ + /* gz = floor(gy) / 6.0 */ \ + glm_vec4_floor(gy, gz); /* gz = floor(gy) */ \ + glm_vec4_divs(gz, 6.0f, gz); /* gz /= 6.0 */ \ + \ + /* gx = fract(gx) - 0.5f */ \ + glm_vec4_fract(gx, gx); /* gx = fract(gx) */ \ + glm_vec4_subs(gx, 0.5f, gx); /* gx -= 0.5f */ \ + \ + /* gy = fract(gy) - 0.5f */ \ + glm_vec4_fract(gy, gy); /* gy = fract(gy) */ \ + glm_vec4_subs(gy, 0.5f, gy); /* gy -= 0.5f */ \ + \ + /* gz = fract(gz) - 0.5f */ \ + glm_vec4_fract(gz, gz); /* gz = fract(gz) */ \ + glm_vec4_subs(gz, 0.5f, gz); /* gz -= 0.5f */ \ + \ + /* abs(gx), abs(gy), abs(gz) */ \ + vec4 gxa, gya, gza; \ + glm_vec4_abs(gx, gxa); /* gxa = abs(gx) */ \ + glm_vec4_abs(gy, gya); /* gya = abs(gy) */ \ + glm_vec4_abs(gz, gza); /* gza = abs(gz) */ \ + \ + /* gw = 0.75 - abs(gx) - abs(gy) - abs(gz) */ \ + glm_vec4_fill(gw, 0.75f); /* gw = 0.75 */ \ + glm_vec4_sub(gw, gxa, gw); /* gw -= gxa */ \ + glm_vec4_sub(gw, gza, gw); /* gw -= gza */ \ + glm_vec4_sub(gw, gya, gw); /* gw -= gya */ \ + \ + /* sw = step(gw, 0.0); */ \ + vec4 sw; \ + glm_vec4_stepr(gw, 0.0f, sw); /* sw = step(gw, 0.0) */ \ + \ + /* gx -= sw * (step(vec4(0), gx) - T(0.5)); */ \ + vec4 temp = {0.0f}; /* temp = 0.0 */ \ + glm_vec4_step(temp, gx, temp); /* temp = step(temp, gx) */ \ + glm_vec4_subs(temp, 0.5f, temp); /* temp -= 0.5 */ \ + glm_vec4_mul(sw, temp, temp); /* temp *= sw */ \ + glm_vec4_sub(gx, temp, gx); /* gx -= temp */ \ + \ + /* gy -= sw * (step(vec4(0), gy) - T(0.5)); */ \ + glm_vec4_zero(temp); /* reset temp */ \ + glm_vec4_step(temp, gy, temp); /* temp = step(temp, gy) */ \ + glm_vec4_subs(temp, 0.5f, temp); /* temp -= 0.5 */ \ + glm_vec4_mul(sw, temp, temp); /* temp *= sw */ \ + glm_vec4_sub(gy, temp, gy); /* gy -= temp */ \ +} + +/* NOTE: This function is not *quite* analogous to _glm_noiseDetail_i2gxyzw + * to try to match the output of glm::perlin. I think it might be a bug in + * in the original implementation, but for now I'm keeping it consistent. -MK */ -CGLM_INLINE -void -_glm_noiseDetail_gradNorm_vec4(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) { - // norm = taylorInvSqrt(vec4( - // dot(g00__, g00__), - // dot(g01__, g01__), - // dot(g10__, g10__), - // dot(g11__, g11__) - // )); - vec4 norm; - norm[0] = glm_vec4_dot(g00__, g00__); // norm.x = dot(g00__, g00__) - norm[1] = glm_vec4_dot(g01__, g01__); // norm.y = dot(g01__, g01__) - norm[2] = glm_vec4_dot(g10__, g10__); // norm.z = dot(g10__, g10__) - norm[3] = glm_vec4_dot(g11__, g11__); // norm.w = dot(g11__, g11__) - _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) - - glm_vec4_scale(g00__, norm[0], g00__); // g00__ *= norm.x - glm_vec4_scale(g01__, norm[1], g01__); // g01__ *= norm.y - glm_vec4_scale(g10__, norm[2], g10__); // g10__ *= norm.z - glm_vec4_scale(g11__, norm[3], g11__); // g11__ *= norm.w +// _glm_noiseDetail_i2gxyz(vec4 i, vec4 gx, vec4 gy, vec4 gz) +#define _glm_noiseDetail_i2gxyz(ixy, gx, gy, gz) { \ + /* gx = ixy / 7.0 */ \ + glm_vec4_divs(ixy, 7.0f, gx); /* gx = ixy / 7.0 */ \ + \ + /* gy = fract(floor(gx0) / 7.0)) - 0.5; */ \ + glm_vec4_floor(gx, gy); /* gy = floor(gx) */ \ + glm_vec4_divs(gy, 7.0f, gy); /* gy /= 7.0 */ \ + glm_vec4_fract(gy, gy); /* gy = fract(gy) */ \ + glm_vec4_subs(gy, 0.5f, gy); /* gy -= 0.5f */ \ + \ + /* gx = fract(gx); */ \ + glm_vec4_fract(gx, gx); /* gx = fract(gx) */ \ + \ + /* abs(gx), abs(gy) */ \ + vec4 gxa, gya; \ + glm_vec4_abs(gx, gxa); /* gxa = abs(gx) */ \ + glm_vec4_abs(gy, gya); /* gya = abs(gy) */ \ + \ + /* gz = vec4(0.5) - abs(gx0) - abs(gy0); */ \ + glm_vec4_fill(gz, 0.5f); /* gz = 0.5 */ \ + glm_vec4_sub(gz, gxa, gz); /* gz -= gxa */ \ + glm_vec4_sub(gz, gya, gz); /* gz -= gya */ \ + \ + /* sz = step(gw, 0.0); */ \ + vec4 sz; \ + glm_vec4_stepr(gz, 0.0f, sz); /* sz = step(gz, 0.0) */ \ + \ + /* gx0 -= sz0 * (step(0.0, gx0) - T(0.5)); */ \ + vec4 temp = {0.0f}; /* temp = 0.0 */ \ + glm_vec4_step(temp, gx, temp); /* temp = step(temp, gx) */ \ + glm_vec4_subs(temp, 0.5f, temp); /* temp -= 0.5 */ \ + glm_vec4_mul(sz, temp, temp); /* temp *= sz */ \ + glm_vec4_sub(gx, temp, gx); /* gx -= temp */ \ + \ + /* gy0 -= sz0 * (step(0.0, gy0) - T(0.5)); */ \ + glm_vec4_zero(temp); /* reset temp */ \ + glm_vec4_step(temp, gy, temp); /* temp = step(temp, gy) */ \ + glm_vec4_subs(temp, 0.5f, temp); /* temp -= 0.5 */ \ + glm_vec4_mul(sz, temp, temp); /* temp *= sz */ \ + glm_vec4_sub(gy, temp, gy); /* gy -= temp */ \ } +/* _glm_noiseDetail_i2gxy(vec4 i, vec4 gx, vec4 gy) */ +#define _glm_noiseDetail_i2gxy(i, gx, gy) { \ + /* gx = 2.0 * fract(i / 41.0) - 1.0; */ \ + glm_vec4_divs(i, 41.0f, gx); /* gx = i / 41.0 */ \ + glm_vec4_fract(gx, gx); /* gx = fract(gx) */ \ + glm_vec4_scale(gx, 2.0f, gx); /* gx *= 2.0 */ \ + glm_vec4_subs(gx, 1.0f, gx); /* gx -= 1.0 */ \ + \ + /* gy = abs(gx) - 0.5; */ \ + glm_vec4_abs(gx, gy); /* gy = abs(gx) */ \ + glm_vec4_subs(gy, 0.5f, gy); /* gy -= 0.5 */ \ + \ + /* tx = floor(gx + 0.5); */ \ + vec4 tx; \ + glm_vec4_adds(gx, 0.5f, tx); /* tx = gx + 0.5 */ \ + glm_vec4_floor(tx, tx); /* tx = floor(tx) */ \ + \ + /* gx = gx - tx; */ \ + glm_vec4_sub(gx, tx, gx); /* gx -= tx */ \ +} -/*! - * @brief Normalize 3D gradients inplace - * - * @param[in, out] g00_ gradient from point 00 - * @param[in, out] g01_ gradient from point 01 - * @param[in, out] g10_ gradient from point 10 - * @param[in, out] g11_ gradient from point 11 +/* ============================================================================ + * Classic perlin noise + * ============================================================================ */ -CGLM_INLINE -void -_glm_noiseDetail_gradNorm_vec3(vec3 g00_, vec3 g01_, vec3 g10_, vec3 g11_) { - - // norm = taylorInvSqrt(vec4( - // dot(g00_, g00_), - // dot(g01_, g01_), - // dot(g10_, g10_), - // dot(g11_, g11_) - // )); - vec4 norm; - norm[0] = glm_vec3_dot(g00_, g00_); // norm.x = dot(g00_, g00_) - norm[1] = glm_vec3_dot(g01_, g01_); // norm.y = dot(g01_, g01_) - norm[2] = glm_vec3_dot(g10_, g10_); // norm.z = dot(g10_, g10_) - norm[3] = glm_vec3_dot(g11_, g11_); // norm.w = dot(g11_, g11_) - _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) - - glm_vec3_scale(g00_, norm[0], g00_); // g00_ *= norm.x - glm_vec3_scale(g01_, norm[1], g01_); // g01_ *= norm.y - glm_vec3_scale(g10_, norm[2], g10_); // g10_ *= norm.z - glm_vec3_scale(g11_, norm[3], g11_); // g11_ *= norm.w -} - -/*! - * @brief Normalize 2D gradients inplace - * - * @param[in, out] g00 gradient from point 00 - * @param[in, out] g01 gradient from point 01 - * @param[in, out] g10 gradient from point 10 - * @param[in, out] g11 gradient from point 11 - */ -CGLM_INLINE -void -_glm_noiseDetail_gradNorm_vec2(vec2 g00, vec2 g01, vec2 g10, vec2 g11) { - - // norm = taylorInvSqrt(vec4( - // dot(g00, g00), - // dot(g01, g01), - // dot(g10, g10), - // dot(g11, g11) - // )); - vec4 norm; - norm[0] = glm_vec2_dot(g00, g00); // norm.x = dot(g00, g00) - norm[1] = glm_vec2_dot(g01, g01); // norm.y = dot(g01, g01) - norm[2] = glm_vec2_dot(g10, g10); // norm.z = dot(g10, g10) - norm[3] = glm_vec2_dot(g11, g11); // norm.w = dot(g11, g11) - _glm_noiseDetail_taylorInvSqrt(norm, norm); // norm = taylorInvSqrt(norm) - - glm_vec2_scale(g00, norm[0], g00); // g00 *= norm.x - glm_vec2_scale(g01, norm[1], g01); // g01 *= norm.y - glm_vec2_scale(g10, norm[2], g10); // g10 *= norm.z - glm_vec2_scale(g11, norm[3], g11); // g11 *= norm.w -} - - -CGLM_INLINE -void -_glm_noiseDetail_i2gxyzw( - vec4 ixy, - /* out */ - vec4 gx, - vec4 gy, - vec4 gz, - vec4 gw -) { - // gx = ixy / 7.0 - glm_vec4_divs(ixy, 7.0f, gx); // gx = ixy / 7.0 - - // gy = fract(gx) / 7.0 - glm_vec4_floor(gx, gy); // gy = floor(gx) - glm_vec4_divs(gy, 7.0f, gy); // gy /= 7.0 - - // gz = floor(gy) / 6.0 - glm_vec4_floor(gy, gz); // gz = floor(gy) - glm_vec4_divs(gz, 6.0f, gz); // gz /= 6.0 - - // gx = fract(gx) - 0.5f - glm_vec4_fract(gx, gx); // gx = fract(gx) - glm_vec4_subs(gx, 0.5f, gx); // gx -= 0.5f - - // gy = fract(gy) - 0.5f - glm_vec4_fract(gy, gy); // gy = fract(gy) - glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5f - - // gz = fract(gz) - 0.5f - glm_vec4_fract(gz, gz); // gz = fract(gz) - glm_vec4_subs(gz, 0.5f, gz); // gz -= 0.5f - - // abs(gx), abs(gy), abs(gz) - vec4 gxa, gya, gza; - glm_vec4_abs(gx, gxa); // gxa = abs(gx) - glm_vec4_abs(gy, gya); // gya = abs(gy) - glm_vec4_abs(gz, gza); // gza = abs(gz) - - // gw = 0.75 - abs(gx) - abs(gy) - abs(gz) - glm_vec4_fill(gw, 0.75f); // gw = 0.75 - glm_vec4_sub(gw, gxa, gw); // gw -= gxa - glm_vec4_sub(gw, gza, gw); // gw -= gza - glm_vec4_sub(gw, gya, gw); // gw -= gya - - // sw = step(gw, 0.0); - vec4 sw; - glm_vec4_stepr(gw, 0.0f, sw); // sw = step(gw, 0.0) - - // gx -= sw * (step(vec4(0), gx) - T(0.5)); - vec4 temp = {0.0f}; // temp = 0.0 - glm_vec4_step(temp, gx, temp); // temp = step(temp, gx) - glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 - glm_vec4_mul(sw, temp, temp); // temp *= sw - glm_vec4_sub(gx, temp, gx); // gx -= temp - - // gy -= sw * (step(vec4(0), gy) - T(0.5)); - glm_vec4_zero(temp); // reset temp - glm_vec4_step(temp, gy, temp); // temp = step(temp, gy) - glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 - glm_vec4_mul(sw, temp, temp); // temp *= sw - glm_vec4_sub(gy, temp, gy); // gy -= temp -} - - -CGLM_INLINE -void -_glm_noiseDetail_i2gxyz( - vec4 ixy, - /* out */ - vec4 gx, - vec4 gy, - vec4 gz -) { - // NOTE: This function is not *quite* analogous to _glm_noiseDetail_i2gxyzw - // to try to match the output of glm::perlin. I think it might be a bug in - // in the original implementation, but for now I'm keeping it consistent. -MK - - // gx = ixy / 7.0 - glm_vec4_divs(ixy, 7.0f, gx); // gx = ixy / 7.0 - - // gy = fract(floor(gx0) / 7.0)) - 0.5; - glm_vec4_floor(gx, gy); // gy = floor(gx) - glm_vec4_divs(gy, 7.0f, gy); // gy /= 7.0 - glm_vec4_fract(gy, gy); // gy = fract(gy) - glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5f - - // gx = fract(gx); - glm_vec4_fract(gx, gx); // gx = fract(gx) - - // abs(gx), abs(gy) - vec4 gxa, gya; - glm_vec4_abs(gx, gxa); // gxa = abs(gx) - glm_vec4_abs(gy, gya); // gya = abs(gy) - - // gz = vec4(0.5) - abs(gx0) - abs(gy0); - glm_vec4_fill(gz, 0.5f); // gz = 0.5 - glm_vec4_sub(gz, gxa, gz); // gz -= gxa - glm_vec4_sub(gz, gya, gz); // gz -= gya - - - // sz = step(gw, 0.0); - vec4 sz; - glm_vec4_stepr(gz, 0.0f, sz); // sz = step(gz, 0.0) - - // gx0 -= sz0 * (step(0.0, gx0) - T(0.5)); - vec4 temp = {0.0f}; // temp = 0.0 - glm_vec4_step(temp, gx, temp); // temp = step(temp, gx) - glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 - glm_vec4_mul(sz, temp, temp); // temp *= sz - glm_vec4_sub(gx, temp, gx); // gx -= temp - - // gy0 -= sz0 * (step(0.0, gy0) - T(0.5)); - glm_vec4_zero(temp); // reset temp - glm_vec4_step(temp, gy, temp); // temp = step(temp, gy) - glm_vec4_subs(temp, 0.5f, temp); // temp -= 0.5 - glm_vec4_mul(sz, temp, temp); // temp *= sz - glm_vec4_sub(gy, temp, gy); // gy -= temp -} - -CGLM_INLINE -void -_glm_noiseDetail_i2gxy( - vec4 i, - /* out */ - vec4 gx, - vec4 gy -) { - // vec<4, T, Q> gx = static_cast(2) * glm::fract(i / T(41)) - T(1); - // vec<4, T, Q> gy = glm::abs(gx) - T(0.5); - // vec<4, T, Q> tx = glm::floor(gx + T(0.5)); - // gx = gx - tx; - - - // gx = 2.0 * fract(i / 41.0) - 1.0; - glm_vec4_divs(i, 41.0f, gx); // gx = i / 41.0 - glm_vec4_fract(gx, gx); // gx = fract(gx) - glm_vec4_scale(gx, 2.0f, gx); // gx *= 2.0 - glm_vec4_subs(gx, 1.0f, gx); // gx -= 1.0 - - // gy = abs(gx) - 0.5; - glm_vec4_abs(gx, gy); // gy = abs(gx) - glm_vec4_subs(gy, 0.5f, gy); // gy -= 0.5 - - // tx = floor(gx + 0.5); - vec4 tx; - glm_vec4_adds(gx, 0.5f, tx); // tx = gx + 0.5 - glm_vec4_floor(tx, tx); // tx = floor(tx) - - // gx = gx - tx; - glm_vec4_sub(gx, tx, gx); // gx -= tx -} - - -////////////////////////////// -// Perlin noise /*! * @brief Classic perlin noise @@ -759,5 +675,19 @@ glm_perlin_vec2(vec2 point) { return n_xy * 2.3f; } +/* Undefine all helper macros */ + +#undef _glm_noiseDetail_mod289 +#undef _glm_noiseDetail_permute +#undef _glm_noiseDetail_fade_vec4 +#undef _glm_noiseDetail_fade_vec3 +#undef _glm_noiseDetail_fade_vec2 +#undef _glm_noiseDetail_taylorInvSqrt +#undef _glm_noiseDetail_gradNorm_vec4 +#undef _glm_noiseDetail_gradNorm_vec3 +#undef _glm_noiseDetail_gradNorm_vec2 +#undef _glm_noiseDetail_i2gxyzw +#undef _glm_noiseDetail_i2gxyz +#undef _glm_noiseDetail_i2gxy #endif /* cglm_noise_h */ From d3ad1645fc60ac5d80b741508d6799a50237ded4 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 20:06:44 +0000 Subject: [PATCH 094/128] purged // comments in noise.h --- include/cglm/noise.h | 350 +++++++++++++++++++++---------------------- 1 file changed, 175 insertions(+), 175 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index a7e30df..e06d633 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -178,7 +178,7 @@ * in the original implementation, but for now I'm keeping it consistent. -MK */ -// _glm_noiseDetail_i2gxyz(vec4 i, vec4 gx, vec4 gy, vec4 gz) +/* _glm_noiseDetail_i2gxyz(vec4 i, vec4 gx, vec4 gy, vec4 gz) */ #define _glm_noiseDetail_i2gxyz(ixy, gx, gy, gz) { \ /* gx = ixy / 7.0 */ \ glm_vec4_divs(ixy, 7.0f, gx); /* gx = ixy / 7.0 */ \ @@ -256,71 +256,71 @@ CGLM_INLINE float glm_perlin_vec4(vec4 point) { - // Integer part of p for indexing + /* Integer part of p for indexing */ vec4 Pi0; - glm_vec4_floor(point, Pi0); // Pi0 = floor(point); + glm_vec4_floor(point, Pi0); /* Pi0 = floor(point); */ - // Integer part + 1 + /* Integer part + 1 */ vec4 Pi1; - glm_vec4_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; + glm_vec4_adds(Pi0, 1.0f, Pi1); /* Pi1 = Pi0 + 1.0f; */ - glm_vec4_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); - glm_vec4_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); + glm_vec4_mods(Pi0, 289.0f, Pi0); /* Pi0 = mod(Pi0, 289.0f); */ + glm_vec4_mods(Pi1, 289.0f, Pi1); /* Pi1 = mod(Pi1, 289.0f); */ - // Fractional part of p for interpolation + /* Fractional part of p for interpolation */ vec4 Pf0; glm_vec4_fract(point, Pf0); - // Fractional part - 1.0 + /* Fractional part - 1.0 */ vec4 Pf1; glm_vec4_subs(Pf0, 1.0f, Pf1); vec4 ix = {Pi0[0], Pi1[0], Pi0[0], Pi1[0]}; vec4 iy = {Pi0[1], Pi0[1], Pi1[1], Pi1[1]}; - vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; // iz0 = vec4(Pi0.z); - vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; // iz1 = vec4(Pi1.z); - vec4 iw0 = {Pi0[3], Pi0[3], Pi0[3], Pi0[3]}; // iw0 = vec4(Pi0.w); - vec4 iw1 = {Pi1[3], Pi1[3], Pi1[3], Pi1[3]}; // iw1 = vec4(Pi1.w); + vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; /* iz0 = vec4(Pi0.z); */ + vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; /* iz1 = vec4(Pi1.z); */ + vec4 iw0 = {Pi0[3], Pi0[3], Pi0[3], Pi0[3]}; /* iw0 = vec4(Pi0.w); */ + vec4 iw1 = {Pi1[3], Pi1[3], Pi1[3], Pi1[3]}; /* iw1 = vec4(Pi1.w); */ - // ------------ + /* ------------ */ - // ixy = permute(permute(ix) + iy) + /* ixy = permute(permute(ix) + iy) */ vec4 ixy; - _glm_noiseDetail_permute(ix, ixy); // ixy = permute(ix) - glm_vec4_add(ixy, iy, ixy); // ixy += iy; - _glm_noiseDetail_permute(ixy, ixy); // ixy = permute(ixy) + _glm_noiseDetail_permute(ix, ixy); /* ixy = permute(ix) */ + glm_vec4_add(ixy, iy, ixy); /* ixy += iy; */ + _glm_noiseDetail_permute(ixy, ixy); /* ixy = permute(ixy) */ - // ixy0 = permute(ixy + iz0) + /* ixy0 = permute(ixy + iz0) */ vec4 ixy0; - glm_vec4_add(ixy, iz0, ixy0); // ixy0 = ixy + iz0 - _glm_noiseDetail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) + glm_vec4_add(ixy, iz0, ixy0); /* ixy0 = ixy + iz0 */ + _glm_noiseDetail_permute(ixy0, ixy0); /* ixy0 = permute(ixy0) */ - // ixy1 = permute(ixy + iz1) + /* ixy1 = permute(ixy + iz1) */ vec4 ixy1; - glm_vec4_add(ixy, iz1, ixy1); // ixy1 = ixy, iz1 - _glm_noiseDetail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) + glm_vec4_add(ixy, iz1, ixy1); /* ixy1 = ixy, iz1 */ + _glm_noiseDetail_permute(ixy1, ixy1); /* ixy1 = permute(ixy1) */ - // ixy00 = permute(ixy0 + iw0) + /* ixy00 = permute(ixy0 + iw0) */ vec4 ixy00; - glm_vec4_add(ixy0, iw0, ixy00); // ixy00 = ixy0 + iw0 - _glm_noiseDetail_permute(ixy00, ixy00); // ixy00 = permute(ixy00) + glm_vec4_add(ixy0, iw0, ixy00); /* ixy00 = ixy0 + iw0 */ + _glm_noiseDetail_permute(ixy00, ixy00); /* ixy00 = permute(ixy00) */ - // ixy01 = permute(ixy0 + iw1) + /* ixy01 = permute(ixy0 + iw1) */ vec4 ixy01; - glm_vec4_add(ixy0, iw1, ixy01); // ixy01 = ixy0 + iw1 - _glm_noiseDetail_permute(ixy01, ixy01); // ixy01 = permute(ixy01) + glm_vec4_add(ixy0, iw1, ixy01); /* ixy01 = ixy0 + iw1 */ + _glm_noiseDetail_permute(ixy01, ixy01); /* ixy01 = permute(ixy01) */ - // ixy10 = permute(ixy1 + iw0) + /* ixy10 = permute(ixy1 + iw0) */ vec4 ixy10; - glm_vec4_add(ixy1, iw0, ixy10); // ixy10 = ixy1 + iw0 - _glm_noiseDetail_permute(ixy10, ixy10); // ixy10 = permute(ixy10) + glm_vec4_add(ixy1, iw0, ixy10); /* ixy10 = ixy1 + iw0 */ + _glm_noiseDetail_permute(ixy10, ixy10); /* ixy10 = permute(ixy10) */ - // ixy11 = permute(ixy1 + iw1) + /* ixy11 = permute(ixy1 + iw1) */ vec4 ixy11; - glm_vec4_add(ixy1, iw1, ixy11); // ixy11 = ixy1 + iw1 - _glm_noiseDetail_permute(ixy11, ixy11); // ixy11 = permute(ixy11) + glm_vec4_add(ixy1, iw1, ixy11); /* ixy11 = ixy1 + iw1 */ + _glm_noiseDetail_permute(ixy11, ixy11); /* ixy11 = permute(ixy11) */ - // ------------ + /* ------------ */ vec4 gx00, gy00, gz00, gw00; _glm_noiseDetail_i2gxyzw(ixy00, gx00, gy00, gz00, gw00); @@ -334,123 +334,123 @@ glm_perlin_vec4(vec4 point) { vec4 gx11, gy11, gz11, gw11; _glm_noiseDetail_i2gxyzw(ixy11, gx11, gy11, gz11, gw11); - // ------------ + /* ------------ */ - vec4 g0000 = {gx00[0], gy00[0], gz00[0], gw00[0]}; // g0000 = vec4(gx00.x, gy00.x, gz00.x, gw00.x); - vec4 g0100 = {gx00[2], gy00[2], gz00[2], gw00[2]}; // g0100 = vec4(gx00.z, gy00.z, gz00.z, gw00.z); - vec4 g1000 = {gx00[1], gy00[1], gz00[1], gw00[1]}; // g1000 = vec4(gx00.y, gy00.y, gz00.y, gw00.y); - vec4 g1100 = {gx00[3], gy00[3], gz00[3], gw00[3]}; // g1100 = vec4(gx00.w, gy00.w, gz00.w, gw00.w); + vec4 g0000 = {gx00[0], gy00[0], gz00[0], gw00[0]}; /* g0000 = vec4(gx00.x, gy00.x, gz00.x, gw00.x); */ + vec4 g0100 = {gx00[2], gy00[2], gz00[2], gw00[2]}; /* g0100 = vec4(gx00.z, gy00.z, gz00.z, gw00.z); */ + vec4 g1000 = {gx00[1], gy00[1], gz00[1], gw00[1]}; /* g1000 = vec4(gx00.y, gy00.y, gz00.y, gw00.y); */ + vec4 g1100 = {gx00[3], gy00[3], gz00[3], gw00[3]}; /* g1100 = vec4(gx00.w, gy00.w, gz00.w, gw00.w); */ - vec4 g0001 = {gx01[0], gy01[0], gz01[0], gw01[0]}; // g0001 = vec4(gx01.x, gy01.x, gz01.x, gw01.x); - vec4 g0101 = {gx01[2], gy01[2], gz01[2], gw01[2]}; // g0101 = vec4(gx01.z, gy01.z, gz01.z, gw01.z); - vec4 g1001 = {gx01[1], gy01[1], gz01[1], gw01[1]}; // g1001 = vec4(gx01.y, gy01.y, gz01.y, gw01.y); - vec4 g1101 = {gx01[3], gy01[3], gz01[3], gw01[3]}; // g1101 = vec4(gx01.w, gy01.w, gz01.w, gw01.w); + vec4 g0001 = {gx01[0], gy01[0], gz01[0], gw01[0]}; /* g0001 = vec4(gx01.x, gy01.x, gz01.x, gw01.x); */ + vec4 g0101 = {gx01[2], gy01[2], gz01[2], gw01[2]}; /* g0101 = vec4(gx01.z, gy01.z, gz01.z, gw01.z); */ + vec4 g1001 = {gx01[1], gy01[1], gz01[1], gw01[1]}; /* g1001 = vec4(gx01.y, gy01.y, gz01.y, gw01.y); */ + vec4 g1101 = {gx01[3], gy01[3], gz01[3], gw01[3]}; /* g1101 = vec4(gx01.w, gy01.w, gz01.w, gw01.w); */ - vec4 g0010 = {gx10[0], gy10[0], gz10[0], gw10[0]}; // g0010 = vec4(gx10.x, gy10.x, gz10.x, gw10.x); - vec4 g0110 = {gx10[2], gy10[2], gz10[2], gw10[2]}; // g0110 = vec4(gx10.z, gy10.z, gz10.z, gw10.z); - vec4 g1010 = {gx10[1], gy10[1], gz10[1], gw10[1]}; // g1010 = vec4(gx10.y, gy10.y, gz10.y, gw10.y); - vec4 g1110 = {gx10[3], gy10[3], gz10[3], gw10[3]}; // g1110 = vec4(gx10.w, gy10.w, gz10.w, gw10.w); + vec4 g0010 = {gx10[0], gy10[0], gz10[0], gw10[0]}; /* g0010 = vec4(gx10.x, gy10.x, gz10.x, gw10.x); */ + vec4 g0110 = {gx10[2], gy10[2], gz10[2], gw10[2]}; /* g0110 = vec4(gx10.z, gy10.z, gz10.z, gw10.z); */ + vec4 g1010 = {gx10[1], gy10[1], gz10[1], gw10[1]}; /* g1010 = vec4(gx10.y, gy10.y, gz10.y, gw10.y); */ + vec4 g1110 = {gx10[3], gy10[3], gz10[3], gw10[3]}; /* g1110 = vec4(gx10.w, gy10.w, gz10.w, gw10.w); */ - vec4 g0011 = {gx11[0], gy11[0], gz11[0], gw11[0]}; // g0011 = vec4(gx11.x, gy11.x, gz11.x, gw11.x); - vec4 g0111 = {gx11[2], gy11[2], gz11[2], gw11[2]}; // g0111 = vec4(gx11.z, gy11.z, gz11.z, gw11.z); - vec4 g1011 = {gx11[1], gy11[1], gz11[1], gw11[1]}; // g1011 = vec4(gx11.y, gy11.y, gz11.y, gw11.y); - vec4 g1111 = {gx11[3], gy11[3], gz11[3], gw11[3]}; // g1111 = vec4(gx11.w, gy11.w, gz11.w, gw11.w); + vec4 g0011 = {gx11[0], gy11[0], gz11[0], gw11[0]}; /* g0011 = vec4(gx11.x, gy11.x, gz11.x, gw11.x); */ + vec4 g0111 = {gx11[2], gy11[2], gz11[2], gw11[2]}; /* g0111 = vec4(gx11.z, gy11.z, gz11.z, gw11.z); */ + vec4 g1011 = {gx11[1], gy11[1], gz11[1], gw11[1]}; /* g1011 = vec4(gx11.y, gy11.y, gz11.y, gw11.y); */ + vec4 g1111 = {gx11[3], gy11[3], gz11[3], gw11[3]}; /* g1111 = vec4(gx11.w, gy11.w, gz11.w, gw11.w); */ _glm_noiseDetail_gradNorm_vec4(g0000, g0100, g1000, g1100); _glm_noiseDetail_gradNorm_vec4(g0001, g0101, g1001, g1101); _glm_noiseDetail_gradNorm_vec4(g0010, g0110, g1010, g1110); _glm_noiseDetail_gradNorm_vec4(g0011, g0111, g1011, g1111); - // ------------ + /* ------------ */ - float n0000 = glm_vec4_dot(g0000, Pf0); // n0000 = dot(g0000, Pf0) + float n0000 = glm_vec4_dot(g0000, Pf0); /* n0000 = dot(g0000, Pf0) */ - // n1000 = dot(g1000, vec4(Pf1.x, Pf0.y, Pf0.z, Pf0.w)) + /* n1000 = dot(g1000, vec4(Pf1.x, Pf0.y, Pf0.z, Pf0.w)) */ vec4 n1000d = {Pf1[0], Pf0[1], Pf0[2], Pf0[3]}; float n1000 = glm_vec4_dot(g1000, n1000d); - // n0100 = dot(g0100, vec4(Pf0.x, Pf1.y, Pf0.z, Pf0.w)) + /* n0100 = dot(g0100, vec4(Pf0.x, Pf1.y, Pf0.z, Pf0.w)) */ vec4 n0100d = {Pf0[0], Pf1[1], Pf0[2], Pf0[3]}; float n0100 = glm_vec4_dot(g0100, n0100d); - // n1100 = dot(g1100, vec4(Pf1.x, Pf1.y, Pf0.z, Pf0.w)) + /* n1100 = dot(g1100, vec4(Pf1.x, Pf1.y, Pf0.z, Pf0.w)) */ vec4 n1100d = {Pf1[0], Pf1[1], Pf0[2], Pf0[3]}; float n1100 = glm_vec4_dot(g1100, n1100d); - // n0010 = dot(g0010, vec4(Pf0.x, Pf0.y, Pf1.z, Pf0.w)) + /* n0010 = dot(g0010, vec4(Pf0.x, Pf0.y, Pf1.z, Pf0.w)) */ vec4 n0010d = {Pf0[0], Pf0[1], Pf1[2], Pf0[3]}; float n0010 = glm_vec4_dot(g0010, n0010d); - // n1010 = dot(g1010, vec4(Pf1.x, Pf0.y, Pf1.z, Pf0.w)) + /* n1010 = dot(g1010, vec4(Pf1.x, Pf0.y, Pf1.z, Pf0.w)) */ vec4 n1010d = {Pf1[0], Pf0[1], Pf1[2], Pf0[3]}; float n1010 = glm_vec4_dot(g1010, n1010d); - // n0110 = dot(g0110, vec4(Pf0.x, Pf1.y, Pf1.z, Pf0.w)) + /* n0110 = dot(g0110, vec4(Pf0.x, Pf1.y, Pf1.z, Pf0.w)) */ vec4 n0110d = {Pf0[0], Pf1[1], Pf1[2], Pf0[3]}; float n0110 = glm_vec4_dot(g0110, n0110d); - // n1110 = dot(g1110, vec4(Pf1.x, Pf1.y, Pf1.z, Pf0.w)) + /* n1110 = dot(g1110, vec4(Pf1.x, Pf1.y, Pf1.z, Pf0.w)) */ vec4 n1110d = {Pf1[0], Pf1[1], Pf1[2], Pf0[3]}; float n1110 = glm_vec4_dot(g1110, n1110d); - // n0001 = dot(g0001, vec4(Pf0.x, Pf0.y, Pf0.z, Pf1.w)) + /* n0001 = dot(g0001, vec4(Pf0.x, Pf0.y, Pf0.z, Pf1.w)) */ vec4 n0001d = {Pf0[0], Pf0[1], Pf0[2], Pf1[3]}; float n0001 = glm_vec4_dot(g0001, n0001d); - // n1001 = dot(g1001, vec4(Pf1.x, Pf0.y, Pf0.z, Pf1.w)) + /* n1001 = dot(g1001, vec4(Pf1.x, Pf0.y, Pf0.z, Pf1.w)) */ vec4 n1001d = {Pf1[0], Pf0[1], Pf0[2], Pf1[3]}; float n1001 = glm_vec4_dot(g1001, n1001d); - // n0101 = dot(g0101, vec4(Pf0.x, Pf1.y, Pf0.z, Pf1.w)) + /* n0101 = dot(g0101, vec4(Pf0.x, Pf1.y, Pf0.z, Pf1.w)) */ vec4 n0101d = {Pf0[0], Pf1[1], Pf0[2], Pf1[3]}; float n0101 = glm_vec4_dot(g0101, n0101d); - // n1101 = dot(g1101, vec4(Pf1.x, Pf1.y, Pf0.z, Pf1.w)) + /* n1101 = dot(g1101, vec4(Pf1.x, Pf1.y, Pf0.z, Pf1.w)) */ vec4 n1101d = {Pf1[0], Pf1[1], Pf0[2], Pf1[3]}; float n1101 = glm_vec4_dot(g1101, n1101d); - // n0011 = dot(g0011, vec4(Pf0.x, Pf0.y, Pf1.z, Pf1.w)) + /* n0011 = dot(g0011, vec4(Pf0.x, Pf0.y, Pf1.z, Pf1.w)) */ vec4 n0011d = {Pf0[0], Pf0[1], Pf1[2], Pf1[3]}; float n0011 = glm_vec4_dot(g0011, n0011d); - // n1011 = dot(g1011, vec4(Pf1.x, Pf0.y, Pf1.z, Pf1.w)) + /* n1011 = dot(g1011, vec4(Pf1.x, Pf0.y, Pf1.z, Pf1.w)) */ vec4 n1011d = {Pf1[0], Pf0[1], Pf1[2], Pf1[3]}; float n1011 = glm_vec4_dot(g1011, n1011d); - // n0111 = dot(g0111, vec4(Pf0.x, Pf1.y, Pf1.z, Pf1.w)) + /* n0111 = dot(g0111, vec4(Pf0.x, Pf1.y, Pf1.z, Pf1.w)) */ vec4 n0111d = {Pf0[0], Pf1[1], Pf1[2], Pf1[3]}; float n0111 = glm_vec4_dot(g0111, n0111d); - float n1111 = glm_vec4_dot(g1111, Pf1); // n1111 = dot(g1111, Pf1) + float n1111 = glm_vec4_dot(g1111, Pf1); /* n1111 = dot(g1111, Pf1) */ - // ------------ + /* ------------ */ vec4 fade_xyzw; - _glm_noiseDetail_fade_vec4(Pf0, fade_xyzw); // fade_xyzw = fade(Pf0) + _glm_noiseDetail_fade_vec4(Pf0, fade_xyzw); /* fade_xyzw = fade(Pf0) */ - // n_0w = lerp(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w) + /* n_0w = lerp(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w) */ vec4 n_0w1 = {n0000, n1000, n0100, n1100}; vec4 n_0w2 = {n0001, n1001, n0101, n1101}; vec4 n_0w; glm_vec4_lerp(n_0w1, n_0w2, fade_xyzw[3], n_0w); - // n_1w = lerp(vec4(n0010, n1010, n0110, n1110), vec4(n0011, n1011, n0111, n1111), fade_xyzw.w) + /* n_1w = lerp(vec4(n0010, n1010, n0110, n1110), vec4(n0011, n1011, n0111, n1111), fade_xyzw.w) */ vec4 n_1w1 = {n0010, n1010, n0110, n1110}; vec4 n_1w2 = {n0011, n1011, n0111, n1111}; vec4 n_1w; glm_vec4_lerp(n_1w1, n_1w2, fade_xyzw[3], n_1w); - // n_zw = lerp(n_0w, n_1w, fade_xyzw.z) + /* n_zw = lerp(n_0w, n_1w, fade_xyzw.z) */ vec4 n_zw; glm_vec4_lerp(n_0w, n_1w, fade_xyzw[2], n_zw); - // n_yzw = lerp(vec2(n_zw.x, n_zw.y), vec2(n_zw.z, n_zw.w), fade_xyzw.y) + /* n_yzw = lerp(vec2(n_zw.x, n_zw.y), vec2(n_zw.z, n_zw.w), fade_xyzw.y) */ vec2 n_yzw; vec2 n_yzw1 = {n_zw[0], n_zw[1]}; vec2 n_yzw2 = {n_zw[2], n_zw[3]}; glm_vec2_lerp(n_yzw1, n_yzw2, fade_xyzw[1], n_yzw); - // n_xyzw = lerp(n_yzw.x, n_yzw.y, fade_xyzw.x) + /* n_xyzw = lerp(n_yzw.x, n_yzw.y, fade_xyzw.x) */ float n_xyzw = glm_lerp(n_yzw[0], n_yzw[1], fade_xyzw[0]); return n_xyzw * 2.2f; @@ -466,49 +466,49 @@ glm_perlin_vec4(vec4 point) { CGLM_INLINE float glm_perlin_vec3(vec3 point) { - // Integer part of p for indexing + /* Integer part of p for indexing */ vec3 Pi0; - glm_vec3_floor(point, Pi0); // Pi0 = floor(point); + glm_vec3_floor(point, Pi0); /* Pi0 = floor(point); */ - // Integer part + 1 + /* Integer part + 1 */ vec3 Pi1; - glm_vec3_adds(Pi0, 1.0f, Pi1); // Pi1 = Pi0 + 1.0f; + glm_vec3_adds(Pi0, 1.0f, Pi1); /* Pi1 = Pi0 + 1.0f; */ - glm_vec3_mods(Pi0, 289.0f, Pi0); // Pi0 = mod(Pi0, 289.0f); - glm_vec3_mods(Pi1, 289.0f, Pi1); // Pi1 = mod(Pi1, 289.0f); + glm_vec3_mods(Pi0, 289.0f, Pi0); /* Pi0 = mod(Pi0, 289.0f); */ + glm_vec3_mods(Pi1, 289.0f, Pi1); /* Pi1 = mod(Pi1, 289.0f); */ - // Fractional part of p for interpolation + /* Fractional part of p for interpolation */ vec3 Pf0; glm_vec3_fract(point, Pf0); - // Fractional part - 1.0 + /* Fractional part - 1.0 */ vec3 Pf1; glm_vec3_subs(Pf0, 1.0f, Pf1); vec4 ix = {Pi0[0], Pi1[0], Pi0[0], Pi1[0]}; vec4 iy = {Pi0[1], Pi0[1], Pi1[1], Pi1[1]}; - vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; // iz0 = vec4(Pi0.z); - vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; // iz1 = vec4(Pi1.z); + vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; /* iz0 = vec4(Pi0.z); */ + vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; /* iz1 = vec4(Pi1.z); */ - // ------------ + /* ------------ */ - // ixy = permute(permute(ix) + iy) + /* ixy = permute(permute(ix) + iy) */ vec4 ixy; - _glm_noiseDetail_permute(ix, ixy); // ixy = permute(ix) - glm_vec4_add(ixy, iy, ixy); // ixy += iy; - _glm_noiseDetail_permute(ixy, ixy); // ixy = permute(ixy) + _glm_noiseDetail_permute(ix, ixy); /* ixy = permute(ix) */ + glm_vec4_add(ixy, iy, ixy); /* ixy += iy; */ + _glm_noiseDetail_permute(ixy, ixy); /* ixy = permute(ixy) */ - // ixy0 = permute(ixy + iz0) + /* ixy0 = permute(ixy + iz0) */ vec4 ixy0; - glm_vec4_add(ixy, iz0, ixy0); // ixy0 = ixy + iz0 - _glm_noiseDetail_permute(ixy0, ixy0); // ixy0 = permute(ixy0) + glm_vec4_add(ixy, iz0, ixy0); /* ixy0 = ixy + iz0 */ + _glm_noiseDetail_permute(ixy0, ixy0); /* ixy0 = permute(ixy0) */ - // ixy1 = permute(ixy + iz1) + /* ixy1 = permute(ixy + iz1) */ vec4 ixy1; - glm_vec4_add(ixy, iz1, ixy1); // ixy1 = ixy, iz1 - _glm_noiseDetail_permute(ixy1, ixy1); // ixy1 = permute(ixy1) + glm_vec4_add(ixy, iz1, ixy1); /* ixy1 = ixy, iz1 */ + _glm_noiseDetail_permute(ixy1, ixy1); /* ixy1 = permute(ixy1) */ - // ------------ + /* ------------ */ vec4 gx0, gy0, gz0; _glm_noiseDetail_i2gxyz(ixy0, gx0, gy0, gz0); @@ -516,69 +516,69 @@ glm_perlin_vec3(vec3 point) { vec4 gx1, gy1, gz1; _glm_noiseDetail_i2gxyz(ixy1, gx1, gy1, gz1); - // ------------ + /* ------------ */ - vec3 g000 = {gx0[0], gy0[0], gz0[0]}; // g000 = vec3(gx0.x, gy0.x, gz0.x); - vec3 g100 = {gx0[1], gy0[1], gz0[1]}; // g100 = vec3(gx0.y, gy0.y, gz0.y); - vec3 g010 = {gx0[2], gy0[2], gz0[2]}; // g010 = vec3(gx0.z, gy0.z, gz0.z); - vec3 g110 = {gx0[3], gy0[3], gz0[3]}; // g110 = vec3(gx0.w, gy0.w, gz0.w); + vec3 g000 = {gx0[0], gy0[0], gz0[0]}; /* g000 = vec3(gx0.x, gy0.x, gz0.x); */ + vec3 g100 = {gx0[1], gy0[1], gz0[1]}; /* g100 = vec3(gx0.y, gy0.y, gz0.y); */ + vec3 g010 = {gx0[2], gy0[2], gz0[2]}; /* g010 = vec3(gx0.z, gy0.z, gz0.z); */ + vec3 g110 = {gx0[3], gy0[3], gz0[3]}; /* g110 = vec3(gx0.w, gy0.w, gz0.w); */ - vec3 g001 = {gx1[0], gy1[0], gz1[0]}; // g001 = vec3(gx1.x, gy1.x, gz1.x); - vec3 g101 = {gx1[1], gy1[1], gz1[1]}; // g101 = vec3(gx1.y, gy1.y, gz1.y); - vec3 g011 = {gx1[2], gy1[2], gz1[2]}; // g011 = vec3(gx1.z, gy1.z, gz1.z); - vec3 g111 = {gx1[3], gy1[3], gz1[3]}; // g111 = vec3(gx1.w, gy1.w, gz1.w); + vec3 g001 = {gx1[0], gy1[0], gz1[0]}; /* g001 = vec3(gx1.x, gy1.x, gz1.x); */ + vec3 g101 = {gx1[1], gy1[1], gz1[1]}; /* g101 = vec3(gx1.y, gy1.y, gz1.y); */ + vec3 g011 = {gx1[2], gy1[2], gz1[2]}; /* g011 = vec3(gx1.z, gy1.z, gz1.z); */ + vec3 g111 = {gx1[3], gy1[3], gz1[3]}; /* g111 = vec3(gx1.w, gy1.w, gz1.w); */ _glm_noiseDetail_gradNorm_vec3(g000, g100, g010, g110); _glm_noiseDetail_gradNorm_vec3(g001, g101, g011, g111); - // ------------ + /* ------------ */ - float n000 = glm_vec3_dot(g000, Pf0); // n000 = dot(g000, Pf0) + float n000 = glm_vec3_dot(g000, Pf0); /* n000 = dot(g000, Pf0) */ - // n100 = dot(g100, vec3(Pf1.x, Pf0.y, Pf0.z)) + /* n100 = dot(g100, vec3(Pf1.x, Pf0.y, Pf0.z)) */ vec3 n100d = {Pf1[0], Pf0[1], Pf0[2]}; float n100 = glm_vec3_dot(g100, n100d); - // n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z)) + /* n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z)) */ vec3 n010d = {Pf0[0], Pf1[1], Pf0[2]}; float n010 = glm_vec3_dot(g010, n010d); - // n110 = dot(g110, vec3(Pf1.x, Pf1.y, Pf0.z)) + /* n110 = dot(g110, vec3(Pf1.x, Pf1.y, Pf0.z)) */ vec3 n110d = {Pf1[0], Pf1[1], Pf0[2]}; float n110 = glm_vec3_dot(g110, n110d); - // n001 = dot(g001, vec3(Pf0.x, Pf0.y, Pf1.z)) + /* n001 = dot(g001, vec3(Pf0.x, Pf0.y, Pf1.z)) */ vec3 n001d = {Pf0[0], Pf0[1], Pf1[2]}; float n001 = glm_vec3_dot(g001, n001d); - // n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z)) + /* n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z)) */ vec3 n101d = {Pf1[0], Pf0[1], Pf1[2]}; float n101 = glm_vec3_dot(g101, n101d); - // n011 = dot(g011, vec3(Pf0.x, Pf1.y, Pf1.z)) + /* n011 = dot(g011, vec3(Pf0.x, Pf1.y, Pf1.z)) */ vec3 n011d = {Pf0[0], Pf1[1], Pf1[2]}; float n011 = glm_vec3_dot(g011, n011d); - float n111 = glm_vec3_dot(g111, Pf1); // n111 = dot(g111, Pf1) + float n111 = glm_vec3_dot(g111, Pf1); /* n111 = dot(g111, Pf1) */ - // ------------ + /* ------------ */ vec3 fade_xyz; - _glm_noiseDetail_fade_vec3(Pf0, fade_xyz); // fade_xyz = fade(Pf0) + _glm_noiseDetail_fade_vec3(Pf0, fade_xyz); /* fade_xyz = fade(Pf0) */ - // n_z = lerp(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); + /* n_z = lerp(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); */ vec4 n_z; vec4 n_z1 = {n000, n100, n010, n110}; vec4 n_z2 = {n001, n101, n011, n111}; glm_vec4_lerp(n_z1, n_z2, fade_xyz[2], n_z); - // vec2 n_yz = lerp(vec2(n_z.x, n_z.y), vec2(n_z.z, n_z.w), fade_xyz.y); + /* vec2 n_yz = lerp(vec2(n_z.x, n_z.y), vec2(n_z.z, n_z.w), fade_xyz.y); */ vec2 n_yz; vec2 n_yz1 = {n_z[0], n_z[1]}; vec2 n_yz2 = {n_z[2], n_z[3]}; glm_vec2_lerp(n_yz1, n_yz2, fade_xyz[1], n_yz); - // n_xyz = lerp(n_yz.x, n_yz.y, fade_xyz.x); + /* n_xyz = lerp(n_yz.x, n_yz.y, fade_xyz.x); */ float n_xyz = glm_lerp(n_yz[0], n_yz[1], fade_xyz[0]); return n_xyz * 2.2f; @@ -594,82 +594,82 @@ CGLM_INLINE float glm_perlin_vec2(vec2 point) { - // Integer part of p for indexing - // Pi = floor(vec4(point.x, point.y, point.x, point.y)) + vec4(0.0, 0.0, 1.0, 1.0); - vec4 Pi = {point[0], point[1], point[0], point[1]}; // Pi = vec4(point.x, point.y, point.x, point.y) - glm_vec4_floor(Pi, Pi); // Pi = floor(Pi) - Pi[2] += 1.0f; // Pi.z += 1.0 - Pi[3] += 1.0f; // Pi.w += 1.0 + /* Integer part of p for indexing */ + /* Pi = floor(vec4(point.x, point.y, point.x, point.y)) + vec4(0.0, 0.0, 1.0, 1.0); */ + vec4 Pi = {point[0], point[1], point[0], point[1]}; /* Pi = vec4(point.x, point.y, point.x, point.y) */ + glm_vec4_floor(Pi, Pi); /* Pi = floor(Pi) */ + Pi[2] += 1.0f; /* Pi.z += 1.0 */ + Pi[3] += 1.0f; /* Pi.w += 1.0 */ - // Fractional part of p for interpolation - // vec<4, T, Q> Pf = glm::fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); - vec4 Pf = {point[0], point[1], point[0], point[1]}; // Pf = vec4(point.x, point.y, point.x, point.y) - glm_vec4_fract(Pf, Pf); // Pf = fract(Pf) - Pf[2] -= 1.0f; // Pf.z -= 1.0 - Pf[3] -= 1.0f; // Pf.w -= 1.0 + /* Fractional part of p for interpolation */ + /* vec<4, T, Q> Pf = glm::fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); */ + vec4 Pf = {point[0], point[1], point[0], point[1]}; /* Pf = vec4(point.x, point.y, point.x, point.y) */ + glm_vec4_fract(Pf, Pf); /* Pf = fract(Pf) */ + Pf[2] -= 1.0f; /* Pf.z -= 1.0 */ + Pf[3] -= 1.0f; /* Pf.w -= 1.0 */ - // Mod to avoid truncation effects in permutation - glm_vec4_mods(Pi, 289.0f, Pi); // Pi = mod(Pi, 289.0f); + /* Mod to avoid truncation effects in permutation */ + glm_vec4_mods(Pi, 289.0f, Pi); /* Pi = mod(Pi, 289.0f); */ - vec4 ix = {Pi[0], Pi[2], Pi[0], Pi[2]}; // ix = vec4(Pi.x, Pi.z, Pi.x, Pi.z) - vec4 iy = {Pi[1], Pi[1], Pi[3], Pi[3]}; // iy = vec4(Pi.y, Pi.y, Pi.w, Pi.w) - vec4 fx = {Pf[0], Pf[2], Pf[0], Pf[2]}; // fx = vec4(Pf.x, Pf.z, Pf.x, Pf.z) - vec4 fy = {Pf[1], Pf[1], Pf[3], Pf[3]}; // fy = vec4(Pf.y, Pf.y, Pf.w, Pf.w) + vec4 ix = {Pi[0], Pi[2], Pi[0], Pi[2]}; /* ix = vec4(Pi.x, Pi.z, Pi.x, Pi.z) */ + vec4 iy = {Pi[1], Pi[1], Pi[3], Pi[3]}; /* iy = vec4(Pi.y, Pi.y, Pi.w, Pi.w) */ + vec4 fx = {Pf[0], Pf[2], Pf[0], Pf[2]}; /* fx = vec4(Pf.x, Pf.z, Pf.x, Pf.z) */ + vec4 fy = {Pf[1], Pf[1], Pf[3], Pf[3]}; /* fy = vec4(Pf.y, Pf.y, Pf.w, Pf.w) */ - // ------------ + /* ------------ */ - // i = permute(permute(ix) + iy); + /* i = permute(permute(ix) + iy); */ vec4 i; - _glm_noiseDetail_permute(ix, i); // i = permute(ix) - glm_vec4_add(i, iy, i); // i += iy; - _glm_noiseDetail_permute(i, i); // i = permute(i) + _glm_noiseDetail_permute(ix, i); /* i = permute(ix) */ + glm_vec4_add(i, iy, i); /* i += iy; */ + _glm_noiseDetail_permute(i, i); /* i = permute(i) */ - // ------------ + /* ------------ */ vec4 gx, gy; _glm_noiseDetail_i2gxy(i, gx, gy); - // ------------ + /* ------------ */ - vec2 g00 = {gx[0], gy[0]}; // g00 = vec2(gx.x, gy.x) - vec2 g10 = {gx[1], gy[1]}; // g10 = vec2(gx.y, gy.y) - vec2 g01 = {gx[2], gy[2]}; // g01 = vec2(gx.z, gy.z) - vec2 g11 = {gx[3], gy[3]}; // g11 = vec2(gx.w, gy.w) + vec2 g00 = {gx[0], gy[0]}; /* g00 = vec2(gx.x, gy.x) */ + vec2 g10 = {gx[1], gy[1]}; /* g10 = vec2(gx.y, gy.y) */ + vec2 g01 = {gx[2], gy[2]}; /* g01 = vec2(gx.z, gy.z) */ + vec2 g11 = {gx[3], gy[3]}; /* g11 = vec2(gx.w, gy.w) */ _glm_noiseDetail_gradNorm_vec2(g00, g10, g01, g11); - // ------------ + /* ------------ */ - // n00 = dot(g00, vec2(fx.x, fy.x)) - vec2 n00d = {fx[0], fy[0]}; // n00d = vec2(fx.x, fy.x) - float n00 = glm_vec2_dot(g00, n00d); // n00 = dot(g00, n00d) + /* n00 = dot(g00, vec2(fx.x, fy.x)) */ + vec2 n00d = {fx[0], fy[0]}; /* n00d = vec2(fx.x, fy.x) */ + float n00 = glm_vec2_dot(g00, n00d); /* n00 = dot(g00, n00d) */ - // n10 = dot(g10, vec2(fx.y, fy.y)) - vec2 n10d = {fx[1], fy[1]}; // n10d = vec2(fx.y, fy.y) - float n10 = glm_vec2_dot(g10, n10d); // n10 = dot(g10, n10d) + /* n10 = dot(g10, vec2(fx.y, fy.y)) */ + vec2 n10d = {fx[1], fy[1]}; /* n10d = vec2(fx.y, fy.y) */ + float n10 = glm_vec2_dot(g10, n10d); /* n10 = dot(g10, n10d) */ - // n01 = dot(g01, vec2(fx.z, fy.z)) - vec2 n01d = {fx[2], fy[2]}; // n01d = vec2(fx.z, fy.z) - float n01 = glm_vec2_dot(g01, n01d); // n01 = dot(g01, n01d) + /* n01 = dot(g01, vec2(fx.z, fy.z)) */ + vec2 n01d = {fx[2], fy[2]}; /* n01d = vec2(fx.z, fy.z) */ + float n01 = glm_vec2_dot(g01, n01d); /* n01 = dot(g01, n01d) */ - // n11 = dot(g11, vec2(fx.w, fy.w)) - vec2 n11d = {fx[3], fy[3]}; // n11d = vec2(fx.w, fy.w) - float n11 = glm_vec2_dot(g11, n11d); // n11 = dot(g11, n11d) + /* n11 = dot(g11, vec2(fx.w, fy.w)) */ + vec2 n11d = {fx[3], fy[3]}; /* n11d = vec2(fx.w, fy.w) */ + float n11 = glm_vec2_dot(g11, n11d); /* n11 = dot(g11, n11d) */ - // ------------ + /* ------------ */ - // fade_xyz = fade(vec2(Pf.x, Pf.y)) - vec2 fade_xy = {Pf[0], Pf[1]}; // fade_xy = vec2(Pf.x, Pf.y) - _glm_noiseDetail_fade_vec2(fade_xy, fade_xy); // fade_xy = fade(fade_xy) + /* fade_xyz = fade(vec2(Pf.x, Pf.y)) */ + vec2 fade_xy = {Pf[0], Pf[1]}; /* fade_xy = vec2(Pf.x, Pf.y) */ + _glm_noiseDetail_fade_vec2(fade_xy, fade_xy); /* fade_xy = fade(fade_xy) */ - // n_x = lerp(vec2(n00, n01), vec2(n10, n11), fade_xy.x); + /* n_x = lerp(vec2(n00, n01), vec2(n10, n11), fade_xy.x); */ vec2 n_x; - vec2 n_x1 = {n00, n01}; // n_x1 = vec2(n00, n01) - vec2 n_x2 = {n10, n11}; // n_x2 = vec2(n10, n11) - glm_vec2_lerp(n_x1, n_x2, fade_xy[0], n_x); // n_x = lerp(n_x1, n_x2, fade_xy.x) + vec2 n_x1 = {n00, n01}; /* n_x1 = vec2(n00, n01) */ + vec2 n_x2 = {n10, n11}; /* n_x2 = vec2(n10, n11) */ + glm_vec2_lerp(n_x1, n_x2, fade_xy[0], n_x); /* n_x = lerp(n_x1, n_x2, fade_xy.x) */ - // T n_xy = mix(n_x.x, n_x.y, fade_xy.y); - // n_xy = lerp(n_x.x, n_x.y, fade_xy.y); + /* T n_xy = mix(n_x.x, n_x.y, fade_xy.y); */ + /* n_xy = lerp(n_x.x, n_x.y, fade_xy.y); */ float n_xy = glm_lerp(n_x[0], n_x[1], fade_xy[1]); return n_xy * 2.3f; From 23c0f5f660da75e3cae70ab533f5a000d087b1ad Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 18 Jan 2025 20:10:14 +0000 Subject: [PATCH 095/128] couple more // comments --- test/src/test_noise.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/src/test_noise.h b/test/src/test_noise.h index 95024fe..cc7ea3c 100644 --- a/test/src/test_noise.h +++ b/test/src/test_noise.h @@ -21,7 +21,7 @@ TEST_IMPL(GLM_PREFIX, perlin_vec4) { {1.0f, 1.1f, 1.2f, 1.3f}, }; - // expected values calculated by glm::perlin + /* expected values calculated by glm::perlin */ float e[] = { -0.5091819763183594f, -0.4375732541084290f, @@ -56,7 +56,7 @@ TEST_IMPL(GLM_PREFIX, perlin_vec3) { {1.0f, 1.1f, 1.2f}, }; - // expected values calculated by glm::perlin + /* expected values calculated by glm::perlin */ float e[] = { -0.2909241318702698f, -0.4667602181434631f, @@ -92,7 +92,7 @@ TEST_IMPL(GLM_PREFIX, perlin_vec2) { {1.0f, 1.1f}, }; - // expected values calculated by glm::perlin + /* expected values calculated by glm::perlin */ float e[] = { 0.2841092348098755f, 0.2328013032674789f, From 948642ff337ca0e7684a541c9b41f37d2e587b85 Mon Sep 17 00:00:00 2001 From: Marcin Date: Mon, 20 Jan 2025 14:08:49 +0000 Subject: [PATCH 096/128] _glm_ -> glm__ for internal macros --- include/cglm/noise.h | 148 +++++++++++++++++++++---------------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index e06d633..9ce001f 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -25,39 +25,39 @@ #include "vec2.h" #include "vec2-ext.h" -#define _glm_noiseDetail_mod289(x) (x - floorf(x * (1.0f / 289.0f)) * 289.0f) +#define glm__noiseDetail_mod289(x) (x - floorf(x * (1.0f / 289.0f)) * 289.0f) -/* _glm_noiseDetail_permute(vec4 x, vec4 dest) */ -#define _glm_noiseDetail_permute(x, dest) { \ - dest[0] = _glm_noiseDetail_mod289((x[0] * 34.0f + 1.0f) * x[0]); \ - dest[1] = _glm_noiseDetail_mod289((x[1] * 34.0f + 1.0f) * x[1]); \ - dest[2] = _glm_noiseDetail_mod289((x[2] * 34.0f + 1.0f) * x[2]); \ - dest[3] = _glm_noiseDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); \ +/* glm__noiseDetail_permute(vec4 x, vec4 dest) */ +#define glm__noiseDetail_permute(x, dest) { \ + dest[0] = glm__noiseDetail_mod289((x[0] * 34.0f + 1.0f) * x[0]); \ + dest[1] = glm__noiseDetail_mod289((x[1] * 34.0f + 1.0f) * x[1]); \ + dest[2] = glm__noiseDetail_mod289((x[2] * 34.0f + 1.0f) * x[2]); \ + dest[3] = glm__noiseDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); \ } -/* _glm_noiseDetail_fade_vec4(vec4 t, vec4 dest) */ -#define _glm_noiseDetail_fade_vec4(t, dest) { \ +/* glm__noiseDetail_fade_vec4(vec4 t, vec4 dest) */ +#define glm__noiseDetail_fade_vec4(t, dest) { \ dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); \ dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); \ dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); \ dest[3] = (t[3] * t[3] * t[3]) * (t[3] * (t[3] * 6.0f - 15.0f) + 10.0f); \ } -/* _glm_noiseDetail_fade_vec3(vec3 t, vec3 dest) */ -#define _glm_noiseDetail_fade_vec3(t, dest) { \ +/* glm__noiseDetail_fade_vec3(vec3 t, vec3 dest) */ +#define glm__noiseDetail_fade_vec3(t, dest) { \ dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); \ dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); \ dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); \ } -/* _glm_noiseDetail_fade_vec2(vec2 t, vec2 dest) */ -#define _glm_noiseDetail_fade_vec2(t, dest) { \ +/* glm__noiseDetail_fade_vec2(vec2 t, vec2 dest) */ +#define glm__noiseDetail_fade_vec2(t, dest) { \ dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); \ dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); \ } -/* _glm_noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) */ -#define _glm_noiseDetail_taylorInvSqrt(x, dest) { \ +/* glm__noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) */ +#define glm__noiseDetail_taylorInvSqrt(x, dest) { \ dest[0] = 1.79284291400159f - 0.85373472095314f * x[0]; \ dest[1] = 1.79284291400159f - 0.85373472095314f * x[1]; \ dest[2] = 1.79284291400159f - 0.85373472095314f * x[2]; \ @@ -72,14 +72,14 @@ * )); */ -/* _glm_noiseDetail_gradNorm_vec4(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) */ -#define _glm_noiseDetail_gradNorm_vec4(g00__, g01__, g10__, g11__) { \ +/* glm__noiseDetail_gradNorm_vec4(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) */ +#define glm__noiseDetail_gradNorm_vec4(g00__, g01__, g10__, g11__) { \ vec4 norm; \ norm[0] = glm_vec4_dot(g00__, g00__); /* norm.x = dot(g00__, g00__) */ \ norm[1] = glm_vec4_dot(g01__, g01__); /* norm.y = dot(g01__, g01__) */ \ norm[2] = glm_vec4_dot(g10__, g10__); /* norm.z = dot(g10__, g10__) */ \ norm[3] = glm_vec4_dot(g11__, g11__); /* norm.w = dot(g11__, g11__) */ \ - _glm_noiseDetail_taylorInvSqrt(norm, norm); /* norm = taylorInvSqrt(norm) */ \ + glm__noiseDetail_taylorInvSqrt(norm, norm); /* norm = taylorInvSqrt(norm) */ \ \ glm_vec4_scale(g00__, norm[0], g00__); /* g00__ *= norm.x */ \ glm_vec4_scale(g01__, norm[1], g01__); /* g01__ *= norm.y */ \ @@ -87,14 +87,14 @@ glm_vec4_scale(g11__, norm[3], g11__); /* g11__ *= norm.w */ \ } -/* _glm_noiseDetail_gradNorm_vec3(vec3 g00_, vec3 g01_, vec3 g10_, vec3 g11_) */ -#define _glm_noiseDetail_gradNorm_vec3(g00_, g01_, g10_, g11_) { \ +/* glm__noiseDetail_gradNorm_vec3(vec3 g00_, vec3 g01_, vec3 g10_, vec3 g11_) */ +#define glm__noiseDetail_gradNorm_vec3(g00_, g01_, g10_, g11_) { \ vec4 norm; \ norm[0] = glm_vec3_dot(g00_, g00_); /* norm.x = dot(g00_, g00_) */ \ norm[1] = glm_vec3_dot(g01_, g01_); /* norm.y = dot(g01_, g01_) */ \ norm[2] = glm_vec3_dot(g10_, g10_); /* norm.z = dot(g10_, g10_) */ \ norm[3] = glm_vec3_dot(g11_, g11_); /* norm.w = dot(g11_, g11_) */ \ - _glm_noiseDetail_taylorInvSqrt(norm, norm); /* norm = taylorInvSqrt(norm) */ \ + glm__noiseDetail_taylorInvSqrt(norm, norm); /* norm = taylorInvSqrt(norm) */ \ \ glm_vec3_scale(g00_, norm[0], g00_); /* g00_ *= norm.x */ \ glm_vec3_scale(g01_, norm[1], g01_); /* g01_ *= norm.y */ \ @@ -102,14 +102,14 @@ glm_vec3_scale(g11_, norm[3], g11_); /* g11_ *= norm.w */ \ } -/* _glm_noiseDetail_gradNorm_vec2(vec2 g00, vec2 g01, vec2 g10, vec2 g11) */ -#define _glm_noiseDetail_gradNorm_vec2(g00, g01, g10, g11) { \ +/* glm__noiseDetail_gradNorm_vec2(vec2 g00, vec2 g01, vec2 g10, vec2 g11) */ +#define glm__noiseDetail_gradNorm_vec2(g00, g01, g10, g11) { \ vec4 norm; \ norm[0] = glm_vec2_dot(g00, g00); /* norm.x = dot(g00, g00) */ \ norm[1] = glm_vec2_dot(g01, g01); /* norm.y = dot(g01, g01) */ \ norm[2] = glm_vec2_dot(g10, g10); /* norm.z = dot(g10, g10) */ \ norm[3] = glm_vec2_dot(g11, g11); /* norm.w = dot(g11, g11) */ \ - _glm_noiseDetail_taylorInvSqrt(norm, norm); /* norm = taylorInvSqrt(norm) */ \ + glm__noiseDetail_taylorInvSqrt(norm, norm); /* norm = taylorInvSqrt(norm) */ \ \ glm_vec2_scale(g00, norm[0], g00); /* g00 *= norm.x */ \ glm_vec2_scale(g01, norm[1], g01); /* g01 *= norm.y */ \ @@ -117,8 +117,8 @@ glm_vec2_scale(g11, norm[3], g11); /* g11 *= norm.w */ \ } -/* _glm_noiseDetail_i2gxyzw(vec4 ixy, vec4 gx, vec4 gy, vec4 gz, vec4 gw) */ -#define _glm_noiseDetail_i2gxyzw(ixy, gx, gy, gz, gw) { \ +/* glm__noiseDetail_i2gxyzw(vec4 ixy, vec4 gx, vec4 gy, vec4 gz, vec4 gw) */ +#define glm__noiseDetail_i2gxyzw(ixy, gx, gy, gz, gw) { \ /* gx = ixy / 7.0 */ \ glm_vec4_divs(ixy, 7.0f, gx); /* gx = ixy / 7.0 */ \ \ @@ -173,13 +173,13 @@ glm_vec4_sub(gy, temp, gy); /* gy -= temp */ \ } -/* NOTE: This function is not *quite* analogous to _glm_noiseDetail_i2gxyzw +/* NOTE: This function is not *quite* analogous to glm__noiseDetail_i2gxyzw * to try to match the output of glm::perlin. I think it might be a bug in * in the original implementation, but for now I'm keeping it consistent. -MK */ -/* _glm_noiseDetail_i2gxyz(vec4 i, vec4 gx, vec4 gy, vec4 gz) */ -#define _glm_noiseDetail_i2gxyz(ixy, gx, gy, gz) { \ +/* glm__noiseDetail_i2gxyz(vec4 i, vec4 gx, vec4 gy, vec4 gz) */ +#define glm__noiseDetail_i2gxyz(ixy, gx, gy, gz) { \ /* gx = ixy / 7.0 */ \ glm_vec4_divs(ixy, 7.0f, gx); /* gx = ixy / 7.0 */ \ \ @@ -221,8 +221,8 @@ glm_vec4_sub(gy, temp, gy); /* gy -= temp */ \ } -/* _glm_noiseDetail_i2gxy(vec4 i, vec4 gx, vec4 gy) */ -#define _glm_noiseDetail_i2gxy(i, gx, gy) { \ +/* glm__noiseDetail_i2gxy(vec4 i, vec4 gx, vec4 gy) */ +#define glm__noiseDetail_i2gxy(i, gx, gy) { \ /* gx = 2.0 * fract(i / 41.0) - 1.0; */ \ glm_vec4_divs(i, 41.0f, gx); /* gx = i / 41.0 */ \ glm_vec4_fract(gx, gx); /* gx = fract(gx) */ \ @@ -286,53 +286,53 @@ glm_perlin_vec4(vec4 point) { /* ixy = permute(permute(ix) + iy) */ vec4 ixy; - _glm_noiseDetail_permute(ix, ixy); /* ixy = permute(ix) */ + glm__noiseDetail_permute(ix, ixy); /* ixy = permute(ix) */ glm_vec4_add(ixy, iy, ixy); /* ixy += iy; */ - _glm_noiseDetail_permute(ixy, ixy); /* ixy = permute(ixy) */ + glm__noiseDetail_permute(ixy, ixy); /* ixy = permute(ixy) */ /* ixy0 = permute(ixy + iz0) */ vec4 ixy0; glm_vec4_add(ixy, iz0, ixy0); /* ixy0 = ixy + iz0 */ - _glm_noiseDetail_permute(ixy0, ixy0); /* ixy0 = permute(ixy0) */ + glm__noiseDetail_permute(ixy0, ixy0); /* ixy0 = permute(ixy0) */ /* ixy1 = permute(ixy + iz1) */ vec4 ixy1; glm_vec4_add(ixy, iz1, ixy1); /* ixy1 = ixy, iz1 */ - _glm_noiseDetail_permute(ixy1, ixy1); /* ixy1 = permute(ixy1) */ + glm__noiseDetail_permute(ixy1, ixy1); /* ixy1 = permute(ixy1) */ /* ixy00 = permute(ixy0 + iw0) */ vec4 ixy00; glm_vec4_add(ixy0, iw0, ixy00); /* ixy00 = ixy0 + iw0 */ - _glm_noiseDetail_permute(ixy00, ixy00); /* ixy00 = permute(ixy00) */ + glm__noiseDetail_permute(ixy00, ixy00); /* ixy00 = permute(ixy00) */ /* ixy01 = permute(ixy0 + iw1) */ vec4 ixy01; glm_vec4_add(ixy0, iw1, ixy01); /* ixy01 = ixy0 + iw1 */ - _glm_noiseDetail_permute(ixy01, ixy01); /* ixy01 = permute(ixy01) */ + glm__noiseDetail_permute(ixy01, ixy01); /* ixy01 = permute(ixy01) */ /* ixy10 = permute(ixy1 + iw0) */ vec4 ixy10; glm_vec4_add(ixy1, iw0, ixy10); /* ixy10 = ixy1 + iw0 */ - _glm_noiseDetail_permute(ixy10, ixy10); /* ixy10 = permute(ixy10) */ + glm__noiseDetail_permute(ixy10, ixy10); /* ixy10 = permute(ixy10) */ /* ixy11 = permute(ixy1 + iw1) */ vec4 ixy11; glm_vec4_add(ixy1, iw1, ixy11); /* ixy11 = ixy1 + iw1 */ - _glm_noiseDetail_permute(ixy11, ixy11); /* ixy11 = permute(ixy11) */ + glm__noiseDetail_permute(ixy11, ixy11); /* ixy11 = permute(ixy11) */ /* ------------ */ vec4 gx00, gy00, gz00, gw00; - _glm_noiseDetail_i2gxyzw(ixy00, gx00, gy00, gz00, gw00); + glm__noiseDetail_i2gxyzw(ixy00, gx00, gy00, gz00, gw00); vec4 gx01, gy01, gz01, gw01; - _glm_noiseDetail_i2gxyzw(ixy01, gx01, gy01, gz01, gw01); + glm__noiseDetail_i2gxyzw(ixy01, gx01, gy01, gz01, gw01); vec4 gx10, gy10, gz10, gw10; - _glm_noiseDetail_i2gxyzw(ixy10, gx10, gy10, gz10, gw10); + glm__noiseDetail_i2gxyzw(ixy10, gx10, gy10, gz10, gw10); vec4 gx11, gy11, gz11, gw11; - _glm_noiseDetail_i2gxyzw(ixy11, gx11, gy11, gz11, gw11); + glm__noiseDetail_i2gxyzw(ixy11, gx11, gy11, gz11, gw11); /* ------------ */ @@ -356,10 +356,10 @@ glm_perlin_vec4(vec4 point) { vec4 g1011 = {gx11[1], gy11[1], gz11[1], gw11[1]}; /* g1011 = vec4(gx11.y, gy11.y, gz11.y, gw11.y); */ vec4 g1111 = {gx11[3], gy11[3], gz11[3], gw11[3]}; /* g1111 = vec4(gx11.w, gy11.w, gz11.w, gw11.w); */ - _glm_noiseDetail_gradNorm_vec4(g0000, g0100, g1000, g1100); - _glm_noiseDetail_gradNorm_vec4(g0001, g0101, g1001, g1101); - _glm_noiseDetail_gradNorm_vec4(g0010, g0110, g1010, g1110); - _glm_noiseDetail_gradNorm_vec4(g0011, g0111, g1011, g1111); + glm__noiseDetail_gradNorm_vec4(g0000, g0100, g1000, g1100); + glm__noiseDetail_gradNorm_vec4(g0001, g0101, g1001, g1101); + glm__noiseDetail_gradNorm_vec4(g0010, g0110, g1010, g1110); + glm__noiseDetail_gradNorm_vec4(g0011, g0111, g1011, g1111); /* ------------ */ @@ -426,7 +426,7 @@ glm_perlin_vec4(vec4 point) { /* ------------ */ vec4 fade_xyzw; - _glm_noiseDetail_fade_vec4(Pf0, fade_xyzw); /* fade_xyzw = fade(Pf0) */ + glm__noiseDetail_fade_vec4(Pf0, fade_xyzw); /* fade_xyzw = fade(Pf0) */ /* n_0w = lerp(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w) */ vec4 n_0w1 = {n0000, n1000, n0100, n1100}; @@ -494,27 +494,27 @@ glm_perlin_vec3(vec3 point) { /* ixy = permute(permute(ix) + iy) */ vec4 ixy; - _glm_noiseDetail_permute(ix, ixy); /* ixy = permute(ix) */ + glm__noiseDetail_permute(ix, ixy); /* ixy = permute(ix) */ glm_vec4_add(ixy, iy, ixy); /* ixy += iy; */ - _glm_noiseDetail_permute(ixy, ixy); /* ixy = permute(ixy) */ + glm__noiseDetail_permute(ixy, ixy); /* ixy = permute(ixy) */ /* ixy0 = permute(ixy + iz0) */ vec4 ixy0; glm_vec4_add(ixy, iz0, ixy0); /* ixy0 = ixy + iz0 */ - _glm_noiseDetail_permute(ixy0, ixy0); /* ixy0 = permute(ixy0) */ + glm__noiseDetail_permute(ixy0, ixy0); /* ixy0 = permute(ixy0) */ /* ixy1 = permute(ixy + iz1) */ vec4 ixy1; glm_vec4_add(ixy, iz1, ixy1); /* ixy1 = ixy, iz1 */ - _glm_noiseDetail_permute(ixy1, ixy1); /* ixy1 = permute(ixy1) */ + glm__noiseDetail_permute(ixy1, ixy1); /* ixy1 = permute(ixy1) */ /* ------------ */ vec4 gx0, gy0, gz0; - _glm_noiseDetail_i2gxyz(ixy0, gx0, gy0, gz0); + glm__noiseDetail_i2gxyz(ixy0, gx0, gy0, gz0); vec4 gx1, gy1, gz1; - _glm_noiseDetail_i2gxyz(ixy1, gx1, gy1, gz1); + glm__noiseDetail_i2gxyz(ixy1, gx1, gy1, gz1); /* ------------ */ @@ -528,8 +528,8 @@ glm_perlin_vec3(vec3 point) { vec3 g011 = {gx1[2], gy1[2], gz1[2]}; /* g011 = vec3(gx1.z, gy1.z, gz1.z); */ vec3 g111 = {gx1[3], gy1[3], gz1[3]}; /* g111 = vec3(gx1.w, gy1.w, gz1.w); */ - _glm_noiseDetail_gradNorm_vec3(g000, g100, g010, g110); - _glm_noiseDetail_gradNorm_vec3(g001, g101, g011, g111); + glm__noiseDetail_gradNorm_vec3(g000, g100, g010, g110); + glm__noiseDetail_gradNorm_vec3(g001, g101, g011, g111); /* ------------ */ @@ -564,7 +564,7 @@ glm_perlin_vec3(vec3 point) { /* ------------ */ vec3 fade_xyz; - _glm_noiseDetail_fade_vec3(Pf0, fade_xyz); /* fade_xyz = fade(Pf0) */ + glm__noiseDetail_fade_vec3(Pf0, fade_xyz); /* fade_xyz = fade(Pf0) */ /* n_z = lerp(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); */ vec4 n_z; @@ -620,14 +620,14 @@ glm_perlin_vec2(vec2 point) { /* i = permute(permute(ix) + iy); */ vec4 i; - _glm_noiseDetail_permute(ix, i); /* i = permute(ix) */ + glm__noiseDetail_permute(ix, i); /* i = permute(ix) */ glm_vec4_add(i, iy, i); /* i += iy; */ - _glm_noiseDetail_permute(i, i); /* i = permute(i) */ + glm__noiseDetail_permute(i, i); /* i = permute(i) */ /* ------------ */ vec4 gx, gy; - _glm_noiseDetail_i2gxy(i, gx, gy); + glm__noiseDetail_i2gxy(i, gx, gy); /* ------------ */ @@ -636,7 +636,7 @@ glm_perlin_vec2(vec2 point) { vec2 g01 = {gx[2], gy[2]}; /* g01 = vec2(gx.z, gy.z) */ vec2 g11 = {gx[3], gy[3]}; /* g11 = vec2(gx.w, gy.w) */ - _glm_noiseDetail_gradNorm_vec2(g00, g10, g01, g11); + glm__noiseDetail_gradNorm_vec2(g00, g10, g01, g11); /* ------------ */ @@ -660,7 +660,7 @@ glm_perlin_vec2(vec2 point) { /* fade_xyz = fade(vec2(Pf.x, Pf.y)) */ vec2 fade_xy = {Pf[0], Pf[1]}; /* fade_xy = vec2(Pf.x, Pf.y) */ - _glm_noiseDetail_fade_vec2(fade_xy, fade_xy); /* fade_xy = fade(fade_xy) */ + glm__noiseDetail_fade_vec2(fade_xy, fade_xy); /* fade_xy = fade(fade_xy) */ /* n_x = lerp(vec2(n00, n01), vec2(n10, n11), fade_xy.x); */ vec2 n_x; @@ -677,17 +677,17 @@ glm_perlin_vec2(vec2 point) { /* Undefine all helper macros */ -#undef _glm_noiseDetail_mod289 -#undef _glm_noiseDetail_permute -#undef _glm_noiseDetail_fade_vec4 -#undef _glm_noiseDetail_fade_vec3 -#undef _glm_noiseDetail_fade_vec2 -#undef _glm_noiseDetail_taylorInvSqrt -#undef _glm_noiseDetail_gradNorm_vec4 -#undef _glm_noiseDetail_gradNorm_vec3 -#undef _glm_noiseDetail_gradNorm_vec2 -#undef _glm_noiseDetail_i2gxyzw -#undef _glm_noiseDetail_i2gxyz -#undef _glm_noiseDetail_i2gxy +#undef glm__noiseDetail_mod289 +#undef glm__noiseDetail_permute +#undef glm__noiseDetail_fade_vec4 +#undef glm__noiseDetail_fade_vec3 +#undef glm__noiseDetail_fade_vec2 +#undef glm__noiseDetail_taylorInvSqrt +#undef glm__noiseDetail_gradNorm_vec4 +#undef glm__noiseDetail_gradNorm_vec3 +#undef glm__noiseDetail_gradNorm_vec2 +#undef glm__noiseDetail_i2gxyzw +#undef glm__noiseDetail_i2gxyz +#undef glm__noiseDetail_i2gxy #endif /* cglm_noise_h */ From f815918a7427374806e387c47b6833d61c59d789 Mon Sep 17 00:00:00 2001 From: duarm Date: Mon, 20 Jan 2025 13:29:21 -0300 Subject: [PATCH 097/128] rename struct/aabb2d.h functions to match aabb2d.h, add tests --- CMakeLists.txt | 1 + include/cglm/struct/aabb2d.h | 23 +++++++++++++++++++++-- meson.build | 1 + test/src/test_aabb2d.h | 28 ++++++++++++++++++++++++++++ test/src/tests.c | 2 ++ test/tests.h | 6 ++++++ 6 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 test/src/test_aabb2d.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 01086fa..e80bd8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,6 +95,7 @@ add_library(${PROJECT_NAME} src/plane.c src/frustum.c src/box.c + src/aabb2d.c src/project.c src/sphere.c src/ease.c diff --git a/include/cglm/struct/aabb2d.h b/include/cglm/struct/aabb2d.h index 71317fa..936a3a0 100644 --- a/include/cglm/struct/aabb2d.h +++ b/include/cglm/struct/aabb2d.h @@ -137,8 +137,27 @@ glms_aabb2d_(isvalid)(vec2s aabb[2]) { */ CGLM_INLINE float -glms_aabb2d_(size)(vec2s aabb[2]) { - return glm_vec2_distance(aabb[0].raw, aabb[1].raw); +glms_aabb2d_(diag)(vec2s aabb[2]) { + vec2 rawAabb[2]; + glms_vec2_(unpack)(rawAabb, aabb, 2); + return glm_aabb2d_diag(rawAabb); +} + + +/*! + * @brief size of aabb + * + * @param[in] aabb bounding aabb + * @param[out] dest size + */ +CGLM_INLINE +vec2s +glms_aabb2d_(sizev)(vec2s aabb[2]) { + vec2s size; + vec2 rawAabb[2]; + glms_vec2_(unpack)(rawAabb, aabb, 2); + glm_aabb2d_sizev(rawAabb, size.raw); + return size; } /*! diff --git a/meson.build b/meson.build index 3afdc4f..663f2ba 100644 --- a/meson.build +++ b/meson.build @@ -58,6 +58,7 @@ cglm_src = files( 'src/plane.c', 'src/frustum.c', 'src/box.c', + 'src/aabb2d.c', 'src/project.c', 'src/sphere.c', 'src/ease.c', diff --git a/test/src/test_aabb2d.h b/test/src/test_aabb2d.h new file mode 100644 index 0000000..d2ce9fc --- /dev/null +++ b/test/src/test_aabb2d.h @@ -0,0 +1,28 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#include "test_common.h" + +#ifndef CGLM_TEST_AABB2D_ONCE +#define CGLM_TEST_AABB2D_ONCE + +/* Macros */ +/* Deprecated */ + +#endif /* CGLM_TEST_VEC4_ONCE */ + +/* --- */ +TEST_IMPL(GLM_PREFIX, aabb2d_sizev) { + vec2 a[2] = {{10.0f, 10.0f}, {20.0f, 20.0f}}; + vec2 size = {0}; + + GLM(aabb2d_sizev)(a, size); + + ASSERTIFY(test_assert_vec2_eq(size, (vec2){10.0f, 10.0f})) + + TEST_SUCCESS +} diff --git a/test/src/tests.c b/test/src/tests.c index 4d93294..b9a00b2 100644 --- a/test/src/tests.c +++ b/test/src/tests.c @@ -33,6 +33,7 @@ #include "test_affine.h" #include "test_affine2d.h" #include "test_affine_mat.h" +#include "test_aabb2d.h" #include "test_ray.h" #include "test_cam.h" #include "test_cam_lh_no.h" @@ -72,6 +73,7 @@ #include "test_affine.h" #include "test_affine2d.h" #include "test_affine_mat.h" +#include "test_aabb2d.h" #include "test_ray.h" #include "test_cam.h" #include "test_cam_lh_no.h" diff --git a/test/tests.h b/test/tests.h index bcb2fda..751095e 100644 --- a/test/tests.h +++ b/test/tests.h @@ -97,6 +97,9 @@ TEST_DECLARE(glmc_rotate2d_make) TEST_DECLARE(glmc_rotate2d) TEST_DECLARE(glmc_rotate2d_to) +/* aabb2d */ +TEST_DECLARE(glm_aabb2d_sizev) + /* mat4 */ TEST_DECLARE(glm_mat4_ucopy) TEST_DECLARE(glm_mat4_copy) @@ -1274,6 +1277,9 @@ TEST_LIST { TEST_ENTRY(glmc_rotate2d_make) TEST_ENTRY(glmc_rotate2d) TEST_ENTRY(glmc_rotate2d_to) + + /* aabb2d */ + TEST_ENTRY(glm_aabb2d_sizev) /* mat4 */ TEST_ENTRY(glm_mat4_ucopy) From e605c1d58511a47597e0f29bbf8ded8dca52d61b Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 21 Jan 2025 09:59:48 +0300 Subject: [PATCH 098/128] Update aabb2d.h --- include/cglm/struct/aabb2d.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/cglm/struct/aabb2d.h b/include/cglm/struct/aabb2d.h index 936a3a0..9077069 100644 --- a/include/cglm/struct/aabb2d.h +++ b/include/cglm/struct/aabb2d.h @@ -154,7 +154,7 @@ CGLM_INLINE vec2s glms_aabb2d_(sizev)(vec2s aabb[2]) { vec2s size; - vec2 rawAabb[2]; + vec2 rawAabb[2]; glms_vec2_(unpack)(rawAabb, aabb, 2); glm_aabb2d_sizev(rawAabb, size.raw); return size; From 450d7478675c68fb8c2e0ea2cfbc6a44ea97e604 Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 22 Jan 2025 14:27:53 +0000 Subject: [PATCH 099/128] 1/7 patch --- include/cglm/noise.h | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index 9ce001f..c4c79f9 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -176,16 +176,29 @@ /* NOTE: This function is not *quite* analogous to glm__noiseDetail_i2gxyzw * to try to match the output of glm::perlin. I think it might be a bug in * in the original implementation, but for now I'm keeping it consistent. -MK + * + * Follow up: The original implementation (glm v 1.0.1) does: + * + * vec<4, T, Q> gx0 = ixy0 * T(1.0 / 7.0); + * + * as opposed to: + * + * vec<4, T, Q> gx0 = ixy0 / T(7); + * + * This ends up mapping to different simd instructions, at least on AMD. + * The delta is tiny but it gets amplified by the rest of the noise function. + * Hence we too need to do `glm_vec4_scale` as opposed to `glm_vec4_divs`, to + * match it. -MK */ /* glm__noiseDetail_i2gxyz(vec4 i, vec4 gx, vec4 gy, vec4 gz) */ #define glm__noiseDetail_i2gxyz(ixy, gx, gy, gz) { \ /* gx = ixy / 7.0 */ \ - glm_vec4_divs(ixy, 7.0f, gx); /* gx = ixy / 7.0 */ \ + glm_vec4_scale(ixy, 1.0f / 7.0f, gx); /* gx = ixy * (1/7.0) */\ \ /* gy = fract(floor(gx0) / 7.0)) - 0.5; */ \ glm_vec4_floor(gx, gy); /* gy = floor(gx) */ \ - glm_vec4_divs(gy, 7.0f, gy); /* gy /= 7.0 */ \ + glm_vec4_scale(gy, 1.0f / 7.0f, gy); /* gy *= 1 / 7.0 */ \ glm_vec4_fract(gy, gy); /* gy = fract(gy) */ \ glm_vec4_subs(gy, 0.5f, gy); /* gy -= 0.5f */ \ \ From b79347eb13113fb8e1710e8e345ba9b2f013ecb2 Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 22 Jan 2025 15:07:59 +0000 Subject: [PATCH 100/128] vdivq_f32 --- include/cglm/vec4.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index 9203f03..c8bc15b 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -530,6 +530,8 @@ glm_vec4_divs(vec4 v, float s, vec4 dest) { glmm_store(dest, wasm_f32x4_div(glmm_load(v), wasm_f32x4_splat(s))); #elif defined( __SSE__ ) || defined( __SSE2__ ) glmm_store(dest, _mm_div_ps(glmm_load(v), _mm_set1_ps(s))); +#elif defined(CGLM_NEON_FP) + vst1q_f32(dest, vdivq_f32(vld1q_f32(v), vdupq_n_f32(s))); #else glm_vec4_scale(v, 1.0f / s, dest); #endif From 9cfa40f423a7039675de9292f6298866c3b67073 Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 22 Jan 2025 15:32:50 +0000 Subject: [PATCH 101/128] glm__noiseDetail_taylorInvSqrt --- include/cglm/noise.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index c4c79f9..70bee4a 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -57,11 +57,12 @@ } /* glm__noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) */ -#define glm__noiseDetail_taylorInvSqrt(x, dest) { \ - dest[0] = 1.79284291400159f - 0.85373472095314f * x[0]; \ - dest[1] = 1.79284291400159f - 0.85373472095314f * x[1]; \ - dest[2] = 1.79284291400159f - 0.85373472095314f * x[2]; \ - dest[3] = 1.79284291400159f - 0.85373472095314f * x[3]; \ +#define glm__noiseDetail_taylorInvSqrt(x, dest) { \ + /* dest = 1.79284291400159f - 0.85373472095314f * x */ \ + vec4 temp; \ + glm_vec4_scale(x, 0.85373472095314f, temp); /* temp = 0.853...f * x */ \ + glm_vec4_fill(dest, 1.79284291400159f); /* dest = 1.792...f */ \ + glm_vec4_sub(dest, temp, dest); /* dest = 1.79284291400159f - temp */ \ } /* norm = taylorInvSqrt(vec4( From fd0131734fc1a6e0471e04114460add5d8a47238 Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 22 Jan 2025 16:06:49 +0000 Subject: [PATCH 102/128] fix granNorm arg order --- include/cglm/noise.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index 70bee4a..b224947 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -542,8 +542,8 @@ glm_perlin_vec3(vec3 point) { vec3 g011 = {gx1[2], gy1[2], gz1[2]}; /* g011 = vec3(gx1.z, gy1.z, gz1.z); */ vec3 g111 = {gx1[3], gy1[3], gz1[3]}; /* g111 = vec3(gx1.w, gy1.w, gz1.w); */ - glm__noiseDetail_gradNorm_vec3(g000, g100, g010, g110); - glm__noiseDetail_gradNorm_vec3(g001, g101, g011, g111); + glm__noiseDetail_gradNorm_vec3(g000, g010, g100, g110); + glm__noiseDetail_gradNorm_vec3(g001, g011, g101, g111); /* ------------ */ @@ -650,7 +650,7 @@ glm_perlin_vec2(vec2 point) { vec2 g01 = {gx[2], gy[2]}; /* g01 = vec2(gx.z, gy.z) */ vec2 g11 = {gx[3], gy[3]}; /* g11 = vec2(gx.w, gy.w) */ - glm__noiseDetail_gradNorm_vec2(g00, g10, g01, g11); + glm__noiseDetail_gradNorm_vec2(g00, g01, g10, g11); /* ------------ */ From 2b4aef2a2978b09df74cd53305c3ad1d50c51da2 Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 22 Jan 2025 16:37:54 +0000 Subject: [PATCH 103/128] glm__noiseDetail_fade_vec2 arg restrict --- include/cglm/noise.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index b224947..9a56d92 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -673,8 +673,9 @@ glm_perlin_vec2(vec2 point) { /* ------------ */ /* fade_xyz = fade(vec2(Pf.x, Pf.y)) */ - vec2 fade_xy = {Pf[0], Pf[1]}; /* fade_xy = vec2(Pf.x, Pf.y) */ - glm__noiseDetail_fade_vec2(fade_xy, fade_xy); /* fade_xy = fade(fade_xy) */ + vec2 fade_xy; + vec2 temp = {Pf[0], Pf[1]}; /* temp = vec2(Pf.x, Pf.y) */ + glm__noiseDetail_fade_vec2(temp, fade_xy); /* fade_xy = fade(temp) */ /* n_x = lerp(vec2(n00, n01), vec2(n10, n11), fade_xy.x); */ vec2 n_x; From dfc9969f85ce3995dd5c1eb599c4e7e77c237617 Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 22 Jan 2025 16:38:07 +0000 Subject: [PATCH 104/128] vectorise fades fix fade for vec2 --- include/cglm/noise.h | 48 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/include/cglm/noise.h b/include/cglm/noise.h index 9a56d92..bec12e9 100644 --- a/include/cglm/noise.h +++ b/include/cglm/noise.h @@ -37,23 +37,49 @@ /* glm__noiseDetail_fade_vec4(vec4 t, vec4 dest) */ #define glm__noiseDetail_fade_vec4(t, dest) { \ - dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); \ - dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); \ - dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); \ - dest[3] = (t[3] * t[3] * t[3]) * (t[3] * (t[3] * 6.0f - 15.0f) + 10.0f); \ + /* dest = (t * t * t) * (t * (t * 6.0f - 15.0f) + 10.0f) */ \ + vec4 temp; \ + glm_vec4_mul(t, t, temp); \ + glm_vec4_mul(temp, t, temp); \ + /* dest = (t * (t * 6.0f - 15.0f) + 10.0f) */ \ + glm_vec4_scale(t, 6.0f, dest); \ + glm_vec4_subs(dest, 15.0f, dest); \ + glm_vec4_mul(t, dest, dest); \ + glm_vec4_adds(dest, 10.0f, dest); \ + /* dest = temp * dest */ \ + glm_vec4_mul(temp, dest, dest); \ } /* glm__noiseDetail_fade_vec3(vec3 t, vec3 dest) */ #define glm__noiseDetail_fade_vec3(t, dest) { \ - dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); \ - dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); \ - dest[2] = (t[2] * t[2] * t[2]) * (t[2] * (t[2] * 6.0f - 15.0f) + 10.0f); \ + /* dest = (t * t * t) * (t * (t * 6.0f - 15.0f) + 10.0f) */ \ + /* temp = t * t * t */ \ + vec3 temp; \ + glm_vec3_mul(t, t, temp); \ + glm_vec3_mul(temp, t, temp); \ + /* dest = (t * (t * 6.0f - 15.0f) + 10.0f) */ \ + glm_vec3_scale(t, 6.0f, dest); \ + glm_vec3_subs(dest, 15.0f, dest); \ + glm_vec3_mul(t, dest, dest); \ + glm_vec3_adds(dest, 10.0f, dest); \ + /* dest = temp * dest */ \ + glm_vec3_mul(temp, dest, dest); \ } /* glm__noiseDetail_fade_vec2(vec2 t, vec2 dest) */ #define glm__noiseDetail_fade_vec2(t, dest) { \ - dest[0] = (t[0] * t[0] * t[0]) * (t[0] * (t[0] * 6.0f - 15.0f) + 10.0f); \ - dest[1] = (t[1] * t[1] * t[1]) * (t[1] * (t[1] * 6.0f - 15.0f) + 10.0f); \ + /* dest = (t * t * t) * (t * (t * 6.0f - 15.0f) + 10.0f) */ \ + /* temp = t * t * t */ \ + vec2 temp; \ + glm_vec2_mul(t, t, temp); \ + glm_vec2_mul(temp, t, temp); \ + /* dest = (t * (t * 6.0f - 15.0f) + 10.0f) */ \ + glm_vec2_scale(t, 6.0f, dest); \ + glm_vec2_subs(dest, 15.0f, dest); \ + glm_vec2_mul(t, dest, dest); \ + glm_vec2_adds(dest, 10.0f, dest); \ + /* dest = temp * dest */ \ + glm_vec2_mul(temp, dest, dest); \ } /* glm__noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) */ @@ -674,8 +700,8 @@ glm_perlin_vec2(vec2 point) { /* fade_xyz = fade(vec2(Pf.x, Pf.y)) */ vec2 fade_xy; - vec2 temp = {Pf[0], Pf[1]}; /* temp = vec2(Pf.x, Pf.y) */ - glm__noiseDetail_fade_vec2(temp, fade_xy); /* fade_xy = fade(temp) */ + vec2 temp2 = {Pf[0], Pf[1]}; /* temp = vec2(Pf.x, Pf.y) */ + glm__noiseDetail_fade_vec2(temp2, fade_xy); /* fade_xy = fade(temp) */ /* n_x = lerp(vec2(n00, n01), vec2(n10, n11), fade_xy.x); */ vec2 n_x; From 241b751d8c556b245fd3cadde6b64841d59624ab Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Wed, 22 Jan 2025 23:17:23 +0300 Subject: [PATCH 105/128] build, autotools: add missing file --- Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.am b/Makefile.am index 2a8ce0e..a8b64d0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -270,6 +270,7 @@ libcglm_la_SOURCES=\ src/bezier.c \ src/ray.c \ src/affine2d.c \ + src/aabb2d.c \ src/clipspace/ortho_lh_no.c \ src/clipspace/ortho_lh_zo.c \ src/clipspace/ortho_rh_no.c \ From e161c4d0a70cecb9252d7f1be5fb8867c5abbb9c Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 00:06:00 +0300 Subject: [PATCH 106/128] Update ci.yml --- .github/workflows/ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 79b0d8a..59577ef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,7 +95,8 @@ jobs: target: - { os: ubuntu-20.04, cc: gcc-11 } - { os: ubuntu-22.04, cc: gcc-12 } - - { os: ubuntu-22.04, cc: gcc-13 } + # GCC 13 is no longer available on Ubuntu 20.04. + - { os: ubuntu-24.04, cc: gcc-13 } - { os: ubuntu-20.04, cc: clang-12 } - { os: ubuntu-22.04, cc: clang-15 } steps: @@ -214,11 +215,11 @@ jobs: - name: Build (x86) working-directory: win - run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x86 /p:BuildInParallel=true + run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x86 /p:PlatformToolset=v143 /p:BuildInParallel=true - name: Build (x64) working-directory: win - run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x64 /p:BuildInParallel=true + run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x64 /p:PlatformToolset=v143 /p:BuildInParallel=true build_swift: name: Swift ${{ matrix.swift }} / ${{ matrix.os }} From cc79b440e74cd4be966e8aab720b80646cac7947 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 00:13:59 +0300 Subject: [PATCH 107/128] Update ci.yml --- .github/workflows/ci.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 59577ef..5adc0ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -102,9 +102,16 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Add Ubuntu Toolchain PPA + if: matrix.target.os == 'ubuntu-20.04' + run: | + sudo apt-get update + sudo apt-get install -y software-properties-common + sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + sudo apt-get update + - name: Install Compiler and Ninja run: | - sudo apt-get update -y sudo apt-get install -y ${{ matrix.target.cc }} ninja-build - name: Configure CMake @@ -143,6 +150,13 @@ jobs: steps: - uses: actions/checkout@v4 + - uses: microsoft/setup-msbuild@v2 + + - name: Install Windows SDK for ARM + if: matrix.platform.name == 'Windows (ARM)' || matrix.platform.name == 'Windows (ARM64)' + run: | + choco install windows-sdk-10.0 -y --version=10.0.26100.0 + - name: Configure CMake run: cmake -B build ` -DCGLM_STATIC=ON ` From 99937807cfed440734321eb3a0173e4a963a92e8 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 00:19:52 +0300 Subject: [PATCH 108/128] Update ci.yml --- .github/workflows/ci.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5adc0ee..003400c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-12, macos-14, ubuntu-22.04] + os: [macos-13, macos-14, ubuntu-22.04, ubuntu-24.04] steps: - uses: actions/checkout@v4 @@ -61,7 +61,7 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-12, macos-14] + os: [macos-13, macos-14] steps: - uses: actions/checkout@v4 @@ -95,7 +95,6 @@ jobs: target: - { os: ubuntu-20.04, cc: gcc-11 } - { os: ubuntu-22.04, cc: gcc-12 } - # GCC 13 is no longer available on Ubuntu 20.04. - { os: ubuntu-24.04, cc: gcc-13 } - { os: ubuntu-20.04, cc: clang-12 } - { os: ubuntu-22.04, cc: clang-15 } @@ -155,7 +154,7 @@ jobs: - name: Install Windows SDK for ARM if: matrix.platform.name == 'Windows (ARM)' || matrix.platform.name == 'Windows (ARM64)' run: | - choco install windows-sdk-10.0 -y --version=10.0.26100.0 + choco install windows-sdk-10.0 -y - name: Configure CMake run: cmake -B build ` @@ -241,7 +240,7 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-12, macos-14, ubuntu-22.04] + os: [macos-13, macos-14, ubuntu-22.04] # This has no test yet. steps: From 9f74fd9597caf29bf7b93e76b0f6ade2a346118e Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 00:44:12 +0300 Subject: [PATCH 109/128] Update ci.yml --- .github/workflows/ci.yml | 308 ++++++++++++++++++++++++++------------- 1 file changed, 208 insertions(+), 100 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 003400c..a90a186 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,25 +8,62 @@ on: jobs: build_autotools: - name: Autotools / ${{ matrix.os }} + name: Autotools / ${{ matrix.os }} / ${{ matrix.simd }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: [macos-13, macos-14, ubuntu-22.04, ubuntu-24.04] + os: [macos-13, macos-14, ubuntu-22.04, ubuntu-24.04, fedora-latest, debian-latest, centos-latest, archlinux-latest] + simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon] steps: - uses: actions/checkout@v4 - - name: Install Autotools + - name: Install Autotools on macOS if: runner.os == 'macOS' run: brew upgrade && brew install autoconf automake libtool + - name: Install Autotools on Fedora + if: matrix.os == 'fedora-latest' + run: sudo dnf install -y autoconf automake libtool + + - name: Install Autotools on Debian + if: matrix.os == 'debian-latest' + run: sudo apt-get install -y autoconf automake libtool + + - name: Install Autotools on CentOS + if: matrix.os == 'centos-latest' + run: sudo yum install -y autoconf automake libtool + + - name: Install Autotools on Arch Linux + if: matrix.os == 'archlinux-latest' + run: sudo pacman -Syu --noconfirm autoconf automake libtool + + - name: Set SIMD flags + run: | + if [ "${{ matrix.simd }}" == "none" ]; then + export CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + export CFLAGS="-msse" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + export CFLAGS="-msse2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + export CFLAGS="-msse3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + export CFLAGS="-msse4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + export CFLAGS="-mavx" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + export CFLAGS="-mavx2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + export CFLAGS="-mfpu=neon" + fi + - name: Generate Autotools run: ./autogen.sh - name: Configure Autotools - run: ./configure + run: ./configure CFLAGS="$CFLAGS" - name: Build run: make @@ -55,6 +92,65 @@ jobs: - name: Build run: cmake --build build + build_cmake_ubuntu: + name: CMake / ${{ matrix.target.os }} / ${{ matrix.target.cc }} / ${{ matrix.simd }} + runs-on: ${{ matrix.target.os }} + strategy: + fail-fast: false + matrix: + target: + - { os: ubuntu-20.04, cc: gcc-11 } + - { os: ubuntu-22.04, cc: gcc-12 } + - { os: ubuntu-24.04, cc: gcc-13 } + - { os: ubuntu-20.04, cc: clang-12 } + - { os: ubuntu-22.04, cc: clang-15 } + simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon] + + steps: + - uses: actions/checkout@v4 + + - name: Add Ubuntu Toolchain PPA + if: matrix.target.os == 'ubuntu-20.04' + run: | + sudo apt-get update + sudo apt-get install -y software-properties-common + sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + sudo apt-get update + + - name: Install Compiler and Ninja + run: | + sudo apt-get install -y ${{ matrix.target.cc }} ninja-build + + - name: Set SIMD flags + run: | + if [ "${{ matrix.simd }}" == "none" ]; then + export CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + export CFLAGS="-msse" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + export CFLAGS="-msse2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + export CFLAGS="-msse3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + export CFLAGS="-msse4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + export CFLAGS="-mavx" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + export CFLAGS="-mavx2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + export CFLAGS="-mfpu=neon" + fi + + - name: Configure CMake + run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=${{ matrix.target.cc }} -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + + - name: Build + run: cmake --build build + + - name: Test + working-directory: build + run: ./tests + build_cmake_macos: name: CMake / ${{ matrix.os }} runs-on: ${{ matrix.os }} @@ -86,42 +182,47 @@ jobs: working-directory: build run: ./tests - build_cmake_ubuntu: - name: CMake / ${{ matrix.target.os }} / ${{ matrix.target.cc }} - runs-on: ${{ matrix.target.os }} + build_cmake: + name: CMake / ${{ matrix.os }} / ${{ matrix.simd }} + runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - target: - - { os: ubuntu-20.04, cc: gcc-11 } - - { os: ubuntu-22.04, cc: gcc-12 } - - { os: ubuntu-24.04, cc: gcc-13 } - - { os: ubuntu-20.04, cc: clang-12 } - - { os: ubuntu-22.04, cc: clang-15 } + os: [macos-13, macos-14, windows-2022] + simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon] + steps: - uses: actions/checkout@v4 - - name: Add Ubuntu Toolchain PPA - if: matrix.target.os == 'ubuntu-20.04' - run: | - sudo apt-get update - sudo apt-get install -y software-properties-common - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test - sudo apt-get update + - name: Install Ninja on macOS + if: runner.os == 'macOS' + run: brew upgrade && brew install ninja - - name: Install Compiler and Ninja + - name: Set SIMD flags run: | - sudo apt-get install -y ${{ matrix.target.cc }} ninja-build + if [ "${{ matrix.simd }}" == "none" ]; then + export CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + export CFLAGS="-msse" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + export CFLAGS="-msse2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + export CFLAGS="-msse3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + export CFLAGS="-msse4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + export CFLAGS="-mavx" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + export CFLAGS="-mavx2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + export CFLAGS="-mfpu=neon" + fi - name: Configure CMake - run: | - cmake \ - -B build \ - -GNinja \ - -DCMAKE_C_COMPILER=${{ matrix.target.cc }} \ - -DCMAKE_BUILD_TYPE=Release \ - -DCGLM_STATIC=ON \ - -DCGLM_USE_TEST=ON + if: runner.os == 'windows-2022' + run: cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + else: + run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - name: Build run: cmake --build build @@ -130,46 +231,97 @@ jobs: working-directory: build run: ./tests - build_cmake_windows: - name: CMake / ${{ matrix.platform.name }} + build_meson: + name: Meson / ${{ matrix.os }} / ${{ matrix.simd }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-14, ubuntu-22.04, ubuntu-24.04, windows-2022] + simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon] + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + cache: 'pip' + + - name: Install meson + run: python3 -m pip install meson ninja + + - name: Set SIMD flags + run: | + if [ "${{ matrix.simd }}" == "none" ]; then + export CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + export CFLAGS="-msse" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + export CFLAGS="-msse2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + export CFLAGS="-msse3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + export CFLAGS="-msse4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + export CFLAGS="-mavx" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + export CFLAGS="-mavx2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + export CFLAGS="-mfpu=neon" + fi + + - name: Build with meson + run: | + meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$CFLAGS" + meson test -C build + + build_msbuild: + name: MSBuild / Windows / ${{ matrix.simd }} runs-on: windows-2022 strategy: fail-fast: false matrix: - platform: - - { name: Windows (x64), flags: -A x64 } - - { name: Windows (x86), flags: -A Win32 } - - { name: Windows (clang-cl x64), flags: -T ClangCL -A x64 } - - { name: Windows (clang-cl x86), flags: -T ClangCL -A Win32 } - - { name: Windows (ARM), flags: -A ARM, skip_tests: true, skip_build: true } # This fails to build. - - { name: Windows (ARM64), flags: -A ARM64, skip_tests: true } - - { name: UWP (ARM64), flags: -A ARM64, -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0", skip_tests: true } - - { name: UWP (x64), flags: -A x64 -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0", skip_tests: true } + simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon] steps: - uses: actions/checkout@v4 - uses: microsoft/setup-msbuild@v2 - - name: Install Windows SDK for ARM - if: matrix.platform.name == 'Windows (ARM)' || matrix.platform.name == 'Windows (ARM64)' + - name: Retarget solution run: | - choco install windows-sdk-10.0 -y + vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath + $vsInstallPath = vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath + & "$vsInstallPath\Common7\IDE\devenv.com" cglm.sln /Upgrade - - name: Configure CMake - run: cmake -B build ` - -DCGLM_STATIC=ON ` - -DCGLM_USE_TEST=ON ` - ${{ matrix.platform.flags }} + - name: Set SIMD flags + run: | + if [ "${{ matrix.simd }}" == "none" ]; then + $env:CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + $env:CFLAGS="-arch:SSE" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + $env:CFLAGS="-arch:SSE2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + $env:CFLAGS="-arch:SSE3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + $env:CFLAGS="-arch:SSE4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + $env:CFLAGS="-arch:AVX" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + $env:CFLAGS="-arch:AVX2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + $env:CFLAGS="-arch:NEON" + fi - - name: Build - if: ${{ !matrix.platform.skip_build }} - run: cmake --build build --config Release --parallel + - name: Build (x86) + working-directory: win + run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x86 /p:PlatformToolset=v143 /p:BuildInParallel=true /p:AdditionalOptions="$env:CFLAGS" - - name: Test - if: ${{ !matrix.platform.skip_tests }} - working-directory: build - run: .\Release\tests.exe + - name: Build (x64) + working-directory: win + run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x64 /p:PlatformToolset=v143 /p:BuildInParallel=true /p:AdditionalOptions="$env:CFLAGS" build_documentation: name: Documentation @@ -190,50 +342,6 @@ jobs: working-directory: docs run: sphinx-build -W --keep-going source build - build_meson: - name: Meson / ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [macos-14, ubuntu-22.04] - - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - cache: 'pip' - - - name: Install meson - run: python3 -m pip install meson ninja - - - name: Build - run: meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true - - - name: Test - run: meson test -C build - - build_msbuild: - name: MSBuild / Windows - runs-on: windows-2022 - - # This has no test yet. - # It could also try building for ARM, ARM64, ARM64EC, but those fail currently. - steps: - - uses: actions/checkout@v4 - - - uses: microsoft/setup-msbuild@v2 - - - name: Build (x86) - working-directory: win - run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x86 /p:PlatformToolset=v143 /p:BuildInParallel=true - - - name: Build (x64) - working-directory: win - run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x64 /p:PlatformToolset=v143 /p:BuildInParallel=true - build_swift: name: Swift ${{ matrix.swift }} / ${{ matrix.os }} runs-on: ${{ matrix.os }} From 925f9c1d1a4580ed034a1642c676c85b90fdab65 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 00:50:36 +0300 Subject: [PATCH 110/128] Update ci.yml --- .github/workflows/ci.yml | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a90a186..4ce11cb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13, macos-14, ubuntu-22.04, ubuntu-24.04, fedora-latest, debian-latest, centos-latest, archlinux-latest] + os: [macos-13, macos-14, ubuntu-22.04, ubuntu-24.04] simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon] steps: @@ -23,22 +23,10 @@ jobs: if: runner.os == 'macOS' run: brew upgrade && brew install autoconf automake libtool - - name: Install Autotools on Fedora - if: matrix.os == 'fedora-latest' - run: sudo dnf install -y autoconf automake libtool - - - name: Install Autotools on Debian - if: matrix.os == 'debian-latest' + - name: Install Autotools on Ubuntu + if: matrix.os == 'ubuntu-22.04' || matrix.os == 'ubuntu-24.04' run: sudo apt-get install -y autoconf automake libtool - - name: Install Autotools on CentOS - if: matrix.os == 'centos-latest' - run: sudo yum install -y autoconf automake libtool - - - name: Install Autotools on Arch Linux - if: matrix.os == 'archlinux-latest' - run: sudo pacman -Syu --noconfirm autoconf automake libtool - - name: Set SIMD flags run: | if [ "${{ matrix.simd }}" == "none" ]; then @@ -219,10 +207,12 @@ jobs: fi - name: Configure CMake - if: runner.os == 'windows-2022' - run: cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - else: - run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + run: | + if [ "${{ runner.os }}" == "Windows" ]; then + cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + else + cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + fi - name: Build run: cmake --build build From eb37a28ff5eb3823c3bb829af2b0af1ffffa4584 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 00:58:02 +0300 Subject: [PATCH 111/128] Update ci.yml --- .github/workflows/ci.yml | 154 ++++++++++++++++++++++++--------------- 1 file changed, 97 insertions(+), 57 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4ce11cb..71b6647 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -188,31 +188,51 @@ jobs: - name: Set SIMD flags run: | - if [ "${{ matrix.simd }}" == "none" ]; then - export CFLAGS="" - elif [ "${{ matrix.simd }}" == "sse" ]; then - export CFLAGS="-msse" - elif [ "${{ matrix.simd }}" == "sse2" ]; then - export CFLAGS="-msse2" - elif [ "${{ matrix.simd }}" == "sse3" ]; then - export CFLAGS="-msse3" - elif [ "${{ matrix.simd }}" == "sse4" ]; then - export CFLAGS="-msse4" - elif [ "${{ matrix.simd }}" == "avx" ]; then - export CFLAGS="-mavx" - elif [ "${{ matrix.simd }}" == "avx2" ]; then - export CFLAGS="-mavx2" - elif [ "${{ matrix.simd }}" == "neon" ]; then - export CFLAGS="-mfpu=neon" - fi + if ($Env:RUNNER_OS -eq 'Windows') { + if ($Env:SIMD -eq 'none') { + $Env:CFLAGS="" + } elseif ($Env:SIMD -eq 'sse') { + $Env:CFLAGS="-arch:SSE" + } elseif ($Env:SIMD -eq 'sse2') { + $Env:CFLAGS="-arch:SSE2" + } elseif ($Env:SIMD -eq 'sse3') { + $Env:CFLAGS="-arch:SSE3" + } elseif ($Env:SIMD -eq 'sse4') { + $Env:CFLAGS="-arch:SSE4" + } elseif ($Env:SIMD -eq 'avx') { + $Env:CFLAGS="-arch:AVX" + } elseif ($Env:SIMD -eq 'avx2') { + $Env:CFLAGS="-arch:AVX2" + } elseif ($Env:SIMD -eq 'neon') { + $Env:CFLAGS="-arch:NEON" + } + } else { + if [ "${{ matrix.simd }}" == "none" ]; then + export CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + export CFLAGS="-msse" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + export CFLAGS="-msse2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + export CFLAGS="-msse3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + export CFLAGS="-msse4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + export CFLAGS="-mavx" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + export CFLAGS="-mavx2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + export CFLAGS="-mfpu=neon" + fi + } - name: Configure CMake run: | - if [ "${{ runner.os }}" == "Windows" ]; then - cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - else + if ($Env:RUNNER_OS -eq 'Windows') { + cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$Env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + } else { cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - fi + } - name: Build run: cmake --build build @@ -243,23 +263,43 @@ jobs: - name: Set SIMD flags run: | - if [ "${{ matrix.simd }}" == "none" ]; then - export CFLAGS="" - elif [ "${{ matrix.simd }}" == "sse" ]; then - export CFLAGS="-msse" - elif [ "${{ matrix.simd }}" == "sse2" ]; then - export CFLAGS="-msse2" - elif [ "${{ matrix.simd }}" == "sse3" ]; then - export CFLAGS="-msse3" - elif [ "${{ matrix.simd }}" == "sse4" ]; then - export CFLAGS="-msse4" - elif [ "${{ matrix.simd }}" == "avx" ]; then - export CFLAGS="-mavx" - elif [ "${{ matrix.simd }}" == "avx2" ]; then - export CFLAGS="-mavx2" - elif [ "${{ matrix.simd }}" == "neon" ]; then - export CFLAGS="-mfpu=neon" - fi + if ($Env:RUNNER_OS -eq 'Windows') { + if ($Env:SIMD -eq 'none') { + $Env:CFLAGS="" + } elseif ($Env:SIMD -eq 'sse') { + $Env:CFLAGS="-arch:SSE" + } elseif ($Env:SIMD -eq 'sse2') { + $Env:CFLAGS="-arch:SSE2" + } elseif ($Env:SIMD -eq 'sse3') { + $Env:CFLAGS="-arch:SSE3" + } elseif ($Env:SIMD -eq 'sse4') { + $Env:CFLAGS="-arch:SSE4" + } elseif ($Env:SIMD -eq 'avx') { + $Env:CFLAGS="-arch:AVX" + } elseif ($Env:SIMD -eq 'avx2') { + $Env:CFLAGS="-arch:AVX2" + } elseif ($Env:SIMD -eq 'neon') { + $Env:CFLAGS="-arch:NEON" + } + } else { + if [ "${{ matrix.simd }}" == "none" ]; then + export CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + export CFLAGS="-msse" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + export CFLAGS="-msse2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + export CFLAGS="-msse3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + export CFLAGS="-msse4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + export CFLAGS="-mavx" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + export CFLAGS="-mavx2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + export CFLAGS="-mfpu=neon" + fi + } - name: Build with meson run: | @@ -287,31 +327,31 @@ jobs: - name: Set SIMD flags run: | - if [ "${{ matrix.simd }}" == "none" ]; then - $env:CFLAGS="" - elif [ "${{ matrix.simd }}" == "sse" ]; then - $env:CFLAGS="-arch:SSE" - elif [ "${{ matrix.simd }}" == "sse2" ]; then - $env:CFLAGS="-arch:SSE2" - elif [ "${{ matrix.simd }}" == "sse3" ]; then - $env:CFLAGS="-arch:SSE3" - elif [ "${{ matrix.simd }}" == "sse4" ]; then - $env:CFLAGS="-arch:SSE4" - elif [ "${{ matrix.simd }}" == "avx" ]; then - $env:CFLAGS="-arch:AVX" - elif [ "${{ matrix.simd }}" == "avx2" ]; then - $env:CFLAGS="-arch:AVX2" - elif [ "${{ matrix.simd }}" == "neon" ]; then - $env:CFLAGS="-arch:NEON" - fi + if ($Env:SIMD -eq 'none') { + $Env:CFLAGS="" + } elseif ($Env:SIMD -eq 'sse') { + $Env:CFLAGS="-arch:SSE" + } elseif ($Env:SIMD -eq 'sse2') { + $Env:CFLAGS="-arch:SSE2" + } elseif ($Env:SIMD -eq 'sse3') { + $Env:CFLAGS="-arch:SSE3" + } elseif ($Env:SIMD -eq 'sse4') { + $Env:CFLAGS="-arch:SSE4" + } elseif ($Env:SIMD -eq 'avx') { + $Env:CFLAGS="-arch:AVX" + } elseif ($Env:SIMD -eq 'avx2') { + $Env:CFLAGS="-arch:AVX2" + } elseif ($Env:SIMD -eq 'neon') { + $Env:CFLAGS="-arch:NEON" + } - name: Build (x86) working-directory: win - run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x86 /p:PlatformToolset=v143 /p:BuildInParallel=true /p:AdditionalOptions="$env:CFLAGS" + run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x86 /p:PlatformToolset=v143 /p:BuildInParallel=true /p:AdditionalOptions="$Env:CFLAGS" - name: Build (x64) working-directory: win - run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x64 /p:PlatformToolset=v143 /p:BuildInParallel=true /p:AdditionalOptions="$env:CFLAGS" + run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x64 /p:PlatformToolset=v143 /p:BuildInParallel=true /p:AdditionalOptions="$Env:CFLAGS" build_documentation: name: Documentation From b4a3ed32d9806186eafc93fba9dc508268fde6fe Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 01:07:32 +0300 Subject: [PATCH 112/128] Update ci.yml --- .github/workflows/ci.yml | 85 +++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 71b6647..ec1569a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -187,52 +187,55 @@ jobs: run: brew upgrade && brew install ninja - name: Set SIMD flags + shell: ${{ runner.os == 'Windows' && 'pwsh' || 'bash' }} run: | - if ($Env:RUNNER_OS -eq 'Windows') { - if ($Env:SIMD -eq 'none') { - $Env:CFLAGS="" - } elseif ($Env:SIMD -eq 'sse') { - $Env:CFLAGS="-arch:SSE" - } elseif ($Env:SIMD -eq 'sse2') { - $Env:CFLAGS="-arch:SSE2" - } elseif ($Env:SIMD -eq 'sse3') { - $Env:CFLAGS="-arch:SSE3" - } elseif ($Env:SIMD -eq 'sse4') { - $Env:CFLAGS="-arch:SSE4" - } elseif ($Env:SIMD -eq 'avx') { - $Env:CFLAGS="-arch:AVX" - } elseif ($Env:SIMD -eq 'avx2') { - $Env:CFLAGS="-arch:AVX2" - } elseif ($Env:SIMD -eq 'neon') { - $Env:CFLAGS="-arch:NEON" - } - } else { - if [ "${{ matrix.simd }}" == "none" ]; then - export CFLAGS="" - elif [ "${{ matrix.simd }}" == "sse" ]; then - export CFLAGS="-msse" - elif [ "${{ matrix.simd }}" == "sse2" ]; then - export CFLAGS="-msse2" - elif [ "${{ matrix.simd }}" == "sse3" ]; then - export CFLAGS="-msse3" - elif [ "${{ matrix.simd }}" == "sse4" ]; then - export CFLAGS="-msse4" - elif [ "${{ matrix.simd }}" == "avx" ]; then - export CFLAGS="-mavx" - elif [ "${{ matrix.simd }}" == "avx2" ]; then - export CFLAGS="-mavx2" - elif [ "${{ matrix.simd }}" == "neon" ]; then - export CFLAGS="-mfpu=neon" - fi + ${{ runner.os == 'Windows' && ' + $simd = "${{ matrix.simd }}" + if ($simd -eq "none") { + $Env:CFLAGS = "" + } elseif ($simd -eq "sse") { + $Env:CFLAGS = "-arch:SSE" + } elseif ($simd -eq "sse2") { + $Env:CFLAGS = "-arch:SSE2" + } elseif ($simd -eq "sse3") { + $Env:CFLAGS = "-arch:SSE3" + } elseif ($simd -eq "sse4") { + $Env:CFLAGS = "-arch:SSE4" + } elseif ($simd -eq "avx") { + $Env:CFLAGS = "-arch:AVX" + } elseif ($simd -eq "avx2") { + $Env:CFLAGS = "-arch:AVX2" + } elseif ($simd -eq "neon") { + $Env:CFLAGS = "-arch:NEON" } + ' || ' + if [ "${{ matrix.simd }}" == "none" ]; then + export CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + export CFLAGS="-msse" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + export CFLAGS="-msse2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + export CFLAGS="-msse3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + export CFLAGS="-msse4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + export CFLAGS="-mavx" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + export CFLAGS="-mavx2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + export CFLAGS="-mfpu=neon" + fi + ' }} - name: Configure CMake + shell: ${{ runner.os == 'Windows' && 'pwsh' || 'bash' }} run: | - if ($Env:RUNNER_OS -eq 'Windows') { - cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$Env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - } else { - cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - } + ${{ runner.os == 'Windows' && ' + cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$Env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + ' || ' + cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + ' }} - name: Build run: cmake --build build From 3971ef8ef1b339d4a538bb1b6a3bb1c24eae7813 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 01:09:20 +0300 Subject: [PATCH 113/128] Update ci.yml --- .github/workflows/ci.yml | 46 ++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec1569a..d04a6bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -186,29 +186,33 @@ jobs: if: runner.os == 'macOS' run: brew upgrade && brew install ninja - - name: Set SIMD flags - shell: ${{ runner.os == 'Windows' && 'pwsh' || 'bash' }} + - name: Set SIMD flags (Windows) + if: runner.os == 'Windows' + shell: pwsh run: | - ${{ runner.os == 'Windows' && ' $simd = "${{ matrix.simd }}" if ($simd -eq "none") { - $Env:CFLAGS = "" + $env:CFLAGS = "" } elseif ($simd -eq "sse") { - $Env:CFLAGS = "-arch:SSE" + $env:CFLAGS = "-arch:SSE" } elseif ($simd -eq "sse2") { - $Env:CFLAGS = "-arch:SSE2" + $env:CFLAGS = "-arch:SSE2" } elseif ($simd -eq "sse3") { - $Env:CFLAGS = "-arch:SSE3" + $env:CFLAGS = "-arch:SSE3" } elseif ($simd -eq "sse4") { - $Env:CFLAGS = "-arch:SSE4" + $env:CFLAGS = "-arch:SSE4" } elseif ($simd -eq "avx") { - $Env:CFLAGS = "-arch:AVX" + $env:CFLAGS = "-arch:AVX" } elseif ($simd -eq "avx2") { - $Env:CFLAGS = "-arch:AVX2" + $env:CFLAGS = "-arch:AVX2" } elseif ($simd -eq "neon") { - $Env:CFLAGS = "-arch:NEON" + $env:CFLAGS = "-arch:NEON" } - ' || ' + + - name: Set SIMD flags (Unix) + if: runner.os != 'Windows' + shell: bash + run: | if [ "${{ matrix.simd }}" == "none" ]; then export CFLAGS="" elif [ "${{ matrix.simd }}" == "sse" ]; then @@ -226,16 +230,16 @@ jobs: elif [ "${{ matrix.simd }}" == "neon" ]; then export CFLAGS="-mfpu=neon" fi - ' }} - - name: Configure CMake - shell: ${{ runner.os == 'Windows' && 'pwsh' || 'bash' }} - run: | - ${{ runner.os == 'Windows' && ' - cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$Env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - ' || ' - cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - ' }} + - name: Configure CMake (Windows) + if: runner.os == 'Windows' + shell: pwsh + run: cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + + - name: Configure CMake (Unix) + if: runner.os != 'Windows' + shell: bash + run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - name: Build run: cmake --build build From cc54ad3f9297fe92d057d977c489c81d7e850009 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 12:15:22 +0300 Subject: [PATCH 114/128] Update ci.yml --- .github/workflows/ci.yml | 90 +++++++++++++++++++++++----------------- 1 file changed, 52 insertions(+), 38 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d04a6bd..bd3e458 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -268,47 +268,61 @@ jobs: - name: Install meson run: python3 -m pip install meson ninja - - name: Set SIMD flags + - name: Set SIMD flags (Windows) + if: runner.os == 'Windows' + shell: pwsh run: | - if ($Env:RUNNER_OS -eq 'Windows') { - if ($Env:SIMD -eq 'none') { - $Env:CFLAGS="" - } elseif ($Env:SIMD -eq 'sse') { - $Env:CFLAGS="-arch:SSE" - } elseif ($Env:SIMD -eq 'sse2') { - $Env:CFLAGS="-arch:SSE2" - } elseif ($Env:SIMD -eq 'sse3') { - $Env:CFLAGS="-arch:SSE3" - } elseif ($Env:SIMD -eq 'sse4') { - $Env:CFLAGS="-arch:SSE4" - } elseif ($Env:SIMD -eq 'avx') { - $Env:CFLAGS="-arch:AVX" - } elseif ($Env:SIMD -eq 'avx2') { - $Env:CFLAGS="-arch:AVX2" - } elseif ($Env:SIMD -eq 'neon') { - $Env:CFLAGS="-arch:NEON" - } - } else { - if [ "${{ matrix.simd }}" == "none" ]; then - export CFLAGS="" - elif [ "${{ matrix.simd }}" == "sse" ]; then - export CFLAGS="-msse" - elif [ "${{ matrix.simd }}" == "sse2" ]; then - export CFLAGS="-msse2" - elif [ "${{ matrix.simd }}" == "sse3" ]; then - export CFLAGS="-msse3" - elif [ "${{ matrix.simd }}" == "sse4" ]; then - export CFLAGS="-msse4" - elif [ "${{ matrix.simd }}" == "avx" ]; then - export CFLAGS="-mavx" - elif [ "${{ matrix.simd }}" == "avx2" ]; then - export CFLAGS="-mavx2" - elif [ "${{ matrix.simd }}" == "neon" ]; then - export CFLAGS="-mfpu=neon" - fi + $simd = "${{ matrix.simd }}" + if ($simd -eq "none") { + $env:CFLAGS = "" + } elseif ($simd -eq "sse") { + $env:CFLAGS = "-arch:SSE" + } elseif ($simd -eq "sse2") { + $env:CFLAGS = "-arch:SSE2" + } elseif ($simd -eq "sse3") { + $env:CFLAGS = "-arch:SSE3" + } elseif ($simd -eq "sse4") { + $env:CFLAGS = "-arch:SSE4" + } elseif ($simd -eq "avx") { + $env:CFLAGS = "-arch:AVX" + } elseif ($simd -eq "avx2") { + $env:CFLAGS = "-arch:AVX2" + } elseif ($simd -eq "neon") { + $env:CFLAGS = "-arch:NEON" } - - name: Build with meson + - name: Set SIMD flags (Unix) + if: runner.os != 'Windows' + shell: bash + run: | + if [ "${{ matrix.simd }}" == "none" ]; then + export CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + export CFLAGS="-msse" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + export CFLAGS="-msse2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + export CFLAGS="-msse3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + export CFLAGS="-msse4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + export CFLAGS="-mavx" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + export CFLAGS="-mavx2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + export CFLAGS="-mfpu=neon" + fi + + - name: Build with meson (Windows) + if: runner.os == 'Windows' + shell: pwsh + run: | + meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$env:CFLAGS" + meson test -C build + + - name: Build with meson (Unix) + if: runner.os != 'Windows' + shell: bash run: | meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$CFLAGS" meson test -C build From 1ad56f0e943abd9e92bc3d4d3699ed5cba1c3321 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 12:16:07 +0300 Subject: [PATCH 115/128] Update ci.yml --- .github/workflows/ci.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd3e458..3e2e421 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -130,7 +130,7 @@ jobs: fi - name: Configure CMake - run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=${{ matrix.target.cc }} -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=${{ matrix.target.cc }} -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF - name: Build run: cmake --build build @@ -161,7 +161,9 @@ jobs: -GNinja \ -DCMAKE_BUILD_TYPE=Release \ -DCGLM_STATIC=ON \ - -DCGLM_USE_TEST=ON + -DCGLM_USE_TEST=ON \ + -DCGLM_USE_C99=OFF \ + -DCGLM_SHARED=OFF - name: Build run: cmake --build build @@ -234,19 +236,20 @@ jobs: - name: Configure CMake (Windows) if: runner.os == 'Windows' shell: pwsh - run: cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + run: cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF - name: Configure CMake (Unix) if: runner.os != 'Windows' shell: bash - run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF - name: Build - run: cmake --build build + run: cmake --build build --config Release - name: Test working-directory: build - run: ./tests + shell: ${{ runner.os == 'Windows' && 'pwsh' || 'bash' }} + run: ${{ runner.os == 'Windows' && '.\Release\tests.exe' || './tests' }} build_meson: name: Meson / ${{ matrix.os }} / ${{ matrix.simd }} From 814c3543377a9cb6fdc45b11e77ad093232282d0 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 12:18:12 +0300 Subject: [PATCH 116/128] Update ci.yml --- .github/workflows/ci.yml | 60 +++++++++++++++------------------------- 1 file changed, 23 insertions(+), 37 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e2e421..923eba9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -188,33 +188,24 @@ jobs: if: runner.os == 'macOS' run: brew upgrade && brew install ninja - - name: Set SIMD flags (Windows) - if: runner.os == 'Windows' - shell: pwsh + - name: Set SIMD flags + shell: ${{ (runner.os == 'Windows' && 'pwsh') || 'bash' }} run: | - $simd = "${{ matrix.simd }}" - if ($simd -eq "none") { - $env:CFLAGS = "" - } elseif ($simd -eq "sse") { - $env:CFLAGS = "-arch:SSE" - } elseif ($simd -eq "sse2") { - $env:CFLAGS = "-arch:SSE2" - } elseif ($simd -eq "sse3") { - $env:CFLAGS = "-arch:SSE3" - } elseif ($simd -eq "sse4") { - $env:CFLAGS = "-arch:SSE4" - } elseif ($simd -eq "avx") { - $env:CFLAGS = "-arch:AVX" - } elseif ($simd -eq "avx2") { - $env:CFLAGS = "-arch:AVX2" - } elseif ($simd -eq "neon") { - $env:CFLAGS = "-arch:NEON" + ${{ (runner.os == 'Windows' && 'function Set-Flags { + $simd = $env:MATRIX_SIMD + switch ($simd) { + "none" { $env:CFLAGS = "" } + "sse" { $env:CFLAGS = "-arch:SSE" } + "sse2" { $env:CFLAGS = "-arch:SSE2" } + "sse3" { $env:CFLAGS = "-arch:SSE3" } + "sse4" { $env:CFLAGS = "-arch:SSE4" } + "avx" { $env:CFLAGS = "-arch:AVX" } + "avx2" { $env:CFLAGS = "-arch:AVX2" } + "neon" { $env:CFLAGS = "-arch:NEON" } + } } - - - name: Set SIMD flags (Unix) - if: runner.os != 'Windows' - shell: bash - run: | + $env:MATRIX_SIMD = "' + matrix.simd + '" + Set-Flags') || ' if [ "${{ matrix.simd }}" == "none" ]; then export CFLAGS="" elif [ "${{ matrix.simd }}" == "sse" ]; then @@ -231,25 +222,20 @@ jobs: export CFLAGS="-mavx2" elif [ "${{ matrix.simd }}" == "neon" ]; then export CFLAGS="-mfpu=neon" - fi + fi' }} - - name: Configure CMake (Windows) - if: runner.os == 'Windows' - shell: pwsh - run: cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF - - - name: Configure CMake (Unix) - if: runner.os != 'Windows' - shell: bash - run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF + - name: Configure CMake + shell: ${{ (runner.os == 'Windows' && 'pwsh') || 'bash' }} + run: | + ${{ (runner.os == 'Windows' && 'cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF -DCMAKE_C_FLAGS="$env:CFLAGS"') || 'cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF -DCMAKE_C_FLAGS="$CFLAGS"' }} - name: Build run: cmake --build build --config Release - name: Test working-directory: build - shell: ${{ runner.os == 'Windows' && 'pwsh' || 'bash' }} - run: ${{ runner.os == 'Windows' && '.\Release\tests.exe' || './tests' }} + shell: ${{ (runner.os == 'Windows' && 'pwsh') || 'bash' }} + run: ${{ (runner.os == 'Windows' && '.\Release\tests.exe') || './tests' }} build_meson: name: Meson / ${{ matrix.os }} / ${{ matrix.simd }} From 488f782704b4f29289e46500fd10684a7a649ce0 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 12:15:22 +0300 Subject: [PATCH 117/128] Update ci.yml Update ci.yml Update ci.yml --- .github/workflows/ci.yml | 153 ++++++++++++++++++++------------------- 1 file changed, 78 insertions(+), 75 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d04a6bd..923eba9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -130,7 +130,7 @@ jobs: fi - name: Configure CMake - run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=${{ matrix.target.cc }} -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=${{ matrix.target.cc }} -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF - name: Build run: cmake --build build @@ -161,7 +161,9 @@ jobs: -GNinja \ -DCMAKE_BUILD_TYPE=Release \ -DCGLM_STATIC=ON \ - -DCGLM_USE_TEST=ON + -DCGLM_USE_TEST=ON \ + -DCGLM_USE_C99=OFF \ + -DCGLM_SHARED=OFF - name: Build run: cmake --build build @@ -186,6 +188,75 @@ jobs: if: runner.os == 'macOS' run: brew upgrade && brew install ninja + - name: Set SIMD flags + shell: ${{ (runner.os == 'Windows' && 'pwsh') || 'bash' }} + run: | + ${{ (runner.os == 'Windows' && 'function Set-Flags { + $simd = $env:MATRIX_SIMD + switch ($simd) { + "none" { $env:CFLAGS = "" } + "sse" { $env:CFLAGS = "-arch:SSE" } + "sse2" { $env:CFLAGS = "-arch:SSE2" } + "sse3" { $env:CFLAGS = "-arch:SSE3" } + "sse4" { $env:CFLAGS = "-arch:SSE4" } + "avx" { $env:CFLAGS = "-arch:AVX" } + "avx2" { $env:CFLAGS = "-arch:AVX2" } + "neon" { $env:CFLAGS = "-arch:NEON" } + } + } + $env:MATRIX_SIMD = "' + matrix.simd + '" + Set-Flags') || ' + if [ "${{ matrix.simd }}" == "none" ]; then + export CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + export CFLAGS="-msse" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + export CFLAGS="-msse2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + export CFLAGS="-msse3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + export CFLAGS="-msse4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + export CFLAGS="-mavx" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + export CFLAGS="-mavx2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + export CFLAGS="-mfpu=neon" + fi' }} + + - name: Configure CMake + shell: ${{ (runner.os == 'Windows' && 'pwsh') || 'bash' }} + run: | + ${{ (runner.os == 'Windows' && 'cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF -DCMAKE_C_FLAGS="$env:CFLAGS"') || 'cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF -DCMAKE_C_FLAGS="$CFLAGS"' }} + + - name: Build + run: cmake --build build --config Release + + - name: Test + working-directory: build + shell: ${{ (runner.os == 'Windows' && 'pwsh') || 'bash' }} + run: ${{ (runner.os == 'Windows' && '.\Release\tests.exe') || './tests' }} + + build_meson: + name: Meson / ${{ matrix.os }} / ${{ matrix.simd }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-14, ubuntu-22.04, ubuntu-24.04, windows-2022] + simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon] + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + cache: 'pip' + + - name: Install meson + run: python3 -m pip install meson ninja + - name: Set SIMD flags (Windows) if: runner.os == 'Windows' shell: pwsh @@ -231,84 +302,16 @@ jobs: export CFLAGS="-mfpu=neon" fi - - name: Configure CMake (Windows) + - name: Build with meson (Windows) if: runner.os == 'Windows' shell: pwsh - run: cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + run: | + meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$env:CFLAGS" + meson test -C build - - name: Configure CMake (Unix) + - name: Build with meson (Unix) if: runner.os != 'Windows' shell: bash - run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - - - name: Build - run: cmake --build build - - - name: Test - working-directory: build - run: ./tests - - build_meson: - name: Meson / ${{ matrix.os }} / ${{ matrix.simd }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [macos-14, ubuntu-22.04, ubuntu-24.04, windows-2022] - simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon] - - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - cache: 'pip' - - - name: Install meson - run: python3 -m pip install meson ninja - - - name: Set SIMD flags - run: | - if ($Env:RUNNER_OS -eq 'Windows') { - if ($Env:SIMD -eq 'none') { - $Env:CFLAGS="" - } elseif ($Env:SIMD -eq 'sse') { - $Env:CFLAGS="-arch:SSE" - } elseif ($Env:SIMD -eq 'sse2') { - $Env:CFLAGS="-arch:SSE2" - } elseif ($Env:SIMD -eq 'sse3') { - $Env:CFLAGS="-arch:SSE3" - } elseif ($Env:SIMD -eq 'sse4') { - $Env:CFLAGS="-arch:SSE4" - } elseif ($Env:SIMD -eq 'avx') { - $Env:CFLAGS="-arch:AVX" - } elseif ($Env:SIMD -eq 'avx2') { - $Env:CFLAGS="-arch:AVX2" - } elseif ($Env:SIMD -eq 'neon') { - $Env:CFLAGS="-arch:NEON" - } - } else { - if [ "${{ matrix.simd }}" == "none" ]; then - export CFLAGS="" - elif [ "${{ matrix.simd }}" == "sse" ]; then - export CFLAGS="-msse" - elif [ "${{ matrix.simd }}" == "sse2" ]; then - export CFLAGS="-msse2" - elif [ "${{ matrix.simd }}" == "sse3" ]; then - export CFLAGS="-msse3" - elif [ "${{ matrix.simd }}" == "sse4" ]; then - export CFLAGS="-msse4" - elif [ "${{ matrix.simd }}" == "avx" ]; then - export CFLAGS="-mavx" - elif [ "${{ matrix.simd }}" == "avx2" ]; then - export CFLAGS="-mavx2" - elif [ "${{ matrix.simd }}" == "neon" ]; then - export CFLAGS="-mfpu=neon" - fi - } - - - name: Build with meson run: | meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$CFLAGS" meson test -C build From 39052494a244db5d50cdea84cebfce329e655da4 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 12:22:27 +0300 Subject: [PATCH 118/128] Revert "Update ci.yml" This reverts commit 488f782704b4f29289e46500fd10684a7a649ce0. --- .github/workflows/ci.yml | 153 +++++++++++++++++++-------------------- 1 file changed, 75 insertions(+), 78 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 923eba9..d04a6bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -130,7 +130,7 @@ jobs: fi - name: Configure CMake - run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=${{ matrix.target.cc }} -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF + run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=${{ matrix.target.cc }} -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - name: Build run: cmake --build build @@ -161,9 +161,7 @@ jobs: -GNinja \ -DCMAKE_BUILD_TYPE=Release \ -DCGLM_STATIC=ON \ - -DCGLM_USE_TEST=ON \ - -DCGLM_USE_C99=OFF \ - -DCGLM_SHARED=OFF + -DCGLM_USE_TEST=ON - name: Build run: cmake --build build @@ -188,75 +186,6 @@ jobs: if: runner.os == 'macOS' run: brew upgrade && brew install ninja - - name: Set SIMD flags - shell: ${{ (runner.os == 'Windows' && 'pwsh') || 'bash' }} - run: | - ${{ (runner.os == 'Windows' && 'function Set-Flags { - $simd = $env:MATRIX_SIMD - switch ($simd) { - "none" { $env:CFLAGS = "" } - "sse" { $env:CFLAGS = "-arch:SSE" } - "sse2" { $env:CFLAGS = "-arch:SSE2" } - "sse3" { $env:CFLAGS = "-arch:SSE3" } - "sse4" { $env:CFLAGS = "-arch:SSE4" } - "avx" { $env:CFLAGS = "-arch:AVX" } - "avx2" { $env:CFLAGS = "-arch:AVX2" } - "neon" { $env:CFLAGS = "-arch:NEON" } - } - } - $env:MATRIX_SIMD = "' + matrix.simd + '" - Set-Flags') || ' - if [ "${{ matrix.simd }}" == "none" ]; then - export CFLAGS="" - elif [ "${{ matrix.simd }}" == "sse" ]; then - export CFLAGS="-msse" - elif [ "${{ matrix.simd }}" == "sse2" ]; then - export CFLAGS="-msse2" - elif [ "${{ matrix.simd }}" == "sse3" ]; then - export CFLAGS="-msse3" - elif [ "${{ matrix.simd }}" == "sse4" ]; then - export CFLAGS="-msse4" - elif [ "${{ matrix.simd }}" == "avx" ]; then - export CFLAGS="-mavx" - elif [ "${{ matrix.simd }}" == "avx2" ]; then - export CFLAGS="-mavx2" - elif [ "${{ matrix.simd }}" == "neon" ]; then - export CFLAGS="-mfpu=neon" - fi' }} - - - name: Configure CMake - shell: ${{ (runner.os == 'Windows' && 'pwsh') || 'bash' }} - run: | - ${{ (runner.os == 'Windows' && 'cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF -DCMAKE_C_FLAGS="$env:CFLAGS"') || 'cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF -DCMAKE_C_FLAGS="$CFLAGS"' }} - - - name: Build - run: cmake --build build --config Release - - - name: Test - working-directory: build - shell: ${{ (runner.os == 'Windows' && 'pwsh') || 'bash' }} - run: ${{ (runner.os == 'Windows' && '.\Release\tests.exe') || './tests' }} - - build_meson: - name: Meson / ${{ matrix.os }} / ${{ matrix.simd }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [macos-14, ubuntu-22.04, ubuntu-24.04, windows-2022] - simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon] - - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - cache: 'pip' - - - name: Install meson - run: python3 -m pip install meson ninja - - name: Set SIMD flags (Windows) if: runner.os == 'Windows' shell: pwsh @@ -302,16 +231,84 @@ jobs: export CFLAGS="-mfpu=neon" fi - - name: Build with meson (Windows) + - name: Configure CMake (Windows) if: runner.os == 'Windows' shell: pwsh - run: | - meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$env:CFLAGS" - meson test -C build + run: cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - - name: Build with meson (Unix) + - name: Configure CMake (Unix) if: runner.os != 'Windows' shell: bash + run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + + - name: Build + run: cmake --build build + + - name: Test + working-directory: build + run: ./tests + + build_meson: + name: Meson / ${{ matrix.os }} / ${{ matrix.simd }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-14, ubuntu-22.04, ubuntu-24.04, windows-2022] + simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon] + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + cache: 'pip' + + - name: Install meson + run: python3 -m pip install meson ninja + + - name: Set SIMD flags + run: | + if ($Env:RUNNER_OS -eq 'Windows') { + if ($Env:SIMD -eq 'none') { + $Env:CFLAGS="" + } elseif ($Env:SIMD -eq 'sse') { + $Env:CFLAGS="-arch:SSE" + } elseif ($Env:SIMD -eq 'sse2') { + $Env:CFLAGS="-arch:SSE2" + } elseif ($Env:SIMD -eq 'sse3') { + $Env:CFLAGS="-arch:SSE3" + } elseif ($Env:SIMD -eq 'sse4') { + $Env:CFLAGS="-arch:SSE4" + } elseif ($Env:SIMD -eq 'avx') { + $Env:CFLAGS="-arch:AVX" + } elseif ($Env:SIMD -eq 'avx2') { + $Env:CFLAGS="-arch:AVX2" + } elseif ($Env:SIMD -eq 'neon') { + $Env:CFLAGS="-arch:NEON" + } + } else { + if [ "${{ matrix.simd }}" == "none" ]; then + export CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + export CFLAGS="-msse" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + export CFLAGS="-msse2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + export CFLAGS="-msse3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + export CFLAGS="-msse4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + export CFLAGS="-mavx" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + export CFLAGS="-mavx2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + export CFLAGS="-mfpu=neon" + fi + } + + - name: Build with meson run: | meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$CFLAGS" meson test -C build From a18d9c28e794027ef9217a48b53ed3fed02c56f0 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 12:41:08 +0300 Subject: [PATCH 119/128] Update ci.yml --- .github/workflows/ci.yml | 153 +++++++++++++++++++-------------------- 1 file changed, 75 insertions(+), 78 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 923eba9..d04a6bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -130,7 +130,7 @@ jobs: fi - name: Configure CMake - run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=${{ matrix.target.cc }} -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF + run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=${{ matrix.target.cc }} -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - name: Build run: cmake --build build @@ -161,9 +161,7 @@ jobs: -GNinja \ -DCMAKE_BUILD_TYPE=Release \ -DCGLM_STATIC=ON \ - -DCGLM_USE_TEST=ON \ - -DCGLM_USE_C99=OFF \ - -DCGLM_SHARED=OFF + -DCGLM_USE_TEST=ON - name: Build run: cmake --build build @@ -188,75 +186,6 @@ jobs: if: runner.os == 'macOS' run: brew upgrade && brew install ninja - - name: Set SIMD flags - shell: ${{ (runner.os == 'Windows' && 'pwsh') || 'bash' }} - run: | - ${{ (runner.os == 'Windows' && 'function Set-Flags { - $simd = $env:MATRIX_SIMD - switch ($simd) { - "none" { $env:CFLAGS = "" } - "sse" { $env:CFLAGS = "-arch:SSE" } - "sse2" { $env:CFLAGS = "-arch:SSE2" } - "sse3" { $env:CFLAGS = "-arch:SSE3" } - "sse4" { $env:CFLAGS = "-arch:SSE4" } - "avx" { $env:CFLAGS = "-arch:AVX" } - "avx2" { $env:CFLAGS = "-arch:AVX2" } - "neon" { $env:CFLAGS = "-arch:NEON" } - } - } - $env:MATRIX_SIMD = "' + matrix.simd + '" - Set-Flags') || ' - if [ "${{ matrix.simd }}" == "none" ]; then - export CFLAGS="" - elif [ "${{ matrix.simd }}" == "sse" ]; then - export CFLAGS="-msse" - elif [ "${{ matrix.simd }}" == "sse2" ]; then - export CFLAGS="-msse2" - elif [ "${{ matrix.simd }}" == "sse3" ]; then - export CFLAGS="-msse3" - elif [ "${{ matrix.simd }}" == "sse4" ]; then - export CFLAGS="-msse4" - elif [ "${{ matrix.simd }}" == "avx" ]; then - export CFLAGS="-mavx" - elif [ "${{ matrix.simd }}" == "avx2" ]; then - export CFLAGS="-mavx2" - elif [ "${{ matrix.simd }}" == "neon" ]; then - export CFLAGS="-mfpu=neon" - fi' }} - - - name: Configure CMake - shell: ${{ (runner.os == 'Windows' && 'pwsh') || 'bash' }} - run: | - ${{ (runner.os == 'Windows' && 'cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF -DCMAKE_C_FLAGS="$env:CFLAGS"') || 'cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON -DCGLM_USE_C99=OFF -DCGLM_SHARED=OFF -DCMAKE_C_FLAGS="$CFLAGS"' }} - - - name: Build - run: cmake --build build --config Release - - - name: Test - working-directory: build - shell: ${{ (runner.os == 'Windows' && 'pwsh') || 'bash' }} - run: ${{ (runner.os == 'Windows' && '.\Release\tests.exe') || './tests' }} - - build_meson: - name: Meson / ${{ matrix.os }} / ${{ matrix.simd }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [macos-14, ubuntu-22.04, ubuntu-24.04, windows-2022] - simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon] - - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - cache: 'pip' - - - name: Install meson - run: python3 -m pip install meson ninja - - name: Set SIMD flags (Windows) if: runner.os == 'Windows' shell: pwsh @@ -302,16 +231,84 @@ jobs: export CFLAGS="-mfpu=neon" fi - - name: Build with meson (Windows) + - name: Configure CMake (Windows) if: runner.os == 'Windows' shell: pwsh - run: | - meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$env:CFLAGS" - meson test -C build + run: cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON - - name: Build with meson (Unix) + - name: Configure CMake (Unix) if: runner.os != 'Windows' shell: bash + run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON + + - name: Build + run: cmake --build build + + - name: Test + working-directory: build + run: ./tests + + build_meson: + name: Meson / ${{ matrix.os }} / ${{ matrix.simd }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-14, ubuntu-22.04, ubuntu-24.04, windows-2022] + simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon] + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + cache: 'pip' + + - name: Install meson + run: python3 -m pip install meson ninja + + - name: Set SIMD flags + run: | + if ($Env:RUNNER_OS -eq 'Windows') { + if ($Env:SIMD -eq 'none') { + $Env:CFLAGS="" + } elseif ($Env:SIMD -eq 'sse') { + $Env:CFLAGS="-arch:SSE" + } elseif ($Env:SIMD -eq 'sse2') { + $Env:CFLAGS="-arch:SSE2" + } elseif ($Env:SIMD -eq 'sse3') { + $Env:CFLAGS="-arch:SSE3" + } elseif ($Env:SIMD -eq 'sse4') { + $Env:CFLAGS="-arch:SSE4" + } elseif ($Env:SIMD -eq 'avx') { + $Env:CFLAGS="-arch:AVX" + } elseif ($Env:SIMD -eq 'avx2') { + $Env:CFLAGS="-arch:AVX2" + } elseif ($Env:SIMD -eq 'neon') { + $Env:CFLAGS="-arch:NEON" + } + } else { + if [ "${{ matrix.simd }}" == "none" ]; then + export CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + export CFLAGS="-msse" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + export CFLAGS="-msse2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + export CFLAGS="-msse3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + export CFLAGS="-msse4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + export CFLAGS="-mavx" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + export CFLAGS="-mavx2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + export CFLAGS="-mfpu=neon" + fi + } + + - name: Build with meson run: | meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$CFLAGS" meson test -C build From ae1b9a39827a5ee1ea1caf0b23fab1e3f8954dec Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 12:44:04 +0300 Subject: [PATCH 120/128] Update ci.yml --- .github/workflows/ci.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d04a6bd..d59fd47 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -244,7 +244,15 @@ jobs: - name: Build run: cmake --build build - - name: Test + - name: Test (Windows) + if: runner.os == 'Windows' + shell: pwsh + working-directory: build + run: .\tests.exe + + - name: Test (Unix) + if: runner.os != 'Windows' + shell: bash working-directory: build run: ./tests From 5672370e319b547f8f6aefbbd28979aeb8f2a20d Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 12:49:52 +0300 Subject: [PATCH 121/128] Update ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d59fd47..07cffa4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -248,7 +248,7 @@ jobs: if: runner.os == 'Windows' shell: pwsh working-directory: build - run: .\tests.exe + run: .\Debug\tests.exe - name: Test (Unix) if: runner.os != 'Windows' From f4993318d29b0d217284c83b669ade95bcc0c074 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 13:04:37 +0300 Subject: [PATCH 122/128] Update ci.yml --- .github/workflows/ci.yml | 90 +++++++++++++++++++++++----------------- 1 file changed, 52 insertions(+), 38 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 07cffa4..b4084a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -276,47 +276,61 @@ jobs: - name: Install meson run: python3 -m pip install meson ninja - - name: Set SIMD flags + - name: Set SIMD flags (Windows) + if: runner.os == 'Windows' + shell: pwsh run: | - if ($Env:RUNNER_OS -eq 'Windows') { - if ($Env:SIMD -eq 'none') { - $Env:CFLAGS="" - } elseif ($Env:SIMD -eq 'sse') { - $Env:CFLAGS="-arch:SSE" - } elseif ($Env:SIMD -eq 'sse2') { - $Env:CFLAGS="-arch:SSE2" - } elseif ($Env:SIMD -eq 'sse3') { - $Env:CFLAGS="-arch:SSE3" - } elseif ($Env:SIMD -eq 'sse4') { - $Env:CFLAGS="-arch:SSE4" - } elseif ($Env:SIMD -eq 'avx') { - $Env:CFLAGS="-arch:AVX" - } elseif ($Env:SIMD -eq 'avx2') { - $Env:CFLAGS="-arch:AVX2" - } elseif ($Env:SIMD -eq 'neon') { - $Env:CFLAGS="-arch:NEON" - } - } else { - if [ "${{ matrix.simd }}" == "none" ]; then - export CFLAGS="" - elif [ "${{ matrix.simd }}" == "sse" ]; then - export CFLAGS="-msse" - elif [ "${{ matrix.simd }}" == "sse2" ]; then - export CFLAGS="-msse2" - elif [ "${{ matrix.simd }}" == "sse3" ]; then - export CFLAGS="-msse3" - elif [ "${{ matrix.simd }}" == "sse4" ]; then - export CFLAGS="-msse4" - elif [ "${{ matrix.simd }}" == "avx" ]; then - export CFLAGS="-mavx" - elif [ "${{ matrix.simd }}" == "avx2" ]; then - export CFLAGS="-mavx2" - elif [ "${{ matrix.simd }}" == "neon" ]; then - export CFLAGS="-mfpu=neon" - fi + $simd = "${{ matrix.simd }}" + if ($simd -eq "none") { + $env:CFLAGS = "" + } elseif ($simd -eq "sse") { + $env:CFLAGS = "-arch:SSE" + } elseif ($simd -eq "sse2") { + $env:CFLAGS = "-arch:SSE2" + } elseif ($simd -eq "sse3") { + $env:CFLAGS = "-arch:SSE3" + } elseif ($simd -eq "sse4") { + $env:CFLAGS = "-arch:SSE4" + } elseif ($simd -eq "avx") { + $env:CFLAGS = "-arch:AVX" + } elseif ($simd -eq "avx2") { + $env:CFLAGS = "-arch:AVX2" + } elseif ($simd -eq "neon") { + $env:CFLAGS = "-arch:NEON" } - - name: Build with meson + - name: Set SIMD flags (Unix) + if: runner.os != 'Windows' + shell: bash + run: | + if [ "${{ matrix.simd }}" == "none" ]; then + export CFLAGS="" + elif [ "${{ matrix.simd }}" == "sse" ]; then + export CFLAGS="-msse" + elif [ "${{ matrix.simd }}" == "sse2" ]; then + export CFLAGS="-msse2" + elif [ "${{ matrix.simd }}" == "sse3" ]; then + export CFLAGS="-msse3" + elif [ "${{ matrix.simd }}" == "sse4" ]; then + export CFLAGS="-msse4" + elif [ "${{ matrix.simd }}" == "avx" ]; then + export CFLAGS="-mavx" + elif [ "${{ matrix.simd }}" == "avx2" ]; then + export CFLAGS="-mavx2" + elif [ "${{ matrix.simd }}" == "neon" ]; then + export CFLAGS="-mfpu=neon" + fi + + - name: Build with meson (Windows) + if: runner.os == 'Windows' + shell: pwsh + run: | + meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$env:CFLAGS" + meson test -C build + + - name: Build with meson (Unix) + if: runner.os != 'Windows' + shell: bash run: | meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$CFLAGS" meson test -C build From 36f59b7b6c709261fe858a8d81e9717169eab70c Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 13:39:30 +0300 Subject: [PATCH 123/128] Update cmake-wasm.yml --- .github/workflows/cmake-wasm.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cmake-wasm.yml b/.github/workflows/cmake-wasm.yml index 66039b2..684bad9 100644 --- a/.github/workflows/cmake-wasm.yml +++ b/.github/workflows/cmake-wasm.yml @@ -34,7 +34,9 @@ jobs: - name: Configure CMake # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}}" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCGLM_USE_TEST=ON + # Building a wasm library without needing to define a main(): + # https://github.com/WebAssembly/wasi-sdk/issues/332 + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}}" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCMAKE_EXE_LINKER_FLAGS="-mexec-model=reactor" -DCGLM_USE_TEST=ON - name: Build # Build your program with the given configuration From 2f36faa70ad0bf1c21219684077040818df89c70 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 13:45:19 +0300 Subject: [PATCH 124/128] Update cmake-wasm.yml --- .github/workflows/cmake-wasm.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cmake-wasm.yml b/.github/workflows/cmake-wasm.yml index 684bad9..f105b59 100644 --- a/.github/workflows/cmake-wasm.yml +++ b/.github/workflows/cmake-wasm.yml @@ -31,12 +31,18 @@ jobs: wget --no-verbose https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${{matrix.wasi_sdk_version}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0-linux.tar.gz tar xf wasi-sdk-${{matrix.wasi_sdk_version}}.0-linux.tar.gz + # Building a wasm library without needing to define a main(): + # https://github.com/WebAssembly/wasi-sdk/issues/332 + - name: Modify CMakeLists.txt for WASI + run: | + echo 'if (CMAKE_SYSTEM_NAME STREQUAL "WASI")' >> CMakeLists.txt + echo ' target_link_options(${PROJECT_NAME} PRIVATE -mexec-model=reactor)' >> CMakeLists.txt + echo 'endif()' >> CMakeLists.txt + - name: Configure CMake # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type - # Building a wasm library without needing to define a main(): - # https://github.com/WebAssembly/wasi-sdk/issues/332 - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}}" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCMAKE_EXE_LINKER_FLAGS="-mexec-model=reactor" -DCGLM_USE_TEST=ON + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}}" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCGLM_USE_TEST=ON - name: Build # Build your program with the given configuration From a48fa8be65e88dd173c7da4ef28a9625faa4517d Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 13:54:37 +0300 Subject: [PATCH 125/128] Update cmake-wasm.yml --- .github/workflows/cmake-wasm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-wasm.yml b/.github/workflows/cmake-wasm.yml index f105b59..fa4589a 100644 --- a/.github/workflows/cmake-wasm.yml +++ b/.github/workflows/cmake-wasm.yml @@ -42,7 +42,7 @@ jobs: - name: Configure CMake # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}}" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCGLM_USE_TEST=ON + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}}" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCGLM_STATIC=ON -DCGLM_SHARED=OFF -DCGLM_USE_TEST=ON - name: Build # Build your program with the given configuration From 40a2aca7ecfa481bfa70d8fb361b50fd6dfe3b28 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 13:55:14 +0300 Subject: [PATCH 126/128] Update cmake-wasm.yml --- .github/workflows/cmake-wasm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-wasm.yml b/.github/workflows/cmake-wasm.yml index fa4589a..eec2f95 100644 --- a/.github/workflows/cmake-wasm.yml +++ b/.github/workflows/cmake-wasm.yml @@ -42,7 +42,7 @@ jobs: - name: Configure CMake # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}}" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCGLM_STATIC=ON -DCGLM_SHARED=OFF -DCGLM_USE_TEST=ON + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}} -D_WASI_EMULATED_PROCESS_CLOCKS" -DCMAKE_EXE_LINKER_FLAGS="-lwasi-emulated-process-clocks" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCGLM_STATIC=ON -DCGLM_SHARED=OFF -DCGLM_USE_TEST=ON - name: Build # Build your program with the given configuration From 9b660e8bd0192b092ceb88af3d9ff3febe14f51c Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 23 Jan 2025 14:10:04 +0300 Subject: [PATCH 127/128] Update cmake-wasm.yml --- .github/workflows/cmake-wasm.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/cmake-wasm.yml b/.github/workflows/cmake-wasm.yml index eec2f95..cdccaa6 100644 --- a/.github/workflows/cmake-wasm.yml +++ b/.github/workflows/cmake-wasm.yml @@ -42,6 +42,8 @@ jobs: - name: Configure CMake # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + # Below suppress <<'clock' is deprecated: WASI lacks process-associated clocks; ...>> warns: + # -D_WASI_EMULATED_PROCESS_CLOCKS" -DCMAKE_EXE_LINKER_FLAGS="-lwasi-emulated-process-clocks run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}} -D_WASI_EMULATED_PROCESS_CLOCKS" -DCMAKE_EXE_LINKER_FLAGS="-lwasi-emulated-process-clocks" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCGLM_STATIC=ON -DCGLM_SHARED=OFF -DCGLM_USE_TEST=ON - name: Build From 441f2657ab4463f4ace2fd0c3ea833ff4782270e Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Fri, 24 Jan 2025 11:20:49 +0300 Subject: [PATCH 128/128] suppress param-name warns --- include/cglm/vec2-ext.h | 12 ++++++------ include/cglm/vec3-ext.h | 16 ++++++++-------- include/cglm/vec4-ext.h | 20 ++++++++++---------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/include/cglm/vec2-ext.h b/include/cglm/vec2-ext.h index 4322618..6186f07 100644 --- a/include/cglm/vec2-ext.h +++ b/include/cglm/vec2-ext.h @@ -224,9 +224,9 @@ glm_vec2_fract(vec2 v, vec2 dest) { */ CGLM_INLINE void -glm_vec2_floor(vec2 x, vec2 dest) { - dest[0] = floorf(x[0]); - dest[1] = floorf(x[1]); +glm_vec2_floor(vec2 v, vec2 dest) { + dest[0] = floorf(v[0]); + dest[1] = floorf(v[1]); } /*! @@ -238,9 +238,9 @@ glm_vec2_floor(vec2 x, vec2 dest) { */ CGLM_INLINE void -glm_vec2_mods(vec2 x, float y, vec2 dest) { - dest[0] = fmodf(x[0], y); - dest[1] = fmodf(x[1], y); +glm_vec2_mods(vec2 v, float s, vec2 dest) { + dest[0] = fmodf(v[0], s); + dest[1] = fmodf(v[1], s); } /*! diff --git a/include/cglm/vec3-ext.h b/include/cglm/vec3-ext.h index 6b8c041..4413cc2 100644 --- a/include/cglm/vec3-ext.h +++ b/include/cglm/vec3-ext.h @@ -262,10 +262,10 @@ glm_vec3_fract(vec3 v, vec3 dest) { */ CGLM_INLINE void -glm_vec3_floor(vec3 x, vec3 dest) { - dest[0] = floorf(x[0]); - dest[1] = floorf(x[1]); - dest[2] = floorf(x[2]); +glm_vec3_floor(vec3 v, vec3 dest) { + dest[0] = floorf(v[0]); + dest[1] = floorf(v[1]); + dest[2] = floorf(v[2]); } /*! @@ -277,10 +277,10 @@ glm_vec3_floor(vec3 x, vec3 dest) { */ CGLM_INLINE void -glm_vec3_mods(vec3 x, float y, vec3 dest) { - dest[0] = fmodf(x[0], y); - dest[1] = fmodf(x[1], y); - dest[2] = fmodf(x[2], y); +glm_vec3_mods(vec3 v, float s, vec3 dest) { + dest[0] = fmodf(v[0], s); + dest[1] = fmodf(v[1], s); + dest[2] = fmodf(v[2], s); } /*! diff --git a/include/cglm/vec4-ext.h b/include/cglm/vec4-ext.h index 1f03eea..2863398 100644 --- a/include/cglm/vec4-ext.h +++ b/include/cglm/vec4-ext.h @@ -300,11 +300,11 @@ glm_vec4_fract(vec4 v, vec4 dest) { */ CGLM_INLINE void -glm_vec4_floor(vec4 x, vec4 dest) { - dest[0] = floorf(x[0]); - dest[1] = floorf(x[1]); - dest[2] = floorf(x[2]); - dest[3] = floorf(x[3]); +glm_vec4_floor(vec4 v, vec4 dest) { + dest[0] = floorf(v[0]); + dest[1] = floorf(v[1]); + dest[2] = floorf(v[2]); + dest[3] = floorf(v[3]); } /*! @@ -316,11 +316,11 @@ glm_vec4_floor(vec4 x, vec4 dest) { */ CGLM_INLINE void -glm_vec4_mods(vec4 x, float y, vec4 dest) { - dest[0] = fmodf(x[0], y); - dest[1] = fmodf(x[1], y); - dest[2] = fmodf(x[2], y); - dest[3] = fmodf(x[3], y); +glm_vec4_mods(vec4 v, float s, vec4 dest) { + dest[0] = fmodf(v[0], s); + dest[1] = fmodf(v[1], s); + dest[2] = fmodf(v[2], s); + dest[3] = fmodf(v[3], s); } /*!