use std::ffi::{c_int, c_uint, c_void}; use std::num::NonZeroU32; use std::os::raw::c_char; mod renderer; mod window; pub use renderer::Renderer; pub use window::{Window, WindowConfig, WindowEvent}; type CRenderer = *mut (); type CWindow = *mut (); type CVertexBuffer = c_int; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[repr(C)] pub struct RendererConfig { pub width: c_uint, pub height: c_uint, pub vsync: bool, } #[repr(C)] pub struct DrawCommand { vertex_count: c_uint, start: c_uint, end: c_uint, } #[repr(C)] pub struct Vertex { x: f32, y: f32, z: f32, curve_a: f32, curve_b: f32, color1_r: f32, color1_g: f32, color1_b: f32, color1_a: f32, } #[derive(Debug, Clone, Copy)] #[repr(C)] struct CWindowConfig { default_width: c_uint, default_height: c_uint, default_x: c_uint, default_y: c_uint, title: *const c_char, visible: bool, borderless_fullscreen: bool, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[repr(C)] pub enum CWindowEvent { AboutToWait, Other, CloseRequest, ScaleFactorChange, Resume, RedrawRequest, } #[link(name = "alligator_backend", kind = "static")] extern "C" { fn new_renderer(config: RendererConfig, window: CWindow) -> CRenderer; fn resize_renderer(renderer: CRenderer, width: c_uint, height: c_uint); fn is_vsync_available(renderer: CRenderer) -> bool; fn set_vsync(renderer: CRenderer, vsync: bool); fn set_camera( renderer: CRenderer, x: f32, y: f32, zoom: f32, rotation: f32, width: f32, height: f32, ); //fn create_mesh( // renderer: CRenderer, // vertex_count: c_uint, // vertices: *const Vertex, //) -> CVertexBuffer; fn destroy_vertex_buffer(renderer: CRenderer, buffer: CVertexBuffer); fn render_frame(renderer: CRenderer); fn destroy_renderer(renderer: CRenderer); fn create_window(config: CWindowConfig) -> CWindow; fn set_visible(window: CWindow, visible: bool); fn resize_window(window: CWindow, width: c_uint, height: c_uint); fn set_fullscreen(window: CWindow, fullscreen: bool); fn set_title(window: CWindow, title: *const c_char); fn wait_for_event(window: CWindow); fn pop_event(window: CWindow) -> bool; fn wait_for_resume(window: CWindow); fn set_event_handler(window: CWindow, closure: *mut c_void); fn run_event_handler(window: CWindow, event: CWindowEvent); fn request_redraw(window: CWindow); fn destroy_window(window: CWindow); } #[no_mangle] unsafe extern "C" fn alligator_run_closure(closure: *mut c_void, event: CWindowEvent) { let closure: &mut &mut dyn FnMut(CWindowEvent) = unsafe { &mut *closure.cast() }; closure(event) } // avoid linking errors in windows #[no_mangle] extern "C" fn __imp__CrtDbgReport() {} #[no_mangle] extern "C" fn __imp__invalid_parameter() {}