1use std::f32::consts::PI;
2
3use bottomless_pit::colour::Colour;
4use bottomless_pit::engine_handle::{Engine, EngineBuilder};
5use bottomless_pit::material::{Material, MaterialBuilder};
6use bottomless_pit::render::RenderHandle;
7use bottomless_pit::resource::LoadingOp;
8use bottomless_pit::shader::UniformData;
9use bottomless_pit::shader::{Shader, ShaderOptions};
10use bottomless_pit::vec2;
11use bottomless_pit::vectors::Vec2;
12use bottomless_pit::Game;
13
14use encase::ShaderType;
15
16fn main() {
17 let mut engine = EngineBuilder::new()
18 .with_resolution((500, 500))
19 .remove_vsync()
20 .build()
21 .unwrap();
22
23 let data = Time {
24 time: 0.0,
25 _pading: 0.0,
26 _padding2: 0.0,
27 _padding4: 0.0,
28 };
29
30 let uniform_data = UniformData::new(&data);
31
32 let mouse_shader = Shader::new(
33 "examples/sinewaves.wgsl",
34 ShaderOptions::with_uniform_data(&uniform_data),
35 &mut engine,
36 LoadingOp::Blocking,
37 );
38
39 let regular_material = MaterialBuilder::new()
40 .set_shader(mouse_shader)
41 .build(&mut engine);
42
43 let pos = Position {
44 regular_material,
45 time: data,
46 };
47
48 engine.run(pos);
49}
50
51#[derive(ShaderType)]
52struct Time {
53 time: f32,
54 _pading: f32,
55 _padding2: f32,
56 _padding4: f32,
57}
58
59struct Position {
60 regular_material: Material<Time>,
61 time: Time,
62}
63
64impl Game for Position {
65 fn render<'o>(&'o mut self, mut render: RenderHandle<'o>) {
66 let mut render_handle = render.begin_pass(Colour::BLACK);
67
68 self.regular_material.add_regular_n_gon(
69 120,
70 200.0,
71 vec2! { 250.0 },
72 Colour::BLUE,
73 &render_handle,
74 );
75
76 self.regular_material.draw(&mut render_handle);
77 }
78
79 fn update(&mut self, engine_handle: &mut Engine) {
80 let dt = engine_handle.get_frame_delta_time();
81 self.time.time = (self.time.time + dt) % (32.0 * PI);
82 self.regular_material
83 .update_uniform_data(&self.time, &engine_handle)
84 .unwrap();
85 }
86}