use std::collections::HashMap; use crate::components::dissolve::DissolveComponent; use crate::components::follow::FollowComponent; use crate::components::jump::JumpComponent; use crate::components::lights::spot::SpotlightComponent; use crate::components::{ CameraComponent, InputComponent, MeshComponent, MovementComponent, PhysicsComponent, RotateComponent, }; use crate::entity::{EntityHandle, EntityManager}; use crate::state::StateMachine; pub use crate::utility::transform::Transform; pub struct Storage { pub components: HashMap, } impl Storage { pub fn new() -> Self { Self { components: HashMap::new(), } } pub fn insert(&mut self, entity: EntityHandle, component: T) { self.components.insert(entity, component); } pub fn get(&self, entity: EntityHandle) -> Option<&T> { self.components.get(&entity) } pub fn get_mut(&mut self, entity: EntityHandle) -> Option<&mut T> { self.components.get_mut(&entity) } pub fn with(&self, entity: EntityHandle, f: F) -> Option where F: FnOnce(&T) -> R, { self.components.get(&entity).map(f) } pub fn with_mut(&mut self, entity: EntityHandle, f: F) -> Option where F: FnOnce(&mut T) -> R, { self.components.get_mut(&entity).map(f) } pub fn remove(&mut self, entity: EntityHandle) { self.components.remove(&entity); } pub fn all(&self) -> Vec { self.components.keys().copied().collect() } } pub struct World { pub entities: EntityManager, pub transforms: Storage, pub meshes: Storage, pub physics: Storage, pub movements: Storage, pub jumps: Storage, pub inputs: Storage, pub player_tags: Storage<()>, pub state_machines: Storage, pub cameras: Storage, pub spotlights: Storage, pub tree_tags: Storage<()>, pub dissolves: Storage, pub follows: Storage, pub rotates: Storage, } impl World { pub fn new() -> Self { Self { entities: EntityManager::new(), transforms: Storage::new(), meshes: Storage::new(), physics: Storage::new(), movements: Storage::new(), jumps: Storage::new(), inputs: Storage::new(), player_tags: Storage::new(), state_machines: Storage::new(), cameras: Storage::new(), spotlights: Storage::new(), tree_tags: Storage::new(), dissolves: Storage::new(), follows: Storage::new(), rotates: Storage::new(), } } pub fn spawn(&mut self) -> EntityHandle { self.entities.spawn() } pub fn despawn(&mut self, entity: EntityHandle) { self.transforms.remove(entity); self.meshes.remove(entity); self.physics.remove(entity); self.movements.remove(entity); self.jumps.remove(entity); self.inputs.remove(entity); self.player_tags.remove(entity); self.state_machines.remove(entity); self.cameras.remove(entity); self.spotlights.remove(entity); self.tree_tags.remove(entity); self.dissolves.remove(entity); self.follows.remove(entity); self.rotates.remove(entity); self.entities.despawn(entity); } pub fn active_camera(&self) -> Option<(EntityHandle, &CameraComponent)> { self.cameras .components .iter() .find(|(_, cam)| cam.is_active) .map(|(e, c)| (*e, c)) } pub fn active_camera_position(&self) -> glam::Vec3 { self.active_camera() .and_then(|(entity, _)| self.transforms.get(entity)) .map(|t| t.position) .unwrap_or(glam::Vec3::ZERO) } pub fn player_position(&self) -> glam::Vec3 { self.player_tags .all() .first() .and_then(|e| self.transforms.get(*e)) .map(|t| t.position) .unwrap_or(glam::Vec3::ZERO) } }