aboutsummaryrefslogtreecommitdiffstats
path: root/src/preview.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/preview.rs')
-rw-r--r--src/preview.rs47
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,
+ ]),
);
}