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() }