pub trait Runtime {
fn start(resources: Resources) -> Self;
fn update(&mut self);
}
pub struct Resources {
pub sound: crate::sound::Audio,
pub framebuffer: crate::draw::Framebuffer,
}
#[doc(hidden)]
impl Resources {
pub unsafe fn new() -> Self {
Resources {
sound: crate::sound::Audio(()),
framebuffer: crate::draw::Framebuffer::new_(),
}
}
}
#[macro_export]
macro_rules! main {
($runtime:ty) => {
static mut RUNTIME: core::mem::MaybeUninit<$runtime> = core::mem::MaybeUninit::uninit();
#[no_mangle]
unsafe extern "C" fn start() {
let res = unsafe { $crate::rt::Resources::new() };
let rt = <$runtime as $crate::rt::Runtime>::start(res);
unsafe { RUNTIME = core::mem::MaybeUninit::new(rt) };
}
#[no_mangle]
unsafe extern "C" fn update() {
let rt = unsafe { RUNTIME.assume_init_mut() };
<$runtime as $crate::rt::Runtime>::update(rt);
}
};
}