diff --git a/forge-steel b/forge-steel index 1c6cadd..ba13569 160000 --- a/forge-steel +++ b/forge-steel @@ -1 +1 @@ -Subproject commit 1c6cadd4c6310a714bdac90a10caf776c47b3a4f +Subproject commit ba13569696bc82ecadc3a5a5da99e9b1f09c09c2 diff --git a/project/inc_src.glsl b/project/inc_src.glsl index 7791eb3..1ccd8b6 100644 --- a/project/inc_src.glsl +++ b/project/inc_src.glsl @@ -299,11 +299,51 @@ vec4 src_9(vec2 vUV, sampler2D self, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f return vec4(f); } -// SRC 10 : +const int dungeon_characters[] = int[11]( + 0x09, 0x0A, 0x19, 0x1A, 0x1B, 0x0C, 0x21, 0x22, 0x23, 0x08, 0x0B +); + +// SRC 10 : SCROLLER vec4 src_10(vec2 vUV, sampler2D self, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { - // TODO - return src_1(vUV, self, seed, b1, f1, b2, f2, b3, f3); + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - 0.5) * vec2(ratio, 1.); + + // controls + + float zoom = magic(f1, b1, seed + 10.) * 5. + 5.; + float slope = magic(f2, b2, seed + 20.); + float character = magic(f3, b3, seed + 30.) * 10; + + // logic + + float chances = 0.7; + + vec2 uv2 = uv1 * zoom; + + uv2 *= rot(slope); + + vec2 iuv2 = ivec2(uv2); + vec2 uv3 = uv2 + vec2(iBeats * 4., 0); + vec2 iuv3 = ivec2(uv3); + + int code = 0xA9; + bool bridge = mod(iuv3.x, 40) > 30.; + + if (iuv3.y < -1) { + code = bridge ? 0xA9 : 0x9F; + } else if (iuv3.y == -1) { + code = bridge ? 0x9A : 0xA0; + } + + float f = dungeon(fract(uv3), code) ? 1. : 0.; + + f += dungeon_at(uv2, vec2(-0.5, -1 + abs(sin(iBeats * 5.))), dungeon_characters[int(character)]); + + return vec4(f); } // SRC 11 : isometric grid