๐Ÿ“ฆ tychedelia / sepiascraped

๐Ÿ“„ mod.rs ยท 61 lines
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)
        }
    }
}