Initial implementation for systems
This commit is contained in:
parent
f1e31886a3
commit
7776690446
|
@ -27,16 +27,6 @@ pub struct Entity {
|
||||||
generation: u32,
|
generation: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Stores and manages a collection of entities.
|
|
||||||
pub struct Manager {
|
|
||||||
num_components: usize,
|
|
||||||
entities: Vec<(Option<BSet>, u32)>,
|
|
||||||
free_entities: Vec<usize>,
|
|
||||||
components: Vec<Option<ComponentMem>>,
|
|
||||||
|
|
||||||
component_ids: RefCell<HashMap<TypeId, usize>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Used to access compoents on an entity in an efficient
|
/// Used to access compoents on an entity in an efficient
|
||||||
/// way.
|
/// way.
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
|
@ -68,6 +58,25 @@ impl Filter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A system processes entities
|
||||||
|
pub trait System {
|
||||||
|
fn update(&mut self, m: &mut Manager);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Stores and manages a collection of entities.
|
||||||
|
pub struct Manager {
|
||||||
|
num_components: usize,
|
||||||
|
entities: Vec<(Option<BSet>, u32)>,
|
||||||
|
free_entities: Vec<usize>,
|
||||||
|
components: Vec<Option<ComponentMem>>,
|
||||||
|
|
||||||
|
component_ids: RefCell<HashMap<TypeId, usize>>,
|
||||||
|
|
||||||
|
systems: Vec<Box<System>>,
|
||||||
|
render_systems: Vec<Box<System>>,
|
||||||
|
}
|
||||||
|
|
||||||
impl Manager {
|
impl Manager {
|
||||||
/// Creates a new manager.
|
/// Creates a new manager.
|
||||||
pub fn new() -> Manager {
|
pub fn new() -> Manager {
|
||||||
|
@ -78,6 +87,8 @@ impl Manager {
|
||||||
components: vec![],
|
components: vec![],
|
||||||
|
|
||||||
component_ids: RefCell::new(HashMap::new()),
|
component_ids: RefCell::new(HashMap::new()),
|
||||||
|
systems: vec![],
|
||||||
|
render_systems: vec![],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,6 +100,34 @@ impl Manager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Adds a system which will be called every tick
|
||||||
|
pub fn add_system<S: System + 'static>(&mut self, s: S) {
|
||||||
|
self.systems.push(Box::new(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Adds a system which will be called every frame
|
||||||
|
pub fn add_render_system<S: System + 'static>(&mut self, s: S) {
|
||||||
|
self.render_systems.push(Box::new(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Ticks all tick systems
|
||||||
|
pub fn tick(&mut self) {
|
||||||
|
let mut systems = mem::replace(&mut self.systems, vec![]);
|
||||||
|
for sys in &mut systems {
|
||||||
|
sys.update(self);
|
||||||
|
}
|
||||||
|
mem::replace(&mut self.systems, systems);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Ticks all render systems
|
||||||
|
pub fn render_tick(&mut self) {
|
||||||
|
let mut systems = mem::replace(&mut self.render_systems, vec![]);
|
||||||
|
for sys in &mut systems {
|
||||||
|
sys.update(self);
|
||||||
|
}
|
||||||
|
mem::replace(&mut self.render_systems, systems);
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns all entities matching the filter
|
/// Returns all entities matching the filter
|
||||||
pub fn find(&self, filter: &Filter) -> Vec<Entity> {
|
pub fn find(&self, filter: &Filter) -> Vec<Entity> {
|
||||||
let mut ret = vec![];
|
let mut ret = vec![];
|
||||||
|
|
Loading…
Reference in New Issue