feat(ecs): added a simple prefab system

This commit is contained in:
lisk77 2025-07-14 01:54:53 +02:00
parent fef128f8a7
commit e1597e6fa4
10 changed files with 416 additions and 257 deletions

View 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)
};
}