sketch_2d/
queue.rs

1/*
2 * Created on Thu Jul 06 2023
3 *
4 * Copyright (c) storycraft. Licensed under the MIT Licence.
5 */
6
7use unsized_stack::UnsizedStack;
8use wgpu::RenderPass;
9
10use crate::{context::RenderContext, node::RenderNode};
11
12#[derive(Default)]
13pub struct RenderNodeQueue {
14    opaque: UnsizedStack<dyn RenderNode>,
15    transparent: UnsizedStack<dyn RenderNode>,
16}
17
18impl RenderNodeQueue {
19    pub const fn new() -> Self {
20        Self {
21            opaque: UnsizedStack::new(),
22            transparent: UnsizedStack::new(),
23        }
24    }
25
26    pub fn push_opaque(&mut self, component: impl RenderNode + 'static) {
27        self.opaque.push(component, |item| item);
28    }
29
30    pub fn push_transparent(&mut self, component: impl RenderNode + 'static) {
31        self.transparent.push(component, |item| item);
32    }
33
34    pub fn len(&self) -> usize {
35        self.opaque.len() + self.transparent.len()
36    }
37
38    pub fn opaque_len(&self) -> usize {
39        self.opaque.len()
40    }
41
42    pub fn transparent_len(&self) -> usize {
43        self.transparent.len()
44    }
45
46    pub fn is_empty(&self) -> bool {
47        self.opaque.is_empty() && self.transparent.is_empty()
48    }
49
50    pub fn render<'rpass>(
51        &'rpass self,
52        ctx: &RenderContext<'rpass>,
53        pass: &mut RenderPass<'rpass>,
54    ) {
55        for component in self.opaque.iter().rev() {
56            component.render_transparent(ctx, pass);
57        }
58
59        for component in self.transparent.iter() {
60            component.render_transparent(ctx, pass);
61        }
62    }
63
64    pub fn clear(&mut self) {
65        self.opaque.clear();
66        self.transparent.clear();
67    }
68}