|
1 |
| -use instant::Instant; |
2 | 1 | #[cfg(not(target_arch = "wasm32"))]
|
3 | 2 | use rayon::prelude::*;
|
4 | 3 | use std::f64::consts::PI;
|
5 | 4 | use std::num::NonZeroU32;
|
6 |
| -use std::rc::Rc; |
| 5 | +use web_time::Instant; |
7 | 6 | use winit::event::{Event, KeyEvent, WindowEvent};
|
8 | 7 | use winit::event_loop::{ControlFlow, EventLoop};
|
9 | 8 | use winit::keyboard::{Key, NamedKey};
|
10 |
| -use winit::window::WindowBuilder; |
| 9 | + |
| 10 | +include!("./utils/winit_app.rs"); |
11 | 11 |
|
12 | 12 | fn main() {
|
13 | 13 | let event_loop = EventLoop::new().unwrap();
|
14 |
| - let window = Rc::new(WindowBuilder::new().build(&event_loop).unwrap()); |
| 14 | + let start = Instant::now(); |
15 | 15 |
|
16 |
| - #[cfg(target_arch = "wasm32")] |
17 |
| - { |
18 |
| - use winit::platform::web::WindowExtWebSys; |
| 16 | + let app = winit_app::WinitAppBuilder::with_init(|event_loop| { |
| 17 | + let window = winit_app::make_window(event_loop, |w| w); |
19 | 18 |
|
20 |
| - web_sys::window() |
21 |
| - .unwrap() |
22 |
| - .document() |
23 |
| - .unwrap() |
24 |
| - .body() |
25 |
| - .unwrap() |
26 |
| - .append_child(&window.canvas().unwrap()) |
27 |
| - .unwrap(); |
28 |
| - } |
| 19 | + let context = softbuffer::Context::new(window.clone()).unwrap(); |
| 20 | + let surface = softbuffer::Surface::new(&context, window.clone()).unwrap(); |
29 | 21 |
|
30 |
| - let context = softbuffer::Context::new(window.clone()).unwrap(); |
31 |
| - let mut surface = softbuffer::Surface::new(&context, window.clone()).unwrap(); |
| 22 | + let old_size = (0, 0); |
| 23 | + let frames = pre_render_frames(0, 0); |
32 | 24 |
|
33 |
| - let mut old_size = (0, 0); |
34 |
| - let mut frames = pre_render_frames(0, 0); |
| 25 | + (window, surface, old_size, frames) |
| 26 | + }) |
| 27 | + .with_event_handler(move |state, event, elwt| { |
| 28 | + let (window, surface, old_size, frames) = state; |
35 | 29 |
|
36 |
| - let start = Instant::now(); |
37 |
| - event_loop |
38 |
| - .run(move |event, elwt| { |
39 |
| - elwt.set_control_flow(ControlFlow::Poll); |
40 |
| - |
41 |
| - match event { |
42 |
| - Event::WindowEvent { |
43 |
| - window_id, |
44 |
| - event: WindowEvent::RedrawRequested, |
45 |
| - } if window_id == window.id() => { |
46 |
| - if let (Some(width), Some(height)) = { |
47 |
| - let size = window.inner_size(); |
48 |
| - (NonZeroU32::new(size.width), NonZeroU32::new(size.height)) |
49 |
| - } { |
50 |
| - let elapsed = start.elapsed().as_secs_f64() % 1.0; |
51 |
| - |
52 |
| - if (width.get(), height.get()) != old_size { |
53 |
| - old_size = (width.get(), height.get()); |
54 |
| - frames = pre_render_frames(width.get() as usize, height.get() as usize); |
55 |
| - }; |
56 |
| - |
57 |
| - let frame = &frames[((elapsed * 60.0).round() as usize).clamp(0, 59)]; |
58 |
| - |
59 |
| - surface.resize(width, height).unwrap(); |
60 |
| - let mut buffer = surface.buffer_mut().unwrap(); |
61 |
| - buffer.copy_from_slice(frame); |
62 |
| - buffer.present().unwrap(); |
63 |
| - } |
64 |
| - } |
65 |
| - Event::AboutToWait => { |
66 |
| - window.request_redraw(); |
67 |
| - } |
68 |
| - Event::WindowEvent { |
69 |
| - event: |
70 |
| - WindowEvent::CloseRequested |
71 |
| - | WindowEvent::KeyboardInput { |
72 |
| - event: |
73 |
| - KeyEvent { |
74 |
| - logical_key: Key::Named(NamedKey::Escape), |
75 |
| - .. |
76 |
| - }, |
77 |
| - .. |
78 |
| - }, |
79 |
| - window_id, |
80 |
| - } if window_id == window.id() => { |
81 |
| - elwt.exit(); |
| 30 | + elwt.set_control_flow(ControlFlow::Poll); |
| 31 | + |
| 32 | + match event { |
| 33 | + Event::WindowEvent { |
| 34 | + window_id, |
| 35 | + event: WindowEvent::RedrawRequested, |
| 36 | + } if window_id == window.id() => { |
| 37 | + if let (Some(width), Some(height)) = { |
| 38 | + let size = window.inner_size(); |
| 39 | + (NonZeroU32::new(size.width), NonZeroU32::new(size.height)) |
| 40 | + } { |
| 41 | + let elapsed = start.elapsed().as_secs_f64() % 1.0; |
| 42 | + |
| 43 | + if (width.get(), height.get()) != *old_size { |
| 44 | + *old_size = (width.get(), height.get()); |
| 45 | + *frames = pre_render_frames(width.get() as usize, height.get() as usize); |
| 46 | + }; |
| 47 | + |
| 48 | + let frame = &frames[((elapsed * 60.0).round() as usize).clamp(0, 59)]; |
| 49 | + |
| 50 | + surface.resize(width, height).unwrap(); |
| 51 | + let mut buffer = surface.buffer_mut().unwrap(); |
| 52 | + buffer.copy_from_slice(frame); |
| 53 | + buffer.present().unwrap(); |
82 | 54 | }
|
83 |
| - _ => {} |
84 | 55 | }
|
85 |
| - }) |
86 |
| - .unwrap(); |
| 56 | + Event::AboutToWait => { |
| 57 | + window.request_redraw(); |
| 58 | + } |
| 59 | + Event::WindowEvent { |
| 60 | + event: |
| 61 | + WindowEvent::CloseRequested |
| 62 | + | WindowEvent::KeyboardInput { |
| 63 | + event: |
| 64 | + KeyEvent { |
| 65 | + logical_key: Key::Named(NamedKey::Escape), |
| 66 | + .. |
| 67 | + }, |
| 68 | + .. |
| 69 | + }, |
| 70 | + window_id, |
| 71 | + } if window_id == window.id() => { |
| 72 | + elwt.exit(); |
| 73 | + } |
| 74 | + _ => {} |
| 75 | + } |
| 76 | + }); |
| 77 | + |
| 78 | + winit_app::run_app(event_loop, app); |
87 | 79 | }
|
88 | 80 |
|
89 | 81 | fn pre_render_frames(width: usize, height: usize) -> Vec<Vec<u32>> {
|
|
0 commit comments