use bevy::prelude::*;
use crate::attributes::Attributes;
use crate::derived::{AttributeRegistration, AttributeDerivedSet, InitFromSet, WriteBackSet};
use crate::graph::DependencyGraph;
use crate::modifier_set::apply_initial_attributes;
use crate::attribute_id::Interner;
use crate::tags::{TagResolver, TagRegistration};
pub struct AttributesPlugin;
impl Plugin for AttributesPlugin {
fn build(&self, app: &mut App) {
Interner::new().set_global();
let mut tag_resolver = TagResolver::new();
for reg in inventory::iter::<TagRegistration> {
(reg.register_fn)(&mut tag_resolver);
}
app.init_resource::<DependencyGraph>()
.insert_resource(tag_resolver);
app.add_observer(on_attributes_removed)
.add_observer(apply_initial_attributes)
.configure_sets(
PreUpdate,
(WriteBackSet, AttributeDerivedSet, InitFromSet).chain(),
)
.configure_sets(
PostUpdate,
(WriteBackSet, AttributeDerivedSet).chain(),
);
for reg in inventory::iter::<AttributeRegistration> {
(reg.register_fn)(app);
}
}
}
fn on_attributes_removed(
trigger: On<Remove, Attributes>,
mut graph: ResMut<DependencyGraph>,
) {
let entity = trigger.entity;
graph.remove_entity(entity);
}