oxygengine_composite_renderer/system/
camera_cache.rs

1use crate::{
2    component::{CompositeCamera, CompositeTransform},
3    composite_renderer::CompositeRenderer,
4    resource::CompositeCameraCache,
5};
6use core::ecs::{Comp, Universe, WorldRef};
7use std::collections::HashMap;
8
9pub type CompositeCameraCacheSystemResources<'a, CR> = (
10    WorldRef,
11    &'a CR,
12    &'a mut CompositeCameraCache,
13    Comp<&'a CompositeCamera>,
14    Comp<&'a CompositeTransform>,
15);
16
17pub fn composite_camera_cache_system<CR>(universe: &mut Universe)
18where
19    CR: CompositeRenderer + 'static,
20{
21    let (world, renderer, mut cache, ..) =
22        universe.query_resources::<CompositeCameraCacheSystemResources<CR>>();
23
24    let view_size = renderer.view_size();
25    cache.last_view_size = view_size;
26    cache.world_transforms = world
27        .query::<(&CompositeCamera, &CompositeTransform)>()
28        .iter()
29        .map(|(entity, (camera, transform))| (entity, camera.view_matrix(transform, view_size)))
30        .collect::<HashMap<_, _>>();
31    cache.world_inverse_transforms = cache
32        .world_transforms
33        .iter()
34        .filter_map(|(k, v)| v.inverse().map(|v| (*k, v)))
35        .collect::<HashMap<_, _>>();
36}