rustyray_sys/
ffi.rs

1/**********************************************************************************************
2*
3*   raylib v5.5 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com)
4*
5*   FEATURES:
6*       - NO external dependencies, all required libraries included with raylib
7*       - Multiplatform: Windows, Linux, FreeBSD, OpenBSD, NetBSD, DragonFly,
8*                        MacOS, Haiku, Android, Raspberry Pi, DRM native, HTML5.
9*       - Written in plain C code (C99) in PascalCase/camelCase notation
10*       - Hardware accelerated with OpenGL (1.1, 2.1, 3.3, 4.3, ES2, ES3 - choose at compile)
11*       - Unique OpenGL abstraction layer (usable as standalone module): [rlgl]
12*       - Multiple Fonts formats supported (TTF, OTF, FNT, BDF, Sprite fonts)
13*       - Outstanding texture formats support, including compressed formats (DXT, ETC, ASTC)
14*       - Full 3d support for 3d Shapes, Models, Billboards, Heightmaps and more!
15*       - Flexible Materials system, supporting classic maps and PBR maps
16*       - Animated 3D models supported (skeletal bones animation) (IQM, M3D, GLTF)
17*       - Shaders support, including Model shaders and Postprocessing shaders
18*       - Powerful math module for Vector, Matrix and Quaternion operations: [raymath]
19*       - Audio loading and playing with streaming support (WAV, OGG, MP3, FLAC, QOA, XM, MOD)
20*       - VR stereo rendering with configurable HMD device parameters
21*       - Bindings to multiple programming languages available!
22*
23*   NOTES:
24*       - One default Font is loaded on InitWindow()->LoadFontDefault() [core, text]
25*       - One default Texture2D is loaded on rlglInit(), 1x1 white pixel R8G8B8A8 [rlgl] (OpenGL 3.3 or ES2)
26*       - One default Shader is loaded on rlglInit()->rlLoadShaderDefault() [rlgl] (OpenGL 3.3 or ES2)
27*       - One default RenderBatch is loaded on rlglInit()->rlLoadRenderBatch() [rlgl] (OpenGL 3.3 or ES2)
28*
29*   DEPENDENCIES (included):
30*       [rcore][GLFW] rglfw (Camilla Löwy - github.com/glfw/glfw) for window/context management and input
31*       [rcore][RGFW] rgfw (ColleagueRiley - github.com/ColleagueRiley/RGFW) for window/context management and input
32*       [rlgl] glad/glad_gles2 (David Herberth - github.com/Dav1dde/glad) for OpenGL 3.3 extensions loading
33*       [raudio] miniaudio (David Reid - github.com/mackron/miniaudio) for audio device/context management
34*
35*   OPTIONAL DEPENDENCIES (included):
36*       [rcore] msf_gif (Miles Fogle) for GIF recording
37*       [rcore] sinfl (Micha Mettke) for DEFLATE decompression algorithm
38*       [rcore] sdefl (Micha Mettke) for DEFLATE compression algorithm
39*       [rcore] rprand (Ramon Snatamaria) for pseudo-random numbers generation
40*       [rtextures] qoi (Dominic Szablewski - https://phoboslab.org) for QOI image manage
41*       [rtextures] stb_image (Sean Barret) for images loading (BMP, TGA, PNG, JPEG, HDR...)
42*       [rtextures] stb_image_write (Sean Barret) for image writing (BMP, TGA, PNG, JPG)
43*       [rtextures] stb_image_resize2 (Sean Barret) for image resizing algorithms
44*       [rtextures] stb_perlin (Sean Barret) for Perlin Noise image generation
45*       [rtext] stb_truetype (Sean Barret) for ttf fonts loading
46*       [rtext] stb_rect_pack (Sean Barret) for rectangles packing
47*       [rmodels] par_shapes (Philip Rideout) for parametric 3d shapes generation
48*       [rmodels] tinyobj_loader_c (Syoyo Fujita) for models loading (OBJ, MTL)
49*       [rmodels] cgltf (Johannes Kuhlmann) for models loading (glTF)
50*       [rmodels] m3d (bzt) for models loading (M3D, https://bztsrc.gitlab.io/model3d)
51*       [rmodels] vox_loader (Johann Nadalutti) for models loading (VOX)
52*       [raudio] dr_wav (David Reid) for WAV audio file loading
53*       [raudio] dr_flac (David Reid) for FLAC audio file loading
54*       [raudio] dr_mp3 (David Reid) for MP3 audio file loading
55*       [raudio] stb_vorbis (Sean Barret) for OGG audio loading
56*       [raudio] jar_xm (Joshua Reisenauer) for XM audio module loading
57*       [raudio] jar_mod (Joshua Reisenauer) for MOD audio module loading
58*       [raudio] qoa (Dominic Szablewski - https://phoboslab.org) for QOA audio manage
59*
60*
61*   LICENSE: zlib/libpng
62*
63*   raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified,
64*   BSD-like license that allows static linking with closed source software:
65*
66*   Copyright (c) 2013-2024 Ramon Santamaria (@raysan5)
67*
68*   This software is provided "as-is", without any express or implied warranty. In no event
69*   will the authors be held liable for any damages arising from the use of this software.
70*
71*   Permission is granted to anyone to use this software for any purpose, including commercial
72*   applications, and to alter it and redistribute it freely, subject to the following restrictions:
73*
74*     1. The origin of this software must not be misrepresented; you must not claim that you
75*     wrote the original software. If you use this software in a product, an acknowledgment
76*     in the product documentation would be appreciated but is not required.
77*
78*     2. Altered source versions must be plainly marked as such, and must not be misrepresented
79*     as being the original software.
80*
81*     3. This notice may not be removed or altered from any source distribution.
82*
83**********************************************************************************************/
84
85use libc::{c_char, c_double, c_float, c_int, c_uchar, c_uint, c_void};
86
87use crate::{
88    audio::{AudioCallback, AudioStream, Music, Sound, Wave},
89    camera::Camera2D,
90    color::Color,
91    consts::{
92        ConfigFlag, GamepadAxis, GamepadButton, Gesture, KeyboardKey, MouseButton, MouseCursor,
93        TextureFilter, TextureWrap,
94    },
95    math::{Rectangle, Vector2},
96    texture::{Image, RenderTexture, RenderTexture2D, Texture},
97};
98
99// Window-related functions
100extern "C" {
101    /// Initialize window and OpenGL context
102    #[link_name = "InitWindow"]
103    pub fn init_window(width: c_int, height: c_int, title: *const c_char);
104    /// Close window and unload OpenGL context
105    #[link_name = "CloseWindow"]
106    pub fn close_window();
107    /// Check if application should close (KEY_ESCAPE pressed or windows close icon clicked)
108    #[link_name = "WindowShouldClose"]
109    pub fn window_should_close() -> bool;
110    /// Check if window has been initialized successfully
111    #[link_name = "IsWindowReady"]
112    pub fn is_window_ready() -> bool;
113    /// Check if window is currently fullscreen
114    #[link_name = "IsWindowFullscreen"]
115    pub fn is_window_fullscreen() -> bool;
116    /// Check if window is currently hidden
117    #[link_name = "IsWindowHidden"]
118    pub fn is_window_hidden() -> bool;
119    /// Check if window is currently minimized
120    #[link_name = "IsWindowMinimized"]
121    pub fn is_window_minimized() -> bool;
122    /// Check if window is currently maximized
123    #[link_name = "IsWindowMaximized"]
124    pub fn is_window_maximized() -> bool;
125    /// Check if window is currently focused
126    #[link_name = "IsWindowFocused"]
127    pub fn is_window_focused() -> bool;
128    /// Check if window has been resized last frame
129    #[link_name = "IsWindowResized"]
130    pub fn is_window_resized() -> bool;
131    /// Check if one specific window flag is enabled
132    ///
133    /// Flags should be of values defined in [ConfigFlag].
134    ///
135    /// Use this value as a bitmask.
136    ///
137    /// # Examples
138    /// ```no_run
139    /// use rustyray_sys::{ffi::is_window_state, consts::ConfigFlag};
140    ///
141    /// unsafe { is_window_state(ConfigFlag::VsyncHint) };
142    /// ```
143    #[link_name = "IsWindowState"]
144    pub fn is_window_state(flags: ConfigFlag) -> bool;
145    /// Set window configuration state using flags
146    ///
147    /// Flags should be of values defined in [ConfigFlag].
148    ///
149    /// Use this value as a bitmask.
150    ///
151    /// # Examples
152    /// ```no_run
153    /// use rustyray_sys::{ffi::set_window_state, consts::ConfigFlag};
154    ///
155    /// unsafe { set_window_state(ConfigFlag::VsyncHint); }
156    /// ```
157    #[link_name = "SetWindowState"]
158    pub fn set_window_state(flags: ConfigFlag);
159    /// Clear window configuration state flags
160    ///
161    /// Flags should be of values defined in [ConfigFlag].
162    ///
163    /// Use this value as a bitmask.
164    ///
165    /// # Examples
166    /// ```no_run
167    /// use rustyray_sys::{ffi::clear_window_state, consts::ConfigFlag};
168    ///
169    /// unsafe { clear_window_state(ConfigFlag::VsyncHint); }
170    /// ```
171    #[link_name = "ClearWindowState"]
172    pub fn clear_window_state(flags: ConfigFlag);
173    /// Toggle window state: fullscreen/windowed, resizes monitor to match window resolution
174    #[link_name = "ToggleFullscreen"]
175    pub fn toggle_fullscreen();
176    /// Toggle window state: borderless windowed, resizes window to match monitor resolution
177    #[link_name = "ToggleBorderlessWindowed"]
178    pub fn toggle_borderless_windowed();
179    /// Set window state: maximized, if resizable
180    #[link_name = "MaximizeWindow"]
181    pub fn maximize_window();
182    /// Set window state: minimized, if resizable
183    #[link_name = "MinimizeWindow"]
184    pub fn minimize_window();
185    /// Set window state: not minimized/maximized
186    #[link_name = "RestoreWindow"]
187    pub fn restore_window();
188    /// Set icon for window (single image, RGBA 32bit)
189    #[link_name = "SetWindowIcon"]
190    pub fn set_window_icon(image: Image);
191    /// Set icon for window (multiple images, RGBA 32bit)
192    #[link_name = "SetWindowIcons"]
193    pub fn set_window_icons(images: *const Image);
194    /// Set title for window
195    #[link_name = "SetWindowTitle"]
196    pub fn set_window_title(images: *const c_char);
197    /// Set window position on screen
198    #[link_name = "SetWindowPosition"]
199    pub fn set_window_position(x: c_int, y: c_int);
200    /// Set monitor for the current window
201    #[link_name = "SetWindowMonitor"]
202    pub fn set_window_monitor(monitor: c_int);
203    /// Set window minimum dimensions (for [ConfigFlag::WindowResizable])
204    #[link_name = "SetWindowMinSize"]
205    pub fn set_window_min_size(width: c_int, height: c_int);
206    /// Set window maximum dimensions (for [ConfigFlag::WindowResizable])
207    #[link_name = "SetWindowMaxSize"]
208    pub fn set_window_max_size(width: c_int, height: c_int);
209    /// Set window dimension
210    #[link_name = "SetWindowSize"]
211    pub fn set_window_size(width: c_int, height: c_int);
212    /// Set window opacity [0.0..1.0]
213    #[link_name = "SetWindowOpacity"]
214    pub fn set_window_opacity(opacity: c_float);
215    /// Set window focused
216    #[link_name = "SetWindowFocused"]
217    pub fn set_window_focused();
218    /// Get current screen width
219    #[link_name = "GetScreenWidth"]
220    pub fn get_screen_width() -> c_int;
221    /// Get current screen height
222    #[link_name = "GetScreenHeight"]
223    pub fn get_screen_height() -> c_int;
224    /// Get current render width (it considers HiDPI)
225    #[link_name = "GetRenderWidth"]
226    pub fn get_render_width() -> c_int;
227    /// Get current render height (it considers HiDPI)
228    #[link_name = "GetRenderHeight"]
229    pub fn get_render_height() -> c_int;
230    /// Get number of connected monitors
231    #[link_name = "GetMonitorCount"]
232    pub fn get_monitor_count() -> c_int;
233    /// Get current monitor where window is placed
234    #[link_name = "GetCurrentMonitor"]
235    pub fn get_current_monitor() -> c_int;
236    /// Get specified monitor position
237    #[link_name = "GetMonitorPosition"]
238    pub fn get_monitor_position(monitor: c_int) -> Vector2;
239    /// Get specified monitor width (current video mode used by monitor)
240    #[link_name = "GetMonitorWidth"]
241    pub fn get_monitor_width(monitor: c_int) -> c_int;
242    /// Get specified monitor height (current video mode used by monitor)
243    #[link_name = "GetMonitorHeight"]
244    pub fn get_monitor_height(monitor: c_int) -> c_int;
245    /// Get specified monitor physical width in millimetres
246    #[link_name = "GetMonitorPhysicalWidth"]
247    pub fn get_monitor_physical_width(monitor: c_int) -> c_int;
248    /// Get specified monitor physical height in millimetres
249    #[link_name = "GetMonitorPhysicalHeight"]
250    pub fn get_monitor_physical_height(monitor: c_int) -> c_int;
251    /// Get specified monitor refresh rate
252    #[link_name = "GetMonitorRefreshRate"]
253    pub fn get_monitor_refresh_rate(monitor: c_int) -> c_int;
254    /// Get position XY on monitor
255    #[link_name = "GetWindowPosition"]
256    pub fn get_window_position() -> Vector2;
257    /// Get window scale DPI factor
258    #[link_name = "GetWindowScaleDPI"]
259    pub fn get_window_scale_dpi() -> Vector2;
260    /// Get the human-readable, UTF-8 encoded name of the specified monitor
261    #[link_name = "GetMonitorName"]
262    pub fn get_monitor_name(monitor: c_int) -> *const c_char;
263    /// Set clipboard text content
264    #[link_name = "SetClipboardText"]
265    pub fn set_clipboard_text(text: *const c_char);
266    /// Get clipboard text content
267    #[link_name = "GetClipboardText"]
268    pub fn get_clipboard_text() -> *const c_char;
269    /// Get clipboard image content
270    #[link_name = "GetClipboardImage"]
271    pub fn get_clipboard_image() -> Image;
272    /// Enable waiting for events on [end_drawing], no automatic event polling
273    #[link_name = "EnableEventWaiting"]
274    pub fn enable_event_waiting();
275    /// Disable waiting for events on [end_drawing], automatic event polling
276    #[link_name = "DisableEventWaiting"]
277    pub fn disable_event_waiting();
278}
279
280// Cursor-related functions
281extern "C" {
282    /// Shows cursor
283    #[link_name = "ShowCursor"]
284    pub fn show_cursor();
285    /// Hides cursor
286    #[link_name = "HideCursor"]
287    pub fn hide_cursor();
288    /// Check if cursor is not visible
289    #[link_name = "IsCursorHidden"]
290    pub fn is_cursor_hidden();
291    /// Enables cursor (unlock cursor)
292    #[link_name = "EnableCursor"]
293    pub fn enable_cursor();
294    /// Disabled cursor (lock cursor)
295    #[link_name = "DisableCursor"]
296    pub fn disable_cursor();
297    /// Check if cursor is on the screen
298    #[link_name = "IsCursorOnScreen"]
299    pub fn is_cursor_on_screen();
300}
301
302// Drawing related functions
303extern "C" {
304    /// Set background color (framebuffer clear color)
305    #[link_name = "ClearBackground"]
306    pub fn clear_background(color: Color);
307    /// Setup canvas (framebuffer) to start drawing
308    #[link_name = "BeginDrawing"]
309    pub fn begin_drawing();
310    /// End canvas drawing and swap buffers (double buffering)
311    #[link_name = "EndDrawing"]
312    pub fn end_drawing();
313    /// Begin 2D mode with custom camera (2D)
314    #[link_name = "BeginMode2D"]
315    pub fn begin_mode_2d(camera: Camera2D);
316    /// Ends 2D mode with custom camera
317    #[link_name = "EndMode2D"]
318    pub fn end_mode_2d();
319    /// Begin drawing to render texture
320    #[link_name = "BeginTextureMode"]
321    pub fn begin_texture_mode(render_texture: RenderTexture2D);
322    /// Ends drawing to render texture
323    #[link_name = "EndTextureMode"]
324    pub fn end_texture_mode();
325}
326
327// Image loading functions
328extern "C" {
329    /// Load image from memory buffer, fileType refers to extension: i.e. '.png'
330    #[link_name = "LoadImageFromMemory"]
331    pub fn load_image_from_memory(
332        file_type: *const c_char,
333        file_data: *const c_uchar,
334        data_size: c_int,
335    ) -> Image;
336}
337
338// Texture loading functions
339// Note: These function require GPU access
340extern "C" {
341    /// Load texture from file into GPU memory (VRAM)
342    #[link_name = "LoadTexture"]
343    pub fn load_texture(path: *const c_char) -> Texture;
344    /// Load texture from image data
345    #[link_name = "LoadTextureFromImage"]
346    pub fn load_texture_from_image(image: Image) -> Texture;
347    /// Load texture for rendering (framebuffer)
348    #[link_name = "LoadRenderTexture"]
349    pub fn load_render_texture(width: c_int, height: c_int) -> RenderTexture;
350    /// Check if a texture is valid (loaded in GPU)
351    #[link_name = "IsTextureValid"]
352    pub fn is_texture_valid(texture: Texture) -> bool;
353    /// Unload texture from GPU memory (VRAM)
354    #[link_name = "UnloadTexture"]
355    pub fn unload_texture(texture: Texture);
356    /// Check if a render texture is valid (loaded in GPU)
357    #[link_name = "IsRenderTextureValid"]
358    pub fn is_render_texture_valid(target: RenderTexture) -> bool;
359    /// Unload render texture from GPU memory (VRAM)
360    #[link_name = "UnloadRenderTexture"]
361    pub fn unload_render_texture(render_texture: RenderTexture);
362    /// Update GPU texture with new data
363    #[link_name = "UpdateTexture"]
364    pub fn update_texture(texture: Texture, pixels: *const c_void);
365    /// Update GPU texture rectangle with new data
366    #[link_name = "UpdateTextureRec"]
367    pub fn update_texture_rec(texture: Texture, rec: Rectangle, pixels: *const c_void);
368}
369
370// Texture configuration function
371extern "C" {
372    /// Generate GPU mipmaps for a texture
373    #[link_name = "GenTextureMipmaps"]
374    pub fn gen_texture_mipmaps(texture: *mut Texture);
375    /// Set texture scaling filter mode
376    #[link_name = "SetTextureFilter"]
377    pub fn set_texture_filter(texture: Texture, filter: TextureFilter);
378    /// Set texture wrapping mode
379    #[link_name = "SetTextureWrap"]
380    pub fn set_texture_wrap(texture: Texture, wrap: TextureWrap);
381}
382
383// Texture drawing functions
384extern "C" {
385    /// Draw a [Texture]
386    #[link_name = "DrawTexture"]
387    pub fn draw_texture(texture: Texture, pos_x: c_int, pos_y: c_int, tint: Color);
388    /// Draw a [Texture] with position defined as [Vector2]
389    #[link_name = "DrawTextureV"]
390    pub fn draw_texture_v(texture: Texture, pos: Vector2, tint: Color);
391    /// Draw a [Texture] with extended parameters
392    #[link_name = "DrawTextureEx"]
393    pub fn draw_texture_ex(
394        texture: Texture,
395        pos: Vector2,
396        rotation: c_float,
397        scale: c_float,
398        tint: Color,
399    );
400    /// Draw a part of a [Texture] defined by a [Rectangle]
401    #[link_name = "DrawTextureRec"]
402    pub fn draw_texture_rec(texture: Texture, source: Rectangle, position: Vector2, tint: Color);
403    /// Draw a part of a [Texture] defined by a [Rectangle] with 'pro' parameters
404    #[link_name = "DrawTexturePro"]
405    pub fn draw_texture_pro(
406        texture: Texture,
407        source: Rectangle,
408        dest: Rectangle,
409        origin: Vector2,
410        rotation: c_float,
411        tint: Color,
412    );
413    // TODO: Add draw_texture_npatch when NPatchInfo is implemented
414}
415
416// Text drawing functions
417extern "C" {
418    /// Draw current FPS
419    #[link_name = "DrawFPS"]
420    pub fn draw_fps(pos_x: c_int, pos_y: c_int);
421    /// Draw text (using default font)
422    #[link_name = "DrawText"]
423    pub fn draw_text(
424        text: *const c_char,
425        pos_x: c_int,
426        pos_y: c_int,
427        font_size: c_int,
428        color: Color,
429    );
430}
431
432// Text font info functions
433extern "C" {
434    /// Measure string width for default font
435    #[link_name = "MeasureText"]
436    pub fn measure_text(text: *const c_char, font_size: c_int);
437}
438
439// Basic shapes drawing functions
440extern "C" {
441    /// Draw a color-filled circle (Vector version)
442    #[link_name = "DrawCircleV"]
443    pub fn draw_circle_v(center: Vector2, radius: c_float, color: Color);
444    /// Draw a color-filled rectangle
445    #[link_name = "DrawRectangleRec"]
446    pub fn draw_rectangle_rec(rec: Rectangle, color: Color);
447    /// Draw a color-filled rectangle with pro parameters
448    #[link_name = "DrawRectanglePro"]
449    pub fn draw_rectangle_pro(rec: Rectangle, origin: Vector2, rotation: f32, color: Color);
450    /// Draw rectangle outline
451    #[link_name = "DrawRectangleLines"]
452    pub fn draw_rectangle_lines(
453        pos_x: c_int,
454        pos_y: c_int,
455        width: c_int,
456        height: c_int,
457        color: Color,
458    );
459    #[link_name = "DrawRectangleLinesEx"]
460    pub fn draw_rectangle_lines_ex(react: Rectangle, line_thickness: c_float, color: Color);
461}
462
463// Input-related functions: keyboard
464extern "C" {
465    /// Check if a key has been pressed once
466    #[link_name = "IsKeyPressed"]
467    pub fn is_key_pressed(key: KeyboardKey) -> bool;
468    /// Check if a key has been pressed again
469    #[link_name = "IsKeyPressedRepeat"]
470    pub fn is_key_pressed_repeat(key: KeyboardKey) -> bool;
471    /// Check if a key is being pressed
472    #[link_name = "IsKeyDown"]
473    pub fn is_key_down(key: KeyboardKey) -> bool;
474    /// Check if a key has been released once
475    #[link_name = "IsKeyReleased"]
476    pub fn is_key_released(key: KeyboardKey) -> bool;
477    /// Check if a key is **NOT** being pressed
478    #[link_name = "IsKeyUp"]
479    pub fn is_key_up(key: KeyboardKey) -> bool;
480    /// Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty
481    #[link_name = "GetKeyPressed"]
482    pub fn get_key_pressed() -> c_int;
483    /// Get char pressed (unicode), call it multiple times for chars queued, return s0 when the queue is empty
484    #[link_name = "GetCharPressed"]
485    pub fn get_char_pressed() -> c_int;
486    /// Set a custom key to exit program (default is [KeyboardKey::Escape])
487    #[link_name = "SetExitKey"]
488    pub fn set_exit_key(key: c_int);
489}
490
491// Input-related functions: gamepads
492extern "C" {
493    /// Check if a gamepad is available
494    #[link_name = "IsGamepadAvailable"]
495    pub fn is_gamepad_available(gamepad: c_int) -> bool;
496    /// Get gamepad internal name id
497    #[link_name = "GetGamepadName"]
498    pub fn get_gamepad_name(gamepad: c_int) -> *const c_char;
499    /// Check if a gamepad button has been pressed once
500    #[link_name = "IsGamepadButtonPressed"]
501    pub fn is_gamepad_button_pressed(gamepad: c_int, button: GamepadButton) -> bool;
502    /// Check if a gamepad button is being pressed
503    #[link_name = "IsGamepadButtonDown"]
504    pub fn is_gamepad_button_down(gamepad: c_int, button: GamepadButton) -> bool;
505    /// Check if a gamepad button has been released once
506    #[link_name = "IsGamepadButtonReleased"]
507    pub fn is_gamepad_button_released(gamepad: c_int, button: GamepadButton) -> bool;
508    /// Check if a gamepad button is **NOT** being pressed
509    #[link_name = "IsGamepadButtonUp"]
510    pub fn is_gamepad_button_up(gamepad: c_int, button: GamepadButton) -> bool;
511    /// Get the last gamepad button pressed
512    #[link_name = "GetGamepadButtonPressed"]
513    pub fn get_gamepad_button_pressed(gamepad: c_int) -> GamepadButton;
514    /// Get gamepad axis count for a gamepad
515    #[link_name = "GetGamepadAxisCount"]
516    pub fn get_gamepad_axis_count(gamepad: c_int) -> c_int;
517    /// Get axis movement value for a gamepad axis
518    #[link_name = "GetGamepadAxisMovement"]
519    pub fn get_gamepad_axis_movement(gamepad: c_int, axis: GamepadAxis) -> c_float;
520    /// Set gamepad vibration for both motors (duration in seconds)
521    #[link_name = "SetGamepadVibration"]
522    pub fn set_gamepad_vibration(
523        gamepad: c_int,
524        left_motor: c_float,
525        right_motor: c_float,
526        duration: c_float,
527    );
528}
529
530// Input-related functions: mouse
531extern "C" {
532    /// Check if a [MouseButton] has been pressed once
533    #[link_name = "IsMouseButtonPressed"]
534    pub fn is_mouse_button_pressed(button: MouseButton) -> bool;
535    /// Check if a [MouseButton] is beening pressed
536    #[link_name = "IsMouseButtonDown"]
537    pub fn is_mouse_button_down(button: MouseButton) -> bool;
538    /// Check if a [MouseButton] has been released once
539    #[link_name = "IsMouseButtonReleased"]
540    pub fn is_mouse_button_released(button: MouseButton) -> bool;
541    /// Check if a [MouseButton] is **NOT** being pressed
542    #[link_name = "IsMouseButtonUp"]
543    pub fn is_mouse_button_up(button: MouseButton) -> bool;
544    /// Get mouse position X
545    #[link_name = "GetMouseX"]
546    pub fn get_mouse_x() -> c_int;
547    /// Get mouse position Y
548    #[link_name = "GetMouseY"]
549    pub fn get_mouse_y() -> c_int;
550    /// Get mouse position XY
551    #[link_name = "GetMousePosition"]
552    pub fn get_mouse_position() -> Vector2;
553    /// Get mouse delta between frames
554    #[link_name = "GetMouseDelta"]
555    pub fn get_mouse_delta() -> Vector2;
556    /// Set mouse position XY
557    #[link_name = "SetMousePosition"]
558    pub fn set_mouse_position(x: c_int, y: c_int);
559    /// Set mouse offset
560    #[link_name = "SetMouseOffset"]
561    pub fn set_mouse_offset(offset_x: c_int, offset_y: c_int);
562    /// Set mouse scaling
563    #[link_name = "SetMouseScale"]
564    pub fn set_mouse_scale(scale_x: c_int, scale_y: c_int);
565    /// Get mouse wheel movement for X or Y, whichever is larger
566    #[link_name = "GetMouseWheelMove"]
567    pub fn get_mouse_wheel_move() -> c_float;
568    /// Get mouse wheel movement for both X or Y
569    #[link_name = "GetMouseWheelMoveV"]
570    pub fn get_mouse_wheel_move_v() -> Vector2;
571    /// Set mouse cursor
572    #[link_name = "SetMouseCursor"]
573    pub fn set_mouse_cursor(cursor: MouseCursor);
574}
575
576// Input-related functions: touch
577extern "C" {
578    /// Get touch position X for touch point 0 (relative to screen size)
579    #[link_name = "GetTouchX"]
580    pub fn get_touch_x() -> c_int;
581    /// Get touch position Y for touch point 0 (relative to screen size)
582    #[link_name = "GetTouchY"]
583    pub fn get_touch_y() -> c_int;
584    /// Get touch position XY for a touch point index (relative to screen size)
585    #[link_name = "GetTouchPosition"]
586    pub fn get_touch_position(index: c_int) -> Vector2;
587    /// Get touch point identifier for given index
588    #[link_name = "GetTouchPointId"]
589    pub fn get_touch_point_id(index: c_int) -> c_int;
590    /// Get number of touch points
591    #[link_name = "GetTouchPointCount"]
592    pub fn get_touch_point_count() -> c_int;
593}
594// Gestures and Touch handling functions
595extern "C" {
596    /// Enable a set of [Gesture] using flags
597    #[link_name = "SetGesturesEnabled"]
598    pub fn set_gestures_enabled(flags: Gesture);
599    /// Check if a [Gesture] have been detected
600    #[link_name = "IsGestureDetected"]
601    pub fn is_gesture_detected(gesture: Gesture);
602    /// Get latest detected [Gesture]
603    #[link_name = "GetGestureDetected"]
604    pub fn get_gesture_detected() -> Gesture;
605    /// Get [Gesture] hold time in seconds
606    #[link_name = "GetGestureHoldDuration"]
607    pub fn get_gesture_hold_duration() -> c_int;
608    /// Get [Gesture] drag [Vector2]
609    #[link_name = "GetGestureDragVector"]
610    pub fn get_gesture_drag_vector() -> Vector2;
611    /// Get [Gesture] drag angle
612    #[link_name = "GetGestureDragAngle"]
613    pub fn get_gesture_drag_angle() -> c_float;
614    /// Get [Gesture] pinch delta
615    #[link_name = "GetGesturePinchVector"]
616    pub fn get_gesture_pinch_vector() -> Vector2;
617    /// Get [Gesture] pinch angle
618    #[link_name = "GetGesturePinchAngle"]
619    pub fn get_gesture_pinch_angle() -> c_float;
620}
621
622// Timing-related functions
623extern "C" {
624    /// Set target FPS (maximum)
625    #[link_name = "SetTargetFPS"]
626    pub fn set_target_fps(fps: c_int);
627    /// Get time in seconds for last frame drawn (delta time)
628    #[link_name = "GetFrameTime"]
629    pub fn get_frame_time() -> c_float;
630    /// Get elapsed time in seconds since InitWindow()
631    #[link_name = "GetTime"]
632    pub fn get_time() -> c_double;
633    /// Get current FPS
634    #[link_name = "GetFPS"]
635    pub fn get_fps() -> c_int;
636}
637
638// Misc functions
639extern "C" {
640    /// Setup init configuration flags
641    ///
642    /// Flags should be of values defined in [ConfigFlag].
643    ///
644    /// Use this value as a bitmask.
645    ///
646    /// # Examples
647    /// ```no_run
648    /// use rustyray_sys::{ffi::set_config_flags, consts::ConfigFlag};
649    ///
650    /// unsafe { set_config_flags(ConfigFlag::VsyncHint) }
651    /// ```
652    #[link_name = "SetConfigFlags"]
653    pub fn set_config_flags(flags: ConfigFlag);
654}
655
656// Audio device management functions
657extern "C" {
658    /// Initialize audio device and context
659    #[link_name = "InitAudioDevice"]
660    pub fn init_audio_device();
661    /// Close the audio device and context
662    #[link_name = "CloseAudioDevice"]
663    pub fn close_audio_device();
664    /// Check if audio device has been initialized successfully
665    #[link_name = "IsAudioDeviceReady"]
666    pub fn is_audio_device_ready() -> bool;
667    /// Set master volume (listener)
668    #[link_name = "SetMasterVolume"]
669    pub fn set_master_volume(volume: c_float);
670    /// Get master volume (listener)
671    #[link_name = "GetMasterVolume"]
672    pub fn get_master_volume() -> c_float;
673}
674
675// Wave/Sound loading/unloading functions
676extern "C" {
677    /// Load wave data from file
678    #[link_name = "LoadWave"]
679    pub fn load_wave(file_name: *const c_char) -> Wave;
680    /// Load wave from memory buffer, file_type refers to extension: i.e. `.wav`
681    #[link_name = "LoadWaveFromMemory"]
682    pub fn load_wave_from_memory(
683        file_type: *const c_char,
684        file_data: *const c_uchar,
685        data_size: c_int,
686    ) -> Wave;
687    /// Checks if wave data is valid (data loaded and parameters)
688    #[link_name = "IsWaveValid"]
689    pub fn is_wave_valid(wave: Wave) -> bool;
690    /// Load sound from file
691    #[link_name = "LoadSound"]
692    pub fn load_sound(file_name: *const c_char) -> Sound;
693    /// Load sound from wave data
694    #[link_name = "LoadSoundFromWave"]
695    pub fn load_sound_from_wave(wave: Wave) -> Sound;
696    /// Create a new sound that shares the same sample data as the source sound, does not own the sound data
697    #[link_name = "LoadSoundAlias"]
698    pub fn load_sound_alias(source: Sound) -> Sound;
699    /// Checks if sound is valid (data loaded and buffers initialized)
700    #[link_name = "IsSoundValid"]
701    pub fn is_sound_valid(sound: Sound) -> bool;
702    /// Update sound buffer with new data
703    #[link_name = "UpdateSound"]
704    pub fn update_sound(sound: Sound, data: *const c_void, sample_count: c_int);
705    /// Unload wave data
706    #[link_name = "UnloadWave"]
707    pub fn unload_wave(wave: Wave);
708    /// Unload sound
709    #[link_name = "UnloadSound"]
710    pub fn unload_sound(sound: Sound);
711    /// Unload a sound alias (does not deallocate sample data)
712    #[link_name = "UnloadSoundAlias"]
713    pub fn unload_sound_alias(alias: Sound);
714    /// Export wave data to file, returns true on success
715    #[link_name = "ExportWave"]
716    pub fn export_wave(wave: Wave, file_name: *const c_char) -> bool;
717    /// Export wave sample data to code (.h), returns true on success
718    #[link_name = "ExportWaveAsCode"]
719    pub fn export_wave_as_code(wave: Wave, file_name: *const c_char) -> bool;
720}
721
722// Wave/Sound management functions
723extern "C" {
724    /// Play a sound
725    #[link_name = "PlaySound"]
726    pub fn play_sound(sound: Sound);
727    /// Stop playing a sound
728    #[link_name = "StopSound"]
729    pub fn stop_sound(sound: Sound);
730    /// Pause a sound
731    #[link_name = "PauseSound"]
732    pub fn pause_sound(sound: Sound);
733    /// Resume a paused sound
734    #[link_name = "ResumeSound"]
735    pub fn resume_sound(sound: Sound);
736    /// Check if a sound is currently playing
737    #[link_name = "IsSoundPlaying"]
738    pub fn is_sound_playing(sound: Sound) -> bool;
739    /// Set volume for a sound (1.0 is max level)
740    #[link_name = "SetSoundVolume"]
741    pub fn set_sound_volume(sound: Sound, volume: c_float);
742    /// Set pitch for a sound (1.0 is base level)
743    #[link_name = "SetSoundPitch"]
744    pub fn set_sound_pitch(sound: Sound, pitch: c_float);
745    /// Set pan for a sound (0.5 is center)
746    #[link_name = "SetSoundPan"]
747    pub fn set_sound_pan(sound: Sound, pan: c_float);
748    /// Copy the wave to a new wave
749    #[link_name = "WaveCopy"]
750    pub fn wave_copy(wave: Wave);
751    /// Crop a wave to defined frames range
752    #[link_name = "WaveCrop"]
753    pub fn wave_crop(wave: *mut Wave, init_frame: c_int, final_frame: c_int);
754    /// Convert wave data to desired format
755    #[link_name = "WaveFormat"]
756    pub fn wave_format(wave: *mut Wave, sample_rate: c_int, sample_size: c_int, channels: c_int);
757    /// Load samples data from wave as a 32bit float data array
758    #[link_name = "LoadWaveSamples"]
759    pub fn load_wave_samples(wave: Wave) -> *const c_float;
760    /// Unload samples data loaded with LoadWaveSamples()
761    #[link_name = "UnloadWaveSamples"]
762    pub fn unload_wave_samples(samples: *const c_float);
763}
764
765extern "C" {
766    /// Load music stream from file
767    #[link_name = "LoadMusicStream"]
768    pub fn load_music_stream(file_name: *const c_char) -> Music;
769    /// Load music stream from file
770    #[link_name = "LoadMusicStreamFromMemory"]
771    pub fn load_music_stream_from_memory(
772        file_type: *const c_char,
773        data: *const c_uchar,
774        data_size: c_int,
775    ) -> Music;
776    /// Checks if a music stream is valid (context and buffers initialized)
777    #[link_name = "IsMusicValid"]
778    pub fn is_music_valid(music: Music) -> bool;
779    /// Unload music stream
780    #[link_name = "UnloadMusicStream"]
781    pub fn unload_music_stream(music: Music);
782    /// Start music playing
783    #[link_name = "PlayMusicStream"]
784    pub fn play_music_stream(music: Music);
785    /// Checks if music is playing
786    #[link_name = "IsMusicStreamPlaying"]
787    pub fn is_music_stream_playing(music: Music) -> bool;
788    /// Updates buffers for music streaming
789    #[link_name = "UpdateMusicStream"]
790    pub fn update_music_stream(music: Music);
791    /// Stop music playing
792    #[link_name = "StopMusicStream"]
793    pub fn stop_music_stream(music: Music);
794    /// Pause music playing
795    #[link_name = "PauseMusicStream"]
796    pub fn pause_music_stream(music: Music);
797    /// Resume playing paused music
798    #[link_name = "ResumeMusicStream"]
799    pub fn resume_music_stream(music: Music);
800    /// Seek music to a position (in seconds)
801    #[link_name = "SeekMusicStream"]
802    pub fn seek_music_stream(music: Music, position: c_float);
803    /// Set volume for music (1.0 is max level)
804    #[link_name = "SetMusicVolume"]
805    pub fn set_music_volume(music: Music, volume: c_float);
806    /// Set pitch for music (1.0 is base level)
807    #[link_name = "SetMusicPitch"]
808    pub fn set_music_pitch(music: Music, pitch: c_float);
809    /// Set pan for music (0.5 is center)
810    #[link_name = "SetMusicPan"]
811    pub fn set_music_pan(music: Music, pan: c_float);
812    /// Get music time length (in seconds)
813    #[link_name = "GetMusicTimeLength"]
814    pub fn get_music_time_length(music: Music) -> c_float;
815    /// Get current music time played (in seconds)
816    #[link_name = "GetMusicTimePlayed"]
817    pub fn get_music_time_played(music: Music) -> c_float;
818}
819
820// AudioStream management functions
821extern "C" {
822    /// Load audio stream (to stream raw audio pcm data)
823    #[link_name = "LoadAudioStream"]
824    pub fn load_audio_stream(
825        sample_rate: c_uint,
826        sample_size: c_uint,
827        channels: c_uint,
828    ) -> AudioStream;
829    /// Checks if an audio stream is valid (buffers initialized)
830    #[link_name = "IsAudioStreamValid"]
831    pub fn is_audio_stream_valid(stream: AudioStream) -> bool;
832    /// Unload audio stream and free memory
833    #[link_name = "UnloadStreamValid"]
834    pub fn unload_stream_valid(stream: AudioStream);
835    /// Update audio stream buffers with data
836    #[link_name = "UpdateStreamValid"]
837    pub fn update_stream_valid(stream: AudioStream, data: *const c_void, frame_count: c_int);
838    /// Check if any audio stream buffers requires refill
839    #[link_name = "IsAudioStreamProcessed"]
840    pub fn is_audio_stream_processed(stream: AudioStream) -> bool;
841    /// Play audio stream
842    #[link_name = "PlayAudioStream"]
843    pub fn play_audio_stream(stream: AudioStream);
844    /// Pause audio stream
845    #[link_name = "PauseAudioStream"]
846    pub fn pause_audio_stream(stream: AudioStream);
847    /// Resume audio stream
848    #[link_name = "ResumeAudioStream"]
849    pub fn resume_audio_stream(stream: AudioStream);
850    /// Check if audio stream is playing
851    #[link_name = "IsAudioStreamPlaying"]
852    pub fn is_audio_stream_playing(stream: AudioStream) -> bool;
853    /// Stop audio stream
854    #[link_name = "StopAudioStream"]
855    pub fn stop_audio_stream(stream: AudioStream);
856    /// Set volume for audio stream (1.0 is max level)
857    #[link_name = "SetAudioStreamVolume"]
858    pub fn set_audio_stream_volume(stream: AudioStream, volume: c_float);
859    /// Set pitch for audio stream (1.0 is base level)
860    #[link_name = "SetAudioStreamPitch"]
861    pub fn set_audio_stream_pitch(stream: AudioStream, pitch: c_float);
862    /// Set pan for audio stream (0.5 is centered)
863    #[link_name = "SetAudioStreamPan"]
864    pub fn set_audio_stream_pan(stream: AudioStream, pan: c_float);
865    /// Default size for new audio streams
866    #[link_name = "SetAudioStreamBufferSizeDefault"]
867    pub fn set_audio_stream_buffer_size_default(size: c_int);
868    /// Audio thread callback to request new data
869    #[link_name = "SetAudioStreamCallback"]
870    pub fn set_audio_stream_callback(stream: AudioStream, callback: AudioCallback);
871
872    /// Attach audio stream processor to stream, receives the samples as 'float'
873    #[link_name = "AttachAudioStreamProcessor"]
874    pub fn attach_audio_stream_processor(stream: AudioStream, processor: AudioCallback);
875    /// Detach audio stream processor from stream
876    #[link_name = "DetachAudioStreamProcessor"]
877    pub fn detach_audio_stream_processor(stream: AudioStream, processor: AudioCallback);
878    /// Attach audio stream processor to the entire audio pipeline, receives the samples as 'float'
879    #[link_name = "AttachAudioMixedProcessor"]
880    pub fn attach_audio_mixed_processor(processor: AudioCallback);
881    /// Detach audio stream processor from the entire audio pipeline
882    #[link_name = "DetachAudioMixedProcessor"]
883    pub fn detach_audio_mixed_processor(processor: AudioCallback);
884}
885
886// Basic shapes collision detection functions
887extern "C" {
888    /// Check collision between two rectangles
889    #[link_name = "CheckCollisionRecs"]
890    pub fn check_collision_recs(rec1: Rectangle, rec2: Rectangle) -> bool;
891    /// Check collision between two circles
892    #[link_name = "CheckCollisionCircles"]
893    pub fn check_collision_circles(
894        center1: Vector2,
895        radius1: f32,
896        center2: Vector2,
897        radius2: f32,
898    ) -> bool;
899    /// Check collision between circle and rectangle
900    #[link_name = "CheckCollisionCircleRec"]
901    pub fn check_collision_circle_rec(center1: Vector2, radius1: c_float, rec: Rectangle) -> bool;
902    /// Check if circle collides with a line created betweeen two points [p1] and [p2]
903    #[link_name = "CheckCollisionCircleLine"]
904    pub fn check_collision_circle_line(
905        center: Vector2,
906        radius: f32,
907        p1: Vector2,
908        p2: Vector2,
909    ) -> bool;
910    /// Check if point is inside rectangle
911    #[link_name = "CheckCollisionPointRec"]
912    pub fn check_collision_point_rec(point: Vector2, rec: Rectangle) -> bool;
913    /// Check if point is inside circle
914    #[link_name = "CheckCollisionPointCircle"]
915    pub fn check_collision_point_circle(point: Vector2, center: Vector2, radius: c_float) -> bool;
916    /// Check if point is inside triangle
917    #[link_name = "CheckCollisionPointTriangle"]
918    pub fn check_collision_point_triangle(
919        point: Vector2,
920        p1: Vector2,
921        p2: Vector2,
922        p3: Vector2,
923    ) -> bool;
924    /// Check if point belongs to line created between two points [p1] and [p2] with defined margin in pixels [threshold]
925    #[link_name = "CheckCollisionPointLine"]
926    pub fn check_collision_point_line(
927        point: Vector2,
928        p1: Vector2,
929        p2: Vector2,
930        treshold: c_float,
931    ) -> bool;
932    /// Check if point is within a polygon described by array of vertices
933    #[link_name = "CheckCollisionPointPoly"]
934    pub fn check_collision_point_poly(
935        point: Vector2,
936        p1: *const Vector2,
937        point_count: c_int,
938    ) -> bool;
939    /// Get collision rectangle for two rectangles collision
940    #[link_name = "GetCollisionRec"]
941    pub fn get_collision_rec(rec1: Rectangle, rec2: Rectangle) -> Rectangle;
942}
943
944// Logging
945pub type TraceLogCallback = extern "C" fn(log_level: i32, text: *const c_char, args: *mut c_void);
946
947extern "C" {
948    #[link_name = "SetTraceLogCallback"]
949    pub fn set_trace_log_callback(callback: TraceLogCallback);
950}