Initial changes for Raylib 5.0 and some missing functions.

This commit is contained in:
jussi
2023-11-20 21:04:53 +02:00
parent 7765a23a2c
commit 05eaafb79e
21 changed files with 1659 additions and 803 deletions

404
API.md
View File

@@ -1803,67 +1803,67 @@ Shader attribute type: vec4 (4 float)
--- ---
> PIXELFORMAT_COMPRESSED_DXT1_RGB = 11 > PIXELFORMAT_COMPRESSED_DXT1_RGB = 14
4 bpp (no alpha) 4 bpp (no alpha)
--- ---
> PIXELFORMAT_COMPRESSED_DXT1_RGBA = 12 > PIXELFORMAT_COMPRESSED_DXT1_RGBA = 15
4 bpp (1 bit alpha) 4 bpp (1 bit alpha)
--- ---
> PIXELFORMAT_COMPRESSED_DXT3_RGBA = 13 > PIXELFORMAT_COMPRESSED_DXT3_RGBA = 16
8 bpp 8 bpp
--- ---
> PIXELFORMAT_COMPRESSED_DXT5_RGBA = 14 > PIXELFORMAT_COMPRESSED_DXT5_RGBA = 17
8 bpp 8 bpp
--- ---
> PIXELFORMAT_COMPRESSED_ETC1_RGB = 15 > PIXELFORMAT_COMPRESSED_ETC1_RGB = 18
4 bpp 4 bpp
--- ---
> PIXELFORMAT_COMPRESSED_ETC2_RGB = 16 > PIXELFORMAT_COMPRESSED_ETC2_RGB = 19
4 bpp 4 bpp
--- ---
> PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA = 17 > PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA = 20
8 bpp 8 bpp
--- ---
> PIXELFORMAT_COMPRESSED_PVRT_RGB = 18 > PIXELFORMAT_COMPRESSED_PVRT_RGB = 21
4 bpp 4 bpp
--- ---
> PIXELFORMAT_COMPRESSED_PVRT_RGBA = 19 > PIXELFORMAT_COMPRESSED_PVRT_RGBA = 22
4 bpp 4 bpp
--- ---
> PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA = 20 > PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA = 23
8 bpp 8 bpp
--- ---
> PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA = 21 > PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA = 24
2 bpp 2 bpp
@@ -3540,6 +3540,12 @@ GLFW event joystick
--- ---
> RL.CloseWindow()
Close window and unload OpenGL context and free all resources
---
> state = RL.IsWindowReady() > state = RL.IsWindowReady()
Check if window has been initialized successfully Check if window has been initialized successfully
@@ -3588,79 +3594,11 @@ Check if window is currently focused (only PLATFORM_DESKTOP)
--- ---
> RL.SetWindowMonitor( int monitor ) > resized = RL.IsWindowResized()
Set monitor for the current window (fullscreen mode) Check if window has been resized from last frame
--- - Success return bool
> RL.SetWindowPosition( Vector2 pos )
Set window position on screen
---
> RL.SetWindowSize( Vector2 size )
Set window dimensions
---
> RL.SetWindowOpacity( float opacity )
Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
---
> windowHandle = RL.GetWindowHandle()
Get native window handle. Return as lightuserdata
- Success return lightuserdata
---
> RL.SetWindowMinSize( Vector2 size )
Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
---
> position = RL.GetMonitorPosition( int monitor )
Get specified monitor position
- Success return Vector2
---
> size = RL.GetMonitorSize( int monitor )
Get specified monitor size
- Success return Vector2
---
> position = RL.GetWindowPosition()
Get window position on monitor
- Success return Vector2
---
> size = RL.GetScreenSize()
Get screen size
- Success return Vector2
---
> RL.SetWindowState( int flag )
Set window configuration state using flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
--- ---
@@ -3672,6 +3610,12 @@ Check if one specific window flag is enabled (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_
--- ---
> RL.SetWindowState( int flag )
Set window configuration state using flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
---
> resized = RL.ClearWindowState( int flag ) > resized = RL.ClearWindowState( int flag )
Clear window configuration state flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...) Clear window configuration state flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
@@ -3680,11 +3624,33 @@ Clear window configuration state flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZA
--- ---
> resized = RL.IsWindowResized() > RL.ToggleFullscreen()
Check if window has been resized from last frame Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
- Success return bool ---
> RL.ToggleBorderlessWindowed()
Toggle window state: borderless windowed (only PLATFORM_DESKTOP)
---
> RL.MaximizeWindow()
Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
---
> RL.MinimizeWindow()
Set window state: minimized, if resizable (only PLATFORM_DESKTOP)
---
> RL.RestoreWindow()
Set window state: not minimized/maximized (only PLATFORM_DESKTOP)
--- ---
@@ -3702,7 +3668,73 @@ Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP)
> RL.SetWindowTitle( string title ) > RL.SetWindowTitle( string title )
Set title for window (Only PLATFORM_DESKTOP) Set title for window (only PLATFORM_DESKTOP and PLATFORM_WEB)
---
> RL.SetWindowPosition( Vector2 pos )
Set window position on screen
---
> RL.SetWindowMonitor( int monitor )
Set monitor for the current window
---
> RL.SetWindowMinSize( Vector2 size )
Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
---
> RL.SetWindowMaxSize( Vector2 size )
Set window maximum dimensions (for FLAG_WINDOW_RESIZABLE)
---
> RL.SetWindowSize( Vector2 size )
Set window dimensions
---
> RL.SetWindowOpacity( float opacity )
Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
---
> RL.SetWindowFocused()
Set window focused (only PLATFORM_DESKTOP)
---
> windowHandle = RL.GetWindowHandle()
Get native window handle. Return as lightuserdata
- Success return lightuserdata
---
> size = RL.GetScreenSize()
Get screen size
- Success return Vector2
---
> size = RL.GetRenderSize()
Get render size
- Success return Vector2
--- ---
@@ -3722,6 +3754,22 @@ Get current connected monitor
--- ---
> position = RL.GetMonitorPosition( int monitor )
Get specified monitor position
- Success return Vector2
---
> size = RL.GetMonitorSize( int monitor )
Get specified monitor size
- Success return Vector2
---
> size = RL.GetMonitorPhysicalSize( int monitor ) > size = RL.GetMonitorPhysicalSize( int monitor )
Get specified monitor physical size in millimetres Get specified monitor physical size in millimetres
@@ -3738,6 +3786,14 @@ Get specified monitor refresh rate
--- ---
> position = RL.GetWindowPosition()
Get window position on monitor
- Success return Vector2
---
> dpi = RL.GetWindowScaleDPI() > dpi = RL.GetWindowScaleDPI()
Get window scale DPI factor Get window scale DPI factor
@@ -3748,18 +3804,12 @@ Get window scale DPI factor
> name = RL.GetMonitorName( int monitor ) > name = RL.GetMonitorName( int monitor )
Get the human-readable, UTF-8 encoded name of the monitor Get the human-readable, UTF-8 encoded name of the specified monitor
- Success return string - Success return string
--- ---
> RL.CloseWindow()
Close window and unload OpenGL context and free all resources
---
> RL.SetClipboardText( string text ) > RL.SetClipboardText( string text )
Set clipboard text content Set clipboard text content
@@ -4100,6 +4150,32 @@ Get elapsed time in seconds since InitWindow()
--- ---
## Core - Random values generation functions
---
> RL.SetRandomSeed( int seed )
Set the seed for the random number generator
---
> time = RL.GetRandomValue( int min, int max )
Get a random value between min and max (both included)
- Success return int
---
> sequence = RL.GetRandomValue( int count, int min, int max )
Load random values sequence, no values repeated
- Success return int{}
---
## Core - Misc ## Core - Misc
--- ---
@@ -4144,7 +4220,7 @@ Get the log level for bad function calls and invalid data formats.
> RL.OpenURL( string url ) > RL.OpenURL( string url )
Open URL with default system browser (If available) Open URL with default system browser (if available)
--- ---
@@ -4254,6 +4330,14 @@ Get current working directory (Uses static string)
--- ---
> directory = RL.GetApplicationDirectory()
Get the directory of the running application (uses static string)
- Success return string
---
> fileNames = RL.LoadDirectoryFiles( string dirPath ) > fileNames = RL.LoadDirectoryFiles( string dirPath )
Load directory filepaths Load directory filepaths
@@ -4444,6 +4528,14 @@ Detect if a gamepad is available
--- ---
> name = RL.GetGamepadName( int gamepad )
Return gamepad internal name id
- Success return string
---
> pressed = RL.IsGamepadButtonPressed( int gamepad, int button ) > pressed = RL.IsGamepadButtonPressed( int gamepad, int button )
Detect if a gamepad button has been pressed once Detect if a gamepad button has been pressed once
@@ -4484,11 +4576,11 @@ Return axis movement value for a gamepad axis
--- ---
> name = RL.GetGamepadName( int gamepad ) > result = RL.SetGamepadMappings( string mappings )
Return gamepad internal name id Set internal gamepad mappings (SDL_GameControllerDB)
- Success return string - Success return int
--- ---
@@ -5005,30 +5097,18 @@ Draw a line defining thickness
--- ---
> RL.DrawLineBezier( Vector2 startPos, Vector2 endPos, float thickness, Color color )
Draw a line using cubic-bezier curves in-out
---
> RL.DrawLineBezierQuad( Vector2 startPos, Vector2 endPos, Vector2 controlPos, float thickness, Color color )
Draw line using quadratic bezier curves with a control point
---
> RL.DrawLineBezierCubic( Vector2 startPos, Vector2 endPos, Vector2 startControlPos, Vector2 endControlPos, float thickness, Color color )
Draw line using quadratic bezier curves with a control point
---
> RL.DrawLineStrip( Vector2{} points, Color color ) > RL.DrawLineStrip( Vector2{} points, Color color )
Draw lines sequence Draw lines sequence
--- ---
> RL.DrawLineBezier( Vector2 startPos, Vector2 endPos, float thickness, Color color )
Draw a line using cubic-bezier curves in-out
---
> RL.DrawCircle( Vector2 center, float radius, Color color ) > RL.DrawCircle( Vector2 center, float radius, Color color )
Draw a color-filled circle Draw a color-filled circle
@@ -5285,6 +5365,14 @@ Load image from RAW file data
--- ---
> image = RL.LoadImageSvg( string fileNameOrString, Vector2 size )
Load image from SVG file data or string with specified size
- Success return Image
---
> image, frameCount = RL.LoadImageAnim( string fileName ) > image, frameCount = RL.LoadImageAnim( string fileName )
Load image sequence from file (frames appended to image.data). All frames are returned in RGBA format Load image sequence from file (frames appended to image.data). All frames are returned in RGBA format
@@ -5340,6 +5428,14 @@ Export image data to file, returns true on success
--- ---
> buffer = RL.ExportImageToMemory( Image image, string fileType )
Export image to memory buffer
- Success return Buffer
---
> success = RL.ExportImageAsCode( Image image, string fileName ) > success = RL.ExportImageAsCode( Image image, string fileName )
Export image as code file defining an array of bytes, returns true on success Export image as code file defining an array of bytes, returns true on success
@@ -5360,17 +5456,9 @@ Generate image: plain color
--- ---
> image = RL.GenImageGradientV( Vector2 size, Color top, Color bottom ) > image = RL.GenImageGradientLinear( Vector2 size, int direction, Color a, Color b )
Generate image: vertical gradient Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient
- Success return Image
---
> image = RL.GenImageGradientH( Vector2 size, Color left, Color right )
Generate image: horizontal gradient
- Success return Image - Success return Image
@@ -5384,6 +5472,14 @@ Generate image: radial gradient
--- ---
> image = RL.GenImageGradientSquare( Vector2 size, float density, Color inner, Color outer )
Generate image: square gradient
- Success return Image
---
> image = RL.GenImageChecked( Vector2 size, Vector2 checks, Color col1, Color col2 ) > image = RL.GenImageChecked( Vector2 size, Vector2 checks, Color col1, Color col2 )
Generate image: checked Generate image: checked
@@ -5542,6 +5638,12 @@ Flip image horizontally
--- ---
> RL.ImageRotate( Image image, int degrees )
Rotate image by input angle in degrees (-359 to 359)
---
> RL.ImageRotateCW( Image image ) > RL.ImageRotateCW( Image image )
Rotate image clockwise 90deg Rotate image clockwise 90deg
@@ -6048,9 +6150,9 @@ Load font from file into GPU memory (VRAM)
--- ---
> font = RL.LoadFontEx( string fileName, int fontSize, int{} fontChars ) > font = RL.LoadFontEx( string fileName, int fontSize, int{} codepoints )
Load font from file with extended parameters, use NULL for fontChars to load the default character set Load font from file with extended parameters, use NULL for codepoints to load the default character set
- Failure return nil - Failure return nil
- Success return Font - Success return Font
@@ -6139,6 +6241,12 @@ Draw text using font inside rectangle limits with support for tint and backgroun
--- ---
> size = RL.SetTextLineSpacing( int spacing )
Set vertical line spacing when drawing with line-breaks
---
> size = RL.MeasureText( Font font, string text, float fontSize, float spacing ) > size = RL.MeasureText( Font font, string text, float fontSize, float spacing )
Measure string size for Font Measure string size for Font
@@ -6834,12 +6942,40 @@ Get collision info between ray and quad
--- ---
> RL.InitAudioDevice()
Initialize audio device and context
---
> RL.CloseAudioDevice()
Close the audio device and context
---
> isReady = RL.IsAudioDeviceReady()
Check if audio device has been initialized successfully
- Success return bool
---
> RL.SetMasterVolume( float volume ) > RL.SetMasterVolume( float volume )
Set master volume (listener) Set master volume (listener)
--- ---
> isReady = RL.GetMasterVolume()
Get master volume (listener)
- Success return float
---
## Audio - Wave/Sound loading/unloading functions ## Audio - Wave/Sound loading/unloading functions
--- ---
@@ -6878,6 +7014,14 @@ Load sound from wave data
--- ---
> sound = RL.LoadSoundAlias( Sound source )
Create a new sound that shares the same sample data as the source sound, does not own the sound data
- Success return Sound
---
> isReady = RL.IsSoundReady( Sound sound ) > isReady = RL.IsSoundReady( Sound sound )
Checks if a sound is ready Checks if a sound is ready
@@ -6898,6 +7042,12 @@ Unload sound
--- ---
> RL.UnloadSoundAlias( Sound alias )
Unload a sound alias (does not deallocate sample data)
---
> success = RL.ExportWave( Wave wave, string fileName ) > success = RL.ExportWave( Wave wave, string fileName )
Export wave data to file, returns true on success Export wave data to file, returns true on success

View File

