use crate::*;
impl Engine {
pub fn new_handle(config: EngineConfig) -> EngineHandle {
EngineHandle::new(config, None, None, None)
}
pub async fn run(config: EngineConfig, handler: TickHandlerRc) -> EngineHandle {
let mut handle: EngineHandle = Engine::new_handle(config);
match handle.get_config().get_render().get_backend() {
RenderBackendType::Canvas2D => {
handle.init_canvas();
}
RenderBackendType::WebGpu => {
handle.init_webgpu().await;
}
}
handle.start(handler);
handle
}
pub fn default_config() -> EngineConfig {
EngineConfig::default()
}
pub fn canvas_renderer(config: &RenderConfig) -> Option<CanvasRenderer> {
CanvasRenderer::from_selector(
config.get_canvas_selector(),
config.get_width(),
config.get_height(),
)
}
pub async fn webgpu_renderer(config: &RenderConfig) -> Option<WebGpuRenderer> {
WebGpuRenderer::init(config).await
}
}
impl EngineHandle {
pub fn init_canvas(&mut self) -> bool {
let render_config: &RenderConfig = &self.config.get_render();
let renderer: Option<CanvasRenderer> = CanvasRenderer::from_selector(
render_config.get_canvas_selector(),
render_config.get_width(),
render_config.get_height(),
);
match renderer {
Some(r) => {
self.canvas_renderer = Some(r);
self.webgpu_renderer = None;
true
}
None => {
self.canvas_renderer = None;
self.webgpu_renderer = None;
false
}
}
}
pub async fn init_webgpu(&mut self) -> bool {
let render_config: &RenderConfig = &self.config.get_render();
let renderer: Option<WebGpuRenderer> = WebGpuRenderer::init(render_config).await;
match renderer {
Some(r) => {
self.webgpu_renderer = Some(r);
self.canvas_renderer = None;
true
}
None => {
self.canvas_renderer = None;
self.webgpu_renderer = None;
false
}
}
}
pub fn start(&mut self, handler: TickHandlerRc) {
let scheduler_config: SchedulerConfig = self.config.get_scheduler();
self.scheduler_handle = Some(SchedulerHandle::start(scheduler_config, handler));
}
pub fn stop(&self) {
if let Some(handle) = &self.scheduler_handle {
handle.stop();
}
}
pub fn is_running(&self) -> bool {
self.scheduler_handle
.as_ref()
.is_some_and(|handle: &SchedulerHandle| handle.is_running())
}
}