From 75fa5ce704285bb8bed2efd2de30d623e9905883 Mon Sep 17 00:00:00 2001 From: klemek Date: Sun, 9 Nov 2025 14:59:08 +0100 Subject: [PATCH] feat: isometrc grid --- DEVELOPMENT.md | 5 +++-- default/inc_functions.glsl | 45 ++++++++++++++++++++++++++++++++++++++ default/inc_src.glsl | 41 +++++++++++++++++++++++++++++++--- 3 files changed, 86 insertions(+), 5 deletions(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 934af19..d3bf528 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -87,9 +87,10 @@ make -f Makefile.dev release-arch - [ ] Default project - [x] split with includes - [x] src 9 : sentences repeat h - - [ ] src 11 : isometric grid + - [x] src 10 : isometric grid - [ ] src 12 : pattern in my kitchen - - [ ] src 13 : ? + - [ ] src 13 : cursor with select + - [ ] src 14 : ? - [ ] src 15 : ? - [x] fx 11 : spill - [ ] fx 12 : colorize range (pretty color ranges) diff --git a/default/inc_functions.glsl b/default/inc_functions.glsl index 30f0d46..30db4c4 100644 --- a/default/inc_functions.glsl +++ b/default/inc_functions.glsl @@ -201,6 +201,51 @@ float h_rect(vec2 uv, vec2 c, vec2 size, float k) { return rect(uv, c, size + k * 0.5) - rect(uv, c, size - k * 0.5); } +float line(vec2 uv, vec2 p1, vec2 p2, float thick) { + vec2 p = p2 - p1; + uv -= p1; + vec2 k; + + if (abs(p.y) > abs(p.x)) { + k = vec2( + uv.x - p.x * uv.y / p.y, + uv.y / p.y + ); + + return step(k.x, thick * 0.5) + * step(-k.x, thick * 0.5) + * step(k.y, 1) + * (1 - step(k.y, 0)); + } else { + k = vec2( + uv.x / p.x, + uv.y - p.y * uv.x / p.x + ); + + return step(k.y, thick * 0.5) + * step(-k.y, thick * 0.5) + * step(k.x, 1) + * (1 - step(k.x, 0)); + } +} + +const mat2x2 ISOMETRIC_MATRIX = {{0.5, 1}, {0.5, -1}}; + +vec2 iso(vec2 p) { + return p * ISOMETRIC_MATRIX; +} + +vec2 iso_z(float z) { + return vec2( + -z, + z + ); +} + +vec2 iso(vec3 uv) { + return iso(uv.xy) + iso_z(uv.z); +} + // INPUTS vec4 reframe(sampler2D tex, vec2 uv) diff --git a/default/inc_src.glsl b/default/inc_src.glsl index 220a46c..84e0bff 100644 --- a/default/inc_src.glsl +++ b/default/inc_src.glsl @@ -280,10 +280,9 @@ subroutine(src_stage_sub) vec4 src_9(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 return vec4(f); } -// TODO SRC 10 +// SRC 10 : isometric grid subroutine(src_stage_sub) vec4 src_10(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { - return src_3(vUV, seed, b1, f1, b2, f2, b3, f3); // start vec2 uv0 = vUV.st; @@ -292,9 +291,45 @@ subroutine(src_stage_sub) vec4 src_10(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 // controls + float zoom = 5 + magic(f1, b1, seed + 10) * 15; + float h_scroll = magic(f2, b2, seed + 20); + float max_elevation = magic(f3, b3, seed + 30) * 0.5; + float thick = 0.1; + // logic + + vec2 uv2 = uv1; + + vec2 uv3 = iso(uv2); + + uv3 += vec2(h_scroll, 0); + + uv3 *= round(zoom); + + vec2 umax = vec2(round(zoom), 300); + + vec2 u0 = mod(floor(uv3), umax); + vec2 u1 = mod(floor(uv3 + vec2(1, 0)), umax); + vec2 u2 = mod(floor(uv3 + vec2(0, 1)), umax); + vec2 u3 = mod(floor(uv3 + vec2(-1, 0)), umax); + vec2 u4 = mod(floor(uv3 + vec2(0, -1)), umax); - return texture(iTex0, vUV); + float e0 = (rand(floor(u0)) * 2 - 1) * max_elevation; + float e1 = (rand(floor(u1)) * 2 - 1) * max_elevation; + float e2 = (rand(floor(u2)) * 2 - 1) * max_elevation; + float e3 = (rand(floor(u3)) * 2 - 1) * max_elevation; + float e4 = (rand(floor(u4)) * 2 - 1) * max_elevation; + + uv3 = mod(uv3, 1.0) - 0.5; + + float f = 0; + + f = line(uv3, vec2(0, 0) - iso_z(e0), vec2(1, 0) - iso_z(e1), thick) + + line(uv3, vec2(0, 0) - iso_z(e0), vec2(0, 1) - iso_z(e2), thick) + + line(uv3, vec2(0, 0) - iso_z(e0), vec2(-1, 0) - iso_z(e3), thick) + + line(uv3, vec2(0, 0) - iso_z(e0), vec2(0, -1) - iso_z(e4), thick); + + return vec4(f); } // SRC 11 : video in 2 + thru