diff options
Diffstat (limited to 'src/preview.rs')
| -rw-r--r-- | src/preview.rs | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/src/preview.rs b/src/preview.rs index abd9611..f1d4820 100644 --- a/src/preview.rs +++ b/src/preview.rs @@ -7,9 +7,7 @@ use eframe::{ egui_wgpu::{self, wgpu}, }; -pub struct Custom3d { - angle: f32, -} +pub struct Custom3d; impl Custom3d { pub fn new<'a>(cc: &'a eframe::CreationContext<'a>) -> Option<Self> { @@ -37,7 +35,7 @@ void main() { )); resources.insert(format); - Some(Self { angle: 0.0 }) + Some(Self) } } @@ -62,8 +60,8 @@ void main() { // The paint callback is called after finish prepare and is given access to egui's main render pass, // which can be used to issue draw commands. struct CustomTriangleCallback { - angle: f32, frag_shader: Option<String>, + time: f32, } impl egui_wgpu::CallbackTrait for CustomTriangleCallback { @@ -71,7 +69,7 @@ impl egui_wgpu::CallbackTrait for CustomTriangleCallback { &self, device: &wgpu::Device, queue: &wgpu::Queue, - _screen_descriptor: &egui_wgpu::ScreenDescriptor, + screen: &egui_wgpu::ScreenDescriptor, _egui_encoder: &mut wgpu::CommandEncoder, resources: &mut egui_wgpu::CallbackResources, ) -> Vec<wgpu::CommandBuffer> { @@ -84,7 +82,7 @@ impl egui_wgpu::CallbackTrait for CustomTriangleCallback { let triangle_resources: &mut TriangleRenderResources = resources.get_mut().unwrap(); triangle_resources } - .prepare(device, queue, self.angle); + .prepare(device, queue, screen, self.time); Vec::new() } @@ -102,17 +100,17 @@ impl egui_wgpu::CallbackTrait for CustomTriangleCallback { impl Custom3d { pub fn custom_painting(&mut self, ui: &mut egui::Ui, frag_shader: Option<String>) { - let (rect, response) = - ui.allocate_exact_size(egui::Vec2::splat(300.0), egui::Sense::drag()); + let (rect, _) = ui.allocate_exact_size(egui::Vec2::splat(300.0), egui::Sense::drag()); - self.angle += response.drag_motion().x * 0.01; ui.painter().add(egui_wgpu::Callback::new_paint_callback( rect, CustomTriangleCallback { - angle: self.angle, frag_shader, + time: ui.ctx().input(|i| i.time) as f32, }, )); + + ui.ctx().request_repaint(); } } @@ -132,13 +130,6 @@ impl TriangleRenderResources { label: Some("custom3d"), source: wgpu::ShaderSource::Glsl { shader: "#version 450 -layout(std140, binding = 0) uniform Uniforms { - float angle; - float _pad1; - float _pad2; - float _pad3; -} uniforms; - out vec2 out_uv; const vec2 v_positions[3] = vec2[3]( @@ -156,8 +147,6 @@ const vec4 v_colors[3] = vec4[3]( void main() { vec2 pos = v_positions[gl_VertexIndex]; gl_Position = vec4(pos, 0.0, 1.0); - - gl_Position.x *= cos(uniforms.angle); out_uv = gl_Position.xy / 2.0 + 0.5; }" .into(), @@ -178,7 +167,7 @@ void main() { label: Some("custom3d"), entries: &[wgpu::BindGroupLayoutEntry { binding: 0, - visibility: wgpu::ShaderStages::VERTEX, + visibility: wgpu::ShaderStages::FRAGMENT, ty: wgpu::BindingType::Buffer { ty: wgpu::BufferBindingType::Uniform, has_dynamic_offset: false, @@ -240,12 +229,22 @@ void main() { } } - fn prepare(&mut self, _device: &wgpu::Device, queue: &wgpu::Queue, angle: f32) { - // Update our uniform buffer with the angle from the UI + fn prepare( + &mut self, + _device: &wgpu::Device, + queue: &wgpu::Queue, + screen: &egui_wgpu::ScreenDescriptor, + time: f32, + ) { queue.write_buffer( &self.uniform_buffer, 0, - bytemuck::cast_slice(&[angle, 0.0, 0.0, 0.0]), + bytemuck::cast_slice(&[ + screen.size_in_pixels[0] as f32, + screen.size_in_pixels[1] as f32, + time, + 0.0, + ]), ); } |
