use crate::site::{AssetSource, IsStatic, ModelProperty, Scale};
use bevy::{
ecs::{component::ComponentId, system::EntityCommands},
prelude::*,
};
use std::collections::HashMap;
pub type InsertModelPropertyFn = fn(EntityCommands);
pub fn get_insert_model_property_fn<T: Component + Default>() -> InsertModelPropertyFn {
|mut e_commands| {
e_commands.insert(T::default());
}
}
pub type RemoveModelPropertyFn = fn(EntityCommands);
pub fn get_remove_model_property_fn<T: Component + Default>() -> RemoveModelPropertyFn {
|mut e_commands| {
e_commands.remove::<T>();
}
}
#[derive(Resource)]
pub struct ModelPropertyData {
pub required: HashMap<ComponentId, (String, InsertModelPropertyFn, RemoveModelPropertyFn)>,
pub optional: HashMap<ComponentId, (String, InsertModelPropertyFn, RemoveModelPropertyFn)>,
}
impl FromWorld for ModelPropertyData {
fn from_world(world: &mut World) -> Self {
let mut required = HashMap::new();
world.register_component::<ModelProperty<AssetSource>>();
required.insert(
world
.components()
.component_id::<ModelProperty<AssetSource>>()
.unwrap(),
(
"Asset Source".to_string(),
get_insert_model_property_fn::<ModelProperty<AssetSource>>(),
get_remove_model_property_fn::<ModelProperty<AssetSource>>(),
),
);
world.register_component::<ModelProperty<Scale>>();
required.insert(
world
.components()
.component_id::<ModelProperty<Scale>>()
.unwrap(),
(
"Scale".to_string(),
get_insert_model_property_fn::<ModelProperty<Scale>>(),
get_remove_model_property_fn::<ModelProperty<Scale>>(),
),
);
world.register_component::<ModelProperty<IsStatic>>();
required.insert(
world
.components()
.component_id::<ModelProperty<IsStatic>>()
.unwrap(),
(
"Is Static".to_string(),
get_insert_model_property_fn::<IsStatic>(),
get_remove_model_property_fn::<IsStatic>(),
),
);
let optional = HashMap::new();
Self { required, optional }
}
}