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
use std::marker::PhantomData;

use shred::SetupHandler;
use specs::{Resources, SystemData, Tracked, WriteStorage};

use super::{Parent, SceneGraph};

#[derive(Debug, Default)]
pub struct SceneGraphSetupHandler<P>(PhantomData<P>);

impl<P> SetupHandler<SceneGraph<P>> for SceneGraphSetupHandler<P>
where
    P: Parent,
    P::Storage: Default + Tracked,
{
    #[inline]
    fn setup(res: &mut Resources) {
        if !res.has_value::<SceneGraph<P>>() {
            let hierarchy = {
                let mut storage: WriteStorage<P> = SystemData::fetch(&res);

                SceneGraph::<P>::new(
                    storage.track_modified(),
                    storage.track_inserted(),
                    storage.track_removed(),
                )
            };

            res.insert(hierarchy);
        }
    }
}