From a4cd7e008d016cef80f5abb278ba5f7a3806b4f6 Mon Sep 17 00:00:00 2001 From: Marcin Date: Tue, 14 Jan 2025 17:31:35 +0000 Subject: [PATCH 01/79] 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 02/79] 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 03/79] 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 04/79] 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 05/79] 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 06/79] 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 07/79] 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 08/79] 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 09/79] 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 10/79] 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 11/79] 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 12/79] 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 13/79] 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 14/79] 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 15/79] 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 16/79] 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 17/79] 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 18/79] 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 19/79] 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 20/79] 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 21/79] 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 22/79] 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 23/79] 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 24/79] 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 25/79] 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 26/79] 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 27/79] 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 28/79] 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 29/79] 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 30/79] 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 31/79] 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 32/79] 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 33/79] 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 34/79] 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 35/79] 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 36/79] 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 37/79] 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 38/79] 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 39/79] 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 40/79] 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 41/79] 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 42/79] 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 43/79] 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 44/79] 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 45/79] 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 46/79] 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 47/79] 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 48/79] 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 49/79] 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 50/79] 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 51/79] 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 52/79] 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 53/79] 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 54/79] 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 55/79] 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 56/79] 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 57/79] 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 58/79] 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 59/79] 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 60/79] 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 61/79] 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 62/79] 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 63/79] 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 64/79] 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 65/79] 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 66/79] 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 67/79] 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 68/79] 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 69/79] 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 70/79] 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 71/79] 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 72/79] 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 73/79] _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 450d7478675c68fb8c2e0ea2cfbc6a44ea97e604 Mon Sep 17 00:00:00 2001 From: Marcin Date: Wed, 22 Jan 2025 14:27:53 +0000 Subject: [PATCH 74/79] 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 75/79] 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 76/79] 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 77/79] 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 78/79] 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 79/79] 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;