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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61use bevy::prelude::*;
use bevy::render::camera::CameraOutputMode;
use bevy::utils::AHasher;
use std::hash::{BuildHasherDefault, Hash, Hasher};
use crate::engine::op::texture::TextureOp;
use crate::engine::param::Params;
use crate::engine::graph::update_graph;
use crate::Sets;
use crate::engine::graph::GraphState;
use crate::engine::op::OpName;
pub struct RenderPlugin;
impl Plugin for RenderPlugin {
fn build(&self, app: &mut App) {
app.add_systems(Update, (order_cameras).in_set(Sets::Params));
}
}
// fn params_hash(mut params_hash: ResMut<ParamsHash>, mut query: Query<(Entity, &mut Camera), With<OpName>>, params: Params) {
// for (entity, mut camera) in query.iter_mut() {
// let mut params = params.get_all(entity.clone());
// let prev_hash = params_hash.hashes.get(&entity);
// let mut hasher = AHasher::default();
// params.hash(&mut hasher);
// let new_hash = hasher.finish();
// if let None = prev_hash {
// params_hash.hashes.insert(entity, new_hash);
// camera.output_mode = CameraOutputMode::default();
// } else if let Some(prev_hash) = prev_hash {
// if *prev_hash != new_hash {
// params_hash.hashes.insert(entity, new_hash);
// camera.output_mode = CameraOutputMode::default();
// } else {
// camera.output_mode = CameraOutputMode::Skip;
// }
// }
// }
// }
fn order_cameras(graph: Res<GraphState>, mut cameras: Query<&mut Camera>) {
let sorted = petgraph::algo::toposort(&graph.graph, None);
match sorted {
Ok(sorted) => {
for (i, index) in sorted.iter().enumerate() {
let entity = graph
.entity_map
.get(index)
.expect(format!("Failed to get entity for index {:?}", index).as_str());
if let Ok(mut camera) = cameras.get_mut(*entity) {
camera.order = i as isize;
}
}
}
Err(e) => {
error!("Failed to sort cameras: {:?}", e)
}
}
}