summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--API.md332
-rw-r--r--ReiLua_API.lua346
-rw-r--r--changelog20
-rw-r--r--devnotes5
-rw-r--r--examples/platformer/main.lua3
-rw-r--r--include/audio.h6
-rw-r--r--include/core.h42
-rw-r--r--include/main.h13
-rw-r--r--include/raylib.h172
-rw-r--r--include/raymath.h202
-rw-r--r--include/rlgl.h379
-rw-r--r--include/shapes.h2
-rw-r--r--include/text.h1
-rw-r--r--include/textures.h7
-rw-r--r--src/audio.c76
-rw-r--r--src/core.c454
-rw-r--r--src/lua_core.c58
-rw-r--r--src/shapes.c67
-rw-r--r--src/state.c1
-rw-r--r--src/text.c29
-rw-r--r--src/textures.c85
21 files changed, 1578 insertions, 722 deletions
diff --git a/API.md b/API.md
index f8086af..8c79c10 100644
--- a/API.md
+++ b/API.md
@@ -1803,67 +1803,67 @@ Shader attribute type: vec4 (4 float)
---
-> PIXELFORMAT_COMPRESSED_DXT1_RGB = 11
+> PIXELFORMAT_COMPRESSED_DXT1_RGB = 14
4 bpp (no alpha)
---
-> PIXELFORMAT_COMPRESSED_DXT1_RGBA = 12
+> PIXELFORMAT_COMPRESSED_DXT1_RGBA = 15
4 bpp (1 bit alpha)
---
-> PIXELFORMAT_COMPRESSED_DXT3_RGBA = 13
+> PIXELFORMAT_COMPRESSED_DXT3_RGBA = 16
8 bpp
---
-> PIXELFORMAT_COMPRESSED_DXT5_RGBA = 14
+> PIXELFORMAT_COMPRESSED_DXT5_RGBA = 17
8 bpp
---
-> PIXELFORMAT_COMPRESSED_ETC1_RGB = 15
+> PIXELFORMAT_COMPRESSED_ETC1_RGB = 18
4 bpp
---
-> PIXELFORMAT_COMPRESSED_ETC2_RGB = 16
+> PIXELFORMAT_COMPRESSED_ETC2_RGB = 19
4 bpp
---
-> PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA = 17
+> PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA = 20
8 bpp
---
-> PIXELFORMAT_COMPRESSED_PVRT_RGB = 18
+> PIXELFORMAT_COMPRESSED_PVRT_RGB = 21
4 bpp
---
-> PIXELFORMAT_COMPRESSED_PVRT_RGBA = 19
+> PIXELFORMAT_COMPRESSED_PVRT_RGBA = 22
4 bpp
---
-> PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA = 20
+> PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA = 23
8 bpp
---
-> PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA = 21
+> PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA = 24
2 bpp
@@ -3540,6 +3540,12 @@ GLFW event joystick
---
+> RL.CloseWindow()
+
+Close window and unload OpenGL context and free all resources
+
+---
+
> state = RL.IsWindowReady()
Check if window has been initialized successfully
@@ -3588,121 +3594,147 @@ 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 )
+> state = RL.IsWindowState( int flag )
-Set window position on screen
+Check if one specific window flag is enabled (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
+
+- Success return bool
---
-> RL.SetWindowSize( Vector2 size )
+> RL.SetWindowState( int flag )
-Set window dimensions
+Set window configuration state using flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
---
-> RL.SetWindowOpacity( float opacity )
+> resized = RL.ClearWindowState( int flag )
-Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
+Clear window configuration state flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
----
+- Success return bool
-> windowHandle = RL.GetWindowHandle()
+---
-Get native window handle. Return as lightuserdata
+> RL.ToggleFullscreen()
-- Success return lightuserdata
+Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
---
-> RL.SetWindowMinSize( Vector2 size )
+> RL.ToggleBorderlessWindowed()
-Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
+Toggle window state: borderless windowed (only PLATFORM_DESKTOP)
---
-> position = RL.GetMonitorPosition( int monitor )
-
-Get specified monitor position
+> RL.MaximizeWindow()
-- Success return Vector2
+Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
---
-> size = RL.GetMonitorSize( int monitor )
+> RL.MinimizeWindow()
-Get specified monitor size
-
-- Success return Vector2
+Set window state: minimized, if resizable (only PLATFORM_DESKTOP)
---
-> position = RL.GetWindowPosition()
+> RL.RestoreWindow()
-Get window position on monitor
+Set window state: not minimized/maximized (only PLATFORM_DESKTOP)
-- Success return Vector2
+---
+
+> RL.SetWindowIcon( Image image )
+
+Set icon for window (Only PLATFORM_DESKTOP)
---
-> size = RL.GetScreenSize()
+> RL.SetWindowIcons( Image{} images )
-Get screen size
+Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP)
-- Success return Vector2
+---
+
+> RL.SetWindowTitle( string title )
+
+Set title for window (only PLATFORM_DESKTOP and PLATFORM_WEB)
---
-> RL.SetWindowState( int flag )
+> RL.SetWindowPosition( Vector2 pos )
-Set window configuration state using flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
+Set window position on screen
---
-> state = RL.IsWindowState( int flag )
+> RL.SetWindowMonitor( int monitor )
-Check if one specific window flag is enabled (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
+Set monitor for the current window
-- Success return bool
+---
+
+> RL.SetWindowMinSize( Vector2 size )
+
+Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
---
-> resized = RL.ClearWindowState( int flag )
+> RL.SetWindowMaxSize( Vector2 size )
-Clear window configuration state flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
+Set window maximum dimensions (for FLAG_WINDOW_RESIZABLE)
-- Success return bool
+---
+
+> RL.SetWindowSize( Vector2 size )
+
+Set window dimensions
---
-> resized = RL.IsWindowResized()
+> RL.SetWindowOpacity( float opacity )
-Check if window has been resized from last frame
+Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
-- Success return bool
+---
+
+> RL.SetWindowFocused()
+
+Set window focused (only PLATFORM_DESKTOP)
---
-> RL.SetWindowIcon( Image image )
+> windowHandle = RL.GetWindowHandle()
-Set icon for window (Only PLATFORM_DESKTOP)
+Get native window handle. Return as lightuserdata
+
+- Success return lightuserdata
---
-> RL.SetWindowIcons( Image{} images )
+> size = RL.GetScreenSize()
-Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP)
+Get screen size
+
+- Success return Vector2
---
-> RL.SetWindowTitle( string title )
+> size = RL.GetRenderSize()
-Set title for window (Only PLATFORM_DESKTOP)
+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 )
Get specified monitor physical size in millimetres
@@ -3738,25 +3786,27 @@ Get specified monitor refresh rate
---
-> dpi = RL.GetWindowScaleDPI()
+> position = RL.GetWindowPosition()
-Get window scale DPI factor
+Get window position on monitor
- Success return Vector2
---
-> name = RL.GetMonitorName( int monitor )
+> dpi = RL.GetWindowScaleDPI()
-Get the human-readable, UTF-8 encoded name of the monitor
+Get window scale DPI factor
-- Success return string
+- Success return Vector2
---
-> RL.CloseWindow()
+> name = RL.GetMonitorName( int monitor )
-Close window and unload OpenGL context and free all resources
+Get the human-readable, UTF-8 encoded name of the specified monitor
+
+- Success return string
---
@@ -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
---
@@ -4144,7 +4220,7 @@ Get the log level for bad function calls and invalid data formats.
> 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 )
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 )
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,27 +5097,15 @@ 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 )
+> RL.DrawLineStrip( Vector2{} points, Color color )
-Draw line using quadratic bezier curves with a control point
+Draw lines sequence
---
-> RL.DrawLineStrip( Vector2{} points, Color color )
+> RL.DrawLineBezier( Vector2 startPos, Vector2 endPos, float thickness, Color color )
-Draw lines sequence
+Draw a line using cubic-bezier curves in-out
---
@@ -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 )
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 )
Export image as code file defining an array of bytes, returns true on success
@@ -5360,25 +5456,25 @@ 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 )
+> image = RL.GenImageGradientRadial( Vector2 size, float density, Color inner, Color outer )
-Generate image: horizontal gradient
+Generate image: radial gradient
- Success return Image
---
-> image = RL.GenImageGradientRadial( Vector2 size, float density, Color inner, Color outer )
+> image = RL.GenImageGradientSquare( Vector2 size, float density, Color inner, Color outer )
-Generate image: radial gradient
+Generate image: square gradient
- Success return Image
@@ -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 )
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
- 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 )
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 )
Set master volume (listener)
---
+> isReady = RL.GetMasterVolume()
+
+Get master volume (listener)
+
+- Success return float
+
+---
+
## 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 )
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 )
Export wave data to file, returns true on success
diff --git a/ReiLua_API.lua b/ReiLua_API.lua
index de40894..9967616 100644
--- a/ReiLua_API.lua
+++ b/ReiLua_API.lua
@@ -537,27 +537,27 @@ RL.PIXELFORMAT_UNCOMPRESSED_R32G32B32=9
---32*4 bpp (4 channels - float)
RL.PIXELFORMAT_UNCOMPRESSED_R32G32B32A32=10
---4 bpp (no alpha)
-RL.PIXELFORMAT_COMPRESSED_DXT1_RGB=11
+RL.PIXELFORMAT_COMPRESSED_DXT1_RGB=14
---4 bpp (1 bit alpha)
-RL.PIXELFORMAT_COMPRESSED_DXT1_RGBA=12
+RL.PIXELFORMAT_COMPRESSED_DXT1_RGBA=15
---8 bpp
-RL.PIXELFORMAT_COMPRESSED_DXT3_RGBA=13
+RL.PIXELFORMAT_COMPRESSED_DXT3_RGBA=16
---8 bpp
-RL.PIXELFORMAT_COMPRESSED_DXT5_RGBA=14
+RL.PIXELFORMAT_COMPRESSED_DXT5_RGBA=17
---4 bpp
-RL.PIXELFORMAT_COMPRESSED_ETC1_RGB=15
+RL.PIXELFORMAT_COMPRESSED_ETC1_RGB=18
---4 bpp
-RL.PIXELFORMAT_COMPRESSED_ETC2_RGB=16
+RL.PIXELFORMAT_COMPRESSED_ETC2_RGB=19
---8 bpp
-RL.PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA=17
+RL.PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA=20
---4 bpp
-RL.PIXELFORMAT_COMPRESSED_PVRT_RGB=18
+RL.PIXELFORMAT_COMPRESSED_PVRT_RGB=21
---4 bpp
-RL.PIXELFORMAT_COMPRESSED_PVRT_RGBA=19
+RL.PIXELFORMAT_COMPRESSED_PVRT_RGBA=22
---8 bpp
-RL.PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA=20
+RL.PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA=23
---2 bpp
-RL.PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA=21
+RL.PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA=24
-- Globals - TextureFilters
@@ -1214,6 +1214,10 @@ RL.EVENT_CURSOR_ENTER=10
RL.EVENT_JOYSTICK=11
-- 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
---- Success return bool
---@return any state
@@ -1244,62 +1248,10 @@ function RL.IsWindowMaximized() end
---@return any state
function RL.IsWindowFocused() end
----Set monitor for the current window (fullscreen mode)
----@param monitor integer
----@return any RL.SetWindowMonitor
-function RL.SetWindowMonitor( monitor ) end
-
----Set window position on screen
----@param pos table
----@return any RL.SetWindowPosition
-function RL.SetWindowPosition( pos ) end
-
----Set window dimensions
----@param size table
----@return any RL.SetWindowSize
-function RL.SetWindowSize( size ) end
-
----Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
----@param opacity number
----@return any RL.SetWindowOpacity
-function RL.SetWindowOpacity( opacity ) end
-
----Get native window handle. Return as lightuserdata
----- Success return lightuserdata
----@return any windowHandle
-function RL.GetWindowHandle() end
-
----Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
----@param size table
----@return any RL.SetWindowMinSize
-function RL.SetWindowMinSize( size ) end
-
----Get specified monitor position
----- Success return Vector2
----@param monitor integer
----@return any position
-function RL.GetMonitorPosition( monitor ) end
-
----Get specified monitor size
----- Success return Vector2
----@param monitor integer
----@return any size
-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 window has been resized from last frame
+---- Success return bool
+---@return any resized
+function RL.IsWindowResized() end
---Check if one specific window flag is enabled (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
---- Success return bool
@@ -1307,16 +1259,36 @@ function RL.SetWindowState( flag ) end
---@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
----Check if window has been resized from last frame
----- Success return bool
----@return any resized
-function RL.IsWindowResized() 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
@@ -1328,11 +1300,60 @@ function RL.SetWindowIcon( image ) end
---@return any RL.SetWindowIcons
function RL.SetWindowIcons( images ) end
----Set title for window (Only PLATFORM_DESKTOP)
+---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
+---@param pos table
+---@return any RL.SetWindowPosition
+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
+---@param size table
+---@return any RL.SetWindowSize
+function RL.SetWindowSize( size ) end
+
+---Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
+---@param opacity number
+---@return any RL.SetWindowOpacity
+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
+---- Success return lightuserdata
+---@return any windowHandle
+function RL.GetWindowHandle() end
+
+---Get screen size
+---- Success return Vector2
+---@return any size
+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
@@ -1343,6 +1364,18 @@ function RL.GetMonitorCount() end
---@return any monitor
function RL.GetCurrentMonitor() end
+---Get specified monitor position
+---- Success return Vector2
+---@param monitor integer
+---@return any position
+function RL.GetMonitorPosition( monitor ) end
+
+---Get specified monitor size
+---- Success return Vector2
+---@param monitor integer
+---@return any size
+function RL.GetMonitorSize( monitor ) end
+
---Get specified monitor physical size in millimetres
---- Success return Vector2
---@param monitor integer
@@ -1355,21 +1388,22 @@ function RL.GetMonitorPhysicalSize( monitor ) end
---@return any refreshRate
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
---- Success return Vector2
---@return any dpi
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
---@param monitor integer
---@return any name
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
---@param text string
---@return any RL.SetClipboardText
@@ -1641,6 +1675,28 @@ function RL.GetFrameTime() end
---@return any time
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
---Takes a screenshot of current screen (filename extension defines format)
@@ -1674,7 +1730,7 @@ function RL.SetLogLevelInvalid( logLevel ) end
---@return any logLevel
function RL.GetLogLevelInvalid() end
----Open URL with default system browser (If available)
+---Open URL with default system browser (if available)
---@param url string
---@return any RL.OpenURL
function RL.OpenURL( url ) end
@@ -1756,6 +1812,11 @@ function RL.GetPrevDirectoryPath( dirPath ) end
---@return any directory
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
---- Success return string{}
---@param dirPath string
@@ -1898,6 +1959,12 @@ function RL.GetKeyScancode( key ) end
---@return any available
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
---- Success return bool
---@param gamepad integer
@@ -1932,11 +1999,11 @@ function RL.GetGamepadAxisCount( gamepad ) end
---@return any value
function RL.GetGamepadAxisMovement( gamepad, axis ) end
----Return gamepad internal name id
----- Success return string
----@param gamepad integer
----@return any name
-function RL.GetGamepadName( gamepad ) end
+---Set internal gamepad mappings (SDL_GameControllerDB)
+---- Success return int
+---@param mappings string
+---@return any result
+function RL.SetGamepadMappings( mappings ) end
-- Core - Input-related functions: mouse
@@ -2356,6 +2423,12 @@ function RL.DrawPixel( pos, color ) end
---@return any RL.DrawLine
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
---@param startPos table
---@param endPos table
@@ -2364,31 +2437,6 @@ function RL.DrawLine( startPos, endPos, thickness, color ) end
---@return any RL.DrawLineBezier
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
---@param center table
---@param radius number
@@ -2694,6 +2742,13 @@ function RL.LoadImage( fileName ) end
---@return any image
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
---- Failure return nil
---- Success return Image, int
@@ -2739,6 +2794,13 @@ function RL.UnloadImage( image ) end
---@return any success
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
---- Success return bool
---@param image any
@@ -2755,30 +2817,32 @@ function RL.ExportImageAsCode( image, fileName ) end
---@return any image
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
---@param size table
----@param top table
----@param bottom table
+---@param direction integer
+---@param a table
+---@param b table
---@return any image
-function RL.GenImageGradientV( size, top, bottom ) end
+function RL.GenImageGradientLinear( size, direction, a, b ) end
----Generate image: horizontal gradient
+---Generate image: radial gradient
---- Success return Image
---@param size table
----@param left table
----@param right table
+---@param density number
+---@param inner table
+---@param outer table
---@return any image
-function RL.GenImageGradientH( size, left, right ) end
+function RL.GenImageGradientRadial( size, density, inner, outer ) end
----Generate image: radial gradient
+---Generate image: square gradient
---- Success return Image
---@param size table
---@param density number
---@param inner table
---@param outer table
---@return any image
-function RL.GenImageGradientRadial( size, density, inner, outer ) end
+function RL.GenImageGradientSquare( size, density, inner, outer ) end
---Generate image: checked
---- Success return Image
@@ -2932,6 +2996,12 @@ function RL.ImageFlipVertical( image ) end
---@return any RL.ImageFlipHorizontal
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
---@param image any
---@return any RL.ImageRotateCW
@@ -3386,14 +3456,14 @@ function RL.GetFontDefault() end
---@return any font
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
---- Success return Font
---@param fileName string
---@param fontSize integer
----@param fontChars table
+---@param codepoints table
---@return any font
-function RL.LoadFontEx( fileName, fontSize, fontChars ) end
+function RL.LoadFontEx( fileName, fontSize, codepoints ) end
---Load font from Image (XNA style)
---- Success return Font
@@ -3497,6 +3567,11 @@ function RL.DrawTextBoxedTinted( font, text, rec, fontSize, spacing, wordWrap, t
-- 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
---- Success return Vector2
---@param font any
@@ -4195,11 +4270,29 @@ function RL.GetRayCollisionQuad( ray, p1, p2, p3, p4 ) end
-- 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)
---@param volume number
---@return any RL.SetMasterVolume
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
---Load sound from file
@@ -4228,6 +4321,12 @@ function RL.IsWaveReady( wave ) end
---@return any sound
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
---- Success return bool
---@param sound any
@@ -4244,6 +4343,11 @@ function RL.UnloadWave( wave ) end
---@return any RL.UnloadSound
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
---- Success return bool
---@param wave any
diff --git a/changelog b/changelog
index 6e0125b..aa23a70 100644
--- a/changelog
+++ b/changelog
@@ -1,4 +1,24 @@
------------------------------------------------------------------------
+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
------------------------------------------------------------------------
KEY CHANGES:
diff --git a/devnotes b/devnotes
index 6b28dfc..75c1b3e 100644
--- a/devnotes
+++ b/devnotes
@@ -1,10 +1,15 @@
Current {
+ * Shapes
+ * Splines.
}
Backlog {
* Text
* 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.
+ * LoadFontFromMemory.
+ * LoadFontData.
+ * GenImageFontAtlas.
* Audio
* AudioStream.
* Models
diff --git a/examples/platformer/main.lua b/examples/platformer/main.lua
index 4c884f8..b599b41 100644
--- a/examples/platformer/main.lua
+++ b/examples/platformer/main.lua
@@ -94,7 +94,8 @@ function RL.init()
end
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 ]
else
return false
diff --git a/include/audio.h b/include/audio.h
index 09b5bb3..7367de8 100644
--- a/include/audio.h
+++ b/include/audio.h
@@ -1,15 +1,21 @@
#pragma once
/* 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 laudioGetMasterVolume( lua_State *L );
/* Wave/Sound loading/unloading functions. */
int laudioLoadSound( lua_State *L );
int laudioLoadWave( lua_State *L );
int laudioIsWaveReady( lua_State *L );
int laudioLoadSoundFromWave( lua_State *L );
+int laudioLoadSoundAlias( lua_State *L );
int laudioIsSoundReady( lua_State *L );
int laudioUnloadWave( lua_State *L );
int laudioUnloadSound( lua_State *L );
+int laudioUnloadSoundAlias( lua_State *L );
int laudioExportWave( lua_State *L );
int laudioExportWaveAsCode( lua_State *L );
/* Wave/Sound management functions. */
diff --git a/include/core.h b/include/core.h
index 4b61d5f..3d8d3c0 100644
--- a/include/core.h
+++ b/include/core.h
@@ -4,36 +4,44 @@
void unloadBuffer( Buffer *buffer );
/* Window-related functions. */
+int lcoreCloseWindow( lua_State *L );
int lcoreIsWindowReady( lua_State *L );
int lcoreIsWindowFullscreen( lua_State *L );
int lcoreIsWindowHidden( lua_State *L );
int lcoreIsWindowMinimized( lua_State *L );
int lcoreIsWindowMaximized( 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 lcoreIsWindowResized( lua_State *L );
int lcoreIsWindowState( lua_State *L );
+int lcoreSetWindowState( lua_State *L );
int lcoreClearWindowState( lua_State *L );
-int lcoreIsWindowResized( 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 lcoreSetWindowIcons( 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 lcoreGetCurrentMonitor( lua_State *L );
+int lcoreGetMonitorPosition( lua_State *L );
+int lcoreGetMonitorSize( lua_State *L );
int lcoreGetMonitorPhysicalSize( lua_State *L );
int lcoreGetMonitorRefreshRate( lua_State *L );
+int lcoreGetWindowPosition( lua_State *L );
int lcoreGetWindowScaleDPI( lua_State *L );
int lcoreGetMonitorName( lua_State *L );
-int lcoreCloseWindow( lua_State *L );
int lcoreSetClipboardText( lua_State *L );
int lcoreGetClipboardText( lua_State *L );
/* Cursor-related functions. */
@@ -85,6 +93,10 @@ int lcoreSetTargetFPS( lua_State *L );
int lcoreGetFPS( lua_State *L );
int lcoreGetFrameTime( 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 */
int lcoreTakeScreenshot( lua_State *L );
int lcoreSetConfigFlags( lua_State *L );
@@ -107,6 +119,7 @@ int lcoreGetFileNameWithoutExt( lua_State *L );
int lcoreGetDirectoryPath( lua_State *L );
int lcoreGetPrevDirectoryPath( lua_State *L );
int lcoreGetWorkingDirectory( lua_State *L );
+int lcoreGetApplicationDirectory( lua_State *L );
int lcoreLoadDirectoryFiles( lua_State *L );
int lcoreLoadDirectoryFilesEx( lua_State *L );
int lcoreChangeDirectory( lua_State *L );
@@ -131,12 +144,13 @@ int lcoreGetKeyName( lua_State *L );
int lcoreGetKeyScancode( lua_State *L );
/* Input-related functions: gamepads. */
int lcoreIsGamepadAvailable( lua_State *L );
+int lcoreGetGamepadName( lua_State *L );
int lcoreIsGamepadButtonPressed( lua_State *L );
int lcoreIsGamepadButtonDown( lua_State *L );
int lcoreIsGamepadButtonReleased( lua_State *L );
int lcoreGetGamepadAxisCount( lua_State *L );
int lcoreGetGamepadAxisMovement( lua_State *L );
-int lcoreGetGamepadName( lua_State *L );
+int lcoreSetGamepadMappings( lua_State *L );
/* Input-related functions: mouse. */
int lcoreIsMouseButtonPressed( lua_State *L );
int lcoreIsMouseButtonDown( lua_State *L );
diff --git a/include/main.h b/include/main.h
index e8759bb..4795121 100644
--- a/include/main.h
+++ b/include/main.h
@@ -3,14 +3,18 @@
#define STRING_LEN 1024
#define VERSION_MAJOR 0
-#define VERSION_MINOR 6
+#define VERSION_MINOR 7
#define VERSION_PATCH 0
-#define VERSION_DEV 0
+#define VERSION_DEV 1
-#include "glad.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <stdint.h>
+
+#include "glad.h"
+#include "glfw3.h"
+#include "glfw3native.h"
#ifdef SHARED
#include <raylib.h>
@@ -28,9 +32,6 @@
#include "rcamera.h"
#endif
-#include "glfw3.h"
-#include "glfw3native.h"
-#include <stdint.h>
#ifdef LUAJIT
#ifdef SHARED
diff --git a/include/raylib.h b/include/raylib.h
index 4cd9e43..1c4c4a0 100644
--- a/include/raylib.h
+++ b/include/raylib.h
@@ -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:
* - NO external dependencies, all required libraries included with raylib
@@ -81,10 +81,10 @@
#include <stdarg.h> // Required for: va_list - Only used by TraceLogCallback
-#define RAYLIB_VERSION_MAJOR 4
-#define RAYLIB_VERSION_MINOR 5
+#define RAYLIB_VERSION_MAJOR 5
+#define RAYLIB_VERSION_MINOR 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)
// 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)
// Plain structures in C++ (without constructors) can be initialized with { }
+// This is called aggregate initialization (C++11 feature)
#if defined(__cplusplus)
#define CLITERAL(type) type
#else
#define CLITERAL(type) (type)
#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
// 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)
@@ -402,6 +410,7 @@ typedef struct ModelAnimation {
int frameCount; // Number of animation frames
BoneInfo *bones; // Bones information (skeleton)
Transform **framePoses; // Poses array by frame
+ char name[32]; // Animation name
} ModelAnimation;
// Ray, ray for raycasting
@@ -497,6 +506,20 @@ typedef struct FilePathList {
char **paths; // Filepaths entries
} 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
//----------------------------------------------------------------------------------
@@ -517,6 +540,7 @@ typedef enum {
FLAG_WINDOW_TRANSPARENT = 0x00000010, // Set to allow transparent framebuffer
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_BORDERLESS_WINDOWED_MODE = 0x00008000, // Set to run program in borderless windowed mode
FLAG_MSAA_4X_HINT = 0x00000020, // Set to try enabling MSAA 4X
FLAG_INTERLACED_HINT = 0x00010000 // Set to try enabling interlaced video format (for V3D)
} ConfigFlags;
@@ -802,6 +826,9 @@ typedef enum {
PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float)
PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 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_RGBA, // 4 bpp (1 bit alpha)
PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp
@@ -905,8 +932,8 @@ typedef enum {
// Callbacks to hook some internal functions
// 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 unsigned char *(*LoadFileDataCallback)(const char *fileName, unsigned int *bytesRead); // FileIO: Load binary data
-typedef bool (*SaveFileDataCallback)(const char *fileName, void *data, unsigned int bytesToWrite); // FileIO: Save binary data
+typedef unsigned char *(*LoadFileDataCallback)(const char *fileName, int *dataSize); // FileIO: Load 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 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
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 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 IsWindowFullscreen(void); // Check if window is currently fullscreen
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 ClearWindowState(unsigned int flags); // Clear window configuration state flags
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 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 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 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 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 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 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 int GetScreenWidth(void); // Get current screen width
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 Vector2 GetWindowPosition(void); // Get window position XY on monitor
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 const char *GetClipboardText(void); // Get clipboard text content
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
-// 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
RLAPI void ShowCursor(void); // Shows cursor
RLAPI void HideCursor(void); // Hides cursor
@@ -1033,24 +1055,37 @@ RLAPI Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); // Get the
// Timing-related functions
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 double GetTime(void); // Get elapsed time in seconds since InitWindow()
+RLAPI int GetFPS(void); // Get current FPS
-// Misc. functions
-RLAPI int GetRandomValue(int min, int max); // Get a random value between min and max (both included)
+// 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
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 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 SetTraceLogLevel(int logLevel); // Set the current threshold (minimum) log level
RLAPI void *MemAlloc(unsigned int size); // Internal memory allocator
RLAPI void *MemRealloc(void *ptr, unsigned int size); // Internal memory reallocator
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
// WARNING: Callbacks setup is intended for advance users
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
// 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 bool SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite); // 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 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, 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 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
+//------------------------------------------------------------------
+
+// File system functions
RLAPI bool FileExists(const char *fileName); // Check if file 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)
@@ -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 *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 *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 IsPathFile(const char *path); // Check if a given path is a file or a directory
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 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-related functions: keyboard
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 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 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 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
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)
//------------------------------------------------------------------------------------
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 float GetGestureHoldDuration(void); // Get gesture hold time in milliseconds
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 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 DrawLineV(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (Vector version)
-RLAPI void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line defining thickness
-RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line using cubic-bezier curves in-out
-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 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 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 (using triangles/quads)
+RLAPI void DrawLineStrip(Vector2 *points, int pointCount, Color color); // Draw lines sequence (using gl lines)
+RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw line segment cubic-bezier in-out interpolation
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 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 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 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 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
@@ -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 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
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
@@ -1227,6 +1294,7 @@ RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2);
// NOTE: These functions do not require GPU access
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 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 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
@@ -1234,13 +1302,14 @@ RLAPI Image LoadImageFromScreen(void);
RLAPI bool IsImageReady(Image image); // Check if an image is ready
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 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
// Image generation functions
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 GenImageGradientH(int width, int height, Color left, Color right); // Generate image: horizontal 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 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 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
@@ -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 ImageFlipVertical(Image *image); // Flip image vertically
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 ImageRotateCCW(Image *image); // Rotate image counter-clockwise 90deg
RLAPI void ImageColorTint(Image *image, Color color); // Modify image color: tint
@@ -1309,7 +1379,7 @@ RLAPI TextureCubemap LoadTextureCubemap(Image image, int layout);
RLAPI RenderTexture2D LoadRenderTexture(int width, int height); // Load texture for rendering (framebuffer)
RLAPI bool IsTextureReady(Texture2D texture); // Check if a texture is ready
RLAPI void UnloadTexture(Texture2D texture); // Unload texture from GPU memory (VRAM)
-RLAPI bool IsRenderTextureReady(RenderTexture2D target); // Check if a render texture is ready
+RLAPI bool IsRenderTextureReady(RenderTexture2D target); // Check if a render texture is ready
RLAPI void UnloadRenderTexture(RenderTexture2D target); // Unload render texture from GPU memory (VRAM)
RLAPI void UpdateTexture(Texture2D texture, const void *pixels); // Update GPU texture with new data
RLAPI void UpdateTextureRec(Texture2D texture, Rectangle rec, const void *pixels); // Update GPU texture rectangle with new data
@@ -1351,13 +1421,13 @@ RLAPI int GetPixelDataSize(int width, int height, int format); // G
// Font loading/unloading functions
RLAPI Font GetFontDefault(void); // Get the default Font
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 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 GlyphInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int glyphCount, 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 void UnloadFontData(GlyphInfo *chars, int glyphCount); // Unload font chars info data (RAM)
+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 *glyphs, Rectangle **glyphRecs, int glyphCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info
+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 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 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 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
+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 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
@@ -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
// 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 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
// Collision detection functions
@@ -1511,6 +1582,7 @@ RLAPI void InitAudioDevice(void); // Initial
RLAPI void CloseAudioDevice(void); // Close the audio device and context
RLAPI bool IsAudioDeviceReady(void); // Check if audio device has been initialized successfully
RLAPI void SetMasterVolume(float volume); // Set master volume (listener)
+RLAPI float GetMasterVolume(void); // Get master volume (listener)
// Wave/Sound loading/unloading functions
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 Sound LoadSound(const char *fileName); // Load sound from file
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 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 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 ExportWaveAsCode(Wave wave, const char *fileName); // Export wave sample data to code (.h), returns true on success
@@ -1573,12 +1647,12 @@ RLAPI void SetAudioStreamVolume(AudioStream stream, float volume); // Set vol
RLAPI void SetAudioStreamPitch(AudioStream stream, float pitch); // Set pitch for audio stream (1.0 is base level)
RLAPI void SetAudioStreamPan(AudioStream stream, float pan); // Set pan for audio stream (0.5 is centered)
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 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
#if defined(__cplusplus)
diff --git a/include/raymath.h b/include/raymath.h
index 422a42e..ff60170 100644
--- a/include/raymath.h
+++ b/include/raymath.h
@@ -2,25 +2,30 @@
*
* raymath v1.5 - Math functions to work with Vector2, Vector3, Matrix and Quaternions
*
-* CONFIGURATION:
-*
-* #define RAYMATH_IMPLEMENTATION
-* 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
-* or source files without problems. But only ONE file should hold the implementation.
-*
-* #define RAYMATH_STATIC_INLINE
-* Define static inline functions code, so #include header suffices for use.
-* This may use up lots of memory.
-*
* 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
+* 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
+* or source files without problems. But only ONE file should hold the implementation.
+*
+* #define RAYMATH_STATIC_INLINE
+* Define static inline functions code, so #include header suffices for use.
+* This may use up lots of memory.
*
*
* LICENSE: zlib/libpng
@@ -209,6 +214,10 @@ RMAPI float Wrap(float value, float min, float max)
// Check whether two given floats are almost equal
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))));
return result;
@@ -310,7 +319,12 @@ RMAPI float Vector2DistanceSqr(Vector2 v1, Vector2 v2)
// NOTE: Angle is calculated from origin point (0, 0)
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;
}
@@ -322,17 +336,8 @@ RMAPI float Vector2LineAngle(Vector2 start, Vector2 end)
{
float result = 0.0f;
- float dot = start.x*end.x + start.y*end.y; // Dot product
-
- 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));
+ // TODO(10/9/2023): Currently angles move clockwise, determine if this is wanted behavior
+ result = -atan2f(end.y - start.y, end.x - start.x);
return result;
}
@@ -507,6 +512,10 @@ RMAPI Vector2 Vector2ClampValue(Vector2 v, float min, float max)
// Check whether two given vectors are almost equal
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))))) &&
((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;
float length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z);
- if (length == 0.0f) length = 1.0f;
- float ilength = 1.0f/length;
+ if (length != 0.0f)
+ {
+ float ilength = 1.0f/length;
- result.x *= ilength;
- result.y *= ilength;
- result.z *= ilength;
+ result.x *= ilength;
+ result.y *= 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;
}
@@ -785,7 +830,7 @@ RMAPI Vector3 Vector3RotateByAxisAngle(Vector3 v, Vector3 axis, float angle)
Vector3 result = v;
// Vector3Normalize(axis);
- float length = sqrtf(axis.x * axis.x + axis.y * axis.y + axis.z * axis.z);
+ float length = sqrtf(axis.x*axis.x + axis.y*axis.y + axis.z*axis.z);
if (length == 0.0f) length = 1.0f;
float ilength = 1.0f / length;
axis.x *= ilength;
@@ -794,19 +839,19 @@ RMAPI Vector3 Vector3RotateByAxisAngle(Vector3 v, Vector3 axis, float angle)
angle /= 2.0f;
float a = sinf(angle);
- float b = axis.x * a;
- float c = axis.y * a;
- float d = axis.z * a;
+ float b = axis.x*a;
+ float c = axis.y*a;
+ float d = axis.z*a;
a = cosf(angle);
Vector3 w = { b, c, d };
// Vector3CrossProduct(w, v)
- Vector3 wv = { w.y * v.z - w.z * v.y, w.z * v.x - w.x * v.z, w.x * v.y - w.y * v.x };
+ Vector3 wv = { w.y*v.z - w.z*v.y, w.z*v.x - w.x*v.z, w.x*v.y - w.y*v.x };
// Vector3CrossProduct(w, wv)
- Vector3 wwv = { w.y * wv.z - w.z * wv.y, w.z * wv.x - w.x * wv.z, w.x * wv.y - w.y * wv.x };
+ Vector3 wwv = { w.y*wv.z - w.z*wv.y, w.z*wv.x - w.x*wv.z, w.x*wv.y - w.y*wv.x };
- // Vector3Scale(wv, 2 * a)
+ // Vector3Scale(wv, 2*a)
a *= 2;
wv.x *= a;
wv.y *= a;
@@ -1055,19 +1100,22 @@ RMAPI Vector3 Vector3ClampValue(Vector3 v, float min, float max)
// Check whether two given vectors are almost equal
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))))) &&
- ((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.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)))));
return result;
}
-// Compute the direction of a refracted ray where v specifies the
-// normalized direction of the incoming ray, n specifies the
-// normalized normal vector of the interface of two optical media,
-// and r specifies the ratio of the refractive index of the medium
-// from where the ray comes to the refractive index of the medium
-// on the other side of the surface
+// Compute the direction of a refracted ray
+// v: normalized direction of the incoming ray
+// n: normalized normal vector of the interface of two optical media
+// r: ratio of the refractive index of the medium from where the ray comes
+// to the refractive index of the medium on the other side of the surface
RMAPI Vector3 Vector3Refract(Vector3 v, Vector3 n, float r)
{
Vector3 result = { 0 };
@@ -1509,11 +1557,11 @@ RMAPI Matrix MatrixFrustum(double left, double right, double bottom, double top,
// Get perspective projection matrix
// 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 };
- double top = near*tan(fovy*0.5);
+ double top = nearPlane*tan(fovY*0.5);
double bottom = -top;
double right = top*aspect;
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);
float rl = (float)(right - left);
float tb = (float)(top - bottom);
- float fn = (float)(far - near);
+ float fn = (float)(farPlane - nearPlane);
- result.m0 = ((float)near*2.0f)/rl;
- result.m5 = ((float)near*2.0f)/tb;
+ result.m0 = ((float)nearPlane*2.0f)/rl;
+ result.m5 = ((float)nearPlane*2.0f)/tb;
result.m8 = ((float)right + (float)left)/rl;
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.m14 = -((float)far*(float)near*2.0f)/fn;
+ result.m14 = -((float)farPlane*(float)nearPlane*2.0f)/fn;
return result;
}
// 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 };
float rl = (float)(right - left);
float tb = (float)(top - bottom);
- float fn = (float)(far - near);
+ float fn = (float)(farPlane - nearPlane);
result.m0 = 2.0f/rl;
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.m12 = -((float)left + (float)right)/rl;
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;
return result;
@@ -1812,6 +1860,10 @@ RMAPI Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount)
{
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;
if (cosHalfTheta < 0)
@@ -1827,7 +1879,7 @@ RMAPI Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount)
float halfTheta = acosf(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.y = (q1.y*0.5f + q2.y*0.5f);
@@ -1882,9 +1934,9 @@ RMAPI Quaternion QuaternionFromMatrix(Matrix mat)
{
Quaternion result = { 0 };
- float fourWSquaredMinus1 = mat.m0 + mat.m5 + mat.m10;
- float fourXSquaredMinus1 = mat.m0 - mat.m5 - mat.m10;
- float fourYSquaredMinus1 = mat.m5 - mat.m0 - mat.m10;
+ float fourWSquaredMinus1 = mat.m0 + mat.m5 + mat.m10;
+ float fourXSquaredMinus1 = mat.m0 - mat.m5 - mat.m10;
+ float fourYSquaredMinus1 = mat.m5 - mat.m0 - mat.m10;
float fourZSquaredMinus1 = mat.m10 - mat.m0 - mat.m5;
int biggestIndex = 0;
@@ -1907,34 +1959,34 @@ RMAPI Quaternion QuaternionFromMatrix(Matrix mat)
biggestIndex = 3;
}
- float biggestVal = sqrtf(fourBiggestSquaredMinus1 + 1.0f) * 0.5f;
+ float biggestVal = sqrtf(fourBiggestSquaredMinus1 + 1.0f)*0.5f;
float mult = 0.25f / biggestVal;
switch (biggestIndex)
{
case 0:
result.w = biggestVal;
- result.x = (mat.m6 - mat.m9) * mult;
- result.y = (mat.m8 - mat.m2) * mult;
- result.z = (mat.m1 - mat.m4) * mult;
+ result.x = (mat.m6 - mat.m9)*mult;
+ result.y = (mat.m8 - mat.m2)*mult;
+ result.z = (mat.m1 - mat.m4)*mult;
break;
case 1:
result.x = biggestVal;
- result.w = (mat.m6 - mat.m9) * mult;
- result.y = (mat.m1 + mat.m4) * mult;
- result.z = (mat.m8 + mat.m2) * mult;
+ result.w = (mat.m6 - mat.m9)*mult;
+ result.y = (mat.m1 + mat.m4)*mult;
+ result.z = (mat.m8 + mat.m2)*mult;
break;
case 2:
result.y = biggestVal;
- result.w = (mat.m8 - mat.m2) * mult;
- result.x = (mat.m1 + mat.m4) * mult;
- result.z = (mat.m6 + mat.m9) * mult;
+ result.w = (mat.m8 - mat.m2)*mult;
+ result.x = (mat.m1 + mat.m4)*mult;
+ result.z = (mat.m6 + mat.m9)*mult;
break;
case 3:
result.z = biggestVal;
- result.w = (mat.m1 - mat.m4) * mult;
- result.x = (mat.m8 + mat.m2) * mult;
- result.y = (mat.m6 + mat.m9) * mult;
+ result.w = (mat.m1 - mat.m4)*mult;
+ result.x = (mat.m8 + mat.m2)*mult;
+ result.y = (mat.m6 + mat.m9)*mult;
break;
}
@@ -2040,7 +2092,7 @@ RMAPI void QuaternionToAxisAngle(Quaternion q, Vector3 *outAxis, float *outAngle
float resAngle = 2.0f*acosf(q.w);
float den = sqrtf(1.0f - q.w*q.w);
- if (den > 0.0001f)
+ if (den > EPSILON)
{
resAxis.x = q.x/den;
resAxis.y = q.y/den;
@@ -2119,11 +2171,15 @@ RMAPI Quaternion QuaternionTransform(Quaternion q, Matrix mat)
// Check whether two given quaternions are almost equal
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))))) &&
((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.w - q.w)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.w), fabsf(q.w)))))) ||
- (((fabsf(p.x + q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) &&
+ (((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.z + q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) &&
((fabsf(p.w + q.w)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.w), fabsf(q.w))))));
diff --git a/include/rlgl.h b/include/rlgl.h
index 86208de..6cf9c7e 100644
--- a/include/rlgl.h
+++ b/include/rlgl.h
@@ -2,82 +2,83 @@
*
* rlgl v4.5 - A multi-OpenGL abstraction layer with an immediate-mode style API
*
-* 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...)
+* DESCRIPTION:
+* 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...)
*
-* When choosing an OpenGL backend different than OpenGL 1.1, some internal buffer are
-* initialized on rlglInit() to accumulate vertex data.
+* ADDITIONAL NOTES:
+* When choosing an OpenGL backend different than OpenGL 1.1, some internal buffer are
+* initialized on rlglInit() to accumulate vertex data.
*
-* 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.
+* 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.
*
-* Some additional resources are also loaded for convenience, here the complete list:
-* - Default batch (RLGL.defaultBatch): RenderBatch system to accumulate vertex data
-* - Default texture (RLGL.defaultTextureId): 1x1 white pixel R8G8B8A8
-* - Default shader (RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs)
-*
-* Internal buffer (and additional resources) must be manually unloaded calling rlglClose().
+* Some resources are also loaded for convenience, here the complete list:
+* - Default batch (RLGL.defaultBatch): RenderBatch system to accumulate vertex data
+* - Default texture (RLGL.defaultTextureId): 1x1 white pixel R8G8B8A8
+* - Default shader (RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs)
*
+* Internal buffer (and resources) must be manually unloaded calling rlglClose().
*
* CONFIGURATION:
+* #define GRAPHICS_API_OPENGL_11
+* #define GRAPHICS_API_OPENGL_21
+* #define GRAPHICS_API_OPENGL_33
+* #define GRAPHICS_API_OPENGL_43
+* #define GRAPHICS_API_OPENGL_ES2
+* #define GRAPHICS_API_OPENGL_ES3
+* Use selected OpenGL graphics backend, should be supported by platform
+* Those preprocessor defines are only used on rlgl module, if OpenGL version is
+* required by any other module, use rlGetVersion() to check it
*
-* #define GRAPHICS_API_OPENGL_11
-* #define GRAPHICS_API_OPENGL_21
-* #define GRAPHICS_API_OPENGL_33
-* #define GRAPHICS_API_OPENGL_43
-* #define GRAPHICS_API_OPENGL_ES2
-* Use selected OpenGL graphics backend, should be supported by platform
-* Those preprocessor defines are only used on rlgl module, if OpenGL version is
-* required by any other module, use rlGetVersion() to check it
-*
-* #define RLGL_IMPLEMENTATION
-* 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
-* or source files without problems. But only ONE file should hold the implementation.
+* #define RLGL_IMPLEMENTATION
+* 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
+* or source files without problems. But only ONE file should hold the implementation.
*
-* #define RLGL_RENDER_TEXTURES_HINT
-* Enable framebuffer objects (fbo) support (enabled by default)
-* Some GPUs could not support them despite the OpenGL version
+* #define RLGL_RENDER_TEXTURES_HINT
+* Enable framebuffer objects (fbo) support (enabled by default)
+* Some GPUs could not support them despite the OpenGL version
*
-* #define RLGL_SHOW_GL_DETAILS_INFO
-* Show OpenGL extensions and capabilities detailed logs on init
+* #define RLGL_SHOW_GL_DETAILS_INFO
+* Show OpenGL extensions and capabilities detailed logs on init
*
-* #define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT
-* Enable debug context (only available on OpenGL 4.3)
+* #define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT
+* Enable debug context (only available on OpenGL 4.3)
*
-* rlgl capabilities could be customized just defining some internal
-* values before library inclusion (default values listed):
+* rlgl capabilities could be customized just defining some internal
+* values before library inclusion (default values listed):
*
-* #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 8192 // Default internal render batch elements limits
-* #define RL_DEFAULT_BATCH_BUFFERS 1 // Default number of batch buffers (multi-buffering)
-* #define RL_DEFAULT_BATCH_DRAWCALLS 256 // Default number of batch draw calls (by state changes: mode, texture)
-* #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 4 // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture())
+* #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 8192 // Default internal render batch elements limits
+* #define RL_DEFAULT_BATCH_BUFFERS 1 // Default number of batch buffers (multi-buffering)
+* #define RL_DEFAULT_BATCH_DRAWCALLS 256 // Default number of batch draw calls (by state changes: mode, texture)
+* #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 4 // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture())
*
-* #define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of internal Matrix stack
-* #define RL_MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported
-* #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_MAX_MATRIX_STACK_SIZE 32 // Maximum size of internal Matrix stack
+* #define RL_MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported
+* #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
*
-* When loading a shader, the following vertex attribute and uniform
-* location names are tried to be set automatically:
+* When loading a shader, the following vertex attributes and uniform
+* 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_TEXCOORD "vertexTexCoord" // Bound by default to shader location: 1
-* #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_TANGENT "vertexTangent" // Bound by default to shader location: 4
-* #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_PROJECTION "matProjection" // projection matrix
-* #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel" // model matrix
-* #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal" // normal matrix (transpose(inverse(matModelView))
-* #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (base tint color, multiplied by texture color)
-* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0)
-* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1" // texture1 (texture slot active 1)
-* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2)
+* #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: 0
+* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: 1
+* #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_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_VIEW "matView" // view matrix
+* #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection" // projection matrix
+* #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel" // model matrix
+* #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal" // normal matrix (transpose(inverse(matModelView))
+* #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (base tint color, multiplied by texture color)
+* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0)
+* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1" // texture1 (texture slot active 1)
+* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2)
*
* DEPENDENCIES:
-*
* - OpenGL libraries (depending on platform and OpenGL version selected)
* - 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_33) && \
!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
#endif
@@ -179,6 +181,11 @@
#define GRAPHICS_API_OPENGL_33
#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
// NOTE: Some driver implementation do not support it, despite they should
#define RLGL_RENDER_TEXTURES_HINT
@@ -383,7 +390,8 @@ typedef enum {
RL_OPENGL_21, // OpenGL 2.1 (GLSL 120)
RL_OPENGL_33, // OpenGL 3.3 (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;
// Trace log level
@@ -412,6 +420,9 @@ typedef enum {
RL_PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float)
RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 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_RGBA, // 4 bpp (1 bit alpha)
RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp
@@ -506,28 +517,28 @@ typedef enum {
// Framebuffer attachment type
// NOTE: By default up to 8 color channels defined, but it can be more
typedef enum {
- RL_ATTACHMENT_COLOR_CHANNEL0 = 0, // Framebuffer attachment type: color 0
- RL_ATTACHMENT_COLOR_CHANNEL1, // Framebuffer attachment type: color 1
- RL_ATTACHMENT_COLOR_CHANNEL2, // Framebuffer attachment type: color 2
- RL_ATTACHMENT_COLOR_CHANNEL3, // Framebuffer attachment type: color 3
- RL_ATTACHMENT_COLOR_CHANNEL4, // Framebuffer attachment type: color 4
- RL_ATTACHMENT_COLOR_CHANNEL5, // Framebuffer attachment type: color 5
- RL_ATTACHMENT_COLOR_CHANNEL6, // Framebuffer attachment type: color 6
- RL_ATTACHMENT_COLOR_CHANNEL7, // Framebuffer attachment type: color 7
- RL_ATTACHMENT_DEPTH = 100, // Framebuffer attachment type: depth
- RL_ATTACHMENT_STENCIL = 200, // Framebuffer attachment type: stencil
+ RL_ATTACHMENT_COLOR_CHANNEL0 = 0, // Framebuffer attachment type: color 0
+ RL_ATTACHMENT_COLOR_CHANNEL1 = 1, // Framebuffer attachment type: color 1
+ RL_ATTACHMENT_COLOR_CHANNEL2 = 2, // Framebuffer attachment type: color 2
+ RL_ATTACHMENT_COLOR_CHANNEL3 = 3, // Framebuffer attachment type: color 3
+ RL_ATTACHMENT_COLOR_CHANNEL4 = 4, // Framebuffer attachment type: color 4
+ RL_ATTACHMENT_COLOR_CHANNEL5 = 5, // Framebuffer attachment type: color 5
+ RL_ATTACHMENT_COLOR_CHANNEL6 = 6, // Framebuffer attachment type: color 6
+ RL_ATTACHMENT_COLOR_CHANNEL7 = 7, // Framebuffer attachment type: color 7
+ RL_ATTACHMENT_DEPTH = 100, // Framebuffer attachment type: depth
+ RL_ATTACHMENT_STENCIL = 200, // Framebuffer attachment type: stencil
} rlFramebufferAttachType;
// Framebuffer texture attachment type
typedef enum {
- 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_POSITIVE_Y, // Framebuffer texture attachment type: cubemap, +Y side
- RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y, // Framebuffer texture attachment type: cubemap, -Y side
- RL_ATTACHMENT_CUBEMAP_POSITIVE_Z, // Framebuffer texture attachment type: cubemap, +Z side
- RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z, // Framebuffer texture attachment type: cubemap, -Z side
- RL_ATTACHMENT_TEXTURE2D = 100, // Framebuffer texture attachment type: texture2d
- RL_ATTACHMENT_RENDERBUFFER = 200, // Framebuffer texture attachment type: renderbuffer
+ RL_ATTACHMENT_CUBEMAP_POSITIVE_X = 0, // 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 = 2, // 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 = 4, // 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_RENDERBUFFER = 200, // Framebuffer texture attachment type: renderbuffer
} rlFramebufferAttachTextureType;
// Face culling mode
@@ -607,6 +618,7 @@ RLAPI void rlDisableShader(void); // Disable shader progra
RLAPI void rlEnableFramebuffer(unsigned int id); // Enable render texture (fbo)
RLAPI void rlDisableFramebuffer(void); // Disable render texture (fbo), return to default framebuffer
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
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 rlScissor(int x, int y, int width, int height); // Scissor test
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 float rlGetLineWidth(void); // Get the line drawing width
RLAPI void rlEnableSmoothLines(void); // Enable line aliasing
@@ -787,13 +800,17 @@ RLAPI void rlLoadDrawQuad(void); // Load and draw a quad
#define GLAD_FREE RL_FREE
#define GLAD_GL_IMPLEMENTATION
- #include "external/glad.h" // GLAD extensions loading library, includes OpenGL headers
+ #include "external/glad.h" // GLAD extensions loading library, includes OpenGL headers
#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,
// 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
#include "external/glad_gles2.h"
#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
// 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 PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor);
@@ -887,8 +904,10 @@ RLAPI void rlLoadDrawQuad(void); // Load and draw a quad
#if defined(GRAPHICS_API_OPENGL_ES2)
#define glClearDepth glClearDepthf
- #define GL_READ_FRAMEBUFFER GL_FRAMEBUFFER
- #define GL_DRAW_FRAMEBUFFER GL_FRAMEBUFFER
+ #if !defined(GRAPHICS_API_OPENGL_ES3)
+ #define GL_READ_FRAMEBUFFER GL_FRAMEBUFFER
+ #define GL_DRAW_FRAMEBUFFER GL_FRAMEBUFFER
+ #endif
#endif
// Default shader vertex attribute names to set location points
@@ -999,6 +1018,7 @@ typedef struct rlglData {
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 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 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)
@@ -1026,7 +1046,7 @@ typedef void *(*rlglLoadProc)(const char *name); // OpenGL extension functions
static rlglData RLGL = { 0 };
#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)
static PFNGLGENVERTEXARRAYSOESPROC glGenVertexArrays = NULL;
static PFNGLBINDVERTEXARRAYOESPROC glBindVertexArray = NULL;
@@ -1045,7 +1065,7 @@ static PFNGLVERTEXATTRIBDIVISOREXTPROC glVertexAttribDivisor = NULL;
static void rlLoadShaderDefault(void); // Load default shader
static void rlUnloadShaderDefault(void); // Unload default shader
#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 // 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 + 1] = RLGL.State.texcoordy;
- // TODO: Add current normal
- // By default rlVertexBuffer type does not store normals
+ // WARNING: By default rlVertexBuffer struct does not store normals
// Add current color
RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter] = RLGL.State.colorr;
@@ -1702,11 +1721,19 @@ void rlDisableFramebuffer(void)
#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
// NOTE: One color buffer is always active by default
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,
// it can be queried with glGet*() but it must be at least 8
//GLint maxDrawBuffers = 0;
@@ -1718,6 +1745,16 @@ void rlActiveDrawBuffers(int count)
else
{
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_ATTACHMENT1,
GL_COLOR_ATTACHMENT2,
@@ -1726,9 +1763,14 @@ void rlActiveDrawBuffers(int count)
GL_COLOR_ATTACHMENT5,
GL_COLOR_ATTACHMENT6,
GL_COLOR_ATTACHMENT7,
+#endif
};
+#if defined(GRAPHICS_API_OPENGL_ES3)
+ glDrawBuffersEXT(count, buffers);
+#else
glDrawBuffers(count, buffers);
+#endif
}
}
else TRACELOG(LOG_WARNING, "GL: One color buffer active by default");
@@ -1792,6 +1834,14 @@ void rlEnableWireMode(void)
#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
void rlDisableWireMode(void)
{
@@ -2047,7 +2097,7 @@ void rlglInit(int width, int height)
if ((glDebugMessageCallback != NULL) && (glDebugMessageControl != NULL))
{
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:
// - 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.texNPOT = GLAD_GL_ARB_texture_non_power_of_two;
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.maxDepthBits = 32;
RLGL.ExtSupported.texAnisoFilter = GLAD_GL_EXT_texture_filter_anisotropic;
@@ -2179,6 +2230,7 @@ void rlLoadExtensions(void *loader)
RLGL.ExtSupported.instancing = true;
RLGL.ExtSupported.texNPOT = true;
RLGL.ExtSupported.texFloat32 = true;
+ RLGL.ExtSupported.texFloat16 = true;
RLGL.ExtSupported.texDepth = true;
RLGL.ExtSupported.maxDepthBits = 32;
RLGL.ExtSupported.texAnisoFilter = true;
@@ -2196,11 +2248,35 @@ void rlLoadExtensions(void *loader)
#endif // GRAPHICS_API_OPENGL_33
-#if defined(GRAPHICS_API_OPENGL_ES2)
-
- #if defined(PLATFORM_DESKTOP)
+#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;
+
+#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");
- else TRACELOG(RL_LOG_INFO, "GLAD: OpenGL ES2.0 loaded successfully");
+ else TRACELOG(RL_LOG_INFO, "GLAD: OpenGL ES 2.0 loaded successfully");
#endif
// Get supported extensions list
@@ -2276,6 +2352,7 @@ void rlLoadExtensions(void *loader)
// 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_half_float") == 0) RLGL.ExtSupported.texFloat16 = true;
// Check depth texture support
if (strcmp(extList[i], (const char *)"GL_OES_depth_texture") == 0) RLGL.ExtSupported.texDepth = true;
@@ -2391,15 +2468,17 @@ int rlGetVersion(void)
#endif
#if defined(GRAPHICS_API_OPENGL_21)
glVersion = RL_OPENGL_21;
+#elif defined(GRAPHICS_API_OPENGL_43)
+ glVersion = RL_OPENGL_43;
#elif defined(GRAPHICS_API_OPENGL_33)
glVersion = RL_OPENGL_33;
#endif
-#if defined(GRAPHICS_API_OPENGL_43)
- glVersion = RL_OPENGL_43;
-#endif
-#if defined(GRAPHICS_API_OPENGL_ES2)
+#if defined(GRAPHICS_API_OPENGL_ES3)
+ glVersion = RL_OPENGL_ES_30;
+#elif defined(GRAPHICS_API_OPENGL_ES2)
glVersion = RL_OPENGL_ES_20;
#endif
+
return glVersion;
}
@@ -2648,7 +2727,7 @@ void rlDrawRenderBatch(rlRenderBatch *batch)
// Update batch vertex buffers
//------------------------------------------------------------------------------------------------------------
// 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)
{
// Activate elements VAO
@@ -2943,7 +3022,11 @@ unsigned int rlLoadTexture(const void *data, int width, int height, int format,
int mipWidth = width;
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
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);
- 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)
- 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
#if defined(GRAPHICS_API_OPENGL_33)
@@ -2982,7 +3065,8 @@ unsigned int rlLoadTexture(const void *data, int width, int height, int format,
mipWidth /= 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
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
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)
// while other platforms using OpenGL ES 2.0 require/support sized internal formats depending on the GPU capabilities
if (!RLGL.ExtSupported.texDepthWebGL || useRenderBuffer)
@@ -3108,7 +3192,7 @@ unsigned int rlLoadTextureCubemap(const void *data, int size, int format)
unsigned int glInternalFormat, glFormat, glType;
rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType);
- if (glInternalFormat != -1)
+ if (glInternalFormat != 0)
{
// Load cubemap faces
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_UNCOMPRESSED_R32G32B32)
- {
- // 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)
- 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");
+ if ((format == RL_PIXELFORMAT_UNCOMPRESSED_R32) || (format == RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32)
+ || (format == RL_PIXELFORMAT_UNCOMPRESSED_R16) || (format == RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16))
+ 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 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;
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);
}
@@ -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_R8G8B8A8: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_BYTE; break;
#if !defined(GRAPHICS_API_OPENGL_11)
- 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_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_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_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
+ #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
#elif defined(GRAPHICS_API_OPENGL_33)
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_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_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
#if !defined(GRAPHICS_API_OPENGL_11)
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);
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);
glGetTexImage(GL_TEXTURE_2D, 0, glFormat, glType, pixels);
@@ -3466,11 +3567,14 @@ bool rlFramebufferComplete(unsigned int id)
void rlUnloadFramebuffer(unsigned int id)
{
#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT)
-
// Query depth attachment to automatically delete texture/renderbuffer
int depthType = 0, depthId = 0;
glBindFramebuffer(GL_FRAMEBUFFER, id); // Bind framebuffer to query depth texture type
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);
unsigned int depthIdU = (unsigned int)depthId;
@@ -3616,7 +3720,11 @@ void rlDrawVertexArray(int offset, int count)
// Draw vertex array elements
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
@@ -3631,7 +3739,11 @@ void rlDrawVertexArrayInstanced(int offset, int count, int instances)
void rlDrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances)
{
#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
}
@@ -3923,8 +4035,8 @@ int rlGetLocationUniform(unsigned int shaderId, const char *uniformName)
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
location = glGetUniformLocation(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);
+ //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);
#endif
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)
location = glGetAttribLocation(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);
+ //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);
#endif
return location;
}
@@ -4091,7 +4203,7 @@ unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHi
glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
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);
#endif
@@ -4162,7 +4274,7 @@ void rlBindImageTexture(unsigned int id, unsigned int index, int format, bool re
unsigned int glInternalFormat = 0, glFormat = 0, glType = 0;
rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType);
- glBindImageTexture(index, id, 0, 0, 0, readonly ? GL_READ_ONLY : GL_READ_WRITE, glInternalFormat);
+ glBindImageTexture(index, id, 0, 0, 0, readonly? GL_READ_ONLY : GL_READ_WRITE, glInternalFormat);
#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_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_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_RGBA: return "DXT1_RGBA"; break; // 4 bpp (1 bit alpha)
case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: return "DXT3_RGBA"; break; // 8 bpp
@@ -4476,6 +4591,7 @@ static void rlLoadShaderDefault(void)
#endif
#if defined(GRAPHICS_API_OPENGL_ES2)
"#version 100 \n"
+ "precision mediump float; \n" // Precision required for OpenGL ES2 (WebGL) (on some browsers)
"attribute vec3 vertexPosition; \n"
"attribute vec2 vertexTexCoord; \n"
"attribute vec4 vertexColor; \n"
@@ -4574,7 +4690,7 @@ static void rlUnloadShaderDefault(void)
#if defined(RLGL_SHOW_GL_DETAILS_INFO)
// Get compressed format official GL identifier name
-static char *rlGetCompressedFormatName(int format)
+static const char *rlGetCompressedFormatName(int 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_R32G32B32: bpp = 32*3; 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_RGBA:
case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB:
diff --git a/include/shapes.h b/include/shapes.h
index 3fde097..50fb156 100644
--- a/include/shapes.h
+++ b/include/shapes.h
@@ -5,8 +5,6 @@ int lshapesSetShapesTexture( lua_State *L );
int lshapesDrawPixel( lua_State *L );
int lshapesDrawLine( lua_State *L );
int lshapesDrawLineBezier( lua_State *L );
-int lshapesDrawLineBezierQuad( lua_State *L );
-int lshapesDrawLineBezierCubic( lua_State *L );
int lshapesDrawLineStrip( lua_State *L );
int lshapesDrawCircle( lua_State *L );
int lshapesDrawCircleSector( lua_State *L );
diff --git a/include/text.h b/include/text.h
index a0b5c05..a38f979 100644
--- a/include/text.h
+++ b/include/text.h
@@ -17,6 +17,7 @@ int ltextDrawTextCodepoints( lua_State *L );
int ltextDrawTextBoxed( lua_State *L );
int ltextDrawTextBoxedTinted( lua_State *L );
/* Text font info functions. */
+int ltextSetTextLineSpacing( lua_State *L );
int ltextMeasureText( lua_State *L );
int ltextGetGlyphIndex( lua_State *L );
int ltextGetGlyphInfo( lua_State *L );
diff --git a/include/textures.h b/include/textures.h
index 82cb1b9..efac9f2 100644
--- a/include/textures.h
+++ b/include/textures.h
@@ -3,6 +3,7 @@
/* Image loading functions. */
int ltexturesLoadImage( lua_State *L );
int ltexturesLoadImageRaw( lua_State *L );
+int ltexturesLoadImageSvg( lua_State *L );
int ltexturesLoadImageAnim( lua_State *L );
int ltexturesLoadImageFromMemory( lua_State *L );
int ltexturesLoadImageFromTexture( lua_State *L );
@@ -10,12 +11,13 @@ int ltexturesLoadImageFromScreen( lua_State *L );
int ltextureIsImageReady( lua_State *L );
int ltextureUnloadImage( lua_State *L );
int ltexturesExportImage( lua_State *L );
+int ltexturesExportImageToMemory( lua_State *L );
int ltexturesExportImageAsCode( lua_State *L );
/* Image generation functions. */
int ltexturesGenImageColor( lua_State *L );
-int ltexturesGenImageGradientV( lua_State *L );
-int ltexturesGenImageGradientH( lua_State *L );
+int ltexturesGenImageGradientLinear( lua_State *L );
int ltexturesGenImageGradientRadial( lua_State *L );
+int ltexturesGenImageGradientSquare( lua_State *L );
int ltexturesGenImageChecked( lua_State *L );
int ltexturesGenImageWhiteNoise( lua_State *L );
int ltexturesGenImagePerlinNoise( lua_State *L );
@@ -40,6 +42,7 @@ int ltexturesImageMipmaps( lua_State *L );
int ltexturesImageDither( lua_State *L );
int ltexturesImageFlipVertical( lua_State *L );
int ltexturesImageFlipHorizontal( lua_State *L );
+int ltexturesImageRotate( lua_State *L );
int ltexturesImageRotateCW( lua_State *L );
int ltexturesImageRotateCCW( lua_State *L );
int ltexturesImageColorTint( lua_State *L );
diff --git a/src/audio.c b/src/audio.c
index 0b793b2..ef466cb 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -8,6 +8,41 @@
*/
/*
+> 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 )
Set master volume (listener)
@@ -21,6 +56,19 @@ int laudioSetMasterVolume( lua_State *L ) {
}
/*
+> 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
*/
@@ -95,6 +143,21 @@ int laudioLoadSoundFromWave( lua_State *L ) {
}
/*
+> 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 )
Checks if a sound is ready
@@ -136,6 +199,19 @@ int laudioUnloadSound( lua_State *L ) {
}
/*
+> 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 )
Export wave data to file, returns true on success
diff --git a/src/core.c b/src/core.c
index 4271e68..2ad6bf8 100644
--- a/src/core.c
+++ b/src/core.c
@@ -29,6 +29,17 @@ void unloadBuffer( Buffer *buffer ) {
*/
/*
+> 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()
Check if window has been initialized successfully
@@ -107,243 +118,292 @@ int lcoreIsWindowFocused( lua_State *L ) {
}
/*
-> RL.SetWindowMonitor( int monitor )
+> resized = RL.IsWindowResized()
-Set monitor for the current window (fullscreen mode)
-*/
-int lcoreSetWindowMonitor( lua_State *L ) {
- int monitor = luaL_checkinteger( L, 1 );
+Check if window has been resized from last frame
- SetWindowMonitor( monitor );
+- Success return bool
+*/
+int lcoreIsWindowResized( lua_State *L ) {
+ lua_pushboolean( L, IsWindowResized() );
- return 0;
+ return 1;
}
/*
-> RL.SetWindowPosition( Vector2 pos )
+> state = RL.IsWindowState( int flag )
-Set window position on screen
+Check if one specific window flag is enabled (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
+
+- Success return bool
*/
-int lcoreSetWindowPosition( lua_State *L ) {
- Vector2 pos = uluaGetVector2( L, 1 );
+int lcoreIsWindowState( lua_State *L ) {
+ unsigned int flag = (unsigned int)luaL_checkinteger( L, 1 );
- SetWindowPosition( pos.x, pos.y );
+ lua_pushboolean( L, IsWindowState( flag ) );
- return 0;
+ return 1;
}
/*
-> RL.SetWindowSize( Vector2 size )
+> RL.SetWindowState( int flag )
-Set window dimensions
+Set window configuration state using flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
*/
-int lcoreSetWindowSize( lua_State *L ) {
- Vector2 size = uluaGetVector2( L, 1 );
+int lcoreSetWindowState( lua_State *L ) {
+ unsigned int flag = (unsigned int)luaL_checkinteger( L, 1 );
- SetWindowSize( (int)size.x, (int)size.y );
+ SetWindowState( flag );
return 0;
}
/*
-> RL.SetWindowOpacity( float opacity )
+> resized = RL.ClearWindowState( int flag )
-Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
+Clear window configuration state flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
+
+- Success return bool
*/
-int lcoreSetWindowOpacity( lua_State *L ) {
- float opacity = luaL_checknumber( L, 1 );
+int lcoreClearWindowState( lua_State *L ) {
+ unsigned int flag = (unsigned int)luaL_checkinteger( L, 1 );
- SetWindowOpacity( opacity );
+ ClearWindowState( flag );
- return 0;
+ return 1;
}
/*
-> windowHandle = RL.GetWindowHandle()
+> RL.ToggleFullscreen()
-Get native window handle. Return as lightuserdata
+Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
+*/
+int lcoreToggleFullscreen( lua_State *L ) {
+ ToggleFullscreen();
-- Success return lightuserdata
+ return 0;
+}
+
+/*
+> RL.ToggleBorderlessWindowed()
+
+Toggle window state: borderless windowed (only PLATFORM_DESKTOP)
*/
-int lcoreGetWindowHandle( lua_State *L ) {
- lua_pushlightuserdata( L, GetWindowHandle() );
+int lcoreToggleBorderlessWindowed( lua_State *L ) {
+ ToggleBorderlessWindowed();
- return 1;
+ return 0;
}
/*
-> RL.SetWindowMinSize( Vector2 size )
+> RL.MaximizeWindow()
-Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
+Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
*/
-int lcoreSetWindowMinSize( lua_State *L ) {
- Vector2 size = uluaGetVector2( L, 1 );
+int lcoreMaximizeWindow( lua_State *L ) {
+ MaximizeWindow();
- SetWindowMinSize( (int)size.x, (int)size.y );
+ return 0;
+}
+
+/*
+> RL.MinimizeWindow()
+
+Set window state: minimized, if resizable (only PLATFORM_DESKTOP)
+*/
+int lcoreMinimizeWindow( lua_State *L ) {
+ MinimizeWindow();
return 0;
}
/*
-> position = RL.GetMonitorPosition( int monitor )
+> RL.RestoreWindow()
-Get specified monitor position
+Set window state: not minimized/maximized (only PLATFORM_DESKTOP)
+*/
+int lcoreRestoreWindow( lua_State *L ) {
+ RestoreWindow();
-- Success return Vector2
+ return 0;
+}
+
+/*
+> RL.SetWindowIcon( Image image )
+
+Set icon for window (Only PLATFORM_DESKTOP)
*/
-int lcoreGetMonitorPosition( lua_State *L ) {
- int monitor = luaL_checkinteger( L, 1 );
+int lcoreSetWindowIcon( lua_State *L ) {
+ Image *image = uluaGetImage( L, 1 );
- uluaPushVector2( L, GetMonitorPosition( monitor ) );
+ SetWindowIcon( *image );
- return 1;
+ return 0;
}
/*
-> size = RL.GetMonitorSize( int monitor )
-
-Get specified monitor size
+> RL.SetWindowIcons( Image{} images )
-- Success return Vector2
+Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP)
*/
-int lcoreGetMonitorSize( lua_State *L ) {
- int monitor = luaL_checkinteger( L, 1 );
+int lcoreSetWindowIcons( lua_State *L ) {
+ int count = uluaGetTableLen( L, 1 );
+ Image images[ count ];
- Vector2 size = (Vector2){ GetMonitorWidth( monitor ), GetMonitorHeight( monitor ) };
- uluaPushVector2( L, size );
+ int t = 1;
+ int i = 0;
+ lua_pushnil( L );
- return 1;
+ while ( lua_next( L, t ) != 0 ) {
+ images[i] = *uluaGetImage( L, lua_gettop( L ) );
+
+ i++;
+ lua_pop( L, 1 );
+ }
+ SetWindowIcons( images, count );
+
+ return 0;
}
/*
-> position = RL.GetWindowPosition()
-
-Get window position on monitor
+> RL.SetWindowTitle( string title )
-- Success return Vector2
+Set title for window (only PLATFORM_DESKTOP and PLATFORM_WEB)
*/
-int lcoreGetWindowPosition( lua_State *L ) {
- uluaPushVector2( L, GetWindowPosition() );
+int lcoreSetWindowTitle( lua_State *L ) {
+ SetWindowTitle( luaL_checkstring( L, 1 ) );
- return 1;
+ return 0;
}
/*
-> size = RL.GetScreenSize()
-
-Get screen size
+> RL.SetWindowPosition( Vector2 pos )
-- Success return Vector2
+Set window position on screen
*/
-int lcoreGetScreenSize( lua_State *L ) {
- Vector2 size = (Vector2){ GetScreenWidth(), GetScreenHeight() };
- uluaPushVector2( L, size );
+int lcoreSetWindowPosition( lua_State *L ) {
+ Vector2 pos = uluaGetVector2( L, 1 );
- return 1;
+ SetWindowPosition( pos.x, pos.y );
+
+ return 0;
}
/*
-> RL.SetWindowState( int flag )
+> RL.SetWindowMonitor( int monitor )
-Set window configuration state using flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
+Set monitor for the current window
*/
-int lcoreSetWindowState( lua_State *L ) {
- unsigned int flag = (unsigned int)luaL_checkinteger( L, 1 );
+int lcoreSetWindowMonitor( lua_State *L ) {
+ int monitor = luaL_checkinteger( L, 1 );
- SetWindowState( flag );
+ SetWindowMonitor( monitor );
return 0;
}
/*
-> state = RL.IsWindowState( int flag )
-
-Check if one specific window flag is enabled (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
+> RL.SetWindowMinSize( Vector2 size )
-- Success return bool
+Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
*/
-int lcoreIsWindowState( lua_State *L ) {
- unsigned int flag = (unsigned int)luaL_checkinteger( L, 1 );
+int lcoreSetWindowMinSize( lua_State *L ) {
+ Vector2 size = uluaGetVector2( L, 1 );
- lua_pushboolean( L, IsWindowState( flag ) );
+ SetWindowMinSize( (int)size.x, (int)size.y );
- return 1;
+ return 0;
}
/*
-> resized = RL.ClearWindowState( int flag )
-
-Clear window configuration state flags (FLAG_FULLSCREEN_MODE, FLAG_WINDOW_RESIZABLE...)
+> RL.SetWindowMaxSize( Vector2 size )
-- Success return bool
+Set window maximum dimensions (for FLAG_WINDOW_RESIZABLE)
*/
-int lcoreClearWindowState( lua_State *L ) {
- unsigned int flag = (unsigned int)luaL_checkinteger( L, 1 );
+int lcoreSetWindowMaxSize( lua_State *L ) {
+ Vector2 size = uluaGetVector2( L, 1 );
- ClearWindowState( flag );
+ SetWindowMaxSize( (int)size.x, (int)size.y );
- return 1;
+ return 0;
}
/*
-> resized = RL.IsWindowResized()
-
-Check if window has been resized from last frame
+> RL.SetWindowSize( Vector2 size )
-- Success return bool
+Set window dimensions
*/
-int lcoreIsWindowResized( lua_State *L ) {
- lua_pushboolean( L, IsWindowResized() );
+int lcoreSetWindowSize( lua_State *L ) {
+ Vector2 size = uluaGetVector2( L, 1 );
- return 1;
+ SetWindowSize( (int)size.x, (int)size.y );
+
+ return 0;
}
/*
-> RL.SetWindowIcon( Image image )
+> RL.SetWindowOpacity( float opacity )
-Set icon for window (Only PLATFORM_DESKTOP)
+Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
*/
-int lcoreSetWindowIcon( lua_State *L ) {
- Image *image = uluaGetImage( L, 1 );
+int lcoreSetWindowOpacity( lua_State *L ) {
+ float opacity = luaL_checknumber( L, 1 );
- SetWindowIcon( *image );
+ SetWindowOpacity( opacity );
return 0;
}
/*
-> RL.SetWindowIcons( Image{} images )
+> RL.SetWindowFocused()
-Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP)
+Set window focused (only PLATFORM_DESKTOP)
*/
-int lcoreSetWindowIcons( lua_State *L ) {
- int count = uluaGetTableLen( L, 1 );
- Image images[ count ];
+int lcoreSetWindowFocused( lua_State *L ) {
+ SetWindowFocused();
- int t = 1;
- int i = 0;
- lua_pushnil( L );
+ return 0;
+}
- while ( lua_next( L, t ) != 0 ) {
- images[i] = *uluaGetImage( L, lua_gettop( L ) );
+/*
+> windowHandle = RL.GetWindowHandle()
- i++;
- lua_pop( L, 1 );
- }
- SetWindowIcons( images, count );
+Get native window handle. Return as lightuserdata
- return 0;
+- Success return lightuserdata
+*/
+int lcoreGetWindowHandle( lua_State *L ) {
+ lua_pushlightuserdata( L, GetWindowHandle() );
+
+ return 1;
}
/*
-> RL.SetWindowTitle( string title )
+> size = RL.GetScreenSize()
+
+Get screen size
-Set title for window (Only PLATFORM_DESKTOP)
+- Success return Vector2
*/
-int lcoreSetWindowTitle( lua_State *L ) {
- SetWindowTitle( luaL_checkstring( L, 1 ) );
+int lcoreGetScreenSize( lua_State *L ) {
+ Vector2 size = (Vector2){ GetScreenWidth(), GetScreenHeight() };
+ uluaPushVector2( L, size );
- return 0;
+ 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;
}
/*
@@ -373,6 +433,37 @@ int lcoreGetCurrentMonitor( lua_State *L ) {
}
/*
+> 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 )
Get specified monitor physical size in millimetres
@@ -404,6 +495,19 @@ int lcoreGetMonitorRefreshRate( lua_State *L ) {
}
/*
+> position = RL.GetWindowPosition()
+
+Get window position on monitor
+
+- Success return Vector2
+*/
+int lcoreGetWindowPosition( lua_State *L ) {
+ uluaPushVector2( L, GetWindowPosition() );
+
+ return 1;
+}
+
+/*
> dpi = RL.GetWindowScaleDPI()
Get window scale DPI factor
@@ -419,7 +523,7 @@ int lcoreGetWindowScaleDPI( lua_State *L ) {
/*
> 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
*/
@@ -432,17 +536,6 @@ int lcoreGetMonitorName( lua_State *L ) {
}
/*
-> 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 )
Set clipboard text content
@@ -1152,6 +1245,63 @@ int lcoreGetTime( lua_State *L ) {
}
/*
+## 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
*/
@@ -1232,7 +1382,7 @@ int lcoreGetLogLevelInvalid( lua_State *L ) {
/*
> 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 ) {
OpenURL( luaL_checkstring( L, 1 ) );
@@ -1412,6 +1562,19 @@ int lcoreGetWorkingDirectory( lua_State *L ) {
}
/*
+> 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 )
Load directory filepaths
@@ -1794,6 +1957,21 @@ int lcoreIsGamepadAvailable( lua_State *L ) {
}
/*
+> 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 )
Detect if a gamepad button has been pressed once
@@ -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 gamepad = luaL_checkinteger( L, 1 );
+int lcoreSetGamepadMappings( lua_State *L ) {
+ const char *mappings = luaL_checkstring( L, 1 );
- lua_pushstring( L, GetGamepadName( gamepad ) );
+ lua_pushnumber( L, SetGamepadMappings( mappings ) );
return 1;
}
diff --git a/src/lua_core.c b/src/lua_core.c
index fe9d8c7..40bb0c4 100644
--- a/src/lua_core.c
+++ b/src/lua_core.c
@@ -1522,36 +1522,44 @@ void luaRegister() {
/* Core. */
/* Window-related functions. */
+ assingGlobalFunction( "CloseWindow", lcoreCloseWindow );
assingGlobalFunction( "IsWindowReady", lcoreIsWindowReady );
assingGlobalFunction( "IsWindowFullscreen", lcoreIsWindowFullscreen );
assingGlobalFunction( "IsWindowHidden", lcoreIsWindowHidden );
assingGlobalFunction( "IsWindowMinimized", lcoreIsWindowMinimized );
assingGlobalFunction( "IsWindowMaximized", lcoreIsWindowMaximized );
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( "IsWindowResized", lcoreIsWindowResized );
assingGlobalFunction( "IsWindowState", lcoreIsWindowState );
+ assingGlobalFunction( "SetWindowState", lcoreSetWindowState );
assingGlobalFunction( "ClearWindowState", lcoreClearWindowState );
- assingGlobalFunction( "IsWindowResized", lcoreIsWindowResized );
+ assingGlobalFunction( "ToggleFullscreen", lcoreToggleFullscreen );
+ assingGlobalFunction( "ToggleBorderlessWindowed", lcoreToggleBorderlessWindowed );
+ assingGlobalFunction( "MaximizeWindow", lcoreMaximizeWindow );
+ assingGlobalFunction( "MinimizeWindow", lcoreMinimizeWindow );
+ assingGlobalFunction( "RestoreWindow", lcoreRestoreWindow );
assingGlobalFunction( "SetWindowIcon", lcoreSetWindowIcon );
assingGlobalFunction( "SetWindowIcons", lcoreSetWindowIcons );
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( "GetCurrentMonitor", lcoreGetCurrentMonitor );
+ assingGlobalFunction( "GetMonitorPosition", lcoreGetMonitorPosition );
+ assingGlobalFunction( "GetMonitorSize", lcoreGetMonitorSize );
assingGlobalFunction( "GetMonitorPhysicalSize", lcoreGetMonitorPhysicalSize );
assingGlobalFunction( "GetMonitorRefreshRate", lcoreGetMonitorRefreshRate );
+ assingGlobalFunction( "GetWindowPosition", lcoreGetWindowPosition );
assingGlobalFunction( "GetWindowScaleDPI", lcoreGetWindowScaleDPI );
assingGlobalFunction( "GetMonitorName", lcoreGetMonitorName );
- assingGlobalFunction( "CloseWindow", lcoreCloseWindow );
assingGlobalFunction( "SetClipboardText", lcoreSetClipboardText );
assingGlobalFunction( "GetClipboardText", lcoreGetClipboardText );
/* Cursor-related functions. */
@@ -1603,6 +1611,10 @@ void luaRegister() {
assingGlobalFunction( "GetFPS", lcoreGetFPS );
assingGlobalFunction( "GetFrameTime", lcoreGetFrameTime );
assingGlobalFunction( "GetTime", lcoreGetTime );
+ /* Random values generation functions. */
+ assingGlobalFunction( "SetRandomSeed", lcoreSetRandomSeed );
+ assingGlobalFunction( "GetRandomValue", lcoreGetRandomValue );
+ assingGlobalFunction( "LoadRandomSequence", lcoreLoadRandomSequence );
/* Misc. functions. */
assingGlobalFunction( "TakeScreenshot", lcoreTakeScreenshot );
assingGlobalFunction( "SetConfigFlags", lcoreSetConfigFlags );
@@ -1625,6 +1637,7 @@ void luaRegister() {
assingGlobalFunction( "GetDirectoryPath", lcoreGetDirectoryPath );
assingGlobalFunction( "GetPrevDirectoryPath", lcoreGetPrevDirectoryPath );
assingGlobalFunction( "GetWorkingDirectory", lcoreGetWorkingDirectory );
+ assingGlobalFunction( "GetApplicationDirectory", lcoreGetApplicationDirectory );
assingGlobalFunction( "LoadDirectoryFiles", lcoreLoadDirectoryFiles );
assingGlobalFunction( "LoadDirectoryFilesEx", lcoreLoadDirectoryFilesEx );
assingGlobalFunction( "ChangeDirectory", lcoreChangeDirectory );
@@ -1649,12 +1662,13 @@ void luaRegister() {
assingGlobalFunction( "GetKeyScancode", lcoreGetKeyScancode );
/* Input-related functions: gamepads. */
assingGlobalFunction( "IsGamepadAvailable", lcoreIsGamepadAvailable );
+ assingGlobalFunction( "GetGamepadName", lcoreGetGamepadName );
assingGlobalFunction( "IsGamepadButtonPressed", lcoreIsGamepadButtonPressed );
assingGlobalFunction( "IsGamepadButtonDown", lcoreIsGamepadButtonDown );
assingGlobalFunction( "IsGamepadButtonReleased", lcoreIsGamepadButtonReleased );
assingGlobalFunction( "GetGamepadAxisCount", lcoreGetGamepadAxisCount );
assingGlobalFunction( "GetGamepadAxisMovement", lcoreGetGamepadAxisMovement );
- assingGlobalFunction( "GetGamepadName", lcoreGetGamepadName );
+ assingGlobalFunction( "SetGamepadMappings", lcoreSetGamepadMappings );
/* Input-related functions: mouse. */
assingGlobalFunction( "IsMouseButtonPressed", lcoreIsMouseButtonPressed );
assingGlobalFunction( "IsMouseButtonDown", lcoreIsMouseButtonDown );
@@ -1731,8 +1745,6 @@ void luaRegister() {
assingGlobalFunction( "DrawPixel", lshapesDrawPixel );
assingGlobalFunction( "DrawLine", lshapesDrawLine );
assingGlobalFunction( "DrawLineBezier", lshapesDrawLineBezier );
- assingGlobalFunction( "DrawLineBezierQuad", lshapesDrawLineBezierQuad );
- assingGlobalFunction( "DrawLineBezierCubic", lshapesDrawLineBezierCubic );
assingGlobalFunction( "DrawLineStrip", lshapesDrawLineStrip );
assingGlobalFunction( "DrawCircle", lshapesDrawCircle );
assingGlobalFunction( "DrawCircleSector", lshapesDrawCircleSector );
@@ -1775,6 +1787,7 @@ void luaRegister() {
/* Image loading functions. */
assingGlobalFunction( "LoadImage", ltexturesLoadImage );
assingGlobalFunction( "LoadImageRaw", ltexturesLoadImageRaw );
+ assingGlobalFunction( "LoadImageSvg", ltexturesLoadImageSvg );
assingGlobalFunction( "LoadImageAnim", ltexturesLoadImageAnim );
assingGlobalFunction( "LoadImageFromMemory", ltexturesLoadImageFromMemory );
assingGlobalFunction( "LoadImageFromTexture", ltexturesLoadImageFromTexture );
@@ -1782,12 +1795,13 @@ void luaRegister() {
assingGlobalFunction( "IsImageReady", ltextureIsImageReady );
assingGlobalFunction( "UnloadImage", ltextureUnloadImage );
assingGlobalFunction( "ExportImage", ltexturesExportImage );
+ assingGlobalFunction( "ExportImageToMemory", ltexturesExportImageToMemory );
assingGlobalFunction( "ExportImageAsCode", ltexturesExportImageAsCode );
/* Image generation functions. */
assingGlobalFunction( "GenImageColor", ltexturesGenImageColor );
- assingGlobalFunction( "GenImageGradientV", ltexturesGenImageGradientV );
- assingGlobalFunction( "GenImageGradientH", ltexturesGenImageGradientH );
+ assingGlobalFunction( "GenImageGradientLinear", ltexturesGenImageGradientLinear );
assingGlobalFunction( "GenImageGradientRadial", ltexturesGenImageGradientRadial );
+ assingGlobalFunction( "GenImageGradientSquare", ltexturesGenImageGradientSquare );
assingGlobalFunction( "GenImageChecked", ltexturesGenImageChecked );
assingGlobalFunction( "GenImageWhiteNoise", ltexturesGenImageWhiteNoise );
assingGlobalFunction( "GenImagePerlinNoise", ltexturesGenImagePerlinNoise );
@@ -1812,6 +1826,7 @@ void luaRegister() {
assingGlobalFunction( "ImageDither", ltexturesImageDither );
assingGlobalFunction( "ImageFlipVertical", ltexturesImageFlipVertical );
assingGlobalFunction( "ImageFlipHorizontal", ltexturesImageFlipHorizontal );
+ assingGlobalFunction( "ImageRotate", ltexturesImageRotate );
assingGlobalFunction( "ImageRotateCW", ltexturesImageRotateCW );
assingGlobalFunction( "ImageRotateCCW", ltexturesImageRotateCCW );
assingGlobalFunction( "ImageColorTint", ltexturesImageColorTint );
@@ -1995,6 +2010,7 @@ void luaRegister() {
assingGlobalFunction( "DrawTextBoxed", ltextDrawTextBoxed );
assingGlobalFunction( "DrawTextBoxedTinted", ltextDrawTextBoxedTinted );
/* Text font info functions. */
+ assingGlobalFunction( "SetTextLineSpacing", ltextSetTextLineSpacing );
assingGlobalFunction( "MeasureText", ltextMeasureText );
assingGlobalFunction( "GetGlyphIndex", ltextGetGlyphIndex );
assingGlobalFunction( "GetGlyphInfo", ltextGetGlyphInfo );
@@ -2006,15 +2022,21 @@ void luaRegister() {
/* Audio. */
/* Audio device management functions. */
+ assingGlobalFunction( "InitAudioDevice", laudioInitAudioDevice );
+ assingGlobalFunction( "CloseAudioDevice", laudioCloseAudioDevice );
+ assingGlobalFunction( "IsAudioDeviceReady", laudioIsAudioDeviceReady );
assingGlobalFunction( "SetMasterVolume", laudioSetMasterVolume );
+ assingGlobalFunction( "GetMasterVolume", laudioGetMasterVolume );
/* Wave/Sound loading/unloading functions. */
assingGlobalFunction( "LoadSound", laudioLoadSound );
assingGlobalFunction( "LoadWave", laudioLoadWave );
assingGlobalFunction( "IsWaveReady", laudioIsWaveReady );
assingGlobalFunction( "LoadSoundFromWave", laudioLoadSoundFromWave );
+ assingGlobalFunction( "LoadSoundAlias", laudioLoadSoundAlias );
assingGlobalFunction( "IsSoundReady", laudioIsSoundReady );
assingGlobalFunction( "UnloadWave", laudioUnloadWave );
assingGlobalFunction( "UnloadSound", laudioUnloadSound );
+ assingGlobalFunction( "UnloadSoundAlias", laudioUnloadSoundAlias );
assingGlobalFunction( "ExportWave", laudioExportWave );
assingGlobalFunction( "ExportWaveAsCode", laudioExportWaveAsCode );
/* Wave/Sound management functions. */
diff --git a/src/shapes.c b/src/shapes.c
index c68504c..80e5f05 100644
--- a/src/shapes.c
+++ b/src/shapes.c
@@ -55,57 +55,6 @@ int lshapesDrawLine( lua_State *L ) {
}
/*
-> 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 )
Draw lines sequence
@@ -131,6 +80,22 @@ int lshapesDrawLineStrip( lua_State *L ) {
}
/*
+> 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 )
Draw a color-filled circle
diff --git a/src/state.c b/src/state.c
index b2de3d9..6b93037 100644
--- a/src/state.c
+++ b/src/state.c
@@ -26,7 +26,6 @@ bool stateInit( int argn, const char **argc, const char *exePath ) {
state->run = false;
}
if ( state->run ) {
- InitAudioDevice();
state->run = luaInit( argn, argc );
}
state->defaultFont = GetFontDefault();
diff --git a/src/text.c b/src/text.c
index af7b02f..a6e0241 100644
--- a/src/text.c
+++ b/src/text.c
@@ -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
- Success return Font
@@ -205,20 +205,20 @@ int ltextLoadFontEx( lua_State *L ) {
if ( FileExists( luaL_checkstring( L, 1 ) ) ) {
if ( lua_istable( L, 3 ) ) {
- int glyphCount = uluaGetTableLen( L, 3 );
- int fontChars[ glyphCount ];
+ int codepointCount = uluaGetTableLen( L, 3 );
+ int codepoints[ codepointCount ];
int t = 3;
int i = 0;
lua_pushnil( L );
while ( lua_next( L, t ) != 0 ) {
- fontChars[i] = lua_tointeger( L, -1 );
+ codepoints[i] = lua_tointeger( L, -1 );
i++;
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;
}
@@ -374,8 +374,8 @@ int ltextDrawTextCodepoints( lua_State *L ) {
float spacing = luaL_checknumber( L, 5 );
Color tint = uluaGetColor( L, 6 );
- int count = uluaGetTableLen( L, 2 );
- int codepoints[ count ];
+ int codepointCount = uluaGetTableLen( L, 2 );
+ int codepoints[ codepointCount ];
int t = 2;
int i = 0;
@@ -387,7 +387,7 @@ int ltextDrawTextCodepoints( lua_State *L ) {
i++;
lua_pop( L, 1 );
}
- DrawTextCodepoints( *font, codepoints, count, position, fontSize, spacing, tint );
+ DrawTextCodepoints( *font, codepoints, codepointCount, position, fontSize, spacing, tint );
return 0;
}
@@ -461,6 +461,17 @@ int ltextDrawTextBoxedTinted( lua_State *L ) {
*/
/*
+> 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 )
Measure string size for Font
diff --git a/src/textures.c b/src/textures.c
index 008aa14..ef1e76e 100644
--- a/src/textures.c
+++ b/src/textures.c
@@ -54,6 +54,22 @@ int ltexturesLoadImageRaw( lua_State *L ) {
}
/*
+> 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 )
Load image sequence from file (frames appended to image.data). All frames are returned in RGBA format
@@ -163,6 +179,27 @@ int ltexturesExportImage( lua_State *L ) {
}
/*
+> 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 )
Export image as code file defining an array of bytes, returns true on success
@@ -197,53 +234,55 @@ 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
*/
-int ltexturesGenImageGradientV( lua_State *L ) {
+int ltexturesGenImageGradientLinear( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 );
- Color top = uluaGetColor( L, 2 );
- Color bottom = uluaGetColor( L, 3 );
+ int direction = luaL_checkinteger( L, 2 );
+ 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 )
+> image = RL.GenImageGradientRadial( Vector2 size, float density, Color inner, Color outer )
-Generate image: horizontal gradient
+Generate image: radial gradient
- Success return Image
*/
-int ltexturesGenImageGradientH( lua_State *L ) {
+int ltexturesGenImageGradientRadial( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 );
- Color left = uluaGetColor( L, 2 );
- Color right = uluaGetColor( L, 3 );
+ float density = luaL_checknumber( L, 2 );
+ Color inner = uluaGetColor( L, 3 );
+ Color outer = uluaGetColor( L, 4 );
- uluaPushImage( L, GenImageGradientH( (int)size.x, (int)size.y, left, right ) );
+ uluaPushImage( L, GenImageGradientRadial( (int)size.x, (int)size.y, density, inner, outer ) );
return 1;
}
/*
-> image = RL.GenImageGradientRadial( Vector2 size, float density, Color inner, Color outer )
+> image = RL.GenImageGradientSquare( Vector2 size, float density, Color inner, Color outer )
-Generate image: radial gradient
+Generate image: square gradient
- Success return Image
*/
-int ltexturesGenImageGradientRadial( lua_State *L ) {
+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, GenImageGradientRadial( (int)size.x, (int)size.y, density, inner, outer ) );
+ uluaPushImage( L, GenImageGradientSquare( (int)size.x, (int)size.y, density, inner, outer ) );
return 1;
}
@@ -593,6 +632,20 @@ int ltexturesImageFlipHorizontal( lua_State *L ) {
}
/*
+> 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 )
Rotate image clockwise 90deg