1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use super::*;
use crate::nodes::RenderView;
use crate::nodes::VisibilityResult;
use rafx_base::slab::DropSlab;

#[derive(Default)]
pub struct StaticVisibilityNodeSet {
    static_aabb: DropSlab<StaticAabbVisibilityNode>,
}

impl StaticVisibilityNodeSet {
    pub fn register_static_aabb(
        &mut self,
        node: StaticAabbVisibilityNode,
    ) -> StaticAabbVisibilityNodeHandle {
        //TODO: Insert into spatial structure?
        StaticAabbVisibilityNodeHandle(self.static_aabb.allocate(node))
    }

    pub fn calculate_static_visibility(
        &mut self,
        view: &RenderView,
    ) -> VisibilityResult {
        self.static_aabb.process_drops();

        log::trace!("Calculate static visibility for {}", view.debug_name());
        let mut result = VisibilityResult::default();

        for aabb in self.static_aabb.iter_values() {
            log::trace!("push static visibility object {:?}", aabb.handle);
            result.handles.push(aabb.handle);
        }

        //TODO: Could consider sorting lists of handles by type/key to get linear memory access
        result
    }
}