basic/
basic.rs

1#[macro_use]
2extern crate shadiertoy;
3
4use shadiertoy::{Window, Game, Shader};
5use std::time::Instant;
6
7pipeline!(globals {
8    time: Global<f32>,
9    resolution: Global<[f32; 2]>,
10    color: RenderTarget,
11});
12
13struct Basic {
14    shader: Shader<globals::Meta>,
15    start: Instant,
16}
17
18impl Game for Basic {
19    fn new(window: &mut Window) -> Self {
20        let shader = window.shader(globals::new(), b"
21            uniform vec2 resolution;
22            uniform float time;
23
24            varying out vec4 color;
25
26            void main() {
27                vec2 uv = gl_FragCoord.xy / resolution;
28                vec3 col = 0.5 + 0.5 * cos(time + uv.xyx + vec3(0, 2, 4));
29                color = vec4(col, 1.0);
30            }
31        ").unwrap();
32
33        Basic {
34            shader,
35            start: Instant::now(),
36        }
37    }
38
39    fn draw(&mut self, window: &mut Window) {
40        let time = self.start.elapsed();
41        let time = time.as_secs() as f32 + time.subsec_nanos() as f32 * 1e-9;
42
43        let resolution = window.size()
44            .map(|(w, h)| [w as f32, h as f32])
45            .unwrap_or([0.0; 2]);
46
47        window.draw(&self.shader, |color, _| globals::Data {
48            time: &time,
49            resolution: &resolution,
50            color,
51        });
52    }
53}
54
55pub fn main() { Basic::run() }