use bevy::prelude::*;
#[derive(Debug)]
pub struct EcsWorld {
world: World,
initialized: bool,
}
impl Default for EcsWorld {
fn default() -> Self {
Self::new()
}
}
impl EcsWorld {
pub fn new() -> Self {
let mut world = World::new();
world.insert_resource(EcsMetrics::default());
Self {
world,
initialized: false,
}
}
pub fn initialize(&mut self) -> aerox_core::Result<()> {
if self.initialized {
return Ok(());
}
self.register_components();
self.initialized = true;
Ok(())
}
fn register_components(&mut self) {
}
pub fn world(&self) -> &World {
&self.world
}
pub fn world_mut(&mut self) -> &mut World {
&mut self.world
}
pub fn send_event<E: Event>(&mut self, event: E) {
self.world.send_event(event);
}
pub fn send_events<E: Event>(&mut self, events: Vec<E>) {
for event in events {
self.world.send_event(event);
}
}
pub fn insert_resource<R: Resource>(&mut self, resource: R) {
self.world.insert_resource(resource);
}
pub fn get_resource<R: Resource>(&self) -> Option<&R> {
self.world.get_resource()
}
pub fn get_resource_mut<R: Resource>(&mut self) -> Option<Mut<R>> {
self.world.get_resource_mut()
}
pub fn spawn(&mut self) -> EntityWorldMut {
self.world.spawn_empty()
}
pub fn spawn_bundle(&mut self, bundle: impl Bundle) -> EntityWorldMut {
self.world.spawn(bundle)
}
pub fn metrics(&self) -> &EcsMetrics {
self.world.get_resource::<EcsMetrics>()
.expect("EcsMetrics should always exist")
}
pub fn metrics_mut(&mut self) -> Mut<EcsMetrics> {
self.world.get_resource_mut::<EcsMetrics>()
.expect("EcsMetrics should always exist")
}
}
#[derive(Debug, Clone, Resource)]
pub struct EcsMetrics {
pub entity_count: usize,
pub system_runs: u64,
pub events_processed: u64,
pub last_update: std::time::Instant,
}
impl Default for EcsMetrics {
fn default() -> Self {
Self {
entity_count: 0,
system_runs: 0,
events_processed: 0,
last_update: std::time::Instant::now(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_world_creation() {
let world = EcsWorld::new();
assert!(!world.initialized);
}
#[test]
fn test_world_initialize() {
let mut world = EcsWorld::new();
assert!(world.initialize().is_ok());
assert!(world.initialized);
}
#[test]
fn test_resource_management() {
let mut world = EcsWorld::new();
world.initialize().unwrap();
#[derive(Debug, Clone, Resource)]
struct TestResource {
value: i32,
}
world.insert_resource(TestResource { value: 42 });
let resource = world.get_resource::<TestResource>();
assert!(resource.is_some());
assert_eq!(resource.unwrap().value, 42);
}
#[test]
fn test_entity_spawn() {
let mut world = EcsWorld::new();
world.initialize().unwrap();
#[derive(Component)]
struct Position {
x: f32,
y: f32,
}
let entity = world.spawn_bundle(Position { x: 1.0, y: 2.0 }).id();
assert!(world.world().get_entity(entity).is_some());
}
#[test]
fn test_metrics() {
let world = EcsWorld::new();
let metrics = world.metrics();
assert_eq!(metrics.entity_count, 0);
assert_eq!(metrics.system_runs, 0);
assert_eq!(metrics.events_processed, 0);
}
}