test/
test.rs

1use peter_engine::{
2  eframe, egui,
3  graphics::{BindingDesc, GeometryBuffer, PipelineDesc, RenderData, Vertex, SHADER_PRELUDE},
4  launch, wgpu, PeterEngineApp,
5};
6
7struct AppResources {
8  main_pipeline: wgpu::RenderPipeline,
9  trianges:      GeometryBuffer,
10}
11
12struct TestApp {}
13
14impl PeterEngineApp for TestApp {
15  const WINDOW_TITLE: &'static str = "Test App";
16
17  type RenderResources = AppResources;
18
19  fn get_shader_source() -> String {
20    format!(
21      "{}\n{}",
22      SHADER_PRELUDE,
23      r#"
24        @vertex
25        fn vertex_shader(
26          model: VertexInput,
27        ) -> VertexOutput {
28          var out: VertexOutput;
29          out.color = model.color;
30          out.uv = model.uv;
31          out.clip_position = uniforms.transform_pvm * vec4<f32>(model.position, 1.0);
32          return out;
33        }
34        @fragment
35        fn solid_fragment_shader(in: VertexOutput) -> @location(0) vec4<f32> {
36          return in.color;
37        }
38      "#,
39    )
40  }
41
42  fn init(&mut self, _cc: &eframe::CreationContext, rd: &mut RenderData) -> Self::RenderResources {
43    let main_pipeline = rd.create_pipeline(PipelineDesc {
44      layout: vec![vec![BindingDesc::Uniforms]],
45      vertex_buffers: vec![Vertex::desc()],
46      vertex_shader: "vertex_shader",
47      fragment_shader: "solid_fragment_shader",
48      topology: wgpu::PrimitiveTopology::TriangleList,
49      ..Default::default()
50    });
51    AppResources {
52      main_pipeline,
53      trianges: GeometryBuffer::new("triangles"),
54    }
55  }
56
57  fn update(&mut self, egui_ctx: &egui::Context, frame: &mut eframe::Frame, dt: f32) {
58    // Put an egui window up.
59    egui::Window::new("Hello world").show(egui_ctx, |ui| {
60      ui.label(format!("Hello world! ({:.1} FPS)", 1.0 / dt));
61      if ui.button("Quit").clicked() {
62        frame.close();
63      }
64    });
65  }
66
67  fn prepare(
68    &mut self,
69    _rd: &mut RenderData,
70    resources: &mut Self::RenderResources,
71    device: &wgpu::Device,
72    queue: &wgpu::Queue,
73    _encoder: &mut wgpu::CommandEncoder,
74    _screen_size: (u32, u32),
75  ) -> Vec<wgpu::CommandBuffer> {
76    resources.trianges.clear();
77    resources.trianges.vertex_buffer.extend_from_slice(&[
78      Vertex {
79        position: [0.0, 0.0, 0.0],
80        color:    [1.0, 0.0, 0.0, 1.0],
81        uv:       [0.0, 0.0],
82      },
83      Vertex {
84        position: [1.0, 0.0, 0.0],
85        color:    [0.0, 1.0, 0.0, 1.0],
86        uv:       [0.0, 0.0],
87      },
88      Vertex {
89        position: [0.0, 1.0, 0.0],
90        color:    [0.0, 0.0, 1.0, 1.0],
91        uv:       [0.0, 0.0],
92      },
93    ]);
94    resources.trianges.index_buffer.extend_from_slice(&[0, 1, 2]);
95    resources.trianges.update(device, queue);
96    Vec::new()
97  }
98
99  fn paint<'rp>(
100    &mut self,
101    rd: &'rp RenderData,
102    resources: &'rp Self::RenderResources,
103    _info: eframe::epaint::PaintCallbackInfo,
104    render_pass: &mut wgpu::RenderPass<'rp>,
105  ) {
106    render_pass.set_pipeline(&resources.main_pipeline);
107    render_pass.set_bind_group(0, &rd.main_uniforms.bind_group, &[]);
108    render_pass.set_vertex_buffer(0, resources.trianges.vertex_buffer.get_slice().unwrap());
109    render_pass.set_index_buffer(
110      resources.trianges.index_buffer.get_slice().unwrap(),
111      wgpu::IndexFormat::Uint32,
112    );
113    render_pass.draw_indexed(0..resources.trianges.index_buffer.len() as u32, 0, 0..1);
114  }
115}
116
117fn main() {
118  launch(TestApp {}).unwrap();
119}