shadiertoy 0.1.0

A shadertoy rip-off.
Documentation
#[macro_use]
extern crate shadiertoy;

use shadiertoy::{Window, Game, Shader};
use std::time::Instant;

pipeline!(globals {
    time: Global<f32>,
    resolution: Global<[f32; 2]>,
    color: RenderTarget,
});

struct Basic {
    shader: Shader<globals::Meta>,
    start: Instant,
}

impl Game for Basic {
    fn new(window: &mut Window) -> Self {
        let shader = window.shader(globals::new(), b"
            uniform vec2 resolution;
            uniform float time;

            varying out vec4 color;

            void main() {
                vec2 uv = gl_FragCoord.xy / resolution;
                vec3 col = 0.5 + 0.5 * cos(time + uv.xyx + vec3(0, 2, 4));
                color = vec4(col, 1.0);
            }
        ").unwrap();

        Basic {
            shader,
            start: Instant::now(),
        }
    }

    fn draw(&mut self, window: &mut Window) {
        let time = self.start.elapsed();
        let time = time.as_secs() as f32 + time.subsec_nanos() as f32 * 1e-9;

        let resolution = window.size()
            .map(|(w, h)| [w as f32, h as f32])
            .unwrap_or([0.0; 2]);

        window.draw(&self.shader, |color, _| globals::Data {
            time: &time,
            resolution: &resolution,
            color,
        });
    }
}

pub fn main() { Basic::run() }