[oden] Challenge for step 2

This commit is contained in:
John Doty 2023-06-17 07:36:09 -07:00
parent a03c119b4c
commit f0778f047a

View file

@ -12,8 +12,12 @@ struct State {
config: wgpu::SurfaceConfiguration, config: wgpu::SurfaceConfiguration,
size: winit::dpi::PhysicalSize<u32>, size: winit::dpi::PhysicalSize<u32>,
window: Window, window: Window,
mouse_x: f64,
mouse_y: f64,
} }
// TUTORIAL FOR BABIES LIKE ME: https://sotrh.github.io/learn-wgpu/beginner/tutorial2-surface/
impl State { impl State {
// Creating some of the wgpu types requires async code // Creating some of the wgpu types requires async code
async fn new(window: Window) -> Self { async fn new(window: Window) -> Self {
@ -89,6 +93,8 @@ impl State {
queue, queue,
config, config,
size, size,
mouse_x: 0.0,
mouse_y: 0.0,
} }
} }
@ -123,6 +129,11 @@ impl State {
}); });
{ {
// BEGIN GARBAGE
let r: f64 = (self.mouse_x / f64::from(self.size.width)).clamp(0.0, 1.0) * 0.1;
let g: f64 = (self.mouse_y / f64::from(self.size.height)).clamp(0.0, 1.0) * 0.2;
// END GARBAGE
let _render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { let _render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
label: Some("Render Pass"), label: Some("Render Pass"),
color_attachments: &[Some(wgpu::RenderPassColorAttachment { color_attachments: &[Some(wgpu::RenderPassColorAttachment {
@ -130,8 +141,8 @@ impl State {
resolve_target: None, resolve_target: None,
ops: wgpu::Operations { ops: wgpu::Operations {
load: wgpu::LoadOp::Clear(wgpu::Color { load: wgpu::LoadOp::Clear(wgpu::Color {
r: 0.1, r, //0.1,
g: 0.2, g, //0.2,
b: 0.3, b: 0.3,
a: 1.0, a: 1.0,
}), }),
@ -142,7 +153,7 @@ impl State {
}); });
} }
// submit will accept anything that implements IntoIter // Submit will accept anything that implements IntoIter
self.queue.submit(std::iter::once(encoder.finish())); self.queue.submit(std::iter::once(encoder.finish()));
output.present(); output.present();
@ -157,6 +168,10 @@ pub async fn run() {
let mut state = State::new(window).await; let mut state = State::new(window).await;
// NOTE: There's some well-understood way here of doing constant
// rendering rather than being driven by events but I removed it
// for now. I will have to find it again at some point.
event_loop.run(move |event, _, control_flow| match event { event_loop.run(move |event, _, control_flow| match event {
Event::WindowEvent { Event::WindowEvent {
ref event, ref event,
@ -175,6 +190,12 @@ pub async fn run() {
.. ..
} => *control_flow = ControlFlow::Exit, } => *control_flow = ControlFlow::Exit,
WindowEvent::CursorMoved { position, .. } => {
state.mouse_x = position.x;
state.mouse_y = position.y;
state.window().request_redraw();
}
WindowEvent::Resized(physical_size) => { WindowEvent::Resized(physical_size) => {
state.resize(*physical_size); state.resize(*physical_size);
} }