syrillian_render 0.7.1

Renderer of the Syrillian Game Engine
Documentation
use crate::cache::AssetCache;
use crate::rendering::RenderPassType;
use crate::rendering::state::State;
use crate::rendering::viewport::RenderViewport;
use crate::strobe::{StrobeRenderer, UiGPUContext};
use parking_lot::RwLock;
use wgpu::{
    CommandEncoder, LoadOp, Operations, RenderPass, RenderPassColorAttachment,
    RenderPassDescriptor, StoreOp, TextureView,
};

#[derive(Default)]
pub struct UiRenderPass;

impl UiRenderPass {
    pub fn begin_pass<'a>(
        output: &'a TextureView,
        encoder: &'a mut CommandEncoder,
    ) -> RenderPass<'a> {
        encoder.begin_render_pass(&RenderPassDescriptor {
            label: Some("UI Render Pass"),
            color_attachments: &[Some(RenderPassColorAttachment {
                view: output,
                depth_slice: None,
                resolve_target: None,
                ops: Operations {
                    load: LoadOp::Load,
                    store: StoreOp::Store,
                },
            })],
            depth_stencil_attachment: None,
            ..RenderPassDescriptor::default()
        })
    }

    pub fn render(
        encoder: &mut CommandEncoder,
        strobe: &mut StrobeRenderer,
        output: &TextureView,
        viewport: &RenderViewport,
        cache: &AssetCache,
        state: &State,
    ) {
        let has_ui_draws_queued = strobe.has_draws(viewport.id);
        if has_ui_draws_queued {
            let pass = Self::begin_pass(output, encoder);

            let draw_ctx = UiGPUContext {
                pass: RwLock::new(pass),
                pass_type: RenderPassType::Color2D,
                render_bind_group: viewport.render_data.uniform.bind_group(),
            };

            strobe.render(&draw_ctx, cache, state, viewport);
        }
    }
}