summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--API.md100
-rw-r--r--ReiLua_API.lua98
-rw-r--r--changelog18
-rw-r--r--devnotes7
-rw-r--r--examples/dungeon_crawler/main.lua5
-rw-r--r--examples/heightmap/main.lua10
-rw-r--r--examples/instancing/main.lua3
-rw-r--r--examples/iqm_test/main.lua3
-rw-r--r--examples/point_triangle_collision/main.lua4
-rw-r--r--examples/ray/main.lua3
-rw-r--r--include/audio.h6
-rw-r--r--include/core.h11
-rw-r--r--include/models.h6
-rw-r--r--include/raylib.h122
-rw-r--r--include/raymath.h33
-rw-r--r--include/rlgl.h869
-rw-r--r--include/rmath.h1
-rw-r--r--include/textures.h4
-rw-r--r--src/audio.c50
-rw-r--r--src/core.c129
-rw-r--r--src/lua_core.c25
-rw-r--r--src/models.c68
-rw-r--r--src/rmath.c25
-rw-r--r--src/state.c3
-rw-r--r--src/textures.c98
25 files changed, 744 insertions, 957 deletions
diff --git a/API.md b/API.md
index 5b92402..706511d 100644
--- a/API.md
+++ b/API.md
@@ -621,6 +621,8 @@ BLEND_ALPHA_PREMULTIPLY
BLEND_CUSTOM
+BLEND_CUSTOM_SEPARATE
+
## Globals - Gesture
GESTURE_NONE
@@ -2212,7 +2214,7 @@ Set camera offset ( displacement from target )
---
-> success = RL.SetCamera2DRotation( camera3D camera, float rotation )
+> success = RL.SetCamera2DRotation( camera2D camera, float rotation )
Set camera rotation in degrees
@@ -2221,7 +2223,7 @@ Set camera rotation in degrees
---
-> success = RL.SetCamera2DZoom( camera3D camera, float zoom )
+> success = RL.SetCamera2DZoom( camera2D camera, float zoom )
Set camera zoom ( scaling ), should be 1.0f by default
@@ -2347,15 +2349,6 @@ Set camera projection mode ( CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC )
---
-> success = RL.SetCameraMode( camera3D camera, int mode )
-
-Set camera mode ( CAMERA_CUSTOM, CAMERA_FREE, CAMERA_ORBITAL... )
-
-- Failure return false
-- Success return true
-
----
-
> position = RL.GetCamera3DPosition( camera3D camera )
Get camera position
@@ -2401,7 +2394,7 @@ Get camera projection mode
---
-> success = RL.UpdateCamera3D( camera3D camera )
+> success = RL.UpdateCamera3D( camera3D camera, int mode )
Update camera position for selected mode
@@ -2410,36 +2403,9 @@ Update camera position for selected mode
---
-> success = RL.SetCameraPanControl( int keyPan )
-
-Set camera pan key to combine with mouse movement ( free camera )
-
-- Failure return false
-- Success return true
-
----
-
-> success = RL.SetCameraAltControl( int keyAlt )
-
-Set camera alt key to combine with mouse movement ( free camera )
-
-- Failure return false
-- Success return true
-
----
-
-> success = RL.SetCameraSmoothZoomControl( int keySmoothZoom )
+> success = RL.UpdateCamera3DPro( camera3D camera, Vector3 movement, Vector3 rotation, float zoom )
-Set camera smooth zoom key to combine with mouse ( free camera )
-
-- Failure return false
-- Success return true
-
----
-
-> success = RL.SetCameraMoveControls( int keyFront, int keyBack, int keyRight, int keyLeft, int keyUp, int keyDown )
-
-Set camera move controls ( 1st person and 3rd person cameras )
+Update camera movement, movement/rotation values should be provided by user
- Failure return false
- Success return true
@@ -3488,15 +3454,6 @@ Draw a part of a texture defined by a rectangle
---
-> success = RL.DrawTextureTiled( Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, float scale, Color tint )
-
-Draw part of a texture ( defined by a rectangle ) with rotation and scale tiled into dest
-
-- Failure return false
-- Success return true
-
----
-
> success = RL.DrawTexturePro( Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint )
Draw a part of a texture defined by a rectangle with "pro" parameters
@@ -3515,15 +3472,6 @@ Draws a texture ( or part of it ) that stretches or shrinks nicely
---
-> success = RL.DrawTexturePoly( Texture2D texture, Vector2 center, Vector2{} points, Vector2{} texcoords, int pointsCount, Color tint )
-
-Draw a textured polygon ( Convex )
-
-- Failure return false
-- Success return true
-
----
-
> success = RL.BeginTextureMode( RenderTexture2D target )
Begin drawing to render texture
@@ -4585,29 +4533,6 @@ Resume a paused sound
---
-> success = RL.PlaySoundMulti( Sound sound )
-
-Play a sound ( Using multichannel buffer pool )
-
-- Failure return false
-- Success return true
-
----
-
-> RL.StopSoundMulti()
-
-Stop any sound playing ( using multichannel buffer pool )
-
----
-
-> count = RL.GetSoundsPlaying()
-
-Get number of sounds playing in the multichannel
-
-- Success return int
-
----
-
> playing = RL.IsSoundPlaying( Sound sound )
Check if a sound is currently playing
@@ -4936,6 +4861,17 @@ Calculate angle from two vectors
---
+> result = RL.Vector2LineAngle( Vector2 start, Vector2 end )
+
+Calculate angle defined by a two vectors line.
+NOTE: Parameters need to be normalized.
+Current implementation should be aligned with glm::angle.
+
+- Failure return false
+- Success return float
+
+---
+
> result = RL.Vector2Scale( Vector2 v, float scale )
Scale vector ( multiply by value )
diff --git a/ReiLua_API.lua b/ReiLua_API.lua
index 3623336..62e854e 100644
--- a/ReiLua_API.lua
+++ b/ReiLua_API.lua
@@ -344,6 +344,7 @@ RL.BLEND_ADD_COLORS=3
RL.BLEND_SUBTRACT_COLORS=4
RL.BLEND_ALPHA_PREMULTIPLY=5
RL.BLEND_CUSTOM=6
+RL.BLEND_CUSTOM_SEPARATE=7
-- Globals - Gesture
@@ -1495,14 +1496,6 @@ function RL.SetCamera3DFovy( camera, fovy ) end
---@return any success
function RL.SetCamera3DProjection( camera, projection ) end
----Set camera mode ( CAMERA_CUSTOM, CAMERA_FREE, CAMERA_ORBITAL... )
----- Failure return false
----- Success return true
----@param camera any
----@param mode integer
----@return any success
-function RL.SetCameraMode( camera, mode ) end
-
---Get camera position
---- Failure return nil
---- Success return Vector3
@@ -1542,41 +1535,19 @@ function RL.GetCamera3DProjection( camera ) end
---- Failure return false
---- Success return true
---@param camera any
+---@param mode integer
---@return any success
-function RL.UpdateCamera3D( camera ) end
-
----Set camera pan key to combine with mouse movement ( free camera )
----- Failure return false
----- Success return true
----@param keyPan integer
----@return any success
-function RL.SetCameraPanControl( keyPan ) end
-
----Set camera alt key to combine with mouse movement ( free camera )
----- Failure return false
----- Success return true
----@param keyAlt integer
----@return any success
-function RL.SetCameraAltControl( keyAlt ) end
-
----Set camera smooth zoom key to combine with mouse ( free camera )
----- Failure return false
----- Success return true
----@param keySmoothZoom integer
----@return any success
-function RL.SetCameraSmoothZoomControl( keySmoothZoom ) end
+function RL.UpdateCamera3D( camera, mode ) end
----Set camera move controls ( 1st person and 3rd person cameras )
+---Update camera movement, movement/rotation values should be provided by user
---- Failure return false
---- Success return true
----@param keyFront integer
----@param keyBack integer
----@param keyRight integer
----@param keyLeft integer
----@param keyUp integer
----@param keyDown integer
+---@param camera any
+---@param movement table
+---@param rotation table
+---@param zoom number
---@return any success
-function RL.SetCameraMoveControls( keyFront, keyBack, keyRight, keyLeft, keyUp, keyDown ) end
+function RL.UpdateCamera3DPro( camera, movement, rotation, zoom ) end
-- Core - Screen-space
@@ -2577,19 +2548,6 @@ function RL.DrawTexture( texture, position, tint ) end
---@return any success
function RL.DrawTextureRec( texture, source, position, tint ) end
----Draw part of a texture ( defined by a rectangle ) with rotation and scale tiled into dest
----- Failure return false
----- Success return true
----@param texture any
----@param source table
----@param dest table
----@param origin table
----@param rotation number
----@param scale number
----@param tint table
----@return any success
-function RL.DrawTextureTiled( texture, source, dest, origin, rotation, scale, tint ) end
-
---Draw a part of a texture defined by a rectangle with "pro" parameters
---- Failure return false
---- Success return true
@@ -2614,18 +2572,6 @@ function RL.DrawTexturePro( texture, source, dest, origin, rotation, tint ) end
---@return any success
function RL.DrawTextureNPatch( texture, nPatchInfo, dest, origin, rotation, tint ) end
----Draw a textured polygon ( Convex )
----- Failure return false
----- Success return true
----@param texture any
----@param center table
----@param points any
----@param texcoords any
----@param pointsCount integer
----@param tint table
----@return any success
-function RL.DrawTexturePoly( texture, center, points, texcoords, pointsCount, tint ) end
-
---Begin drawing to render texture
---- Failure return false
---- Success return true
@@ -3597,22 +3543,6 @@ function RL.PauseSound( sound ) end
---@return any success
function RL.ResumeSound( sound ) end
----Play a sound ( Using multichannel buffer pool )
----- Failure return false
----- Success return true
----@param sound any
----@return any success
-function RL.PlaySoundMulti( sound ) end
-
----Stop any sound playing ( using multichannel buffer pool )
----@return any RL.StopSoundMulti
-function RL.StopSoundMulti() end
-
----Get number of sounds playing in the multichannel
----- Success return int
----@return any count
-function RL.GetSoundsPlaying() end
-
---Check if a sound is currently playing
---- Failure return nil
---- Success return bool
@@ -3885,6 +3815,16 @@ function RL.Vector2DistanceSqr( v1, v2 ) end
---@return any result
function RL.Vector2Angle( v1, v2 ) end
+---Calculate angle defined by a two vectors line.
+---NOTE: Parameters need to be normalized.
+---Current implementation should be aligned with glm::angle.
+---- Failure return false
+---- Success return float
+---@param start table
+---@param end table
+---@return any result
+function RL.Vector2LineAngle( start, end ) end
+
---Scale vector ( multiply by value )
---- Failure return false
---- Success return Vector2
diff --git a/changelog b/changelog
index 95929d5..ba0b97b 100644
--- a/changelog
+++ b/changelog
@@ -1,13 +1,29 @@
------------------------------------------------------------------------
-Release: ReiLua version 0.5.0 Using Raylib 4.2
+Release: ReiLua version 0.5.0 Using Raylib 4.5
------------------------------------------------------------------------
KEY CHANGES:
- CHANGED: All ReiLua global variables and functions are now stored in global RL table.
- CHANGED: All examples are now changed to use new RL table method.
- ADDED: doc_parser creates also ReiLua_API.lua that can be used in projects with Lua Language Server.
+ - CHANGED: Switched to Raylib vertion 4.5. Removed some functions and added others. Main changes to camera3D.
Detailed changes:
- FIXED: uluaGetRay was looking for integers instead of tables.
+ - REMOVED: SetCameraMode.
+ - REMOVED: SetCameraPanControl.
+ - REMOVED: SetCameraAltControl.
+ - REMOVED: SetCameraSmoothZoomControl.
+ - REMOVED: SetCameraMoveControls.
+ - REMOVED: DrawTextureTiled.
+ - REMOVED: DrawTexturePoly.
+ - REMOVED: DrawCubeTexture.
+ - REMOVED: PlaySoundMulti.
+ - REMOVED: StopSoundMulti.
+ - REMOVED: GetSoundsPlaying.
+ - CHANGED: UpdateCamera3D now takes int mode parameter. Same as UpdateCamera in raylib.
+ - ADDED: UpdateCamera3DPro. Same as UpdateCameraPro in raylib.
+ - ADDED: BLEND_CUSTOM_SEPARATE.
+ - ADDED: Vector2LineAngle
------------------------------------------------------------------------
Release: ReiLua version 0.4.0 Using Raylib 4.2
diff --git a/devnotes b/devnotes
index 7812079..16f0832 100644
--- a/devnotes
+++ b/devnotes
@@ -1,8 +1,13 @@
Current {
- * Set RL. for the rest of the examples.
+ * ReiLua camera3D lib.
+ * Check new functions from https://github.com/raysan5/raylib/blob/master/CHANGELOG
}
Backlog {
+ * Raymath
+ * Vector2LineAngle
+ * rlgl
+ * More low level functions.
* Text
* Ability to set font texture filtering.
* Codepoints?
diff --git a/examples/dungeon_crawler/main.lua b/examples/dungeon_crawler/main.lua
index 8732b0d..c572348 100644
--- a/examples/dungeon_crawler/main.lua
+++ b/examples/dungeon_crawler/main.lua
@@ -81,7 +81,6 @@ function RL.init()
RL.SetCamera3DPosition( camera, pos )
RL.SetCamera3DTarget( camera, { 0, 0, 0 } )
RL.SetCamera3DUp( camera, { 0, 1, 0 } )
- RL.SetCameraMode( camera, RL.CAMERA_FIRST_PERSON )
-- for x = 0, 3 do
-- for y = 0, 9 do
@@ -94,9 +93,9 @@ function RL.init()
end
function RL.draw()
- RL.UpdateCamera3D( camera )
+ RL.UpdateCamera3D( camera, RL.CAMERA_FIRST_PERSON )
pos = RL.GetCamera3DPosition( camera )
-
+
-- RL.BeginTextureMode( framebuffer )
RL.ClearBackground( { 100, 150, 150 } )
diff --git a/examples/heightmap/main.lua b/examples/heightmap/main.lua
index 4c66dd6..d046d2a 100644
--- a/examples/heightmap/main.lua
+++ b/examples/heightmap/main.lua
@@ -31,7 +31,7 @@ function RL.init()
RL.SetCamera3DPosition( camera, { 0, 8, 16 } )
RL.SetCamera3DTarget( camera, { 0, 0, 0 } )
RL.SetCamera3DUp( camera, { 0, 1, 0 } )
- RL.SetCameraMode( camera, RL.CAMERA_FREE )
+ -- RL.SetCameraMode( camera, RL.CAMERA_FREE )
heigthImage = RL.LoadImage( RL.GetBasePath().."../resources/images/heightmap.png" )
@@ -58,7 +58,7 @@ function RL.init()
RL.DrawTextureRec( tilesetTex, dirtBottomRec, { pos[1] * TILE_SIZE, pos[2] * TILE_SIZE }, RL.WHITE )
else
RL.DrawTextureRec( tilesetTex, grassRec, { pos[1] * TILE_SIZE, pos[2] * TILE_SIZE }, RL.WHITE )
- end
+ end
end
end
@@ -67,7 +67,7 @@ function RL.init()
material = RL.LoadMaterialDefault()
RL.SetTextureSource( RL.TEXTURE_SOURCE_RENDER_TEXTURE )
-- RL.GenTextureMipmaps( groundTexture )
- -- RL.SetTextureFilter( groundTexture, TEXTURE_FILTER_TRILINEAR )
+ -- RL.SetTextureFilter( groundTexture, RL.TEXTURE_FILTER_TRILINEAR )
RL.SetMaterialTexture( material, RL.MATERIAL_MAP_ALBEDO, groundTexture )
RL.SetTextureSource( RL.TEXTURE_SOURCE_TEXTURE )
@@ -76,8 +76,8 @@ end
function RL.draw()
RL.ClearBackground( { 100, 150, 100 } )
- RL.UpdateCamera3D( camera )
-
+ RL.UpdateCamera3D( camera, RL.CAMERA_FIRST_PERSON )
+
RL.BeginMode3D( camera )
RL.DrawMesh( mesh, material, matrix )
RL.EndMode3D()
diff --git a/examples/instancing/main.lua b/examples/instancing/main.lua
index b7e4024..2711fab 100644
--- a/examples/instancing/main.lua
+++ b/examples/instancing/main.lua
@@ -36,7 +36,6 @@ function RL.init()
RL.SetCamera3DTarget( camera, { 0, 0, 0 } )
RL.SetCamera3DUp( camera, { 0, 1, 0 } )
RL.SetCamera3DFovy( camera, 45 )
- RL.SetCameraMode( camera, RL.CAMERA_ORBITAL )
-- Define mesh to be instanced
cube = RL.GenMeshCube( { 1, 1, 1 } )
@@ -84,7 +83,7 @@ function RL.init()
end
function RL.process( delta )
- RL.UpdateCamera3D( camera )
+ RL.UpdateCamera3D( camera, RL.CAMERA_ORBITAL )
-- Update the light shader with the camera view position
local loc = RL.GetShaderLocationIndex( shader, RL.SHADER_LOC_VECTOR_VIEW )
diff --git a/examples/iqm_test/main.lua b/examples/iqm_test/main.lua
index 486b110..a1040ba 100644
--- a/examples/iqm_test/main.lua
+++ b/examples/iqm_test/main.lua
@@ -23,7 +23,6 @@ function RL.init()
RL.SetCamera3DPosition( camera, { 0, 2, 4 } )
RL.SetCamera3DTarget( camera, { 0, 0, 0 } )
RL.SetCamera3DUp( camera, { 0, 1, 0 } )
- RL.SetCameraMode( camera, RL.CAMERA_FREE )
material = RL.CreateMaterial( {
maps = {
@@ -74,7 +73,7 @@ end
function RL.draw()
RL.ClearBackground( { 100, 150, 100 } )
- RL.UpdateCamera3D( camera )
+ RL.UpdateCamera3D( camera, RL.CAMERA_FIRST_PERSON )
RL.BeginMode3D( camera )
RL.DrawGrid( 8, 1 )
diff --git a/examples/point_triangle_collision/main.lua b/examples/point_triangle_collision/main.lua
index a855dd8..ec837d0 100644
--- a/examples/point_triangle_collision/main.lua
+++ b/examples/point_triangle_collision/main.lua
@@ -19,7 +19,7 @@ local point = {
pos = Vec3:new( 0.2, 0.3, 0.2 ),
radius = 0.05,
lineLen = 0.5,
- color = RED,
+ color = RL.RED,
}
local debugText = ""
@@ -41,7 +41,6 @@ function RL.init()
RL.SetCamera3DPosition( camera, { 0, 1, 2 } )
RL.SetCamera3DTarget( camera, { 0, 0, 0 } )
RL.SetCamera3DUp( camera, { 0, 1, 0 } )
- RL.SetCameraMode( camera, RL.CAMERA_FREE )
calcNormal( tri )
end
@@ -103,7 +102,6 @@ end
function RL.draw()
RL.ClearBackground( { 100, 150, 100 } )
- RL.UpdateCamera3D( camera )
RL.BeginMode3D( camera )
RL.DrawGrid( 8, 1 )
diff --git a/examples/ray/main.lua b/examples/ray/main.lua
index 18b7394..79ba7ee 100644
--- a/examples/ray/main.lua
+++ b/examples/ray/main.lua
@@ -31,7 +31,6 @@ function RL.init()
RL.SetCamera3DPosition( camera, { 0, 2, 4 } )
RL.SetCamera3DTarget( camera, { 0, 0, 0 } )
RL.SetCamera3DUp( camera, { 0, 1, 0 } )
- RL.SetCameraMode( camera, RL.CAMERA_FREE )
sphereMesh = RL.GenMeshSphere( 1.0, 8, 10 )
@@ -47,7 +46,7 @@ end
function RL.draw()
RL.ClearBackground( { 100, 150, 100 } )
- RL.UpdateCamera3D( camera )
+ RL.UpdateCamera3D( camera, RL.CAMERA_FIRST_PERSON )
RL.BeginMode3D( camera )
RL.DrawGrid( 8, 1 )
diff --git a/include/audio.h b/include/audio.h
index 45002aa..7406220 100644
--- a/include/audio.h
+++ b/include/audio.h
@@ -15,9 +15,9 @@ int laudioPlaySound( lua_State *L );
int laudioStopSound( lua_State *L );
int laudioPauseSound( lua_State *L );
int laudioResumeSound( lua_State *L );
-int laudioPlaySoundMulti( lua_State *L );
-int laudioStopSoundMulti( lua_State *L );
-int laudioGetSoundsPlaying( lua_State *L );
+// int laudioPlaySoundMulti( lua_State *L );
+// int laudioStopSoundMulti( lua_State *L );
+// int laudioGetSoundsPlaying( lua_State *L );
int laudioIsSoundPlaying( lua_State *L );
int laudioSetSoundVolume( lua_State *L );
int laudioSetSoundPitch( lua_State *L );
diff --git a/include/core.h b/include/core.h
index 51a6a25..e7b89bc 100644
--- a/include/core.h
+++ b/include/core.h
@@ -121,11 +121,12 @@ int lcoreGetCamera3DUp( lua_State *L );
int lcoreGetCamera3DFovy( lua_State *L );
int lcoreGetCamera3DProjection( lua_State *L );
int lcoreUpdateCamera3D( lua_State *L );
-int lcoreSetCameraMode( lua_State *L );
-int lcoreSetCameraPanControl( lua_State *L );
-int lcoreSetCameraAltControl( lua_State *L );
-int lcoreSetCameraSmoothZoomControl( lua_State *L );
-int lcoreSetCameraMoveControls( lua_State *L );
+int lcoreUpdateCamera3DPro( lua_State *L );
+// int lcoreSetCameraMode( lua_State *L );
+// int lcoreSetCameraPanControl( lua_State *L );
+// int lcoreSetCameraAltControl( lua_State *L );
+// int lcoreSetCameraSmoothZoomControl( lua_State *L );
+// int lcoreSetCameraMoveControls( lua_State *L );
/* Input-related Keyboard. */
int lcoreIsKeyPressed( lua_State *L );
int lcoreIsKeyDown( lua_State *L );
diff --git a/include/models.h b/include/models.h
index 606e003..e956d7d 100644
--- a/include/models.h
+++ b/include/models.h
@@ -1,5 +1,9 @@
#pragma once
+/* Internals. */
+/* Deleted from raylib. Need for freeing models. */
+void UnloadModelKeepMeshes( Model model );
+
/* Basic. */
int lmodelsDrawLine3D( lua_State *L );
int lmodelsDrawPoint3D( lua_State *L );
@@ -7,7 +11,7 @@ int lmodelsDrawCircle3D( lua_State *L );
int lmodelsDrawTriangle3D( lua_State *L );
int lmodelsDrawCube( lua_State *L );
int lmodelsDrawCubeWires( lua_State *L );
-int lmodelsDrawCubeTexture( lua_State *L );
+// int lmodelsDrawCubeTexture( lua_State *L );
int lmodelsDrawSphere( lua_State *L );
int lmodelsDrawSphereEx( lua_State *L );
int lmodelsDrawSphereWires( lua_State *L );
diff --git a/include/raylib.h b/include/raylib.h
index 8a5d50c..4cd9e43 100644
--- a/include/raylib.h
+++ b/include/raylib.h
@@ -1,6 +1,6 @@
/**********************************************************************************************
*
-* raylib v4.2 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com)
+* raylib v4.5 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com)
*
* FEATURES:
* - NO external dependencies, all required libraries included with raylib
@@ -43,6 +43,7 @@
* [rmodels] par_shapes (Philip Rideout) for parametric 3d shapes generation
* [rmodels] tinyobj_loader_c (Syoyo Fujita) for models loading (OBJ, MTL)
* [rmodels] cgltf (Johannes Kuhlmann) for models loading (glTF)
+* [rmodels] Model3D (bzt) for models loading (M3D, https://bztsrc.gitlab.io/model3d)
* [raudio] dr_wav (David Reid) for WAV audio file loading
* [raudio] dr_flac (David Reid) for FLAC audio file loading
* [raudio] dr_mp3 (David Reid) for MP3 audio file loading
@@ -56,7 +57,7 @@
* raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software:
*
-* Copyright (c) 2013-2022 Ramon Santamaria (@raysan5)
+* Copyright (c) 2013-2023 Ramon Santamaria (@raysan5)
*
* This software is provided "as-is", without any express or implied warranty. In no event
* will the authors be held liable for any damages arising from the use of this software.
@@ -80,7 +81,10 @@
#include <stdarg.h> // Required for: va_list - Only used by TraceLogCallback
-#define RAYLIB_VERSION "4.2"
+#define RAYLIB_VERSION_MAJOR 4
+#define RAYLIB_VERSION_MINOR 5
+#define RAYLIB_VERSION_PATCH 0
+#define RAYLIB_VERSION "4.5"
// 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
@@ -212,7 +216,7 @@ typedef struct Vector4 {
// Quaternion, 4 components (Vector4 alias)
typedef Vector4 Quaternion;
-// Matrix, 4x4 components, column major, OpenGL style, right handed
+// Matrix, 4x4 components, column major, OpenGL style, right-handed
typedef struct Matrix {
float m0, m4, m8, m12; // Matrix first row (4 components)
float m1, m5, m9, m13; // Matrix second row (4 components)
@@ -304,7 +308,7 @@ typedef struct Camera3D {
Vector3 position; // Camera position
Vector3 target; // Camera target it looks-at
Vector3 up; // Camera up vector (rotation over its axis)
- float fovy; // Camera field-of-view apperture in Y (degrees) in perspective, used as near plane width in orthographic
+ float fovy; // Camera field-of-view aperture in Y (degrees) in perspective, used as near plane width in orthographic
int projection; // Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC
} Camera3D;
@@ -363,7 +367,7 @@ typedef struct Material {
float params[4]; // Material generic parameters (if required)
} Material;
-// Transform, vectex transformation data
+// Transform, vertex transformation data
typedef struct Transform {
Vector3 translation; // Translation
Quaternion rotation; // Rotation
@@ -409,8 +413,8 @@ typedef struct Ray {
// RayCollision, ray hit information
typedef struct RayCollision {
bool hit; // Did the ray hit something?
- float distance; // Distance to nearest hit
- Vector3 point; // Point of nearest hit
+ float distance; // Distance to the nearest hit
+ Vector3 point; // Point of the nearest hit
Vector3 normal; // Surface normal of hit
} RayCollision;
@@ -662,7 +666,7 @@ typedef enum {
MOUSE_BUTTON_MIDDLE = 2, // Mouse button middle (pressed wheel)
MOUSE_BUTTON_SIDE = 3, // Mouse button side (advanced mouse device)
MOUSE_BUTTON_EXTRA = 4, // Mouse button extra (advanced mouse device)
- MOUSE_BUTTON_FORWARD = 5, // Mouse button fordward (advanced mouse device)
+ MOUSE_BUTTON_FORWARD = 5, // Mouse button forward (advanced mouse device)
MOUSE_BUTTON_BACK = 6, // Mouse button back (advanced mouse device)
} MouseButton;
@@ -677,7 +681,7 @@ typedef enum {
MOUSE_CURSOR_RESIZE_NS = 6, // Vertical resize/move arrow shape
MOUSE_CURSOR_RESIZE_NWSE = 7, // Top-left to bottom-right diagonal resize/move arrow shape
MOUSE_CURSOR_RESIZE_NESW = 8, // The top-right to bottom-left diagonal resize/move arrow shape
- MOUSE_CURSOR_RESIZE_ALL = 9, // The omni-directional resize/move cursor shape
+ MOUSE_CURSOR_RESIZE_ALL = 9, // The omnidirectional resize/move cursor shape
MOUSE_CURSOR_NOT_ALLOWED = 10 // The operation-not-allowed shape
} MouseCursor;
@@ -715,7 +719,7 @@ typedef enum {
// Material map index
typedef enum {
- MATERIAL_MAP_ALBEDO = 0, // Albedo material (same as: MATERIAL_MAP_DIFFUSE)
+ MATERIAL_MAP_ALBEDO = 0, // Albedo material (same as: MATERIAL_MAP_DIFFUSE)
MATERIAL_MAP_METALNESS, // Metalness material (same as: MATERIAL_MAP_SPECULAR)
MATERIAL_MAP_NORMAL, // Normal material
MATERIAL_MAP_ROUGHNESS, // Roughness material
@@ -835,10 +839,10 @@ typedef enum {
typedef enum {
CUBEMAP_LAYOUT_AUTO_DETECT = 0, // Automatically detect layout type
CUBEMAP_LAYOUT_LINE_VERTICAL, // Layout is defined by a vertical line with faces
- CUBEMAP_LAYOUT_LINE_HORIZONTAL, // Layout is defined by an horizontal line with faces
+ CUBEMAP_LAYOUT_LINE_HORIZONTAL, // Layout is defined by a horizontal line with faces
CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR, // Layout is defined by a 3x4 cross with cubemap faces
CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE, // Layout is defined by a 4x3 cross with cubemap faces
- CUBEMAP_LAYOUT_PANORAMA // Layout is defined by a panorama image (equirectangular map)
+ CUBEMAP_LAYOUT_PANORAMA // Layout is defined by a panorama image (equirrectangular map)
} CubemapLayout;
// Font type, defines generation method
@@ -856,11 +860,12 @@ typedef enum {
BLEND_ADD_COLORS, // Blend textures adding colors (alternative)
BLEND_SUBTRACT_COLORS, // Blend textures subtracting colors (alternative)
BLEND_ALPHA_PREMULTIPLY, // Blend premultiplied textures considering alpha
- BLEND_CUSTOM // Blend textures using custom src/dst factors (use rlSetBlendMode())
+ BLEND_CUSTOM, // Blend textures using custom src/dst factors (use rlSetBlendFactors())
+ BLEND_CUSTOM_SEPARATE // Blend textures using custom rgb/alpha separate src/dst factors (use rlSetBlendFactorsSeparate())
} BlendMode;
// Gesture
-// NOTE: It could be used as flags to enable only some gestures
+// NOTE: Provided as bit-wise flags to enable only desired gestures
typedef enum {
GESTURE_NONE = 0, // No gesture
GESTURE_TAP = 1, // Tap gesture
@@ -898,7 +903,7 @@ typedef enum {
} NPatchLayout;
// Callbacks to hook some internal functions
-// WARNING: This callbacks are intended for advance users
+// WARNING: These callbacks are intended for advance users
typedef void (*TraceLogCallback)(int logLevel, const char *text, va_list args); // Logging: Redirect trace log messages
typedef 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
@@ -936,7 +941,8 @@ RLAPI void ToggleFullscreen(void); // Toggle wind
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 (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 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)
@@ -966,7 +972,7 @@ RLAPI void DisableEventWaiting(void); // Disable wai
// 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 timming + PollInputEvents()
+// 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
@@ -1007,6 +1013,7 @@ RLAPI void UnloadVrStereoConfig(VrStereoConfig config); // Unload VR s
// NOTE: Shader functionality is not available on OpenGL 1.1
RLAPI Shader LoadShader(const char *vsFileName, const char *fsFileName); // Load shader from files and bind default locations
RLAPI Shader LoadShaderFromMemory(const char *vsCode, const char *fsCode); // Load shader from code strings and bind default locations
+RLAPI bool IsShaderReady(Shader shader); // Check if a shader is ready
RLAPI int GetShaderLocation(Shader shader, const char *uniformName); // Get shader uniform location
RLAPI int GetShaderLocationAttrib(Shader shader, const char *attribName); // Get shader attribute location
RLAPI void SetShaderValue(Shader shader, int locIndex, const void *value, int uniformType); // Set shader uniform value
@@ -1038,8 +1045,8 @@ RLAPI void SetConfigFlags(unsigned int flags); // Setup init
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(int size); // Internal memory allocator
-RLAPI void *MemRealloc(void *ptr, int size); // Internal memory reallocator
+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)
@@ -1056,7 +1063,7 @@ RLAPI void SetSaveFileTextCallback(SaveFileTextCallback callback); // Set custom
RLAPI unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead); // 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 char *data, unsigned int size, const char *fileName); // Export data to code (.h), 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 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
@@ -1150,13 +1157,8 @@ RLAPI float GetGesturePinchAngle(void); // Get gesture pinch ang
//------------------------------------------------------------------------------------
// Camera System Functions (Module: rcamera)
//------------------------------------------------------------------------------------
-RLAPI void SetCameraMode(Camera camera, int mode); // Set camera mode (multiple camera modes available)
-RLAPI void UpdateCamera(Camera *camera); // Update camera position for selected mode
-
-RLAPI void SetCameraPanControl(int keyPan); // Set camera pan key to combine with mouse movement (free camera)
-RLAPI void SetCameraAltControl(int keyAlt); // Set camera alt key to combine with mouse movement (free camera)
-RLAPI void SetCameraSmoothZoomControl(int keySmoothZoom); // Set camera smooth zoom key to combine with mouse (free camera)
-RLAPI void SetCameraMoveControls(int keyFront, int keyBack, int keyRight, int keyLeft, int keyUp, int keyDown); // Set camera move controls (1st person and 3rd person cameras)
+RLAPI void UpdateCamera(Camera *camera, int mode); // Update camera position for selected mode
+RLAPI void UpdateCameraPro(Camera *camera, Vector3 movement, Vector3 rotation, float zoom); // Update camera movement/rotation
//------------------------------------------------------------------------------------
// Basic Shapes Drawing Functions (Module: shapes)
@@ -1212,6 +1214,7 @@ RLAPI bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec);
RLAPI bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle
RLAPI bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius); // Check if point is inside circle
RLAPI bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); // Check if point is inside a triangle
+RLAPI bool CheckCollisionPointPoly(Vector2 point, Vector2 *points, int pointCount); // Check if point is within a polygon described by array of vertices
RLAPI bool CheckCollisionLines(Vector2 startPos1, Vector2 endPos1, Vector2 startPos2, Vector2 endPos2, Vector2 *collisionPoint); // Check the collision between two lines defined by two points each, returns collision point by reference
RLAPI bool CheckCollisionPointLine(Vector2 point, Vector2 p1, Vector2 p2, int threshold); // Check if point belongs to line created between two points [p1] and [p2] with defined margin in pixels [threshold]
RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2); // Get collision rectangle for two rectangles collision
@@ -1221,13 +1224,14 @@ RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2);
//------------------------------------------------------------------------------------
// Image loading functions
-// NOTE: This functions do not require GPU access
+// NOTE: These functions do not require GPU access
RLAPI Image LoadImage(const char *fileName); // Load image from file into CPU memory (RAM)
RLAPI Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image from RAW file data
RLAPI Image LoadImageAnim(const char *fileName, int *frames); // Load image sequence from file (frames appended to image.data)
RLAPI Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load image from memory buffer, fileType refers to extension: i.e. '.png'
RLAPI Image LoadImageFromTexture(Texture2D texture); // Load image from GPU texture data
RLAPI Image LoadImageFromScreen(void); // Load image from screen buffer and (screenshot)
+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 bool ExportImageAsCode(Image image, const char *fileName); // Export image as code file defining an array of bytes, returns true on success
@@ -1239,7 +1243,9 @@ RLAPI Image GenImageGradientH(int width, int height, Color left, Color right);
RLAPI Image GenImageGradientRadial(int width, int height, float density, Color inner, Color outer); // Generate image: radial 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
RLAPI Image GenImageCellular(int width, int height, int tileSize); // Generate image: cellular algorithm, bigger tileSize means bigger cells
+RLAPI Image GenImageText(int width, int height, const char *text); // Generate image: grayscale image from text data
// Image manipulation functions
RLAPI Image ImageCopy(Image image); // Create an image duplicate (useful for transformations)
@@ -1253,6 +1259,7 @@ RLAPI void ImageAlphaCrop(Image *image, float threshold);
RLAPI void ImageAlphaClear(Image *image, Color color, float threshold); // Clear alpha channel to desired color
RLAPI void ImageAlphaMask(Image *image, Image alphaMask); // Apply alpha mask to image
RLAPI void ImageAlphaPremultiply(Image *image); // Premultiply alpha channel
+RLAPI void ImageBlurGaussian(Image *image, int blurSize); // Apply Gaussian blur using a box blur approximation
RLAPI void ImageResize(Image *image, int newWidth, int newHeight); // Resize image (Bicubic scaling algorithm)
RLAPI void ImageResizeNN(Image *image, int newWidth,int newHeight); // Resize image (Nearest-Neighbor scaling algorithm)
RLAPI void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color fill); // Resize canvas and fill with color
@@ -1282,8 +1289,10 @@ RLAPI void ImageDrawPixel(Image *dst, int posX, int posY, Color color);
RLAPI void ImageDrawPixelV(Image *dst, Vector2 position, Color color); // Draw pixel within an image (Vector version)
RLAPI void ImageDrawLine(Image *dst, int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw line within an image
RLAPI void ImageDrawLineV(Image *dst, Vector2 start, Vector2 end, Color color); // Draw line within an image (Vector version)
-RLAPI void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color color); // Draw circle within an image
-RLAPI void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color); // Draw circle within an image (Vector version)
+RLAPI void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color color); // Draw a filled circle within an image
+RLAPI void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color); // Draw a filled circle within an image (Vector version)
+RLAPI void ImageDrawCircleLines(Image *dst, int centerX, int centerY, int radius, Color color); // Draw circle outline within an image
+RLAPI void ImageDrawCircleLinesV(Image *dst, Vector2 center, int radius, Color color); // Draw circle outline within an image (Vector version)
RLAPI void ImageDrawRectangle(Image *dst, int posX, int posY, int width, int height, Color color); // Draw rectangle within an image
RLAPI void ImageDrawRectangleV(Image *dst, Vector2 position, Vector2 size, Color color); // Draw rectangle within an image (Vector version)
RLAPI void ImageDrawRectangleRec(Image *dst, Rectangle rec, Color color); // Draw rectangle within an image
@@ -1298,7 +1307,9 @@ RLAPI Texture2D LoadTexture(const char *fileName);
RLAPI Texture2D LoadTextureFromImage(Image image); // Load texture from image data
RLAPI TextureCubemap LoadTextureCubemap(Image image, int layout); // Load cubemap from image, multiple image cubemap layouts supported
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 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
@@ -1313,11 +1324,8 @@ RLAPI void DrawTexture(Texture2D texture, int posX, int posY, Color tint);
RLAPI void DrawTextureV(Texture2D texture, Vector2 position, Color tint); // Draw a Texture2D with position defined as Vector2
RLAPI void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint); // Draw a Texture2D with extended parameters
RLAPI void DrawTextureRec(Texture2D texture, Rectangle source, Vector2 position, Color tint); // Draw a part of a texture defined by a rectangle
-RLAPI void DrawTextureQuad(Texture2D texture, Vector2 tiling, Vector2 offset, Rectangle quad, Color tint); // Draw texture quad with tiling and offset parameters
-RLAPI void DrawTextureTiled(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, float scale, Color tint); // Draw part of a texture (defined by a rectangle) with rotation and scale tiled into dest.
-RLAPI void DrawTexturePro(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draw a part of a texture defined by a rectangle with 'pro' parameters
-RLAPI void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draws a texture (or part of it) that stretches or shrinks nicely
-RLAPI void DrawTexturePoly(Texture2D texture, Vector2 center, Vector2 *points, Vector2 *texcoords, int pointCount, Color tint); // Draw a textured polygon
+RLAPI void DrawTexturePro(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draw a part of a texture defined by a rectangle with 'pro' parameters
+RLAPI void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draws a texture (or part of it) that stretches or shrinks nicely
// Color/pixel related functions
RLAPI Color Fade(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f
@@ -1326,6 +1334,9 @@ RLAPI Vector4 ColorNormalize(Color color); // G
RLAPI Color ColorFromNormalized(Vector4 normalized); // Get Color from normalized values [0..1]
RLAPI Vector3 ColorToHSV(Color color); // Get HSV values for a Color, hue [0..360], saturation/value [0..1]
RLAPI Color ColorFromHSV(float hue, float saturation, float value); // Get a Color from HSV values, hue [0..360], saturation/value [0..1]
+RLAPI Color ColorTint(Color color, Color tint); // Get color multiplied with another color
+RLAPI Color ColorBrightness(Color color, float factor); // Get color with brightness correction, brightness factor goes from -1.0f to 1.0f
+RLAPI Color ColorContrast(Color color, float contrast); // Get color with contrast correction, contrast values between -1.0f and 1.0f
RLAPI Color ColorAlpha(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f
RLAPI Color ColorAlphaBlend(Color dst, Color src, Color tint); // Get src alpha-blended into dst color with tint
RLAPI Color GetColor(unsigned int hexValue); // Get Color structure from hexadecimal value
@@ -1343,6 +1354,7 @@ RLAPI Font LoadFont(const char *fileName);
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 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 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)
@@ -1365,12 +1377,15 @@ RLAPI GlyphInfo GetGlyphInfo(Font font, int codepoint);
RLAPI Rectangle GetGlyphAtlasRec(Font font, int codepoint); // Get glyph rectangle in font atlas for a codepoint (unicode character), fallback to '?' if not found
// Text codepoints management functions (unicode characters)
-RLAPI int *LoadCodepoints(const char *text, int *count); // Load all codepoints from a UTF-8 text string, codepoints count returned by parameter
-RLAPI void UnloadCodepoints(int *codepoints); // Unload codepoints data from memory
-RLAPI int GetCodepointCount(const char *text); // Get total number of codepoints in a UTF-8 encoded string
-RLAPI int GetCodepoint(const char *text, int *bytesProcessed); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure
-RLAPI const char *CodepointToUTF8(int codepoint, int *byteSize); // Encode one codepoint into UTF-8 byte array (array length returned as parameter)
-RLAPI char *TextCodepointsToUTF8(const int *codepoints, int length); // Encode text as codepoints array into UTF-8 text string (WARNING: memory must be freed!)
+RLAPI char *LoadUTF8(const int *codepoints, int length); // Load UTF-8 text encoded from codepoints array
+RLAPI void UnloadUTF8(char *text); // Unload UTF-8 text encoded from codepoints array
+RLAPI int *LoadCodepoints(const char *text, int *count); // Load all codepoints from a UTF-8 text string, codepoints count returned by parameter
+RLAPI void UnloadCodepoints(int *codepoints); // Unload codepoints data from memory
+RLAPI int GetCodepointCount(const char *text); // Get total number of codepoints in a UTF-8 encoded string
+RLAPI int GetCodepoint(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure
+RLAPI int GetCodepointNext(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure
+RLAPI int GetCodepointPrevious(const char *text, int *codepointSize); // Get previous codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure
+RLAPI const char *CodepointToUTF8(int codepoint, int *utf8Size); // Encode one codepoint into UTF-8 byte array (array length returned as parameter)
// Text strings management functions (no UTF-8 strings, only byte chars)
// NOTE: Some strings allocate memory internally for returned strings, just be careful!
@@ -1404,8 +1419,6 @@ RLAPI void DrawCube(Vector3 position, float width, float height, float length, C
RLAPI void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version)
RLAPI void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); // Draw cube wires
RLAPI void DrawCubeWiresV(Vector3 position, Vector3 size, Color color); // Draw cube wires (Vector version)
-RLAPI void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float length, Color color); // Draw cube textured
-RLAPI void DrawCubeTextureRec(Texture2D texture, Rectangle source, Vector3 position, float width, float height, float length, Color color); // Draw cube with a region of a texture
RLAPI void DrawSphere(Vector3 centerPos, float radius, Color color); // Draw sphere
RLAPI void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters
RLAPI void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires
@@ -1413,6 +1426,8 @@ RLAPI void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, f
RLAPI void DrawCylinderEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder with base at startPos and top at endPos
RLAPI void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires
RLAPI void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder wires with base at startPos and top at endPos
+RLAPI void DrawCapsule(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Color color); // Draw a capsule with the center of its sphere caps at startPos and endPos
+RLAPI void DrawCapsuleWires(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Color color); // Draw capsule wireframe with the center of its sphere caps at startPos and endPos
RLAPI void DrawPlane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ
RLAPI void DrawRay(Ray ray, Color color); // Draw a ray line
RLAPI void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0))
@@ -1424,16 +1439,16 @@ RLAPI void DrawGrid(int slices, float spacing);
// Model management functions
RLAPI Model LoadModel(const char *fileName); // Load model from files (meshes and materials)
RLAPI Model LoadModelFromMesh(Mesh mesh); // Load model from generated mesh (default material)
+RLAPI bool IsModelReady(Model model); // Check if a model is ready
RLAPI void UnloadModel(Model model); // Unload model (including meshes) from memory (RAM and/or VRAM)
-RLAPI void UnloadModelKeepMeshes(Model model); // Unload model (but not meshes) from memory (RAM and/or VRAM)
RLAPI BoundingBox GetModelBoundingBox(Model model); // Compute model bounding box limits (considers all meshes)
// Model drawing functions
-RLAPI void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set)
+RLAPI void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set)
RLAPI void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters
-RLAPI void DrawModelWires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set)
+RLAPI void DrawModelWires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set)
RLAPI void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model wires (with texture if set) with extended parameters
-RLAPI void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires)
+RLAPI void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires)
RLAPI void DrawBillboard(Camera camera, Texture2D texture, Vector3 position, float size, Color tint); // Draw a billboard texture
RLAPI void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector2 size, Color tint); // Draw a billboard texture defined by source
RLAPI void DrawBillboardPro(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector3 up, Vector2 size, Vector2 origin, float rotation, Color tint); // Draw a billboard texture defined by source and rotation
@@ -1464,6 +1479,7 @@ RLAPI Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize);
// Material loading/unloading functions
RLAPI Material *LoadMaterials(const char *fileName, int *materialCount); // Load materials from model file
RLAPI Material LoadMaterialDefault(void); // Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps)
+RLAPI bool IsMaterialReady(Material material); // Check if a material is ready
RLAPI void UnloadMaterial(Material material); // Unload material from GPU memory (VRAM)
RLAPI void SetMaterialTexture(Material *material, int mapType, Texture2D texture); // Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...)
RLAPI void SetModelMeshMaterial(Model *model, int meshId, int materialId); // Set material for a mesh
@@ -1499,8 +1515,10 @@ RLAPI void SetMasterVolume(float volume); // Set mas
// Wave/Sound loading/unloading functions
RLAPI Wave LoadWave(const char *fileName); // Load wave data from file
RLAPI Wave LoadWaveFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load wave from memory buffer, fileType refers to extension: i.e. '.wav'
+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 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
@@ -1512,9 +1530,6 @@ RLAPI void PlaySound(Sound sound); // Play a
RLAPI void StopSound(Sound sound); // Stop playing a sound
RLAPI void PauseSound(Sound sound); // Pause a sound
RLAPI void ResumeSound(Sound sound); // Resume a paused sound
-RLAPI void PlaySoundMulti(Sound sound); // Play a sound (using multichannel buffer pool)
-RLAPI void StopSoundMulti(void); // Stop any sound playing (using multichannel buffer pool)
-RLAPI int GetSoundsPlaying(void); // Get number of sounds playing in the multichannel
RLAPI bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing
RLAPI void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level)
RLAPI void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level)
@@ -1528,6 +1543,7 @@ RLAPI void UnloadWaveSamples(float *samples); // Unload
// Music management functions
RLAPI Music LoadMusicStream(const char *fileName); // Load music stream from file
RLAPI Music LoadMusicStreamFromMemory(const char *fileType, const unsigned char *data, int dataSize); // Load music stream from data
+RLAPI bool IsMusicReady(Music music); // Checks if a music stream is ready
RLAPI void UnloadMusicStream(Music music); // Unload music stream
RLAPI void PlayMusicStream(Music music); // Start music playing
RLAPI bool IsMusicStreamPlaying(Music music); // Check if music is playing
@@ -1544,6 +1560,7 @@ RLAPI float GetMusicTimePlayed(Music music); // Get cur
// AudioStream management functions
RLAPI AudioStream LoadAudioStream(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels); // Load audio stream (to stream raw audio pcm data)
+RLAPI bool IsAudioStreamReady(AudioStream stream); // Checks if an audio stream is ready
RLAPI void UnloadAudioStream(AudioStream stream); // Unload audio stream and free memory
RLAPI void UpdateAudioStream(AudioStream stream, const void *data, int frameCount); // Update audio stream buffers with data
RLAPI bool IsAudioStreamProcessed(AudioStream stream); // Check if any audio stream buffers requires refill
@@ -1561,6 +1578,9 @@ RLAPI void SetAudioStreamCallback(AudioStream stream, AudioCallback callback);
RLAPI void AttachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Attach audio stream processor to stream
RLAPI void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Detach audio stream processor from stream
+RLAPI void AttachAudioMixedProcessor(AudioCallback processor); // Attach audio stream processor to the entire audio pipeline
+RLAPI void DetachAudioMixedProcessor(AudioCallback processor); // Detach audio stream processor from the entire audio pipeline
+
#if defined(__cplusplus)
}
#endif
diff --git a/include/raymath.h b/include/raymath.h
index fbe4cea..422a42e 100644
--- a/include/raymath.h
+++ b/include/raymath.h
@@ -25,7 +25,7 @@
*
* LICENSE: zlib/libpng
*
-* Copyright (c) 2015-2022 Ramon Santamaria (@raysan5)
+* Copyright (c) 2015-2023 Ramon Santamaria (@raysan5)
*
* This software is provided "as-is", without any express or implied warranty. In no event
* will the authors be held liable for any damages arising from the use of this software.
@@ -306,10 +306,33 @@ RMAPI float Vector2DistanceSqr(Vector2 v1, Vector2 v2)
return result;
}
-// Calculate angle from two vectors
+// Calculate angle between two vectors
+// NOTE: Angle is calculated from origin point (0, 0)
RMAPI float Vector2Angle(Vector2 v1, Vector2 v2)
{
- float result = atan2f(v2.y, v2.x) - atan2f(v1.y, v1.x);
+ float result = atan2f(v2.y - v1.y, v2.x - v1.x);
+
+ return result;
+}
+
+// Calculate angle defined by a two vectors line
+// NOTE: Parameters need to be normalized
+// Current implementation should be aligned with glm::angle
+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));
return result;
}
@@ -889,7 +912,7 @@ RMAPI Vector3 Vector3Unproject(Vector3 source, Matrix projection, Matrix view)
{
Vector3 result = { 0 };
- // Calculate unproject matrix (multiply view patrix by projection matrix) and invert it
+ // Calculate unprojected matrix (multiply view matrix by projection matrix) and invert it
Matrix matViewProj = { // MatrixMultiply(view, projection);
view.m0*projection.m0 + view.m1*projection.m4 + view.m2*projection.m8 + view.m3*projection.m12,
view.m0*projection.m1 + view.m1*projection.m5 + view.m2*projection.m9 + view.m3*projection.m13,
@@ -952,7 +975,7 @@ RMAPI Vector3 Vector3Unproject(Vector3 source, Matrix projection, Matrix view)
// Create quaternion from source point
Quaternion quat = { source.x, source.y, source.z, 1.0f };
- // Multiply quat point by unproject matrix
+ // Multiply quat point by unprojecte matrix
Quaternion qtransformed = { // QuaternionTransform(quat, matViewProjInv)
matViewProjInv.m0*quat.x + matViewProjInv.m4*quat.y + matViewProjInv.m8*quat.z + matViewProjInv.m12*quat.w,
matViewProjInv.m1*quat.x + matViewProjInv.m5*quat.y + matViewProjInv.m9*quat.z + matViewProjInv.m13*quat.w,
diff --git a/include/rlgl.h b/include/rlgl.h
index 2fa604d..86208de 100644
--- a/include/rlgl.h
+++ b/include/rlgl.h
@@ -1,15 +1,15 @@
/**********************************************************************************************
*
-* rlgl v4.0 - A multi-OpenGL abstraction layer with an immediate-mode style API
+* rlgl v4.5 - A multi-OpenGL abstraction layer with an immediate-mode style API
*
* 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 chosing an OpenGL backend different than OpenGL 1.1, some internal buffer are
+* When choosing an OpenGL backend different than OpenGL 1.1, some internal buffer are
* initialized on rlglInit() to accumulate vertex data.
*
* When an internal state change is required all the stored vertex data is renderer in batch,
-* additioanlly, rlDrawRenderBatchActive() could be called to force flushing of the batch.
+* additionally, rlDrawRenderBatchActive() could be called to force flushing of the batch.
*
* Some additional resources are also loaded for convenience, here the complete list:
* - Default batch (RLGL.defaultBatch): RenderBatch system to accumulate vertex data
@@ -61,12 +61,11 @@
* When loading a shader, the following vertex attribute and uniform
* location names are tried to be set automatically:
*
-* #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Binded by default to shader location: 0
-* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Binded by default to shader location: 1
-* #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Binded by default to shader location: 2
-* #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Binded by default to shader location: 3
-* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Binded by default to shader location: 4
-* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Binded by default to shader location: 5
+* #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
@@ -85,7 +84,7 @@
*
* LICENSE: zlib/libpng
*
-* Copyright (c) 2014-2022 Ramon Santamaria (@raysan5)
+* Copyright (c) 2014-2023 Ramon Santamaria (@raysan5)
*
* This software is provided "as-is", without any express or implied warranty. In no event
* will the authors be held liable for any damages arising from the use of this software.
@@ -107,7 +106,7 @@
#ifndef RLGL_H
#define RLGL_H
-#define RLGL_VERSION "4.0"
+#define RLGL_VERSION "4.5"
// 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
@@ -243,6 +242,7 @@
#define RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST 0x2701 // GL_LINEAR_MIPMAP_NEAREST
#define RL_TEXTURE_FILTER_MIP_LINEAR 0x2703 // GL_LINEAR_MIPMAP_LINEAR
#define RL_TEXTURE_FILTER_ANISOTROPIC 0x3000 // Anisotropic filter (custom identifier)
+#define RL_TEXTURE_MIPMAP_BIAS_RATIO 0x4000 // Texture mipmap bias, percentage ratio (custom identifier)
#define RL_TEXTURE_WRAP_REPEAT 0x2901 // GL_REPEAT
#define RL_TEXTURE_WRAP_CLAMP 0x812F // GL_CLAMP_TO_EDGE
@@ -263,7 +263,7 @@
#define RL_UNSIGNED_BYTE 0x1401 // GL_UNSIGNED_BYTE
#define RL_FLOAT 0x1406 // GL_FLOAT
-// Buffer usage hint
+// GL buffer usage hint
#define RL_STREAM_DRAW 0x88E0 // GL_STREAM_DRAW
#define RL_STREAM_READ 0x88E1 // GL_STREAM_READ
#define RL_STREAM_COPY 0x88E2 // GL_STREAM_COPY
@@ -279,40 +279,59 @@
#define RL_VERTEX_SHADER 0x8B31 // GL_VERTEX_SHADER
#define RL_COMPUTE_SHADER 0x91B9 // GL_COMPUTE_SHADER
+// GL blending factors
+#define RL_ZERO 0 // GL_ZERO
+#define RL_ONE 1 // GL_ONE
+#define RL_SRC_COLOR 0x0300 // GL_SRC_COLOR
+#define RL_ONE_MINUS_SRC_COLOR 0x0301 // GL_ONE_MINUS_SRC_COLOR
+#define RL_SRC_ALPHA 0x0302 // GL_SRC_ALPHA
+#define RL_ONE_MINUS_SRC_ALPHA 0x0303 // GL_ONE_MINUS_SRC_ALPHA
+#define RL_DST_ALPHA 0x0304 // GL_DST_ALPHA
+#define RL_ONE_MINUS_DST_ALPHA 0x0305 // GL_ONE_MINUS_DST_ALPHA
+#define RL_DST_COLOR 0x0306 // GL_DST_COLOR
+#define RL_ONE_MINUS_DST_COLOR 0x0307 // GL_ONE_MINUS_DST_COLOR
+#define RL_SRC_ALPHA_SATURATE 0x0308 // GL_SRC_ALPHA_SATURATE
+#define RL_CONSTANT_COLOR 0x8001 // GL_CONSTANT_COLOR
+#define RL_ONE_MINUS_CONSTANT_COLOR 0x8002 // GL_ONE_MINUS_CONSTANT_COLOR
+#define RL_CONSTANT_ALPHA 0x8003 // GL_CONSTANT_ALPHA
+#define RL_ONE_MINUS_CONSTANT_ALPHA 0x8004 // GL_ONE_MINUS_CONSTANT_ALPHA
+
+// GL blending functions/equations
+#define RL_FUNC_ADD 0x8006 // GL_FUNC_ADD
+#define RL_MIN 0x8007 // GL_MIN
+#define RL_MAX 0x8008 // GL_MAX
+#define RL_FUNC_SUBTRACT 0x800A // GL_FUNC_SUBTRACT
+#define RL_FUNC_REVERSE_SUBTRACT 0x800B // GL_FUNC_REVERSE_SUBTRACT
+#define RL_BLEND_EQUATION 0x8009 // GL_BLEND_EQUATION
+#define RL_BLEND_EQUATION_RGB 0x8009 // GL_BLEND_EQUATION_RGB // (Same as BLEND_EQUATION)
+#define RL_BLEND_EQUATION_ALPHA 0x883D // GL_BLEND_EQUATION_ALPHA
+#define RL_BLEND_DST_RGB 0x80C8 // GL_BLEND_DST_RGB
+#define RL_BLEND_SRC_RGB 0x80C9 // GL_BLEND_SRC_RGB
+#define RL_BLEND_DST_ALPHA 0x80CA // GL_BLEND_DST_ALPHA
+#define RL_BLEND_SRC_ALPHA 0x80CB // GL_BLEND_SRC_ALPHA
+#define RL_BLEND_COLOR 0x8005 // GL_BLEND_COLOR
+
+
//----------------------------------------------------------------------------------
// Types and Structures Definition
//----------------------------------------------------------------------------------
-typedef enum {
- OPENGL_11 = 1,
- OPENGL_21,
- OPENGL_33,
- OPENGL_43,
- OPENGL_ES_20
-} rlGlVersion;
-
-typedef enum {
- RL_ATTACHMENT_COLOR_CHANNEL0 = 0,
- RL_ATTACHMENT_COLOR_CHANNEL1,
- RL_ATTACHMENT_COLOR_CHANNEL2,
- RL_ATTACHMENT_COLOR_CHANNEL3,
- RL_ATTACHMENT_COLOR_CHANNEL4,
- RL_ATTACHMENT_COLOR_CHANNEL5,
- RL_ATTACHMENT_COLOR_CHANNEL6,
- RL_ATTACHMENT_COLOR_CHANNEL7,
- RL_ATTACHMENT_DEPTH = 100,
- RL_ATTACHMENT_STENCIL = 200,
-} rlFramebufferAttachType;
+#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) || (defined(_MSC_VER) && _MSC_VER >= 1800)
+ #include <stdbool.h>
+#elif !defined(__cplusplus) && !defined(bool) && !defined(RL_BOOL_TYPE)
+ // Boolean type
+typedef enum bool { false = 0, true = !false } bool;
+#endif
-typedef enum {
- RL_ATTACHMENT_CUBEMAP_POSITIVE_X = 0,
- RL_ATTACHMENT_CUBEMAP_NEGATIVE_X,
- RL_ATTACHMENT_CUBEMAP_POSITIVE_Y,
- RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y,
- RL_ATTACHMENT_CUBEMAP_POSITIVE_Z,
- RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z,
- RL_ATTACHMENT_TEXTURE2D = 100,
- RL_ATTACHMENT_RENDERBUFFER = 200,
-} rlFramebufferAttachTextureType;
+#if !defined(RL_MATRIX_TYPE)
+// Matrix, 4x4 components, column major, OpenGL style, right handed
+typedef struct Matrix {
+ float m0, m4, m8, m12; // Matrix first row (4 components)
+ float m1, m5, m9, m13; // Matrix second row (4 components)
+ float m2, m6, m10, m14; // Matrix third row (4 components)
+ float m3, m7, m11, m15; // Matrix fourth row (4 components)
+} Matrix;
+#define RL_MATRIX_TYPE
+#endif
// Dynamic vertex buffers (position + texcoords + colors + indices arrays)
typedef struct rlVertexBuffer {
@@ -343,8 +362,8 @@ typedef struct rlDrawCall {
//unsigned int shaderId; // Shader id to be used on the draw -> Using RLGL.currentShaderId
unsigned int textureId; // Texture id to be used on the draw -> Use to create new draw call if changes
- //Matrix projection; // Projection matrix for this draw -> Using RLGL.projection by default
- //Matrix modelview; // Modelview matrix for this draw -> Using RLGL.modelview by default
+ //Matrix projection; // Projection matrix for this draw -> Using RLGL.projection by default
+ //Matrix modelview; // Modelview matrix for this draw -> Using RLGL.modelview by default
} rlDrawCall;
// rlRenderBatch type
@@ -358,38 +377,30 @@ typedef struct rlRenderBatch {
float currentDepth; // Current depth value for next draw
} rlRenderBatch;
-#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) || (defined(_MSC_VER) && _MSC_VER >= 1800)
- #include <stdbool.h>
-#elif !defined(__cplusplus) && !defined(bool) && !defined(RL_BOOL_TYPE)
- // Boolean type
-typedef enum bool { false = 0, true = !false } bool;
-#endif
-
-#if !defined(RL_MATRIX_TYPE)
-// Matrix, 4x4 components, column major, OpenGL style, right handed
-typedef struct Matrix {
- float m0, m4, m8, m12; // Matrix first row (4 components)
- float m1, m5, m9, m13; // Matrix second row (4 components)
- float m2, m6, m10, m14; // Matrix third row (4 components)
- float m3, m7, m11, m15; // Matrix fourth row (4 components)
-} Matrix;
-#define RL_MATRIX_TYPE
-#endif
+// OpenGL version
+typedef enum {
+ RL_OPENGL_11 = 1, // OpenGL 1.1
+ 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)
+} rlGlVersion;
// Trace log level
// NOTE: Organized by priority level
typedef enum {
- RL_LOG_ALL = 0, // Display all logs
- RL_LOG_TRACE, // Trace logging, intended for internal use only
- RL_LOG_DEBUG, // Debug logging, used for internal debugging, it should be disabled on release builds
- RL_LOG_INFO, // Info logging, used for program execution info
- RL_LOG_WARNING, // Warning logging, used on recoverable failures
- RL_LOG_ERROR, // Error logging, used on unrecoverable failures
- RL_LOG_FATAL, // Fatal logging, used to abort program: exit(EXIT_FAILURE)
- RL_LOG_NONE // Disable logging
+ RL_LOG_ALL = 0, // Display all logs
+ RL_LOG_TRACE, // Trace logging, intended for internal use only
+ RL_LOG_DEBUG, // Debug logging, used for internal debugging, it should be disabled on release builds
+ RL_LOG_INFO, // Info logging, used for program execution info
+ RL_LOG_WARNING, // Warning logging, used on recoverable failures
+ RL_LOG_ERROR, // Error logging, used on unrecoverable failures
+ RL_LOG_FATAL, // Fatal logging, used to abort program: exit(EXIT_FAILURE)
+ RL_LOG_NONE // Disable logging
} rlTraceLogLevel;
-// Texture formats (support depends on OpenGL version)
+// Texture pixel formats
+// NOTE: Support depends on OpenGL version
typedef enum {
RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha)
RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels)
@@ -418,79 +429,113 @@ typedef enum {
// NOTE 1: Filtering considers mipmaps if available in the texture
// NOTE 2: Filter is accordingly set for minification and magnification
typedef enum {
- RL_TEXTURE_FILTER_POINT = 0, // No filter, just pixel approximation
- RL_TEXTURE_FILTER_BILINEAR, // Linear filtering
- RL_TEXTURE_FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps)
- RL_TEXTURE_FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x
- RL_TEXTURE_FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x
- RL_TEXTURE_FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x
+ RL_TEXTURE_FILTER_POINT = 0, // No filter, just pixel approximation
+ RL_TEXTURE_FILTER_BILINEAR, // Linear filtering
+ RL_TEXTURE_FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps)
+ RL_TEXTURE_FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x
+ RL_TEXTURE_FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x
+ RL_TEXTURE_FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x
} rlTextureFilter;
// Color blending modes (pre-defined)
typedef enum {
- RL_BLEND_ALPHA = 0, // Blend textures considering alpha (default)
- RL_BLEND_ADDITIVE, // Blend textures adding colors
- RL_BLEND_MULTIPLIED, // Blend textures multiplying colors
- RL_BLEND_ADD_COLORS, // Blend textures adding colors (alternative)
- RL_BLEND_SUBTRACT_COLORS, // Blend textures subtracting colors (alternative)
- RL_BLEND_ALPHA_PREMULTIPLY, // Blend premultiplied textures considering alpha
- RL_BLEND_CUSTOM // Blend textures using custom src/dst factors (use rlSetBlendFactors())
+ RL_BLEND_ALPHA = 0, // Blend textures considering alpha (default)
+ RL_BLEND_ADDITIVE, // Blend textures adding colors
+ RL_BLEND_MULTIPLIED, // Blend textures multiplying colors
+ RL_BLEND_ADD_COLORS, // Blend textures adding colors (alternative)
+ RL_BLEND_SUBTRACT_COLORS, // Blend textures subtracting colors (alternative)
+ RL_BLEND_ALPHA_PREMULTIPLY, // Blend premultiplied textures considering alpha
+ RL_BLEND_CUSTOM, // Blend textures using custom src/dst factors (use rlSetBlendFactors())
+ RL_BLEND_CUSTOM_SEPARATE // Blend textures using custom src/dst factors (use rlSetBlendFactorsSeparate())
} rlBlendMode;
// Shader location point type
typedef enum {
- RL_SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position
- RL_SHADER_LOC_VERTEX_TEXCOORD01, // Shader location: vertex attribute: texcoord01
- RL_SHADER_LOC_VERTEX_TEXCOORD02, // Shader location: vertex attribute: texcoord02
- RL_SHADER_LOC_VERTEX_NORMAL, // Shader location: vertex attribute: normal
- RL_SHADER_LOC_VERTEX_TANGENT, // Shader location: vertex attribute: tangent
- RL_SHADER_LOC_VERTEX_COLOR, // Shader location: vertex attribute: color
- RL_SHADER_LOC_MATRIX_MVP, // Shader location: matrix uniform: model-view-projection
- RL_SHADER_LOC_MATRIX_VIEW, // Shader location: matrix uniform: view (camera transform)
- RL_SHADER_LOC_MATRIX_PROJECTION, // Shader location: matrix uniform: projection
- RL_SHADER_LOC_MATRIX_MODEL, // Shader location: matrix uniform: model (transform)
- RL_SHADER_LOC_MATRIX_NORMAL, // Shader location: matrix uniform: normal
- RL_SHADER_LOC_VECTOR_VIEW, // Shader location: vector uniform: view
- RL_SHADER_LOC_COLOR_DIFFUSE, // Shader location: vector uniform: diffuse color
- RL_SHADER_LOC_COLOR_SPECULAR, // Shader location: vector uniform: specular color
- RL_SHADER_LOC_COLOR_AMBIENT, // Shader location: vector uniform: ambient color
- RL_SHADER_LOC_MAP_ALBEDO, // Shader location: sampler2d texture: albedo (same as: RL_SHADER_LOC_MAP_DIFFUSE)
- RL_SHADER_LOC_MAP_METALNESS, // Shader location: sampler2d texture: metalness (same as: RL_SHADER_LOC_MAP_SPECULAR)
- RL_SHADER_LOC_MAP_NORMAL, // Shader location: sampler2d texture: normal
- RL_SHADER_LOC_MAP_ROUGHNESS, // Shader location: sampler2d texture: roughness
- RL_SHADER_LOC_MAP_OCCLUSION, // Shader location: sampler2d texture: occlusion
- RL_SHADER_LOC_MAP_EMISSION, // Shader location: sampler2d texture: emission
- RL_SHADER_LOC_MAP_HEIGHT, // Shader location: sampler2d texture: height
- RL_SHADER_LOC_MAP_CUBEMAP, // Shader location: samplerCube texture: cubemap
- RL_SHADER_LOC_MAP_IRRADIANCE, // Shader location: samplerCube texture: irradiance
- RL_SHADER_LOC_MAP_PREFILTER, // Shader location: samplerCube texture: prefilter
- RL_SHADER_LOC_MAP_BRDF // Shader location: sampler2d texture: brdf
+ RL_SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position
+ RL_SHADER_LOC_VERTEX_TEXCOORD01, // Shader location: vertex attribute: texcoord01
+ RL_SHADER_LOC_VERTEX_TEXCOORD02, // Shader location: vertex attribute: texcoord02
+ RL_SHADER_LOC_VERTEX_NORMAL, // Shader location: vertex attribute: normal
+ RL_SHADER_LOC_VERTEX_TANGENT, // Shader location: vertex attribute: tangent
+ RL_SHADER_LOC_VERTEX_COLOR, // Shader location: vertex attribute: color
+ RL_SHADER_LOC_MATRIX_MVP, // Shader location: matrix uniform: model-view-projection
+ RL_SHADER_LOC_MATRIX_VIEW, // Shader location: matrix uniform: view (camera transform)
+ RL_SHADER_LOC_MATRIX_PROJECTION, // Shader location: matrix uniform: projection
+ RL_SHADER_LOC_MATRIX_MODEL, // Shader location: matrix uniform: model (transform)
+ RL_SHADER_LOC_MATRIX_NORMAL, // Shader location: matrix uniform: normal
+ RL_SHADER_LOC_VECTOR_VIEW, // Shader location: vector uniform: view
+ RL_SHADER_LOC_COLOR_DIFFUSE, // Shader location: vector uniform: diffuse color
+ RL_SHADER_LOC_COLOR_SPECULAR, // Shader location: vector uniform: specular color
+ RL_SHADER_LOC_COLOR_AMBIENT, // Shader location: vector uniform: ambient color
+ RL_SHADER_LOC_MAP_ALBEDO, // Shader location: sampler2d texture: albedo (same as: RL_SHADER_LOC_MAP_DIFFUSE)
+ RL_SHADER_LOC_MAP_METALNESS, // Shader location: sampler2d texture: metalness (same as: RL_SHADER_LOC_MAP_SPECULAR)
+ RL_SHADER_LOC_MAP_NORMAL, // Shader location: sampler2d texture: normal
+ RL_SHADER_LOC_MAP_ROUGHNESS, // Shader location: sampler2d texture: roughness
+ RL_SHADER_LOC_MAP_OCCLUSION, // Shader location: sampler2d texture: occlusion
+ RL_SHADER_LOC_MAP_EMISSION, // Shader location: sampler2d texture: emission
+ RL_SHADER_LOC_MAP_HEIGHT, // Shader location: sampler2d texture: height
+ RL_SHADER_LOC_MAP_CUBEMAP, // Shader location: samplerCube texture: cubemap
+ RL_SHADER_LOC_MAP_IRRADIANCE, // Shader location: samplerCube texture: irradiance
+ RL_SHADER_LOC_MAP_PREFILTER, // Shader location: samplerCube texture: prefilter
+ RL_SHADER_LOC_MAP_BRDF // Shader location: sampler2d texture: brdf
} rlShaderLocationIndex;
-#define RL_SHADER_LOC_MAP_DIFFUSE RL_SHADER_LOC_MAP_ALBEDO
-#define RL_SHADER_LOC_MAP_SPECULAR RL_SHADER_LOC_MAP_METALNESS
+#define RL_SHADER_LOC_MAP_DIFFUSE RL_SHADER_LOC_MAP_ALBEDO
+#define RL_SHADER_LOC_MAP_SPECULAR RL_SHADER_LOC_MAP_METALNESS
// Shader uniform data type
typedef enum {
- RL_SHADER_UNIFORM_FLOAT = 0, // Shader uniform type: float
- RL_SHADER_UNIFORM_VEC2, // Shader uniform type: vec2 (2 float)
- RL_SHADER_UNIFORM_VEC3, // Shader uniform type: vec3 (3 float)
- RL_SHADER_UNIFORM_VEC4, // Shader uniform type: vec4 (4 float)
- RL_SHADER_UNIFORM_INT, // Shader uniform type: int
- RL_SHADER_UNIFORM_IVEC2, // Shader uniform type: ivec2 (2 int)
- RL_SHADER_UNIFORM_IVEC3, // Shader uniform type: ivec3 (3 int)
- RL_SHADER_UNIFORM_IVEC4, // Shader uniform type: ivec4 (4 int)
- RL_SHADER_UNIFORM_SAMPLER2D // Shader uniform type: sampler2d
+ RL_SHADER_UNIFORM_FLOAT = 0, // Shader uniform type: float
+ RL_SHADER_UNIFORM_VEC2, // Shader uniform type: vec2 (2 float)
+ RL_SHADER_UNIFORM_VEC3, // Shader uniform type: vec3 (3 float)
+ RL_SHADER_UNIFORM_VEC4, // Shader uniform type: vec4 (4 float)
+ RL_SHADER_UNIFORM_INT, // Shader uniform type: int
+ RL_SHADER_UNIFORM_IVEC2, // Shader uniform type: ivec2 (2 int)
+ RL_SHADER_UNIFORM_IVEC3, // Shader uniform type: ivec3 (3 int)
+ RL_SHADER_UNIFORM_IVEC4, // Shader uniform type: ivec4 (4 int)
+ RL_SHADER_UNIFORM_SAMPLER2D // Shader uniform type: sampler2d
} rlShaderUniformDataType;
// Shader attribute data types
typedef enum {
- RL_SHADER_ATTRIB_FLOAT = 0, // Shader attribute type: float
- RL_SHADER_ATTRIB_VEC2, // Shader attribute type: vec2 (2 float)
- RL_SHADER_ATTRIB_VEC3, // Shader attribute type: vec3 (3 float)
- RL_SHADER_ATTRIB_VEC4 // Shader attribute type: vec4 (4 float)
+ RL_SHADER_ATTRIB_FLOAT = 0, // Shader attribute type: float
+ RL_SHADER_ATTRIB_VEC2, // Shader attribute type: vec2 (2 float)
+ RL_SHADER_ATTRIB_VEC3, // Shader attribute type: vec3 (3 float)
+ RL_SHADER_ATTRIB_VEC4 // Shader attribute type: vec4 (4 float)
} rlShaderAttributeDataType;
+// 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
+} 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
+} rlFramebufferAttachTextureType;
+
+// Face culling mode
+typedef enum {
+ RL_CULL_FACE_FRONT = 0,
+ RL_CULL_FACE_BACK
+} rlCullMode;
+
//------------------------------------------------------------------------------------
// Functions Declaration - Matrix operations
//------------------------------------------------------------------------------------
@@ -501,12 +546,12 @@ extern "C" { // Prevents name mangling of functions
RLAPI void rlMatrixMode(int mode); // Choose the current matrix to be transformed
RLAPI void rlPushMatrix(void); // Push the current matrix to stack
-RLAPI void rlPopMatrix(void); // Pop lattest inserted matrix from stack
+RLAPI void rlPopMatrix(void); // Pop latest inserted matrix from stack
RLAPI void rlLoadIdentity(void); // Reset current matrix to identity matrix
RLAPI void rlTranslatef(float x, float y, float z); // Multiply the current matrix by a translation matrix
RLAPI void rlRotatef(float angle, float x, float y, float z); // Multiply the current matrix by a rotation matrix
RLAPI void rlScalef(float x, float y, float z); // Multiply the current matrix by a scaling matrix
-RLAPI void rlMultMatrixf(float *matf); // Multiply the current matrix by another matrix
+RLAPI void rlMultMatrixf(const float *matf); // Multiply the current matrix by another matrix
RLAPI void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar);
RLAPI void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar);
RLAPI void rlViewport(int x, int y, int width, int height); // Set the viewport area
@@ -552,6 +597,7 @@ RLAPI void rlDisableTexture(void); // Disable texture
RLAPI void rlEnableTextureCubemap(unsigned int id); // Enable texture cubemap
RLAPI void rlDisableTextureCubemap(void); // Disable texture cubemap
RLAPI void rlTextureParameters(unsigned int id, int param, int value); // Set texture parameters (filter, wrap)
+RLAPI void rlCubemapParameters(unsigned int id, int param, int value); // Set cubemap parameters (filter, wrap)
// Shader state
RLAPI void rlEnableShader(unsigned int id); // Enable shader program
@@ -571,6 +617,7 @@ RLAPI void rlEnableDepthMask(void); // Enable depth write
RLAPI void rlDisableDepthMask(void); // Disable depth write
RLAPI void rlEnableBackfaceCulling(void); // Enable backface culling
RLAPI void rlDisableBackfaceCulling(void); // Disable backface culling
+RLAPI void rlSetCullFace(int mode); // Set face culling mode
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
@@ -589,23 +636,24 @@ RLAPI void rlClearScreenBuffers(void); // Clear used screen buf
RLAPI void rlCheckErrors(void); // Check and log OpenGL error codes
RLAPI void rlSetBlendMode(int mode); // Set blending mode
RLAPI void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation); // Set blending mode factor and equation (using OpenGL factors)
+RLAPI void rlSetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha, int glEqRGB, int glEqAlpha); // Set blending mode factors and equations separately (using OpenGL factors)
//------------------------------------------------------------------------------------
// Functions Declaration - rlgl functionality
//------------------------------------------------------------------------------------
// rlgl initialization functions
-RLAPI void rlglInit(int width, int height); // Initialize rlgl (buffers, shaders, textures, states)
-RLAPI void rlglClose(void); // De-inititialize rlgl (buffers, shaders, textures)
-RLAPI void rlLoadExtensions(void *loader); // Load OpenGL extensions (loader function required)
-RLAPI int rlGetVersion(void); // Get current OpenGL version
-RLAPI void rlSetFramebufferWidth(int width); // Set current framebuffer width
-RLAPI int rlGetFramebufferWidth(void); // Get default framebuffer width
-RLAPI void rlSetFramebufferHeight(int height); // Set current framebuffer height
-RLAPI int rlGetFramebufferHeight(void); // Get default framebuffer height
-
-RLAPI unsigned int rlGetTextureIdDefault(void); // Get default texture id
-RLAPI unsigned int rlGetShaderIdDefault(void); // Get default shader id
-RLAPI int *rlGetShaderLocsDefault(void); // Get default shader locations
+RLAPI void rlglInit(int width, int height); // Initialize rlgl (buffers, shaders, textures, states)
+RLAPI void rlglClose(void); // De-initialize rlgl (buffers, shaders, textures)
+RLAPI void rlLoadExtensions(void *loader); // Load OpenGL extensions (loader function required)
+RLAPI int rlGetVersion(void); // Get current OpenGL version
+RLAPI void rlSetFramebufferWidth(int width); // Set current framebuffer width
+RLAPI int rlGetFramebufferWidth(void); // Get default framebuffer width
+RLAPI void rlSetFramebufferHeight(int height); // Set current framebuffer height
+RLAPI int rlGetFramebufferHeight(void); // Get default framebuffer height
+
+RLAPI unsigned int rlGetTextureIdDefault(void); // Get default texture id
+RLAPI unsigned int rlGetShaderIdDefault(void); // Get default shader id
+RLAPI int *rlGetShaderLocsDefault(void); // Get default shader locations
// Render batch management
// NOTE: rlgl provides a default render batch to behave like OpenGL 1.1 immediate mode
@@ -616,7 +664,8 @@ RLAPI void rlDrawRenderBatch(rlRenderBatch *batch); // D
RLAPI void rlSetRenderBatchActive(rlRenderBatch *batch); // Set the active render batch for rlgl (NULL for default internal)
RLAPI void rlDrawRenderBatchActive(void); // Update and draw internal render batch
RLAPI bool rlCheckRenderBatchLimit(int vCount); // Check internal buffer overflow for a given number of vertex
-RLAPI void rlSetTexture(unsigned int id); // Set current texture for render batch and check buffers limits
+
+RLAPI void rlSetTexture(unsigned int id); // Set current texture for render batch and check buffers limits
//------------------------------------------------------------------------------------------------------------------------
@@ -668,19 +717,19 @@ RLAPI void rlSetShader(unsigned int id, int *locs);
// Compute shader management
RLAPI unsigned int rlLoadComputeShaderProgram(unsigned int shaderId); // Load compute shader program
-RLAPI void rlComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ); // Dispatch compute shader (equivalent to *draw* for graphics pilepine)
+RLAPI void rlComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ); // Dispatch compute shader (equivalent to *draw* for graphics pipeline)
// Shader buffer storage object management (ssbo)
-RLAPI unsigned int rlLoadShaderBuffer(unsigned long long size, const void *data, int usageHint); // Load shader storage buffer object (SSBO)
+RLAPI unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHint); // Load shader storage buffer object (SSBO)
RLAPI void rlUnloadShaderBuffer(unsigned int ssboId); // Unload shader storage buffer object (SSBO)
-RLAPI void rlUpdateShaderBufferElements(unsigned int id, const void *data, unsigned long long dataSize, unsigned long long offset); // Update SSBO buffer data
-RLAPI unsigned long long rlGetShaderBufferSize(unsigned int id); // Get SSBO buffer size
-RLAPI void rlReadShaderBufferElements(unsigned int id, void *dest, unsigned long long count, unsigned long long offset); // Bind SSBO buffer
-RLAPI void rlBindShaderBuffer(unsigned int id, unsigned int index); // Copy SSBO buffer data
+RLAPI void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int offset); // Update SSBO buffer data
+RLAPI void rlBindShaderBuffer(unsigned int id, unsigned int index); // Bind SSBO buffer
+RLAPI void rlReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsigned int offset); // Read SSBO buffer data (GPU->CPU)
+RLAPI void rlCopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, unsigned int srcOffset, unsigned int count); // Copy SSBO data between buffers
+RLAPI unsigned int rlGetShaderBufferSize(unsigned int id); // Get SSBO buffer size
// Buffer management
-RLAPI void rlCopyBuffersElements(unsigned int destId, unsigned int srcId, unsigned long long destOffset, unsigned long long srcOffset, unsigned long long count); // Copy SSBO buffer data
-RLAPI void rlBindImageTexture(unsigned int id, unsigned int index, unsigned int format, int readonly); // Bind image texture
+RLAPI void rlBindImageTexture(unsigned int id, unsigned int index, int format, bool readonly); // Bind image texture
// Matrix state management
RLAPI Matrix rlGetMatrixModelview(void); // Get internal modelview matrix
@@ -734,23 +783,25 @@ RLAPI void rlLoadDrawQuad(void); // Load and draw a quad
#endif
#if defined(GRAPHICS_API_OPENGL_33)
- #if defined(__APPLE__)
- #include <OpenGL/gl3.h> // OpenGL 3 library for OSX
- #include <OpenGL/gl3ext.h> // OpenGL 3 extensions library for OSX
- #else
- #define GLAD_MALLOC RL_MALLOC
- #define GLAD_FREE RL_FREE
+ #define GLAD_MALLOC RL_MALLOC
+ #define GLAD_FREE RL_FREE
- #define GLAD_GL_IMPLEMENTATION
- #include "external/glad.h" // GLAD extensions loading library, includes OpenGL headers
- #endif
+ #define GLAD_GL_IMPLEMENTATION
+ #include "external/glad.h" // GLAD extensions loading library, includes OpenGL headers
#endif
#if defined(GRAPHICS_API_OPENGL_ES2)
- #define GL_GLEXT_PROTOTYPES
- //#include <EGL/egl.h> // EGL library -> not required, platform layer
- #include <GLES2/gl2.h> // OpenGL ES 2.0 library
- #include <GLES2/gl2ext.h> // OpenGL ES 2.0 extensions library
+ // 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)
+ #define GLAD_GLES2_IMPLEMENTATION
+ #include "external/glad_gles2.h"
+ #else
+ #define GL_GLEXT_PROTOTYPES
+ //#include <EGL/egl.h> // EGL library -> not required, platform layer
+ #include <GLES2/gl2.h> // OpenGL ES 2.0 library
+ #include <GLES2/gl2ext.h> // OpenGL ES 2.0 extensions library
+ #endif
// 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)
@@ -842,22 +893,22 @@ RLAPI void rlLoadDrawQuad(void); // Load and draw a quad
// Default shader vertex attribute names to set location points
#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION
- #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Binded by default to shader location: 0
+ #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: 0
#endif
#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD
- #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Binded by default to shader location: 1
+ #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: 1
#endif
#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL
- #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Binded by default to shader location: 2
+ #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: 2
#endif
#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR
- #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Binded by default to shader location: 3
+ #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: 3
#endif
#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT
- #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Binded by default to shader location: 4
+ #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: 4
#endif
#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2
- #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Binded by default to shader location: 5
+ #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: 5
#endif
#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MVP
@@ -924,10 +975,18 @@ typedef struct rlglData {
Matrix projectionStereo[2]; // VR stereo rendering eyes projection matrices
Matrix viewOffsetStereo[2]; // VR stereo rendering eyes view offset matrices
+ // Blending variables
int currentBlendMode; // Blending mode active
int glBlendSrcFactor; // Blending source factor
int glBlendDstFactor; // Blending destination factor
int glBlendEquation; // Blending equation
+ int glBlendSrcFactorRGB; // Blending source RGB factor
+ int glBlendDestFactorRGB; // Blending destination RGB factor
+ int glBlendSrcFactorAlpha; // Blending source alpha factor
+ int glBlendDestFactorAlpha; // Blending destination alpha factor
+ int glBlendEquationRGB; // Blending equation for RGB
+ int glBlendEquationAlpha; // Blending equation for alpha
+ bool glCustomBlendModeModified; // Custom blending factor and equation modification status
int framebufferWidth; // Current framebuffer width
int framebufferHeight; // Current framebuffer height
@@ -937,7 +996,8 @@ typedef struct rlglData {
bool vao; // VAO support (OpenGL ES2 could not support VAO extension) (GL_ARB_vertex_array_object)
bool instancing; // Instancing supported (GL_ANGLE_instanced_arrays, GL_EXT_draw_instanced + GL_EXT_instanced_arrays)
bool texNPOT; // NPOT textures full support (GL_ARB_texture_non_power_of_two, GL_OES_texture_npot)
- bool texDepth; // Depth textures supported (GL_ARB_depth_texture, GL_WEBGL_depth_texture, GL_OES_depth_texture)
+ bool texDepth; // Depth textures supported (GL_ARB_depth_texture, GL_OES_depth_texture)
+ bool texDepthWebGL; // Depth textures supported WebGL specific (GL_WEBGL_depth_texture)
bool texFloat32; // float textures support (32 bit per channel) (GL_OES_texture_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)
@@ -988,14 +1048,12 @@ static void rlUnloadShaderDefault(void); // Unload default shader
static 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
-#if defined(GRAPHICS_API_OPENGL_11)
-static int rlGenTextureMipmapsData(unsigned char *data, int baseWidth, int baseHeight); // Generate mipmaps data on CPU side
-static unsigned char *rlGenNextMipmapData(unsigned char *srcData, int srcWidth, int srcHeight); // Generate next mipmap level on CPU side
-#endif
+
static int rlGetPixelDataSize(int width, int height, int format); // Get pixel data size in bytes (image or texture)
+
// Auxiliar matrix math functions
-static Matrix rlMatrixIdentity(void); // Get identity matrix
-static Matrix rlMatrixMultiply(Matrix left, Matrix right); // Multiply two matrices
+static Matrix rlMatrixIdentity(void); // Get identity matrix
+static Matrix rlMatrixMultiply(Matrix left, Matrix right); // Multiply two matrices
//----------------------------------------------------------------------------------
// Module Functions Definition - Matrix operations
@@ -1031,7 +1089,7 @@ void rlLoadIdentity(void) { glLoadIdentity(); }
void rlTranslatef(float x, float y, float z) { glTranslatef(x, y, z); }
void rlRotatef(float angle, float x, float y, float z) { glRotatef(angle, x, y, z); }
void rlScalef(float x, float y, float z) { glScalef(x, y, z); }
-void rlMultMatrixf(float *matf) { glMultMatrixf(matf); }
+void rlMultMatrixf(const float *matf) { glMultMatrixf(matf); }
#endif
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
// Choose the current matrix to be transformed
@@ -1156,7 +1214,7 @@ void rlScalef(float x, float y, float z)
}
// Multiply the current matrix by another matrix
-void rlMultMatrixf(float *matf)
+void rlMultMatrixf(const float *matf)
{
// Matrix creation from array
Matrix mat = { matf[0], matf[4], matf[8], matf[12],
@@ -1306,17 +1364,6 @@ void rlEnd(void)
// as well as depth buffer bit-depth (16bit or 24bit or 32bit)
// Correct increment formula would be: depthInc = (zfar - znear)/pow(2, bits)
RLGL.currentBatch->currentDepth += (1.0f/20000.0f);
-
- // Verify internal buffers limits
- // NOTE: This check is combined with usage of rlCheckRenderBatchLimit()
- if (RLGL.State.vertexCounter >= (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4 - 4))
- {
- // WARNING: If we are between rlPushMatrix() and rlPopMatrix() and we need to force a rlDrawRenderBatch(),
- // we need to call rlPopMatrix() before to recover *RLGL.State.currentMatrix (RLGL.State.modelview) for the next forced draw call!
- // If we have multiple matrix pushed, it will require "RLGL.State.stackCounter" pops before launching the draw
- for (int i = RLGL.State.stackCounter; i >= 0; i--) rlPopMatrix();
- rlDrawRenderBatch(RLGL.currentBatch);
- }
}
// Define one vertex (position)
@@ -1335,32 +1382,51 @@ void rlVertex3f(float x, float y, float z)
tz = RLGL.State.transform.m2*x + RLGL.State.transform.m6*y + RLGL.State.transform.m10*z + RLGL.State.transform.m14;
}
- // Verify that current vertex buffer elements limit has not been reached
- if (RLGL.State.vertexCounter < (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4))
+ // WARNING: We can't break primitives when launching a new batch.
+ // RL_LINES comes in pairs, RL_TRIANGLES come in groups of 3 vertices and RL_QUADS come in groups of 4 vertices.
+ // We must check current draw.mode when a new vertex is required and finish the batch only if the draw.mode draw.vertexCount is %2, %3 or %4
+ if (RLGL.State.vertexCounter > (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4 - 4))
{
- // Add vertices
- RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter] = tx;
- RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 1] = ty;
- RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 2] = tz;
+ if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_LINES) &&
+ (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%2 == 0))
+ {
+ // Reached the maximum number of vertices for RL_LINES drawing
+ // Launch a draw call but keep current state for next vertices comming
+ // NOTE: We add +1 vertex to the check for security
+ rlCheckRenderBatchLimit(2 + 1);
+ }
+ else if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) &&
+ (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%3 == 0))
+ {
+ rlCheckRenderBatchLimit(3 + 1);
+ }
+ else if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_QUADS) &&
+ (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4 == 0))
+ {
+ rlCheckRenderBatchLimit(4 + 1);
+ }
+ }
- // Add current texcoord
- 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;
+ // Add vertices
+ RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter] = tx;
+ RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 1] = ty;
+ RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 2] = tz;
- // TODO: Add current normal
- // By default rlVertexBuffer type does not store normals
+ // Add current texcoord
+ 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;
- // Add current color
- RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter] = RLGL.State.colorr;
- RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 1] = RLGL.State.colorg;
- RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 2] = RLGL.State.colorb;
- RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 3] = RLGL.State.colora;
+ // TODO: Add current normal
+ // By default rlVertexBuffer type does not store normals
- RLGL.State.vertexCounter++;
+ // Add current color
+ RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter] = RLGL.State.colorr;
+ RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 1] = RLGL.State.colorg;
+ RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 2] = RLGL.State.colorb;
+ RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 3] = RLGL.State.colora;
- RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount++;
- }
- else TRACELOG(RL_LOG_ERROR, "RLGL: Batch elements overflow");
+ RLGL.State.vertexCounter++;
+ RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount++;
}
// Define one vertex (position)
@@ -1551,12 +1617,59 @@ void rlTextureParameters(unsigned int id, int param, int value)
else TRACELOG(RL_LOG_WARNING, "GL: Anisotropic filtering not supported");
#endif
} break;
+#if defined(GRAPHICS_API_OPENGL_33)
+ case RL_TEXTURE_MIPMAP_BIAS_RATIO: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, value/100.0f);
+#endif
default: break;
}
glBindTexture(GL_TEXTURE_2D, 0);
}
+// Set cubemap parameters (wrap mode/filter mode)
+void rlCubemapParameters(unsigned int id, int param, int value)
+{
+#if !defined(GRAPHICS_API_OPENGL_11)
+ glBindTexture(GL_TEXTURE_CUBE_MAP, id);
+
+ // Reset anisotropy filter, in case it was set
+ glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
+
+ switch (param)
+ {
+ case RL_TEXTURE_WRAP_S:
+ case RL_TEXTURE_WRAP_T:
+ {
+ if (value == RL_TEXTURE_WRAP_MIRROR_CLAMP)
+ {
+ if (RLGL.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value);
+ else TRACELOG(RL_LOG_WARNING, "GL: Clamp mirror wrap mode not supported (GL_MIRROR_CLAMP_EXT)");
+ }
+ else glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value);
+
+ } break;
+ case RL_TEXTURE_MAG_FILTER:
+ case RL_TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); break;
+ case RL_TEXTURE_FILTER_ANISOTROPIC:
+ {
+ if (value <= RLGL.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value);
+ else if (RLGL.ExtSupported.maxAnisotropyLevel > 0.0f)
+ {
+ TRACELOG(RL_LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, (int)RLGL.ExtSupported.maxAnisotropyLevel);
+ glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value);
+ }
+ else TRACELOG(RL_LOG_WARNING, "GL: Anisotropic filtering not supported");
+ } break;
+#if defined(GRAPHICS_API_OPENGL_33)
+ case RL_TEXTURE_MIPMAP_BIAS_RATIO: glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_LOD_BIAS, value/100.0f);
+#endif
+ default: break;
+ }
+
+ glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
+#endif
+}
+
// Enable shader program
void rlEnableShader(unsigned int id)
{
@@ -1650,6 +1763,17 @@ void rlEnableBackfaceCulling(void) { glEnable(GL_CULL_FACE); }
// Disable backface culling
void rlDisableBackfaceCulling(void) { glDisable(GL_CULL_FACE); }
+// Set face culling mode
+void rlSetCullFace(int mode)
+{
+ switch (mode)
+ {
+ case RL_CULL_FACE_BACK: glCullFace(GL_BACK); break;
+ case RL_CULL_FACE_FRONT: glCullFace(GL_FRONT); break;
+ default: break;
+ }
+}
+
// Enable scissor test
void rlEnableScissorTest(void) { glEnable(GL_SCISSOR_TEST); }
@@ -1777,7 +1901,7 @@ void rlCheckErrors()
void rlSetBlendMode(int mode)
{
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
- if (RLGL.State.currentBlendMode != mode)
+ if ((RLGL.State.currentBlendMode != mode) || ((mode == RL_BLEND_CUSTOM || mode == RL_BLEND_CUSTOM_SEPARATE) && RLGL.State.glCustomBlendModeModified))
{
rlDrawRenderBatch(RLGL.currentBatch);
@@ -1793,11 +1917,20 @@ void rlSetBlendMode(int mode)
{
// NOTE: Using GL blend src/dst factors and GL equation configured with rlSetBlendFactors()
glBlendFunc(RLGL.State.glBlendSrcFactor, RLGL.State.glBlendDstFactor); glBlendEquation(RLGL.State.glBlendEquation);
+
+ } break;
+ case RL_BLEND_CUSTOM_SEPARATE:
+ {
+ // NOTE: Using GL blend src/dst factors and GL equation configured with rlSetBlendFactorsSeparate()
+ glBlendFuncSeparate(RLGL.State.glBlendSrcFactorRGB, RLGL.State.glBlendDestFactorRGB, RLGL.State.glBlendSrcFactorAlpha, RLGL.State.glBlendDestFactorAlpha);
+ glBlendEquationSeparate(RLGL.State.glBlendEquationRGB, RLGL.State.glBlendEquationAlpha);
+
} break;
default: break;
}
RLGL.State.currentBlendMode = mode;
+ RLGL.State.glCustomBlendModeModified = false;
}
#endif
}
@@ -1806,9 +1939,39 @@ void rlSetBlendMode(int mode)
void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation)
{
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
- RLGL.State.glBlendSrcFactor = glSrcFactor;
- RLGL.State.glBlendDstFactor = glDstFactor;
- RLGL.State.glBlendEquation = glEquation;
+ if ((RLGL.State.glBlendSrcFactor != glSrcFactor) ||
+ (RLGL.State.glBlendDstFactor != glDstFactor) ||
+ (RLGL.State.glBlendEquation != glEquation))
+ {
+ RLGL.State.glBlendSrcFactor = glSrcFactor;
+ RLGL.State.glBlendDstFactor = glDstFactor;
+ RLGL.State.glBlendEquation = glEquation;
+
+ RLGL.State.glCustomBlendModeModified = true;
+ }
+#endif
+}
+
+// Set blending mode factor and equation separately for RGB and alpha
+void rlSetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha, int glEqRGB, int glEqAlpha)
+{
+#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
+ if ((RLGL.State.glBlendSrcFactorRGB != glSrcRGB) ||
+ (RLGL.State.glBlendDestFactorRGB != glDstRGB) ||
+ (RLGL.State.glBlendSrcFactorAlpha != glSrcAlpha) ||
+ (RLGL.State.glBlendDestFactorAlpha != glDstAlpha) ||
+ (RLGL.State.glBlendEquationRGB != glEqRGB) ||
+ (RLGL.State.glBlendEquationAlpha != glEqAlpha))
+ {
+ RLGL.State.glBlendSrcFactorRGB = glSrcRGB;
+ RLGL.State.glBlendDestFactorRGB = glDstRGB;
+ RLGL.State.glBlendSrcFactorAlpha = glSrcAlpha;
+ RLGL.State.glBlendDestFactorAlpha = glDstAlpha;
+ RLGL.State.glBlendEquationRGB = glEqRGB;
+ RLGL.State.glBlendEquationAlpha = glEqAlpha;
+
+ RLGL.State.glCustomBlendModeModified = true;
+ }
#endif
}
@@ -1983,10 +2146,8 @@ void rlLoadExtensions(void *loader)
{
#if defined(GRAPHICS_API_OPENGL_33) // Also defined for GRAPHICS_API_OPENGL_21
// NOTE: glad is generated and contains only required OpenGL 3.3 Core extensions (and lower versions)
- #if !defined(__APPLE__)
- if (gladLoadGL((GLADloadfunc)loader) == 0) TRACELOG(RL_LOG_WARNING, "GLAD: Cannot load OpenGL extensions");
- else TRACELOG(RL_LOG_INFO, "GLAD: OpenGL extensions loaded successfully");
- #endif
+ if (gladLoadGL((GLADloadfunc)loader) == 0) TRACELOG(RL_LOG_WARNING, "GLAD: Cannot load OpenGL extensions");
+ else TRACELOG(RL_LOG_INFO, "GLAD: OpenGL extensions loaded successfully");
// Get number of supported extensions
GLint numExt = 0;
@@ -2000,6 +2161,18 @@ void rlLoadExtensions(void *loader)
for (int i = 0; i < numExt; i++) TRACELOG(RL_LOG_INFO, " %s", glGetStringi(GL_EXTENSIONS, i));
#endif
+#if defined(GRAPHICS_API_OPENGL_21)
+ // Register supported extensions flags
+ // Optional OpenGL 2.1 extensions
+ RLGL.ExtSupported.vao = GLAD_GL_ARB_vertex_array_object;
+ 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.texDepth = GLAD_GL_ARB_depth_texture;
+ RLGL.ExtSupported.maxDepthBits = 32;
+ RLGL.ExtSupported.texAnisoFilter = GLAD_GL_EXT_texture_filter_anisotropic;
+ RLGL.ExtSupported.texMirrorClamp = GLAD_GL_EXT_texture_mirror_clamp;
+#else
// Register supported extensions flags
// OpenGL 3.3 extensions supported by default (core)
RLGL.ExtSupported.vao = true;
@@ -2010,18 +2183,26 @@ void rlLoadExtensions(void *loader)
RLGL.ExtSupported.maxDepthBits = 32;
RLGL.ExtSupported.texAnisoFilter = true;
RLGL.ExtSupported.texMirrorClamp = true;
+#endif
+
+ // Optional OpenGL 3.3 extensions
+ RLGL.ExtSupported.texCompASTC = GLAD_GL_KHR_texture_compression_astc_hdr && GLAD_GL_KHR_texture_compression_astc_ldr;
+ RLGL.ExtSupported.texCompDXT = GLAD_GL_EXT_texture_compression_s3tc; // Texture compression: DXT
+ RLGL.ExtSupported.texCompETC2 = GLAD_GL_ARB_ES3_compatibility; // Texture compression: ETC2/EAC
#if defined(GRAPHICS_API_OPENGL_43)
- if (GLAD_GL_ARB_compute_shader) RLGL.ExtSupported.computeShader = true;
- if (GLAD_GL_ARB_shader_storage_buffer_object) RLGL.ExtSupported.ssbo = true;
- #endif
- #if !defined(__APPLE__)
- // NOTE: With GLAD, we can check if an extension is supported using the GLAD_GL_xxx booleans
- if (GLAD_GL_EXT_texture_compression_s3tc) RLGL.ExtSupported.texCompDXT = true; // Texture compression: DXT
- if (GLAD_GL_ARB_ES3_compatibility) RLGL.ExtSupported.texCompETC2 = true; // Texture compression: ETC2/EAC
+ RLGL.ExtSupported.computeShader = GLAD_GL_ARB_compute_shader;
+ RLGL.ExtSupported.ssbo = GLAD_GL_ARB_shader_storage_buffer_object;
#endif
+
#endif // GRAPHICS_API_OPENGL_33
#if defined(GRAPHICS_API_OPENGL_ES2)
+
+ #if defined(PLATFORM_DESKTOP)
+ 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");
+ #endif
+
// Get supported extensions list
GLint numExt = 0;
const char **extList = RL_MALLOC(512*sizeof(const char *)); // Allocate 512 strings pointers (2 KB)
@@ -2097,11 +2278,12 @@ void rlLoadExtensions(void *loader)
if (strcmp(extList[i], (const char *)"GL_OES_texture_float") == 0) RLGL.ExtSupported.texFloat32 = true;
// Check depth texture support
- if ((strcmp(extList[i], (const char *)"GL_OES_depth_texture") == 0) ||
- (strcmp(extList[i], (const char *)"GL_WEBGL_depth_texture") == 0)) RLGL.ExtSupported.texDepth = true;
+ if (strcmp(extList[i], (const char *)"GL_OES_depth_texture") == 0) RLGL.ExtSupported.texDepth = true;
+ if (strcmp(extList[i], (const char *)"GL_WEBGL_depth_texture") == 0) RLGL.ExtSupported.texDepthWebGL = true; // WebGL requires unsized internal format
+ if (RLGL.ExtSupported.texDepthWebGL) RLGL.ExtSupported.texDepth = true;
- if (strcmp(extList[i], (const char *)"GL_OES_depth24") == 0) RLGL.ExtSupported.maxDepthBits = 24;
- if (strcmp(extList[i], (const char *)"GL_OES_depth32") == 0) RLGL.ExtSupported.maxDepthBits = 32;
+ if (strcmp(extList[i], (const char *)"GL_OES_depth24") == 0) RLGL.ExtSupported.maxDepthBits = 24; // Not available on WebGL
+ if (strcmp(extList[i], (const char *)"GL_OES_depth32") == 0) RLGL.ExtSupported.maxDepthBits = 32; // Not available on WebGL
// Check texture compression support: DXT
if ((strcmp(extList[i], (const char *)"GL_EXT_texture_compression_s3tc") == 0) ||
@@ -2184,12 +2366,10 @@ void rlLoadExtensions(void *loader)
#else // RLGL_SHOW_GL_DETAILS_INFO
// Show some basic info about GL supported features
- #if defined(GRAPHICS_API_OPENGL_ES2)
if (RLGL.ExtSupported.vao) TRACELOG(RL_LOG_INFO, "GL: VAO extension detected, VAO functions loaded successfully");
else TRACELOG(RL_LOG_WARNING, "GL: VAO extension not found, VAO not supported");
if (RLGL.ExtSupported.texNPOT) TRACELOG(RL_LOG_INFO, "GL: NPOT textures extension detected, full NPOT textures supported");
else TRACELOG(RL_LOG_WARNING, "GL: NPOT textures extension not found, limited NPOT support (no-mipmaps, no-repeat)");
- #endif
if (RLGL.ExtSupported.texCompDXT) TRACELOG(RL_LOG_INFO, "GL: DXT compressed textures supported");
if (RLGL.ExtSupported.texCompETC1) TRACELOG(RL_LOG_INFO, "GL: ETC1 compressed textures supported");
if (RLGL.ExtSupported.texCompETC2) TRACELOG(RL_LOG_INFO, "GL: ETC2/EAC compressed textures supported");
@@ -2207,22 +2387,18 @@ int rlGetVersion(void)
{
int glVersion = 0;
#if defined(GRAPHICS_API_OPENGL_11)
- glVersion = OPENGL_11;
+ glVersion = RL_OPENGL_11;
#endif
#if defined(GRAPHICS_API_OPENGL_21)
- #if defined(__APPLE__)
- glVersion = OPENGL_33; // NOTE: Force OpenGL 3.3 on OSX
- #else
- glVersion = OPENGL_21;
- #endif
+ glVersion = RL_OPENGL_21;
#elif defined(GRAPHICS_API_OPENGL_33)
- glVersion = OPENGL_33;
+ glVersion = RL_OPENGL_33;
#endif
#if defined(GRAPHICS_API_OPENGL_43)
- glVersion = OPENGL_43;
+ glVersion = RL_OPENGL_43;
#endif
#if defined(GRAPHICS_API_OPENGL_ES2)
- glVersion = OPENGL_ES_20;
+ glVersion = RL_OPENGL_ES_20;
#endif
return glVersion;
}
@@ -2592,7 +2768,7 @@ void rlDrawRenderBatch(rlRenderBatch *batch)
for (int i = 0, vertexOffset = 0; i < batch->drawCounter; i++)
{
- // Bind current draw call texture, activated as GL_TEXTURE0 and binded to sampler2D texture0 by default
+ // Bind current draw call texture, activated as GL_TEXTURE0 and Bound to sampler2D texture0 by default
glBindTexture(GL_TEXTURE_2D, batch->draws[i].textureId);
if ((batch->draws[i].mode == RL_LINES) || (batch->draws[i].mode == RL_TRIANGLES)) glDrawArrays(batch->draws[i].mode, vertexOffset, batch->draws[i].vertexCount);
@@ -2692,10 +2868,12 @@ bool rlCheckRenderBatchLimit(int vCount)
if ((RLGL.State.vertexCounter + vCount) >=
(RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4))
{
+ overflow = true;
+
+ // Store current primitive drawing mode and texture id
int currentMode = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode;
int currentTexture = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId;
- overflow = true;
rlDrawRenderBatch(RLGL.currentBatch); // NOTE: Stereo rendering is checked inside
// Restore state of last batch so we can continue adding vertices
@@ -2712,10 +2890,10 @@ bool rlCheckRenderBatchLimit(int vCount)
// Convert image data to OpenGL texture (returns OpenGL valid Id)
unsigned int rlLoadTexture(const void *data, int width, int height, int format, int mipmapCount)
{
- glBindTexture(GL_TEXTURE_2D, 0); // Free any old binding
-
unsigned int id = 0;
+ glBindTexture(GL_TEXTURE_2D, 0); // Free any old binding
+
// Check texture format support by OpenGL 1.1 (compressed textures not supported)
#if defined(GRAPHICS_API_OPENGL_11)
if (format >= RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)
@@ -2858,7 +3036,7 @@ unsigned int rlLoadTexture(const void *data, int width, int height, int format,
}
// Load depth texture/renderbuffer (to be attached to fbo)
-// WARNING: OpenGL ES 2.0 requires GL_OES_depth_texture/WEBGL_depth_texture extensions
+// WARNING: OpenGL ES 2.0 requires GL_OES_depth_texture and WebGL requires WEBGL_depth_texture extensions
unsigned int rlLoadTextureDepth(int width, int height, bool useRenderBuffer)
{
unsigned int id = 0;
@@ -2872,9 +3050,14 @@ unsigned int rlLoadTextureDepth(int width, int height, bool useRenderBuffer)
unsigned int glInternalFormat = GL_DEPTH_COMPONENT;
#if defined(GRAPHICS_API_OPENGL_ES2)
- if (RLGL.ExtSupported.maxDepthBits == 32) glInternalFormat = GL_DEPTH_COMPONENT32_OES;
- else if (RLGL.ExtSupported.maxDepthBits == 24) glInternalFormat = GL_DEPTH_COMPONENT24_OES;
- else glInternalFormat = GL_DEPTH_COMPONENT16;
+ // 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)
+ {
+ if (RLGL.ExtSupported.maxDepthBits == 32) glInternalFormat = GL_DEPTH_COMPONENT32_OES;
+ else if (RLGL.ExtSupported.maxDepthBits == 24) glInternalFormat = GL_DEPTH_COMPONENT24_OES;
+ else glInternalFormat = GL_DEPTH_COMPONENT16;
+ }
#endif
if (!useRenderBuffer && RLGL.ExtSupported.texDepth)
@@ -3063,8 +3246,10 @@ void rlUnloadTexture(unsigned int id)
}
// Generate mipmap data for selected texture
+// NOTE: Only supports GPU mipmap generation
void rlGenTextureMipmaps(unsigned int id, int width, int height, int format, int *mipmaps)
{
+#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
glBindTexture(GL_TEXTURE_2D, id);
// Check if texture is power-of-two (POT)
@@ -3073,46 +3258,6 @@ void rlGenTextureMipmaps(unsigned int id, int width, int height, int format, int
if (((width > 0) && ((width & (width - 1)) == 0)) &&
((height > 0) && ((height & (height - 1)) == 0))) texIsPOT = true;
-#if defined(GRAPHICS_API_OPENGL_11)
- if (texIsPOT)
- {
- // WARNING: Manual mipmap generation only works for RGBA 32bit textures!
- if (format == RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8)
- {
- // Retrieve texture data from VRAM
- void *texData = rlReadTexturePixels(id, width, height, format);
-
- // NOTE: Texture data size is reallocated to fit mipmaps data
- // NOTE: CPU mipmap generation only supports RGBA 32bit data
- int mipmapCount = rlGenTextureMipmapsData(texData, width, height);
-
- int size = width*height*4;
- int offset = size;
-
- int mipWidth = width/2;
- int mipHeight = height/2;
-
- // Load the mipmaps
- for (int level = 1; level < mipmapCount; level++)
- {
- glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA8, mipWidth, mipHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, (unsigned char *)texData + offset);
-
- size = mipWidth*mipHeight*4;
- offset += size;
-
- mipWidth /= 2;
- mipHeight /= 2;
- }
-
- *mipmaps = mipmapCount + 1;
- RL_FREE(texData); // Once mipmaps have been generated and data has been uploaded to GPU VRAM, we can discard RAM data
-
- TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Mipmaps generated manually on CPU side, total: %i", id, *mipmaps);
- }
- else TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Failed to generate mipmaps for provided texture format", id);
- }
-#endif
-#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
if ((texIsPOT) || (RLGL.ExtSupported.texNPOT))
{
//glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE); // Hint for mipmaps generation algorithm: GL_FASTEST, GL_NICEST, GL_DONT_CARE
@@ -3124,10 +3269,12 @@ void rlGenTextureMipmaps(unsigned int id, int width, int height, int format, int
*mipmaps = 1 + (int)floor(log(MAX(width, height))/log(2));
TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Mipmaps generated automatically, total: %i", id, *mipmaps);
}
-#endif
else TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Failed to generate mipmaps", id);
glBindTexture(GL_TEXTURE_2D, 0);
+#else
+ TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] GPU mipmap generation not supported", id);
+#endif
}
@@ -3328,7 +3475,7 @@ void rlUnloadFramebuffer(unsigned int id)
unsigned int depthIdU = (unsigned int)depthId;
if (depthType == GL_RENDERBUFFER) glDeleteRenderbuffers(1, &depthIdU);
- else if (depthType == GL_RENDERBUFFER) glDeleteTextures(1, &depthIdU);
+ else if (depthType == GL_TEXTURE) glDeleteTextures(1, &depthIdU);
// NOTE: If a texture object is deleted while its image is attached to the *currently bound* framebuffer,
// the texture image is automatically detached from the currently bound framebuffer.
@@ -3595,12 +3742,14 @@ unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode)
// NOTE: We detach shader before deletion to make sure memory is freed
if (vertexShaderId != RLGL.State.defaultVShaderId)
{
- glDetachShader(id, vertexShaderId);
+ // WARNING: Shader program linkage could fail and returned id is 0
+ if (id > 0) glDetachShader(id, vertexShaderId);
glDeleteShader(vertexShaderId);
}
if (fragmentShaderId != RLGL.State.defaultFShaderId)
{
- glDetachShader(id, fragmentShaderId);
+ // WARNING: Shader program linkage could fail and returned id is 0
+ if (id > 0) glDetachShader(id, fragmentShaderId);
glDeleteShader(fragmentShaderId);
}
@@ -3708,7 +3857,7 @@ unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId)
glAttachShader(program, vShaderId);
glAttachShader(program, fShaderId);
- // NOTE: Default attribute shader locations must be binded before linking
+ // NOTE: Default attribute shader locations must be Bound before linking
glBindAttribLocation(program, 0, RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION);
glBindAttribLocation(program, 1, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD);
glBindAttribLocation(program, 2, RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL);
@@ -3934,7 +4083,7 @@ void rlComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned
}
// Load shader storage buffer object (SSBO)
-unsigned int rlLoadShaderBuffer(unsigned long long size, const void *data, int usageHint)
+unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHint)
{
unsigned int ssbo = 0;
@@ -3958,7 +4107,7 @@ void rlUnloadShaderBuffer(unsigned int ssboId)
}
// Update SSBO buffer data
-void rlUpdateShaderBufferElements(unsigned int id, const void *data, unsigned long long dataSize, unsigned long long offset)
+void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int offset)
{
#if defined(GRAPHICS_API_OPENGL_43)
glBindBuffer(GL_SHADER_STORAGE_BUFFER, id);
@@ -3967,7 +4116,7 @@ void rlUpdateShaderBufferElements(unsigned int id, const void *data, unsigned lo
}
// Get SSBO buffer size
-unsigned long long rlGetShaderBufferSize(unsigned int id)
+unsigned int rlGetShaderBufferSize(unsigned int id)
{
long long size = 0;
@@ -3976,11 +4125,11 @@ unsigned long long rlGetShaderBufferSize(unsigned int id)
glGetInteger64v(GL_SHADER_STORAGE_BUFFER_SIZE, &size);
#endif
- return (size > 0)? size : 0;
+ return (size > 0)? (unsigned int)size : 0;
}
-// Read SSBO buffer data
-void rlReadShaderBufferElements(unsigned int id, void *dest, unsigned long long count, unsigned long long offset)
+// Read SSBO buffer data (GPU->CPU)
+void rlReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsigned int offset)
{
#if defined(GRAPHICS_API_OPENGL_43)
glBindBuffer(GL_SHADER_STORAGE_BUFFER, id);
@@ -3997,7 +4146,7 @@ void rlBindShaderBuffer(unsigned int id, unsigned int index)
}
// Copy SSBO buffer data
-void rlCopyBuffersElements(unsigned int destId, unsigned int srcId, unsigned long long destOffset, unsigned long long srcOffset, unsigned long long count)
+void rlCopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, unsigned int srcOffset, unsigned int count)
{
#if defined(GRAPHICS_API_OPENGL_43)
glBindBuffer(GL_COPY_READ_BUFFER, srcId);
@@ -4007,7 +4156,7 @@ void rlCopyBuffersElements(unsigned int destId, unsigned int srcId, unsigned lon
}
// Bind image texture
-void rlBindImageTexture(unsigned int id, unsigned int index, unsigned int format, int readonly)
+void rlBindImageTexture(unsigned int id, unsigned int index, int format, bool readonly)
{
#if defined(GRAPHICS_API_OPENGL_43)
unsigned int glInternalFormat = 0, glFormat = 0, glType = 0;
@@ -4501,132 +4650,6 @@ static char *rlGetCompressedFormatName(int format)
#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
-#if defined(GRAPHICS_API_OPENGL_11)
-// Mipmaps data is generated after image data
-// NOTE: Only works with RGBA (4 bytes) data!
-static int rlGenTextureMipmapsData(unsigned char *data, int baseWidth, int baseHeight)
-{
- int mipmapCount = 1; // Required mipmap levels count (including base level)
- int width = baseWidth;
- int height = baseHeight;
- int size = baseWidth*baseHeight*4; // Size in bytes (will include mipmaps...), RGBA only
-
- // Count mipmap levels required
- while ((width != 1) && (height != 1))
- {
- width /= 2;
- height /= 2;
-
- TRACELOGD("TEXTURE: Next mipmap size: %i x %i", width, height);
-
- mipmapCount++;
-
- size += (width*height*4); // Add mipmap size (in bytes)
- }
-
- TRACELOGD("TEXTURE: Total mipmaps required: %i", mipmapCount);
- TRACELOGD("TEXTURE: Total size of data required: %i", size);
-
- unsigned char *temp = RL_REALLOC(data, size);
-
- if (temp != NULL) data = temp;
- else TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to re-allocate required mipmaps memory");
-
- width = baseWidth;
- height = baseHeight;
- size = (width*height*4); // RGBA: 4 bytes
-
- // Generate mipmaps
- // NOTE: Every mipmap data is stored after data (RGBA - 4 bytes)
- unsigned char *image = (unsigned char *)RL_MALLOC(width*height*4);
- unsigned char *mipmap = NULL;
- int offset = 0;
-
- for (int i = 0; i < size; i += 4)
- {
- image[i] = data[i];
- image[i + 1] = data[i + 1];
- image[i + 2] = data[i + 2];
- image[i + 3] = data[i + 3];
- }
-
- TRACELOGD("TEXTURE: Mipmap base size (%ix%i)", width, height);
-
- for (int mip = 1; mip < mipmapCount; mip++)
- {
- mipmap = rlGenNextMipmapData(image, width, height);
-
- offset += (width*height*4); // Size of last mipmap
-
- width /= 2;
- height /= 2;
- size = (width*height*4); // Mipmap size to store after offset
-
- // Add mipmap to data
- for (int i = 0; i < size; i += 4)
- {
- data[offset + i] = mipmap[i];
- data[offset + i + 1] = mipmap[i + 1];
- data[offset + i + 2] = mipmap[i + 2];
- data[offset + i + 3] = mipmap[i + 3];
- }
-
- RL_FREE(image);
-
- image = mipmap;
- mipmap = NULL;
- }
-
- RL_FREE(mipmap); // free mipmap data
-
- return mipmapCount;
-}
-
-// Manual mipmap generation (basic scaling algorithm)
-static unsigned char *rlGenNextMipmapData(unsigned char *srcData, int srcWidth, int srcHeight)
-{
- int x2 = 0;
- int y2 = 0;
- unsigned char prow[4] = { 0 };
- unsigned char pcol[4] = { 0 };
-
- int width = srcWidth/2;
- int height = srcHeight/2;
-
- unsigned char *mipmap = (unsigned char *)RL_MALLOC(width*height*4);
-
- // Scaling algorithm works perfectly (box-filter)
- for (int y = 0; y < height; y++)
- {
- y2 = 2*y;
-
- for (int x = 0; x < width; x++)
- {
- x2 = 2*x;
-
- prow[0] = (srcData[(y2*srcWidth + x2)*4 + 0] + srcData[(y2*srcWidth + x2 + 1)*4 + 0])/2;
- prow[1] = (srcData[(y2*srcWidth + x2)*4 + 1] + srcData[(y2*srcWidth + x2 + 1)*4 + 1])/2;
- prow[2] = (srcData[(y2*srcWidth + x2)*4 + 2] + srcData[(y2*srcWidth + x2 + 1)*4 + 2])/2;
- prow[3] = (srcData[(y2*srcWidth + x2)*4 + 3] + srcData[(y2*srcWidth + x2 + 1)*4 + 3])/2;
-
- pcol[0] = (srcData[((y2 + 1)*srcWidth + x2)*4 + 0] + srcData[((y2 + 1)*srcWidth + x2 + 1)*4 + 0])/2;
- pcol[1] = (srcData[((y2 + 1)*srcWidth + x2)*4 + 1] + srcData[((y2 + 1)*srcWidth + x2 + 1)*4 + 1])/2;
- pcol[2] = (srcData[((y2 + 1)*srcWidth + x2)*4 + 2] + srcData[((y2 + 1)*srcWidth + x2 + 1)*4 + 2])/2;
- pcol[3] = (srcData[((y2 + 1)*srcWidth + x2)*4 + 3] + srcData[((y2 + 1)*srcWidth + x2 + 1)*4 + 3])/2;
-
- mipmap[(y*width + x)*4 + 0] = (prow[0] + pcol[0])/2;
- mipmap[(y*width + x)*4 + 1] = (prow[1] + pcol[1])/2;
- mipmap[(y*width + x)*4 + 2] = (prow[2] + pcol[2])/2;
- mipmap[(y*width + x)*4 + 3] = (prow[3] + pcol[3])/2;
- }
- }
-
- TRACELOGD("TEXTURE: Mipmap generated successfully (%ix%i)", width, height);
-
- return mipmap;
-}
-#endif // GRAPHICS_API_OPENGL_11
-
// Get pixel data size in bytes (image or texture)
// NOTE: Size depends on pixel format
static int rlGetPixelDataSize(int width, int height, int format)
diff --git a/include/rmath.h b/include/rmath.h
index f89429f..fa9ab16 100644
--- a/include/rmath.h
+++ b/include/rmath.h
@@ -23,6 +23,7 @@ int lmathVector2DotProduct( lua_State *L );
int lmathVector2Distance( lua_State *L );
int lmathVector2DistanceSqr( lua_State *L );
int lmathVector2Angle( lua_State *L );
+int lmathVector2LineAngle( lua_State *L );
int lmathVector2Scale( lua_State *L );
int lmathVector2Multiply( lua_State *L );
int lmathVector2Negate( lua_State *L );
diff --git a/include/textures.h b/include/textures.h
index 5634968..5df574e 100644
--- a/include/textures.h
+++ b/include/textures.h
@@ -78,10 +78,10 @@ int ltexturesUpdateTextureRec( lua_State *L );
/* Texture Drawing. */
int ltexturesDrawTexture( lua_State *L );
int ltexturesDrawTextureRec( lua_State *L );
-int ltexturesDrawTextureTiled( lua_State *L );
+// int ltexturesDrawTextureTiled( lua_State *L );
int ltexturesDrawTexturePro( lua_State *L );
int ltexturesDrawTextureNPatch( lua_State *L );
-int ltexturesDrawTexturePoly( lua_State *L );
+// int ltexturesDrawTexturePoly( lua_State *L );
int ltexturesBeginTextureMode( lua_State *L );
int ltexturesEndTextureMode( lua_State *L );
int ltexturesSetTextureSource( lua_State *L );
diff --git a/src/audio.c b/src/audio.c
index 70c38e7..d62fcfd 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -398,56 +398,6 @@ int laudioResumeSound( lua_State *L ) {
}
/*
-> success = RL.PlaySoundMulti( Sound sound )
-
-Play a sound ( Using multichannel buffer pool )
-
-- Failure return false
-- Success return true
-*/
-int laudioPlaySoundMulti( lua_State *L ) {
- if ( !lua_isnumber( L, -1 ) ) {
- TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.PlaySoundMulti( Sound sound )" );
- lua_pushboolean( L, false );
- return 1;
- }
- size_t soundId = lua_tointeger( L, -1 );
-
- if ( !validSound( soundId ) ) {
- lua_pushboolean( L, false );
- return 1;
- }
- PlaySoundMulti( *state->sounds[ soundId ] );
- lua_pushboolean( L, true );
-
- return 1;
-}
-
-/*
-> RL.StopSoundMulti()
-
-Stop any sound playing ( using multichannel buffer pool )
-*/
-int laudioStopSoundMulti( lua_State *L ) {
- StopSoundMulti();
-
- return 0;
-}
-
-/*
-> count = RL.GetSoundsPlaying()
-
-Get number of sounds playing in the multichannel
-
-- Success return int
-*/
-int laudioGetSoundsPlaying( lua_State *L ) {
- lua_pushinteger( L, GetSoundsPlaying() );
-
- return 1;
-}
-
-/*
> playing = RL.IsSoundPlaying( Sound sound )
Check if a sound is currently playing
diff --git a/src/core.c b/src/core.c
index 71d1505..02eff94 100644
--- a/src/core.c
+++ b/src/core.c
@@ -2547,7 +2547,7 @@ int lcoreSetCamera2DOffset( lua_State *L ) {
}
/*
-> success = RL.SetCamera2DRotation( camera3D camera, float rotation )
+> success = RL.SetCamera2DRotation( camera2D camera, float rotation )
Set camera rotation in degrees
@@ -2556,7 +2556,7 @@ Set camera rotation in degrees
*/
int lcoreSetCamera2DRotation( lua_State *L ) {
if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) {
- TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetCamera2DRotation( camera3D camera, float rotation )" );
+ TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetCamera2DRotation( camera2D camera, float rotation )" );
lua_pushboolean( L, false );
return 1;
}
@@ -2574,7 +2574,7 @@ int lcoreSetCamera2DRotation( lua_State *L ) {
}
/*
-> success = RL.SetCamera2DZoom( camera3D camera, float zoom )
+> success = RL.SetCamera2DZoom( camera2D camera, float zoom )
Set camera zoom ( scaling ), should be 1.0f by default
@@ -2583,7 +2583,7 @@ Set camera zoom ( scaling ), should be 1.0f by default
*/
int lcoreSetCamera2DZoom( lua_State *L ) {
if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) {
- TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetCamera2DZoom( camera3D camera, float zoom )" );
+ TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetCamera2DZoom( camera2D camera, float zoom )" );
lua_pushboolean( L, false );
return 1;
}
@@ -2727,7 +2727,6 @@ int lcoreCreateCamera3D( lua_State *L ) {
state->camera3Ds[i]->up = (Vector3){ 0.0, 0.0, 0.0 };
state->camera3Ds[i]->fovy = 45.0f;
state->camera3Ds[i]->projection = CAMERA_PERSPECTIVE;
- SetCameraMode( *state->camera3Ds[i], CAMERA_CUSTOM );
lua_pushinteger( L, i );
checkCamera3DRealloc(i);
@@ -2940,33 +2939,6 @@ int lcoreSetCamera3DProjection( lua_State *L ) {
}
/*
-> success = RL.SetCameraMode( camera3D camera, int mode )
-
-Set camera mode ( CAMERA_CUSTOM, CAMERA_FREE, CAMERA_ORBITAL... )
-
-- Failure return false
-- Success return true
-*/
-int lcoreSetCameraMode( lua_State *L ) {
- if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) {
- TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetCameraMode( camera3D camera, int mode )" );
- lua_pushboolean( L, false );
- return 1;
- }
- size_t cameraId = lua_tointeger( L, -2 );
-
- if ( !validCamera3D( cameraId ) ) {
- lua_pushboolean( L, false );
- return 1;
- }
-
- SetCameraMode( *state->camera3Ds[ cameraId ], lua_tointeger( L, -1 ) );
- lua_pushboolean( L, true );
-
- return 1;
-}
-
-/*
> position = RL.GetCamera3DPosition( camera3D camera )
Get camera position
@@ -3097,7 +3069,7 @@ int lcoreGetCamera3DProjection( lua_State *L ) {
}
/*
-> success = RL.UpdateCamera3D( camera3D camera )
+> success = RL.UpdateCamera3D( camera3D camera, int mode )
Update camera position for selected mode
@@ -3105,11 +3077,14 @@ Update camera position for selected mode
- Success return true
*/
int lcoreUpdateCamera3D( lua_State *L ) {
- if ( !lua_isnumber( L, -1 ) ) {
- TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.UpdateCamera3D( camera3D camera )" );
+ if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) {
+ TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.UpdateCamera3D( camera3D camera, int mode )" );
lua_pushboolean( L, false );
return 1;
}
+
+ int mode = lua_tointeger( L, -1 );
+ lua_pop( L, 1 );
size_t cameraId = lua_tointeger( L, -1 );
if ( !validCamera3D( cameraId ) ) {
@@ -3117,95 +3092,41 @@ int lcoreUpdateCamera3D( lua_State *L ) {
return 1;
}
- UpdateCamera( state->camera3Ds[ cameraId ] );
+ UpdateCamera( state->camera3Ds[ cameraId ], mode );
lua_pushboolean( L, true );
return 1;
}
/*
-> success = RL.SetCameraPanControl( int keyPan )
+> success = RL.UpdateCamera3DPro( camera3D camera, Vector3 movement, Vector3 rotation, float zoom )
-Set camera pan key to combine with mouse movement ( free camera )
+Update camera movement, movement/rotation values should be provided by user
- Failure return false
- Success return true
*/
-int lcoreSetCameraPanControl( lua_State *L ) {
- if ( !lua_isnumber( L, -1 ) ) {
- TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetCameraPanControl( int keyPan )" );
+int lcoreUpdateCamera3DPro( lua_State *L ) {
+ if ( !lua_isnumber( L, -4 ) || !lua_istable( L, -3 ) || !lua_istable( L, -2 ) || !lua_isnumber( L, -1 ) ) {
+ TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.UpdateCamera3DPro( camera3D camera, Vector3 movement, Vector3 rotation, float zoom )" );
lua_pushboolean( L, false );
return 1;
}
- SetCameraPanControl( lua_tointeger( L, -1 ) );
- lua_pushboolean( L, true );
- return 1;
-}
-
-/*
-> success = RL.SetCameraAltControl( int keyAlt )
-
-Set camera alt key to combine with mouse movement ( free camera )
-
-- Failure return false
-- Success return true
-*/
-int lcoreSetCameraAltControl( lua_State *L ) {
- if ( !lua_isnumber( L, -1 ) ) {
- TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetCameraAltControl( int keyAlt )" );
- lua_pushboolean( L, false );
- return 1;
- }
- SetCameraAltControl( lua_tointeger( L, -1 ) );
- lua_pushboolean( L, true );
-
- return 1;
-}
-
-/*
-> success = RL.SetCameraSmoothZoomControl( int keySmoothZoom )
-
-Set camera smooth zoom key to combine with mouse ( free camera )
-
-- Failure return false
-- Success return true
-*/
-int lcoreSetCameraSmoothZoomControl( lua_State *L ) {
- if ( !lua_isnumber( L, -1 ) ) {
- TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetCameraSmoothZoomControl( int keySmoothZoom )" );
- lua_pushboolean( L, false );
- return 1;
- }
- SetCameraSmoothZoomControl( lua_tointeger( L, -1 ) );
- lua_pushboolean( L, true );
-
- return 1;
-}
-
-/*
-> success = RL.SetCameraMoveControls( int keyFront, int keyBack, int keyRight, int keyLeft, int keyUp, int keyDown )
-
-Set camera move controls ( 1st person and 3rd person cameras )
+ float zoom = lua_tointeger( L, -1 );
+ lua_pop( L, 1 );
+ Vector3 rotation = uluaGetVector3( L );
+ lua_pop( L, 1 );
+ Vector3 movement = uluaGetVector3( L );
+ lua_pop( L, 1 );
+ size_t cameraId = lua_tointeger( L, -1 );
-- Failure return false
-- Success return true
-*/
-int lcoreSetCameraMoveControls( lua_State *L ) {
- if ( !lua_isnumber( L, -6 ) || !lua_isnumber( L, -5 ) || !lua_isnumber( L, -4 )
- || !lua_isnumber( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) {
- TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetCameraMoveControls( int keyFront, int keyBack, int keyRight, int keyLeft, int keyUp, int keyDown )" );
+ if ( !validCamera3D( cameraId ) ) {
lua_pushboolean( L, false );
return 1;
}
- int keyDown = lua_tointeger( L, -1 );
- int keyUp = lua_tointeger( L, -2 );
- int keyLeft = lua_tointeger( L, -3 );
- int keyRight = lua_tointeger( L, -4 );
- int keyBack = lua_tointeger( L, -5 );
- int keyFront = lua_tointeger( L, -6 );
- SetCameraMoveControls( keyFront, keyBack, keyRight, keyLeft, keyUp, keyDown );
+ UpdateCameraPro( state->camera3Ds[ cameraId ], movement, rotation, zoom );
lua_pushboolean( L, true );
return 1;
diff --git a/src/lua_core.c b/src/lua_core.c
index caea688..9197170 100644
--- a/src/lua_core.c
+++ b/src/lua_core.c
@@ -341,6 +341,7 @@ void defineGlobals() {
assignGlobalInt( BLEND_SUBTRACT_COLORS, "BLEND_SUBTRACT_COLORS" );
assignGlobalInt( BLEND_ALPHA_PREMULTIPLY, "BLEND_ALPHA_PREMULTIPLY" );
assignGlobalInt( BLEND_CUSTOM, "BLEND_CUSTOM" );
+ assignGlobalInt( BLEND_CUSTOM_SEPARATE, "BLEND_CUSTOM_SEPARATE" );
/* Gesture */
assignGlobalInt( GESTURE_NONE, "GESTURE_NONE" );
assignGlobalInt( GESTURE_TAP, "GESTURE_TAP" );
@@ -814,11 +815,12 @@ void luaRegister() {
assingGlobalFunction( "GetCamera3DFovy", lcoreGetCamera3DFovy );
assingGlobalFunction( "GetCamera3DProjection", lcoreGetCamera3DProjection );
assingGlobalFunction( "UpdateCamera3D", lcoreUpdateCamera3D );
- assingGlobalFunction( "SetCameraMode", lcoreSetCameraMode );
- assingGlobalFunction( "SetCameraPanControl", lcoreSetCameraPanControl );
- assingGlobalFunction( "SetCameraAltControl", lcoreSetCameraAltControl );
- assingGlobalFunction( "SetCameraSmoothZoomControl", lcoreSetCameraSmoothZoomControl );
- assingGlobalFunction( "SetCameraMoveControls", lcoreSetCameraMoveControls );
+ assingGlobalFunction( "UpdateCamera3DPro", lcoreUpdateCamera3DPro );
+ // assingGlobalFunction( "SetCameraMode", lcoreSetCameraMode );
+ // assingGlobalFunction( "SetCameraPanControl", lcoreSetCameraPanControl );
+ // assingGlobalFunction( "SetCameraAltControl", lcoreSetCameraAltControl );
+ // assingGlobalFunction( "SetCameraSmoothZoomControl", lcoreSetCameraSmoothZoomControl );
+ // assingGlobalFunction( "SetCameraMoveControls", lcoreSetCameraMoveControls );
/* Input-related Keyboard. */
assingGlobalFunction( "IsKeyPressed", lcoreIsKeyPressed );
assingGlobalFunction( "IsKeyDown", lcoreIsKeyDown );
@@ -987,10 +989,10 @@ void luaRegister() {
/* Texture Drawing. */
assingGlobalFunction( "DrawTexture", ltexturesDrawTexture );
assingGlobalFunction( "DrawTextureRec", ltexturesDrawTextureRec );
- assingGlobalFunction( "DrawTextureTiled", ltexturesDrawTextureTiled );
+ // assingGlobalFunction( "DrawTextureTiled", ltexturesDrawTextureTiled );
assingGlobalFunction( "DrawTexturePro", ltexturesDrawTexturePro );
assingGlobalFunction( "DrawTextureNPatch", ltexturesDrawTextureNPatch );
- assingGlobalFunction( "DrawTexturePoly", ltexturesDrawTexturePoly );
+ // assingGlobalFunction( "DrawTexturePoly", ltexturesDrawTexturePoly );
assingGlobalFunction( "BeginTextureMode", ltexturesBeginTextureMode );
assingGlobalFunction( "EndTextureMode", ltexturesEndTextureMode );
assingGlobalFunction( "SetTextureSource", ltexturesSetTextureSource );
@@ -1023,7 +1025,7 @@ void luaRegister() {
assingGlobalFunction( "DrawTriangle3D", lmodelsDrawTriangle3D );
assingGlobalFunction( "DrawCube", lmodelsDrawCube );
assingGlobalFunction( "DrawCubeWires", lmodelsDrawCubeWires );
- assingGlobalFunction( "DrawCubeTexture", lmodelsDrawCubeTexture );
+ // assingGlobalFunction( "DrawCubeTexture", lmodelsDrawCubeTexture );
assingGlobalFunction( "DrawSphere", lmodelsDrawSphere );
assingGlobalFunction( "DrawSphereEx", lmodelsDrawSphereEx );
assingGlobalFunction( "DrawSphereWires", lmodelsDrawSphereWires );
@@ -1123,9 +1125,9 @@ void luaRegister() {
assingGlobalFunction( "StopSound", laudioStopSound );
assingGlobalFunction( "PauseSound", laudioPauseSound );
assingGlobalFunction( "ResumeSound", laudioResumeSound );
- assingGlobalFunction( "PlaySoundMulti", laudioPlaySoundMulti );
- assingGlobalFunction( "StopSoundMulti", laudioStopSoundMulti );
- assingGlobalFunction( "GetSoundsPlaying", laudioGetSoundsPlaying );
+ // assingGlobalFunction( "PlaySoundMulti", laudioPlaySoundMulti );
+ // assingGlobalFunction( "StopSoundMulti", laudioStopSoundMulti );
+ // assingGlobalFunction( "GetSoundsPlaying", laudioGetSoundsPlaying );
assingGlobalFunction( "IsSoundPlaying", laudioIsSoundPlaying );
assingGlobalFunction( "SetSoundVolume", laudioSetSoundVolume );
assingGlobalFunction( "SetSoundPitch", laudioSetSoundPitch );
@@ -1167,6 +1169,7 @@ void luaRegister() {
assingGlobalFunction( "Vector2Distance", lmathVector2Distance );
assingGlobalFunction( "Vector2DistanceSqr", lmathVector2DistanceSqr );
assingGlobalFunction( "Vector2Angle", lmathVector2Angle );
+ assingGlobalFunction( "Vector2LineAngle", lmathVector2LineAngle );
assingGlobalFunction( "Vector2Scale", lmathVector2Scale );
assingGlobalFunction( "Vector2Multiply", lmathVector2Multiply );
assingGlobalFunction( "Vector2Negate", lmathVector2Negate );
diff --git a/src/models.c b/src/models.c
index cef36dd..313fdb1 100644
--- a/src/models.c
+++ b/src/models.c
@@ -120,6 +120,26 @@ static int newMesh() {
return i;
}
+// Unload model (but not meshes) from memory (RAM and/or VRAM)
+void UnloadModelKeepMeshes( Model model ) {
+ // Unload materials maps
+ // NOTE: As the user could be sharing shaders and textures between models,
+ // we don't unload the material but just free it's maps,
+ // the user is responsible for freeing models shaders and textures
+ for (int i = 0; i < model.materialCount; i++) RL_FREE(model.materials[i].maps);
+
+ // Unload arrays
+ RL_FREE(model.meshes);
+ RL_FREE(model.materials);
+ RL_FREE(model.meshMaterial);
+
+ // Unload animation data
+ RL_FREE(model.bones);
+ RL_FREE(model.bindPose);
+
+ TRACELOG(LOG_INFO, "MODEL: Unloaded model (but not meshes) from RAM and VRAM");
+}
+
/*
## Models - Basic
*/
@@ -292,30 +312,30 @@ Draw cube textured
- Failure return false
- Success return true
*/
-int lmodelsDrawCubeTexture( lua_State *L ) {
- if ( !lua_isnumber( L, -4 ) || !lua_istable( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) {
- TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.DrawCubeTexture( Texture2D texture, Vector3 position, Vector3 size, Color color )" );
- lua_pushboolean( L, false );
- return 1;
- }
- Color color = uluaGetColor( L );
- lua_pop( L, 1 );
- Vector3 size = uluaGetVector3( L );
- lua_pop( L, 1 );
- Vector3 pos = uluaGetVector3( L );
- lua_pop( L, 1 );
- size_t texId = lua_tointeger( L, -1 );
-
- if ( !validSourceTexture( texId ) ) {
- lua_pushboolean( L, false );
- return 1;
- }
-
- DrawCubeTexture( *texturesGetSourceTexture( texId ), pos, size.x, size.y, size.z, color );
- lua_pushboolean( L, true );
-
- return 1;
-}
+// int lmodelsDrawCubeTexture( lua_State *L ) {
+// if ( !lua_isnumber( L, -4 ) || !lua_istable( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) {
+// TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.DrawCubeTexture( Texture2D texture, Vector3 position, Vector3 size, Color color )" );
+// lua_pushboolean( L, false );
+// return 1;
+// }
+// Color color = uluaGetColor( L );
+// lua_pop( L, 1 );
+// Vector3 size = uluaGetVector3( L );
+// lua_pop( L, 1 );
+// Vector3 pos = uluaGetVector3( L );
+// lua_pop( L, 1 );
+// size_t texId = lua_tointeger( L, -1 );
+
+// if ( !validSourceTexture( texId ) ) {
+// lua_pushboolean( L, false );
+// return 1;
+// }
+
+// DrawCubeTexture( *texturesGetSourceTexture( texId ), pos, size.x, size.y, size.z, color );
+// lua_pushboolean( L, true );
+
+// return 1;
+// }
/*
> success = RL.DrawSphere( Vector3 centerPos, float radius, Color color )
diff --git a/src/rmath.c b/src/rmath.c
index 26054e4..0b4623d 100644
--- a/src/rmath.c
+++ b/src/rmath.c
@@ -412,6 +412,31 @@ int lmathVector2Angle( lua_State *L ) {
}
/*
+> result = RL.Vector2LineAngle( Vector2 start, Vector2 end )
+
+Calculate angle defined by a two vectors line.
+NOTE: Parameters need to be normalized.
+Current implementation should be aligned with glm::angle.
+
+- Failure return false
+- Success return float
+*/
+int lmathVector2LineAngle( lua_State *L ) {
+ if ( !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) {
+ TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.Vector2LineAngle( Vector2 start, Vector2 end )" );
+ lua_pushboolean( L, false );
+ return 1;
+ }
+ Vector2 end = uluaGetVector2( L );
+ lua_pop( L, 1 );
+ Vector2 start = uluaGetVector2( L );
+
+ lua_pushnumber( L, Vector2LineAngle( start, end ) );
+
+ return 1;
+}
+
+/*
> result = RL.Vector2Scale( Vector2 v, float scale )
Scale vector ( multiply by value )
diff --git a/src/state.c b/src/state.c
index 650e8b7..e9e12f4 100644
--- a/src/state.c
+++ b/src/state.c
@@ -2,6 +2,7 @@
#include "state.h"
#include "lua_core.h"
#include "textures.h"
+#include "models.h"
State *state;
@@ -167,7 +168,9 @@ void stateFree() {
}
for ( int i = 0; i < state->modelCount; ++i ) {
if ( state->models[i] != NULL ) {
+ //TODO Test if UnloadModel causes segfaults on exit.
UnloadModelKeepMeshes( *state->models[i] );
+ // UnloadModel( *state->models[i] );
free( state->models[i] );
}
}
diff --git a/src/textures.c b/src/textures.c
index 6398971..ab6e53f 100644
--- a/src/textures.c
+++ b/src/textures.c
@@ -1997,46 +1997,6 @@ int ltexturesDrawTextureRec( lua_State *L ) {
}
/*
-> success = RL.DrawTextureTiled( Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, float scale, Color tint )
-
-Draw part of a texture ( defined by a rectangle ) with rotation and scale tiled into dest
-
-- Failure return false
-- Success return true
-*/
-int ltexturesDrawTextureTiled( lua_State *L ) {
- if ( !lua_isnumber( L, -7 ) || !lua_istable( L, -6 ) || !lua_istable( L, -5 ) || !lua_istable( L, -4 )
- || !lua_isnumber( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) {
- TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.DrawTextureTiled( Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, float scale, Color tint )" );
- lua_pushboolean( L, false );
- return 1;
- }
- Color color = uluaGetColor( L );
- lua_pop( L, 1 );
- float scale = lua_tonumber( L, -1 );
- lua_pop( L, 1 );
- float rot = lua_tonumber( L, -1 );
- lua_pop( L, 1 );
- Vector2 origin = uluaGetVector2( L );
- lua_pop( L, 1 );
- Rectangle dstRect = uluaGetRectangle( L );
- lua_pop( L, 1 );
- Rectangle srcRect = uluaGetRectangle( L );
- lua_pop( L, 1 );
- size_t texId = lua_tointeger( L, -1 );
-
- if ( !validSourceTexture( texId ) ) {
- lua_pushboolean( L, false );
- return 1;
- }
-
- DrawTextureTiled( *texturesGetSourceTexture( texId ), srcRect, dstRect, origin, rot, scale, color );
- lua_pushboolean( L, true );
-
- return 1;
-}
-
-/*
> success = RL.DrawTexturePro( Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint )
Draw a part of a texture defined by a rectangle with "pro" parameters
@@ -2113,64 +2073,6 @@ int ltexturesDrawTextureNPatch( lua_State *L ) {
}
/*
-> success = RL.DrawTexturePoly( Texture2D texture, Vector2 center, Vector2{} points, Vector2{} texcoords, int pointsCount, Color tint )
-
-Draw a textured polygon ( Convex )
-
-- Failure return false
-- Success return true
-*/
-int ltexturesDrawTexturePoly( lua_State *L ) {
- if ( !lua_isnumber( L, -6 ) || !lua_istable( L, -5 ) || !lua_istable( L, -4 )
- || !lua_istable( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) {
- TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.DrawTexturePoly( Texture2D texture, Vector2 center, Vector2 points{}, Vector2 texcoords{}, int pointsCount, Color tint )" );
- lua_pushboolean( L, false );
- return 1;
- }
- Color color = uluaGetColor( L );
- lua_pop( L, 1 );
- int pointsCount = lua_tointeger( L, -1 );
- lua_pop( L, 1 );
- Vector2 texCoords[ pointsCount ];
-
- int t = lua_gettop( L ), i = 0;
- lua_pushnil( L );
-
- while ( lua_next( L, t ) != 0 ) {
- texCoords[i] = uluaGetVector2( L );
- i++;
- lua_pop( L, 1 );
- }
- lua_pop( L, 1 );
-
- Vector2 points[ pointsCount ];
-
- t = lua_gettop( L );
- i = 0;
- lua_pushnil( L );
-
- while ( lua_next( L, t ) != 0 ) {
- points[i] = uluaGetVector2( L );
- i++;
- lua_pop( L, 1 );
- }
- lua_pop( L, 1 );
- Vector2 center = uluaGetVector2( L );
- lua_pop( L, 1 );
- size_t texId = lua_tointeger( L, -1 );
-
- if ( !validSourceTexture( texId ) ) {
- lua_pushboolean( L, false );
- return 1;
- }
-
- DrawTexturePoly( *texturesGetSourceTexture( texId ), center, points, texCoords, pointsCount, color );
- lua_pushboolean( L, true );
-
- return 1;
-}
-
-/*
> success = RL.BeginTextureMode( RenderTexture2D target )
Begin drawing to render texture