mireforge_render_wgpu/
plugin.rs

1/*
2 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/mireforge/mireforge
3 * Licensed under the MIT License. See LICENSE in the project root for license information.
4 */
5use crate::{Render, Texture};
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 mireforge_font::Font;
14use monotonic_time_rs::Millis;
15use std::sync::Arc;
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
27/// # Panics
28///
29pub 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    textures: Re<LimnusAssets<Texture>>,
35    fonts: Re<LimnusAssets<Font>>,
36) {
37    let now = script.clock.now();
38
39    wgpu_window
40        .render(|encoder, texture_view| {
41            wgpu_render.render(encoder, texture_view, &textures, &fonts, now);
42        })
43        .unwrap();
44}
45pub struct RenderWgpuPlugin;
46
47impl Plugin for RenderWgpuPlugin {
48    fn post_initialization(&self, app: &mut App) {
49        let window = app.local_resources().fetch::<WgpuWindow>();
50        let window_settings = app.resource::<Window>();
51        let wgpu_render = Render::new(
52            Arc::clone(window.device()),
53            Arc::clone(window.queue()),
54            window.texture_format(),
55            window_settings.requested_surface_size,
56            window_settings.minimal_surface_size,
57            Millis::new(0),
58        );
59
60        app.insert_resource(wgpu_render);
61
62        app.add_system(RenderFirst, tick);
63        app.add_system(RenderPostUpdate, flush_render_tick);
64    }
65}