import ffi/ffi import gleam/string import raylib/inputs import raylib/vectors pub type Color = ffi.Color pub type Image = ffi.Image pub type Texture = ffi.Texture pub type Rectangle = ffi.Rectangle pub opaque type Monitor { Monitor(id: Int) } pub opaque type RLContext { RLContext } pub opaque type DrawingContext { DrawingContext } pub fn start( width width: Int, height height: Int, titled title: String, state state: state, f f: fn(RLContext, state) -> state, ) -> Nil { ffi.init_window(width, height, title) loop(RLContext, state, f) ffi.close_window() } fn loop( rc: RLContext, state: state, f: fn(RLContext, state) -> state, ) -> state { case ffi.window_should_close() { True -> state False -> { let state = f(rc, state) loop(rc, state, f) } } } pub fn draw(_: RLContext, actions actions: fn(DrawingContext) -> t) -> t { ffi.begin_drawing() let result = actions(DrawingContext) ffi.end_drawing() result } // re-exports pub fn clear_background(_: DrawingContext, color color: Color) -> Nil { ffi.clear_background(color) } pub fn disable_cursor(_: RLContext) -> Nil { ffi.disable_cursor() } pub fn disable_event_waiting(_: RLContext) -> Nil { ffi.disable_event_waiting() } pub fn draw_circle( _: DrawingContext, x x: Int, y y: Int, radius radius: Float, color color: Color, ) -> Nil { ffi.draw_circle(x, y, radius, color) } pub fn draw_circle_lines( _: DrawingContext, x x: Int, y y: Int, radius radius: Float, color color: Color, ) -> Nil { ffi.draw_circle_lines(x, y, radius, color) } pub fn draw_circle_sector( _: DrawingContext, center center: vectors.Vec2, radius radius: Float, from start_angle: Float, to end_angle: Float, segments segments: Int, color color: Color, ) -> Nil { ffi.draw_circle_sector( vectors.vector2(center), radius, start_angle, end_angle, segments, color, ) } pub fn draw_circle_sector_lines( _: DrawingContext, center center: vectors.Vec2, radius radius: Float, from start_angle: Float, to end_angle: Float, segments segments: Int, color color: Color, ) -> Nil { ffi.draw_circle_sector_lines( vectors.vector2(center), radius, start_angle, end_angle, segments, color, ) } pub fn draw_ellipse( _: DrawingContext, x x: Int, y y: Int, radius_h radius_h: Float, radius_v radius_v: Float, color color: Color, ) -> Nil { ffi.draw_ellipse(x, y, radius_h, radius_v, color) } pub fn draw_ellipse_lines( _: DrawingContext, x x: Int, y y: Int, radius_h radius_h: Float, radius_v radius_v: Float, color color: Color, ) -> Nil { ffi.draw_ellipse_lines(x, y, radius_h, radius_v, color) } pub fn draw_line( _: DrawingContext, sx sx: Int, sy sy: Int, ex ex: Int, ey ey: Int, color color: Color, ) -> Nil { ffi.draw_line(sx, sy, ex, ey, color) } pub fn draw_line_bezier( _: DrawingContext, start start: vectors.Vec2, end end: vectors.Vec2, thick thick: Float, color color: Color, ) -> Nil { ffi.draw_line_bezier( vectors.vector2(start), vectors.vector2(end), thick, color, ) } pub fn draw_line_ex( _: DrawingContext, start start: vectors.Vec2, end end: vectors.Vec2, thick thick: Float, color color: Color, ) -> Nil { ffi.draw_line_ex(vectors.vector2(start), vectors.vector2(end), thick, color) } pub fn draw_pixel( _: DrawingContext, x x: Int, y y: Int, color color: Color, ) -> Nil { ffi.draw_pixel(x, y, color) } pub fn draw_rectangle( _: DrawingContext, x x: Int, y y: Int, w width: Int, h height: Int, color color: Color, ) -> Nil { ffi.draw_rectangle(x, y, width, height, color) } pub fn draw_rectangle_pro( _: DrawingContext, rec rec: Rectangle, origin origin: vectors.Vec2, rot rotation: Float, color color: Color, ) -> Nil { ffi.draw_rectangle_pro(rec, vectors.vector2(origin), rotation, color) } pub fn draw_rectangle_rounded( _: DrawingContext, rec rec: Rectangle, roundness roundness: Float, segments segments: Int, color color: Color, ) -> Nil { ffi.draw_rectangle_rounded(rec, roundness, segments, color) } pub fn draw_rectangle_rounded_lines_ex( _: DrawingContext, rec rec: Rectangle, roundness roundness: Float, segments segments: Int, thick thick: Float, color color: Color, ) -> Nil { ffi.draw_rectangle_rounded_lines_ex(rec, roundness, segments, thick, color) } pub fn draw_ring( _: DrawingContext, center: vectors.Vec2, from_radius inner_radius: Float, to_radius outer_radius: Float, from_angle start_angle: Float, to_angle end_angle: Float, segments segments: Int, color color: Color, ) -> Nil { ffi.draw_ring( vectors.vector2(center), inner_radius, outer_radius, start_angle, end_angle, segments, color, ) } pub fn draw_ring_lines( _: DrawingContext, center center: vectors.Vec2, from_radius inner_radius: Float, to_radius outer_radius: Float, from_angle start_angle: Float, to_angle end_angle: Float, segments segments: Float, color color: Color, ) -> Nil { ffi.draw_ring_lines( vectors.vector2(center), inner_radius, outer_radius, start_angle, end_angle, segments, color, ) } pub fn enable_cursor(_: RLContext) -> Nil { ffi.enable_cursor() } pub fn enable_event_waiting(_: RLContext) -> Nil { ffi.enable_event_waiting() } pub fn get_char_pressed(_: RLContext) -> Result(UtfCodepoint, Nil) { string.utf_codepoint(ffi.get_char_pressed()) } pub fn get_clipboard_image(_: RLContext) -> Image { ffi.get_clipboard_image() } pub fn get_clipboard_text(_: RLContext) -> String { ffi.get_clipboard_text() } pub fn get_color(from hex: Int) -> Color { ffi.get_color(hex) } pub fn get_fps(_: RLContext) -> Int { ffi.get_fps() } pub fn get_frame_time(_: RLContext) -> Float { ffi.get_frame_time() } pub fn get_key_pressed(_: RLContext) -> inputs.KeyCode { inputs.KeyCode(ffi.get_key_pressed()) } pub fn get_monitor_count(_: RLContext) -> Int { ffi.get_monitor_count() } pub fn get_current_monitor(_: RLContext) -> Monitor { Monitor(ffi.get_current_monitor()) } pub fn get_monitor_height(_: RLContext, of monitor: Monitor) -> Int { ffi.get_monitor_height(monitor.id) } pub fn get_monitor_name(_: RLContext, of monitor: Monitor) -> String { ffi.get_monitor_name(monitor.id) } pub fn get_monitor_physical_height(_: RLContext, of monitor: Monitor) -> Int { ffi.get_monitor_physical_height(monitor.id) } pub fn get_monitor_physical_width(_: RLContext, of monitor: Monitor) -> Int { ffi.get_monitor_physical_width(monitor.id) } pub fn get_monitor_position(_: RLContext, of monitor: Monitor) -> vectors.Vec2 { vectors.vec2(ffi.get_monitor_position(monitor.id)) } pub fn get_monitor_refresh_rate(_: RLContext, of monitor: Monitor) -> Int { ffi.get_monitor_refresh_rate(monitor.id) } pub fn get_monitor_width(_: RLContext, of monitor: Monitor) -> Int { ffi.get_monitor_width(monitor.id) } pub fn get_mouse_delta(_: RLContext) -> vectors.Vec2 { vectors.vec2(ffi.get_mouse_delta()) } pub fn get_mouse_position(_: RLContext) -> vectors.Vec2 { vectors.vec2(ffi.get_mouse_position()) } pub fn get_mouse_wheel_move(_: RLContext) -> Float { ffi.get_mouse_wheel_move() } pub fn get_mouse_wheel_move_v(_: RLContext) -> vectors.Vec2 { vectors.vec2(ffi.get_mouse_wheel_move_v()) } pub fn get_mouse_x(_: RLContext) -> Int { ffi.get_mouse_x() } pub fn get_mouse_y(_: RLContext) -> Int { ffi.get_mouse_y() } pub fn get_render_height(_: RLContext) -> Int { ffi.get_render_height() } pub fn get_render_width(_: RLContext) -> Int { ffi.get_render_width() } pub fn get_screen_height(_: RLContext) -> Int { ffi.get_screen_height() } pub fn get_shapes_texture(_: RLContext) -> Texture { ffi.get_shapes_texture() } pub fn get_shapes_texture_rectangle(_: RLContext) -> Rectangle { ffi.get_shapes_texture_rectangle() } pub fn get_time(_: RLContext) -> Float { ffi.get_time() } pub fn get_window_position(_: RLContext) -> vectors.Vec2 { vectors.vec2(ffi.get_window_position()) } pub fn get_window_scale_dpi(_: RLContext) -> vectors.Vec2 { vectors.vec2(ffi.get_window_scale_dpi()) } pub fn hide_cursor(_: RLContext) -> Nil { ffi.hide_cursor() } pub fn get_screen_width(_: RLContext) -> Int { ffi.get_screen_width() } pub fn is_cursor_hidden(_: RLContext) -> Bool { ffi.is_cursor_hidden() } pub fn is_cursor_on_screen(_: RLContext) -> Bool { ffi.is_cursor_on_screen() } pub fn is_key_down(_: RLContext, code code: inputs.KeyCode) -> Bool { ffi.is_key_down(code.code) } pub fn is_key_pressed(_: RLContext, code code: inputs.KeyCode) -> Bool { ffi.is_key_pressed(code.code) } pub fn is_key_pressed_repeat(_: RLContext, code code: inputs.KeyCode) -> Bool { ffi.is_key_pressed_repeat(code.code) } pub fn is_key_released(_: RLContext, code code: inputs.KeyCode) -> Bool { ffi.is_key_released(code.code) } pub fn is_key_up(_: RLContext, code code: inputs.KeyCode) -> Bool { ffi.is_key_up(code.code) } pub fn is_mouse_button_down( _: RLContext, code code: inputs.MouseButtonCode, ) -> Bool { ffi.is_mouse_button_down(code.code) } pub fn is_mouse_button_pressed( _: RLContext, code code: inputs.MouseButtonCode, ) -> Bool { ffi.is_mouse_button_pressed(code.code) } pub fn is_mouse_button_released( _: RLContext, code code: inputs.MouseButtonCode, ) -> Bool { ffi.is_mouse_button_released(code.code) } pub fn is_mouse_button_up( _: RLContext, code code: inputs.MouseButtonCode, ) -> Bool { ffi.is_mouse_button_up(code.code) } pub fn is_window_focused(_: RLContext) -> Bool { ffi.is_window_focused() } pub fn is_window_fullscreen(_: RLContext) -> Bool { ffi.is_window_fullscreen() } pub fn is_window_hidden(_: RLContext) -> Bool { ffi.is_window_hidden() } pub fn is_window_maximized(_: RLContext) -> Bool { ffi.is_window_maximized() } pub fn is_window_minimized(_: RLContext) -> Bool { ffi.is_window_minimized() } pub fn is_window_resized(_: RLContext) -> Bool { ffi.is_window_resized() } pub fn maximize_window(_: RLContext) -> Nil { ffi.maximize_window() } pub fn minimize_window(_: RLContext) -> Nil { ffi.minimize_window() } pub fn restore_window(_: RLContext) -> Nil { ffi.restore_window() } pub fn set_clipboard_text(_: RLContext, to text: String) -> Nil { ffi.set_clipboard_text(text) } pub fn set_exit_key(_: RLContext, code code: inputs.KeyCode) -> Nil { ffi.set_exit_key(code.code) } pub fn set_mouse_position(_: RLContext, x x: Int, y y: Int) -> Nil { ffi.set_mouse_position(x, y) } pub fn set_mouse_scale(_: RLContext, x x: Float, y y: Float) -> Nil { ffi.set_mouse_scale(x, y) } pub fn set_shapes_texture( _: RLContext, to texture: Texture, source source: Rectangle, ) -> Nil { ffi.set_shapes_texture(texture, source) } pub fn set_target_fps(_: RLContext, to fps: Int) -> Nil { ffi.set_target_fps(fps) } pub fn set_window_focused(_: RLContext) -> Nil { ffi.set_window_focused() } pub fn set_window_icon(_: RLContext, to image: Image) -> Nil { ffi.set_window_icon(image) } pub fn set_window_max_size( _: RLContext, width width: Int, height height: Int, ) -> Nil { ffi.set_window_max_size(width, height) } pub fn set_window_min_size( _: RLContext, width width: Int, height height: Int, ) -> Nil { ffi.set_window_min_size(width, height) } pub fn set_window_monitor(_: RLContext, to monitor: Int) -> Nil { ffi.set_window_monitor(monitor) } pub fn set_window_opacity(_: RLContext, to opacity: Float) -> Nil { ffi.set_window_opacity(opacity) } pub fn set_window_position(_: RLContext, x x: Int, y y: Int) -> Nil { ffi.set_window_position(x, y) } pub fn set_window_size( _: RLContext, width width: Int, height height: Int, ) -> Nil { ffi.set_window_size(width, height) } pub fn set_window_title(_: RLContext, to title: String) -> Nil { ffi.set_window_title(title) } pub fn show_cursor(_: RLContext) -> Nil { ffi.show_cursor() } pub fn take_screenshot(_: RLContext, to file: String) -> Nil { ffi.take_screenshot(file) } pub fn toggle_borderless_windowed(_: RLContext) -> Nil { ffi.toggle_borderless_windowed() } pub fn toggle_fullscreen(_: RLContext) -> Nil { ffi.toggle_fullscreen() }