@@ -537,27 +537,27 @@ RL.PIXELFORMAT_UNCOMPRESSED_R32G32B32=9
---32*4 bpp (4 channels - float) ---32*4 bpp (4 channels - float)
RL.PIXELFORMAT_UNCOMPRESSED_R32G32B32A32=10 RL.PIXELFORMAT_UNCOMPRESSED_R32G32B32A32=10
---4 bpp (no alpha) ---4 bpp (no alpha)
RL.PIXELFORMAT_COMPRESSED_DXT1_RGB=11 RL.PIXELFORMAT_COMPRESSED_DXT1_RGB=14
---4 bpp (1 bit alpha) ---4 bpp (1 bit alpha)
RL.PIXELFORMAT_COMPRESSED_DXT1_RGBA=12 RL.PIXELFORMAT_COMPRESSED_DXT1_RGBA=15
---8 bpp ---8 bpp
RL.PIXELFORMAT_COMPRESSED_DXT3_RGBA=13 RL.PIXELFORMAT_COMPRESSED_DXT3_RGBA=16
---8 bpp ---8 bpp
RL.PIXELFORMAT_COMPRESSED_DXT5_RGBA=14 RL.PIXELFORMAT_COMPRESSED_DXT5_RGBA=17
---4 bpp ---4 bpp
RL.PIXELFORMAT_COMPRESSED_ETC1_RGB=15 RL.PIXELFORMAT_COMPRESSED_ETC1_RGB=18
---4 bpp ---4 bpp
RL.PIXELFORMAT_COMPRESSED_ETC2_RGB=16 RL.PIXELFORMAT_COMPRESSED_ETC2_RGB=19
---8 bpp ---8 bpp
RL.PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA=17 RL.PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA=20
---4 bpp ---4 bpp
RL.PIXELFORMAT_COMPRESSED_PVRT_RGB=18 RL.PIXELFORMAT_COMPRESSED_PVRT_RGB=21
---4 bpp ---4 bpp
RL.PIXELFORMAT_COMPRESSED_PVRT_RGBA=19 RL.PIXELFORMAT_COMPRESSED_PVRT_RGBA=22
---8 bpp ---8 bpp
RL.PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA=20 RL.PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA=23
---2 bpp ---2 bpp
RL.PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA=21 RL.PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA=24
-- Globals - TextureFilters -- Globals - TextureFilters
@@ -1214,6 +1214,10 @@ RL.EVENT_CURSOR_ENTER=10
RL.EVENT_JOYSTICK=11 RL.EVENT_JOYSTICK=11
-- Core - Window-related functions -- Core - Window-related functions
---Close window and unload OpenGL context and free all resources
---@return any RL.CloseWindow
function RL.CloseWindow() end
---Check if window has been initialized successfully ---Check if window has been initialized successfully
---- Success return bool ---- Success return bool
---@return any state ---@return any state
@@ -1244,16 +1248,83 @@ function RL.IsWindowMaximized() end
---@return any state ---@return any state
function RL.IsWindowFocused() end function RL.IsWindowFocused() end
---Set monitor for the current window (fullscreen mode) ---Check if window has been resized from last frame
---@param monitor integer ---- Success return bool
---@return any RL.SetWindowMonitor ---@return any resized
function RL.SetWindowMonitor( monitor ) end function RL.IsWindowResized() end
---Check if one specific window flag is enabled (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
---- Success return bool
---@param flag integer
---@return any state
function RL.IsWindowState( flag ) end
---Set window configuration state using flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
---@param flag integer
---@return any RL.SetWindowState
function RL.SetWindowState( flag ) end
---Clear window configuration state flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
---- Success return bool
---@param flag integer
---@return any resized
function RL.ClearWindowState( flag ) end
---Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
---@return any RL.ToggleFullscreen
function RL.ToggleFullscreen() end
---Toggle window state: borderless windowed (only PLATFORM_DESKTOP)
---@return any RL.ToggleBorderlessWindowed
function RL.ToggleBorderlessWindowed() end
---Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
---@return any RL.MaximizeWindow
function RL.MaximizeWindow() end
---Set window state: minimized, if resizable (only PLATFORM_DESKTOP)
---@return any RL.MinimizeWindow
function RL.MinimizeWindow() end
---Set window state: not minimized/maximized (only PLATFORM_DESKTOP)
---@return any RL.RestoreWindow
function RL.RestoreWindow() end
---Set icon for window (Only PLATFORM_DESKTOP)
---@param image any
---@return any RL.SetWindowIcon
function RL.SetWindowIcon( image ) end
---Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP)
---@param images table
---@return any RL.SetWindowIcons
function RL.SetWindowIcons( images ) end
---Set title for window (only PLATFORM_DESKTOP and PLATFORM_WEB)
---@param title string
---@return any RL.SetWindowTitle
function RL.SetWindowTitle( title ) end
---Set window position on screen ---Set window position on screen
---@param pos table ---@param pos table
---@return any RL.SetWindowPosition ---@return any RL.SetWindowPosition
function RL.SetWindowPosition( pos ) end function RL.SetWindowPosition( pos ) end
---Set monitor for the current window
---@param monitor integer
---@return any RL.SetWindowMonitor
function RL.SetWindowMonitor( monitor ) end
---Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
---@param size table
---@return any RL.SetWindowMinSize
function RL.SetWindowMinSize( size ) end
---Set window maximum dimensions (for FLAG_WINDOW_RESIZABLE)
---@param size table
---@return any RL.SetWindowMaxSize
function RL.SetWindowMaxSize( size ) end
---Set window dimensions ---Set window dimensions
---@param size table ---@param size table
---@return any RL.SetWindowSize ---@return any RL.SetWindowSize
@@ -1264,15 +1335,34 @@ function RL.SetWindowSize( size ) end
---@return any RL.SetWindowOpacity ---@return any RL.SetWindowOpacity
function RL.SetWindowOpacity( opacity ) end function RL.SetWindowOpacity( opacity ) end
---Set window focused (only PLATFORM_DESKTOP)
---@return any RL.SetWindowFocused
function RL.SetWindowFocused() end
---Get native window handle. Return as lightuserdata ---Get native window handle. Return as lightuserdata
---- Success return lightuserdata ---- Success return lightuserdata
---@return any windowHandle ---@return any windowHandle
function RL.GetWindowHandle() end function RL.GetWindowHandle() end
---Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE) ---Get screen size
---@param size table ---- Success return Vector2
---@return any RL.SetWindowMinSize ---@return any size
function RL.SetWindowMinSize( size ) end function RL.GetScreenSize() end
---Get render size
---- Success return Vector2
---@return any size
function RL.GetRenderSize() end
---Get number of connected monitors
---- Success return int
---@return any count
function RL.GetMonitorCount() end
---Get current connected monitor
---- Success return int
---@return any monitor
function RL.GetCurrentMonitor() end
---Get specified monitor position ---Get specified monitor position
---- Success return Vector2 ---- Success return Vector2
@@ -1286,63 +1376,6 @@ function RL.GetMonitorPosition( monitor ) end
---@return any size ---@return any size
function RL.GetMonitorSize( monitor ) end function RL.GetMonitorSize( monitor ) end
---Get window position on monitor
---- Success return Vector2
---@return any position
function RL.GetWindowPosition() end
---Get screen size
---- Success return Vector2
---@return any size
function RL.GetScreenSize() end
---Set window configuration state using flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
---@param flag integer
---@return any RL.SetWindowState
function RL.SetWindowState( flag ) end
---Check if one specific window flag is enabled (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
---- Success return bool
---@param flag integer
---@return any state
function RL.IsWindowState( flag ) end
---Clear window configuration state flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
---- Success return bool
---@param flag integer
---@return any resized
function RL.ClearWindowState( flag ) end
---Check if window has been resized from last frame
---- Success return bool
---@return any resized
function RL.IsWindowResized() end
---Set icon for window (Only PLATFORM_DESKTOP)
---@param image any
---@return any RL.SetWindowIcon
function RL.SetWindowIcon( image ) end
---Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP)
---@param images table
---@return any RL.SetWindowIcons
function RL.SetWindowIcons( images ) end
---Set title for window (Only PLATFORM_DESKTOP)
---@param title string
---@return any RL.SetWindowTitle
function RL.SetWindowTitle( title ) end
---Get number of connected monitors
---- Success return int
---@return any count
function RL.GetMonitorCount() end
---Get current connected monitor
---- Success return int
---@return any monitor
function RL.GetCurrentMonitor() end
---Get specified monitor physical size in millimetres ---Get specified monitor physical size in millimetres
---- Success return Vector2 ---- Success return Vector2
---@param monitor integer ---@param monitor integer
@@ -1355,21 +1388,22 @@ function RL.GetMonitorPhysicalSize( monitor ) end
---@return any refreshRate ---@return any refreshRate
function RL.GetMonitorRefreshRate( monitor ) end function RL.GetMonitorRefreshRate( monitor ) end
---Get window position on monitor
---- Success return Vector2
---@return any position
function RL.GetWindowPosition() end
---Get window scale DPI factor ---Get window scale DPI factor
---- Success return Vector2 ---- Success return Vector2
---@return any dpi ---@return any dpi
function RL.GetWindowScaleDPI() end function RL.GetWindowScaleDPI() end
---Get the human-readable, UTF-8 encoded name of the monitor ---Get the human-readable, UTF-8 encoded name of the specified monitor
---- Success return string ---- Success return string
---@param monitor integer ---@param monitor integer
---@return any name ---@return any name
function RL.GetMonitorName( monitor ) end function RL.GetMonitorName( monitor ) end
---Close window and unload OpenGL context and free all resources
---@return any RL.CloseWindow
function RL.CloseWindow() end
---Set clipboard text content ---Set clipboard text content
---@param text string ---@param text string
---@return any RL.SetClipboardText ---@return any RL.SetClipboardText
@@ -1641,6 +1675,28 @@ function RL.GetFrameTime() end
---@return any time ---@return any time
function RL.GetTime() end function RL.GetTime() end
-- Core - Random values generation functions
---Set the seed for the random number generator
---@param seed integer
---@return any RL.SetRandomSeed
function RL.SetRandomSeed( seed ) end
---Get a random value between min and max (both included)
---- Success return int
---@param min integer
---@param max integer
---@return any time
function RL.GetRandomValue( min, max ) end
---Load random values sequence, no values repeated
---- Success return int{}
---@param count integer
---@param min integer
---@param max integer
---@return any sequence
function RL.GetRandomValue( count, min, max ) end
-- Core - Misc -- Core - Misc
---Takes a screenshot of current screen (filename extension defines format) ---Takes a screenshot of current screen (filename extension defines format)
@@ -1674,7 +1730,7 @@ function RL.SetLogLevelInvalid( logLevel ) end
---@return any logLevel ---@return any logLevel
function RL.GetLogLevelInvalid() end function RL.GetLogLevelInvalid() end
---Open URL with default system browser (If available) ---Open URL with default system browser (if available)
---@param url string ---@param url string
---@return any RL.OpenURL ---@return any RL.OpenURL
function RL.OpenURL( url ) end function RL.OpenURL( url ) end
@@ -1756,6 +1812,11 @@ function RL.GetPrevDirectoryPath( dirPath ) end
---@return any directory ---@return any directory
function RL.GetWorkingDirectory() end function RL.GetWorkingDirectory() end
---Get the directory of the running application (uses static string)
---- Success return string
---@return any directory
function RL.GetApplicationDirectory() end
---Load directory filepaths ---Load directory filepaths
---- Success return string{} ---- Success return string{}
---@param dirPath string ---@param dirPath string
@@ -1898,6 +1959,12 @@ function RL.GetKeyScancode( key ) end
---@return any available ---@return any available
function RL.IsGamepadAvailable( gamepad ) end function RL.IsGamepadAvailable( gamepad ) end
---Return gamepad internal name id
---- Success return string
---@param gamepad integer
---@return any name
function RL.GetGamepadName( gamepad ) end
---Detect if a gamepad button has been pressed once ---Detect if a gamepad button has been pressed once
---- Success return bool ---- Success return bool
---@param gamepad integer ---@param gamepad integer
@@ -1932,11 +1999,11 @@ function RL.GetGamepadAxisCount( gamepad ) end
---@return any value ---@return any value
function RL.GetGamepadAxisMovement( gamepad, axis ) end function RL.GetGamepadAxisMovement( gamepad, axis ) end
---Return gamepad internal name id ---Set internal gamepad mappings (SDL_GameControllerDB)
---- Success return string ---- Success return int
---@param gamepad integer ---@param mappings string
---@return any name ---@return any result
function RL.GetGamepadName( gamepad ) end function RL.SetGamepadMappings( mappings ) end
-- Core - Input-related functions: mouse -- Core - Input-related functions: mouse
@@ -2356,6 +2423,12 @@ function RL.DrawPixel( pos, color ) end
---@return any RL.DrawLine ---@return any RL.DrawLine
function RL.DrawLine( startPos, endPos, thickness, color ) end function RL.DrawLine( startPos, endPos, thickness, color ) end
---Draw lines sequence
---@param points table
---@param color table
---@return any RL.DrawLineStrip
function RL.DrawLineStrip( points, color ) end
---Draw a line using cubic-bezier curves in-out ---Draw a line using cubic-bezier curves in-out
---@param startPos table ---@param startPos table
---@param endPos table ---@param endPos table
@@ -2364,31 +2437,6 @@ function RL.DrawLine( startPos, endPos, thickness, color ) end
---@return any RL.DrawLineBezier ---@return any RL.DrawLineBezier
function RL.DrawLineBezier( startPos, endPos, thickness, color ) end function RL.DrawLineBezier( startPos, endPos, thickness, color ) end
---Draw line using quadratic bezier curves with a control point
---@param startPos table
---@param endPos table
---@param controlPos table
---@param thickness number
---@param color table
---@return any RL.DrawLineBezierQuad
function RL.DrawLineBezierQuad( startPos, endPos, controlPos, thickness, color ) end
---Draw line using quadratic bezier curves with a control point
---@param startPos table
---@param endPos table
---@param startControlPos table
---@param endControlPos table
---@param thickness number
---@param color table
---@return any RL.DrawLineBezierCubic
function RL.DrawLineBezierCubic( startPos, endPos, startControlPos, endControlPos, thickness, color ) end
---Draw lines sequence
---@param points table
---@param color table
---@return any RL.DrawLineStrip
function RL.DrawLineStrip( points, color ) end
---Draw a color-filled circle ---Draw a color-filled circle
---@param center table ---@param center table
---@param radius number ---@param radius number
@@ -2694,6 +2742,13 @@ function RL.LoadImage( fileName ) end
---@return any image ---@return any image
function RL.LoadImageRaw( fileName, size, format, headerSize ) end function RL.LoadImageRaw( fileName, size, format, headerSize ) end
---Load image from SVG file data or string with specified size
---- Success return Image
---@param fileNameOrString string
---@param size table
---@return any image
function RL.LoadImageSvg( fileNameOrString, size ) end
---Load image sequence from file (frames appended to image.data). All frames are returned in RGBA format ---Load image sequence from file (frames appended to image.data). All frames are returned in RGBA format
---- Failure return nil ---- Failure return nil
---- Success return Image, int ---- Success return Image, int
@@ -2739,6 +2794,13 @@ function RL.UnloadImage( image ) end
---@return any success ---@return any success
function RL.ExportImage( image, fileName ) end function RL.ExportImage( image, fileName ) end
---Export image to memory buffer
---- Success return Buffer
---@param image any
---@param fileType string
---@return any buffer
function RL.ExportImageToMemory( image, fileType ) end
---Export image as code file defining an array of bytes, returns true on success ---Export image as code file defining an array of bytes, returns true on success
---- Success return bool ---- Success return bool
---@param image any ---@param image any
@@ -2755,21 +2817,14 @@ function RL.ExportImageAsCode( image, fileName ) end
---@return any image ---@return any image
function RL.GenImageColor( size, color ) end function RL.GenImageColor( size, color ) end
---Generate image: vertical gradient ---Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient
---- Success return Image ---- Success return Image
---@param size table ---@param size table
---@param top table ---@param direction integer
---@param bottom table ---@param a table
---@param b table
---@return any image ---@return any image
function RL.GenImageGradientV( size, top, bottom ) end function RL.GenImageGradientLinear( size, direction, a, b ) end
---Generate image: horizontal gradient
---- Success return Image
---@param size table
---@param left table
---@param right table
---@return any image
function RL.GenImageGradientH( size, left, right ) end
---Generate image: radial gradient ---Generate image: radial gradient
---- Success return Image ---- Success return Image
@@ -2780,6 +2835,15 @@ function RL.GenImageGradientH( size, left, right ) end
---@return any image ---@return any image
function RL.GenImageGradientRadial( size, density, inner, outer ) end function RL.GenImageGradientRadial( size, density, inner, outer ) end
---Generate image: square gradient
---- Success return Image
---@param size table
---@param density number
---@param inner table
---@param outer table
---@return any image
function RL.GenImageGradientSquare( size, density, inner, outer ) end
---Generate image: checked ---Generate image: checked
---- Success return Image ---- Success return Image
---@param size table ---@param size table
@@ -2932,6 +2996,12 @@ function RL.ImageFlipVertical( image ) end
---@return any RL.ImageFlipHorizontal ---@return any RL.ImageFlipHorizontal
function RL.ImageFlipHorizontal( image ) end function RL.ImageFlipHorizontal( image ) end
---Rotate image by input angle in degrees (-359 to 359)
---@param image any
---@param degrees integer
---@return any RL.ImageRotate
function RL.ImageRotate( image, degrees ) end
---Rotate image clockwise 90deg ---Rotate image clockwise 90deg
---@param image any ---@param image any
---@return any RL.ImageRotateCW ---@return any RL.ImageRotateCW
@@ -3386,14 +3456,14 @@ function RL.GetFontDefault() end
---@return any font ---@return any font
function RL.LoadFont( fileName ) end function RL.LoadFont( fileName ) end
---Load font from file with extended parameters, use NULL for fontChars to load the default character set ---Load font from file with extended parameters, use NULL for codepoints to load the default character set
---- Failure return nil ---- Failure return nil
---- Success return Font ---- Success return Font
---@param fileName string ---@param fileName string
---@param fontSize integer ---@param fontSize integer
---@param fontChars table ---@param codepoints table
---@return any font ---@return any font
function RL.LoadFontEx( fileName, fontSize, fontChars ) end function RL.LoadFontEx( fileName, fontSize, codepoints ) end
---Load font from Image (XNA style) ---Load font from Image (XNA style)
---- Success return Font ---- Success return Font
@@ -3497,6 +3567,11 @@ function RL.DrawTextBoxedTinted( font, text, rec, fontSize, spacing, wordWrap, t
-- Text - Text font info functions -- Text - Text font info functions
---Set vertical line spacing when drawing with line-breaks
---@param spacing integer
---@return any size
function RL.SetTextLineSpacing( spacing ) end
---Measure string size for Font ---Measure string size for Font
---- Success return Vector2 ---- Success return Vector2
---@param font any ---@param font any
@@ -4195,11 +4270,29 @@ function RL.GetRayCollisionQuad( ray, p1, p2, p3, p4 ) end
-- Audio - Audio device management functions -- Audio - Audio device management functions
---Initialize audio device and context
---@return any RL.InitAudioDevice
function RL.InitAudioDevice() end
---Close the audio device and context
---@return any RL.CloseAudioDevice
function RL.CloseAudioDevice() end
---Check if audio device has been initialized successfully
---- Success return bool
---@return any isReady
function RL.IsAudioDeviceReady() end
---Set master volume (listener) ---Set master volume (listener)
---@param volume number ---@param volume number
---@return any RL.SetMasterVolume ---@return any RL.SetMasterVolume
function RL.SetMasterVolume( volume ) end function RL.SetMasterVolume( volume ) end
---Get master volume (listener)
---- Success return float
---@return any isReady
function RL.GetMasterVolume() end
-- Audio - Wave/Sound loading/unloading functions -- Audio - Wave/Sound loading/unloading functions
---Load sound from file ---Load sound from file
@@ -4228,6 +4321,12 @@ function RL.IsWaveReady( wave ) end
---@return any sound ---@return any sound
function RL.LoadSoundFromWave( wave ) end function RL.LoadSoundFromWave( wave ) end
---Create a new sound that shares the same sample data as the source sound, does not own the sound data
---- Success return Sound
---@param source any
---@return any sound
function RL.LoadSoundAlias( source ) end
---Checks if a sound is ready ---Checks if a sound is ready
---- Success return bool ---- Success return bool
---@param sound any ---@param sound any
@@ -4244,6 +4343,11 @@ function RL.UnloadWave( wave ) end
---@return any RL.UnloadSound ---@return any RL.UnloadSound
function RL.UnloadSound( sound ) end function RL.UnloadSound( sound ) end
---Unload a sound alias (does not deallocate sample data)
---@param alias any
---@return any RL.UnloadSoundAlias
function RL.UnloadSoundAlias( alias ) end
---Export wave data to file, returns true on success ---Export wave data to file, returns true on success
---- Success return bool ---- Success return bool
---@param wave any ---@param wave any

View File

@@ -1,3 +1,23 @@
------------------------------------------------------------------------
Release: ReiLua version 0.7.0 Using Raylib 5.0 and Raygui 4.0
------------------------------------------------------------------------
KEY CHANGES:
- CHANGE: Switch to Raylib 5.0 and Raygui 4.0.
- CHANGE: Audio device no longer initialize automatically in case some other device is used.
- ADDED: More audio device management functions.
- ADDED: Random values generation functions.
- ADDED: More Window-related functions.
DETAILED CHANGES:
- REMOVED: DrawLineBezierQuad, DrawLineBezierCubic.
- REMOVED: GenImageGradientV, GenImageGradientH.
- ADDED: GenImageGradientLinear and GenImageGradientSquare.
- ADDED: LoadImageSvg and ExportImageToMemory.
- ADDED: ImageRotate.
- ADDED: SetTextLineSpacing.
- ADDED: LoadSoundAlias and UnloadSoundAlias.
- ADDED: GetApplicationDirectory.
------------------------------------------------------------------------ ------------------------------------------------------------------------
Release: ReiLua version 0.6.0 Using Raylib 4.5 Release: ReiLua version 0.6.0 Using Raylib 4.5
------------------------------------------------------------------------ ------------------------------------------------------------------------

View File

@@ -1,10 +1,15 @@
Current { Current {
* Shapes
* Splines.
} }
Backlog { Backlog {
* Text * Text
* Text codepoints management functions (unicode characters)? Could be usefull for luajit. * Text codepoints management functions (unicode characters)? Could be usefull for luajit.
* Some of the Text strings management functions could be easier to use than the Lua ones. * Some of the Text strings management functions could be easier to use than the Lua ones.
* LoadFontFromMemory.
* LoadFontData.
* GenImageFontAtlas.
* Audio * Audio
* AudioStream. * AudioStream.
* Models * Models

View File

@@ -94,7 +94,8 @@ function RL.init()
end end
local function isTileWall( pos ) local function isTileWall( pos )
if RL.CheckCollisionPointRec( { pos.x, pos.y }, { 0, 0, tilemap.size.x - 1, tilemap.size.y - 1 } ) then -- if RL.CheckCollisionPointRec( { pos.x, pos.y }, { 0, 0, tilemap.size.x - 1, tilemap.size.y - 1 } ) then
if RL.CheckCollisionPointRec( { pos.x, pos.y }, { 0, 0, tilemap.size.x, tilemap.size.y } ) then
return 0 < tilemap.tiles[ pos.x + 1 ][ pos.y + 1 ] return 0 < tilemap.tiles[ pos.x + 1 ][ pos.y + 1 ]
else else
return false return false

View File

@@ -1,15 +1,21 @@
#pragma once #pragma once
/* Audio device management functions. */ /* Audio device management functions. */
int laudioInitAudioDevice( lua_State *L );
int laudioCloseAudioDevice( lua_State *L );
int laudioIsAudioDeviceReady( lua_State *L );
int laudioSetMasterVolume( lua_State *L ); int laudioSetMasterVolume( lua_State *L );
int laudioGetMasterVolume( lua_State *L );
/* Wave/Sound loading/unloading functions. */ /* Wave/Sound loading/unloading functions. */
int laudioLoadSound( lua_State *L ); int laudioLoadSound( lua_State *L );
int laudioLoadWave( lua_State *L ); int laudioLoadWave( lua_State *L );
int laudioIsWaveReady( lua_State *L ); int laudioIsWaveReady( lua_State *L );
int laudioLoadSoundFromWave( lua_State *L ); int laudioLoadSoundFromWave( lua_State *L );
int laudioLoadSoundAlias( lua_State *L );
int laudioIsSoundReady( lua_State *L ); int laudioIsSoundReady( lua_State *L );
int laudioUnloadWave( lua_State *L ); int laudioUnloadWave( lua_State *L );
int laudioUnloadSound( lua_State *L ); int laudioUnloadSound( lua_State *L );
int laudioUnloadSoundAlias( lua_State *L );
int laudioExportWave( lua_State *L ); int laudioExportWave( lua_State *L );
int laudioExportWaveAsCode( lua_State *L ); int laudioExportWaveAsCode( lua_State *L );
/* Wave/Sound management functions. */ /* Wave/Sound management functions. */

View File

@@ -4,36 +4,44 @@
void unloadBuffer( Buffer *buffer ); void unloadBuffer( Buffer *buffer );
/* Window-related functions. */ /* Window-related functions. */
int lcoreCloseWindow( lua_State *L );
int lcoreIsWindowReady( lua_State *L ); int lcoreIsWindowReady( lua_State *L );
int lcoreIsWindowFullscreen( lua_State *L ); int lcoreIsWindowFullscreen( lua_State *L );
int lcoreIsWindowHidden( lua_State *L ); int lcoreIsWindowHidden( lua_State *L );
int lcoreIsWindowMinimized( lua_State *L ); int lcoreIsWindowMinimized( lua_State *L );
int lcoreIsWindowMaximized( lua_State *L ); int lcoreIsWindowMaximized( lua_State *L );
int lcoreIsWindowFocused( lua_State *L ); int lcoreIsWindowFocused( lua_State *L );
int lcoreSetWindowMonitor( lua_State *L );
int lcoreSetWindowPosition( lua_State *L );
int lcoreSetWindowSize( lua_State *L );
int lcoreSetWindowOpacity( lua_State *L );
int lcoreGetWindowHandle( lua_State *L );
int lcoreSetWindowMinSize( lua_State *L );
int lcoreGetMonitorPosition( lua_State *L );
int lcoreGetMonitorSize( lua_State *L );
int lcoreGetWindowPosition( lua_State *L );
int lcoreGetScreenSize( lua_State *L );
int lcoreSetWindowState( lua_State *L );
int lcoreIsWindowState( lua_State *L );
int lcoreClearWindowState( lua_State *L );
int lcoreIsWindowResized( lua_State *L ); int lcoreIsWindowResized( lua_State *L );
int lcoreIsWindowState( lua_State *L );
int lcoreSetWindowState( lua_State *L );
int lcoreClearWindowState( lua_State *L );
int lcoreToggleFullscreen( lua_State *L );
int lcoreToggleBorderlessWindowed( lua_State *L );
int lcoreMaximizeWindow( lua_State *L );
int lcoreMinimizeWindow( lua_State *L );
int lcoreRestoreWindow( lua_State *L );
int lcoreSetWindowIcon( lua_State *L ); int lcoreSetWindowIcon( lua_State *L );
int lcoreSetWindowIcons( lua_State *L ); int lcoreSetWindowIcons( lua_State *L );
int lcoreSetWindowTitle( lua_State *L ); int lcoreSetWindowTitle( lua_State *L );
int lcoreSetWindowPosition( lua_State *L );
int lcoreSetWindowMonitor( lua_State *L );
int lcoreSetWindowMinSize( lua_State *L );
int lcoreSetWindowMaxSize( lua_State *L );
int lcoreSetWindowSize( lua_State *L );
int lcoreSetWindowOpacity( lua_State *L );
int lcoreSetWindowFocused( lua_State *L );
int lcoreGetWindowHandle( lua_State *L );
int lcoreGetScreenSize( lua_State *L );
int lcoreGetRenderSize( lua_State *L );
int lcoreGetMonitorCount( lua_State *L ); int lcoreGetMonitorCount( lua_State *L );
int lcoreGetCurrentMonitor( lua_State *L ); int lcoreGetCurrentMonitor( lua_State *L );
int lcoreGetMonitorPosition( lua_State *L );
int lcoreGetMonitorSize( lua_State *L );
int lcoreGetMonitorPhysicalSize( lua_State *L ); int lcoreGetMonitorPhysicalSize( lua_State *L );
int lcoreGetMonitorRefreshRate( lua_State *L ); int lcoreGetMonitorRefreshRate( lua_State *L );
int lcoreGetWindowPosition( lua_State *L );
int lcoreGetWindowScaleDPI( lua_State *L ); int lcoreGetWindowScaleDPI( lua_State *L );
int lcoreGetMonitorName( lua_State *L ); int lcoreGetMonitorName( lua_State *L );
int lcoreCloseWindow( lua_State *L );
int lcoreSetClipboardText( lua_State *L ); int lcoreSetClipboardText( lua_State *L );
int lcoreGetClipboardText( lua_State *L ); int lcoreGetClipboardText( lua_State *L );
/* Cursor-related functions. */ /* Cursor-related functions. */
@@ -85,6 +93,10 @@ int lcoreSetTargetFPS( lua_State *L );
int lcoreGetFPS( lua_State *L ); int lcoreGetFPS( lua_State *L );
int lcoreGetFrameTime( lua_State *L ); int lcoreGetFrameTime( lua_State *L );
int lcoreGetTime( lua_State *L ); int lcoreGetTime( lua_State *L );
/* Random values generation functions. */
int lcoreSetRandomSeed( lua_State *L );
int lcoreGetRandomValue( lua_State *L );
int lcoreLoadRandomSequence( lua_State *L );
/* Misc. functions */ /* Misc. functions */
int lcoreTakeScreenshot( lua_State *L ); int lcoreTakeScreenshot( lua_State *L );
int lcoreSetConfigFlags( lua_State *L ); int lcoreSetConfigFlags( lua_State *L );
@@ -107,6 +119,7 @@ int lcoreGetFileNameWithoutExt( lua_State *L );
int lcoreGetDirectoryPath( lua_State *L ); int lcoreGetDirectoryPath( lua_State *L );
int lcoreGetPrevDirectoryPath( lua_State *L ); int lcoreGetPrevDirectoryPath( lua_State *L );
int lcoreGetWorkingDirectory( lua_State *L ); int lcoreGetWorkingDirectory( lua_State *L );
int lcoreGetApplicationDirectory( lua_State *L );
int lcoreLoadDirectoryFiles( lua_State *L ); int lcoreLoadDirectoryFiles( lua_State *L );
int lcoreLoadDirectoryFilesEx( lua_State *L ); int lcoreLoadDirectoryFilesEx( lua_State *L );
int lcoreChangeDirectory( lua_State *L ); int lcoreChangeDirectory( lua_State *L );
@@ -131,12 +144,13 @@ int lcoreGetKeyName( lua_State *L );
int lcoreGetKeyScancode( lua_State *L ); int lcoreGetKeyScancode( lua_State *L );
/* Input-related functions: gamepads. */ /* Input-related functions: gamepads. */
int lcoreIsGamepadAvailable( lua_State *L ); int lcoreIsGamepadAvailable( lua_State *L );
int lcoreGetGamepadName( lua_State *L );
int lcoreIsGamepadButtonPressed( lua_State *L ); int lcoreIsGamepadButtonPressed( lua_State *L );
int lcoreIsGamepadButtonDown( lua_State *L ); int lcoreIsGamepadButtonDown( lua_State *L );
int lcoreIsGamepadButtonReleased( lua_State *L ); int lcoreIsGamepadButtonReleased( lua_State *L );
int lcoreGetGamepadAxisCount( lua_State *L ); int lcoreGetGamepadAxisCount( lua_State *L );
int lcoreGetGamepadAxisMovement( lua_State *L ); int lcoreGetGamepadAxisMovement( lua_State *L );
int lcoreGetGamepadName( lua_State *L ); int lcoreSetGamepadMappings( lua_State *L );
/* Input-related functions: mouse. */ /* Input-related functions: mouse. */
int lcoreIsMouseButtonPressed( lua_State *L ); int lcoreIsMouseButtonPressed( lua_State *L );
int lcoreIsMouseButtonDown( lua_State *L ); int lcoreIsMouseButtonDown( lua_State *L );

View File

@@ -3,14 +3,18 @@
#define STRING_LEN 1024 #define STRING_LEN 1024
#define VERSION_MAJOR 0 #define VERSION_MAJOR 0
#define VERSION_MINOR 6 #define VERSION_MINOR 7
#define VERSION_PATCH 0 #define VERSION_PATCH 0
#define VERSION_DEV 0 #define VERSION_DEV 1
#include "glad.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdint.h>
#include "glad.h"
#include "glfw3.h"
#include "glfw3native.h"
#ifdef SHARED #ifdef SHARED
#include <raylib.h> #include <raylib.h>
@@ -28,9 +32,6 @@
#include "rcamera.h" #include "rcamera.h"
#endif #endif
#include "glfw3.h"
#include "glfw3native.h"
#include <stdint.h>
#ifdef LUAJIT #ifdef LUAJIT
#ifdef SHARED #ifdef SHARED

View File

@@ -1,6 +1,6 @@
/********************************************************************************************** /**********************************************************************************************
* *
* raylib v4.5 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com) * raylib v5.0 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com)
* *
* FEATURES: * FEATURES:
* - NO external dependencies, all required libraries included with raylib * - NO external dependencies, all required libraries included with raylib
@@ -81,10 +81,10 @@
#include <stdarg.h> // Required for: va_list - Only used by TraceLogCallback #include <stdarg.h> // Required for: va_list - Only used by TraceLogCallback
#define RAYLIB_VERSION_MAJOR 4 #define RAYLIB_VERSION_MAJOR 5
#define RAYLIB_VERSION_MINOR 5 #define RAYLIB_VERSION_MINOR 0
#define RAYLIB_VERSION_PATCH 0 #define RAYLIB_VERSION_PATCH 0
#define RAYLIB_VERSION "4.5" #define RAYLIB_VERSION "5.0"
// Function specifiers in case library is build/used as a shared library (Windows) // Function specifiers in case library is build/used as a shared library (Windows)
// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll // NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll
@@ -133,12 +133,20 @@
// NOTE: MSVC C++ compiler does not support compound literals (C99 feature) // NOTE: MSVC C++ compiler does not support compound literals (C99 feature)
// Plain structures in C++ (without constructors) can be initialized with { } // Plain structures in C++ (without constructors) can be initialized with { }
// This is called aggregate initialization (C++11 feature)
#if defined(__cplusplus) #if defined(__cplusplus)
#define CLITERAL(type) type #define CLITERAL(type) type
#else #else
#define CLITERAL(type) (type) #define CLITERAL(type) (type)
#endif #endif
// Some compilers (mostly macos clang) default to C++98,
// where aggregate initialization can't be used
// So, give a more clear error stating how to fix this
#if !defined(_MSC_VER) && (defined(__cplusplus) && __cplusplus < 201103L)
#error "C++11 or later is required. Add -std=c++11"
#endif
// NOTE: We set some defines with some data types declared by raylib // NOTE: We set some defines with some data types declared by raylib
// Other modules (raymath, rlgl) also require some of those types, so, // Other modules (raymath, rlgl) also require some of those types, so,
// to be able to use those other modules as standalone (not depending on raylib) // to be able to use those other modules as standalone (not depending on raylib)
@@ -402,6 +410,7 @@ typedef struct ModelAnimation {
int frameCount; // Number of animation frames int frameCount; // Number of animation frames
BoneInfo *bones; // Bones information (skeleton) BoneInfo *bones; // Bones information (skeleton)
Transform **framePoses; // Poses array by frame Transform **framePoses; // Poses array by frame
char name[32]; // Animation name
} ModelAnimation; } ModelAnimation;
// Ray, ray for raycasting // Ray, ray for raycasting
@@ -497,6 +506,20 @@ typedef struct FilePathList {
char **paths; // Filepaths entries char **paths; // Filepaths entries
} FilePathList; } FilePathList;
// Automation event
typedef struct AutomationEvent {
unsigned int frame; // Event frame
unsigned int type; // Event type (AutomationEventType)
int params[4]; // Event parameters (if required)
} AutomationEvent;
// Automation event list
typedef struct AutomationEventList {
unsigned int capacity; // Events max entries (MAX_AUTOMATION_EVENTS)
unsigned int count; // Events entries count
AutomationEvent *events; // Events entries
} AutomationEventList;
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Enumerators Definition // Enumerators Definition
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
@@ -517,6 +540,7 @@ typedef enum {
FLAG_WINDOW_TRANSPARENT = 0x00000010, // Set to allow transparent framebuffer FLAG_WINDOW_TRANSPARENT = 0x00000010, // Set to allow transparent framebuffer
FLAG_WINDOW_HIGHDPI = 0x00002000, // Set to support HighDPI FLAG_WINDOW_HIGHDPI = 0x00002000, // Set to support HighDPI
FLAG_WINDOW_MOUSE_PASSTHROUGH = 0x00004000, // Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED FLAG_WINDOW_MOUSE_PASSTHROUGH = 0x00004000, // Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED
FLAG_BORDERLESS_WINDOWED_MODE = 0x00008000, // Set to run program in borderless windowed mode
FLAG_MSAA_4X_HINT = 0x00000020, // Set to try enabling MSAA 4X FLAG_MSAA_4X_HINT = 0x00000020, // Set to try enabling MSAA 4X
FLAG_INTERLACED_HINT = 0x00010000 // Set to try enabling interlaced video format (for V3D) FLAG_INTERLACED_HINT = 0x00010000 // Set to try enabling interlaced video format (for V3D)
} ConfigFlags; } ConfigFlags;
@@ -802,6 +826,9 @@ typedef enum {
PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float) PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float)
PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float) PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float)
PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float) PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float)
PIXELFORMAT_UNCOMPRESSED_R16, // 16 bpp (1 channel - half float)
PIXELFORMAT_UNCOMPRESSED_R16G16B16, // 16*3 bpp (3 channels - half float)
PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, // 16*4 bpp (4 channels - half float)
PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha) PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha)
PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha) PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha)
PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp
@@ -905,8 +932,8 @@ typedef enum {
// Callbacks to hook some internal functions // Callbacks to hook some internal functions
// WARNING: These callbacks are intended for advance users // WARNING: These callbacks are intended for advance users
typedef void (*TraceLogCallback)(int logLevel, const char *text, va_list args); // Logging: Redirect trace log messages typedef void (*TraceLogCallback)(int logLevel, const char *text, va_list args); // Logging: Redirect trace log messages
typedef unsigned char *(*LoadFileDataCallback)(const char *fileName, unsigned int *bytesRead); // FileIO: Load binary data typedef unsigned char *(*LoadFileDataCallback)(const char *fileName, int *dataSize); // FileIO: Load binary data
typedef bool (*SaveFileDataCallback)(const char *fileName, void *data, unsigned int bytesToWrite); // FileIO: Save binary data typedef bool (*SaveFileDataCallback)(const char *fileName, void *data, int dataSize); // FileIO: Save binary data
typedef char *(*LoadFileTextCallback)(const char *fileName); // FileIO: Load text data typedef char *(*LoadFileTextCallback)(const char *fileName); // FileIO: Load text data
typedef bool (*SaveFileTextCallback)(const char *fileName, char *text); // FileIO: Save text data typedef bool (*SaveFileTextCallback)(const char *fileName, char *text); // FileIO: Save text data
@@ -925,8 +952,8 @@ extern "C" { // Prevents name mangling of functions
// Window-related functions // Window-related functions
RLAPI void InitWindow(int width, int height, const char *title); // Initialize window and OpenGL context RLAPI void InitWindow(int width, int height, const char *title); // Initialize window and OpenGL context
RLAPI bool WindowShouldClose(void); // Check if KEY_ESCAPE pressed or Close icon pressed
RLAPI void CloseWindow(void); // Close window and unload OpenGL context RLAPI void CloseWindow(void); // Close window and unload OpenGL context
RLAPI bool WindowShouldClose(void); // Check if application should close (KEY_ESCAPE pressed or windows close icon clicked)
RLAPI bool IsWindowReady(void); // Check if window has been initialized successfully RLAPI bool IsWindowReady(void); // Check if window has been initialized successfully
RLAPI bool IsWindowFullscreen(void); // Check if window is currently fullscreen RLAPI bool IsWindowFullscreen(void); // Check if window is currently fullscreen
RLAPI bool IsWindowHidden(void); // Check if window is currently hidden (only PLATFORM_DESKTOP) RLAPI bool IsWindowHidden(void); // Check if window is currently hidden (only PLATFORM_DESKTOP)
@@ -938,17 +965,20 @@ RLAPI bool IsWindowState(unsigned int flag); // Check if on
RLAPI void SetWindowState(unsigned int flags); // Set window configuration state using flags (only PLATFORM_DESKTOP) RLAPI void SetWindowState(unsigned int flags); // Set window configuration state using flags (only PLATFORM_DESKTOP)
RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags
RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP) RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
RLAPI void ToggleBorderlessWindowed(void); // Toggle window state: borderless windowed (only PLATFORM_DESKTOP)
RLAPI void MaximizeWindow(void); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP) RLAPI void MaximizeWindow(void); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP) RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP)
RLAPI void RestoreWindow(void); // Set window state: not minimized/maximized (only PLATFORM_DESKTOP) RLAPI void RestoreWindow(void); // Set window state: not minimized/maximized (only PLATFORM_DESKTOP)
RLAPI void SetWindowIcon(Image image); // Set icon for window (single image, RGBA 32bit, only PLATFORM_DESKTOP) RLAPI void SetWindowIcon(Image image); // Set icon for window (single image, RGBA 32bit, only PLATFORM_DESKTOP)
RLAPI void SetWindowIcons(Image *images, int count); // Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP) RLAPI void SetWindowIcons(Image *images, int count); // Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP)
RLAPI void SetWindowTitle(const char *title); // Set title for window (only PLATFORM_DESKTOP) RLAPI void SetWindowTitle(const char *title); // Set title for window (only PLATFORM_DESKTOP and PLATFORM_WEB)
RLAPI void SetWindowPosition(int x, int y); // Set window position on screen (only PLATFORM_DESKTOP) RLAPI void SetWindowPosition(int x, int y); // Set window position on screen (only PLATFORM_DESKTOP)
RLAPI void SetWindowMonitor(int monitor); // Set monitor for the current window (fullscreen mode) RLAPI void SetWindowMonitor(int monitor); // Set monitor for the current window
RLAPI void SetWindowMinSize(int width, int height); // Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE) RLAPI void SetWindowMinSize(int width, int height); // Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
RLAPI void SetWindowMaxSize(int width, int height); // Set window maximum dimensions (for FLAG_WINDOW_RESIZABLE)
RLAPI void SetWindowSize(int width, int height); // Set window dimensions RLAPI void SetWindowSize(int width, int height); // Set window dimensions
RLAPI void SetWindowOpacity(float opacity); // Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP) RLAPI void SetWindowOpacity(float opacity); // Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
RLAPI void SetWindowFocused(void); // Set window focused (only PLATFORM_DESKTOP)
RLAPI void *GetWindowHandle(void); // Get native window handle RLAPI void *GetWindowHandle(void); // Get native window handle
RLAPI int GetScreenWidth(void); // Get current screen width RLAPI int GetScreenWidth(void); // Get current screen width
RLAPI int GetScreenHeight(void); // Get current screen height RLAPI int GetScreenHeight(void); // Get current screen height
@@ -964,20 +994,12 @@ RLAPI int GetMonitorPhysicalHeight(int monitor); // Get specifi
RLAPI int GetMonitorRefreshRate(int monitor); // Get specified monitor refresh rate RLAPI int GetMonitorRefreshRate(int monitor); // Get specified monitor refresh rate
RLAPI Vector2 GetWindowPosition(void); // Get window position XY on monitor RLAPI Vector2 GetWindowPosition(void); // Get window position XY on monitor
RLAPI Vector2 GetWindowScaleDPI(void); // Get window scale DPI factor RLAPI Vector2 GetWindowScaleDPI(void); // Get window scale DPI factor
RLAPI const char *GetMonitorName(int monitor); // Get the human-readable, UTF-8 encoded name of the primary monitor RLAPI const char *GetMonitorName(int monitor); // Get the human-readable, UTF-8 encoded name of the specified monitor
RLAPI void SetClipboardText(const char *text); // Set clipboard text content RLAPI void SetClipboardText(const char *text); // Set clipboard text content
RLAPI const char *GetClipboardText(void); // Get clipboard text content RLAPI const char *GetClipboardText(void); // Get clipboard text content
RLAPI void EnableEventWaiting(void); // Enable waiting for events on EndDrawing(), no automatic event polling RLAPI void EnableEventWaiting(void); // Enable waiting for events on EndDrawing(), no automatic event polling
RLAPI void DisableEventWaiting(void); // Disable waiting for events on EndDrawing(), automatic events polling RLAPI void DisableEventWaiting(void); // Disable waiting for events on EndDrawing(), automatic events polling
// 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
RLAPI void SwapScreenBuffer(void); // Swap back buffer with front buffer (screen drawing)
RLAPI void PollInputEvents(void); // Register all input events
RLAPI void WaitTime(double seconds); // Wait for some time (halt program execution)
// Cursor-related functions // Cursor-related functions
RLAPI void ShowCursor(void); // Shows cursor RLAPI void ShowCursor(void); // Shows cursor
RLAPI void HideCursor(void); // Hides cursor RLAPI void HideCursor(void); // Hides cursor
@@ -1033,24 +1055,37 @@ RLAPI Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); // Get the
// Timing-related functions // Timing-related functions
RLAPI void SetTargetFPS(int fps); // Set target FPS (maximum) RLAPI void SetTargetFPS(int fps); // Set target FPS (maximum)
RLAPI int GetFPS(void); // Get current FPS
RLAPI float GetFrameTime(void); // Get time in seconds for last frame drawn (delta time) RLAPI float GetFrameTime(void); // Get time in seconds for last frame drawn (delta time)
RLAPI double GetTime(void); // Get elapsed time in seconds since InitWindow() RLAPI double GetTime(void); // Get elapsed time in seconds since InitWindow()
RLAPI int GetFPS(void); // Get current FPS
// 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
RLAPI void SwapScreenBuffer(void); // Swap back buffer with front buffer (screen drawing)
RLAPI void PollInputEvents(void); // Register all input events
RLAPI void WaitTime(double seconds); // Wait for some time (halt program execution)
// Random values generation functions
RLAPI void SetRandomSeed(unsigned int seed); // Set the seed for the random number generator
RLAPI int GetRandomValue(int min, int max); // Get a random value between min and max (both included)
RLAPI int *LoadRandomSequence(unsigned int count, int min, int max); // Load random values sequence, no values repeated
RLAPI void UnloadRandomSequence(int *sequence); // Unload random values sequence
// Misc. functions // Misc. functions
RLAPI int GetRandomValue(int min, int max); // Get a random value between min and max (both included)
RLAPI void SetRandomSeed(unsigned int seed); // Set the seed for the random number generator
RLAPI void TakeScreenshot(const char *fileName); // Takes a screenshot of current screen (filename extension defines format) RLAPI void TakeScreenshot(const char *fileName); // Takes a screenshot of current screen (filename extension defines format)
RLAPI void SetConfigFlags(unsigned int flags); // Setup init configuration flags (view FLAGS) RLAPI void SetConfigFlags(unsigned int flags); // Setup init configuration flags (view FLAGS)
RLAPI void OpenURL(const char *url); // Open URL with default system browser (if available)
// NOTE: Following functions implemented in module [utils]
//------------------------------------------------------------------
RLAPI void TraceLog(int logLevel, const char *text, ...); // Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...) RLAPI void TraceLog(int logLevel, const char *text, ...); // Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...)
RLAPI void SetTraceLogLevel(int logLevel); // Set the current threshold (minimum) log level RLAPI void SetTraceLogLevel(int logLevel); // Set the current threshold (minimum) log level
RLAPI void *MemAlloc(unsigned int size); // Internal memory allocator RLAPI void *MemAlloc(unsigned int size); // Internal memory allocator
RLAPI void *MemRealloc(void *ptr, unsigned int size); // Internal memory reallocator RLAPI void *MemRealloc(void *ptr, unsigned int size); // Internal memory reallocator
RLAPI void MemFree(void *ptr); // Internal memory free RLAPI void MemFree(void *ptr); // Internal memory free
RLAPI void OpenURL(const char *url); // Open URL with default system browser (if available)
// Set custom callbacks // Set custom callbacks
// WARNING: Callbacks setup is intended for advance users // WARNING: Callbacks setup is intended for advance users
RLAPI void SetTraceLogCallback(TraceLogCallback callback); // Set custom trace log RLAPI void SetTraceLogCallback(TraceLogCallback callback); // Set custom trace log
@@ -1060,13 +1095,16 @@ RLAPI void SetLoadFileTextCallback(LoadFileTextCallback callback); // Set custom
RLAPI void SetSaveFileTextCallback(SaveFileTextCallback callback); // Set custom file text data saver RLAPI void SetSaveFileTextCallback(SaveFileTextCallback callback); // Set custom file text data saver
// Files management functions // Files management functions
RLAPI unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead); // Load file data as byte array (read) RLAPI unsigned char *LoadFileData(const char *fileName, int *dataSize); // Load file data as byte array (read)
RLAPI void UnloadFileData(unsigned char *data); // Unload file data allocated by LoadFileData() RLAPI void UnloadFileData(unsigned char *data); // Unload file data allocated by LoadFileData()
RLAPI bool SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite); // Save data to file from byte array (write), returns true on success RLAPI bool SaveFileData(const char *fileName, void *data, int dataSize); // Save data to file from byte array (write), returns true on success
RLAPI bool ExportDataAsCode(const unsigned char *data, unsigned int size, const char *fileName); // Export data to code (.h), returns true on success RLAPI bool ExportDataAsCode(const unsigned char *data, int dataSize, const char *fileName); // Export data to code (.h), returns true on success
RLAPI char *LoadFileText(const char *fileName); // Load text data from file (read), returns a '\0' terminated string RLAPI char *LoadFileText(const char *fileName); // Load text data from file (read), returns a '\0' terminated string
RLAPI void UnloadFileText(char *text); // Unload file text data allocated by LoadFileText() RLAPI void UnloadFileText(char *text); // Unload file text data allocated by LoadFileText()
RLAPI bool SaveFileText(const char *fileName, char *text); // Save text data to file (write), string must be '\0' terminated, returns true on success RLAPI bool SaveFileText(const char *fileName, char *text); // Save text data to file (write), string must be '\0' terminated, returns true on success
//------------------------------------------------------------------
// File system functions
RLAPI bool FileExists(const char *fileName); // Check if file exists RLAPI bool FileExists(const char *fileName); // Check if file exists
RLAPI bool DirectoryExists(const char *dirPath); // Check if a directory path exists RLAPI bool DirectoryExists(const char *dirPath); // Check if a directory path exists
RLAPI bool IsFileExtension(const char *fileName, const char *ext); // Check file extension (including point: .png, .wav) RLAPI bool IsFileExtension(const char *fileName, const char *ext); // Check file extension (including point: .png, .wav)
@@ -1077,7 +1115,7 @@ RLAPI const char *GetFileNameWithoutExt(const char *filePath); // Get filenam
RLAPI const char *GetDirectoryPath(const char *filePath); // Get full path for a given fileName with path (uses static string) RLAPI const char *GetDirectoryPath(const char *filePath); // Get full path for a given fileName with path (uses static string)
RLAPI const char *GetPrevDirectoryPath(const char *dirPath); // Get previous directory path for a given path (uses static string) RLAPI const char *GetPrevDirectoryPath(const char *dirPath); // Get previous directory path for a given path (uses static string)
RLAPI const char *GetWorkingDirectory(void); // Get current working directory (uses static string) RLAPI const char *GetWorkingDirectory(void); // Get current working directory (uses static string)
RLAPI const char *GetApplicationDirectory(void); // Get the directory if the running application (uses static string) RLAPI const char *GetApplicationDirectory(void); // Get the directory of the running application (uses static string)
RLAPI bool ChangeDirectory(const char *dir); // Change working directory, return true on success RLAPI bool ChangeDirectory(const char *dir); // Change working directory, return true on success
RLAPI bool IsPathFile(const char *path); // Check if a given path is a file or a directory RLAPI bool IsPathFile(const char *path); // Check if a given path is a file or a directory
RLAPI FilePathList LoadDirectoryFiles(const char *dirPath); // Load directory filepaths RLAPI FilePathList LoadDirectoryFiles(const char *dirPath); // Load directory filepaths
@@ -1094,18 +1132,29 @@ RLAPI unsigned char *DecompressData(const unsigned char *compData, int compDataS
RLAPI char *EncodeDataBase64(const unsigned char *data, int dataSize, int *outputSize); // Encode data to Base64 string, memory must be MemFree() RLAPI char *EncodeDataBase64(const unsigned char *data, int dataSize, int *outputSize); // Encode data to Base64 string, memory must be MemFree()
RLAPI unsigned char *DecodeDataBase64(const unsigned char *data, int *outputSize); // Decode Base64 string data, memory must be MemFree() RLAPI unsigned char *DecodeDataBase64(const unsigned char *data, int *outputSize); // Decode Base64 string data, memory must be MemFree()
// Automation events functionality
RLAPI AutomationEventList LoadAutomationEventList(const char *fileName); // Load automation events list from file, NULL for empty list, capacity = MAX_AUTOMATION_EVENTS
RLAPI void UnloadAutomationEventList(AutomationEventList *list); // Unload automation events list from file
RLAPI bool ExportAutomationEventList(AutomationEventList list, const char *fileName); // Export automation events list as text file
RLAPI void SetAutomationEventList(AutomationEventList *list); // Set automation event list to record to
RLAPI void SetAutomationEventBaseFrame(int frame); // Set automation event internal base frame to start recording
RLAPI void StartAutomationEventRecording(void); // Start recording automation events (AutomationEventList must be set)
RLAPI void StopAutomationEventRecording(void); // Stop recording automation events
RLAPI void PlayAutomationEvent(AutomationEvent event); // Play a recorded automation event
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Input Handling Functions (Module: core) // Input Handling Functions (Module: core)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Input-related functions: keyboard // Input-related functions: keyboard
RLAPI bool IsKeyPressed(int key); // Check if a key has been pressed once RLAPI bool IsKeyPressed(int key); // Check if a key has been pressed once
RLAPI bool IsKeyPressedRepeat(int key); // Check if a key has been pressed again (Only PLATFORM_DESKTOP)
RLAPI bool IsKeyDown(int key); // Check if a key is being pressed RLAPI bool IsKeyDown(int key); // Check if a key is being pressed
RLAPI bool IsKeyReleased(int key); // Check if a key has been released once RLAPI bool IsKeyReleased(int key); // Check if a key has been released once
RLAPI bool IsKeyUp(int key); // Check if a key is NOT being pressed RLAPI bool IsKeyUp(int key); // Check if a key is NOT being pressed
RLAPI void SetExitKey(int key); // Set a custom key to exit program (default is ESC)
RLAPI int GetKeyPressed(void); // Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty RLAPI int GetKeyPressed(void); // Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty
RLAPI int GetCharPressed(void); // Get char pressed (unicode), call it multiple times for chars queued, returns 0 when the queue is empty RLAPI int GetCharPressed(void); // Get char pressed (unicode), call it multiple times for chars queued, returns 0 when the queue is empty
RLAPI void SetExitKey(int key); // Set a custom key to exit program (default is ESC)
// Input-related functions: gamepads // Input-related functions: gamepads
RLAPI bool IsGamepadAvailable(int gamepad); // Check if a gamepad is available RLAPI bool IsGamepadAvailable(int gamepad); // Check if a gamepad is available
@@ -1146,7 +1195,7 @@ RLAPI int GetTouchPointCount(void); // Get number of t
// Gestures and Touch Handling Functions (Module: rgestures) // Gestures and Touch Handling Functions (Module: rgestures)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
RLAPI void SetGesturesEnabled(unsigned int flags); // Enable a set of gestures using flags RLAPI void SetGesturesEnabled(unsigned int flags); // Enable a set of gestures using flags
RLAPI bool IsGestureDetected(int gesture); // Check if a gesture have been detected RLAPI bool IsGestureDetected(unsigned int gesture); // Check if a gesture have been detected
RLAPI int GetGestureDetected(void); // Get latest detected gesture RLAPI int GetGestureDetected(void); // Get latest detected gesture
RLAPI float GetGestureHoldDuration(void); // Get gesture hold time in milliseconds RLAPI float GetGestureHoldDuration(void); // Get gesture hold time in milliseconds
RLAPI Vector2 GetGestureDragVector(void); // Get gesture drag vector RLAPI Vector2 GetGestureDragVector(void); // Get gesture drag vector
@@ -1172,18 +1221,17 @@ RLAPI void SetShapesTexture(Texture2D texture, Rectangle source); // Set t
RLAPI void DrawPixel(int posX, int posY, Color color); // Draw a pixel RLAPI void DrawPixel(int posX, int posY, Color color); // Draw a pixel
RLAPI void DrawPixelV(Vector2 position, Color color); // Draw a pixel (Vector version) RLAPI void DrawPixelV(Vector2 position, Color color); // Draw a pixel (Vector version)
RLAPI void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw a line RLAPI void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw a line
RLAPI void DrawLineV(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (Vector version) RLAPI void DrawLineV(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (using gl lines)
RLAPI void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line defining thickness RLAPI void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line (using triangles/quads)
RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line using cubic-bezier curves in-out RLAPI void DrawLineStrip(Vector2 *points, int pointCount, Color color); // Draw lines sequence (using gl lines)
RLAPI void DrawLineBezierQuad(Vector2 startPos, Vector2 endPos, Vector2 controlPos, float thick, Color color); // Draw line using quadratic bezier curves with a control point RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw line segment cubic-bezier in-out interpolation
RLAPI void DrawLineBezierCubic(Vector2 startPos, Vector2 endPos, Vector2 startControlPos, Vector2 endControlPos, float thick, Color color); // Draw line using cubic bezier curves with 2 control points
RLAPI void DrawLineStrip(Vector2 *points, int pointCount, Color color); // Draw lines sequence
RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle
RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle
RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline
RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2); // Draw a gradient-filled circle RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2); // Draw a gradient-filled circle
RLAPI void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version) RLAPI void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version)
RLAPI void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline RLAPI void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline
RLAPI void DrawCircleLinesV(Vector2 center, float radius, Color color); // Draw circle outline (Vector version)
RLAPI void DrawEllipse(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse RLAPI void DrawEllipse(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse
RLAPI void DrawEllipseLines(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse outline RLAPI void DrawEllipseLines(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse outline
RLAPI void DrawRing(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring RLAPI void DrawRing(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring
@@ -1207,6 +1255,25 @@ RLAPI void DrawPoly(Vector2 center, int sides, float radius, float rotation, Col
RLAPI void DrawPolyLines(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a polygon outline of n sides RLAPI void DrawPolyLines(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a polygon outline of n sides
RLAPI void DrawPolyLinesEx(Vector2 center, int sides, float radius, float rotation, float lineThick, Color color); // Draw a polygon outline of n sides with extended parameters RLAPI void DrawPolyLinesEx(Vector2 center, int sides, float radius, float rotation, float lineThick, Color color); // Draw a polygon outline of n sides with extended parameters
// Splines drawing functions
RLAPI void DrawSplineLinear(Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Linear, minimum 2 points
RLAPI void DrawSplineBasis(Vector2 *points, int pointCount, float thick, Color color); // Draw spline: B-Spline, minimum 4 points
RLAPI void DrawSplineCatmullRom(Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Catmull-Rom, minimum 4 points
RLAPI void DrawSplineBezierQuadratic(Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Quadratic Bezier, minimum 3 points (1 control point): [p1, c2, p3, c4...]
RLAPI void DrawSplineBezierCubic(Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Cubic Bezier, minimum 4 points (2 control points): [p1, c2, c3, p4, c5, c6...]
RLAPI void DrawSplineSegmentLinear(Vector2 p1, Vector2 p2, float thick, Color color); // Draw spline segment: Linear, 2 points
RLAPI void DrawSplineSegmentBasis(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float thick, Color color); // Draw spline segment: B-Spline, 4 points
RLAPI void DrawSplineSegmentCatmullRom(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float thick, Color color); // Draw spline segment: Catmull-Rom, 4 points
RLAPI void DrawSplineSegmentBezierQuadratic(Vector2 p1, Vector2 c2, Vector2 p3, float thick, Color color); // Draw spline segment: Quadratic Bezier, 2 points, 1 control point
RLAPI void DrawSplineSegmentBezierCubic(Vector2 p1, Vector2 c2, Vector2 c3, Vector2 p4, float thick, 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]
RLAPI Vector2 GetSplinePointLinear(Vector2 startPos, Vector2 endPos, float t); // Get (evaluate) spline point: Linear
RLAPI Vector2 GetSplinePointBasis(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float t); // Get (evaluate) spline point: B-Spline
RLAPI Vector2 GetSplinePointCatmullRom(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float t); // Get (evaluate) spline point: Catmull-Rom
RLAPI Vector2 GetSplinePointBezierQuad(Vector2 p1, Vector2 c2, Vector2 p3, float t); // Get (evaluate) spline point: Quadratic Bezier
RLAPI Vector2 GetSplinePointBezierCubic(Vector2 p1, Vector2 c2, Vector2 c3, Vector2 p4, float t); // Get (evaluate) spline point: Cubic Bezier
// Basic shapes collision detection functions // Basic shapes collision detection functions
RLAPI bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles RLAPI bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles
RLAPI bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles RLAPI bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles
@@ -1227,6 +1294,7 @@ RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2);
// NOTE: These functions do not require GPU access // NOTE: These functions do not require GPU access
RLAPI Image LoadImage(const char *fileName); // Load image from file into CPU memory (RAM) RLAPI Image LoadImage(const char *fileName); // Load image from file into CPU memory (RAM)
RLAPI Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image from RAW file data RLAPI Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image from RAW file data
RLAPI Image LoadImageSvg(const char *fileNameOrString, int width, int height); // Load image from SVG file data or string with specified size
RLAPI Image LoadImageAnim(const char *fileName, int *frames); // Load image sequence from file (frames appended to image.data) RLAPI Image LoadImageAnim(const char *fileName, int *frames); // Load image sequence from file (frames appended to image.data)
RLAPI Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load image from memory buffer, fileType refers to extension: i.e. '.png' RLAPI Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load image from memory buffer, fileType refers to extension: i.e. '.png'
RLAPI Image LoadImageFromTexture(Texture2D texture); // Load image from GPU texture data RLAPI Image LoadImageFromTexture(Texture2D texture); // Load image from GPU texture data
@@ -1234,13 +1302,14 @@ RLAPI Image LoadImageFromScreen(void);
RLAPI bool IsImageReady(Image image); // Check if an image is ready RLAPI bool IsImageReady(Image image); // Check if an image is ready
RLAPI void UnloadImage(Image image); // Unload image from CPU memory (RAM) RLAPI void UnloadImage(Image image); // Unload image from CPU memory (RAM)
RLAPI bool ExportImage(Image image, const char *fileName); // Export image data to file, returns true on success RLAPI bool ExportImage(Image image, const char *fileName); // Export image data to file, returns true on success
RLAPI unsigned char *ExportImageToMemory(Image image, const char *fileType, int *fileSize); // Export image to memory buffer
RLAPI bool ExportImageAsCode(Image image, const char *fileName); // Export image as code file defining an array of bytes, returns true on success RLAPI bool ExportImageAsCode(Image image, const char *fileName); // Export image as code file defining an array of bytes, returns true on success
// Image generation functions // Image generation functions
RLAPI Image GenImageColor(int width, int height, Color color); // Generate image: plain color RLAPI Image GenImageColor(int width, int height, Color color); // Generate image: plain color
RLAPI Image GenImageGradientV(int width, int height, Color top, Color bottom); // Generate image: vertical gradient RLAPI Image GenImageGradientLinear(int width, int height, int direction, Color start, Color end); // Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient
RLAPI Image GenImageGradientH(int width, int height, Color left, Color right); // Generate image: horizontal gradient
RLAPI Image GenImageGradientRadial(int width, int height, float density, Color inner, Color outer); // Generate image: radial gradient RLAPI Image GenImageGradientRadial(int width, int height, float density, Color inner, Color outer); // Generate image: radial gradient
RLAPI Image GenImageGradientSquare(int width, int height, float density, Color inner, Color outer); // Generate image: square gradient
RLAPI Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color col2); // Generate image: checked RLAPI Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color col2); // Generate image: checked
RLAPI Image GenImageWhiteNoise(int width, int height, float factor); // Generate image: white noise RLAPI Image GenImageWhiteNoise(int width, int height, float factor); // Generate image: white noise
RLAPI Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float scale); // Generate image: perlin noise RLAPI Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float scale); // Generate image: perlin noise
@@ -1267,6 +1336,7 @@ RLAPI void ImageMipmaps(Image *image);
RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering)
RLAPI void ImageFlipVertical(Image *image); // Flip image vertically RLAPI void ImageFlipVertical(Image *image); // Flip image vertically
RLAPI void ImageFlipHorizontal(Image *image); // Flip image horizontally RLAPI void ImageFlipHorizontal(Image *image); // Flip image horizontally
RLAPI void ImageRotate(Image *image, int degrees); // Rotate image by input angle in degrees (-359 to 359)
RLAPI void ImageRotateCW(Image *image); // Rotate image clockwise 90deg RLAPI void ImageRotateCW(Image *image); // Rotate image clockwise 90deg
RLAPI void ImageRotateCCW(Image *image); // Rotate image counter-clockwise 90deg RLAPI void ImageRotateCCW(Image *image); // Rotate image counter-clockwise 90deg
RLAPI void ImageColorTint(Image *image, Color color); // Modify image color: tint RLAPI void ImageColorTint(Image *image, Color color); // Modify image color: tint
@@ -1351,13 +1421,13 @@ RLAPI int GetPixelDataSize(int width, int height, int format); // G
// Font loading/unloading functions // Font loading/unloading functions
RLAPI Font GetFontDefault(void); // Get the default Font RLAPI Font GetFontDefault(void); // Get the default Font
RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM) RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM)
RLAPI Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int glyphCount); // Load font from file with extended parameters, use NULL for fontChars and 0 for glyphCount to load the default character set RLAPI Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // Load font from file with extended parameters, use NULL for codepoints and 0 for codepointCount to load the default character set
RLAPI Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style) RLAPI Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style)
RLAPI Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int glyphCount); // Load font from memory buffer, fileType refers to extension: i.e. '.ttf' RLAPI Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *codepoints, int codepointCount); // Load font from memory buffer, fileType refers to extension: i.e. '.ttf'
RLAPI bool IsFontReady(Font font); // Check if a font is ready RLAPI bool IsFontReady(Font font); // Check if a font is ready
RLAPI GlyphInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int glyphCount, int type); // Load font data for further use RLAPI GlyphInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *codepoints, int codepointCount, int type); // Load font data for further use
RLAPI Image GenImageFontAtlas(const GlyphInfo *chars, Rectangle **recs, int glyphCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info RLAPI Image GenImageFontAtlas(const GlyphInfo *glyphs, Rectangle **glyphRecs, int glyphCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info
RLAPI void UnloadFontData(GlyphInfo *chars, int glyphCount); // Unload font chars info data (RAM) RLAPI void UnloadFontData(GlyphInfo *glyphs, int glyphCount); // Unload font chars info data (RAM)
RLAPI void UnloadFont(Font font); // Unload font from GPU memory (VRAM) RLAPI void UnloadFont(Font font); // Unload font from GPU memory (VRAM)
RLAPI bool ExportFontAsCode(Font font, const char *fileName); // Export font as code file, returns true on success RLAPI bool ExportFontAsCode(Font font, const char *fileName); // Export font as code file, returns true on success
@@ -1367,9 +1437,10 @@ RLAPI void DrawText(const char *text, int posX, int posY, int fontSize, Color co
RLAPI void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text using font and additional parameters RLAPI void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text using font and additional parameters
RLAPI void DrawTextPro(Font font, const char *text, Vector2 position, Vector2 origin, float rotation, float fontSize, float spacing, Color tint); // Draw text using Font and pro parameters (rotation) RLAPI void DrawTextPro(Font font, const char *text, Vector2 position, Vector2 origin, float rotation, float fontSize, float spacing, Color tint); // Draw text using Font and pro parameters (rotation)
RLAPI void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint); // Draw one character (codepoint) RLAPI void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint); // Draw one character (codepoint)
RLAPI void DrawTextCodepoints(Font font, const int *codepoints, int count, Vector2 position, float fontSize, float spacing, Color tint); // Draw multiple character (codepoint) RLAPI void DrawTextCodepoints(Font font, const int *codepoints, int codepointCount, Vector2 position, float fontSize, float spacing, Color tint); // Draw multiple character (codepoint)
// Text font info functions // Text font info functions
RLAPI void SetTextLineSpacing(int spacing); // Set vertical line spacing when drawing with line-breaks
RLAPI int MeasureText(const char *text, int fontSize); // Measure string width for default font RLAPI int MeasureText(const char *text, int fontSize); // Measure string width for default font
RLAPI Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // Measure string size for Font RLAPI Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // Measure string size for Font
RLAPI int GetGlyphIndex(Font font, int codepoint); // Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found RLAPI int GetGlyphIndex(Font font, int codepoint); // Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found
@@ -1485,10 +1556,10 @@ RLAPI void SetMaterialTexture(Material *material, int mapType, Texture2D texture
RLAPI void SetModelMeshMaterial(Model *model, int meshId, int materialId); // Set material for a mesh RLAPI void SetModelMeshMaterial(Model *model, int meshId, int materialId); // Set material for a mesh
// Model animations loading/unloading functions // Model animations loading/unloading functions
RLAPI ModelAnimation *LoadModelAnimations(const char *fileName, unsigned int *animCount); // Load model animations from file RLAPI ModelAnimation *LoadModelAnimations(const char *fileName, int *animCount); // Load model animations from file
RLAPI void UpdateModelAnimation(Model model, ModelAnimation anim, int frame); // Update model animation pose RLAPI void UpdateModelAnimation(Model model, ModelAnimation anim, int frame); // Update model animation pose
RLAPI void UnloadModelAnimation(ModelAnimation anim); // Unload animation data RLAPI void UnloadModelAnimation(ModelAnimation anim); // Unload animation data
RLAPI void UnloadModelAnimations(ModelAnimation *animations, unsigned int count); // Unload animation array data RLAPI void UnloadModelAnimations(ModelAnimation *animations, int animCount); // Unload animation array data
RLAPI bool IsModelAnimationValid(Model model, ModelAnimation anim); // Check model animation skeleton match RLAPI bool IsModelAnimationValid(Model model, ModelAnimation anim); // Check model animation skeleton match
// Collision detection functions // Collision detection functions
@@ -1511,6 +1582,7 @@ RLAPI void InitAudioDevice(void); // Initial
RLAPI void CloseAudioDevice(void); // Close the audio device and context RLAPI void CloseAudioDevice(void); // Close the audio device and context
RLAPI bool IsAudioDeviceReady(void); // Check if audio device has been initialized successfully RLAPI bool IsAudioDeviceReady(void); // Check if audio device has been initialized successfully
RLAPI void SetMasterVolume(float volume); // Set master volume (listener) RLAPI void SetMasterVolume(float volume); // Set master volume (listener)
RLAPI float GetMasterVolume(void); // Get master volume (listener)
// Wave/Sound loading/unloading functions // Wave/Sound loading/unloading functions
RLAPI Wave LoadWave(const char *fileName); // Load wave data from file RLAPI Wave LoadWave(const char *fileName); // Load wave data from file
@@ -1518,10 +1590,12 @@ RLAPI Wave LoadWaveFromMemory(const char *fileType, const unsigned char *fileDat
RLAPI bool IsWaveReady(Wave wave); // Checks if wave data is ready RLAPI bool IsWaveReady(Wave wave); // Checks if wave data is ready
RLAPI Sound LoadSound(const char *fileName); // Load sound from file RLAPI Sound LoadSound(const char *fileName); // Load sound from file
RLAPI Sound LoadSoundFromWave(Wave wave); // Load sound from wave data RLAPI Sound LoadSoundFromWave(Wave wave); // Load sound from wave data
RLAPI Sound LoadSoundAlias(Sound source); // Create a new sound that shares the same sample data as the source sound, does not own the sound data
RLAPI bool IsSoundReady(Sound sound); // Checks if a sound is ready RLAPI bool IsSoundReady(Sound sound); // Checks if a sound is ready
RLAPI void UpdateSound(Sound sound, const void *data, int sampleCount); // Update sound buffer with new data RLAPI void UpdateSound(Sound sound, const void *data, int sampleCount); // Update sound buffer with new data
RLAPI void UnloadWave(Wave wave); // Unload wave data RLAPI void UnloadWave(Wave wave); // Unload wave data
RLAPI void UnloadSound(Sound sound); // Unload sound RLAPI void UnloadSound(Sound sound); // Unload sound
RLAPI void UnloadSoundAlias(Sound alias); // Unload a sound alias (does not deallocate sample data)
RLAPI bool ExportWave(Wave wave, const char *fileName); // Export wave data to file, returns true on success RLAPI bool ExportWave(Wave wave, const char *fileName); // Export wave data to file, returns true on success
RLAPI bool ExportWaveAsCode(Wave wave, const char *fileName); // Export wave sample data to code (.h), returns true on success RLAPI bool ExportWaveAsCode(Wave wave, const char *fileName); // Export wave sample data to code (.h), returns true on success
@@ -1575,10 +1649,10 @@ RLAPI void SetAudioStreamPan(AudioStream stream, float pan); // Set pan
RLAPI void SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams RLAPI void SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams
RLAPI void SetAudioStreamCallback(AudioStream stream, AudioCallback callback); // Audio thread callback to request new data RLAPI void SetAudioStreamCallback(AudioStream stream, AudioCallback callback); // Audio thread callback to request new data
RLAPI void AttachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Attach audio stream processor to stream RLAPI void AttachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Attach audio stream processor to stream, receives the samples as <float>s
RLAPI void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Detach audio stream processor from stream RLAPI void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Detach audio stream processor from stream
RLAPI void AttachAudioMixedProcessor(AudioCallback processor); // Attach audio stream processor to the entire audio pipeline RLAPI void AttachAudioMixedProcessor(AudioCallback processor); // Attach audio stream processor to the entire audio pipeline, receives the samples as <float>s
RLAPI void DetachAudioMixedProcessor(AudioCallback processor); // Detach audio stream processor from the entire audio pipeline RLAPI void DetachAudioMixedProcessor(AudioCallback processor); // Detach audio stream processor from the entire audio pipeline
#if defined(__cplusplus) #if defined(__cplusplus)

View File

@@ -2,8 +2,22 @@
* *
* raymath v1.5 - Math functions to work with Vector2, Vector3, Matrix and Quaternions * raymath v1.5 - Math functions to work with Vector2, Vector3, Matrix and Quaternions
* *
* CONFIGURATION: * CONVENTIONS:
* - Matrix structure is defined as row-major (memory layout) but parameters naming AND all
* math operations performed by the library consider the structure as it was column-major
* It is like transposed versions of the matrices are used for all the maths
* It benefits some functions making them cache-friendly and also avoids matrix
* transpositions sometimes required by OpenGL
* Example: In memory order, row0 is [m0 m4 m8 m12] but in semantic math row0 is [m0 m1 m2 m3]
* - Functions are always self-contained, no function use another raymath function inside,
* required code is directly re-implemented inside
* - Functions input parameters are always received by value (2 unavoidable exceptions)
* - Functions use always a "result" variable for return
* - Functions are always defined inline
* - Angles are always in radians (DEG2RAD/RAD2DEG macros provided for convenience)
* - No compound literals used to make sure libray is compatible with C++
* *
* CONFIGURATION:
* #define RAYMATH_IMPLEMENTATION * #define RAYMATH_IMPLEMENTATION
* Generates the implementation of the library into the included file. * Generates the implementation of the library into the included file.
* If not defined, the library is in header only mode and can be included in other headers * If not defined, the library is in header only mode and can be included in other headers
@@ -13,15 +27,6 @@
* Define static inline functions code, so #include header suffices for use. * Define static inline functions code, so #include header suffices for use.
* This may use up lots of memory. * This may use up lots of memory.
* *
* CONVENTIONS:
*
* - Functions are always self-contained, no function use another raymath function inside,
* required code is directly re-implemented inside
* - Functions input parameters are always received by value (2 unavoidable exceptions)
* - Functions use always a "result" variable for return
* - Functions are always defined inline
* - Angles are always in radians (DEG2RAD/RAD2DEG macros provided for convenience)
*
* *
* LICENSE: zlib/libpng * LICENSE: zlib/libpng
* *
@@ -209,6 +214,10 @@ RMAPI float Wrap(float value, float min, float max)
// Check whether two given floats are almost equal // Check whether two given floats are almost equal
RMAPI int FloatEquals(float x, float y) RMAPI int FloatEquals(float x, float y)
{ {
#if !defined(EPSILON)
#define EPSILON 0.000001f
#endif
int result = (fabsf(x - y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(x), fabsf(y)))); int result = (fabsf(x - y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(x), fabsf(y))));
return result; return result;
@@ -310,7 +319,12 @@ RMAPI float Vector2DistanceSqr(Vector2 v1, Vector2 v2)
// NOTE: Angle is calculated from origin point (0, 0) // NOTE: Angle is calculated from origin point (0, 0)
RMAPI float Vector2Angle(Vector2 v1, Vector2 v2) RMAPI float Vector2Angle(Vector2 v1, Vector2 v2)
{ {
float result = atan2f(v2.y - v1.y, v2.x - v1.x); float result = 0.0f;
float dot = v1.x*v2.x + v1.y*v2.y;
float det = v1.x*v2.y - v1.y*v2.x;
result = atan2f(det, dot);
return result; return result;
} }
@@ -322,17 +336,8 @@ RMAPI float Vector2LineAngle(Vector2 start, Vector2 end)
{ {
float result = 0.0f; float result = 0.0f;
float dot = start.x*end.x + start.y*end.y; // Dot product // TODO(10/9/2023): Currently angles move clockwise, determine if this is wanted behavior
result = -atan2f(end.y - start.y, end.x - start.x);
float dotClamp = (dot < -1.0f)? -1.0f : dot; // Clamp
if (dotClamp > 1.0f) dotClamp = 1.0f;
result = acosf(dotClamp);
// Alternative implementation, more costly
//float v1Length = sqrtf((start.x*start.x) + (start.y*start.y));
//float v2Length = sqrtf((end.x*end.x) + (end.y*end.y));
//float result = -acosf((start.x*end.x + start.y*end.y)/(v1Length*v2Length));
return result; return result;
} }
@@ -507,6 +512,10 @@ RMAPI Vector2 Vector2ClampValue(Vector2 v, float min, float max)
// Check whether two given vectors are almost equal // Check whether two given vectors are almost equal
RMAPI int Vector2Equals(Vector2 p, Vector2 q) RMAPI int Vector2Equals(Vector2 p, Vector2 q)
{ {
#if !defined(EPSILON)
#define EPSILON 0.000001f
#endif
int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) &&
((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))); ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y)))));
@@ -703,12 +712,48 @@ RMAPI Vector3 Vector3Normalize(Vector3 v)
Vector3 result = v; Vector3 result = v;
float length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); float length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z);
if (length == 0.0f) length = 1.0f; if (length != 0.0f)
{
float ilength = 1.0f/length; float ilength = 1.0f/length;
result.x *= ilength; result.x *= ilength;
result.y *= ilength; result.y *= ilength;
result.z *= ilength; result.z *= ilength;
}
return result;
}
//Calculate the projection of the vector v1 on to v2
RMAPI Vector3 Vector3Project(Vector3 v1, Vector3 v2)
{
Vector3 result = { 0 };
float v1dv2 = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z);
float v2dv2 = (v2.x*v2.x + v2.y*v2.y + v2.z*v2.z);
float mag = v1dv2/v2dv2;
result.x = v2.x*mag;
result.y = v2.y*mag;
result.z = v2.z*mag;
return result;
}
//Calculate the rejection of the vector v1 on to v2
RMAPI Vector3 Vector3Reject(Vector3 v1, Vector3 v2)
{
Vector3 result = { 0 };
float v1dv2 = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z);
float v2dv2 = (v2.x*v2.x + v2.y*v2.y + v2.z*v2.z);
float mag = v1dv2/v2dv2;
result.x = v1.x - (v2.x*mag);
result.y = v1.y - (v2.y*mag);
result.z = v1.z - (v2.z*mag);
return result; return result;
} }
@@ -1055,6 +1100,10 @@ RMAPI Vector3 Vector3ClampValue(Vector3 v, float min, float max)
// Check whether two given vectors are almost equal // Check whether two given vectors are almost equal
RMAPI int Vector3Equals(Vector3 p, Vector3 q) RMAPI int Vector3Equals(Vector3 p, Vector3 q)
{ {
#if !defined(EPSILON)
#define EPSILON 0.000001f
#endif
int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) &&
((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) &&
((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))); ((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z)))));
@@ -1062,12 +1111,11 @@ RMAPI int Vector3Equals(Vector3 p, Vector3 q)
return result; return result;
} }
// Compute the direction of a refracted ray where v specifies the // Compute the direction of a refracted ray
// normalized direction of the incoming ray, n specifies the // v: normalized direction of the incoming ray
// normalized normal vector of the interface of two optical media, // n: normalized normal vector of the interface of two optical media
// and r specifies the ratio of the refractive index of the medium // r: ratio of the refractive index of the medium from where the ray comes
// from where the ray comes to the refractive index of the medium // to the refractive index of the medium on the other side of the surface
// on the other side of the surface
RMAPI Vector3 Vector3Refract(Vector3 v, Vector3 n, float r) RMAPI Vector3 Vector3Refract(Vector3 v, Vector3 n, float r)
{ {
Vector3 result = { 0 }; Vector3 result = { 0 };
@@ -1509,11 +1557,11 @@ RMAPI Matrix MatrixFrustum(double left, double right, double bottom, double top,
// Get perspective projection matrix // Get perspective projection matrix
// NOTE: Fovy angle must be provided in radians // NOTE: Fovy angle must be provided in radians
RMAPI Matrix MatrixPerspective(double fovy, double aspect, double near, double far) RMAPI Matrix MatrixPerspective(double fovY, double aspect, double nearPlane, double farPlane)
{ {
Matrix result = { 0 }; Matrix result = { 0 };
double top = near*tan(fovy*0.5); double top = nearPlane*tan(fovY*0.5);
double bottom = -top; double bottom = -top;
double right = top*aspect; double right = top*aspect;
double left = -right; double left = -right;
@@ -1521,27 +1569,27 @@ RMAPI Matrix MatrixPerspective(double fovy, double aspect, double near, double f
// MatrixFrustum(-right, right, -top, top, near, far); // MatrixFrustum(-right, right, -top, top, near, far);
float rl = (float)(right - left); float rl = (float)(right - left);
float tb = (float)(top - bottom); float tb = (float)(top - bottom);
float fn = (float)(far - near); float fn = (float)(farPlane - nearPlane);
result.m0 = ((float)near*2.0f)/rl; result.m0 = ((float)nearPlane*2.0f)/rl;
result.m5 = ((float)near*2.0f)/tb; result.m5 = ((float)nearPlane*2.0f)/tb;
result.m8 = ((float)right + (float)left)/rl; result.m8 = ((float)right + (float)left)/rl;
result.m9 = ((float)top + (float)bottom)/tb; result.m9 = ((float)top + (float)bottom)/tb;
result.m10 = -((float)far + (float)near)/fn; result.m10 = -((float)farPlane + (float)nearPlane)/fn;
result.m11 = -1.0f; result.m11 = -1.0f;
result.m14 = -((float)far*(float)near*2.0f)/fn; result.m14 = -((float)farPlane*(float)nearPlane*2.0f)/fn;
return result; return result;
} }
// Get orthographic projection matrix // Get orthographic projection matrix
RMAPI Matrix MatrixOrtho(double left, double right, double bottom, double top, double near, double far) RMAPI Matrix MatrixOrtho(double left, double right, double bottom, double top, double nearPlane, double farPlane)
{ {
Matrix result = { 0 }; Matrix result = { 0 };
float rl = (float)(right - left); float rl = (float)(right - left);
float tb = (float)(top - bottom); float tb = (float)(top - bottom);
float fn = (float)(far - near); float fn = (float)(farPlane - nearPlane);
result.m0 = 2.0f/rl; result.m0 = 2.0f/rl;
result.m1 = 0.0f; result.m1 = 0.0f;
@@ -1557,7 +1605,7 @@ RMAPI Matrix MatrixOrtho(double left, double right, double bottom, double top, d
result.m11 = 0.0f; result.m11 = 0.0f;
result.m12 = -((float)left + (float)right)/rl; result.m12 = -((float)left + (float)right)/rl;
result.m13 = -((float)top + (float)bottom)/tb; result.m13 = -((float)top + (float)bottom)/tb;
result.m14 = -((float)far + (float)near)/fn; result.m14 = -((float)farPlane + (float)nearPlane)/fn;
result.m15 = 1.0f; result.m15 = 1.0f;
return result; return result;
@@ -1812,6 +1860,10 @@ RMAPI Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount)
{ {
Quaternion result = { 0 }; Quaternion result = { 0 };
#if !defined(EPSILON)
#define EPSILON 0.000001f
#endif
float cosHalfTheta = q1.x*q2.x + q1.y*q2.y + q1.z*q2.z + q1.w*q2.w; float cosHalfTheta = q1.x*q2.x + q1.y*q2.y + q1.z*q2.z + q1.w*q2.w;
if (cosHalfTheta < 0) if (cosHalfTheta < 0)
@@ -1827,7 +1879,7 @@ RMAPI Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount)
float halfTheta = acosf(cosHalfTheta); float halfTheta = acosf(cosHalfTheta);
float sinHalfTheta = sqrtf(1.0f - cosHalfTheta*cosHalfTheta); float sinHalfTheta = sqrtf(1.0f - cosHalfTheta*cosHalfTheta);
if (fabsf(sinHalfTheta) < 0.001f) if (fabsf(sinHalfTheta) < EPSILON)
{ {
result.x = (q1.x*0.5f + q2.x*0.5f); result.x = (q1.x*0.5f + q2.x*0.5f);
result.y = (q1.y*0.5f + q2.y*0.5f); result.y = (q1.y*0.5f + q2.y*0.5f);
@@ -2040,7 +2092,7 @@ RMAPI void QuaternionToAxisAngle(Quaternion q, Vector3 *outAxis, float *outAngle
float resAngle = 2.0f*acosf(q.w); float resAngle = 2.0f*acosf(q.w);
float den = sqrtf(1.0f - q.w*q.w); float den = sqrtf(1.0f - q.w*q.w);
if (den > 0.0001f) if (den > EPSILON)
{ {
resAxis.x = q.x/den; resAxis.x = q.x/den;
resAxis.y = q.y/den; resAxis.y = q.y/den;
@@ -2119,6 +2171,10 @@ RMAPI Quaternion QuaternionTransform(Quaternion q, Matrix mat)
// Check whether two given quaternions are almost equal // Check whether two given quaternions are almost equal
RMAPI int QuaternionEquals(Quaternion p, Quaternion q) RMAPI int QuaternionEquals(Quaternion p, Quaternion q)
{ {
#if !defined(EPSILON)
#define EPSILON 0.000001f
#endif
int result = (((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && int result = (((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) &&
((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) &&
((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) && ((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) &&

View File

@@ -2,30 +2,31 @@
* *
* rlgl v4.5 - A multi-OpenGL abstraction layer with an immediate-mode style API * rlgl v4.5 - A multi-OpenGL abstraction layer with an immediate-mode style API
* *
* DESCRIPTION:
* An abstraction layer for multiple OpenGL versions (1.1, 2.1, 3.3 Core, 4.3 Core, ES 2.0) * An abstraction layer for multiple OpenGL versions (1.1, 2.1, 3.3 Core, 4.3 Core, ES 2.0)
* that provides a pseudo-OpenGL 1.1 immediate-mode style API (rlVertex, rlTranslate, rlRotate...) * that provides a pseudo-OpenGL 1.1 immediate-mode style API (rlVertex, rlTranslate, rlRotate...)
* *
* ADDITIONAL NOTES:
* When choosing an OpenGL backend different than OpenGL 1.1, some internal buffer are * When choosing an OpenGL backend different than OpenGL 1.1, some internal buffer are
* initialized on rlglInit() to accumulate vertex data. * initialized on rlglInit() to accumulate vertex data.
* *
* When an internal state change is required all the stored vertex data is renderer in batch, * When an internal state change is required all the stored vertex data is renderer in batch,
* additionally, rlDrawRenderBatchActive() could be called to force flushing of the batch. * additionally, rlDrawRenderBatchActive() could be called to force flushing of the batch.
* *
* Some additional resources are also loaded for convenience, here the complete list: * Some resources are also loaded for convenience, here the complete list:
* - Default batch (RLGL.defaultBatch): RenderBatch system to accumulate vertex data * - Default batch (RLGL.defaultBatch): RenderBatch system to accumulate vertex data
* - Default texture (RLGL.defaultTextureId): 1x1 white pixel R8G8B8A8 * - Default texture (RLGL.defaultTextureId): 1x1 white pixel R8G8B8A8
* - Default shader (RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs) * - Default shader (RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs)
* *
* Internal buffer (and additional resources) must be manually unloaded calling rlglClose(). * Internal buffer (and resources) must be manually unloaded calling rlglClose().
*
* *
* CONFIGURATION: * CONFIGURATION:
*
* #define GRAPHICS_API_OPENGL_11 * #define GRAPHICS_API_OPENGL_11
* #define GRAPHICS_API_OPENGL_21 * #define GRAPHICS_API_OPENGL_21
* #define GRAPHICS_API_OPENGL_33 * #define GRAPHICS_API_OPENGL_33
* #define GRAPHICS_API_OPENGL_43 * #define GRAPHICS_API_OPENGL_43
* #define GRAPHICS_API_OPENGL_ES2 * #define GRAPHICS_API_OPENGL_ES2
* #define GRAPHICS_API_OPENGL_ES3
* Use selected OpenGL graphics backend, should be supported by platform * Use selected OpenGL graphics backend, should be supported by platform
* Those preprocessor defines are only used on rlgl module, if OpenGL version is * Those preprocessor defines are only used on rlgl module, if OpenGL version is
* required by any other module, use rlGetVersion() to check it * required by any other module, use rlGetVersion() to check it
@@ -58,7 +59,7 @@
* #define RL_CULL_DISTANCE_NEAR 0.01 // Default projection matrix near cull distance * #define RL_CULL_DISTANCE_NEAR 0.01 // Default projection matrix near cull distance
* #define RL_CULL_DISTANCE_FAR 1000.0 // Default projection matrix far cull distance * #define RL_CULL_DISTANCE_FAR 1000.0 // Default projection matrix far cull distance
* *
* When loading a shader, the following vertex attribute and uniform * When loading a shader, the following vertex attributes and uniform
* location names are tried to be set automatically: * location names are tried to be set automatically:
* *
* #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: 0 * #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: 0
@@ -66,6 +67,7 @@
* #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: 2 * #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: 2
* #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: 3 * #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: 3
* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: 4 * #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: 4
* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: 5
* #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp" // model-view-projection matrix * #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp" // model-view-projection matrix
* #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView" // view matrix * #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView" // view matrix
* #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection" // projection matrix * #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection" // projection matrix
@@ -77,7 +79,6 @@
* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) * #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2)
* *
* DEPENDENCIES: * DEPENDENCIES:
*
* - OpenGL libraries (depending on platform and OpenGL version selected) * - OpenGL libraries (depending on platform and OpenGL version selected)
* - GLAD OpenGL extensions loading library (only for OpenGL 3.3 Core, 4.3 Core) * - GLAD OpenGL extensions loading library (only for OpenGL 3.3 Core, 4.3 Core)
* *
@@ -148,7 +149,8 @@
!defined(GRAPHICS_API_OPENGL_21) && \ !defined(GRAPHICS_API_OPENGL_21) && \
!defined(GRAPHICS_API_OPENGL_33) && \ !defined(GRAPHICS_API_OPENGL_33) && \
!defined(GRAPHICS_API_OPENGL_43) && \ !defined(GRAPHICS_API_OPENGL_43) && \
!defined(GRAPHICS_API_OPENGL_ES2) !defined(GRAPHICS_API_OPENGL_ES2) && \
!defined(GRAPHICS_API_OPENGL_ES3)
#define GRAPHICS_API_OPENGL_33 #define GRAPHICS_API_OPENGL_33
#endif #endif
@@ -179,6 +181,11 @@
#define GRAPHICS_API_OPENGL_33 #define GRAPHICS_API_OPENGL_33
#endif #endif
// OpenGL ES 3.0 uses OpenGL ES 2.0 functionality (and more)
#if defined(GRAPHICS_API_OPENGL_ES3)
#define GRAPHICS_API_OPENGL_ES2
#endif
// Support framebuffer objects by default // Support framebuffer objects by default
// NOTE: Some driver implementation do not support it, despite they should // NOTE: Some driver implementation do not support it, despite they should
#define RLGL_RENDER_TEXTURES_HINT #define RLGL_RENDER_TEXTURES_HINT
@@ -383,7 +390,8 @@ typedef enum {
RL_OPENGL_21, // OpenGL 2.1 (GLSL 120) RL_OPENGL_21, // OpenGL 2.1 (GLSL 120)
RL_OPENGL_33, // OpenGL 3.3 (GLSL 330) RL_OPENGL_33, // OpenGL 3.3 (GLSL 330)
RL_OPENGL_43, // OpenGL 4.3 (using GLSL 330) RL_OPENGL_43, // OpenGL 4.3 (using GLSL 330)
RL_OPENGL_ES_20 // OpenGL ES 2.0 (GLSL 100) RL_OPENGL_ES_20, // OpenGL ES 2.0 (GLSL 100)
RL_OPENGL_ES_30 // OpenGL ES 3.0 (GLSL 300 es)
} rlGlVersion; } rlGlVersion;
// Trace log level // Trace log level
@@ -412,6 +420,9 @@ typedef enum {
RL_PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float) RL_PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float)
RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float) RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float)
RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float) RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float)
RL_PIXELFORMAT_UNCOMPRESSED_R16, // 16 bpp (1 channel - half float)
RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16, // 16*3 bpp (3 channels - half float)
RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, // 16*4 bpp (4 channels - half float)
RL_PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha) RL_PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha)
RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha) RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha)
RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp
@@ -507,13 +518,13 @@ typedef enum {
// NOTE: By default up to 8 color channels defined, but it can be more // NOTE: By default up to 8 color channels defined, but it can be more
typedef enum { typedef enum {
RL_ATTACHMENT_COLOR_CHANNEL0 = 0, // Framebuffer attachment type: color 0 RL_ATTACHMENT_COLOR_CHANNEL0 = 0, // Framebuffer attachment type: color 0
RL_ATTACHMENT_COLOR_CHANNEL1, // Framebuffer attachment type: color 1 RL_ATTACHMENT_COLOR_CHANNEL1 = 1, // Framebuffer attachment type: color 1
RL_ATTACHMENT_COLOR_CHANNEL2, // Framebuffer attachment type: color 2 RL_ATTACHMENT_COLOR_CHANNEL2 = 2, // Framebuffer attachment type: color 2
RL_ATTACHMENT_COLOR_CHANNEL3, // Framebuffer attachment type: color 3 RL_ATTACHMENT_COLOR_CHANNEL3 = 3, // Framebuffer attachment type: color 3
RL_ATTACHMENT_COLOR_CHANNEL4, // Framebuffer attachment type: color 4 RL_ATTACHMENT_COLOR_CHANNEL4 = 4, // Framebuffer attachment type: color 4
RL_ATTACHMENT_COLOR_CHANNEL5, // Framebuffer attachment type: color 5 RL_ATTACHMENT_COLOR_CHANNEL5 = 5, // Framebuffer attachment type: color 5
RL_ATTACHMENT_COLOR_CHANNEL6, // Framebuffer attachment type: color 6 RL_ATTACHMENT_COLOR_CHANNEL6 = 6, // Framebuffer attachment type: color 6
RL_ATTACHMENT_COLOR_CHANNEL7, // Framebuffer attachment type: color 7 RL_ATTACHMENT_COLOR_CHANNEL7 = 7, // Framebuffer attachment type: color 7
RL_ATTACHMENT_DEPTH = 100, // Framebuffer attachment type: depth RL_ATTACHMENT_DEPTH = 100, // Framebuffer attachment type: depth
RL_ATTACHMENT_STENCIL = 200, // Framebuffer attachment type: stencil RL_ATTACHMENT_STENCIL = 200, // Framebuffer attachment type: stencil
} rlFramebufferAttachType; } rlFramebufferAttachType;
@@ -521,11 +532,11 @@ typedef enum {
// Framebuffer texture attachment type // Framebuffer texture attachment type
typedef enum { typedef enum {
RL_ATTACHMENT_CUBEMAP_POSITIVE_X = 0, // Framebuffer texture attachment type: cubemap, +X side RL_ATTACHMENT_CUBEMAP_POSITIVE_X = 0, // Framebuffer texture attachment type: cubemap, +X side
RL_ATTACHMENT_CUBEMAP_NEGATIVE_X, // Framebuffer texture attachment type: cubemap, -X side RL_ATTACHMENT_CUBEMAP_NEGATIVE_X = 1, // Framebuffer texture attachment type: cubemap, -X side
RL_ATTACHMENT_CUBEMAP_POSITIVE_Y, // Framebuffer texture attachment type: cubemap, +Y side RL_ATTACHMENT_CUBEMAP_POSITIVE_Y = 2, // Framebuffer texture attachment type: cubemap, +Y side
RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y, // Framebuffer texture attachment type: cubemap, -Y side RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y = 3, // Framebuffer texture attachment type: cubemap, -Y side
RL_ATTACHMENT_CUBEMAP_POSITIVE_Z, // Framebuffer texture attachment type: cubemap, +Z side RL_ATTACHMENT_CUBEMAP_POSITIVE_Z = 4, // Framebuffer texture attachment type: cubemap, +Z side
RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z, // Framebuffer texture attachment type: cubemap, -Z side RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z = 5, // Framebuffer texture attachment type: cubemap, -Z side
RL_ATTACHMENT_TEXTURE2D = 100, // Framebuffer texture attachment type: texture2d RL_ATTACHMENT_TEXTURE2D = 100, // Framebuffer texture attachment type: texture2d
RL_ATTACHMENT_RENDERBUFFER = 200, // Framebuffer texture attachment type: renderbuffer RL_ATTACHMENT_RENDERBUFFER = 200, // Framebuffer texture attachment type: renderbuffer
} rlFramebufferAttachTextureType; } rlFramebufferAttachTextureType;
@@ -607,6 +618,7 @@ RLAPI void rlDisableShader(void); // Disable shader progra
RLAPI void rlEnableFramebuffer(unsigned int id); // Enable render texture (fbo) RLAPI void rlEnableFramebuffer(unsigned int id); // Enable render texture (fbo)
RLAPI void rlDisableFramebuffer(void); // Disable render texture (fbo), return to default framebuffer RLAPI void rlDisableFramebuffer(void); // Disable render texture (fbo), return to default framebuffer
RLAPI void rlActiveDrawBuffers(int count); // Activate multiple draw color buffers RLAPI void rlActiveDrawBuffers(int count); // Activate multiple draw color buffers
RLAPI void rlBlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight, int bufferMask); // Blit active framebuffer to main framebuffer
// General render state // General render state
RLAPI void rlEnableColorBlend(void); // Enable color blending RLAPI void rlEnableColorBlend(void); // Enable color blending
@@ -622,7 +634,8 @@ RLAPI void rlEnableScissorTest(void); // Enable scissor test
RLAPI void rlDisableScissorTest(void); // Disable scissor test RLAPI void rlDisableScissorTest(void); // Disable scissor test
RLAPI void rlScissor(int x, int y, int width, int height); // Scissor test RLAPI void rlScissor(int x, int y, int width, int height); // Scissor test
RLAPI void rlEnableWireMode(void); // Enable wire mode RLAPI void rlEnableWireMode(void); // Enable wire mode
RLAPI void rlDisableWireMode(void); // Disable wire mode RLAPI void rlEnablePointMode(void); // Enable point mode
RLAPI void rlDisableWireMode(void); // Disable wire mode ( and point ) maybe rename
RLAPI void rlSetLineWidth(float width); // Set the line drawing width RLAPI void rlSetLineWidth(float width); // Set the line drawing width
RLAPI float rlGetLineWidth(void); // Get the line drawing width RLAPI float rlGetLineWidth(void); // Get the line drawing width
RLAPI void rlEnableSmoothLines(void); // Enable line aliasing RLAPI void rlEnableSmoothLines(void); // Enable line aliasing
@@ -790,10 +803,14 @@ RLAPI void rlLoadDrawQuad(void); // Load and draw a quad
#include "external/glad.h" // GLAD extensions loading library, includes OpenGL headers #include "external/glad.h" // GLAD extensions loading library, includes OpenGL headers
#endif #endif
#if defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_ES3)
#include <GLES3/gl3.h> // OpenGL ES 3.0 library
#define GL_GLEXT_PROTOTYPES
#include <GLES2/gl2ext.h> // OpenGL ES 2.0 extensions library
#elif defined(GRAPHICS_API_OPENGL_ES2)
// NOTE: OpenGL ES 2.0 can be enabled on PLATFORM_DESKTOP, // NOTE: OpenGL ES 2.0 can be enabled on PLATFORM_DESKTOP,
// in that case, functions are loaded from a custom glad for OpenGL ES 2.0 // in that case, functions are loaded from a custom glad for OpenGL ES 2.0
#if defined(PLATFORM_DESKTOP) #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_DESKTOP_SDL)
#define GLAD_GLES2_IMPLEMENTATION #define GLAD_GLES2_IMPLEMENTATION
#include "external/glad_gles2.h" #include "external/glad_gles2.h"
#else #else
@@ -805,7 +822,7 @@ RLAPI void rlLoadDrawQuad(void); // Load and draw a quad
// It seems OpenGL ES 2.0 instancing entry points are not defined on Raspberry Pi // It seems OpenGL ES 2.0 instancing entry points are not defined on Raspberry Pi
// provided headers (despite being defined in official Khronos GLES2 headers) // provided headers (despite being defined in official Khronos GLES2 headers)
#if defined(PLATFORM_RPI) || defined(PLATFORM_DRM) #if defined(PLATFORM_DRM)
typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount);
typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor);
@@ -887,9 +904,11 @@ RLAPI void rlLoadDrawQuad(void); // Load and draw a quad
#if defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_ES2)
#define glClearDepth glClearDepthf #define glClearDepth glClearDepthf
#if !defined(GRAPHICS_API_OPENGL_ES3)
#define GL_READ_FRAMEBUFFER GL_FRAMEBUFFER #define GL_READ_FRAMEBUFFER GL_FRAMEBUFFER
#define GL_DRAW_FRAMEBUFFER GL_FRAMEBUFFER #define GL_DRAW_FRAMEBUFFER GL_FRAMEBUFFER
#endif #endif
#endif
// Default shader vertex attribute names to set location points // Default shader vertex attribute names to set location points
#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION
@@ -999,6 +1018,7 @@ typedef struct rlglData {
bool texDepth; // Depth textures supported (GL_ARB_depth_texture, GL_OES_depth_texture) bool texDepth; // Depth textures supported (GL_ARB_depth_texture, GL_OES_depth_texture)
bool texDepthWebGL; // Depth textures supported WebGL specific (GL_WEBGL_depth_texture) bool texDepthWebGL; // Depth textures supported WebGL specific (GL_WEBGL_depth_texture)
bool texFloat32; // float textures support (32 bit per channel) (GL_OES_texture_float) bool texFloat32; // float textures support (32 bit per channel) (GL_OES_texture_float)
bool texFloat16; // half float textures support (16 bit per channel) (GL_OES_texture_half_float)
bool texCompDXT; // DDS texture compression support (GL_EXT_texture_compression_s3tc, GL_WEBGL_compressed_texture_s3tc, GL_WEBKIT_WEBGL_compressed_texture_s3tc) bool texCompDXT; // DDS texture compression support (GL_EXT_texture_compression_s3tc, GL_WEBGL_compressed_texture_s3tc, GL_WEBKIT_WEBGL_compressed_texture_s3tc)
bool texCompETC1; // ETC1 texture compression support (GL_OES_compressed_ETC1_RGB8_texture, GL_WEBGL_compressed_texture_etc1) bool texCompETC1; // ETC1 texture compression support (GL_OES_compressed_ETC1_RGB8_texture, GL_WEBGL_compressed_texture_etc1)
bool texCompETC2; // ETC2/EAC texture compression support (GL_ARB_ES3_compatibility) bool texCompETC2; // ETC2/EAC texture compression support (GL_ARB_ES3_compatibility)
@@ -1026,7 +1046,7 @@ typedef void *(*rlglLoadProc)(const char *name); // OpenGL extension functions
static rlglData RLGL = { 0 }; static rlglData RLGL = { 0 };
#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 #endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
#if defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_ES2) && !defined(GRAPHICS_API_OPENGL_ES3)
// NOTE: VAO functionality is exposed through extensions (OES) // NOTE: VAO functionality is exposed through extensions (OES)
static PFNGLGENVERTEXARRAYSOESPROC glGenVertexArrays = NULL; static PFNGLGENVERTEXARRAYSOESPROC glGenVertexArrays = NULL;
static PFNGLBINDVERTEXARRAYOESPROC glBindVertexArray = NULL; static PFNGLBINDVERTEXARRAYOESPROC glBindVertexArray = NULL;
@@ -1045,7 +1065,7 @@ static PFNGLVERTEXATTRIBDIVISOREXTPROC glVertexAttribDivisor = NULL;
static void rlLoadShaderDefault(void); // Load default shader static void rlLoadShaderDefault(void); // Load default shader
static void rlUnloadShaderDefault(void); // Unload default shader static void rlUnloadShaderDefault(void); // Unload default shader
#if defined(RLGL_SHOW_GL_DETAILS_INFO) #if defined(RLGL_SHOW_GL_DETAILS_INFO)
static char *rlGetCompressedFormatName(int format); // Get compressed format official GL identifier name static const char *rlGetCompressedFormatName(int format); // Get compressed format official GL identifier name
#endif // RLGL_SHOW_GL_DETAILS_INFO #endif // RLGL_SHOW_GL_DETAILS_INFO
#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 #endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
@@ -1416,8 +1436,7 @@ void rlVertex3f(float x, float y, float z)
RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter] = RLGL.State.texcoordx; RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter] = RLGL.State.texcoordx;
RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter + 1] = RLGL.State.texcoordy; RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter + 1] = RLGL.State.texcoordy;
// TODO: Add current normal // WARNING: By default rlVertexBuffer struct does not store normals
// By default rlVertexBuffer type does not store normals
// Add current color // Add current color
RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter] = RLGL.State.colorr; RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter] = RLGL.State.colorr;
@@ -1702,11 +1721,19 @@ void rlDisableFramebuffer(void)
#endif #endif
} }
// Blit active framebuffer to main framebuffer
void rlBlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight, int bufferMask)
{
#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) && defined(RLGL_RENDER_TEXTURES_HINT)
glBlitFramebuffer(srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight, bufferMask, GL_NEAREST);
#endif
}
// Activate multiple draw color buffers // Activate multiple draw color buffers
// NOTE: One color buffer is always active by default // NOTE: One color buffer is always active by default
void rlActiveDrawBuffers(int count) void rlActiveDrawBuffers(int count)
{ {
#if (defined(GRAPHICS_API_OPENGL_33) && defined(RLGL_RENDER_TEXTURES_HINT)) #if ((defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) && defined(RLGL_RENDER_TEXTURES_HINT))
// NOTE: Maximum number of draw buffers supported is implementation dependant, // NOTE: Maximum number of draw buffers supported is implementation dependant,
// it can be queried with glGet*() but it must be at least 8 // it can be queried with glGet*() but it must be at least 8
//GLint maxDrawBuffers = 0; //GLint maxDrawBuffers = 0;
@@ -1718,6 +1745,16 @@ void rlActiveDrawBuffers(int count)
else else
{ {
unsigned int buffers[8] = { unsigned int buffers[8] = {
#if defined(GRAPHICS_API_OPENGL_ES3)
GL_COLOR_ATTACHMENT0_EXT,
GL_COLOR_ATTACHMENT1_EXT,
GL_COLOR_ATTACHMENT2_EXT,
GL_COLOR_ATTACHMENT3_EXT,
GL_COLOR_ATTACHMENT4_EXT,
GL_COLOR_ATTACHMENT5_EXT,
GL_COLOR_ATTACHMENT6_EXT,
GL_COLOR_ATTACHMENT7_EXT,
#else
GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT0,
GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT2,
@@ -1726,9 +1763,14 @@ void rlActiveDrawBuffers(int count)
GL_COLOR_ATTACHMENT5, GL_COLOR_ATTACHMENT5,
GL_COLOR_ATTACHMENT6, GL_COLOR_ATTACHMENT6,
GL_COLOR_ATTACHMENT7, GL_COLOR_ATTACHMENT7,
#endif
}; };
#if defined(GRAPHICS_API_OPENGL_ES3)
glDrawBuffersEXT(count, buffers);
#else
glDrawBuffers(count, buffers); glDrawBuffers(count, buffers);
#endif
} }
} }
else TRACELOG(LOG_WARNING, "GL: One color buffer active by default"); else TRACELOG(LOG_WARNING, "GL: One color buffer active by default");
@@ -1792,6 +1834,14 @@ void rlEnableWireMode(void)
#endif #endif
} }
void rlEnablePointMode(void)
{
#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33)
// NOTE: glPolygonMode() not available on OpenGL ES
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
glEnable(GL_PROGRAM_POINT_SIZE);
#endif
}
// Disable wire mode // Disable wire mode
void rlDisableWireMode(void) void rlDisableWireMode(void)
{ {
@@ -2047,7 +2097,7 @@ void rlglInit(int width, int height)
if ((glDebugMessageCallback != NULL) && (glDebugMessageControl != NULL)) if ((glDebugMessageCallback != NULL) && (glDebugMessageControl != NULL))
{ {
glDebugMessageCallback(rlDebugMessageCallback, 0); glDebugMessageCallback(rlDebugMessageCallback, 0);
// glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, GL_DEBUG_SEVERITY_HIGH, 0, 0, GL_TRUE); // TODO: Filter message // glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, GL_DEBUG_SEVERITY_HIGH, 0, 0, GL_TRUE);
// Debug context options: // Debug context options:
// - GL_DEBUG_OUTPUT - Faster version but not useful for breakpoints // - GL_DEBUG_OUTPUT - Faster version but not useful for breakpoints
@@ -2168,6 +2218,7 @@ void rlLoadExtensions(void *loader)
RLGL.ExtSupported.instancing = (GLAD_GL_EXT_draw_instanced && GLAD_GL_ARB_instanced_arrays); RLGL.ExtSupported.instancing = (GLAD_GL_EXT_draw_instanced && GLAD_GL_ARB_instanced_arrays);
RLGL.ExtSupported.texNPOT = GLAD_GL_ARB_texture_non_power_of_two; RLGL.ExtSupported.texNPOT = GLAD_GL_ARB_texture_non_power_of_two;
RLGL.ExtSupported.texFloat32 = GLAD_GL_ARB_texture_float; RLGL.ExtSupported.texFloat32 = GLAD_GL_ARB_texture_float;
RLGL.ExtSupported.texFloat16 = GLAD_GL_ARB_texture_float;
RLGL.ExtSupported.texDepth = GLAD_GL_ARB_depth_texture; RLGL.ExtSupported.texDepth = GLAD_GL_ARB_depth_texture;
RLGL.ExtSupported.maxDepthBits = 32; RLGL.ExtSupported.maxDepthBits = 32;
RLGL.ExtSupported.texAnisoFilter = GLAD_GL_EXT_texture_filter_anisotropic; RLGL.ExtSupported.texAnisoFilter = GLAD_GL_EXT_texture_filter_anisotropic;
@@ -2179,6 +2230,7 @@ void rlLoadExtensions(void *loader)
RLGL.ExtSupported.instancing = true; RLGL.ExtSupported.instancing = true;
RLGL.ExtSupported.texNPOT = true; RLGL.ExtSupported.texNPOT = true;
RLGL.ExtSupported.texFloat32 = true; RLGL.ExtSupported.texFloat32 = true;
RLGL.ExtSupported.texFloat16 = true;
RLGL.ExtSupported.texDepth = true; RLGL.ExtSupported.texDepth = true;
RLGL.ExtSupported.maxDepthBits = 32; RLGL.ExtSupported.maxDepthBits = 32;
RLGL.ExtSupported.texAnisoFilter = true; RLGL.ExtSupported.texAnisoFilter = true;
@@ -2196,9 +2248,33 @@ void rlLoadExtensions(void *loader)
#endif // GRAPHICS_API_OPENGL_33 #endif // GRAPHICS_API_OPENGL_33
#if defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_ES3)
// Register supported extensions flags
// OpenGL ES 3.0 extensions supported by default (or it should be)
RLGL.ExtSupported.vao = true;
RLGL.ExtSupported.instancing = true;
RLGL.ExtSupported.texNPOT = true;
RLGL.ExtSupported.texFloat32 = true;
RLGL.ExtSupported.texFloat16 = true;
RLGL.ExtSupported.texDepth = true;
RLGL.ExtSupported.texDepthWebGL = true;
RLGL.ExtSupported.maxDepthBits = 24;
RLGL.ExtSupported.texAnisoFilter = true;
RLGL.ExtSupported.texMirrorClamp = true;
// TODO: Check for additional OpenGL ES 3.0 supported extensions:
//RLGL.ExtSupported.texCompDXT = true;
//RLGL.ExtSupported.texCompETC1 = true;
//RLGL.ExtSupported.texCompETC2 = true;
//RLGL.ExtSupported.texCompPVRT = true;
//RLGL.ExtSupported.texCompASTC = true;
//RLGL.ExtSupported.maxAnisotropyLevel = true;
//RLGL.ExtSupported.computeShader = true;
//RLGL.ExtSupported.ssbo = true;
#if defined(PLATFORM_DESKTOP) #elif defined(GRAPHICS_API_OPENGL_ES2)
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_DESKTOP_SDL)
// TODO: Support GLAD loader for OpenGL ES 3.0
if (gladLoadGLES2((GLADloadfunc)loader) == 0) TRACELOG(RL_LOG_WARNING, "GLAD: Cannot load OpenGL ES2.0 functions"); if (gladLoadGLES2((GLADloadfunc)loader) == 0) TRACELOG(RL_LOG_WARNING, "GLAD: Cannot load OpenGL ES2.0 functions");
else TRACELOG(RL_LOG_INFO, "GLAD: OpenGL ES 2.0 loaded successfully"); else TRACELOG(RL_LOG_INFO, "GLAD: OpenGL ES 2.0 loaded successfully");
#endif #endif
@@ -2276,6 +2352,7 @@ void rlLoadExtensions(void *loader)
// Check texture float support // Check texture float support
if (strcmp(extList[i], (const char *)"GL_OES_texture_float") == 0) RLGL.ExtSupported.texFloat32 = true; if (strcmp(extList[i], (const char *)"GL_OES_texture_float") == 0) RLGL.ExtSupported.texFloat32 = true;
if (strcmp(extList[i], (const char *)"GL_OES_texture_half_float") == 0) RLGL.ExtSupported.texFloat16 = true;
// Check depth texture support // Check depth texture support
if (strcmp(extList[i], (const char *)"GL_OES_depth_texture") == 0) RLGL.ExtSupported.texDepth = true; if (strcmp(extList[i], (const char *)"GL_OES_depth_texture") == 0) RLGL.ExtSupported.texDepth = true;
@@ -2391,15 +2468,17 @@ int rlGetVersion(void)
#endif #endif
#if defined(GRAPHICS_API_OPENGL_21) #if defined(GRAPHICS_API_OPENGL_21)
glVersion = RL_OPENGL_21; glVersion = RL_OPENGL_21;
#elif defined(GRAPHICS_API_OPENGL_43)
glVersion = RL_OPENGL_43;
#elif defined(GRAPHICS_API_OPENGL_33) #elif defined(GRAPHICS_API_OPENGL_33)
glVersion = RL_OPENGL_33; glVersion = RL_OPENGL_33;
#endif #endif
#if defined(GRAPHICS_API_OPENGL_43) #if defined(GRAPHICS_API_OPENGL_ES3)
glVersion = RL_OPENGL_43; glVersion = RL_OPENGL_ES_30;
#endif #elif defined(GRAPHICS_API_OPENGL_ES2)
#if defined(GRAPHICS_API_OPENGL_ES2)
glVersion = RL_OPENGL_ES_20; glVersion = RL_OPENGL_ES_20;
#endif #endif
return glVersion; return glVersion;
} }
@@ -2648,7 +2727,7 @@ void rlDrawRenderBatch(rlRenderBatch *batch)
// Update batch vertex buffers // Update batch vertex buffers
//------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------
// NOTE: If there is not vertex data, buffers doesn't need to be updated (vertexCount > 0) // NOTE: If there is not vertex data, buffers doesn't need to be updated (vertexCount > 0)
// TODO: If no data changed on the CPU arrays --> No need to re-update GPU arrays (change flag required) // TODO: If no data changed on the CPU arrays --> No need to re-update GPU arrays (use a change detector flag?)
if (RLGL.State.vertexCounter > 0) if (RLGL.State.vertexCounter > 0)
{ {
// Activate elements VAO // Activate elements VAO
@@ -2943,7 +3022,11 @@ unsigned int rlLoadTexture(const void *data, int width, int height, int format,
int mipWidth = width; int mipWidth = width;
int mipHeight = height; int mipHeight = height;
int mipOffset = 0; // Mipmap data offset int mipOffset = 0; // Mipmap data offset, only used for tracelog
// NOTE: Added pointer math separately from function to avoid UBSAN complaining
unsigned char *dataPtr = NULL;
if (data != NULL) dataPtr = (unsigned char *)data;
// Load the different mipmap levels // Load the different mipmap levels
for (int i = 0; i < mipmapCount; i++) for (int i = 0; i < mipmapCount; i++)
@@ -2955,11 +3038,11 @@ unsigned int rlLoadTexture(const void *data, int width, int height, int format,
TRACELOGD("TEXTURE: Load mipmap level %i (%i x %i), size: %i, offset: %i", i, mipWidth, mipHeight, mipSize, mipOffset); TRACELOGD("TEXTURE: Load mipmap level %i (%i x %i), size: %i, offset: %i", i, mipWidth, mipHeight, mipSize, mipOffset);
if (glInternalFormat != -1) if (glInternalFormat != 0)
{ {
if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) glTexImage2D(GL_TEXTURE_2D, i, glInternalFormat, mipWidth, mipHeight, 0, glFormat, glType, (unsigned char *)data + mipOffset); if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) glTexImage2D(GL_TEXTURE_2D, i, glInternalFormat, mipWidth, mipHeight, 0, glFormat, glType, dataPtr);
#if !defined(GRAPHICS_API_OPENGL_11) #if !defined(GRAPHICS_API_OPENGL_11)
else glCompressedTexImage2D(GL_TEXTURE_2D, i, glInternalFormat, mipWidth, mipHeight, 0, mipSize, (unsigned char *)data + mipOffset); else glCompressedTexImage2D(GL_TEXTURE_2D, i, glInternalFormat, mipWidth, mipHeight, 0, mipSize, dataPtr);
#endif #endif
#if defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_33)
@@ -2982,7 +3065,8 @@ unsigned int rlLoadTexture(const void *data, int width, int height, int format,
mipWidth /= 2; mipWidth /= 2;
mipHeight /= 2; mipHeight /= 2;
mipOffset += mipSize; mipOffset += mipSize; // Increment offset position to next mipmap
if (data != NULL) dataPtr += mipSize; // Increment data pointer to next mipmap
// Security check for NPOT textures // Security check for NPOT textures
if (mipWidth < 1) mipWidth = 1; if (mipWidth < 1) mipWidth = 1;
@@ -3049,7 +3133,7 @@ unsigned int rlLoadTextureDepth(int width, int height, bool useRenderBuffer)
// Possible formats: GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32 and GL_DEPTH_COMPONENT32F // Possible formats: GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32 and GL_DEPTH_COMPONENT32F
unsigned int glInternalFormat = GL_DEPTH_COMPONENT; unsigned int glInternalFormat = GL_DEPTH_COMPONENT;
#if defined(GRAPHICS_API_OPENGL_ES2) #if (defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_ES3))
// WARNING: WebGL platform requires unsized internal format definition (GL_DEPTH_COMPONENT) // WARNING: WebGL platform requires unsized internal format definition (GL_DEPTH_COMPONENT)
// while other platforms using OpenGL ES 2.0 require/support sized internal formats depending on the GPU capabilities // while other platforms using OpenGL ES 2.0 require/support sized internal formats depending on the GPU capabilities
if (!RLGL.ExtSupported.texDepthWebGL || useRenderBuffer) if (!RLGL.ExtSupported.texDepthWebGL || useRenderBuffer)
@@ -3108,7 +3192,7 @@ unsigned int rlLoadTextureCubemap(const void *data, int size, int format)
unsigned int glInternalFormat, glFormat, glType; unsigned int glInternalFormat, glFormat, glType;
rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType);
if (glInternalFormat != -1) if (glInternalFormat != 0)
{ {
// Load cubemap faces // Load cubemap faces
for (unsigned int i = 0; i < 6; i++) for (unsigned int i = 0; i < 6; i++)
@@ -3117,13 +3201,9 @@ unsigned int rlLoadTextureCubemap(const void *data, int size, int format)
{ {
if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)
{ {
if (format == RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32) if ((format == RL_PIXELFORMAT_UNCOMPRESSED_R32) || (format == RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32)
{ || (format == RL_PIXELFORMAT_UNCOMPRESSED_R16) || (format == RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16))
// Instead of using a sized internal texture format (GL_RGB16F, GL_RGB32F), we let the driver to choose the better format for us (GL_RGB) TRACELOG(RL_LOG_WARNING, "TEXTURES: Cubemap requested format not supported");
if (RLGL.ExtSupported.texFloat32) glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, size, size, 0, GL_RGB, GL_FLOAT, NULL);
else TRACELOG(RL_LOG_WARNING, "TEXTURES: Cubemap requested format not supported");
}
else if ((format == RL_PIXELFORMAT_UNCOMPRESSED_R32) || (format == RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32)) TRACELOG(RL_LOG_WARNING, "TEXTURES: Cubemap requested format not supported");
else glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, size, size, 0, glFormat, glType, NULL); else glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, size, size, 0, glFormat, glType, NULL);
} }
else TRACELOG(RL_LOG_WARNING, "TEXTURES: Empty cubemap creation does not support compressed format"); else TRACELOG(RL_LOG_WARNING, "TEXTURES: Empty cubemap creation does not support compressed format");
@@ -3180,7 +3260,7 @@ void rlUpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int h
unsigned int glInternalFormat, glFormat, glType; unsigned int glInternalFormat, glFormat, glType;
rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType);
if ((glInternalFormat != -1) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)) if ((glInternalFormat != 0) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB))
{ {
glTexSubImage2D(GL_TEXTURE_2D, 0, offsetX, offsetY, width, height, glFormat, glType, data); glTexSubImage2D(GL_TEXTURE_2D, 0, offsetX, offsetY, width, height, glFormat, glType, data);
} }
@@ -3206,9 +3286,27 @@ void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned
case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_4_4_4_4; break; case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_4_4_4_4; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_BYTE; break; case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_BYTE; break;
#if !defined(GRAPHICS_API_OPENGL_11) #if !defined(GRAPHICS_API_OPENGL_11)
#if defined(GRAPHICS_API_OPENGL_ES3)
case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_R32F_EXT; *glFormat = GL_RED_EXT; *glType = GL_FLOAT; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F_EXT; *glFormat = GL_RGB; *glType = GL_FLOAT; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F_EXT; *glFormat = GL_RGBA; *glType = GL_FLOAT; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_R16F_EXT; *glFormat = GL_RED_EXT; *glType = GL_HALF_FLOAT; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F_EXT; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F_EXT; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT; break;
#else
case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float
case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float
case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float
#if defined(GRAPHICS_API_OPENGL_21)
case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_ARB; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_ARB; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT_ARB; break;
#else // defined(GRAPHICS_API_OPENGL_ES2)
case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float
case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float
case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float
#endif
#endif
#endif #endif
#elif defined(GRAPHICS_API_OPENGL_33) #elif defined(GRAPHICS_API_OPENGL_33)
case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_R8; *glFormat = GL_RED; *glType = GL_UNSIGNED_BYTE; break; case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_R8; *glFormat = GL_RED; *glType = GL_UNSIGNED_BYTE; break;
@@ -3221,6 +3319,9 @@ void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned
case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_R32F; *glFormat = GL_RED; *glType = GL_FLOAT; break; case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_R32F; *glFormat = GL_RED; *glType = GL_FLOAT; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F; *glFormat = GL_RGB; *glType = GL_FLOAT; break; case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F; *glFormat = GL_RGB; *glType = GL_FLOAT; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F; *glFormat = GL_RGBA; *glType = GL_FLOAT; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_R16F; *glFormat = GL_RED; *glType = GL_HALF_FLOAT; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT; break;
#endif #endif
#if !defined(GRAPHICS_API_OPENGL_11) #if !defined(GRAPHICS_API_OPENGL_11)
case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break; case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break;
@@ -3303,7 +3404,7 @@ void *rlReadTexturePixels(unsigned int id, int width, int height, int format)
rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType);
unsigned int size = rlGetPixelDataSize(width, height, format); unsigned int size = rlGetPixelDataSize(width, height, format);
if ((glInternalFormat != -1) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)) if ((glInternalFormat != 0) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB))
{ {
pixels = RL_MALLOC(size); pixels = RL_MALLOC(size);
glGetTexImage(GL_TEXTURE_2D, 0, glFormat, glType, pixels); glGetTexImage(GL_TEXTURE_2D, 0, glFormat, glType, pixels);
@@ -3466,11 +3567,14 @@ bool rlFramebufferComplete(unsigned int id)
void rlUnloadFramebuffer(unsigned int id) void rlUnloadFramebuffer(unsigned int id)
{ {
#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT)
// Query depth attachment to automatically delete texture/renderbuffer // Query depth attachment to automatically delete texture/renderbuffer
int depthType = 0, depthId = 0; int depthType = 0, depthId = 0;
glBindFramebuffer(GL_FRAMEBUFFER, id); // Bind framebuffer to query depth texture type glBindFramebuffer(GL_FRAMEBUFFER, id); // Bind framebuffer to query depth texture type
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &depthType); glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &depthType);
// TODO: Review warning retrieving object name in WebGL
// WARNING: WebGL: INVALID_ENUM: getFramebufferAttachmentParameter: invalid parameter name
// https://registry.khronos.org/webgl/specs/latest/1.0/
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &depthId); glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &depthId);
unsigned int depthIdU = (unsigned int)depthId; unsigned int depthIdU = (unsigned int)depthId;
@@ -3616,7 +3720,11 @@ void rlDrawVertexArray(int offset, int count)
// Draw vertex array elements // Draw vertex array elements
void rlDrawVertexArrayElements(int offset, int count, const void *buffer) void rlDrawVertexArrayElements(int offset, int count, const void *buffer)
{ {
glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (const unsigned short *)buffer + offset); // NOTE: Added pointer math separately from function to avoid UBSAN complaining
unsigned short *bufferPtr = (unsigned short *)buffer;
if (offset > 0) bufferPtr += offset;
glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (const unsigned short *)bufferPtr);
} }
// Draw vertex array instanced // Draw vertex array instanced
@@ -3631,7 +3739,11 @@ void rlDrawVertexArrayInstanced(int offset, int count, int instances)
void rlDrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances) void rlDrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
glDrawElementsInstanced(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (const unsigned short *)buffer + offset, instances); // NOTE: Added pointer math separately from function to avoid UBSAN complaining
unsigned short *bufferPtr = (unsigned short *)buffer;
if (offset > 0) bufferPtr += offset;
glDrawElementsInstanced(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (const unsigned short *)bufferPtr, instances);
#endif #endif
} }
@@ -3923,8 +4035,8 @@ int rlGetLocationUniform(unsigned int shaderId, const char *uniformName)
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
location = glGetUniformLocation(shaderId, uniformName); location = glGetUniformLocation(shaderId, uniformName);
if (location == -1) TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to find shader uniform: %s", shaderId, uniformName); //if (location == -1) TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to find shader uniform: %s", shaderId, uniformName);
else TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Shader uniform (%s) set at location: %i", shaderId, uniformName, location); //else TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Shader uniform (%s) set at location: %i", shaderId, uniformName, location);
#endif #endif
return location; return location;
} }
@@ -3936,8 +4048,8 @@ int rlGetLocationAttrib(unsigned int shaderId, const char *attribName)
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
location = glGetAttribLocation(shaderId, attribName); location = glGetAttribLocation(shaderId, attribName);
if (location == -1) TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to find shader attribute: %s", shaderId, attribName); //if (location == -1) TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to find shader attribute: %s", shaderId, attribName);
else TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Shader attribute (%s) set at location: %i", shaderId, attribName, location); //else TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Shader attribute (%s) set at location: %i", shaderId, attribName, location);
#endif #endif
return location; return location;
} }
@@ -4091,7 +4203,7 @@ unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHi
glGenBuffers(1, &ssbo); glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo); glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
glBufferData(GL_SHADER_STORAGE_BUFFER, size, data, usageHint? usageHint : RL_STREAM_COPY); glBufferData(GL_SHADER_STORAGE_BUFFER, size, data, usageHint? usageHint : RL_STREAM_COPY);
glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, 0); if (data == NULL) glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, NULL); // Clear buffer data to 0
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
#endif #endif
@@ -4428,6 +4540,9 @@ const char *rlGetPixelFormatName(unsigned int format)
case RL_PIXELFORMAT_UNCOMPRESSED_R32: return "R32"; break; // 32 bpp (1 channel - float) case RL_PIXELFORMAT_UNCOMPRESSED_R32: return "R32"; break; // 32 bpp (1 channel - float)
case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: return "R32G32B32"; break; // 32*3 bpp (3 channels - float) case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: return "R32G32B32"; break; // 32*3 bpp (3 channels - float)
case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: return "R32G32B32A32"; break; // 32*4 bpp (4 channels - float) case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: return "R32G32B32A32"; break; // 32*4 bpp (4 channels - float)
case RL_PIXELFORMAT_UNCOMPRESSED_R16: return "R16"; break; // 16 bpp (1 channel - half float)
case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: return "R16G16B16"; break; // 16*3 bpp (3 channels - half float)
case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: return "R16G16B16A16"; break; // 16*4 bpp (4 channels - half float)
case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: return "DXT1_RGB"; break; // 4 bpp (no alpha) case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: return "DXT1_RGB"; break; // 4 bpp (no alpha)
case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: return "DXT1_RGBA"; break; // 4 bpp (1 bit alpha) case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: return "DXT1_RGBA"; break; // 4 bpp (1 bit alpha)
case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: return "DXT3_RGBA"; break; // 8 bpp case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: return "DXT3_RGBA"; break; // 8 bpp
@@ -4476,6 +4591,7 @@ static void rlLoadShaderDefault(void)
#endif #endif
#if defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_ES2)
"#version 100 \n" "#version 100 \n"
"precision mediump float; \n" // Precision required for OpenGL ES2 (WebGL) (on some browsers)
"attribute vec3 vertexPosition; \n" "attribute vec3 vertexPosition; \n"
"attribute vec2 vertexTexCoord; \n" "attribute vec2 vertexTexCoord; \n"
"attribute vec4 vertexColor; \n" "attribute vec4 vertexColor; \n"
@@ -4574,7 +4690,7 @@ static void rlUnloadShaderDefault(void)
#if defined(RLGL_SHOW_GL_DETAILS_INFO) #if defined(RLGL_SHOW_GL_DETAILS_INFO)
// Get compressed format official GL identifier name // Get compressed format official GL identifier name
static char *rlGetCompressedFormatName(int format) static const char *rlGetCompressedFormatName(int format)
{ {
switch (format) switch (format)
{ {
@@ -4669,6 +4785,9 @@ static int rlGetPixelDataSize(int width, int height, int format)
case RL_PIXELFORMAT_UNCOMPRESSED_R32: bpp = 32; break; case RL_PIXELFORMAT_UNCOMPRESSED_R32: bpp = 32; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: bpp = 32*3; break; case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: bpp = 32*3; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: bpp = 32*4; break; case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: bpp = 32*4; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R16: bpp = 16; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: bpp = 16*3; break;
case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: bpp = 16*4; break;
case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB:
case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA:
case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB: case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB:

View File

@@ -5,8 +5,6 @@ int lshapesSetShapesTexture( lua_State *L );
int lshapesDrawPixel( lua_State *L ); int lshapesDrawPixel( lua_State *L );
int lshapesDrawLine( lua_State *L ); int lshapesDrawLine( lua_State *L );
int lshapesDrawLineBezier( lua_State *L ); int lshapesDrawLineBezier( lua_State *L );
int lshapesDrawLineBezierQuad( lua_State *L );
int lshapesDrawLineBezierCubic( lua_State *L );
int lshapesDrawLineStrip( lua_State *L ); int lshapesDrawLineStrip( lua_State *L );
int lshapesDrawCircle( lua_State *L ); int lshapesDrawCircle( lua_State *L );
int lshapesDrawCircleSector( lua_State *L ); int lshapesDrawCircleSector( lua_State *L );

View File

@@ -17,6 +17,7 @@ int ltextDrawTextCodepoints( lua_State *L );
int ltextDrawTextBoxed( lua_State *L ); int ltextDrawTextBoxed( lua_State *L );
int ltextDrawTextBoxedTinted( lua_State *L ); int ltextDrawTextBoxedTinted( lua_State *L );
/* Text font info functions. */ /* Text font info functions. */
int ltextSetTextLineSpacing( lua_State *L );
int ltextMeasureText( lua_State *L ); int ltextMeasureText( lua_State *L );
int ltextGetGlyphIndex( lua_State *L ); int ltextGetGlyphIndex( lua_State *L );
int ltextGetGlyphInfo( lua_State *L ); int ltextGetGlyphInfo( lua_State *L );

View File

@@ -3,6 +3,7 @@
/* Image loading functions. */ /* Image loading functions. */
int ltexturesLoadImage( lua_State *L ); int ltexturesLoadImage( lua_State *L );
int ltexturesLoadImageRaw( lua_State *L ); int ltexturesLoadImageRaw( lua_State *L );
int ltexturesLoadImageSvg( lua_State *L );
int ltexturesLoadImageAnim( lua_State *L ); int ltexturesLoadImageAnim( lua_State *L );
int ltexturesLoadImageFromMemory( lua_State *L ); int ltexturesLoadImageFromMemory( lua_State *L );
int ltexturesLoadImageFromTexture( lua_State *L ); int ltexturesLoadImageFromTexture( lua_State *L );
@@ -10,12 +11,13 @@ int ltexturesLoadImageFromScreen( lua_State *L );
int ltextureIsImageReady( lua_State *L ); int ltextureIsImageReady( lua_State *L );
int ltextureUnloadImage( lua_State *L ); int ltextureUnloadImage( lua_State *L );
int ltexturesExportImage( lua_State *L ); int ltexturesExportImage( lua_State *L );
int ltexturesExportImageToMemory( lua_State *L );
int ltexturesExportImageAsCode( lua_State *L ); int ltexturesExportImageAsCode( lua_State *L );
/* Image generation functions. */ /* Image generation functions. */
int ltexturesGenImageColor( lua_State *L ); int ltexturesGenImageColor( lua_State *L );
int ltexturesGenImageGradientV( lua_State *L ); int ltexturesGenImageGradientLinear( lua_State *L );
int ltexturesGenImageGradientH( lua_State *L );
int ltexturesGenImageGradientRadial( lua_State *L ); int ltexturesGenImageGradientRadial( lua_State *L );
int ltexturesGenImageGradientSquare( lua_State *L );
int ltexturesGenImageChecked( lua_State *L ); int ltexturesGenImageChecked( lua_State *L );
int ltexturesGenImageWhiteNoise( lua_State *L ); int ltexturesGenImageWhiteNoise( lua_State *L );
int ltexturesGenImagePerlinNoise( lua_State *L ); int ltexturesGenImagePerlinNoise( lua_State *L );
@@ -40,6 +42,7 @@ int ltexturesImageMipmaps( lua_State *L );
int ltexturesImageDither( lua_State *L ); int ltexturesImageDither( lua_State *L );
int ltexturesImageFlipVertical( lua_State *L ); int ltexturesImageFlipVertical( lua_State *L );
int ltexturesImageFlipHorizontal( lua_State *L ); int ltexturesImageFlipHorizontal( lua_State *L );
int ltexturesImageRotate( lua_State *L );
int ltexturesImageRotateCW( lua_State *L ); int ltexturesImageRotateCW( lua_State *L );
int ltexturesImageRotateCCW( lua_State *L ); int ltexturesImageRotateCCW( lua_State *L );
int ltexturesImageColorTint( lua_State *L ); int ltexturesImageColorTint( lua_State *L );

View File

@@ -7,6 +7,41 @@
## Audio - Audio device management functions ## Audio - Audio device management functions
*/ */
/*
> RL.InitAudioDevice()
Initialize audio device and context
*/
int laudioInitAudioDevice( lua_State *L ) {
InitAudioDevice();
return 0;
}
/*
> RL.CloseAudioDevice()
Close the audio device and context
*/
int laudioCloseAudioDevice( lua_State *L ) {
CloseAudioDevice();
return 0;
}
/*
> isReady = RL.IsAudioDeviceReady()
Check if audio device has been initialized successfully
- Success return bool
*/
int laudioIsAudioDeviceReady( lua_State *L ) {
lua_pushboolean( L, IsAudioDeviceReady() );
return 1;
}
/* /*
> RL.SetMasterVolume( float volume ) > RL.SetMasterVolume( float volume )
@@ -20,6 +55,19 @@ int laudioSetMasterVolume( lua_State *L ) {
return 0; return 0;
} }
/*
> isReady = RL.GetMasterVolume()
Get master volume (listener)
- Success return float
*/
int laudioGetMasterVolume( lua_State *L ) {
lua_pushnumber( L, GetMasterVolume() );
return 1;
}
/* /*
## Audio - Wave/Sound loading/unloading functions ## Audio - Wave/Sound loading/unloading functions
*/ */
@@ -94,6 +142,21 @@ int laudioLoadSoundFromWave( lua_State *L ) {
return 1; return 1;
} }
/*
> sound = RL.LoadSoundAlias( Sound source )
Create a new sound that shares the same sample data as the source sound, does not own the sound data
- Success return Sound
*/
int laudioLoadSoundAlias( lua_State *L ) {
Sound *source = uluaGetSound( L, 1 );
uluaPushSound( L, LoadSoundAlias( *source ) );
return 1;
}
/* /*
> isReady = RL.IsSoundReady( Sound sound ) > isReady = RL.IsSoundReady( Sound sound )
@@ -135,6 +198,19 @@ int laudioUnloadSound( lua_State *L ) {
return 0; return 0;
} }
/*
> RL.UnloadSoundAlias( Sound alias )
Unload a sound alias (does not deallocate sample data)
*/
int laudioUnloadSoundAlias( lua_State *L ) {
Sound *alias = uluaGetSound( L, 1 );
UnloadSoundAlias( *alias );
return 0;
}
/* /*
> success = RL.ExportWave( Wave wave, string fileName ) > success = RL.ExportWave( Wave wave, string fileName )

View File

@@ -28,6 +28,17 @@ void unloadBuffer( Buffer *buffer ) {
## Core - Window-related functions ## Core - Window-related functions
*/ */
/*
> RL.CloseWindow()
Close window and unload OpenGL context and free all resources
*/
int lcoreCloseWindow( lua_State *L ) {
state->run = false;
return 0;
}
/* /*
> state = RL.IsWindowReady() > state = RL.IsWindowReady()
@@ -107,154 +118,18 @@ int lcoreIsWindowFocused( lua_State *L ) {
} }
/* /*
> RL.SetWindowMonitor( int monitor ) > resized = RL.IsWindowResized()
Set monitor for the current window (fullscreen mode) Check if window has been resized from last frame
- Success return bool
*/ */
int lcoreSetWindowMonitor( lua_State *L ) { int lcoreIsWindowResized( lua_State *L ) {
int monitor = luaL_checkinteger( L, 1 ); lua_pushboolean( L, IsWindowResized() );
SetWindowMonitor( monitor );
return 0;
}
/*
> RL.SetWindowPosition( Vector2 pos )
Set window position on screen
*/
int lcoreSetWindowPosition( lua_State *L ) {
Vector2 pos = uluaGetVector2( L, 1 );
SetWindowPosition( pos.x, pos.y );
return 0;
}
/*
> RL.SetWindowSize( Vector2 size )
Set window dimensions
*/
int lcoreSetWindowSize( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 );
SetWindowSize( (int)size.x, (int)size.y );
return 0;
}
/*
> RL.SetWindowOpacity( float opacity )
Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
*/
int lcoreSetWindowOpacity( lua_State *L ) {
float opacity = luaL_checknumber( L, 1 );
SetWindowOpacity( opacity );
return 0;
}
/*
> windowHandle = RL.GetWindowHandle()
Get native window handle. Return as lightuserdata
- Success return lightuserdata
*/
int lcoreGetWindowHandle( lua_State *L ) {
lua_pushlightuserdata( L, GetWindowHandle() );
return 1; return 1;
} }
/*
> RL.SetWindowMinSize( Vector2 size )
Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
*/
int lcoreSetWindowMinSize( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 );
SetWindowMinSize( (int)size.x, (int)size.y );
return 0;
}
/*
> position = RL.GetMonitorPosition( int monitor )
Get specified monitor position
- Success return Vector2
*/
int lcoreGetMonitorPosition( lua_State *L ) {
int monitor = luaL_checkinteger( L, 1 );
uluaPushVector2( L, GetMonitorPosition( monitor ) );
return 1;
}
/*
> size = RL.GetMonitorSize( int monitor )
Get specified monitor size
- Success return Vector2
*/
int lcoreGetMonitorSize( lua_State *L ) {
int monitor = luaL_checkinteger( L, 1 );
Vector2 size = (Vector2){ GetMonitorWidth( monitor ), GetMonitorHeight( monitor ) };
uluaPushVector2( L, size );
return 1;
}
/*
> position = RL.GetWindowPosition()
Get window position on monitor
- Success return Vector2
*/
int lcoreGetWindowPosition( lua_State *L ) {
uluaPushVector2( L, GetWindowPosition() );
return 1;
}
/*
> size = RL.GetScreenSize()
Get screen size
- Success return Vector2
*/
int lcoreGetScreenSize( lua_State *L ) {
Vector2 size = (Vector2){ GetScreenWidth(), GetScreenHeight() };
uluaPushVector2( L, size );
return 1;
}
/*
> RL.SetWindowState( int flag )
Set window configuration state using flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
*/
int lcoreSetWindowState( lua_State *L ) {
unsigned int flag = (unsigned int)luaL_checkinteger( L, 1 );
SetWindowState( flag );
return 0;
}
/* /*
> state = RL.IsWindowState( int flag ) > state = RL.IsWindowState( int flag )
@@ -270,6 +145,19 @@ int lcoreIsWindowState( lua_State *L ) {
return 1; return 1;
} }
/*
> RL.SetWindowState( int flag )
Set window configuration state using flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
*/
int lcoreSetWindowState( lua_State *L ) {
unsigned int flag = (unsigned int)luaL_checkinteger( L, 1 );
SetWindowState( flag );
return 0;
}
/* /*
> resized = RL.ClearWindowState( int flag ) > resized = RL.ClearWindowState( int flag )
@@ -286,16 +174,58 @@ int lcoreClearWindowState( lua_State *L ) {
} }
/* /*
> resized = RL.IsWindowResized() > RL.ToggleFullscreen()
Check if window has been resized from last frame Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
- Success return bool
*/ */
int lcoreIsWindowResized( lua_State *L ) { int lcoreToggleFullscreen( lua_State *L ) {
lua_pushboolean( L, IsWindowResized() ); ToggleFullscreen();
return 1; return 0;
}
/*
> RL.ToggleBorderlessWindowed()
Toggle window state: borderless windowed (only PLATFORM_DESKTOP)
*/
int lcoreToggleBorderlessWindowed( lua_State *L ) {
ToggleBorderlessWindowed();
return 0;
}
/*
> RL.MaximizeWindow()
Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
*/
int lcoreMaximizeWindow( lua_State *L ) {
MaximizeWindow();
return 0;
}
/*
> RL.MinimizeWindow()
Set window state: minimized, if resizable (only PLATFORM_DESKTOP)
*/
int lcoreMinimizeWindow( lua_State *L ) {
MinimizeWindow();
return 0;
}
/*
> RL.RestoreWindow()
Set window state: not minimized/maximized (only PLATFORM_DESKTOP)
*/
int lcoreRestoreWindow( lua_State *L ) {
RestoreWindow();
return 0;
} }
/* /*
@@ -338,7 +268,7 @@ int lcoreSetWindowIcons( lua_State *L ) {
/* /*
> RL.SetWindowTitle( string title ) > RL.SetWindowTitle( string title )
Set title for window (Only PLATFORM_DESKTOP) Set title for window (only PLATFORM_DESKTOP and PLATFORM_WEB)
*/ */
int lcoreSetWindowTitle( lua_State *L ) { int lcoreSetWindowTitle( lua_State *L ) {
SetWindowTitle( luaL_checkstring( L, 1 ) ); SetWindowTitle( luaL_checkstring( L, 1 ) );
@@ -346,6 +276,136 @@ int lcoreSetWindowTitle( lua_State *L ) {
return 0; return 0;
} }
/*
> RL.SetWindowPosition( Vector2 pos )
Set window position on screen
*/
int lcoreSetWindowPosition( lua_State *L ) {
Vector2 pos = uluaGetVector2( L, 1 );
SetWindowPosition( pos.x, pos.y );
return 0;
}
/*
> RL.SetWindowMonitor( int monitor )
Set monitor for the current window
*/
int lcoreSetWindowMonitor( lua_State *L ) {
int monitor = luaL_checkinteger( L, 1 );
SetWindowMonitor( monitor );
return 0;
}
/*
> RL.SetWindowMinSize( Vector2 size )
Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
*/
int lcoreSetWindowMinSize( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 );
SetWindowMinSize( (int)size.x, (int)size.y );
return 0;
}
/*
> RL.SetWindowMaxSize( Vector2 size )
Set window maximum dimensions (for FLAG_WINDOW_RESIZABLE)
*/
int lcoreSetWindowMaxSize( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 );
SetWindowMaxSize( (int)size.x, (int)size.y );
return 0;
}
/*
> RL.SetWindowSize( Vector2 size )
Set window dimensions
*/
int lcoreSetWindowSize( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 );
SetWindowSize( (int)size.x, (int)size.y );
return 0;
}
/*
> RL.SetWindowOpacity( float opacity )
Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
*/
int lcoreSetWindowOpacity( lua_State *L ) {
float opacity = luaL_checknumber( L, 1 );
SetWindowOpacity( opacity );
return 0;
}
/*
> RL.SetWindowFocused()
Set window focused (only PLATFORM_DESKTOP)
*/
int lcoreSetWindowFocused( lua_State *L ) {
SetWindowFocused();
return 0;
}
/*
> windowHandle = RL.GetWindowHandle()
Get native window handle. Return as lightuserdata
- Success return lightuserdata
*/
int lcoreGetWindowHandle( lua_State *L ) {
lua_pushlightuserdata( L, GetWindowHandle() );
return 1;
}
/*
> size = RL.GetScreenSize()
Get screen size
- Success return Vector2
*/
int lcoreGetScreenSize( lua_State *L ) {
Vector2 size = (Vector2){ GetScreenWidth(), GetScreenHeight() };
uluaPushVector2( L, size );
return 1;
}
/*
> size = RL.GetRenderSize()
Get render size
- Success return Vector2
*/
int lcoreGetRenderSize( lua_State *L ) {
Vector2 size = (Vector2){ GetRenderWidth(), GetRenderHeight() };
uluaPushVector2( L, size );
return 1;
}
/* /*
> count = RL.GetMonitorCount() > count = RL.GetMonitorCount()
@@ -372,6 +432,37 @@ int lcoreGetCurrentMonitor( lua_State *L ) {
return 1; return 1;
} }
/*
> position = RL.GetMonitorPosition( int monitor )
Get specified monitor position
- Success return Vector2
*/
int lcoreGetMonitorPosition( lua_State *L ) {
int monitor = luaL_checkinteger( L, 1 );
uluaPushVector2( L, GetMonitorPosition( monitor ) );
return 1;
}
/*
> size = RL.GetMonitorSize( int monitor )
Get specified monitor size
- Success return Vector2
*/
int lcoreGetMonitorSize( lua_State *L ) {
int monitor = luaL_checkinteger( L, 1 );
Vector2 size = (Vector2){ GetMonitorWidth( monitor ), GetMonitorHeight( monitor ) };
uluaPushVector2( L, size );
return 1;
}
/* /*
> size = RL.GetMonitorPhysicalSize( int monitor ) > size = RL.GetMonitorPhysicalSize( int monitor )
@@ -403,6 +494,19 @@ int lcoreGetMonitorRefreshRate( lua_State *L ) {
return 1; return 1;
} }
/*
> position = RL.GetWindowPosition()
Get window position on monitor
- Success return Vector2
*/
int lcoreGetWindowPosition( lua_State *L ) {
uluaPushVector2( L, GetWindowPosition() );
return 1;
}
/* /*
> dpi = RL.GetWindowScaleDPI() > dpi = RL.GetWindowScaleDPI()
@@ -419,7 +523,7 @@ int lcoreGetWindowScaleDPI( lua_State *L ) {
/* /*
> name = RL.GetMonitorName( int monitor ) > name = RL.GetMonitorName( int monitor )
Get the human-readable, UTF-8 encoded name of the monitor Get the human-readable, UTF-8 encoded name of the specified monitor
- Success return string - Success return string
*/ */
@@ -431,17 +535,6 @@ int lcoreGetMonitorName( lua_State *L ) {
return 1; return 1;
} }
/*
> RL.CloseWindow()
Close window and unload OpenGL context and free all resources
*/
int lcoreCloseWindow( lua_State *L ) {
state->run = false;
return 0;
}
/* /*
> RL.SetClipboardText( string text ) > RL.SetClipboardText( string text )
@@ -1151,6 +1244,63 @@ int lcoreGetTime( lua_State *L ) {
return 1; return 1;
} }
/*
## Core - Random values generation functions
*/
/*
> RL.SetRandomSeed( int seed )
Set the seed for the random number generator
*/
int lcoreSetRandomSeed( lua_State *L ) {
unsigned int seed = (unsigned int)luaL_checkinteger( L, 1 );
SetRandomSeed( seed );
return 0;
}
/*
> time = RL.GetRandomValue( int min, int max )
Get a random value between min and max (both included)
- Success return int
*/
int lcoreGetRandomValue( lua_State *L ) {
int min = luaL_checkinteger( L, 1 );
int max = luaL_checkinteger( L, 2 );
lua_pushinteger( L, GetRandomValue( min, max ) );
return 1;
}
/*
> sequence = RL.GetRandomValue( int count, int min, int max )
Load random values sequence, no values repeated
- Success return int{}
*/
int lcoreLoadRandomSequence( lua_State *L ) {
unsigned int count = luaL_checkinteger( L, 1 );
int min = luaL_checkinteger( L, 1 );
int max = luaL_checkinteger( L, 2 );
int *sequence = LoadRandomSequence( count, min, max );
lua_createtable( L, count, 0 );
for ( int i = 0; i < count; i++ ) {
lua_pushinteger( L, sequence[i] );
lua_rawseti( L, -2, i + 1 );
}
UnloadRandomSequence( sequence );
return 1;
}
/* /*
## Core - Misc ## Core - Misc
*/ */
@@ -1232,7 +1382,7 @@ int lcoreGetLogLevelInvalid( lua_State *L ) {
/* /*
> RL.OpenURL( string url ) > RL.OpenURL( string url )
Open URL with default system browser (If available) Open URL with default system browser (if available)
*/ */
int lcoreOpenURL( lua_State *L ) { int lcoreOpenURL( lua_State *L ) {
OpenURL( luaL_checkstring( L, 1 ) ); OpenURL( luaL_checkstring( L, 1 ) );
@@ -1411,6 +1561,19 @@ int lcoreGetWorkingDirectory( lua_State *L ) {
return 1; return 1;
} }
/*
> directory = RL.GetApplicationDirectory()
Get the directory of the running application (uses static string)
- Success return string
*/
int lcoreGetApplicationDirectory( lua_State *L ) {
lua_pushstring( L, GetApplicationDirectory() );
return 1;
}
/* /*
> fileNames = RL.LoadDirectoryFiles( string dirPath ) > fileNames = RL.LoadDirectoryFiles( string dirPath )
@@ -1793,6 +1956,21 @@ int lcoreIsGamepadAvailable( lua_State *L ) {
return 1; return 1;
} }
/*
> name = RL.GetGamepadName( int gamepad )
Return gamepad internal name id
- Success return string
*/
int lcoreGetGamepadName( lua_State *L ) {
int gamepad = luaL_checkinteger( L, 1 );
lua_pushstring( L, GetGamepadName( gamepad ) );
return 1;
}
/* /*
> pressed = RL.IsGamepadButtonPressed( int gamepad, int button ) > pressed = RL.IsGamepadButtonPressed( int gamepad, int button )
@@ -1873,16 +2051,16 @@ int lcoreGetGamepadAxisMovement( lua_State *L ) {
} }
/* /*
> name = RL.GetGamepadName( int gamepad ) > result = RL.SetGamepadMappings( string mappings )
Return gamepad internal name id Set internal gamepad mappings (SDL_GameControllerDB)
- Success return string - Success return int
*/ */
int lcoreGetGamepadName( lua_State *L ) { int lcoreSetGamepadMappings( lua_State *L ) {
int gamepad = luaL_checkinteger( L, 1 ); const char *mappings = luaL_checkstring( L, 1 );
lua_pushstring( L, GetGamepadName( gamepad ) ); lua_pushnumber( L, SetGamepadMappings( mappings ) );
return 1; return 1;
} }

View File

@@ -1522,36 +1522,44 @@ void luaRegister() {
/* Core. */ /* Core. */
/* Window-related functions. */ /* Window-related functions. */
assingGlobalFunction( "CloseWindow", lcoreCloseWindow );
assingGlobalFunction( "IsWindowReady", lcoreIsWindowReady ); assingGlobalFunction( "IsWindowReady", lcoreIsWindowReady );
assingGlobalFunction( "IsWindowFullscreen", lcoreIsWindowFullscreen ); assingGlobalFunction( "IsWindowFullscreen", lcoreIsWindowFullscreen );
assingGlobalFunction( "IsWindowHidden", lcoreIsWindowHidden ); assingGlobalFunction( "IsWindowHidden", lcoreIsWindowHidden );
assingGlobalFunction( "IsWindowMinimized", lcoreIsWindowMinimized ); assingGlobalFunction( "IsWindowMinimized", lcoreIsWindowMinimized );
assingGlobalFunction( "IsWindowMaximized", lcoreIsWindowMaximized ); assingGlobalFunction( "IsWindowMaximized", lcoreIsWindowMaximized );
assingGlobalFunction( "IsWindowFocused", lcoreIsWindowFocused ); assingGlobalFunction( "IsWindowFocused", lcoreIsWindowFocused );
assingGlobalFunction( "SetWindowMonitor", lcoreSetWindowMonitor );
assingGlobalFunction( "SetWindowPosition", lcoreSetWindowPosition );
assingGlobalFunction( "SetWindowSize", lcoreSetWindowSize );
assingGlobalFunction( "SetWindowOpacity", lcoreSetWindowOpacity );
assingGlobalFunction( "GetWindowHandle", lcoreGetWindowHandle );
assingGlobalFunction( "SetWindowMinSize", lcoreSetWindowMinSize );
assingGlobalFunction( "GetMonitorPosition", lcoreGetMonitorPosition );
assingGlobalFunction( "GetMonitorSize", lcoreGetMonitorSize );
assingGlobalFunction( "GetWindowPosition", lcoreGetWindowPosition );
assingGlobalFunction( "GetScreenSize", lcoreGetScreenSize );
assingGlobalFunction( "SetWindowState", lcoreSetWindowState );
assingGlobalFunction( "IsWindowState", lcoreIsWindowState );
assingGlobalFunction( "ClearWindowState", lcoreClearWindowState );
assingGlobalFunction( "IsWindowResized", lcoreIsWindowResized ); assingGlobalFunction( "IsWindowResized", lcoreIsWindowResized );
assingGlobalFunction( "IsWindowState", lcoreIsWindowState );
assingGlobalFunction( "SetWindowState", lcoreSetWindowState );
assingGlobalFunction( "ClearWindowState", lcoreClearWindowState );
assingGlobalFunction( "ToggleFullscreen", lcoreToggleFullscreen );
assingGlobalFunction( "ToggleBorderlessWindowed", lcoreToggleBorderlessWindowed );
assingGlobalFunction( "MaximizeWindow", lcoreMaximizeWindow );
assingGlobalFunction( "MinimizeWindow", lcoreMinimizeWindow );
assingGlobalFunction( "RestoreWindow", lcoreRestoreWindow );
assingGlobalFunction( "SetWindowIcon", lcoreSetWindowIcon ); assingGlobalFunction( "SetWindowIcon", lcoreSetWindowIcon );
assingGlobalFunction( "SetWindowIcons", lcoreSetWindowIcons ); assingGlobalFunction( "SetWindowIcons", lcoreSetWindowIcons );
assingGlobalFunction( "SetWindowTitle", lcoreSetWindowTitle ); assingGlobalFunction( "SetWindowTitle", lcoreSetWindowTitle );
assingGlobalFunction( "SetWindowPosition", lcoreSetWindowPosition );
assingGlobalFunction( "SetWindowMonitor", lcoreSetWindowMonitor );
assingGlobalFunction( "SetWindowMinSize", lcoreSetWindowMinSize );
assingGlobalFunction( "SetWindowMaxSize", lcoreSetWindowMaxSize );
assingGlobalFunction( "SetWindowSize", lcoreSetWindowSize );
assingGlobalFunction( "SetWindowOpacity", lcoreSetWindowOpacity );
assingGlobalFunction( "SetWindowFocused", lcoreSetWindowFocused );
assingGlobalFunction( "GetWindowHandle", lcoreGetWindowHandle );
assingGlobalFunction( "GetScreenSize", lcoreGetScreenSize );
assingGlobalFunction( "GetRenderSize", lcoreGetRenderSize );
assingGlobalFunction( "GetMonitorCount", lcoreGetMonitorCount ); assingGlobalFunction( "GetMonitorCount", lcoreGetMonitorCount );
assingGlobalFunction( "GetCurrentMonitor", lcoreGetCurrentMonitor ); assingGlobalFunction( "GetCurrentMonitor", lcoreGetCurrentMonitor );
assingGlobalFunction( "GetMonitorPosition", lcoreGetMonitorPosition );
assingGlobalFunction( "GetMonitorSize", lcoreGetMonitorSize );
assingGlobalFunction( "GetMonitorPhysicalSize", lcoreGetMonitorPhysicalSize ); assingGlobalFunction( "GetMonitorPhysicalSize", lcoreGetMonitorPhysicalSize );
assingGlobalFunction( "GetMonitorRefreshRate", lcoreGetMonitorRefreshRate ); assingGlobalFunction( "GetMonitorRefreshRate", lcoreGetMonitorRefreshRate );
assingGlobalFunction( "GetWindowPosition", lcoreGetWindowPosition );
assingGlobalFunction( "GetWindowScaleDPI", lcoreGetWindowScaleDPI ); assingGlobalFunction( "GetWindowScaleDPI", lcoreGetWindowScaleDPI );
assingGlobalFunction( "GetMonitorName", lcoreGetMonitorName ); assingGlobalFunction( "GetMonitorName", lcoreGetMonitorName );
assingGlobalFunction( "CloseWindow", lcoreCloseWindow );
assingGlobalFunction( "SetClipboardText", lcoreSetClipboardText ); assingGlobalFunction( "SetClipboardText", lcoreSetClipboardText );
assingGlobalFunction( "GetClipboardText", lcoreGetClipboardText ); assingGlobalFunction( "GetClipboardText", lcoreGetClipboardText );
/* Cursor-related functions. */ /* Cursor-related functions. */
@@ -1603,6 +1611,10 @@ void luaRegister() {
assingGlobalFunction( "GetFPS", lcoreGetFPS ); assingGlobalFunction( "GetFPS", lcoreGetFPS );
assingGlobalFunction( "GetFrameTime", lcoreGetFrameTime ); assingGlobalFunction( "GetFrameTime", lcoreGetFrameTime );
assingGlobalFunction( "GetTime", lcoreGetTime ); assingGlobalFunction( "GetTime", lcoreGetTime );
/* Random values generation functions. */
assingGlobalFunction( "SetRandomSeed", lcoreSetRandomSeed );
assingGlobalFunction( "GetRandomValue", lcoreGetRandomValue );
assingGlobalFunction( "LoadRandomSequence", lcoreLoadRandomSequence );
/* Misc. functions. */ /* Misc. functions. */
assingGlobalFunction( "TakeScreenshot", lcoreTakeScreenshot ); assingGlobalFunction( "TakeScreenshot", lcoreTakeScreenshot );
assingGlobalFunction( "SetConfigFlags", lcoreSetConfigFlags ); assingGlobalFunction( "SetConfigFlags", lcoreSetConfigFlags );
@@ -1625,6 +1637,7 @@ void luaRegister() {
assingGlobalFunction( "GetDirectoryPath", lcoreGetDirectoryPath ); assingGlobalFunction( "GetDirectoryPath", lcoreGetDirectoryPath );
assingGlobalFunction( "GetPrevDirectoryPath", lcoreGetPrevDirectoryPath ); assingGlobalFunction( "GetPrevDirectoryPath", lcoreGetPrevDirectoryPath );
assingGlobalFunction( "GetWorkingDirectory", lcoreGetWorkingDirectory ); assingGlobalFunction( "GetWorkingDirectory", lcoreGetWorkingDirectory );
assingGlobalFunction( "GetApplicationDirectory", lcoreGetApplicationDirectory );
assingGlobalFunction( "LoadDirectoryFiles", lcoreLoadDirectoryFiles ); assingGlobalFunction( "LoadDirectoryFiles", lcoreLoadDirectoryFiles );
assingGlobalFunction( "LoadDirectoryFilesEx", lcoreLoadDirectoryFilesEx ); assingGlobalFunction( "LoadDirectoryFilesEx", lcoreLoadDirectoryFilesEx );
assingGlobalFunction( "ChangeDirectory", lcoreChangeDirectory ); assingGlobalFunction( "ChangeDirectory", lcoreChangeDirectory );
@@ -1649,12 +1662,13 @@ void luaRegister() {
assingGlobalFunction( "GetKeyScancode", lcoreGetKeyScancode ); assingGlobalFunction( "GetKeyScancode", lcoreGetKeyScancode );
/* Input-related functions: gamepads. */ /* Input-related functions: gamepads. */
assingGlobalFunction( "IsGamepadAvailable", lcoreIsGamepadAvailable ); assingGlobalFunction( "IsGamepadAvailable", lcoreIsGamepadAvailable );
assingGlobalFunction( "GetGamepadName", lcoreGetGamepadName );
assingGlobalFunction( "IsGamepadButtonPressed", lcoreIsGamepadButtonPressed ); assingGlobalFunction( "IsGamepadButtonPressed", lcoreIsGamepadButtonPressed );
assingGlobalFunction( "IsGamepadButtonDown", lcoreIsGamepadButtonDown ); assingGlobalFunction( "IsGamepadButtonDown", lcoreIsGamepadButtonDown );
assingGlobalFunction( "IsGamepadButtonReleased", lcoreIsGamepadButtonReleased ); assingGlobalFunction( "IsGamepadButtonReleased", lcoreIsGamepadButtonReleased );
assingGlobalFunction( "GetGamepadAxisCount", lcoreGetGamepadAxisCount ); assingGlobalFunction( "GetGamepadAxisCount", lcoreGetGamepadAxisCount );
assingGlobalFunction( "GetGamepadAxisMovement", lcoreGetGamepadAxisMovement ); assingGlobalFunction( "GetGamepadAxisMovement", lcoreGetGamepadAxisMovement );
assingGlobalFunction( "GetGamepadName", lcoreGetGamepadName ); assingGlobalFunction( "SetGamepadMappings", lcoreSetGamepadMappings );
/* Input-related functions: mouse. */ /* Input-related functions: mouse. */
assingGlobalFunction( "IsMouseButtonPressed", lcoreIsMouseButtonPressed ); assingGlobalFunction( "IsMouseButtonPressed", lcoreIsMouseButtonPressed );
assingGlobalFunction( "IsMouseButtonDown", lcoreIsMouseButtonDown ); assingGlobalFunction( "IsMouseButtonDown", lcoreIsMouseButtonDown );
@@ -1731,8 +1745,6 @@ void luaRegister() {
assingGlobalFunction( "DrawPixel", lshapesDrawPixel ); assingGlobalFunction( "DrawPixel", lshapesDrawPixel );
assingGlobalFunction( "DrawLine", lshapesDrawLine ); assingGlobalFunction( "DrawLine", lshapesDrawLine );
assingGlobalFunction( "DrawLineBezier", lshapesDrawLineBezier ); assingGlobalFunction( "DrawLineBezier", lshapesDrawLineBezier );
assingGlobalFunction( "DrawLineBezierQuad", lshapesDrawLineBezierQuad );
assingGlobalFunction( "DrawLineBezierCubic", lshapesDrawLineBezierCubic );
assingGlobalFunction( "DrawLineStrip", lshapesDrawLineStrip ); assingGlobalFunction( "DrawLineStrip", lshapesDrawLineStrip );
assingGlobalFunction( "DrawCircle", lshapesDrawCircle ); assingGlobalFunction( "DrawCircle", lshapesDrawCircle );
assingGlobalFunction( "DrawCircleSector", lshapesDrawCircleSector ); assingGlobalFunction( "DrawCircleSector", lshapesDrawCircleSector );
@@ -1775,6 +1787,7 @@ void luaRegister() {
/* Image loading functions. */ /* Image loading functions. */
assingGlobalFunction( "LoadImage", ltexturesLoadImage ); assingGlobalFunction( "LoadImage", ltexturesLoadImage );
assingGlobalFunction( "LoadImageRaw", ltexturesLoadImageRaw ); assingGlobalFunction( "LoadImageRaw", ltexturesLoadImageRaw );
assingGlobalFunction( "LoadImageSvg", ltexturesLoadImageSvg );
assingGlobalFunction( "LoadImageAnim", ltexturesLoadImageAnim ); assingGlobalFunction( "LoadImageAnim", ltexturesLoadImageAnim );
assingGlobalFunction( "LoadImageFromMemory", ltexturesLoadImageFromMemory ); assingGlobalFunction( "LoadImageFromMemory", ltexturesLoadImageFromMemory );
assingGlobalFunction( "LoadImageFromTexture", ltexturesLoadImageFromTexture ); assingGlobalFunction( "LoadImageFromTexture", ltexturesLoadImageFromTexture );
@@ -1782,12 +1795,13 @@ void luaRegister() {
assingGlobalFunction( "IsImageReady", ltextureIsImageReady ); assingGlobalFunction( "IsImageReady", ltextureIsImageReady );
assingGlobalFunction( "UnloadImage", ltextureUnloadImage ); assingGlobalFunction( "UnloadImage", ltextureUnloadImage );
assingGlobalFunction( "ExportImage", ltexturesExportImage ); assingGlobalFunction( "ExportImage", ltexturesExportImage );
assingGlobalFunction( "ExportImageToMemory", ltexturesExportImageToMemory );
assingGlobalFunction( "ExportImageAsCode", ltexturesExportImageAsCode ); assingGlobalFunction( "ExportImageAsCode", ltexturesExportImageAsCode );
/* Image generation functions. */ /* Image generation functions. */
assingGlobalFunction( "GenImageColor", ltexturesGenImageColor ); assingGlobalFunction( "GenImageColor", ltexturesGenImageColor );
assingGlobalFunction( "GenImageGradientV", ltexturesGenImageGradientV ); assingGlobalFunction( "GenImageGradientLinear", ltexturesGenImageGradientLinear );
assingGlobalFunction( "GenImageGradientH", ltexturesGenImageGradientH );
assingGlobalFunction( "GenImageGradientRadial", ltexturesGenImageGradientRadial ); assingGlobalFunction( "GenImageGradientRadial", ltexturesGenImageGradientRadial );
assingGlobalFunction( "GenImageGradientSquare", ltexturesGenImageGradientSquare );
assingGlobalFunction( "GenImageChecked", ltexturesGenImageChecked ); assingGlobalFunction( "GenImageChecked", ltexturesGenImageChecked );
assingGlobalFunction( "GenImageWhiteNoise", ltexturesGenImageWhiteNoise ); assingGlobalFunction( "GenImageWhiteNoise", ltexturesGenImageWhiteNoise );
assingGlobalFunction( "GenImagePerlinNoise", ltexturesGenImagePerlinNoise ); assingGlobalFunction( "GenImagePerlinNoise", ltexturesGenImagePerlinNoise );
@@ -1812,6 +1826,7 @@ void luaRegister() {
assingGlobalFunction( "ImageDither", ltexturesImageDither ); assingGlobalFunction( "ImageDither", ltexturesImageDither );
assingGlobalFunction( "ImageFlipVertical", ltexturesImageFlipVertical ); assingGlobalFunction( "ImageFlipVertical", ltexturesImageFlipVertical );
assingGlobalFunction( "ImageFlipHorizontal", ltexturesImageFlipHorizontal ); assingGlobalFunction( "ImageFlipHorizontal", ltexturesImageFlipHorizontal );
assingGlobalFunction( "ImageRotate", ltexturesImageRotate );
assingGlobalFunction( "ImageRotateCW", ltexturesImageRotateCW ); assingGlobalFunction( "ImageRotateCW", ltexturesImageRotateCW );
assingGlobalFunction( "ImageRotateCCW", ltexturesImageRotateCCW ); assingGlobalFunction( "ImageRotateCCW", ltexturesImageRotateCCW );
assingGlobalFunction( "ImageColorTint", ltexturesImageColorTint ); assingGlobalFunction( "ImageColorTint", ltexturesImageColorTint );
@@ -1995,6 +2010,7 @@ void luaRegister() {
assingGlobalFunction( "DrawTextBoxed", ltextDrawTextBoxed ); assingGlobalFunction( "DrawTextBoxed", ltextDrawTextBoxed );
assingGlobalFunction( "DrawTextBoxedTinted", ltextDrawTextBoxedTinted ); assingGlobalFunction( "DrawTextBoxedTinted", ltextDrawTextBoxedTinted );
/* Text font info functions. */ /* Text font info functions. */
assingGlobalFunction( "SetTextLineSpacing", ltextSetTextLineSpacing );
assingGlobalFunction( "MeasureText", ltextMeasureText ); assingGlobalFunction( "MeasureText", ltextMeasureText );
assingGlobalFunction( "GetGlyphIndex", ltextGetGlyphIndex ); assingGlobalFunction( "GetGlyphIndex", ltextGetGlyphIndex );
assingGlobalFunction( "GetGlyphInfo", ltextGetGlyphInfo ); assingGlobalFunction( "GetGlyphInfo", ltextGetGlyphInfo );
@@ -2006,15 +2022,21 @@ void luaRegister() {
/* Audio. */ /* Audio. */
/* Audio device management functions. */ /* Audio device management functions. */
assingGlobalFunction( "InitAudioDevice", laudioInitAudioDevice );
assingGlobalFunction( "CloseAudioDevice", laudioCloseAudioDevice );
assingGlobalFunction( "IsAudioDeviceReady", laudioIsAudioDeviceReady );
assingGlobalFunction( "SetMasterVolume", laudioSetMasterVolume ); assingGlobalFunction( "SetMasterVolume", laudioSetMasterVolume );
assingGlobalFunction( "GetMasterVolume", laudioGetMasterVolume );
/* Wave/Sound loading/unloading functions. */ /* Wave/Sound loading/unloading functions. */
assingGlobalFunction( "LoadSound", laudioLoadSound ); assingGlobalFunction( "LoadSound", laudioLoadSound );
assingGlobalFunction( "LoadWave", laudioLoadWave ); assingGlobalFunction( "LoadWave", laudioLoadWave );
assingGlobalFunction( "IsWaveReady", laudioIsWaveReady ); assingGlobalFunction( "IsWaveReady", laudioIsWaveReady );
assingGlobalFunction( "LoadSoundFromWave", laudioLoadSoundFromWave ); assingGlobalFunction( "LoadSoundFromWave", laudioLoadSoundFromWave );
assingGlobalFunction( "LoadSoundAlias", laudioLoadSoundAlias );
assingGlobalFunction( "IsSoundReady", laudioIsSoundReady ); assingGlobalFunction( "IsSoundReady", laudioIsSoundReady );
assingGlobalFunction( "UnloadWave", laudioUnloadWave ); assingGlobalFunction( "UnloadWave", laudioUnloadWave );
assingGlobalFunction( "UnloadSound", laudioUnloadSound ); assingGlobalFunction( "UnloadSound", laudioUnloadSound );
assingGlobalFunction( "UnloadSoundAlias", laudioUnloadSoundAlias );
assingGlobalFunction( "ExportWave", laudioExportWave ); assingGlobalFunction( "ExportWave", laudioExportWave );
assingGlobalFunction( "ExportWaveAsCode", laudioExportWaveAsCode ); assingGlobalFunction( "ExportWaveAsCode", laudioExportWaveAsCode );
/* Wave/Sound management functions. */ /* Wave/Sound management functions. */

View File

@@ -54,57 +54,6 @@ int lshapesDrawLine( lua_State *L ) {
return 0; return 0;
} }
/*
> RL.DrawLineBezier( Vector2 startPos, Vector2 endPos, float thickness, Color color )
Draw a line using cubic-bezier curves in-out
*/
int lshapesDrawLineBezier( lua_State *L ) {
Vector2 startPos = uluaGetVector2( L, 1 );
Vector2 endPos = uluaGetVector2( L, 2 );
float thickness = luaL_checknumber( L, 3 );
Color color = uluaGetColor( L, 4 );
DrawLineBezier( startPos, endPos, thickness, color );
return 0;
}
/*
> RL.DrawLineBezierQuad( Vector2 startPos, Vector2 endPos, Vector2 controlPos, float thickness, Color color )
Draw line using quadratic bezier curves with a control point
*/
int lshapesDrawLineBezierQuad( lua_State *L ) {
Vector2 startPos = uluaGetVector2( L, 1 );
Vector2 endPos = uluaGetVector2( L, 2 );
Vector2 controlPos = uluaGetVector2( L, 3 );
float thickness = luaL_checknumber( L, 4 );
Color color = uluaGetColor( L, 5 );
DrawLineBezierQuad( startPos, endPos, controlPos, thickness, color );
return 0;
}
/*
> RL.DrawLineBezierCubic( Vector2 startPos, Vector2 endPos, Vector2 startControlPos, Vector2 endControlPos, float thickness, Color color )
Draw line using quadratic bezier curves with a control point
*/
int lshapesDrawLineBezierCubic( lua_State *L ) {
Vector2 startPos = uluaGetVector2( L, 1 );
Vector2 endPos = uluaGetVector2( L, 2 );
Vector2 startControlPos = uluaGetVector2( L, 3 );
Vector2 endControlPos = uluaGetVector2( L, 4 );
float thickness = luaL_checknumber( L, 5 );
Color color = uluaGetColor( L, 6 );
DrawLineBezierCubic( startPos, endPos, startControlPos, endControlPos, thickness, color );
return 0;
}
/* /*
> RL.DrawLineStrip( Vector2{} points, Color color ) > RL.DrawLineStrip( Vector2{} points, Color color )
@@ -130,6 +79,22 @@ int lshapesDrawLineStrip( lua_State *L ) {
return 0; return 0;
} }
/*
> RL.DrawLineBezier( Vector2 startPos, Vector2 endPos, float thickness, Color color )
Draw a line using cubic-bezier curves in-out
*/
int lshapesDrawLineBezier( lua_State *L ) {
Vector2 startPos = uluaGetVector2( L, 1 );
Vector2 endPos = uluaGetVector2( L, 2 );
float thickness = luaL_checknumber( L, 3 );
Color color = uluaGetColor( L, 4 );
DrawLineBezier( startPos, endPos, thickness, color );
return 0;
}
/* /*
> RL.DrawCircle( Vector2 center, float radius, Color color ) > RL.DrawCircle( Vector2 center, float radius, Color color )

View File

@@ -26,7 +26,6 @@ bool stateInit( int argn, const char **argc, const char *exePath ) {
state->run = false; state->run = false;
} }
if ( state->run ) { if ( state->run ) {
InitAudioDevice();
state->run = luaInit( argn, argc ); state->run = luaInit( argn, argc );
} }
state->defaultFont = GetFontDefault(); state->defaultFont = GetFontDefault();

View File

@@ -193,9 +193,9 @@ int ltextLoadFont( lua_State *L ) {
} }
/* /*
> font = RL.LoadFontEx( string fileName, int fontSize, int{} fontChars ) > font = RL.LoadFontEx( string fileName, int fontSize, int{} codepoints )
Load font from file with extended parameters, use NULL for fontChars to load the default character set Load font from file with extended parameters, use NULL for codepoints to load the default character set
- Failure return nil - Failure return nil
- Success return Font - Success return Font
@@ -205,20 +205,20 @@ int ltextLoadFontEx( lua_State *L ) {
if ( FileExists( luaL_checkstring( L, 1 ) ) ) { if ( FileExists( luaL_checkstring( L, 1 ) ) ) {
if ( lua_istable( L, 3 ) ) { if ( lua_istable( L, 3 ) ) {
int glyphCount = uluaGetTableLen( L, 3 ); int codepointCount = uluaGetTableLen( L, 3 );
int fontChars[ glyphCount ]; int codepoints[ codepointCount ];
int t = 3; int t = 3;
int i = 0; int i = 0;
lua_pushnil( L ); lua_pushnil( L );
while ( lua_next( L, t ) != 0 ) { while ( lua_next( L, t ) != 0 ) {
fontChars[i] = lua_tointeger( L, -1 ); codepoints[i] = lua_tointeger( L, -1 );
i++; i++;
lua_pop( L, 1 ); lua_pop( L, 1 );
} }
uluaPushFont( L, LoadFontEx( lua_tostring( L, 1 ), fontSize, fontChars, glyphCount ) ); uluaPushFont( L, LoadFontEx( lua_tostring( L, 1 ), fontSize, codepoints, codepointCount ) );
return 1; return 1;
} }
@@ -374,8 +374,8 @@ int ltextDrawTextCodepoints( lua_State *L ) {
float spacing = luaL_checknumber( L, 5 ); float spacing = luaL_checknumber( L, 5 );
Color tint = uluaGetColor( L, 6 ); Color tint = uluaGetColor( L, 6 );
int count = uluaGetTableLen( L, 2 ); int codepointCount = uluaGetTableLen( L, 2 );
int codepoints[ count ]; int codepoints[ codepointCount ];
int t = 2; int t = 2;
int i = 0; int i = 0;
@@ -387,7 +387,7 @@ int ltextDrawTextCodepoints( lua_State *L ) {
i++; i++;
lua_pop( L, 1 ); lua_pop( L, 1 );
} }
DrawTextCodepoints( *font, codepoints, count, position, fontSize, spacing, tint ); DrawTextCodepoints( *font, codepoints, codepointCount, position, fontSize, spacing, tint );
return 0; return 0;
} }
@@ -460,6 +460,17 @@ int ltextDrawTextBoxedTinted( lua_State *L ) {
## Text - Text font info functions ## Text - Text font info functions
*/ */
/*
> size = RL.SetTextLineSpacing( int spacing )
Set vertical line spacing when drawing with line-breaks
*/
int ltextSetTextLineSpacing( lua_State *L ) {
int spacing = luaL_checkinteger( L, 1 );
SetTextLineSpacing( spacing );
}
/* /*
> size = RL.MeasureText( Font font, string text, float fontSize, float spacing ) > size = RL.MeasureText( Font font, string text, float fontSize, float spacing )

View File

@@ -53,6 +53,22 @@ int ltexturesLoadImageRaw( lua_State *L ) {
return 1; return 1;
} }
/*
> image = RL.LoadImageSvg( string fileNameOrString, Vector2 size )
Load image from SVG file data or string with specified size
- Success return Image
*/
int ltexturesLoadImageSvg( lua_State *L ) {
const char *fileNameOrString = luaL_checkstring( L, 1 );
Vector2 size = uluaGetVector2( L, 2 );
uluaPushImage( L, LoadImageSvg( fileNameOrString, (int)size.x, (int)size.y ) );
return 1;
}
/* /*
> image, frameCount = RL.LoadImageAnim( string fileName ) > image, frameCount = RL.LoadImageAnim( string fileName )
@@ -162,6 +178,27 @@ int ltexturesExportImage( lua_State *L ) {
return 1; return 1;
} }
/*
> buffer = RL.ExportImageToMemory( Image image, string fileType )
Export image to memory buffer
- Success return Buffer
*/
int ltexturesExportImageToMemory( lua_State *L ) {
Image *image = uluaGetImage( L, 1 );
const char *fileType = luaL_checkstring( L, 2 );
Buffer buffer = {
.type = BUFFER_UNSIGNED_CHAR
};
buffer.data = ExportImageToMemory( *image, fileType, (int*)&buffer.size );
uluaPushBuffer( L, buffer );
return 1;
}
/* /*
> success = RL.ExportImageAsCode( Image image, string fileName ) > success = RL.ExportImageAsCode( Image image, string fileName )
@@ -197,35 +234,19 @@ int ltexturesGenImageColor( lua_State *L ) {
} }
/* /*
> image = RL.GenImageGradientV( Vector2 size, Color top, Color bottom ) > image = RL.GenImageGradientLinear( Vector2 size, int direction, Color a, Color b )
Generate image: vertical gradient Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient
- Success return Image - Success return Image
*/ */
int ltexturesGenImageGradientV( lua_State *L ) { int ltexturesGenImageGradientLinear( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 ); Vector2 size = uluaGetVector2( L, 1 );
Color top = uluaGetColor( L, 2 ); int direction = luaL_checkinteger( L, 2 );
Color bottom = uluaGetColor( L, 3 ); Color start = uluaGetColor( L, 3 );
Color end = uluaGetColor( L, 4 );
uluaPushImage( L, GenImageGradientV( (int)size.x, (int)size.y, top, bottom ) ); uluaPushImage( L, GenImageGradientLinear( (int)size.x, (int)size.y, direction, start, end ) );
return 1;
}
/*
> image = RL.GenImageGradientH( Vector2 size, Color left, Color right )
Generate image: horizontal gradient
- Success return Image
*/
int ltexturesGenImageGradientH( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 );
Color left = uluaGetColor( L, 2 );
Color right = uluaGetColor( L, 3 );
uluaPushImage( L, GenImageGradientH( (int)size.x, (int)size.y, left, right ) );
return 1; return 1;
} }
@@ -248,6 +269,24 @@ int ltexturesGenImageGradientRadial( lua_State *L ) {
return 1; return 1;
} }
/*
> image = RL.GenImageGradientSquare( Vector2 size, float density, Color inner, Color outer )
Generate image: square gradient
- Success return Image
*/
int ltexturesGenImageGradientSquare( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 );
float density = luaL_checknumber( L, 2 );
Color inner = uluaGetColor( L, 3 );
Color outer = uluaGetColor( L, 4 );
uluaPushImage( L, GenImageGradientSquare( (int)size.x, (int)size.y, density, inner, outer ) );
return 1;
}
/* /*
> image = RL.GenImageChecked( Vector2 size, Vector2 checks, Color col1, Color col2 ) > image = RL.GenImageChecked( Vector2 size, Vector2 checks, Color col1, Color col2 )
@@ -592,6 +631,20 @@ int ltexturesImageFlipHorizontal( lua_State *L ) {
return 0; return 0;
} }
/*
> RL.ImageRotate( Image image, int degrees )
Rotate image by input angle in degrees (-359 to 359)
*/
int ltexturesImageRotate( lua_State *L ) {
Image *image = uluaGetImage( L, 1 );
int degrees = luaL_checkinteger( L, 2 );
ImageRotate( image, degrees );
return 0;
}
/* /*
> RL.ImageRotateCW( Image image ) > RL.ImageRotateCW( Image image )