oxygengine_composite_renderer/system/
camera_cache.rs1use 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}