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
This commit is contained in:
Marcin
2025-01-18 20:05:08 +00:00
parent f32f18a373
commit fa7bc07ae9

View File

@@ -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<T>(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 */