‹ pakt28

pakt29

See /software/p5js/pakt-februari/pakt29/ for a JavaScript version and /software/supercollider/februari-pakt/pakt29/ for accompanying sound code.

use nannou::prelude::*;
use nannou::lyon::tessellation::LineCap;

fn main() {
    nannou::sketch(view).size(640, 480).run();
}

fn view(app: &App, frame: Frame) {
    let draw = app.draw();
    let win = app.window_rect();
    
    let cols = 20.0;
    let rows = 20.0;
    let index = app.time * 60.0;
    
    draw.background().color(BLACK);
    
    let oy = 0.025 * win.h();
    for x in 0..cols as u16 {
        let x = x as f32;
        let t = x / cols;
        let xx = t * win.w() + (0.5 / cols * win.w());
        let col = hsv(
            ((t * PI).sin() * 0.25 + (index * 0.0004 + (x * 0.02))) % 1.0,
            (t * PI).sin() * 0.4 + 0.4,
            (t * PI).sin() * 0.4 + 0.4,
        );
        let mut dashes = Vec::new();
        for y in 0..rows as u16 {
            let d = ((index + y as f32) * (((index * 0.1 + (x * 0.35)) * 0.01).sin() * 0.015).sin()).sin() * 10.0 + (((index + x) * 0.003).sin() * 40.0 + 70.0);
            dashes.push(d);
        }
        
        let off = index % (dashes[0] + dashes[1]);
        let mut yy = win.h() - oy;
        let mut i = 0 as usize;
        while yy > (win.h() * -0.5) {
            let d = dashes[i % rows as usize];
            if i % 2 == 0 {
                let start = (yy + off).max(oy).min(win.h() - oy);
                let end = (yy - d + off).max(oy).min(win.h() - oy);
                draw.scale_axes(vec3(1.0, -1.0, 1.0)).translate(vec3(win.w(), win.h(), 0.0) * -0.5)
                .line().points(pt2(xx, start), pt2(xx, end)).color(col).weight(20.0).caps(LineCap::Round);
            }
            yy -= d;
            i += 1;
        }
    }
    
    draw.to_frame(app, &frame).unwrap();
}