mirror of
https://github.com/lisk77/comet.git
synced 2025-12-12 17:18:50 +00:00
46 lines
1.1 KiB
Rust
46 lines
1.1 KiB
Rust
use comet_structs::FlatMap;
|
|
|
|
pub type PrefabFactory = fn(&mut crate::Scene) -> crate::EntityId;
|
|
|
|
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) -> $crate::EntityId {
|
|
let entity = scene.new_entity();
|
|
$(
|
|
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)
|
|
};
|
|
}
|