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