mirror of
https://github.com/lisk77/comet.git
synced 2025-12-15 18:18:50 +00:00
feat(ecs): added a simple prefab system
This commit is contained in:
parent
fef128f8a7
commit
e1597e6fa4
10 changed files with 416 additions and 257 deletions
46
crates/comet_ecs/src/prefabs.rs
Normal file
46
crates/comet_ecs/src/prefabs.rs
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
use comet_structs::FlatMap;
|
||||
|
||||
pub type PrefabFactory = fn(&mut crate::Scene) -> usize;
|
||||
|
||||
pub(crate) struct PrefabManager {
|
||||
pub(crate) prefabs: FlatMap<String, PrefabFactory>,
|
||||
}
|
||||
|
||||
impl PrefabManager {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
prefabs: FlatMap::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn register(&mut self, name: &str, factory: PrefabFactory) {
|
||||
self.prefabs.insert(name.to_string(), factory);
|
||||
}
|
||||
|
||||
pub fn has_prefab(&self, name: &str) -> bool {
|
||||
self.prefabs.contains(&name.to_string())
|
||||
}
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! register_prefab {
|
||||
($scene:expr, $name:expr, $($component:expr),* $(,)?) => {
|
||||
{
|
||||
fn prefab_factory(scene: &mut $crate::Scene) -> usize {
|
||||
let entity = scene.new_entity() as usize;
|
||||
$(
|
||||
scene.add_component(entity, $component);
|
||||
)*
|
||||
entity
|
||||
}
|
||||
$scene.register_prefab($name, prefab_factory);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! spawn_prefab {
|
||||
($scene:expr, $name:expr) => {
|
||||
$scene.spawn_prefab($name)
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue