1use 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}