swamp_render_wgpu/
plugin.rs1use crate::{Material, Render};
6use limnus_app::prelude::{App, Plugin};
7use limnus_assets::prelude::Assets as LimnusAssets;
8use limnus_clock::Clock;
9use limnus_default_stages::{RenderFirst, RenderPostUpdate};
10use limnus_screen::{Window, WindowMessage};
11use limnus_system_params::{LoRe, Msg, Re, ReM};
12use limnus_wgpu_window::WgpuWindow;
13use monotonic_time_rs::Millis;
14use std::sync::Arc;
15use swamp_font::Font;
16use tracing::debug;
17
18fn tick(mut wgpu_render: ReM<Render>, window_messages: Msg<WindowMessage>) {
19 for msg in window_messages.iter_previous() {
20 if let WindowMessage::Resized(size) = msg {
21 debug!("wgpu_render detected resized to {:?}", size);
22 wgpu_render.resize(*size);
23 }
24 }
25}
26
27pub fn flush_render_tick(
30 script: LoRe<Clock>,
31 wgpu_window: LoRe<WgpuWindow>,
32 mut wgpu_render: ReM<Render>,
33 materials: Re<LimnusAssets<Material>>,
34 fonts: Re<LimnusAssets<Font>>,
35) {
36 let now = script.clock.now();
37
38 wgpu_window
39 .render(wgpu_render.clear_color(), |render_pass| {
40 wgpu_render.render(render_pass, &materials, &fonts, now);
41 })
42 .unwrap();
43}
44pub struct RenderWgpuPlugin;
45
46impl Plugin for RenderWgpuPlugin {
47 fn post_initialization(&self, app: &mut App) {
48 let window = app.local_resources().fetch::<WgpuWindow>();
49 let window_settings = app.resource::<Window>();
50 let wgpu_render = Render::new(
51 Arc::clone(window.device()),
52 Arc::clone(window.queue()),
53 window.texture_format(),
54 window_settings.requested_surface_size,
55 window_settings.minimal_surface_size,
56 Millis::new(0),
57 );
58 app.insert_resource(wgpu_render);
59
60 app.add_system(RenderFirst, tick);
61 app.add_system(RenderPostUpdate, flush_render_tick);
62 }
63}