summaryrefslogtreecommitdiff
path: root/sys/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'sys/src/lib.rs')
-rw-r--r--sys/src/lib.rs98
1 files changed, 98 insertions, 0 deletions
diff --git a/sys/src/lib.rs b/sys/src/lib.rs
new file mode 100644
index 0000000..f3fae9c
--- /dev/null
+++ b/sys/src/lib.rs
@@ -0,0 +1,98 @@
+use std::ffi::{c_uchar, c_uint, c_void};
+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 ();
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+#[repr(C)]
+pub struct RendererConfig {
+ pub width: c_uint,
+ pub height: c_uint,
+ pub instance_capacity: c_uint,
+ pub fullscreen: bool,
+ pub vsync: bool,
+}
+
+#[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,
+ normal_x: f32,
+ normal_y: f32,
+ normal_z: 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 set_vsync(renderer: CRenderer, vsync: bool);
+ fn create_vertex_buffer(renderer: CRenderer, count: c_uint, instances: *const Vertex);
+ fn set_camera(
+ renderer: CRenderer,
+ x: f32,
+ y: f32,
+ zoom: f32,
+ rotation: f32,
+ width: f32,
+ height: f32,
+ );
+ 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)
+}