diff --git a/project/inc_src.glsl b/project/inc_src.glsl index 8b7f0a4..567b500 100644 --- a/project/inc_src.glsl +++ b/project/inc_src.glsl @@ -93,6 +93,48 @@ vec4 src_dots(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, v } +vec4 src_waves(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.); + + // controls + + float spacing = magic(f1, b1, seed + 10); + float thickness = magic(f2, b2, seed + 20); + float scroll = magic_reverse(f3, b3, seed + 30); + + // logic + + vec2 uv2 = uv1; + uv2.y += 0.5; + uv2 *= 2.25; + uv2 = vec2((uv2.x + 1) * 0.5, -uv2.y); + float m1 = spacing * 4.5 + 0.5; + float y = log(-uv2.y) * m1; + y = mod(y + scroll * 5.0 - iBeats / 16, 5.); + float id = floor(y) * 32; + float s = cos(uv2.x * rand(id + 837) * 100 + rand(id + 281) * PI) + + cos(uv2.x * rand(id + 231) * 100 + rand(id + 526) * PI) + + cos(uv2.x * rand(id + 746) * 100 + rand(id + 621) * PI) + + cos(uv2.x * rand(id + 235) * 100 + rand(id + 315) * PI) + + cos(uv2.x * rand(id + 782) * 100 + rand(id + 314) * PI) + + cos(uv2.x * rand(id + 241) * 100 + rand(id + 734) * PI) + + cos(uv2.x * rand(id + 416) * 100 + rand(id + 425) * PI) + + cos(uv2.x * rand(id + 315) * 100 + rand(id + 525) * PI) + + cos(uv2.x * rand(id + 423) * 100 + rand(id + 743) * PI) + + cos(uv2.x * rand(id + 637) * 100 + rand(id + 245) * PI); + s *= 0.1; + float cut = 0.025 + thickness * 0.475; + float y2 = min(1.0, -(uv2.y)); + float f = (0.1 + 0.9 * (cos((y2 + 1.0) * PI) * 0.5 + 0.5)) * istep(0, uv2.y) * istep(cut, fract(y + (s - 1) * (1 - cut) * 0.5)); + + return vec4(f); +} + vec4 src_bacteria(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { // start @@ -120,6 +162,35 @@ vec4 src_bacteria(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b return vec4(f); } +vec4 src_noise_voronoi(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.); + + // controls + + float zoom = magic(f1, b1, seed + 10.); + float voronoi_distort = magic(f2, b2, seed + 20.); + float details = magic(f3, b3, seed + 30.); + float noise_factor = magic(seed + 40.); + + // logic + + vec2 uv2 = uv1; + uv2 *= zoom * 20. + 3.; + uv2.x += iBeats; + vec4 data = voronoi(uv2, voronoi_distort, seed + 50, iBeats); + float f = data.x / (data.x + data.y); + f = sin(f * PI * (details * 20.)) * .5 + 1.; + int nf = int(noise_factor * 6.); + f *= mix(1., noise_f(uv2, nf - 1), step(.0, float(nf))); + + return vec4(f); +} + vec4 src_perlin(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { // start @@ -370,6 +441,137 @@ vec4 src_scroller(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b return vec4(f); } +vec4 src_circuit(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.); + + // controls + + float z = 10. + magic(f1, b1, 123.) * 20.; + float h = magic(f2, b2, seed + 20.) * .8 + .1; + float v = magic_reverse(f3, b3, seed + 30.) * .8 + .1; + + // logic + + uv1 *= z; + uv1 += iBeats; + + float s0 = rand(floor(mod(uv1, 1000.))) * 1000.; + float s1 = rand(floor(mod(uv1 + vec2(0., 1.), 1000.))) * 1000.; + float s2 = rand(floor(mod(uv1 - vec2(1., 0.), 1000.))) * 1000.; + + bool up = rand(s1 + 1.) < h; + bool left = rand(s2 + 2.) < v; + bool down = rand(s0 + 1.) < h; + bool right = rand(s0 + 2.) < v; + bool up_down = up && down; + bool left_right = left && right; + + uv1 = mod(uv1, 1.) - .5; + + const float t = .1; + + float f = 0.; + int c = 0; + + if (up) { + f += stripe(uv1.x, -t * .5, t * .5) * step(-t * .5, uv1.y); + c += 1; + } + + if (down) { + f += stripe(uv1.x, -t * .5, t * .5) * istep(t * .5, uv1.y); + c += 1; + } + + if (left) { + f += stripe(uv1.y, -t * .5, t * .5) * istep(t * .5, uv1.x); + c += 1; + } + + if (right) { + f += stripe(uv1.y, -t * .5, t * .5) * step(-t * .5, uv1.x); + c += 1; + } + + if (c == 1) { + f += istep(t, length(uv1)); + } + + f = min(f, 1.); + + if ((up_down ^^ left_right) && c == 2) { + if (up_down) { + uv1.xy = uv1.yx; + } + if (rand(s0 + 3.) < .5) { + uv1.x = -uv1.x; + } + float k = rand(s0 + 4.) * 60; + f -= rect(uv1, vec2(0.), vec2(t * 3., t)); + f = max(0., f); + if (k < 10.) { // resistor + f += line(uv1, vec2(-t * 3.25, -t * .5), vec2(-t * 2.5, t * 2.), t * .75); + f += line(uv1, vec2(-t * 2.5, t * 2.), vec2(-t * 1.5, -t * 2.), t * .75); + f += line(uv1, vec2(-t * 1.5, -t * 2.), vec2(-t * .5, t * 2.), t * .75); + f += line(uv1, vec2(-t * .5, t * 2.), vec2(t * .5, -t * 2.), t * .75); + f += line(uv1, vec2(t * .5, -t * 2.), vec2(t * 1.5, t * 2.), t * .75); + f += line(uv1, vec2(t * 1.5, t * 2.), vec2(t * 2.5, -t * 2.), t * .75); + f += line(uv1, vec2(t * 2.5, -t * 2.), vec2(t * 3.25, t * .5), t * .75); + } else if (k < 20.) { // capacitor + f += rect(uv1, vec2(-t * 2., 0.), vec2(t, t * .5)); + f += rect(uv1, vec2(t * 2., 0.), vec2(t, t * .5)); + f += rect(uv1, vec2(t, 0.), vec2(t * .5, t * 3.5)); + f += rect(uv1, vec2(-t, 0.), vec2(t * .5, t * 3.5)); + } else if (k < 30.) { // diode + f += line(uv1, vec2(-t * 2., t * 2.5), vec2(t * 2., 0.), t); + f += line(uv1, vec2(-t * 2., -t * 2.5), vec2(t * 2., 0.), t); + f += rect(uv1, vec2(t * 2.5, 0.), vec2(t * .5, t * 3.)); + f += rect(uv1, vec2(-t * 2.5, 0.), vec2(t * .5, t * 3.)); + } else if (k < 40.) { // lamp + f += istep(t * 3.5, length(uv1)); + f -= istep(t * 2.5, length(uv1)); + f += line(uv1, vec2(-t * 2.), vec2(t * 2.), t); + f += line(uv1, vec2(-t * 2., t * 2.), vec2(t * 2., -t * 2.), t); + } else if (k < 50.) { // inductor + f += istep(t * 2., length(uv1 - vec2(t * 2.5, 0.))); + f += istep(t * 2., length(uv1 - vec2(0., 0.))); + f += istep(t * 2., length(uv1 - vec2(-t * 2.5, 0.))); + f -= 2. * istep(t, length(uv1 - vec2(t * 2.5, 0.))); + f -= 2. * istep(t, length(uv1 - vec2(0., 0.))); + f -= 2. * istep(t, length(uv1 - vec2(-t * 2.5, 0.))); + f *= step(-t * .5, uv1.y); + } else if (k < 60.) { // switch + f += istep(t, length(uv1 - vec2(t * 2.5, 0.))); + f += istep(t, length(uv1 + vec2(t * 2.5, 0.))); + f += line(uv1, vec2(t * 2., 0.), vec2(-t * 2.5, t * (k < 55. ? 3. : 1.)), t); + } + } else if (c == 3) { + if (left_right) { + uv1.xy = uv1.yx; + if (up) { + uv1.x = -uv1.x; + } + } else if (right) { + uv1.x = -uv1.x; + } + float k = rand(s0 + 4.) * 20.; + if (k < 10.) { + f -= rect(uv1, vec2(0.), vec2(t * 3.)); + f = max(0., f); + f += rect(uv1, vec2(-t * 3., 0.), vec2(t * .5, t * 3.)); + f += line(uv1, vec2(t * .25, t * 3.25), vec2(-t * 3., t), t); + f += line(uv1, vec2(t * .25, -t * 3.25), vec2(-t * 3., -t), t); + } + } + + return vec4(f); +} + vec4 src_isometric_grid(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { // start @@ -494,6 +696,51 @@ vec4 src_credenza(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b return vec4(f); } +vec4 src_cursor(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.); + + // controls + + float size = magic(f1, b1, seed + 10.) * 2. + .1; + float dx = (fmagic(f2, b2, seed + 20.) * (1. - size * .06) - .5) * ratio; + bool flip_x = magic_trigger(b2, seed + 20.); + float dy = fmagic(f3, b3, seed + 30.) * (1. - size * .17) - .5; + bool flip_y = magic_trigger(b3, seed + 30.); + + // logic + + vec2 uv2 = uv1; + + if (flip_x) { + uv2.x = -uv2.x; + } + + if (flip_y) { + uv2.y = -uv2.y; + } + + uv2 -= vec2(dx, -dy); + + uv2 /= size; + + uv2 *= -rot(-PI * 0.5); + + float f = istep(0., (uv2.x * 2. + uv2.y) * (uv2.x * 2. - uv2.y)) * istep(0., uv2.y); + + uv2.y += .1; + + f -= istep(0., (uv2.x + uv2.y * 3.) * (uv2.x - uv2.y * 3.)) * istep(0., uv2.y); + + f += rect(uv2, vec2(0., -.04), vec2(.01, .04)); + + return vec4(f); +} + vec4 src_fire(vec2 vUV, sampler2D self, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { // start