use crate::core::*;
use crate::sys;
use core::ffi::c_void;
pub struct App<'a> {
pub(crate) world: WorldRef<'a>,
pub(crate) desc: sys::ecs_app_desc_t,
}
impl<'a> App<'a> {
pub(crate) fn new(world: impl WorldProvider<'a>) -> Self {
let mut obj = Self {
world: world.world(),
desc: sys::ecs_app_desc_t::default(),
};
let stats = unsafe { sys::ecs_get_world_info(obj.world.ptr_mut()) };
obj.desc.target_fps = unsafe { (*stats).target_fps };
let zero: FTime = 0.0;
if obj.desc.target_fps.to_bits() == zero.to_bits() {
obj.desc.target_fps = 60.0;
}
obj
}
pub fn set_target_fps(&mut self, fps: FTime) -> &mut Self {
self.desc.target_fps = fps;
self
}
pub fn set_delta_time(&mut self, delta_time: FTime) -> &mut Self {
self.desc.delta_time = delta_time;
self
}
pub fn set_threads(&mut self, threads: i32) -> &mut Self {
self.desc.threads = threads;
self
}
pub fn set_frames(&mut self, frames: i32) -> &mut Self {
self.desc.frames = frames;
self
}
#[cfg(feature = "flecs_rest")]
pub fn enable_rest(&mut self, port: u16) -> &mut Self {
self.desc.enable_rest = true;
self.desc.port = port;
self
}
#[cfg(feature = "flecs_stats")]
pub fn enable_stats(&mut self, enable: bool) -> &mut Self {
self.desc.enable_stats = enable;
self
}
pub fn init(&mut self, value: sys::ecs_app_init_action_t) -> &mut Self {
self.desc.init = value;
self
}
pub fn context(&mut self, ctx: *mut c_void) -> &mut Self {
self.desc.ctx = ctx;
self
}
pub fn run(&mut self) -> i32 {
let world_ptr = self.world.ptr_mut();
let result = unsafe { sys::ecs_app_run(world_ptr, &mut self.desc) };
unsafe {
if sys::ecs_should_quit(world_ptr) {
if sys::flecs_poly_release_(world_ptr as *mut c_void) == 0 {
sys::ecs_fini(world_ptr);
}
}
}
result
}
}