/* Package vendor:raylib implements bindings for version 5.5 of the raylib library (https://www.raylib.com/) ********************************************************************************************* * * raylib v5.5 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com) * * FEATURES: * - NO external dependencies, all required libraries included with raylib * - Multiplatform: Windows, Linux, FreeBSD, OpenBSD, NetBSD, DragonFly, * MacOS, Haiku, Android, Raspberry Pi, DRM native, HTML5. * - Written in plain C code (C99) in PascalCase/camelCase notation * - Hardware accelerated with OpenGL (1.1, 2.1, 3.3, 4.3, ES2, ES3 - choose at compile) * - Unique OpenGL abstraction layer (usable as standalone module): [rlgl] * - Multiple Fonts formats supported (TTF, OTF, FNT, BDF, Sprite fonts) * - Outstanding texture formats support, including compressed formats (DXT, ETC, ASTC) * - Full 3d support for 3d Shapes, Models, Billboards, Heightmaps and more! * - Flexible Materials system, supporting classic maps and PBR maps * - Animated 3D models supported (skeletal bones animation) (IQM, M3D, GLTF) * - Shaders support, including Model shaders and Postprocessing shaders * - Powerful math module for Vector, Matrix and Quaternion operations: [raymath] * - Audio loading and playing with streaming support (WAV, OGG, MP3, FLAC, QOA, XM, MOD) * - VR stereo rendering with configurable HMD device parameters * - Bindings to multiple programming languages available! * * NOTES: * - One default Font is loaded on InitWindow()->LoadFontDefault() [core, text] * - One default Texture2D is loaded on rlglInit(), 1x1 white pixel R8G8B8A8 [rlgl] (OpenGL 3.3 or ES2) * - One default Shader is loaded on rlglInit()->rlLoadShaderDefault() [rlgl] (OpenGL 3.3 or ES2) * - One default RenderBatch is loaded on rlglInit()->rlLoadRenderBatch() [rlgl] (OpenGL 3.3 or ES2) * * DEPENDENCIES (included): * [rcore][GLFW] rglfw (Camilla Löwy - github.com/glfw/glfw) for window/context management and input * [rcore][RGFW] rgfw (ColleagueRiley - github.com/ColleagueRiley/RGFW) for window/context management and input * [rlgl] glad/glad_gles2 (David Herberth - github.com/Dav1dde/glad) for OpenGL 3.3 extensions loading * [raudio] miniaudio (David Reid - github.com/mackron/miniaudio) for audio device/context management * * OPTIONAL DEPENDENCIES (included): * [rcore] msf_gif (Miles Fogle) for GIF recording * [rcore] sinfl (Micha Mettke) for DEFLATE decompression algorithm * [rcore] sdefl (Micha Mettke) for DEFLATE compression algorithm * [rcore] rprand (Ramon Snatamaria) for pseudo-random numbers generation * [rtextures] qoi (Dominic Szablewski - https://phoboslab.org) for QOI image manage * [rtextures] stb_image (Sean Barret) for images loading (BMP, TGA, PNG, JPEG, HDR...) * [rtextures] stb_image_write (Sean Barret) for image writing (BMP, TGA, PNG, JPG) * [rtextures] stb_image_resize2 (Sean Barret) for image resizing algorithms * [rtextures] stb_perlin (Sean Barret) for Perlin Noise image generation * [rtext] stb_truetype (Sean Barret) for ttf fonts loading * [rtext] stb_rect_pack (Sean Barret) for rectangles packing * [rmodels] par_shapes (Philip Rideout) for parametric 3d shapes generation * [rmodels] tinyobj_loader_c (Syoyo Fujita) for models loading (OBJ, MTL) * [rmodels] cgltf (Johannes Kuhlmann) for models loading (glTF) * [rmodels] m3d (bzt) for models loading (M3D, https://bztsrc.gitlab.io/model3d) * [rmodels] vox_loader (Johann Nadalutti) for models loading (VOX) * [raudio] dr_wav (David Reid) for WAV audio file loading * [raudio] dr_flac (David Reid) for FLAC audio file loading * [raudio] dr_mp3 (David Reid) for MP3 audio file loading * [raudio] stb_vorbis (Sean Barret) for OGG audio loading * [raudio] jar_xm (Joshua Reisenauer) for XM audio module loading * [raudio] jar_mod (Joshua Reisenauer) for MOD audio module loading * [raudio] qoa (Dominic Szablewski - https://phoboslab.org) for QOA audio manage * * * LICENSE: zlib/libpng * * raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified, * BSD-like license that allows static linking with closed source software: * * Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) * * This software is provided "as-is", without any express or implied warranty. In no event * will the authors be held liable for any damages arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, including commercial * applications, and to alter it and redistribute it freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not claim that you * wrote the original software. If you use this software in a product, an acknowledgment * in the product documentation would be appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not be misrepresented * as being the original software. * * 3. This notice may not be removed or altered from any source distribution. * ********************************************************************************************* */ package raylib import "core:c" import "core:fmt" import "core:mem" import "core:math/linalg" _ :: linalg MAX_TEXTFORMAT_BUFFERS :: #config(RAYLIB_MAX_TEXTFORMAT_BUFFERS, 4) MAX_TEXT_BUFFER_LENGTH :: #config(RAYLIB_MAX_TEXT_BUFFER_LENGTH, 1024) #assert(size_of(rune) == size_of(c.int)) RAYLIB_SHARED :: #config(RAYLIB_SHARED, false) when ODIN_OS == .Windows { @(extra_linker_flags = "/NODEFAULTLIB:" + ("msvcrt" when RAYLIB_SHARED else "libcmt")) foreign import lib {"windows/raylibdll.lib" when RAYLIB_SHARED else "windows/raylib.lib", "system:Winmm.lib", "system:Gdi32.lib", "system:User32.lib", "system:Shell32.lib"} } else when ODIN_OS == .Linux { foreign import lib {// Note(bumbread): I'm not sure why in `linux/` folder there are // multiple copies of raylib.so, but since these bindings are for "src/libraylib.so.550" when RAYLIB_SHARED else "src/libraylib.a", "system:dl", "system:pthread"} // particular version of the library, I better specify it. Ideally,// though, it's best specified in terms of major (.so.4) } else when ODIN_OS == .Darwin { foreign import lib {"src/libraylib.550.dylib" when RAYLIB_SHARED else "src/libraylib.a", "system:Cocoa.framework", "system:OpenGL.framework", "system:IOKit.framework"} } else { foreign import lib "system:raylib" } VERSION_MAJOR :: 5 VERSION_MINOR :: 5 VERSION_PATCH :: 0 VERSION :: "5.5" PI :: 3.14159265358979323846 DEG2RAD :: PI / 180.0 RAD2DEG :: 180.0 / PI // Some Basic Colors // NOTE: Custom raylib color palette for amazing visuals on WHITE background LIGHTGRAY :: Color{200, 200, 200, 255} // Light Gray GRAY :: Color{130, 130, 130, 255} // Gray DARKGRAY :: Color{80, 80, 80, 255} // Dark Gray YELLOW :: Color{253, 249, 0, 255} // Yellow GOLD :: Color{255, 203, 0, 255} // Gold ORANGE :: Color{255, 161, 0, 255} // Orange PINK :: Color{255, 109, 194, 255} // Pink RED :: Color{230, 41, 55, 255} // Red MAROON :: Color{190, 33, 55, 255} // Maroon GREEN :: Color{0, 228, 48, 255} // Green LIME :: Color{0, 158, 47, 255} // Lime DARKGREEN :: Color{0, 117, 44, 255} // Dark Green SKYBLUE :: Color{102, 191, 255, 255} // Sky Blue BLUE :: Color{0, 121, 241, 255} // Blue DARKBLUE :: Color{0, 82, 172, 255} // Dark Blue PURPLE :: Color{200, 122, 255, 255} // Purple VIOLET :: Color{135, 60, 190, 255} // Violet DARKPURPLE :: Color{112, 31, 126, 255} // Dark Purple BEIGE :: Color{211, 176, 131, 255} // Beige BROWN :: Color{127, 106, 79, 255} // Brown DARKBROWN :: Color{76, 63, 47, 255} // Dark Brown WHITE :: Color{255, 255, 255, 255} // White BLACK :: Color{0, 0, 0, 255} // Black BLANK :: Color{0, 0, 0, 0} // Blank (Transparent) MAGENTA :: Color{255, 0, 255, 255} // Magenta RAYWHITE :: Color{245, 245, 245, 255} // My own White (raylib logo) // Vector2 type Vector2 :: [2]f32 // Vector3 type Vector3 :: [3]f32 // Vector4 type Vector4 :: [4]f32 // Quaternion type Quaternion :: quaternion128 // Matrix type (right handed, stored row major) Matrix :: # row_major matrix[4, 4]f32 // Color, 4 components, R8G8B8A8 (32bit) // // Note: In Raylib this is a struct. But here we use a fixed array, so that .rgba swizzling etc work. Color :: distinct [4]u8 // Rectangle type Rectangle :: struct { x: f32, // Rectangle top-left corner position x y: f32, // Rectangle top-left corner position y width: f32, // Rectangle width height: f32, // Rectangle height } // Image type, bpp always RGBA (32bit) // NOTE: Data stored in CPU memory (RAM) Image :: struct { data: rawptr, // Image raw data width: c.int, // Image base width height: c.int, // Image base height mipmaps: c.int, // Mipmap levels, 1 by default format: PixelFormat, // Data format (PixelFormat type) } // Texture type // NOTE: Data stored in GPU memory Texture :: struct { id: c.uint, // OpenGL texture id width: c.int, // Texture base width height: c.int, // Texture base height mipmaps: c.int, // Mipmap levels, 1 by default format: PixelFormat, // Data format (PixelFormat type) } // Texture2D type, same as Texture Texture2D :: Texture // TextureCubemap type, actually, same as Texture TextureCubemap :: Texture // RenderTexture type, for texture rendering RenderTexture :: struct { id: c.uint, // OpenGL framebuffer object id texture: Texture, // Color buffer attachment texture depth: Texture, // Depth buffer attachment texture } // RenderTexture2D type, same as RenderTexture RenderTexture2D :: RenderTexture // N-Patch layout info NPatchInfo :: struct { source: Rectangle, // Texture source rectangle left: c.int, // Left border offset top: c.int, // Top border offset right: c.int, // Right border offset bottom: c.int, // Bottom border offset layout: NPatchLayout, // Layout of the n-patch: 3x3, 1x3 or 3x1 } // Font character info GlyphInfo :: struct { value: rune, // Character value (Unicode) offsetX: c.int, // Character offset X when drawing offsetY: c.int, // Character offset Y when drawing advanceX: c.int, // Character advance position X image: Image, // Character image data } // Font type, includes texture and charSet array data Font :: struct { baseSize: c.int, // Base size (default chars height) glyphCount: c.int, // Number of characters glyphPadding: c.int, // Padding around the chars texture: Texture2D, // Characters texture atlas recs: [^]Rectangle, // Characters rectangles in texture glyphs: [^]GlyphInfo, // Characters info data } // Camera type, defines a camera position/orientation in 3d space Camera3D :: struct { position: Vector3, // Camera position target: Vector3, // Camera target it looks-at up: Vector3, // Camera up vector (rotation over its axis) fovy: f32, // Camera field-of-view apperture in Y (degrees) in perspective, used as near plane width in orthographic projection: CameraProjection, // Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC } Camera :: Camera3D // Camera type fallback, defaults to Camera3D // Camera2D type, defines a 2d camera Camera2D :: struct { offset: Vector2, // Camera offset (displacement from target) target: Vector2, // Camera target (rotation and zoom origin) rotation: f32, // Camera rotation in degrees zoom: f32, // Camera zoom (scaling), should be 1.0f by default } // Vertex data defining a mesh // NOTE: Data stored in CPU memory (and GPU) Mesh :: struct { vertexCount: c.int, // Number of vertices stored in arrays triangleCount: c.int, // Number of triangles stored (indexed or not) // Default vertex data vertices: [^]f32, // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) texcoords: [^]f32, // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) texcoords2: [^]f32, // Vertex second texture coordinates (useful for lightmaps) (shader-location = 5) normals: [^]f32, // Vertex normals (XYZ - 3 components per vertex) (shader-location = 2) tangents: [^]f32, // Vertex tangents (XYZW - 4 components per vertex) (shader-location = 4) colors: [^]u8, // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) indices: [^]u16, // Vertex indices (in case vertex data comes indexed) // Animation vertex data animVertices: [^]f32, // Animated vertex positions (after bones transformations) animNormals: [^]f32, // Animated normals (after bones transformations) boneIds: [^]u8, // Vertex bone ids, up to 4 bones influence by vertex (skinning) boneWeights: [^]f32, // Vertex bone weight, up to 4 bones influence by vertex (skinning) boneMatrices: [^]Matrix, // Bones animated transformation matrices boneCount: c.int, // Number of bones // OpenGL identifiers vaoId: u32, // OpenGL Vertex Array Object id vboId: [^]u32, // OpenGL Vertex Buffer Objects id (default vertex data) } // Shader type (generic) Shader :: struct { id: c.uint, // Shader program id locs: [^]c.int, // Shader locations array (MAX_SHADER_LOCATIONS) } // Material texture map MaterialMap :: struct { texture: Texture2D, // Material map texture color: Color, // Material map color value: f32, // Material map value } // Material type (generic) Material :: struct { shader: Shader, // Material shader maps: [^]MaterialMap, // Material maps array (MAX_MATERIAL_MAPS) params: [4]f32, // Material generic parameters (if required) } // Transformation properties Transform :: struct { translation: Vector3, // Translation rotation: Quaternion, // Rotation scale: Vector3, // Scale } // Bone information BoneInfo :: struct { name: [32]byte `fmt:"s,0"`, // Bone name parent: c.int, // Bone parent } // Model type Model :: struct #align (align_of(uintptr)) { transform: Matrix, // Local transform matrix meshCount: c.int, // Number of meshes materialCount: c.int, // Number of materials meshes: [^]Mesh, // Meshes array materials: [^]Material, // Materials array meshMaterial: [^]c.int, // Mesh material number // Animation data boneCount: c.int, // Number of bones bones: [^]BoneInfo, // Bones information (skeleton) bindPose: [^]Transform, // Bones base transformation (pose) } // Model animation ModelAnimation :: struct { boneCount: c.int, // Number of bones frameCount: c.int, // Number of animation frames bones: [^]BoneInfo, // Bones information (skeleton) framePoses: [^][^]Transform, // Poses array by frame name: [32]byte `fmt:"s,0"`, // Animation name } // Ray type (useful for raycast) Ray :: struct { position: Vector3, // Ray position (origin) direction: Vector3, // Ray direction (normalized) } // RayCollision, ray hit information RayCollision :: struct { hit: bool, // Did the ray hit something? distance: f32, // Distance to nearest hit point: Vector3, // Point of nearest hit normal: Vector3, // Surface normal of hit } // Bounding box type BoundingBox :: struct { min: Vector3, // Minimum vertex box-corner max: Vector3, // Maximum vertex box-corner } // Wave type, defines audio wave data Wave :: struct { frameCount: c.uint, // Total number of frames (considering channels) sampleRate: c.uint, // Frequency (samples per second) sampleSize: c.uint, // Bit depth (bits per sample): 8, 16, 32 (24 not supported) channels: c.uint, // Number of channels (1-mono, 2-stereo) data: rawptr, // Buffer data pointer } // Audio stream type // NOTE: Actual structs are defined internally in raudio module AudioStream :: struct { buffer: rawptr, // Pointer to internal data used by the audio system processor: rawptr, // Pointer to internal data processor, useful for audio effects sampleRate: c.uint, // Frequency (samples per second) sampleSize: c.uint, // Bit depth (bits per sample): 8, 16, 32 (24 not supported) channels: c.uint, // Number of channels (1-mono, 2-stereo) } // Sound source type Sound :: struct { using stream: AudioStream, // Audio stream frameCount: c.uint, // Total number of frames (considering channels) } // Music stream type (audio file streaming from memory) // NOTE: Anything longer than ~10 seconds should be streamed Music :: struct { using stream: AudioStream, // Audio stream frameCount: c.uint, // Total number of frames (considering channels) looping: bool, // Music looping enable ctxType: c.int, // Type of music context (audio filetype) ctxData: rawptr, // Audio context data, depends on type } // Head-Mounted-Display device parameters VrDeviceInfo :: struct { hResolution: c.int, // Horizontal resolution in pixels vResolution: c.int, // Vertical resolution in pixels hScreenSize: f32, // Horizontal size in meters vScreenSize: f32, // Vertical size in meters eyeToScreenDistance: f32, // Distance between eye and display in meters lensSeparationDistance: f32, // Lens separation distance in meters interpupillaryDistance: f32, // IPD (distance between pupils) in meters lensDistortionValues: [4]f32, // Lens distortion constant parameters chromaAbCorrection: [4]f32, // Chromatic aberration correction parameters } // VR Stereo rendering configuration for simulator VrStereoConfig :: struct #align (4) { projection: [2]Matrix, // VR projection matrices (per eye) viewOffset: [2]Matrix, // VR view offset matrices (per eye) leftLensCenter: [2]f32, // VR left lens center rightLensCenter: [2]f32, // VR right lens center leftScreenCenter: [2]f32, // VR left screen center rightScreenCenter: [2]f32, // VR right screen center scale: [2]f32, // VR distortion scale scaleIn: [2]f32, // VR distortion scale in } // File path list FilePathList :: struct { capacity: c.uint, // Filepaths max entries count: c.uint, // Filepaths entries count paths: [^]cstring, // Filepaths entries } // Automation event AutomationEvent :: struct { frame: c.uint, // Event frame type: c.uint, // Event type (AutomationEventType) params: [4]c.int, // Event parameters (if required) --- } // Automation event list AutomationEventList :: struct { capacity: c.uint, // Events max entries (MAX_AUTOMATION_EVENTS) count: c.uint, // Events entries count events: [^]AutomationEvent, // Events entries } //---------------------------------------------------------------------------------- // Enumerators Definition //---------------------------------------------------------------------------------- // System/Window config flags // NOTE: Every bit registers one state (use it with bit masks) // By default all flags are set to 0 ConfigFlag :: enum c.int { VSYNC_HINT = 6, // Set to try enabling V-Sync on GPU FULLSCREEN_MODE = 1, // Set to run program in fullscreen WINDOW_RESIZABLE = 2, // Set to allow resizable window WINDOW_UNDECORATED = 3, // Set to disable window decoration (frame and buttons) WINDOW_HIDDEN = 7, // Set to hide window WINDOW_MINIMIZED = 9, // Set to minimize window (iconify) WINDOW_MAXIMIZED = 10, // Set to maximize window (expanded to monitor) WINDOW_UNFOCUSED = 11, // Set to window non focused WINDOW_TOPMOST = 12, // Set to window always on top WINDOW_ALWAYS_RUN = 8, // Set to allow windows running while minimized WINDOW_TRANSPARENT = 4, // Set to allow transparent framebuffer WINDOW_HIGHDPI = 13, // Set to support HighDPI WINDOW_MOUSE_PASSTHROUGH = 14, // Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED BORDERLESS_WINDOWED_MODE = 15, // Set to run program in borderless windowed mode MSAA_4X_HINT = 5, // Set to try enabling MSAA 4X INTERLACED_HINT = 16, // Set to try enabling interlaced video format (for V3D) } ConfigFlags :: distinct bit_set[ConfigFlag;c.int] // Trace log level TraceLogLevel :: enum c.int { ALL = 0, // Display all logs TRACE, // Trace logging, intended for internal use only DEBUG, // Debug logging, used for internal debugging, it should be disabled on release builds INFO, // Info logging, used for program execution info WARNING, // Warning logging, used on recoverable failures ERROR, // Error logging, used on unrecoverable failures FATAL, // Fatal logging, used to abort program: exit(EXIT_FAILURE) NONE, // Disable logging } // Keyboard keys (US keyboard layout) // NOTE: Use GetKeyPressed() to allow redefining // required keys for alternative layouts KeyboardKey :: enum c.int { KEY_NULL = 0, // Key: NULL, used for no key pressed // Alphanumeric keys APOSTROPHE = 39, // Key: ' COMMA = 44, // Key: , MINUS = 45, // Key: - PERIOD = 46, // Key: . SLASH = 47, // Key: / ZERO = 48, // Key: 0 ONE = 49, // Key: 1 TWO = 50, // Key: 2 THREE = 51, // Key: 3 FOUR = 52, // Key: 4 FIVE = 53, // Key: 5 SIX = 54, // Key: 6 SEVEN = 55, // Key: 7 EIGHT = 56, // Key: 8 NINE = 57, // Key: 9 SEMICOLON = 59, // Key: ; EQUAL = 61, // Key: = A = 65, // Key: A | a B = 66, // Key: B | b C = 67, // Key: C | c D = 68, // Key: D | d E = 69, // Key: E | e F = 70, // Key: F | f G = 71, // Key: G | g H = 72, // Key: H | h I = 73, // Key: I | i J = 74, // Key: J | j K = 75, // Key: K | k L = 76, // Key: L | l M = 77, // Key: M | m N = 78, // Key: N | n O = 79, // Key: O | o P = 80, // Key: P | p Q = 81, // Key: Q | q R = 82, // Key: R | r S = 83, // Key: S | s T = 84, // Key: T | t U = 85, // Key: U | u V = 86, // Key: V | v W = 87, // Key: W | w X = 88, // Key: X | x Y = 89, // Key: Y | y Z = 90, // Key: Z | z LEFT_BRACKET = 91, // Key: [ BACKSLASH = 92, // Key: '\' RIGHT_BRACKET = 93, // Key: ] GRAVE = 96, // Key: ` // Function keys SPACE = 32, // Key: Space ESCAPE = 256, // Key: Esc ENTER = 257, // Key: Enter TAB = 258, // Key: Tab BACKSPACE = 259, // Key: Backspace INSERT = 260, // Key: Ins DELETE = 261, // Key: Del RIGHT = 262, // Key: Cursor right LEFT = 263, // Key: Cursor left DOWN = 264, // Key: Cursor down UP = 265, // Key: Cursor up PAGE_UP = 266, // Key: Page up PAGE_DOWN = 267, // Key: Page down HOME = 268, // Key: Home END = 269, // Key: End CAPS_LOCK = 280, // Key: Caps lock SCROLL_LOCK = 281, // Key: Scroll down NUM_LOCK = 282, // Key: Num lock PRINT_SCREEN = 283, // Key: Print screen PAUSE = 284, // Key: Pause F1 = 290, // Key: F1 F2 = 291, // Key: F2 F3 = 292, // Key: F3 F4 = 293, // Key: F4 F5 = 294, // Key: F5 F6 = 295, // Key: F6 F7 = 296, // Key: F7 F8 = 297, // Key: F8 F9 = 298, // Key: F9 F10 = 299, // Key: F10 F11 = 300, // Key: F11 F12 = 301, // Key: F12 LEFT_SHIFT = 340, // Key: Shift left LEFT_CONTROL = 341, // Key: Control left LEFT_ALT = 342, // Key: Alt left LEFT_SUPER = 343, // Key: Super left RIGHT_SHIFT = 344, // Key: Shift right RIGHT_CONTROL = 345, // Key: Control right RIGHT_ALT = 346, // Key: Alt right RIGHT_SUPER = 347, // Key: Super right KB_MENU = 348, // Key: KB menu // Keypad keys KP_0 = 320, // Key: Keypad 0 KP_1 = 321, // Key: Keypad 1 KP_2 = 322, // Key: Keypad 2 KP_3 = 323, // Key: Keypad 3 KP_4 = 324, // Key: Keypad 4 KP_5 = 325, // Key: Keypad 5 KP_6 = 326, // Key: Keypad 6 KP_7 = 327, // Key: Keypad 7 KP_8 = 328, // Key: Keypad 8 KP_9 = 329, // Key: Keypad 9 KP_DECIMAL = 330, // Key: Keypad . KP_DIVIDE = 331, // Key: Keypad / KP_MULTIPLY = 332, // Key: Keypad * KP_SUBTRACT = 333, // Key: Keypad - KP_ADD = 334, // Key: Keypad + KP_ENTER = 335, // Key: Keypad Enter KP_EQUAL = 336, // Key: Keypad = // Android key buttons BACK = 4, // Key: Android back button MENU = 5, // Key: Android menu button VOLUME_UP = 24, // Key: Android volume up button VOLUME_DOWN = 25, // Key: Android volume down button } // Mouse buttons MouseButton :: enum c.int { LEFT = 0, // Mouse button left RIGHT = 1, // Mouse button right MIDDLE = 2, // Mouse button middle (pressed wheel) SIDE = 3, // Mouse button side (advanced mouse device) EXTRA = 4, // Mouse button extra (advanced mouse device) FORWARD = 5, // Mouse button fordward (advanced mouse device) BACK = 6, // Mouse button back (advanced mouse device) } // Mouse cursor MouseCursor :: enum c.int { DEFAULT = 0, // Default pointer shape ARROW = 1, // Arrow shape IBEAM = 2, // Text writing cursor shape CROSSHAIR = 3, // Cross shape POINTING_HAND = 4, // Pointing hand cursor RESIZE_EW = 5, // Horizontal resize/move arrow shape RESIZE_NS = 6, // Vertical resize/move arrow shape RESIZE_NWSE = 7, // Top-left to bottom-right diagonal resize/move arrow shape RESIZE_NESW = 8, // The top-right to bottom-left diagonal resize/move arrow shape RESIZE_ALL = 9, // The omnidirectional resize/move cursor shape NOT_ALLOWED = 10, // The operation-not-allowed shape } // Gamepad buttons GamepadButton :: enum c.int { UNKNOWN = 0, // Unknown button, just for error checking LEFT_FACE_UP, // Gamepad left DPAD up button LEFT_FACE_RIGHT, // Gamepad left DPAD right button LEFT_FACE_DOWN, // Gamepad left DPAD down button LEFT_FACE_LEFT, // Gamepad left DPAD left button RIGHT_FACE_UP, // Gamepad right button up (i.e. PS3: Triangle, Xbox: Y) RIGHT_FACE_RIGHT, // Gamepad right button right (i.e. PS3: Circle, Xbox: B) RIGHT_FACE_DOWN, // Gamepad right button down (i.e. PS3: Cross, Xbox: A) RIGHT_FACE_LEFT, // Gamepad right button left (i.e. PS3: Square, Xbox: X) LEFT_TRIGGER_1, // Gamepad top/back trigger left (first), it could be a trailing button LEFT_TRIGGER_2, // Gamepad top/back trigger left (second), it could be a trailing button RIGHT_TRIGGER_1, // Gamepad top/back trigger right (first), it could be a trailing button RIGHT_TRIGGER_2, // Gamepad top/back trigger right (second), it could be a trailing button MIDDLE_LEFT, // Gamepad center buttons, left one (i.e. PS3: Select) MIDDLE, // Gamepad center buttons, middle one (i.e. PS3: PS, Xbox: XBOX) MIDDLE_RIGHT, // Gamepad center buttons, right one (i.e. PS3: Start) LEFT_THUMB, // Gamepad joystick pressed button left RIGHT_THUMB, // Gamepad joystick pressed button right } // Gamepad axis GamepadAxis :: enum c.int { LEFT_X = 0, // Gamepad left stick X axis LEFT_Y = 1, // Gamepad left stick Y axis RIGHT_X = 2, // Gamepad right stick X axis RIGHT_Y = 3, // Gamepad right stick Y axis LEFT_TRIGGER = 4, // Gamepad back trigger left, pressure level: [1..-1] RIGHT_TRIGGER = 5, // Gamepad back trigger right, pressure level: [1..-1] } // Material map index MaterialMapIndex :: enum c.int { ALBEDO = 0, // Albedo material (same as: MATERIAL_MAP_DIFFUSE) METALNESS, // Metalness material (same as: MATERIAL_MAP_SPECULAR) NORMAL, // Normal material ROUGHNESS, // Roughness material OCCLUSION, // Ambient occlusion material EMISSION, // Emission material HEIGHT, // Heightmap material CUBEMAP, // Cubemap material (NOTE: Uses GL_TEXTURE_CUBE_MAP) IRRADIANCE, // Irradiance material (NOTE: Uses GL_TEXTURE_CUBE_MAP) PREFILTER, // Prefilter material (NOTE: Uses GL_TEXTURE_CUBE_MAP) BRDF, // Brdf material } // Shader location index ShaderLocationIndex :: enum c.int { VERTEX_POSITION = 0, // Shader location: vertex attribute: position VERTEX_TEXCOORD01, // Shader location: vertex attribute: texcoord01 VERTEX_TEXCOORD02, // Shader location: vertex attribute: texcoord02 VERTEX_NORMAL, // Shader location: vertex attribute: normal VERTEX_TANGENT, // Shader location: vertex attribute: tangent VERTEX_COLOR, // Shader location: vertex attribute: color MATRIX_MVP, // Shader location: matrix uniform: model-view-projection MATRIX_VIEW, // Shader location: matrix uniform: view (camera transform) MATRIX_PROJECTION, // Shader location: matrix uniform: projection MATRIX_MODEL, // Shader location: matrix uniform: model (transform) MATRIX_NORMAL, // Shader location: matrix uniform: normal VECTOR_VIEW, // Shader location: vector uniform: view COLOR_DIFFUSE, // Shader location: vector uniform: diffuse color COLOR_SPECULAR, // Shader location: vector uniform: specular color COLOR_AMBIENT, // Shader location: vector uniform: ambient color MAP_ALBEDO, // Shader location: sampler2d texture: albedo (same as: SHADER_LOC_MAP_DIFFUSE) MAP_METALNESS, // Shader location: sampler2d texture: metalness (same as: SHADER_LOC_MAP_SPECULAR) MAP_NORMAL, // Shader location: sampler2d texture: normal MAP_ROUGHNESS, // Shader location: sampler2d texture: roughness MAP_OCCLUSION, // Shader location: sampler2d texture: occlusion MAP_EMISSION, // Shader location: sampler2d texture: emission MAP_HEIGHT, // Shader location: sampler2d texture: height MAP_CUBEMAP, // Shader location: samplerCube texture: cubemap MAP_IRRADIANCE, // Shader location: samplerCube texture: irradiance MAP_PREFILTER, // Shader location: samplerCube texture: prefilter MAP_BRDF, // Shader location: sampler2d texture: brdf VERTEX_BONEIDS, // Shader location: vertex attribute: boneIds VERTEX_BONEWEIGHTS, // Shader location: vertex attribute: boneWeights BONE_MATRICES, // Shader location: array of matrices uniform: boneMatrices } // Shader uniform data type ShaderUniformDataType :: enum c.int { FLOAT = 0, // Shader uniform type: float VEC2, // Shader uniform type: vec2 (2 float) VEC3, // Shader uniform type: vec3 (3 float) VEC4, // Shader uniform type: vec4 (4 float) INT, // Shader uniform type: int IVEC2, // Shader uniform type: ivec2 (2 int) IVEC3, // Shader uniform type: ivec3 (3 int) IVEC4, // Shader uniform type: ivec4 (4 int) SAMPLER2D, // Shader uniform type: sampler2d } // Pixel formats // NOTE: Support depends on OpenGL version and platform PixelFormat :: enum c.int { UNKNOWN = 0, UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha) UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels) UNCOMPRESSED_R5G6B5, // 16 bpp UNCOMPRESSED_R8G8B8, // 24 bpp UNCOMPRESSED_R5G5B5A1, // 16 bpp (1 bit alpha) UNCOMPRESSED_R4G4B4A4, // 16 bpp (4 bit alpha) UNCOMPRESSED_R8G8B8A8, // 32 bpp UNCOMPRESSED_R32, // 32 bpp (1 channel - float) UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float) UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float) UNCOMPRESSED_R16, // 16 bpp (1 channel - float) UNCOMPRESSED_R16G16B16, // 16*3 bpp (3 channels - float) UNCOMPRESSED_R16G16B16A16, // 16*4 bpp (4 channels - float) COMPRESSED_DXT1_RGB, // 4 bpp (no alpha) COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha) COMPRESSED_DXT3_RGBA, // 8 bpp COMPRESSED_DXT5_RGBA, // 8 bpp COMPRESSED_ETC1_RGB, // 4 bpp COMPRESSED_ETC2_RGB, // 4 bpp COMPRESSED_ETC2_EAC_RGBA, // 8 bpp COMPRESSED_PVRT_RGB, // 4 bpp COMPRESSED_PVRT_RGBA, // 4 bpp COMPRESSED_ASTC_4x4_RGBA, // 8 bpp COMPRESSED_ASTC_8x8_RGBA, // 2 bpp } // Texture parameters: filter mode // NOTE 1: Filtering considers mipmaps if available in the texture // NOTE 2: Filter is accordingly set for minification and magnification TextureFilter :: enum c.int { POINT = 0, // No filter, just pixel approximation BILINEAR, // Linear filtering TRILINEAR, // Trilinear filtering (linear with mipmaps) ANISOTROPIC_4X, // Anisotropic filtering 4x ANISOTROPIC_8X, // Anisotropic filtering 8x ANISOTROPIC_16X, // Anisotropic filtering 16x } // Texture parameters: wrap mode TextureWrap :: enum c.int { REPEAT = 0, // Repeats texture in tiled mode CLAMP, // Clamps texture to edge pixel in tiled mode MIRROR_REPEAT, // Mirrors and repeats the texture in tiled mode MIRROR_CLAMP, // Mirrors and clamps to border the texture in tiled mode } // Cubemap layouts CubemapLayout :: enum c.int { AUTO_DETECT = 0, // Automatically detect layout type LINE_VERTICAL, // Layout is defined by a vertical line with faces LINE_HORIZONTAL, // Layout is defined by an horizontal line with faces CROSS_THREE_BY_FOUR, // Layout is defined by a 3x4 cross with cubemap faces CROSS_FOUR_BY_THREE, // Layout is defined by a 4x3 cross with cubemap faces } // Font type, defines generation method FontType :: enum c.int { DEFAULT = 0, // Default font generation, anti-aliased BITMAP, // Bitmap font generation, no anti-aliasing SDF, // SDF font generation, requires external shader } // Color blending modes (pre-defined) BlendMode :: enum c.int { ALPHA = 0, // Blend textures considering alpha (default) ADDITIVE, // Blend textures adding colors MULTIPLIED, // Blend textures multiplying colors ADD_COLORS, // Blend textures adding colors (alternative) SUBTRACT_COLORS, // Blend textures subtracting colors (alternative) ALPHA_PREMULTIPLY, // Blend premultiplied textures considering alpha CUSTOM, // Blend textures using custom src/dst factors (use rlSetBlendFactors()) CUSTOM_SEPARATE, // Blend textures using custom rgb/alpha separate src/dst factors (use rlSetBlendFactorsSeparate()) } // Gestures // NOTE: It could be used as flags to enable only some gestures Gesture :: enum c.uint { TAP = 0, // Tap gesture DOUBLETAP = 1, // Double tap gesture HOLD = 2, // Hold gesture DRAG = 3, // Drag gesture SWIPE_RIGHT = 4, // Swipe right gesture SWIPE_LEFT = 5, // Swipe left gesture SWIPE_UP = 6, // Swipe up gesture SWIPE_DOWN = 7, // Swipe down gesture PINCH_IN = 8, // Pinch in gesture PINCH_OUT = 9, // Pinch out gesture } Gestures :: distinct bit_set[Gesture;c.uint] // Camera system modes CameraMode :: enum c.int { CUSTOM = 0, // Camera custom, controlled by user (UpdateCamera() does nothing) FREE, // Camera free mode ORBITAL, // Camera orbital, around target, zoom supported FIRST_PERSON, // Camera first person THIRD_PERSON, // Camera third person } // Camera projection CameraProjection :: enum c.int { PERSPECTIVE = 0, // Perspective projection ORTHOGRAPHIC, // Orthographic projection } // N-patch layout NPatchLayout :: enum c.int { NINE_PATCH = 0, // Npatch layout: 3x3 tiles THREE_PATCH_VERTICAL, // Npatch layout: 1x3 tiles THREE_PATCH_HORIZONTAL, // Npatch layout: 3x1 tiles } // Callbacks to hook some internal functions // WARNING: This callbacks are intended for advanced users TraceLogCallback :: #type proc "c" (logLevel: TraceLogLevel, text: cstring, args: ^c.va_list) // Logging: Redirect trace log messages LoadFileDataCallback :: #type proc "c" (fileName: cstring, dataSize: ^c.int) -> [^]u8 // FileIO: Load binary data SaveFileDataCallback :: #type proc "c" (fileName: cstring, data: rawptr, dataSize: c.int) -> bool // FileIO: Save binary data LoadFileTextCallback :: #type proc "c" (fileName: cstring) -> [^]u8 // FileIO: Load text data SaveFileTextCallback :: #type proc "c" (fileName: cstring, text: cstring) -> bool // FileIO: Save text data AudioCallback :: #type proc "c" (bufferData: rawptr, frames: c.uint) @(default_calling_convention = "c") foreign lib { //------------------------------------------------------------------------------------ // Global Variables Definition //------------------------------------------------------------------------------------ // It's lonely here... //------------------------------------------------------------------------------------ // Window and Graphics Device Functions (Module: core) //------------------------------------------------------------------------------------ // Window-related functions InitWindow :: proc(width, height: c.int, title: cstring) --- // Initialize window and OpenGL context WindowShouldClose :: proc() -> bool --- // Check if application should close (KEY_ESCAPE pressed or windows close icon clicked) CloseWindow :: proc() --- // Close window and unload OpenGL context IsWindowReady :: proc() -> bool --- // Check if window has been initialized successfully IsWindowFullscreen :: proc() -> bool --- // Check if window is currently fullscreen IsWindowHidden :: proc() -> bool --- // Check if window is currently hidden IsWindowMinimized :: proc() -> bool --- // Check if window is currently minimized IsWindowMaximized :: proc() -> bool --- // Check if window is currently maximized IsWindowFocused :: proc() -> bool --- // Check if window is currently focused IsWindowResized :: proc() -> bool --- // Check if window has been resized last frame IsWindowState :: proc(flags: ConfigFlags) -> bool --- // Check if one specific window flag is enabled SetWindowState :: proc(flags: ConfigFlags) --- // Set window configuration state using flags ClearWindowState :: proc(flags: ConfigFlags) --- // Clear window configuration state flags ToggleFullscreen :: proc() --- // Toggle window state: fullscreen/windowed ToggleBorderlessWindowed :: proc() --- // Toggle window state: borderless windowed MaximizeWindow :: proc() --- // Set window state: maximized, if resizable MinimizeWindow :: proc() --- // Set window state: minimized, if resizable RestoreWindow :: proc() --- // Set window state: not minimized/maximized SetWindowIcon :: proc(image: Image) --- // Set icon for window (single image, RGBA 32bit,) SetWindowIcons :: proc(images: [^]Image, count: c.int) --- // Set icon for window (multiple images, RGBA 32bit,) SetWindowTitle :: proc(title: cstring) --- // Set title for window SetWindowPosition :: proc(x, y: c.int) --- // Set window position on screen SetWindowMonitor :: proc(monitor: c.int) --- // Set monitor for the current window SetWindowMinSize :: proc(width, height: c.int) --- // Set window minimum dimensions (for WINDOW_RESIZABLE) SetWindowMaxSize :: proc(width, height: c.int) --- // Set window maximum dimensions (for WINDOW_RESIZABLE) SetWindowSize :: proc(width, height: c.int) --- // Set window dimensions SetWindowOpacity :: proc(opacity: f32) --- // Set window opacity [0.0f..1.0f] SetWindowFocused :: proc() --- // Set window focused GetWindowHandle :: proc() -> rawptr --- // Get native window handle GetScreenWidth :: proc() -> c.int --- // Get current screen width GetScreenHeight :: proc() -> c.int --- // Get current screen height GetRenderWidth :: proc() -> c.int --- // Get current render width (it considers HiDPI) GetRenderHeight :: proc() -> c.int --- // Get current render height (it considers HiDPI) GetMonitorCount :: proc() -> c.int --- // Get number of connected monitors GetCurrentMonitor :: proc() -> c.int --- // Get current monitor where window is placed GetMonitorPosition :: proc(monitor: c.int) -> Vector2 --- // Get specified monitor position GetMonitorWidth :: proc(monitor: c.int) -> c.int --- // Get specified monitor width (current video mode used by monitor) GetMonitorHeight :: proc(monitor: c.int) -> c.int --- // Get specified monitor height (current video mode used by monitor) GetMonitorPhysicalWidth :: proc(monitor: c.int) -> c.int --- // Get specified monitor physical width in millimetres GetMonitorPhysicalHeight :: proc(monitor: c.int) -> c.int --- // Get specified monitor physical height in millimetres GetMonitorRefreshRate :: proc(monitor: c.int) -> c.int --- // Get specified monitor refresh rate GetWindowPosition :: proc() -> Vector2 --- // Get window position XY on monitor GetWindowScaleDPI :: proc() -> Vector2 --- // Get window scale DPI factor GetMonitorName :: proc(monitor: c.int) -> cstring --- // Get the human-readable, UTF-8 encoded name of the specified monitor SetClipboardText :: proc(text: cstring) --- // Set clipboard text content GetClipboardText :: proc() -> cstring --- // Get clipboard text content GetClipboardImage :: proc() -> Image --- // Get clipboard image content EnableEventWaiting :: proc() --- // Enable waiting for events on EndDrawing(), no automatic event polling DisableEventWaiting :: proc() --- // Disable waiting for events on EndDrawing(), automatic events polling GetGLProcAddress :: proc(proc_name: cstring) -> rawptr --- // Get GL proc address // Custom frame control functions // NOTE: Those functions are intended for advance users that want full control over the frame processing // By default EndDrawing() does this job: draws everything + SwapScreenBuffer() + manage frame timing + PollInputEvents() // To avoid that behaviour and control frame processes manually, enable in config.h: SUPPORT_CUSTOM_FRAME_CONTROL SwapScreenBuffer :: proc() --- // Swap back buffer with front buffer (screen drawing) PollInputEvents :: proc() --- // Register all input events WaitTime :: proc(seconds: f64) --- // Wait for some time (halt program execution) // Cursor-related functions ShowCursor :: proc() --- // Shows cursor HideCursor :: proc() --- // Hides cursor IsCursorHidden :: proc() -> bool --- // Check if cursor is not visible EnableCursor :: proc() --- // Enables cursor (unlock cursor) DisableCursor :: proc() --- // Disables cursor (lock cursor) IsCursorOnScreen :: proc() -> bool --- // Check if cursor is on the current screen. // Drawing-related functions ClearBackground :: proc(color: Color) --- // Set background color (framebuffer clear color) BeginDrawing :: proc() --- // Setup canvas (framebuffer) to start drawing EndDrawing :: proc() --- // End canvas drawing and swap buffers (double buffering) BeginMode2D :: proc(camera: Camera2D) --- // Initialize 2D mode with custom camera (2D) EndMode2D :: proc() --- // Ends 2D mode with custom camera BeginMode3D :: proc(camera: Camera3D) --- // Initializes 3D mode with custom camera (3D) EndMode3D :: proc() --- // Ends 3D mode and returns to default 2D orthographic mode BeginTextureMode :: proc(target: RenderTexture2D) --- // Initializes render texture for drawing EndTextureMode :: proc() --- // Ends drawing to render texture BeginShaderMode :: proc(shader: Shader) --- // Begin custom shader drawing EndShaderMode :: proc() --- // End custom shader drawing (use default shader) BeginBlendMode :: proc(mode: BlendMode) --- // Begin blending mode (alpha, additive, multiplied) EndBlendMode :: proc() --- // End blending mode (reset to default: alpha blending) BeginScissorMode :: proc(x, y, width, height: c.int) --- // Begin scissor mode (define screen area for following drawing) EndScissorMode :: proc() --- // End scissor mode BeginVrStereoMode :: proc(config: VrStereoConfig) --- // Begin stereo rendering (requires VR simulator) EndVrStereoMode :: proc() --- // End stereo rendering (requires VR simulator) // VR stereo config functions for VR simulator LoadVrStereoConfig :: proc(device: VrDeviceInfo) -> VrStereoConfig --- // Load VR stereo config for VR simulator device parameters UnloadVrStereoConfig :: proc(config: VrStereoConfig) --- // Unload VR stereo config // Shader management functions // NOTE: Shader functionality is not available on OpenGL 1.1 LoadShader :: proc(vsFileName, fsFileName: cstring) -> Shader --- // Load shader from files and bind default locations LoadShaderFromMemory :: proc(vsCode, fsCode: cstring) -> Shader --- // Load shader from code strings and bind default locations IsShaderValid :: proc(shader: Shader) -> bool --- // Check if a shader is valid (loaded on GPU) GetShaderLocation :: proc(shader: Shader, uniformName: cstring) -> c.int --- // Get shader uniform location GetShaderLocationAttrib :: proc(shader: Shader, attribName: cstring) -> c.int --- // Get shader attribute location // We use #any_int here so we can pass ShaderLocationIndex SetShaderValue :: proc(shader: Shader, #any_int locIndex: c.int, value: rawptr, uniformType: ShaderUniformDataType) --- // Set shader uniform value SetShaderValueV :: proc(shader: Shader, #any_int locIndex: c.int, value: rawptr, uniformType: ShaderUniformDataType, count: c.int) --- // Set shader uniform value vector SetShaderValueMatrix :: proc(shader: Shader, #any_int locIndex: c.int, mat: Matrix) --- // Set shader uniform value (matrix 4x4) SetShaderValueTexture :: proc(shader: Shader, #any_int locIndex: c.int, texture: Texture2D) --- // Set shader uniform value for texture (sampler2d) UnloadShader :: proc(shader: Shader) --- // Unload shader from GPU memory (VRAM) // Screen-space-related functions GetScreenToWorldRay :: proc(position: Vector2, camera: Camera) -> Ray --- // Get a ray trace from screen position (i.e mouse) GetScreenToWorldRayEx :: proc(position: Vector2, camera: Camera, width: c.int, height: c.int) -> Ray --- // Get a ray trace from screen position (i.e mouse) in a viewport GetWorldToScreen :: proc(position: Vector3, camera: Camera) -> Vector2 --- // Get the screen space position for a 3d world space position GetWorldToScreenEx :: proc(position: Vector3, camera: Camera, width: c.int, height: c.int) -> Vector2 --- // Get size position for a 3d world space position GetWorldToScreen2D :: proc(position: Vector2, camera: Camera2D) -> Vector2 --- // Get the screen space position for a 2d camera world space position GetScreenToWorld2D :: proc(position: Vector2, camera: Camera2D) -> Vector2 --- // Get the world space position for a 2d camera screen space position GetCameraMatrix :: proc(camera: Camera) -> Matrix --- // Get camera transform matrix (view matrix) GetCameraMatrix2D :: proc(camera: Camera2D) -> Matrix --- // Get camera 2d transform matrix // Timing-related functions SetTargetFPS :: proc(fps: c.int) --- // Set target FPS (maximum) GetFPS :: proc() -> c.int --- // Returns current FPS GetFrameTime :: proc() -> f32 --- // Returns time in seconds for last frame drawn (delta time) GetTime :: proc() -> f64 --- // Returns elapsed time in seconds since InitWindow() // Random value generation functions SetRandomSeed :: proc(seed: c.uint) --- // Set the seed for the random number generator GetRandomValue :: proc(min, max: c.int) -> c.int --- // Get a random value between min and max (both included) LoadRandomSequence :: proc(count: c.uint, min, max: c.int) -> [^]c.int --- // Load random values sequence, no values repeated UnloadRandomSequence :: proc(sequence: [^]c.int) --- // Unload random values sequence // Misc. functions TakeScreenshot :: proc(fileName: cstring) --- // Takes a screenshot of current screen (filename extension defines format) SetConfigFlags :: proc(flags: ConfigFlags) --- // Setup init configuration flags (view FLAGS). NOTE: This function is expected to be called before window creation OpenURL :: proc(url: cstring) --- // Open URL with default system browser (if available) // NOTE: Following functions implemented in module [utils] //------------------------------------------------------------------ TraceLog :: proc(logLevel: TraceLogLevel, text: cstring, #c_vararg args: ..any) --- // Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR) SetTraceLogLevel :: proc(logLevel: TraceLogLevel) --- // Set the current threshold (minimum) log level MemAlloc :: proc(size: c.uint) -> rawptr --- // Internal memory allocator MemRealloc :: proc(ptr: rawptr, size: c.uint) -> rawptr --- // Internal memory reallocator // Set custom callbacks // WARNING: Callbacks setup is intended for advanced users SetTraceLogCallback :: proc(callback: TraceLogCallback) --- // Set custom trace log SetLoadFileDataCallback :: proc(callback: LoadFileDataCallback) --- // Set custom file binary data loader SetSaveFileDataCallback :: proc(callback: SaveFileDataCallback) --- // Set custom file binary data saver SetLoadFileTextCallback :: proc(callback: LoadFileTextCallback) --- // Set custom file text data loader SetSaveFileTextCallback :: proc(callback: SaveFileTextCallback) --- // Set custom file text data saver // Files management functions LoadFileData :: proc(fileName: cstring, dataSize: ^c.int) -> [^]byte --- // Load file data as byte array (read) UnloadFileData :: proc(data: [^]byte) --- // Unload file data allocated by LoadFileData() SaveFileData :: proc(fileName: cstring, data: rawptr, dataSize: c.int) -> bool --- // Save data to file from byte array (write), returns true on success ExportDataAsCode :: proc(data: rawptr, dataSize: c.int, fileName: cstring) -> bool --- // Export data to code (.h), returns true on success LoadFileText :: proc(fileName: cstring) -> [^]byte --- // Load text data from file (read), returns a '\0' terminated string UnloadFileText :: proc(text: [^]byte) --- // Unload file text data allocated by LoadFileText() SaveFileText :: proc(fileName: cstring, text: [^]byte) -> bool --- // Save text data to file (write), string must be '\0' terminated, returns true on success // File system functions FileExists :: proc(fileName: cstring) -> bool --- // Check if file exists DirectoryExists :: proc(dirPath: cstring) -> bool --- // Check if a directory path exists IsFileExtension :: proc(fileName, ext: cstring) -> bool --- // Check file extension (including point: .png, .wav) GetFileLength :: proc(fileName: cstring) -> c.int --- // Get file length in bytes (NOTE: GetFileSize() conflicts with windows.h) GetFileExtension :: proc(fileName: cstring) -> cstring --- // Get pointer to extension for a filename string (includes dot: '.png') GetFileName :: proc(filePath: cstring) -> cstring --- // Get pointer to filename for a path string GetFileNameWithoutExt :: proc(filePath: cstring) -> cstring --- // Get filename string without extension (uses static string) GetDirectoryPath :: proc(filePath: cstring) -> cstring --- // Get full path for a given fileName with path (uses static string) GetPrevDirectoryPath :: proc(dirPath: cstring) -> cstring --- // Get previous directory path for a given path (uses static string) GetWorkingDirectory :: proc() -> cstring --- // Get current working directory (uses static string) GetApplicationDirectory :: proc() -> cstring --- // Get the directory of the running application (uses static string) MakeDirectory :: proc(dirPath: cstring) -> c.int --- // Create directories (including full path requested), returns 0 on success ChangeDirectory :: proc(dir: cstring) -> bool --- // Change working directory, return true on success IsPathFile :: proc(path: cstring) -> bool --- // Check if a given path is a file or a directory IsFileNameValid :: proc(fileName: cstring) -> bool --- // Check if fileName is valid for the platform/OS LoadDirectoryFiles :: proc(dirPath: cstring) -> FilePathList --- // Load directory filepaths LoadDirectoryFilesEx :: proc(basePath: cstring, filter: cstring, scanSubdirs: bool) -> FilePathList --- // Load directory filepaths with extension filtering and recursive directory scan. Use 'DIR' in the filter string to include directories in the result UnloadDirectoryFiles :: proc(files: FilePathList) --- // Unload filepaths IsFileDropped :: proc() -> bool --- // Check if a file has been dropped into window LoadDroppedFiles :: proc() -> FilePathList --- // Load dropped filepaths UnloadDroppedFiles :: proc(files: FilePathList) --- // Unload dropped filepaths GetFileModTime :: proc(fileName: cstring) -> c.long --- // Get file modification time (last write time) // Compression/Encoding functionality CompressData :: proc(data: rawptr, dataSize: c.int, compDataSize: ^c.int) -> [^]byte --- // Compress data (DEFLATE algorithm), memory must be MemFree() DecompressData :: proc(compData: rawptr, compDataSize: c.int, dataSize: ^c.int) -> [^]byte --- // Decompress data (DEFLATE algorithm), memory must be MemFree() EncodeDataBase64 :: proc(data: rawptr, dataSize: c.int, outputSize: ^c.int) -> [^]byte --- // Encode data to Base64 string, memory must be MemFree() DecodeDataBase64 :: proc(data: rawptr, outputSize: ^c.int) -> [^]byte --- // Decode Base64 string data, memory must be MemFree() ComputeCRC32 :: proc(data: rawptr, dataSize: c.int) -> c.uint --- // Compute CRC32 hash code ComputeMD5 :: proc(data: rawptr, dataSize: c.int) -> [^]c.uint --- // Compute MD5 hash code, returns static int[4] (16 bytes) ComputeSHA1 :: proc(data: rawptr, dataSize: c.int) -> [^]c.uint --- // Compute SHA1 hash code, returns static int[5] (20 bytes) // Automation events functionality LoadAutomationEventList :: proc(fileName: cstring) -> AutomationEventList --- // Load automation events list from file, NULL for empty list, capacity = MAX_AUTOMATION_EVENTS UnloadAutomationEventList :: proc(list: AutomationEventList) --- // Unload automation events list from file ExportAutomationEventList :: proc(list: AutomationEventList, fileName: cstring) -> bool --- // Export automation events list as text file SetAutomationEventList :: proc(list: ^AutomationEventList) --- // Set automation event list to record to SetAutomationEventBaseFrame :: proc(frame: c.int) --- // Set automation event internal base frame to start recording StartAutomationEventRecording :: proc() --- // Start recording automation events (AutomationEventList must be set) StopAutomationEventRecording :: proc() --- // Stop recording automation events PlayAutomationEvent :: proc(event: AutomationEvent) --- // Play a recorded automation event //------------------------------------------------------------------------------------ // Input Handling Functions (Module: core) //------------------------------------------------------------------------------------ // Input-related functions: keyboard IsKeyPressed :: proc(key: KeyboardKey) -> bool --- // Detect if a key has been pressed once IsKeyPressedRepeat :: proc(key: KeyboardKey) -> bool --- // Check if a key has been pressed again IsKeyDown :: proc(key: KeyboardKey) -> bool --- // Detect if a key is being pressed IsKeyReleased :: proc(key: KeyboardKey) -> bool --- // Detect if a key has been released once IsKeyUp :: proc(key: KeyboardKey) -> bool --- // Detect if a key is NOT being pressed GetKeyPressed :: proc() -> KeyboardKey --- // Get key pressed (keycode), call it multiple times for keys queued GetCharPressed :: proc() -> rune --- // Get char pressed (unicode), call it multiple times for chars queued SetExitKey :: proc(key: KeyboardKey) --- // Set a custom key to exit program (default is ESC) // Input-related functions: gamepads IsGamepadAvailable :: proc(gamepad: c.int) -> bool --- // Check if a gamepad is available GetGamepadName :: proc(gamepad: c.int) -> cstring --- // Get gamepad internal name id IsGamepadButtonPressed :: proc(gamepad: c.int, button: GamepadButton) -> bool --- // Check if a gamepad button has been pressed once IsGamepadButtonDown :: proc(gamepad: c.int, button: GamepadButton) -> bool --- // Check if a gamepad button is being pressed IsGamepadButtonReleased :: proc(gamepad: c.int, button: GamepadButton) -> bool --- // Check if a gamepad button has been released once IsGamepadButtonUp :: proc(gamepad: c.int, button: GamepadButton) -> bool --- // Check if a gamepad button is NOT being pressed GetGamepadButtonPressed :: proc() -> GamepadButton --- // Get the last gamepad button pressed GetGamepadAxisCount :: proc(gamepad: c.int) -> c.int --- // Get gamepad axis count for a gamepad GetGamepadAxisMovement :: proc(gamepad: c.int, axis: GamepadAxis) -> f32 --- // Get axis movement value for a gamepad axis SetGamepadMappings :: proc(mappings: cstring) -> c.int --- // Set internal gamepad mappings (SDL_GameControllerDB) SetGamepadVibration :: proc(gamepad: c.int, leftMotor: f32, rightMotor: f32, duration: f32) --- // Set gamepad vibration for both motors (duration in seconds) // Input-related functions: mouse IsMouseButtonPressed :: proc(button: MouseButton) -> bool --- // Detect if a mouse button has been pressed once IsMouseButtonDown :: proc(button: MouseButton) -> bool --- // Detect if a mouse button is being pressed IsMouseButtonReleased :: proc(button: MouseButton) -> bool --- // Detect if a mouse button has been released once IsMouseButtonUp :: proc(button: MouseButton) -> bool --- GetMouseX :: proc() -> c.int --- // Returns mouse position X GetMouseY :: proc() -> c.int --- // Returns mouse position Y GetMousePosition :: proc() -> Vector2 --- // Returns mouse position XY GetMouseDelta :: proc() -> Vector2 --- // Returns mouse delta XY SetMousePosition :: proc(x, y: c.int) --- // Set mouse position XY SetMouseOffset :: proc(offsetX, offsetY: c.int) --- // Set mouse offset SetMouseScale :: proc(scaleX, scaleY: f32) --- // Set mouse scaling GetMouseWheelMove :: proc() -> f32 --- // Returns mouse wheel movement Y GetMouseWheelMoveV :: proc() -> Vector2 --- // Get mouse wheel movement for both X and Y SetMouseCursor :: proc(cursor: MouseCursor) --- // Set mouse cursor // Input-related functions: touch GetTouchX :: proc() -> c.int --- // Returns touch position X for touch point 0 (relative to screen size) GetTouchY :: proc() -> c.int --- // Returns touch position Y for touch point 0 (relative to screen size) GetTouchPosition :: proc(index: c.int) -> Vector2 --- // Returns touch position XY for a touch point index (relative to screen size) GetTouchPointId :: proc(index: c.int) -> c.int --- // Get touch point identifier for given index GetTouchPointCount :: proc() -> c.int --- // Get number of touch points //------------------------------------------------------------------------------------ // Gestures and Touch Handling Functions (Module: rgestures) //------------------------------------------------------------------------------------ SetGesturesEnabled :: proc(flags: Gestures) --- // Enable a set of gestures using flags GetGestureDetected :: proc() -> Gestures --- // Get latest detected gesture GetGestureHoldDuration :: proc() -> f32 --- // Get gesture hold time in seconds GetGestureDragVector :: proc() -> Vector2 --- // Get gesture drag vector GetGestureDragAngle :: proc() -> f32 --- // Get gesture drag angle GetGesturePinchVector :: proc() -> Vector2 --- // Get gesture pinch delta GetGesturePinchAngle :: proc() -> f32 --- // Get gesture pinch angle //------------------------------------------------------------------------------------ // Camera System Functions (Module: camera) //------------------------------------------------------------------------------------ UpdateCamera :: proc(camera: ^Camera, mode: CameraMode) --- // Set camera mode (multiple camera modes available) UpdateCameraPro :: proc(camera: ^Camera, movement: Vector3, rotation: Vector3, zoom: f32) --- // Update camera movement/rotation //------------------------------------------------------------------------------------ // Basic Shapes Drawing Functions (Module: shapes) //------------------------------------------------------------------------------------ // Set texture and rectangle to be used on shapes drawing // NOTE: It can be useful when using basic shapes and one single font, // defining a font char white rectangle would allow drawing everything in a single draw call SetShapesTexture :: proc(texture: Texture2D, source: Rectangle) --- // Set texture and rectangle to be used on shapes drawing GetShapesTexture :: proc() -> Texture2D --- // Get texture that is used for shapes drawing GetShapesTextureRectangle :: proc() -> Rectangle --- // Get texture source rectangle that is used for shapes drawing // Basic shapes drawing functions DrawPixel :: proc(posX, posY: c.int, color: Color) --- // Draw a pixel using geometry [Can be slow, use with care] DrawPixelV :: proc(position: Vector2, color: Color) --- // Draw a pixel using geometry (Vector version) [Can be slow, use with care] DrawLine :: proc(startPosX, startPosY, endPosX, endPosY: c.int, color: Color) --- // Draw a line DrawLineV :: proc(startPos, endPos: Vector2, color: Color) --- // Draw a line (using gl lines) DrawLineEx :: proc(startPos, endPos: Vector2, thick: f32, color: Color) --- // Draw a line (using triangles/quads) DrawLineStrip :: proc(points: [^]Vector2, pointCount: c.int, color: Color) --- // Draw lines sequence (using gl lines) DrawLineBezier :: proc(startPos, endPos: Vector2, thick: f32, color: Color) --- // Draw line segment cubic-bezier in-out interpolation DrawCircle :: proc(centerX, centerY: c.int, radius: f32, color: Color) --- // Draw a color-filled circle DrawCircleSector :: proc(center: Vector2, radius: f32, startAngle, endAngle: f32, segments: c.int, color: Color) --- // Draw a piece of a circle DrawCircleSectorLines :: proc(center: Vector2, radius: f32, startAngle, endAngle: f32, segments: c.int, color: Color) --- // Draw circle sector outline DrawCircleGradient :: proc(centerX, centerY: c.int, radius: f32, inner, outer: Color) --- // Draw a gradient-filled circle DrawCircleV :: proc(center: Vector2, radius: f32, color: Color) --- // Draw a color-filled circle (Vector version) DrawCircleLines :: proc(centerX, centerY: c.int, radius: f32, color: Color) --- // Draw circle outline DrawCircleLinesV :: proc(center: Vector2, radius: f32, color: Color) --- // Draw circle outline (Vector version) DrawEllipse :: proc(centerX, centerY: c.int, radiusH, radiusV: f32, color: Color) --- // Draw ellipse DrawEllipseLines :: proc(centerX, centerY: c.int, radiusH, radiusV: f32, color: Color) --- // Draw ellipse outline DrawRing :: proc(center: Vector2, innerRadius, outerRadius: f32, startAngle, endAngle: f32, segments: c.int, color: Color) --- // Draw ring DrawRingLines :: proc(center: Vector2, innerRadius, outerRadius: f32, startAngle, endAngle: f32, segments: c.int, color: Color) --- // Draw ring outline DrawRectangle :: proc(posX, posY: c.int, width, height: c.int, color: Color) --- // Draw a color-filled rectangle DrawRectangleV :: proc(position: Vector2, size: Vector2, color: Color) --- // Draw a color-filled rectangle (Vector version) DrawRectangleRec :: proc(rec: Rectangle, color: Color) --- // Draw a color-filled rectangle DrawRectanglePro :: proc(rec: Rectangle, origin: Vector2, rotation: f32, color: Color) --- // Draw a color-filled rectangle with pro parameters DrawRectangleGradientV :: proc(posX, posY: c.int, width, height: c.int, top, bottom: Color) --- // Draw a vertical-gradient-filled rectangle DrawRectangleGradientH :: proc(posX, posY: c.int, width, height: c.int, left, right: Color) --- // Draw a horizontal-gradient-filled rectangle DrawRectangleGradientEx :: proc(rec: Rectangle, topLeft, bottomLeft, topRight, bottomRight: Color) --- // Draw a gradient-filled rectangle with custom vertex colors DrawRectangleLines :: proc(posX, posY: c.int, width, height: c.int, color: Color) --- // Draw rectangle outline DrawRectangleLinesEx :: proc(rec: Rectangle, lineThick: f32, color: Color) --- // Draw rectangle outline with extended parameters DrawRectangleRounded :: proc(rec: Rectangle, roundness: f32, segments: c.int, color: Color) --- // Draw rectangle with rounded edges DrawRectangleRoundedLines :: proc(rec: Rectangle, roundness: f32, segments: c.int, lineThick: f32, color: Color) --- // Draw rectangle lines with rounded edges DrawRectangleRoundedLinesEx :: proc(rec: Rectangle, roundness: f32, segments: c.int, lineThick: f32, color: Color) --- // Draw rectangle with rounded edges outline DrawTriangle :: proc(v1, v2, v3: Vector2, color: Color) --- // Draw a color-filled triangle (vertex in counter-clockwise order!) DrawTriangleLines :: proc(v1, v2, v3: Vector2, color: Color) --- // Draw triangle outline (vertex in counter-clockwise order!) DrawTriangleFan :: proc(points: [^]Vector2, pointCount: c.int, color: Color) --- // Draw a triangle fan defined by points (first vertex is the center) DrawTriangleStrip :: proc(points: [^]Vector2, pointCount: c.int, color: Color) --- // Draw a triangle strip defined by points DrawPoly :: proc(center: Vector2, sides: c.int, radius: f32, rotation: f32, color: Color) --- // Draw a regular polygon (Vector version) DrawPolyLines :: proc(center: Vector2, sides: c.int, radius: f32, rotation: f32, color: Color) --- // Draw a polygon outline of n sides DrawPolyLinesEx :: proc(center: Vector2, sides: c.int, radius: f32, rotation: f32, lineThick: f32, color: Color) --- // Draw a polygon outline of n sides with extended parameters // Splines drawing functions DrawSplineLinear :: proc(points: [^]Vector2, pointCount: c.int, thick: f32, color: Color) --- // Draw spline: Linear, minimum 2 points DrawSplineBasis :: proc(points: [^]Vector2, pointCount: c.int, thick: f32, color: Color) --- // Draw spline: B-Spline, minimum 4 points DrawSplineCatmullRom :: proc(points: [^]Vector2, pointCount: c.int, thick: f32, color: Color) --- // Draw spline: Catmull-Rom, minimum 4 points DrawSplineBezierQuadratic :: proc(points: [^]Vector2, pointCount: c.int, thick: f32, color: Color) --- // Draw spline: Quadratic Bezier, minimum 3 points (1 control point): [p1, c2, p3, c4...] DrawSplineBezierCubic :: proc(points: [^]Vector2, pointCount: c.int, thick: f32, color: Color) --- // Draw spline: Cubic Bezier, minimum 4 points (2 control points): [p1, c2, c3, p4, c5, c6...] DrawSplineSegmentLinear :: proc(p1, p2: Vector2, thick: f32, color: Color) --- // Draw spline segment: Linear, 2 points DrawSplineSegmentBasis :: proc(p1, p2, p3, p4: Vector2, thick: f32, color: Color) --- // Draw spline segment: B-Spline, 4 points DrawSplineSegmentCatmullRom :: proc(p1, p2, p3, p4: Vector2, thick: f32, color: Color) --- // Draw spline segment: Catmull-Rom, 4 points DrawSplineSegmentBezierQuadratic :: proc(p1, c2, p3: Vector2, thick: f32, color: Color) --- // Draw spline segment: Quadratic Bezier, 2 points, 1 control point DrawSplineSegmentBezierCubic :: proc(p1, c2, c3, p4: Vector2, thick: f32, color: Color) --- // Draw spline segment: Cubic Bezier, 2 points, 2 control points // Spline segment point evaluation functions, for a given t [0.0f .. 1.0f] GetSplinePointLinear :: proc(startPos, endPos: Vector2, t: f32) -> Vector2 --- // Get (evaluate) spline point: Linear GetSplinePointBasis :: proc(p1, p2, p3, p4: Vector2, t: f32) -> Vector2 --- // Get (evaluate) spline point: B-Spline GetSplinePointCatmullRom :: proc(p1, p2, p3, p4: Vector2, t: f32) -> Vector2 --- // Get (evaluate) spline point: Catmull-Rom GetSplinePointBezierQuad :: proc(p1, c2, p3: Vector2, t: f32) -> Vector2 --- // Get (evaluate) spline point: Quadratic Bezier GetSplinePointBezierCubic :: proc(p1, c2, c3, p4: Vector2, t: f32) -> Vector2 --- // Get (evaluate) spline point: Cubic Bezier // Basic shapes collision detection functions CheckCollisionRecs :: proc(rec1, rec2: Rectangle) -> bool --- // Check collision between two rectangles CheckCollisionCircles :: proc(center1: Vector2, radius1: f32, center2: Vector2, radius2: f32) -> bool --- // Check collision between two circles CheckCollisionCircleRec :: proc(center: Vector2, radius: f32, rec: Rectangle) -> bool --- // Check collision between circle and rectangle CheckCollisionCircleLine :: proc(center: Vector2, radius: f32, p1, p2: Vector2) -> bool --- // Check if circle collides with a line created betweeen two points [p1] and [p2] CheckCollisionPointRec :: proc(point: Vector2, rec: Rectangle) -> bool --- // Check if point is inside rectangle CheckCollisionPointCircle :: proc(point, center: Vector2, radius: f32) -> bool --- // Check if point is inside circle CheckCollisionPointTriangle :: proc(point: Vector2, p1, p2, p3: Vector2) -> bool --- // Check if point is inside a triangle CheckCollisionPointLine :: proc(point: Vector2, p1, p2: Vector2, threshold: c.int) -> bool --- // Check if point belongs to line created between two points [p1] and [p2] with defined margin in pixels [threshold] CheckCollisionPointPoly :: proc(point: Vector2, points: [^]Vector2, pointCount: c.int) -> bool --- // Check if point is within a polygon described by array of vertices CheckCollisionLines :: proc(startPos1, endPos1, startPos2, endPos2: Vector2, collisionPoint: [^]Vector2) -> bool --- // Check the collision between two lines defined by two points each, returns collision point by reference GetCollisionRec :: proc(rec1, rec2: Rectangle) -> Rectangle --- // Get collision rectangle for two rectangles collision // Image loading functions // NOTE: These functions do not require GPU access LoadImage :: proc(fileName: cstring) -> Image --- // Load image from file into CPU memory (RAM) LoadImageRaw :: proc(fileName: cstring, width, height: c.int, format: PixelFormat, headerSize: c.int) -> Image --- // Load image from RAW file data LoadImageAnim :: proc(fileName: cstring, frames: ^c.int) -> Image --- // Load image sequence from file (frames appended to image.data) LoadImageAnimFromMemory :: proc(fileType: cstring, fileData: rawptr, dataSize: c.int, frames: ^c.int) -> Image --- // Load image sequence from memory buffer LoadImageFromMemory :: proc(fileType: cstring, fileData: rawptr, dataSize: c.int) -> Image --- // Load image from memory buffer, fileType refers to extension: i.e. '.png' LoadImageFromTexture :: proc(texture: Texture2D) -> Image --- // Load image from GPU texture data LoadImageFromScreen :: proc() -> Image --- // Load image from screen buffer and (screenshot) IsImageValid :: proc(image: Image) -> bool --- // Check if an image is ready UnloadImage :: proc(image: Image) --- // Unload image from CPU memory (RAM) ExportImage :: proc(image: Image, fileName: cstring) -> bool --- // Export image data to file, returns true on success ExportImageToMemory :: proc(image: Image, fileType: cstring, fileSize: ^c.int) -> rawptr --- // Export image to memory buffer ExportImageAsCode :: proc(image: Image, fileName: cstring) -> bool --- // Export image as code file defining an array of bytes, returns true on success // Image generation functions GenImageColor :: proc(width, height: c.int, color: Color) -> Image --- // Generate image: plain color GenImageGradientLinear :: proc(width, height, direction: c.int, start, end: Color) -> Image --- // Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient GenImageGradientRadial :: proc(width, height: c.int, density: f32, inner, outer: Color) -> Image --- // Generate image: radial gradient GenImageGradientSquare :: proc(width, height: c.int, density: f32, inner, outer: Color) -> Image --- // Generate image: square gradient GenImageChecked :: proc(width, height: c.int, checksX, checksY: c.int, col1, col2: Color) -> Image --- // Generate image: checked GenImageWhiteNoise :: proc(width, height: c.int, factor: f32) -> Image --- // Generate image: white noise GenImagePerlinNoise :: proc(width, height: c.int, offsetX, offsetY: c.int, scale: f32) -> Image --- // Generate image: perlin noise GenImageCellular :: proc(width, height: c.int, tileSize: c.int) -> Image --- // Generate image: cellular algorithm, bigger tileSize means bigger cells GenImageText :: proc(width, height: c.int, text: cstring) -> Image --- // Generate image: grayscale image from text data // Image manipulation functions ImageCopy :: proc(image: Image) -> Image --- // Create an image duplicate (useful for transformations) ImageFromImage :: proc(image: Image, rec: Rectangle) -> Image --- // Create an image from another image piece ImageFromChannel :: proc(image: Image, selectedChannel: c.int) -> Image --- // Create an image from a selected channel of another image (GRAYSCALE) ImageText :: proc(text: cstring, fontSize: c.int, color: Color) -> Image --- // Create an image from text (default font) ImageTextEx :: proc(font: Font, text: cstring, fontSize: f32, spacing: f32, tint: Color) -> Image --- // Create an image from text (custom sprite font) ImageFormat :: proc(image: ^Image, newFormat: PixelFormat) --- // Convert image data to desired format ImageToPOT :: proc(image: ^Image, fill: Color) --- // Convert image to POT (power-of-two) ImageCrop :: proc(image: ^Image, crop: Rectangle) --- // Crop an image to a defined rectangle ImageAlphaCrop :: proc(image: ^Image, threshold: f32) --- // Crop image depending on alpha value ImageAlphaClear :: proc(image: ^Image, color: Color, threshold: f32) --- // Clear alpha channel to desired color ImageAlphaMask :: proc(image: ^Image, alphaMask: Image) --- // Apply alpha mask to image ImageAlphaPremultiply :: proc(image: ^Image) --- // Premultiply alpha channel ImageBlurGaussian :: proc(image: ^Image, blurSize: c.int) --- // Apply Gaussian blur using a box blur approximation ImageKernelConvolution :: proc(image: ^Image, kernel: [^]f32, kernelSize: c.int) --- // Apply custom square convolution kernel to image ImageResize :: proc(image: ^Image, newWidth, newHeight: c.int) --- // Resize image (Bicubic scaling algorithm) ImageResizeNN :: proc(image: ^Image, newWidth, newHeight: c.int) --- // Resize image (Nearest-Neighbor scaling algorithm) ImageResizeCanvas :: proc(image: ^Image, newWidth, newHeight: c.int, offsetX, offsetY: c.int, fill: Color) --- // Resize canvas and fill with color ImageMipmaps :: proc(image: ^Image) --- // Compute all mipmap levels for a provided image ImageDither :: proc(image: ^Image, rBpp, gBpp, bBpp, aBpp: c.int) --- // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) ImageFlipVertical :: proc(image: ^Image) --- // Flip image vertically ImageFlipHorizontal :: proc(image: ^Image) --- // Flip image horizontally ImageRotate :: proc(image: ^Image, degrees: c.int) --- // Rotate image by input angle in degrees( -359 to 359) ImageRotateCW :: proc(image: ^Image) --- // Rotate image clockwise 90deg ImageRotateCCW :: proc(image: ^Image) --- // Rotate image counter-clockwise 90deg ImageColorTint :: proc(image: ^Image, color: Color) --- // Modify image color: tint ImageColorInvert :: proc(image: ^Image) --- // Modify image color: invert ImageColorGrayscale :: proc(image: ^Image) --- // Modify image color: grayscale ImageColorContrast :: proc(image: ^Image, contrast: f32) --- // Modify image color: contrast (-100 to 100) ImageColorBrightness :: proc(image: ^Image, brightness: c.int) --- // Modify image color: brightness (-255 to 255) ImageColorReplace :: proc(image: ^Image, color, replace: Color) --- // Modify image color: replace color LoadImageColors :: proc(image: Image) -> [^]Color --- // Load color data from image as a Color array (RGBA - 32bit) LoadImagePalette :: proc(image: Image, maxPaletteSize: c.int, colorCount: ^c.int) -> [^]Color --- // Load colors palette from image as a Color array (RGBA - 32bit) UnloadImageColors :: proc(colors: [^]Color) --- // Unload color data loaded with LoadImageColors() UnloadImagePalette :: proc(colors: [^]Color) --- // Unload colors palette loaded with LoadImagePalette() GetImageAlphaBorder :: proc(image: Image, threshold: f32) -> Rectangle --- // Get image alpha border rectangle GetImageColor :: proc(image: Image, x, y: c.int) -> Color --- // Get image pixel color at (x, y) position // Image drawing functions // NOTE: Image software-rendering functions (CPU) ImageClearBackground :: proc(dst: ^Image, color: Color) --- // Clear image background with given color ImageDrawPixel :: proc(dst: ^Image, posX, posY: c.int, color: Color) --- // Draw pixel within an image ImageDrawPixelV :: proc(dst: ^Image, position: Vector2, color: Color) --- // Draw pixel within an image (Vector version) ImageDrawLine :: proc(dst: ^Image, startPosX, startPosY, endPosX, endPosY: c.int, color: Color) --- // Draw line within an image ImageDrawLineV :: proc(dst: ^Image, start, end: Vector2, color: Color) --- // Draw line within an image (Vector version) ImageDrawLineEx :: proc(dst: ^Image, start, end: Vector2, thick: c.int, color: Color) --- // Draw a line defining thickness within an image ImageDrawCircle :: proc(dst: ^Image, centerX, centerY: c.int, radius: c.int, color: Color) --- // Draw a filled circle within an image ImageDrawCircleV :: proc(dst: ^Image, center: Vector2, radius: c.int, color: Color) --- // Draw a filled circle within an image (Vector version) ImageDrawCircleLines :: proc(dst: ^Image, centerX, centerY: c.int, radius: c.int, color: Color) --- // Draw circle outline within an image ImageDrawCircleLinesV :: proc(dst: ^Image, center: Vector2, radius: c.int, color: Color) --- // Draw circle outline within an image (Vector version) ImageDrawRectangle :: proc(dst: ^Image, posX, posY: c.int, width, height: c.int, color: Color) --- // Draw rectangle within an image ImageDrawRectangleV :: proc(dst: ^Image, position, size: Vector2, color: Color) --- // Draw rectangle within an image (Vector version) ImageDrawRectangleRec :: proc(dst: ^Image, rec: Rectangle, color: Color) --- // Draw rectangle within an image ImageDrawRectangleLines :: proc(dst: ^Image, rec: Rectangle, thick: c.int, color: Color) --- // Draw rectangle lines within an image ImageDrawTriangle :: proc(dst: ^Image, v1, v2, v3: Vector2, color: Color) --- // Draw triangle within an image ImageDrawTriangleEx :: proc(dst: ^Image, v1, v2, v3: Vector2, c1, c2, c3: Color) --- // Draw triangle with interpolated colors within an image ImageDrawTriangleLines :: proc(dst: ^Image, v1, v2, v3: Vector2, color: Color) --- // Draw triangle outline within an image ImageDrawTriangleFan :: proc(dst: ^Image, points: [^]Vector2, pointCount: c.int, color: Color) --- // Draw a triangle fan defined by points within an image (first vertex is the center) ImageDrawTriangleStrip :: proc(dst: ^Image, points: [^]Vector2, pointCount: c.int, color: Color) --- // Draw a triangle strip defined by points within an image ImageDraw :: proc(dst: ^Image, src: Image, srcRec, dstRec: Rectangle, tint: Color) --- // Draw a source image within a destination image (tint applied to source) ImageDrawText :: proc(dst: ^Image, text: cstring, posX, posY: c.int, fontSize: c.int, color: Color) --- // Draw text (using default font) within an image (destination) ImageDrawTextEx :: proc(dst: ^Image, font: Font, text: cstring, position: Vector2, fontSize: f32, spacing: f32, tint: Color) --- // Draw text (custom sprite font) within an image (destination) // Texture loading functions // NOTE: These functions require GPU access LoadTexture :: proc(fileName: cstring) -> Texture2D --- // Load texture from file into GPU memory (VRAM) LoadTextureFromImage :: proc(image: Image) -> Texture2D --- // Load texture from image data LoadTextureCubemap :: proc(image: Image, layout: CubemapLayout) -> TextureCubemap --- // Load cubemap from image, multiple image cubemap layouts supported LoadRenderTexture :: proc(width, height: c.int) -> RenderTexture2D --- // Load texture for rendering (framebuffer) IsTextureValid :: proc(texture: Texture2D) -> bool --- // Check if a texture is valid UnloadTexture :: proc(texture: Texture2D) --- // Unload texture from GPU memory (VRAM) IsRenderTextureValid :: proc(target: RenderTexture2D) -> bool --- // Check if a render texture is valid UnloadRenderTexture :: proc(target: RenderTexture2D) --- // Unload render texture from GPU memory (VRAM) UpdateTexture :: proc(texture: Texture2D, pixels: rawptr) --- // Update GPU texture with new data UpdateTextureRec :: proc(texture: Texture2D, rec: Rectangle, pixels: rawptr) --- // Update GPU texture rectangle with new data // Texture configuration functions GenTextureMipmaps :: proc(texture: ^Texture2D) --- // Generate GPU mipmaps for a texture SetTextureFilter :: proc(texture: Texture2D, filter: TextureFilter) --- // Set texture scaling filter mode SetTextureWrap :: proc(texture: Texture2D, wrap: TextureWrap) --- // Set texture wrapping mode // Texture drawing functions DrawTexture :: proc(texture: Texture2D, posX, posY: c.int, tint: Color) --- // Draw a Texture2D DrawTextureV :: proc(texture: Texture2D, position: Vector2, tint: Color) --- // Draw a Texture2D with position defined as Vector2 DrawTextureEx :: proc(texture: Texture2D, position: Vector2, rotation: f32, scale: f32, tint: Color) --- // Draw a Texture2D with extended parameters DrawTextureRec :: proc(texture: Texture2D, source: Rectangle, position: Vector2, tint: Color) --- // Draw a part of a texture defined by a rectangle DrawTexturePro :: proc(texture: Texture2D, source, dest: Rectangle, origin: Vector2, rotation: f32, tint: Color) --- // Draw a part of a texture defined by a rectangle with 'pro' parameters DrawTextureNPatch :: proc(texture: Texture2D, nPatchInfo: NPatchInfo, dest: Rectangle, origin: Vector2, rotation: f32, tint: Color) --- // Draws a texture (or part of it) that stretches or shrinks nicely // Color/pixel related functions @(deprecated = "Prefer col1 == col2") ColorIsEqual :: proc(col1, col2: Color) --- // Check if two colors are equal Fade :: proc(color: Color, alpha: f32) -> Color --- // Get color with alpha applied, alpha goes from 0.0f to 1.0f ColorToInt :: proc(color: Color) -> c.uint --- // Get hexadecimal value for a Color (0xRRGGBBAA) ColorNormalize :: proc(color: Color) -> Vector4 --- // Get Color normalized as float [0..1] ColorFromNormalized :: proc(normalized: Vector4) -> Color --- // Get Color from normalized values [0..1] ColorToHSV :: proc(color: Color) -> Vector3 --- // Get HSV values for a Color, hue [0..360], saturation/value [0..1] ColorFromHSV :: proc(hue, saturation, value: f32) -> Color --- // Get a Color from HSV values, hue [0..360], saturation/value [0..1] ColorTint :: proc(color, tint: Color) -> Color --- // Get color multiplied with another color ColorBrightness :: proc(color: Color, factor: f32) -> Color --- // Get color with brightness correction, brightness factor goes from -1.0f to 1.0f ColorContrast :: proc(color: Color, contrast: f32) -> Color --- // Get color with contrast correction, contrast values between -1.0f and 1.0f ColorAlpha :: proc(color: Color, alpha: f32) -> Color --- // Get color with alpha applied, alpha goes from 0.0f to 1.0f ColorAlphaBlend :: proc(dst, src, tint: Color) -> Color --- // Get src alpha-blended into dst color with tint ColorLerp :: proc(color1, color2: Color, factor: f32) -> Color --- // Get color lerp interpolation between two colors, factor [0.0f..1.0f] GetColor :: proc(hexValue: c.uint) -> Color --- // Get Color structure from hexadecimal value GetPixelColor :: proc(srcPtr: rawptr, format: PixelFormat) -> Color --- // Get Color from a source pixel pointer of certain format SetPixelColor :: proc(dstPtr: rawptr, color: Color, format: PixelFormat) --- // Set color formatted into destination pixel pointer GetPixelDataSize :: proc(width, height: c.int, format: PixelFormat) -> c.int --- // Get pixel data size in bytes for certain format //------------------------------------------------------------------------------------ // Font Loading and Text Drawing Functions (Module: text) //------------------------------------------------------------------------------------ // Font loading/unloading functions GetFontDefault :: proc() -> Font --- // Get the default Font LoadFont :: proc(fileName: cstring) -> Font --- // Load font from file into GPU memory (VRAM) LoadFontEx :: proc(fileName: cstring, fontSize: c.int, codepoints: [^]rune, codepointCount: c.int) -> Font --- // Load font from file with extended parameters, use NULL for codepoints and 0 for codepointCount to load the default character set, font size is provided in pixels height LoadFontFromImage :: proc(image: Image, key: Color, firstChar: rune) -> Font --- // Load font from Image (XNA style) LoadFontFromMemory :: proc(fileType: cstring, fileData: rawptr, dataSize: c.int, fontSize: c.int, codepoints: [^]rune, codepointCount: c.int) -> Font --- // Load font from memory buffer, fileType refers to extension: i.e. '.ttf' IsFontValid :: proc(font: Font) -> bool --- // Check if a font is valid (font data loaded, WARNING: GPU texture not checked) LoadFontData :: proc(fileData: rawptr, dataSize: c.int, fontSize: c.int, codepoints: [^]rune, codepointCount: c.int, type: FontType) -> [^]GlyphInfo --- // Load font data for further use GenImageFontAtlas :: proc(glyphs: [^]GlyphInfo, glyphRecs: ^[^]Rectangle, codepointCount: c.int, fontSize: c.int, padding: c.int, packMethod: c.int) -> Image --- // Generate image font atlas using chars info UnloadFontData :: proc(glyphs: [^]GlyphInfo, glyphCount: c.int) --- // Unload font chars info data (RAM) UnloadFont :: proc(font: Font) --- // Unload font from GPU memory (VRAM) ExportFontAsCode :: proc(font: Font, fileName: cstring) -> bool --- // Export font as code file, returns true on success // Text drawing functions DrawFPS :: proc(posX, posY: c.int) --- // Draw current FPS DrawText :: proc(text: cstring, posX, posY: c.int, fontSize: c.int, color: Color) --- // Draw text (using default font) DrawTextEx :: proc(font: Font, text: cstring, position: Vector2, fontSize: f32, spacing: f32, tint: Color) --- // Draw text using font and additional parameters DrawTextPro :: proc(font: Font, text: cstring, position, origin: Vector2, rotation: f32, fontSize: f32, spacing: f32, tint: Color) --- // Draw text using Font and pro parameters (rotation) DrawTextCodepoint :: proc(font: Font, codepoint: rune, position: Vector2, fontSize: f32, tint: Color) --- // Draw one character (codepoint) DrawTextCodepoints :: proc(font: Font, codepoints: [^]rune, codepointCount: c.int, position: Vector2, fontSize: f32, spacing: f32, tint: Color) --- // Draw multiple character (codepoint) // Text font info functions SetTextLineSpacing :: proc(spacing: c.int) --- // Set vertical line spacing when drawing with line-breaks MeasureText :: proc(text: cstring, fontSize: c.int) -> c.int --- // Measure string width for default font MeasureTextEx :: proc(font: Font, text: cstring, fontSize: f32, spacing: f32) -> Vector2 --- // Measure string size for Font GetGlyphIndex :: proc(font: Font, codepoint: rune) -> c.int --- // Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found GetGlyphInfo :: proc(font: Font, codepoint: rune) -> GlyphInfo --- // Get glyph font info data for a codepoint (unicode character), fallback to '?' if not found GetGlyphAtlasRec :: proc(font: Font, codepoint: rune) -> Rectangle --- // Get glyph rectangle in font atlas for a codepoint (unicode character), fallback to '?' if not found // Text codepoints management functions (unicode characters) LoadUTF8 :: proc(codepoints: [^]rune, length: c.int) -> [^]byte --- // Load UTF-8 text encoded from codepoints array UnloadUTF8 :: proc(text: [^]byte) --- // Unload UTF-8 text encoded from codepoints array LoadCodepoints :: proc(text: cstring, count: ^c.int) -> [^]rune --- // Load all codepoints from a UTF-8 text string, codepoints count returned by parameter UnloadCodepoints :: proc(codepoints: [^]rune) --- // Unload codepoints data from memory GetCodepointCount :: proc(text: cstring) -> c.int --- // Get total number of codepoints in a UTF-8 encoded string GetCodepoint :: proc(text: cstring, codepointSize: ^c.int) -> rune --- // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure GetCodepointNext :: proc(text: cstring, codepointSize: ^c.int) -> rune --- // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure GetCodepointPrevious :: proc(text: cstring, codepointSize: ^c.int) -> rune --- // Get previous codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure CodepointToUTF8 :: proc(codepoint: rune, utf8Size: ^c.int) -> cstring --- // Encode one codepoint into UTF-8 byte array (array length returned as parameter) // Text strings management functions (no UTF-8 strings, only byte chars) // NOTE: Some strings allocate memory internally for returned strings, just be careful! TextCopy :: proc(dst: [^]byte, src: cstring) -> c.int --- // Copy one string to another, returns bytes copied TextIsEqual :: proc(text1, text2: cstring) -> bool --- // Check if two text string are equal TextLength :: proc(text: cstring) -> c.uint --- // Get text length, checks for '\0' ending // TextFormat is defined at the bottom of this file TextSubtext :: proc(text: cstring, position: c.int, length: c.int) -> cstring --- // Get a piece of a text string TextReplace :: proc(text: [^]byte, replace, by: cstring) -> [^]byte --- // Replace text string (WARNING: memory must be freed!) TextInsert :: proc(text, insert: cstring, position: c.int) -> [^]byte --- // Insert text in a position (WARNING: memory must be freed!) TextJoin :: proc(textList: [^]cstring, count: c.int, delimiter: cstring) -> cstring --- // Join text strings with delimiter TextSplit :: proc(text: cstring, delimiter: byte, count: ^c.int) -> [^]cstring --- // Split text into multiple strings TextAppend :: proc(text: [^]byte, append: cstring, position: ^c.int) --- // Append text at specific position and move cursor! TextFindIndex :: proc(text, find: cstring) -> c.int --- // Find first text occurrence within a string TextToUpper :: proc(text: cstring) -> cstring --- // Get upper case version of provided string TextToLower :: proc(text: cstring) -> cstring --- // Get lower case version of provided string TextToPascal :: proc(text: cstring) -> cstring --- // Get Pascal case notation version of provided string TextToSnake :: proc(text: cstring) -> cstring --- // Get Snake case notation version of provided string TextToCamel :: proc(text: cstring) -> cstring --- // Get Camel case notation version of provided string TextToInteger :: proc(text: cstring) -> c.int --- // Get integer value from text (negative values not supported) TextToFloat :: proc(text: cstring) -> f32 --- // Get float value from text (negative values not supported) //------------------------------------------------------------------------------------ // Basic 3d Shapes Drawing Functions (Module: models) //------------------------------------------------------------------------------------ // Basic geometric 3D shapes drawing functions DrawLine3D :: proc(startPos, endPos: Vector3, color: Color) --- // Draw a line in 3D world space DrawPoint3D :: proc(position: Vector3, color: Color) --- // Draw a point in 3D space, actually a small line DrawCircle3D :: proc(center: Vector3, radius: f32, rotationAxis: Vector3, rotationAngle: f32, color: Color) --- // Draw a circle in 3D world space DrawTriangle3D :: proc(v1, v2, v3: Vector3, color: Color) --- // Draw a color-filled triangle (vertex in counter-clockwise order!) DrawTriangleStrip3D :: proc(points: [^]Vector3, pointCount: c.int, color: Color) --- // Draw a triangle strip defined by points DrawCube :: proc(position: Vector3, width, height, length: f32, color: Color) --- // Draw cube DrawCubeV :: proc(position: Vector3, size: Vector3, color: Color) --- // Draw cube (Vector version) DrawCubeWires :: proc(position: Vector3, width, height, length: f32, color: Color) --- // Draw cube wires DrawCubeWiresV :: proc(position, size: Vector3, color: Color) --- // Draw cube wires (Vector version) DrawSphere :: proc(centerPos: Vector3, radius: f32, color: Color) --- // Draw sphere DrawSphereEx :: proc(centerPos: Vector3, radius: f32, rings, slices: c.int, color: Color) --- // Draw sphere with extended parameters DrawSphereWires :: proc(centerPos: Vector3, radius: f32, rings, slices: c.int, color: Color) --- // Draw sphere wires DrawCylinder :: proc(position: Vector3, radiusTop, radiusBottom: f32, height: f32, slices: c.int, color: Color) --- // Draw a cylinder/cone DrawCylinderEx :: proc(startPos, endPos: Vector3, startRadius, endRadius: f32, sides: c.int, color: Color) --- // Draw a cylinder with base at startPos and top at endPos DrawCylinderWires :: proc(position: Vector3, radiusTop, radiusBottom, height: f32, slices: c.int, color: Color) --- // Draw a cylinder/cone wires DrawCylinderWiresEx :: proc(startPos, endPos: Vector3, startRadius, endRadius: f32, sides: c.int, color: Color) --- // Draw a cylinder wires with base at startPos and top at endPos DrawCapsule :: proc(startPos, endPos: Vector3, radius: f32, slices, rings: c.int, color: Color) --- // Draw a capsule with the center of its sphere caps at startPos and endPos DrawCapsuleWires :: proc(startPos, endPos: Vector3, radius: f32, slices, rings: c.int, color: Color) --- // Draw capsule wireframe with the center of its sphere caps at startPos and endPos DrawPlane :: proc(centerPos: Vector3, size: Vector2, color: Color) --- // Draw a plane XZ DrawRay :: proc(ray: Ray, color: Color) --- // Draw a ray line DrawGrid :: proc(slices: c.int, spacing: f32) --- // Draw a grid (centered at (0, 0, 0)) //------------------------------------------------------------------------------------ // Model 3d Loading and Drawing Functions (Module: models) //------------------------------------------------------------------------------------ // Model management functions LoadModel :: proc(fileName: cstring) -> Model --- // Load model from files (meshes and materials) LoadModelFromMesh :: proc(mesh: Mesh) -> Model --- // Load model from generated mesh (default material) IsModelValid :: proc(model: Model) -> bool --- // Check if a model is valid (loaded in GPU, VAO/VBOs) UnloadModel :: proc(model: Model) --- // Unload model (including meshes) from memory (RAM and/or VRAM) GetModelBoundingBox :: proc(model: Model) -> BoundingBox --- // Compute model bounding box limits (considers all meshes) // Model drawing functions DrawModel :: proc(model: Model, position: Vector3, scale: f32, tint: Color) --- // Draw a model (with texture if set) DrawModelEx :: proc(model: Model, position: Vector3, rotationAxis: Vector3, rotationAngle: f32, scale: Vector3, tint: Color) --- // Draw a model with extended parameters DrawModelWires :: proc(model: Model, position: Vector3, scale: f32, tint: Color) --- // Draw a model wires (with texture if set) DrawModelWiresEx :: proc(model: Model, position: Vector3, rotationAxis: Vector3, rotationAngle: f32, scale: Vector3, tint: Color) --- // Draw a model wires (with texture if set) with extended parameters DrawModelPoints :: proc(model: Model, position: Vector3, scale: f32, tint: Color) --- // Draw a model as points DrawModelPointsEx :: proc(model: Model, position: Vector3, rotationAxis: Vector3, rotationAngle: f32, scale: Vector3, tint: Color) --- // Draw a model as points with extended parameters DrawBoundingBox :: proc(box: BoundingBox, color: Color) --- // Draw bounding box (wires) DrawBillboard :: proc(camera: Camera, texture: Texture2D, position: Vector3, scale: f32, tint: Color) --- // Draw a billboard texture DrawBillboardRec :: proc(camera: Camera, texture: Texture2D, source: Rectangle, position: Vector3, size: Vector2, tint: Color) --- // Draw a billboard texture defined by source DrawBillboardPro :: proc(camera: Camera, texture: Texture2D, source: Rectangle, position: Vector3, up: Vector3, size: Vector2, origin: Vector2, rotation: f32, tint: Color) --- // Draw a billboard texture defined by source and rotation // Mesh management functions UploadMesh :: proc(mesh: ^Mesh, is_dynamic: bool) --- // Upload mesh vertex data in GPU and provide VAO/VBO ids UpdateMeshBuffer :: proc(mesh: Mesh, index: c.int, data: rawptr, dataSize: c.int, offset: c.int) --- // Update mesh vertex data in GPU for a specific buffer index UnloadMesh :: proc(mesh: Mesh) --- // Unload mesh data from CPU and GPU DrawMesh :: proc(mesh: Mesh, material: Material, transform: Matrix) --- // Draw a 3d mesh with material and transform DrawMeshInstanced :: proc(mesh: Mesh, material: Material, transforms: [^]Matrix, instances: c.int) --- // Draw multiple mesh instances with material and different transforms GetMeshBoundingBox :: proc(mesh: Mesh) -> BoundingBox --- // Compute mesh bounding box limits GenMeshTangents :: proc(mesh: ^Mesh) --- // Compute mesh tangents ExportMesh :: proc(mesh: Mesh, fileName: cstring) -> bool --- // Export mesh data to file, returns true on success ExportMeshAsCode :: proc(mesh: Mesh, fileName: cstring) -> bool --- // Export mesh as code file (.h) defining multiple arrays of vertex attributes // Mesh generation functions GenMeshPoly :: proc(sides: c.int, radius: f32) -> Mesh --- // Generate polygonal mesh GenMeshPlane :: proc(width, length: f32, resX, resZ: c.int) -> Mesh --- // Generate plane mesh (with subdivisions) GenMeshCube :: proc(width, height, length: f32) -> Mesh --- // Generate cuboid mesh GenMeshSphere :: proc(radius: f32, rings, slices: c.int) -> Mesh --- // Generate sphere mesh (standard sphere) GenMeshHemiSphere :: proc(radius: f32, rings, slices: c.int) -> Mesh --- // Generate half-sphere mesh (no bottom cap) GenMeshCylinder :: proc(radius, height: f32, slices: c.int) -> Mesh --- // Generate cylinder mesh GenMeshCone :: proc(radius, height: f32, slices: c.int) -> Mesh --- // Generate cone/pyramid mesh GenMeshTorus :: proc(radius, size: f32, radSeg, sides: c.int) -> Mesh --- // Generate torus mesh GenMeshKnot :: proc(radius, size: f32, radSeg, sides: c.int) -> Mesh --- // Generate trefoil knot mesh GenMeshHeightmap :: proc(heightmap: Image, size: Vector3) -> Mesh --- // Generate heightmap mesh from image data GenMeshCubicmap :: proc(cubicmap: Image, cubeSize: Vector3) -> Mesh --- // Generate cubes-based map mesh from image data // Material loading/unloading functions LoadMaterials :: proc(fileName: cstring, materialCount: ^c.int) -> [^]Material --- // Load materials from model file LoadMaterialDefault :: proc() -> Material --- // Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps) IsMaterialValid :: proc(material: Material) -> bool --- // Check if a material is valid (shader assigned, map textures loaded in GPU) UnloadMaterial :: proc(material: Material) --- // Unload material from GPU memory (VRAM) SetMaterialTexture :: proc(material: ^Material, mapType: MaterialMapIndex, texture: Texture2D) --- // Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...) SetModelMeshMaterial :: proc(model: ^Model, meshId: c.int, materialId: c.int) --- // Set material for a mesh // Model animations loading/unloading functions LoadModelAnimations :: proc(fileName: cstring, animCount: ^c.int) -> [^]ModelAnimation --- // Load model animations from file UpdateModelAnimation :: proc(model: Model, anim: ModelAnimation, frame: c.int) --- // Update model animation pose (CPU) UpdateModelAnimationBones :: proc(model: Model, anim: ModelAnimation, frame: c.int) --- // Update model animation mesh bone matrices (GPU skinning) UnloadModelAnimation :: proc(anim: ModelAnimation) --- // Unload animation data UnloadModelAnimations :: proc(animations: [^]ModelAnimation, animCount: c.int) --- // Unload animation array data IsModelAnimationValid :: proc(model: Model, anim: ModelAnimation) -> bool --- // Check model animation skeleton match // Collision detection functions CheckCollisionSpheres :: proc(center1: Vector3, radius1: f32, center2: Vector3, radius2: f32) -> bool --- // Check collision between two spheres CheckCollisionBoxes :: proc(box1, box2: BoundingBox) -> bool --- // Check collision between two bounding boxes CheckCollisionBoxSphere :: proc(box: BoundingBox, center: Vector3, radius: f32) -> bool --- // Check collision between box and sphere GetRayCollisionSphere :: proc(ray: Ray, center: Vector3, radius: f32) -> RayCollision --- // Get collision info between ray and sphere GetRayCollisionBox :: proc(ray: Ray, box: BoundingBox) -> RayCollision --- // Get collision info between ray and box GetRayCollisionMesh :: proc(ray: Ray, mesh: Mesh, transform: Matrix) -> RayCollision --- // Get collision info between ray and mesh GetRayCollisionTriangle :: proc(ray: Ray, p1, p2, p3: Vector3) -> RayCollision --- // Get collision info between ray and triangle GetRayCollisionQuad :: proc(ray: Ray, p1, p2, p3, p4: Vector3) -> RayCollision --- // Get collision info between ray and quad //------------------------------------------------------------------------------------ // Audio Loading and Playing Functions (Module: audio) //------------------------------------------------------------------------------------ // Audio device management functions InitAudioDevice :: proc() --- // Initialize audio device and context CloseAudioDevice :: proc() --- // Close the audio device and context IsAudioDeviceReady :: proc() -> bool --- // Check if audio device has been initialized successfully SetMasterVolume :: proc(volume: f32) --- // Set master volume (listener) GetMasterVolume :: proc() -> f32 --- // Get master volume (listener) // Wave/Sound loading/unloading functions LoadWave :: proc(fileName: cstring) -> Wave --- // Load wave data from file LoadWaveFromMemory :: proc(fileType: cstring, fileData: rawptr, dataSize: c.int) -> Wave --- // Load wave from memory buffer, fileType refers to extension: i.e. '.wav' IsWaveValid :: proc(wave: Wave) -> bool --- // Checks if wave data is // Checks if wave data is valid (data loaded and parameters) LoadSound :: proc(fileName: cstring) -> Sound --- // Load sound from file LoadSoundFromWave :: proc(wave: Wave) -> Sound --- // Load sound from wave data LoadSoundAlias :: proc(source: Sound) -> Sound --- // Create a new sound that shares the same sample data as the source sound, does not own the sound data IsSoundValid :: proc(sound: Sound) -> bool --- // Checks if a sound is valid (data loaded and buffers initialized) UpdateSound :: proc(sound: Sound, data: rawptr, frameCount: c.int) --- // Update sound buffer with new data UnloadWave :: proc(wave: Wave) --- // Unload wave data UnloadSound :: proc(sound: Sound) --- // Unload sound UnloadSoundAlias :: proc(alias: Sound) --- // Unload a sound alias (does not deallocate sample data) ExportWave :: proc(wave: Wave, fileName: cstring) -> bool --- // Export wave data to file, returns true on success ExportWaveAsCode :: proc(wave: Wave, fileName: cstring) -> bool --- // Export wave sample data to code (.h), returns true on success // Wave/Sound management functions PlaySound :: proc(sound: Sound) --- // Play a sound StopSound :: proc(sound: Sound) --- // Stop playing a sound PauseSound :: proc(sound: Sound) --- // Pause a sound ResumeSound :: proc(sound: Sound) --- // Resume a paused sound IsSoundPlaying :: proc(sound: Sound) -> bool --- // Check if a sound is currently playing SetSoundVolume :: proc(sound: Sound, volume: f32) --- // Set volume for a sound (1.0 is max level) SetSoundPitch :: proc(sound: Sound, pitch: f32) --- // Set pitch for a sound (1.0 is base level) SetSoundPan :: proc(sound: Sound, pan: f32) --- // Set pan for a sound (0.5 is center) WaveCopy :: proc(wave: Wave) -> Wave --- // Copy a wave to a new wave WaveCrop :: proc(wave: ^Wave, initFrame, finalFrame: c.int) --- // Crop a wave to defined samples range WaveFormat :: proc(wave: ^Wave, sampleRate, sampleSize: c.int, channels: c.int) --- // Convert wave data to desired format LoadWaveSamples :: proc(wave: Wave) -> [^]f32 --- // Load samples data from wave as a 32bit float data array UnloadWaveSamples :: proc(samples: [^]f32) --- // Unload samples data loaded with LoadWaveSamples() // Music management functions LoadMusicStream :: proc(fileName: cstring) -> Music --- // Load music stream from file LoadMusicStreamFromMemory :: proc(fileType: cstring, data: rawptr, dataSize: c.int) -> Music --- // Load music stream from data IsMusicValid :: proc(music: Music) -> bool --- // Checks if a music stream is valid (context and buffers initialized) UnloadMusicStream :: proc(music: Music) --- // Unload music stream PlayMusicStream :: proc(music: Music) --- // Start music playing IsMusicStreamPlaying :: proc(music: Music) -> bool --- // Check if music is playing UpdateMusicStream :: proc(music: Music) --- // Updates buffers for music streaming StopMusicStream :: proc(music: Music) --- // Stop music playing PauseMusicStream :: proc(music: Music) --- // Pause music playing ResumeMusicStream :: proc(music: Music) --- // Resume playing paused music SeekMusicStream :: proc(music: Music, position: f32) --- // Seek music to a position (in seconds) SetMusicVolume :: proc(music: Music, volume: f32) --- // Set volume for music (1.0 is max level) SetMusicPitch :: proc(music: Music, pitch: f32) --- // Set pitch for a music (1.0 is base level) SetMusicPan :: proc(music: Music, pan: f32) --- // Set pan for a music (0.5 is center) GetMusicTimeLength :: proc(music: Music) -> f32 --- // Get music time length (in seconds) GetMusicTimePlayed :: proc(music: Music) -> f32 --- // Get current music time played (in seconds) // AudioStream management functions LoadAudioStream :: proc(sampleRate, sampleSize: c.uint, channels: c.uint) -> AudioStream --- // Load audio stream (to stream raw audio pcm data) IsAudioStreamValid :: proc(stream: AudioStream) -> bool --- // Checks if an audio stream is valid (buffers initialized) UnloadAudioStream :: proc(stream: AudioStream) --- // Unload audio stream and free memory UpdateAudioStream :: proc(stream: AudioStream, data: rawptr, frameCount: c.int) --- // Update audio stream buffers with data IsAudioStreamProcessed :: proc(stream: AudioStream) -> bool --- // Check if any audio stream buffers requires refill PlayAudioStream :: proc(stream: AudioStream) --- // Play audio stream PauseAudioStream :: proc(stream: AudioStream) --- // Pause audio stream ResumeAudioStream :: proc(stream: AudioStream) --- // Resume audio stream IsAudioStreamPlaying :: proc(stream: AudioStream) -> bool --- // Check if audio stream is playing StopAudioStream :: proc(stream: AudioStream) --- // Stop audio stream SetAudioStreamVolume :: proc(stream: AudioStream, volume: f32) --- // Set volume for audio stream (1.0 is max level) SetAudioStreamPitch :: proc(stream: AudioStream, pitch: f32) --- // Set pitch for audio stream (1.0 is base level) SetAudioStreamPan :: proc(stream: AudioStream, pan: f32) --- // Set pan for audio stream (0.5 is centered) SetAudioStreamBufferSizeDefault :: proc(size: c.int) --- // Default size for new audio streams SetAudioStreamCallback :: proc(stream: AudioStream, callback: AudioCallback) --- // Audio thread callback to request new data AttachAudioStreamProcessor :: proc(stream: AudioStream, processor: AudioCallback) --- // Attach audio stream processor to stream, receives the samples as 'float' DetachAudioStreamProcessor :: proc(stream: AudioStream, processor: AudioCallback) --- // Detach audio stream processor from stream AttachAudioMixedProcessor :: proc(processor: AudioCallback) --- // Attach audio stream processor to the entire audio pipeline, receives the samples as 'float' DetachAudioMixedProcessor :: proc(processor: AudioCallback) --- // Detach audio stream processor from the entire audio pipeline } // Check if a gesture have been detected IsGestureDetected :: proc "c" (gesture: Gesture) -> bool { @(default_calling_convention = "c") foreign lib { IsGestureDetected :: proc "c" (gesture: Gestures) -> bool --- } return IsGestureDetected({gesture}) } // Text formatting with variables (sprintf style) TextFormat :: proc(text: cstring, args: ..any) -> cstring { @(static) buffers: [MAX_TEXTFORMAT_BUFFERS][MAX_TEXT_BUFFER_LENGTH]byte @(static) index: u32 buffer := buffers[index][:] mem.zero_slice(buffer) index = (index + 1) % MAX_TEXTFORMAT_BUFFERS str := fmt.bprintf(buffer[:len(buffer) - 1], string(text), ..args) buffer[len(str)] = 0 return cstring(raw_data(buffer)) } // Text formatting with variables (sprintf style) and allocates (must be freed with 'MemFree') TextFormatAlloc :: proc(text: cstring, args: ..any) -> cstring { return fmt.caprintf(string(text), ..args, allocator = MemAllocator()) } // Internal memory free MemFree :: proc { MemFreePtr, MemFreeCstring, } @(default_calling_convention = "c") foreign lib { @(link_name = "MemFree") MemFreePtr :: proc(ptr: rawptr) --- } MemFreeCstring :: proc "c" (s: cstring) { MemFreePtr(rawptr(s)) } MemAllocator :: proc "contextless" () -> mem.Allocator { return mem.Allocator{MemAllocatorProc, nil} } MemAllocatorProc :: proc( allocator_data: rawptr, mode: mem.Allocator_Mode, size, alignment: int, old_memory: rawptr, old_size: int, location := #caller_location, ) -> ( data: []byte, err: mem.Allocator_Error, ) { switch mode { case .Alloc, .Alloc_Non_Zeroed: ptr := MemAlloc(c.uint(size)) if ptr == nil { err = .Out_Of_Memory return } data = mem.byte_slice(ptr, size) return case .Free: MemFree(old_memory) return nil, nil case .Resize, .Resize_Non_Zeroed: ptr := MemRealloc(old_memory, c.uint(size)) if ptr == nil { err = .Out_Of_Memory return } data = mem.byte_slice(ptr, size) return case .Free_All, .Query_Features, .Query_Info: return nil, .Mode_Not_Implemented } return nil, .Mode_Not_Implemented } // RayLib 5.5 renamed Is*Ready to Is*Valid. // See: https://github.com/raysan5/raylib/commit/8cbf34ddc495e2bca42245f786915c27210b0507 IsImageReady :: IsImageValid IsTextureReady :: IsTextureValid IsRenderTextureReady :: IsRenderTextureValid IsFontReady :: IsFontValid IsModelReady :: IsModelValid IsMaterialReady :: IsMaterialValid IsWaveReady :: IsWaveValid IsSoundReady :: IsSoundValid IsMusicReady :: IsMusicValid IsAudioStreamReady :: IsAudioStreamValid IsShaderReady :: IsShaderValid