diff --git a/examples/Makefile b/examples/Makefile
index 93b05a0c7..904917f7c 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -582,6 +582,7 @@ MODELS = \
models/models_mesh_generation \
models/models_mesh_picking \
models/models_orthographic_projection \
+ models/models_point_rendering \
models/models_rlgl_solar_system \
models/models_skybox \
models/models_waving_cubes \
diff --git a/examples/Makefile.Web b/examples/Makefile.Web
index 46a8a98ea..7057da1c0 100644
--- a/examples/Makefile.Web
+++ b/examples/Makefile.Web
@@ -447,6 +447,7 @@ MODELS = \
models/models_mesh_generation \
models/models_mesh_picking \
models/models_orthographic_projection \
+ models/models_point_rendering \
models/models_rlgl_solar_system \
models/models_skybox \
models/models_waving_cubes \
diff --git a/examples/README.md b/examples/README.md
index 317f43c89..d573ff23e 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -147,11 +147,12 @@ Examples using raylib models functionality, including models loading/generation
| 91 | [models_loading_vox](models/models_loading_vox.c) |
| ⭐️☆☆☆ | **4.0** | **4.0** | [Johann Nadalutti](https://github.com/procfxgen) |
| 92 | [models_loading_m3d](models/models_loading_m3d.c) |
| ⭐️☆☆☆ | **4.2** | **4.2** | [bzt](https://bztsrc.gitlab.io/model3d) |
| 93 | [models_orthographic_projection](models/models_orthographic_projection.c) |
| ⭐️☆☆☆ | 2.0 | 3.7 | [Max Danielsson](https://github.com/autious) |
-| 94 | [models_rlgl_solar_system](models/models_rlgl_solar_system.c) |
| ⭐️⭐️⭐️⭐️ | 2.5 | **4.0** | [Ray](https://github.com/raysan5) |
-| 95 | [models_yaw_pitch_roll](models/models_yaw_pitch_roll.c) |
| ⭐️⭐️☆☆ | 1.8 | **4.0** | [Berni](https://github.com/Berni8k) |
-| 96 | [models_waving_cubes](models/models_waving_cubes.c) |
| ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [codecat](https://github.com/codecat) |
-| 97 | [models_heightmap](models/models_heightmap.c) |
| ⭐️☆☆☆ | 1.8 | 3.5 | [Ray](https://github.com/raysan5) |
-| 98 | [models_skybox](models/models_skybox.c) |
| ⭐️⭐️☆☆ | 1.8 | **4.0** | [Ray](https://github.com/raysan5) |
+| 94 | [models_point_rendering](models/models_point_rendering.c) |
| ⭐️⭐️☆☆ | 5.0 | 5.0 | [Reese Gallagher](https://github.com/satchelfrost) |
+| 95 | [models_rlgl_solar_system](models/models_rlgl_solar_system.c) |
| ⭐️⭐️⭐️⭐️ | 2.5 | **4.0** | [Ray](https://github.com/raysan5) |
+| 96 | [models_yaw_pitch_roll](models/models_yaw_pitch_roll.c) |
| ⭐️⭐️☆☆ | 1.8 | **4.0** | [Berni](https://github.com/Berni8k) |
+| 97 | [models_waving_cubes](models/models_waving_cubes.c) |
| ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [codecat](https://github.com/codecat) |
+| 98 | [models_heightmap](models/models_heightmap.c) |
| ⭐️☆☆☆ | 1.8 | 3.5 | [Ray](https://github.com/raysan5) |
+| 99 | [models_skybox](models/models_skybox.c) |
| ⭐️⭐️☆☆ | 1.8 | **4.0** | [Ray](https://github.com/raysan5) |
### category: shaders
@@ -159,26 +160,25 @@ Examples using raylib shaders functionality, including shaders loading, paramete
| ## | example | image | difficulty
level | version
created | last version
updated | original
developer |
|----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------|
-| 99 | [shaders_basic_lighting](shaders/shaders_basic_lighting.c) |
| ⭐️⭐️⭐️⭐️ | 3.0 | **4.2** | [Chris Camacho](https://github.com/codifies) |
-| 100 | [shaders_model_shader](shaders/shaders_model_shader.c) |
| ⭐️⭐️☆☆ | 1.3 | 3.7 | [Ray](https://github.com/raysan5) |
-| 101 | [shaders_shapes_textures](shaders/shaders_shapes_textures.c) |
| ⭐️⭐️☆☆ | 1.7 | 3.7 | [Ray](https://github.com/raysan5) |
-| 102 | [shaders_custom_uniform](shaders/shaders_custom_uniform.c) |
| ⭐️⭐️☆☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) |
-| 103 | [shaders_postprocessing](shaders/shaders_postprocessing.c) |
| ⭐️⭐️⭐️☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) |
-| 104 | [shaders_palette_switch](shaders/shaders_palette_switch.c) |
| ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Marco Lizza](https://github.com/MarcoLizza) |
-| 105 | [shaders_raymarching](shaders/shaders_raymarching.c) |
| ⭐️⭐️⭐️⭐️ | 2.0 | **4.2** | [Ray](https://github.com/raysan5) |
-| 106 | [shaders_texture_drawing](shaders/shaders_texture_drawing.c) |
| ⭐️⭐️☆☆ | 2.0 | 3.7 | [Michał Ciesielski](https://github.com/) |
-| 107 | [shaders_texture_outline](shaders/shaders_texture_outline.c) |
| ⭐️⭐️⭐️☆ | **4.0** | **4.0** | [Samuel Skiff](https://github.com/GoldenThumbs) |
-| 108 | [shaders_texture_waves](shaders/shaders_texture_waves.c) |
| ⭐️⭐️☆☆ | 2.5 | 3.7 | [Anata](https://github.com/anatagawa) |
-| 109 | [shaders_julia_set](shaders/shaders_julia_set.c) |
| ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [eggmund](https://github.com/eggmund) |
-| 110 | [shaders_eratosthenes](shaders/shaders_eratosthenes.c) |
| ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [ProfJski](https://github.com/ProfJski) |
-| 111 | [shaders_fog](shaders/shaders_fog.c) |
| ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) |
-| 112 | [shaders_simple_mask](shaders/shaders_simple_mask.c) |
| ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) |
-| 113 | [shaders_hot_reloading](shaders/shaders_hot_reloading.c) |
| ⭐️⭐️⭐️☆ | 3.0 | 3.5 | [Ray](https://github.com/raysan5) |
-| 114 | [shaders_mesh_instancing](shaders/shaders_mesh_instancing.c) |
| ⭐️⭐️⭐️⭐️ | 3.7 | **4.2** | [seanpringle](https://github.com/seanpringle) |
-| 115 | [shaders_multi_sample2d](shaders/shaders_multi_sample2d.c) |
| ⭐️⭐️☆☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) |
-| 116 | [shaders_spotlight](shaders/shaders_spotlight.c) |
| ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) |
-| 117 | [shaders_deferred_render](shaders/shaders_deferred_render.c) |
| ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) |
-| 118 | [shaders_vertex_displacement](shaders/shaders_vertex_displacement.c) |
| ⭐️☆☆☆ | 1.5 | 1.5 | [Alex ZH](https://github.com/ZzzhHe) |
+| 100 | [shaders_basic_lighting](shaders/shaders_basic_lighting.c) |
| ⭐️⭐️⭐️⭐️ | 3.0 | **4.2** | [Chris Camacho](https://github.com/codifies) |
+| 101 | [shaders_model_shader](shaders/shaders_model_shader.c) |
| ⭐️⭐️☆☆ | 1.3 | 3.7 | [Ray](https://github.com/raysan5) |
+| 102 | [shaders_shapes_textures](shaders/shaders_shapes_textures.c) |
| ⭐️⭐️☆☆ | 1.7 | 3.7 | [Ray](https://github.com/raysan5) |
+| 103 | [shaders_custom_uniform](shaders/shaders_custom_uniform.c) |
| ⭐️⭐️☆☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) |
+| 104 | [shaders_postprocessing](shaders/shaders_postprocessing.c) |
| ⭐️⭐️⭐️☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) |
+| 105 | [shaders_palette_switch](shaders/shaders_palette_switch.c) |
| ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Marco Lizza](https://github.com/MarcoLizza) |
+| 106 | [shaders_raymarching](shaders/shaders_raymarching.c) |
| ⭐️⭐️⭐️⭐️ | 2.0 | **4.2** | [Ray](https://github.com/raysan5) |
+| 107 | [shaders_texture_drawing](shaders/shaders_texture_drawing.c) |
| ⭐️⭐️☆☆ | 2.0 | 3.7 | [Michał Ciesielski](https://github.com/) |
+| 108 | [shaders_texture_outline](shaders/shaders_texture_outline.c) |
| ⭐️⭐️⭐️☆ | **4.0** | **4.0** | [Samuel Skiff](https://github.com/GoldenThumbs) |
+| 109 | [shaders_texture_waves](shaders/shaders_texture_waves.c) |
| ⭐️⭐️☆☆ | 2.5 | 3.7 | [Anata](https://github.com/anatagawa) |
+| 110 | [shaders_julia_set](shaders/shaders_julia_set.c) |
| ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [eggmund](https://github.com/eggmund) |
+| 111 | [shaders_eratosthenes](shaders/shaders_eratosthenes.c) |
| ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [ProfJski](https://github.com/ProfJski) |
+| 112 | [shaders_fog](shaders/shaders_fog.c) |
| ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) |
+| 113 | [shaders_simple_mask](shaders/shaders_simple_mask.c) |
| ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) |
+| 114 | [shaders_hot_reloading](shaders/shaders_hot_reloading.c) |
| ⭐️⭐️⭐️☆ | 3.0 | 3.5 | [Ray](https://github.com/raysan5) |
+| 115 | [shaders_mesh_instancing](shaders/shaders_mesh_instancing.c) |
| ⭐️⭐️⭐️⭐️ | 3.7 | **4.2** | [seanpringle](https://github.com/seanpringle) |
+| 116 | [shaders_multi_sample2d](shaders/shaders_multi_sample2d.c) |
| ⭐️⭐️☆☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) |
+| 117 | [shaders_spotlight](shaders/shaders_spotlight.c) |
| ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) |
+| 118 | [shaders_deferred_render](shaders/shaders_deferred_render.c) |
| ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) |
### category: audio
diff --git a/examples/models/models_point_rendering.c b/examples/models/models_point_rendering.c
new file mode 100644
index 000000000..68d498453
--- /dev/null
+++ b/examples/models/models_point_rendering.c
@@ -0,0 +1,182 @@
+/*******************************************************************************************
+*
+* raylib example - point rendering
+*
+* Example originally created with raylib 5.0, last time updated with raylib 5.0
+*
+* Example contributed by Reese Gallagher (@satchelfrost) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example 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) 2024 Reese Gallagher (@satchelfrost)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include // Required for: rand()
+#include // Required for: cos(), sin()
+
+#define MAX_POINTS 10000000 // 10 million
+#define MIN_POINTS 1000 // 1 thousand
+
+// Generate mesh using points
+Mesh GenMeshPoints(int numPoints);
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main()
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [models] example - point rendering");
+
+ Camera camera = {
+ .position = { 3.0f, 3.0f, 3.0f },
+ .target = { 0.0f, 0.0f, 0.0f },
+ .up = { 0.0f, 1.0f, 0.0f },
+ .fovy = 45.0f,
+ .projection = CAMERA_PERSPECTIVE
+ };
+
+ Vector3 position = { 0.0f, 0.0f, 0.0f };
+ bool useDrawModelPoints = true;
+ bool numPointsChanged = false;
+ int numPoints = 1000;
+
+ Mesh mesh = GenMeshPoints(numPoints);
+ Model model = LoadModelFromMesh(mesh);
+
+ //SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while(!WindowShouldClose())
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_ORBITAL);
+
+ if (IsKeyPressed(KEY_SPACE)) useDrawModelPoints = !useDrawModelPoints;
+ if (IsKeyPressed(KEY_UP))
+ {
+ numPoints = (numPoints*10 > MAX_POINTS)? MAX_POINTS : numPoints*10;
+ numPointsChanged = true;
+ }
+ if (IsKeyPressed(KEY_DOWN))
+ {
+ numPoints = (numPoints/10 < MIN_POINTS)? MIN_POINTS : numPoints/10;
+ numPointsChanged = true;
+ }
+
+ // Upload a different point cloud size
+ if (numPointsChanged)
+ {
+ UnloadModel(model);
+ mesh = GenMeshPoints(numPoints);
+ model = LoadModelFromMesh(mesh);
+ numPointsChanged = false;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+ ClearBackground(BLACK);
+
+ BeginMode3D(camera);
+
+ // The new method only uploads the points once to the GPU
+ if (useDrawModelPoints)
+ {
+ DrawModelPoints(model, position, 1.0f, WHITE);
+ }
+ else
+ {
+ // The old method must continually draw the "points" (lines)
+ for (int i = 0; i < numPoints; i++)
+ {
+ Vector3 pos = {
+ .x = mesh.vertices[i*3 + 0],
+ .y = mesh.vertices[i*3 + 1],
+ .z = mesh.vertices[i*3 + 2],
+ };
+ Color color = {
+ .r = mesh.colors[i*4 + 0],
+ .g = mesh.colors[i*4 + 1],
+ .b = mesh.colors[i*4 + 2],
+ .a = mesh.colors[i*4 + 3],
+ };
+
+ DrawPoint3D(pos, color);
+ }
+ }
+
+ // Draw a unit sphere for reference
+ DrawSphereWires(position, 1.0f, 10, 10, YELLOW);
+
+ EndMode3D();
+
+ // Draw UI text
+ DrawText(TextFormat("Point Count: %d", numPoints), 20, screenHeight - 50, 40, WHITE);
+ DrawText("Up - increase points", 20, 70, 20, WHITE);
+ DrawText("Down - decrease points", 20, 100, 20, WHITE);
+ DrawText("Space - drawing function", 20, 130, 20, WHITE);
+
+ if (useDrawModelPoints) DrawText("Using: DrawModelPoints()", 20, 160, 20, GREEN);
+ else DrawText("Using: DrawPoint3D()", 20, 160, 20, RED);
+
+ DrawFPS(10, 10);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadModel(model);
+
+ CloseWindow();
+ //--------------------------------------------------------------------------------------
+ return 0;
+}
+
+// Generate a spherical point cloud
+Mesh GenMeshPoints(int numPoints)
+{
+ Mesh mesh = {
+ .triangleCount = 1,
+ .vertexCount = numPoints,
+ .vertices = (float *)MemAlloc(numPoints*3*sizeof(float)),
+ .colors = (unsigned char*)MemAlloc(numPoints*4*sizeof(unsigned char)),
+ };
+
+ // https://en.wikipedia.org/wiki/Spherical_coordinate_system
+ for (int i = 0; i < numPoints; i++)
+ {
+ float theta = PI*rand()/RAND_MAX;
+ float phi = 2.0f*PI*rand()/RAND_MAX;
+ float r = 10.0f*rand()/RAND_MAX;
+
+ mesh.vertices[i*3 + 0] = r*sin(theta)*cos(phi);
+ mesh.vertices[i*3 + 1] = r*sin(theta)*sin(phi);
+ mesh.vertices[i*3 + 2] = r*cos(theta);
+
+ Color color = ColorFromHSV(r*360.0f, 1.0f, 1.0f);
+
+ mesh.colors[i*4 + 0] = color.r;
+ mesh.colors[i*4 + 1] = color.g;
+ mesh.colors[i*4 + 2] = color.b;
+ mesh.colors[i*4 + 3] = color.a;
+ }
+
+ // Upload mesh data from CPU (RAM) to GPU (VRAM) memory
+ UploadMesh(&mesh, false);
+
+ return mesh;
+}
diff --git a/examples/models/models_point_rendering.png b/examples/models/models_point_rendering.png
new file mode 100644
index 000000000..a1fc718e4
Binary files /dev/null and b/examples/models/models_point_rendering.png differ
diff --git a/parser/output/raylib_api.json b/parser/output/raylib_api.json
index c4ce91e87..03b19325a 100644
--- a/parser/output/raylib_api.json
+++ b/parser/output/raylib_api.json
@@ -3215,12 +3215,12 @@
},
{
"name": "ToggleFullscreen",
- "description": "Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)",
+ "description": "Toggle window state: fullscreen/windowed [resizes monitor to match window resolution] (only PLATFORM_DESKTOP)",
"returnType": "void"
},
{
"name": "ToggleBorderlessWindowed",
- "description": "Toggle window state: borderless windowed (only PLATFORM_DESKTOP)",
+ "description": "Toggle window state: borderless windowed [resizes window to match monitor resolution] (only PLATFORM_DESKTOP)",
"returnType": "void"
},
{
@@ -10366,6 +10366,60 @@
}
]
},
+ {
+ "name": "DrawModelPoints",
+ "description": "Draw a model as points",
+ "returnType": "void",
+ "params": [
+ {
+ "type": "Model",
+ "name": "model"
+ },
+ {
+ "type": "Vector3",
+ "name": "position"
+ },
+ {
+ "type": "float",
+ "name": "scale"
+ },
+ {
+ "type": "Color",
+ "name": "tint"
+ }
+ ]
+ },
+ {
+ "name": "DrawModelPointsEx",
+ "description": "Draw a model as points with extended parameters",
+ "returnType": "void",
+ "params": [
+ {
+ "type": "Model",
+ "name": "model"
+ },
+ {
+ "type": "Vector3",
+ "name": "position"
+ },
+ {
+ "type": "Vector3",
+ "name": "rotationAxis"
+ },
+ {
+ "type": "float",
+ "name": "rotationAngle"
+ },
+ {
+ "type": "Vector3",
+ "name": "scale"
+ },
+ {
+ "type": "Color",
+ "name": "tint"
+ }
+ ]
+ },
{
"name": "DrawBoundingBox",
"description": "Draw bounding box (wires)",
diff --git a/parser/output/raylib_api.lua b/parser/output/raylib_api.lua
index 3a9e2f04f..7d74c9a41 100644
--- a/parser/output/raylib_api.lua
+++ b/parser/output/raylib_api.lua
@@ -3158,12 +3158,12 @@ return {
},
{
name = "ToggleFullscreen",
- description = "Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)",
+ description = "Toggle window state: fullscreen/windowed [resizes monitor to match window resolution] (only PLATFORM_DESKTOP)",
returnType = "void"
},
{
name = "ToggleBorderlessWindowed",
- description = "Toggle window state: borderless windowed (only PLATFORM_DESKTOP)",
+ description = "Toggle window state: borderless windowed [resizes window to match monitor resolution] (only PLATFORM_DESKTOP)",
returnType = "void"
},
{
@@ -7213,6 +7213,30 @@ return {
{type = "Color", name = "tint"}
}
},
+ {
+ name = "DrawModelPoints",
+ description = "Draw a model as points",
+ returnType = "void",
+ params = {
+ {type = "Model", name = "model"},
+ {type = "Vector3", name = "position"},
+ {type = "float", name = "scale"},
+ {type = "Color", name = "tint"}
+ }
+ },
+ {
+ name = "DrawModelPointsEx",
+ description = "Draw a model as points with extended parameters",
+ returnType = "void",
+ params = {
+ {type = "Model", name = "model"},
+ {type = "Vector3", name = "position"},
+ {type = "Vector3", name = "rotationAxis"},
+ {type = "float", name = "rotationAngle"},
+ {type = "Vector3", name = "scale"},
+ {type = "Color", name = "tint"}
+ }
+ },
{
name = "DrawBoundingBox",
description = "Draw bounding box (wires)",
diff --git a/parser/output/raylib_api.txt b/parser/output/raylib_api.txt
index afa9b525d..fb30ebe5f 100644
--- a/parser/output/raylib_api.txt
+++ b/parser/output/raylib_api.txt
@@ -984,7 +984,7 @@ Callback 006: AudioCallback() (2 input parameters)
Param[1]: bufferData (type: void *)
Param[2]: frames (type: unsigned int)
-Functions found: 573
+Functions found: 575
Function 001: InitWindow() (3 input parameters)
Name: InitWindow
@@ -1056,12 +1056,12 @@ Function 013: ClearWindowState() (1 input parameters)
Function 014: ToggleFullscreen() (0 input parameters)
Name: ToggleFullscreen
Return type: void
- Description: Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
+ Description: Toggle window state: fullscreen/windowed [resizes monitor to match window resolution] (only PLATFORM_DESKTOP)
No input parameters
Function 015: ToggleBorderlessWindowed() (0 input parameters)
Name: ToggleBorderlessWindowed
Return type: void
- Description: Toggle window state: borderless windowed (only PLATFORM_DESKTOP)
+ Description: Toggle window state: borderless windowed [resizes window to match monitor resolution] (only PLATFORM_DESKTOP)
No input parameters
Function 016: MaximizeWindow() (0 input parameters)
Name: MaximizeWindow
@@ -3955,13 +3955,31 @@ Function 464: DrawModelWiresEx() (6 input parameters)
Param[4]: rotationAngle (type: float)
Param[5]: scale (type: Vector3)
Param[6]: tint (type: Color)
-Function 465: DrawBoundingBox() (2 input parameters)
+Function 465: DrawModelPoints() (4 input parameters)
+ Name: DrawModelPoints
+ Return type: void
+ Description: Draw a model as points
+ Param[1]: model (type: Model)
+ Param[2]: position (type: Vector3)
+ Param[3]: scale (type: float)
+ Param[4]: tint (type: Color)
+Function 466: DrawModelPointsEx() (6 input parameters)
+ Name: DrawModelPointsEx
+ Return type: void
+ Description: Draw a model as points with extended parameters
+ Param[1]: model (type: Model)
+ Param[2]: position (type: Vector3)
+ Param[3]: rotationAxis (type: Vector3)
+ Param[4]: rotationAngle (type: float)
+ Param[5]: scale (type: Vector3)
+ Param[6]: tint (type: Color)
+Function 467: DrawBoundingBox() (2 input parameters)
Name: DrawBoundingBox
Return type: void
Description: Draw bounding box (wires)
Param[1]: box (type: BoundingBox)
Param[2]: color (type: Color)
-Function 466: DrawBillboard() (5 input parameters)
+Function 468: DrawBillboard() (5 input parameters)
Name: DrawBillboard
Return type: void
Description: Draw a billboard texture
@@ -3970,7 +3988,7 @@ Function 466: DrawBillboard() (5 input parameters)
Param[3]: position (type: Vector3)
Param[4]: scale (type: float)
Param[5]: tint (type: Color)
-Function 467: DrawBillboardRec() (6 input parameters)
+Function 469: DrawBillboardRec() (6 input parameters)
Name: DrawBillboardRec
Return type: void
Description: Draw a billboard texture defined by source
@@ -3980,7 +3998,7 @@ Function 467: DrawBillboardRec() (6 input parameters)
Param[4]: position (type: Vector3)
Param[5]: size (type: Vector2)
Param[6]: tint (type: Color)
-Function 468: DrawBillboardPro() (9 input parameters)
+Function 470: DrawBillboardPro() (9 input parameters)
Name: DrawBillboardPro
Return type: void
Description: Draw a billboard texture defined by source and rotation
@@ -3993,13 +4011,13 @@ Function 468: DrawBillboardPro() (9 input parameters)
Param[7]: origin (type: Vector2)
Param[8]: rotation (type: float)
Param[9]: tint (type: Color)
-Function 469: UploadMesh() (2 input parameters)
+Function 471: UploadMesh() (2 input parameters)
Name: UploadMesh
Return type: void
Description: Upload mesh vertex data in GPU and provide VAO/VBO ids
Param[1]: mesh (type: Mesh *)
Param[2]: dynamic (type: bool)
-Function 470: UpdateMeshBuffer() (5 input parameters)
+Function 472: UpdateMeshBuffer() (5 input parameters)
Name: UpdateMeshBuffer
Return type: void
Description: Update mesh vertex data in GPU for a specific buffer index
@@ -4008,19 +4026,19 @@ Function 470: UpdateMeshBuffer() (5 input parameters)
Param[3]: data (type: const void *)
Param[4]: dataSize (type: int)
Param[5]: offset (type: int)
-Function 471: UnloadMesh() (1 input parameters)
+Function 473: UnloadMesh() (1 input parameters)
Name: UnloadMesh
Return type: void
Description: Unload mesh data from CPU and GPU
Param[1]: mesh (type: Mesh)
-Function 472: DrawMesh() (3 input parameters)
+Function 474: DrawMesh() (3 input parameters)
Name: DrawMesh
Return type: void
Description: Draw a 3d mesh with material and transform
Param[1]: mesh (type: Mesh)
Param[2]: material (type: Material)
Param[3]: transform (type: Matrix)
-Function 473: DrawMeshInstanced() (4 input parameters)
+Function 475: DrawMeshInstanced() (4 input parameters)
Name: DrawMeshInstanced
Return type: void
Description: Draw multiple mesh instances with material and different transforms
@@ -4028,35 +4046,35 @@ Function 473: DrawMeshInstanced() (4 input parameters)
Param[2]: material (type: Material)
Param[3]: transforms (type: const Matrix *)
Param[4]: instances (type: int)
-Function 474: GetMeshBoundingBox() (1 input parameters)
+Function 476: GetMeshBoundingBox() (1 input parameters)
Name: GetMeshBoundingBox
Return type: BoundingBox
Description: Compute mesh bounding box limits
Param[1]: mesh (type: Mesh)
-Function 475: GenMeshTangents() (1 input parameters)
+Function 477: GenMeshTangents() (1 input parameters)
Name: GenMeshTangents
Return type: void
Description: Compute mesh tangents
Param[1]: mesh (type: Mesh *)
-Function 476: ExportMesh() (2 input parameters)
+Function 478: ExportMesh() (2 input parameters)
Name: ExportMesh
Return type: bool
Description: Export mesh data to file, returns true on success
Param[1]: mesh (type: Mesh)
Param[2]: fileName (type: const char *)
-Function 477: ExportMeshAsCode() (2 input parameters)
+Function 479: ExportMeshAsCode() (2 input parameters)
Name: ExportMeshAsCode
Return type: bool
Description: Export mesh as code file (.h) defining multiple arrays of vertex attributes
Param[1]: mesh (type: Mesh)
Param[2]: fileName (type: const char *)
-Function 478: GenMeshPoly() (2 input parameters)
+Function 480: GenMeshPoly() (2 input parameters)
Name: GenMeshPoly
Return type: Mesh
Description: Generate polygonal mesh
Param[1]: sides (type: int)
Param[2]: radius (type: float)
-Function 479: GenMeshPlane() (4 input parameters)
+Function 481: GenMeshPlane() (4 input parameters)
Name: GenMeshPlane
Return type: Mesh
Description: Generate plane mesh (with subdivisions)
@@ -4064,42 +4082,42 @@ Function 479: GenMeshPlane() (4 input parameters)
Param[2]: length (type: float)
Param[3]: resX (type: int)
Param[4]: resZ (type: int)
-Function 480: GenMeshCube() (3 input parameters)
+Function 482: GenMeshCube() (3 input parameters)
Name: GenMeshCube
Return type: Mesh
Description: Generate cuboid mesh
Param[1]: width (type: float)
Param[2]: height (type: float)
Param[3]: length (type: float)
-Function 481: GenMeshSphere() (3 input parameters)
+Function 483: GenMeshSphere() (3 input parameters)
Name: GenMeshSphere
Return type: Mesh
Description: Generate sphere mesh (standard sphere)
Param[1]: radius (type: float)
Param[2]: rings (type: int)
Param[3]: slices (type: int)
-Function 482: GenMeshHemiSphere() (3 input parameters)
+Function 484: GenMeshHemiSphere() (3 input parameters)
Name: GenMeshHemiSphere
Return type: Mesh
Description: Generate half-sphere mesh (no bottom cap)
Param[1]: radius (type: float)
Param[2]: rings (type: int)
Param[3]: slices (type: int)
-Function 483: GenMeshCylinder() (3 input parameters)
+Function 485: GenMeshCylinder() (3 input parameters)
Name: GenMeshCylinder
Return type: Mesh
Description: Generate cylinder mesh
Param[1]: radius (type: float)
Param[2]: height (type: float)
Param[3]: slices (type: int)
-Function 484: GenMeshCone() (3 input parameters)
+Function 486: GenMeshCone() (3 input parameters)
Name: GenMeshCone
Return type: Mesh
Description: Generate cone/pyramid mesh
Param[1]: radius (type: float)
Param[2]: height (type: float)
Param[3]: slices (type: int)
-Function 485: GenMeshTorus() (4 input parameters)
+Function 487: GenMeshTorus() (4 input parameters)
Name: GenMeshTorus
Return type: Mesh
Description: Generate torus mesh
@@ -4107,7 +4125,7 @@ Function 485: GenMeshTorus() (4 input parameters)
Param[2]: size (type: float)
Param[3]: radSeg (type: int)
Param[4]: sides (type: int)
-Function 486: GenMeshKnot() (4 input parameters)
+Function 488: GenMeshKnot() (4 input parameters)
Name: GenMeshKnot
Return type: Mesh
Description: Generate trefoil knot mesh
@@ -4115,84 +4133,84 @@ Function 486: GenMeshKnot() (4 input parameters)
Param[2]: size (type: float)
Param[3]: radSeg (type: int)
Param[4]: sides (type: int)
-Function 487: GenMeshHeightmap() (2 input parameters)
+Function 489: GenMeshHeightmap() (2 input parameters)
Name: GenMeshHeightmap
Return type: Mesh
Description: Generate heightmap mesh from image data
Param[1]: heightmap (type: Image)
Param[2]: size (type: Vector3)
-Function 488: GenMeshCubicmap() (2 input parameters)
+Function 490: GenMeshCubicmap() (2 input parameters)
Name: GenMeshCubicmap
Return type: Mesh
Description: Generate cubes-based map mesh from image data
Param[1]: cubicmap (type: Image)
Param[2]: cubeSize (type: Vector3)
-Function 489: LoadMaterials() (2 input parameters)
+Function 491: LoadMaterials() (2 input parameters)
Name: LoadMaterials
Return type: Material *
Description: Load materials from model file
Param[1]: fileName (type: const char *)
Param[2]: materialCount (type: int *)
-Function 490: LoadMaterialDefault() (0 input parameters)
+Function 492: LoadMaterialDefault() (0 input parameters)
Name: LoadMaterialDefault
Return type: Material
Description: Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps)
No input parameters
-Function 491: IsMaterialReady() (1 input parameters)
+Function 493: IsMaterialReady() (1 input parameters)
Name: IsMaterialReady
Return type: bool
Description: Check if a material is ready
Param[1]: material (type: Material)
-Function 492: UnloadMaterial() (1 input parameters)
+Function 494: UnloadMaterial() (1 input parameters)
Name: UnloadMaterial
Return type: void
Description: Unload material from GPU memory (VRAM)
Param[1]: material (type: Material)
-Function 493: SetMaterialTexture() (3 input parameters)
+Function 495: SetMaterialTexture() (3 input parameters)
Name: SetMaterialTexture
Return type: void
Description: Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...)
Param[1]: material (type: Material *)
Param[2]: mapType (type: int)
Param[3]: texture (type: Texture2D)
-Function 494: SetModelMeshMaterial() (3 input parameters)
+Function 496: SetModelMeshMaterial() (3 input parameters)
Name: SetModelMeshMaterial
Return type: void
Description: Set material for a mesh
Param[1]: model (type: Model *)
Param[2]: meshId (type: int)
Param[3]: materialId (type: int)
-Function 495: LoadModelAnimations() (2 input parameters)
+Function 497: LoadModelAnimations() (2 input parameters)
Name: LoadModelAnimations
Return type: ModelAnimation *
Description: Load model animations from file
Param[1]: fileName (type: const char *)
Param[2]: animCount (type: int *)
-Function 496: UpdateModelAnimation() (3 input parameters)
+Function 498: UpdateModelAnimation() (3 input parameters)
Name: UpdateModelAnimation
Return type: void
Description: Update model animation pose
Param[1]: model (type: Model)
Param[2]: anim (type: ModelAnimation)
Param[3]: frame (type: int)
-Function 497: UnloadModelAnimation() (1 input parameters)
+Function 499: UnloadModelAnimation() (1 input parameters)
Name: UnloadModelAnimation
Return type: void
Description: Unload animation data
Param[1]: anim (type: ModelAnimation)
-Function 498: UnloadModelAnimations() (2 input parameters)
+Function 500: UnloadModelAnimations() (2 input parameters)
Name: UnloadModelAnimations
Return type: void
Description: Unload animation array data
Param[1]: animations (type: ModelAnimation *)
Param[2]: animCount (type: int)
-Function 499: IsModelAnimationValid() (2 input parameters)
+Function 501: IsModelAnimationValid() (2 input parameters)
Name: IsModelAnimationValid
Return type: bool
Description: Check model animation skeleton match
Param[1]: model (type: Model)
Param[2]: anim (type: ModelAnimation)
-Function 500: CheckCollisionSpheres() (4 input parameters)
+Function 502: CheckCollisionSpheres() (4 input parameters)
Name: CheckCollisionSpheres
Return type: bool
Description: Check collision between two spheres
@@ -4200,40 +4218,40 @@ Function 500: CheckCollisionSpheres() (4 input parameters)
Param[2]: radius1 (type: float)
Param[3]: center2 (type: Vector3)
Param[4]: radius2 (type: float)
-Function 501: CheckCollisionBoxes() (2 input parameters)
+Function 503: CheckCollisionBoxes() (2 input parameters)
Name: CheckCollisionBoxes
Return type: bool
Description: Check collision between two bounding boxes
Param[1]: box1 (type: BoundingBox)
Param[2]: box2 (type: BoundingBox)
-Function 502: CheckCollisionBoxSphere() (3 input parameters)
+Function 504: CheckCollisionBoxSphere() (3 input parameters)
Name: CheckCollisionBoxSphere
Return type: bool
Description: Check collision between box and sphere
Param[1]: box (type: BoundingBox)
Param[2]: center (type: Vector3)
Param[3]: radius (type: float)
-Function 503: GetRayCollisionSphere() (3 input parameters)
+Function 505: GetRayCollisionSphere() (3 input parameters)
Name: GetRayCollisionSphere
Return type: RayCollision
Description: Get collision info between ray and sphere
Param[1]: ray (type: Ray)
Param[2]: center (type: Vector3)
Param[3]: radius (type: float)
-Function 504: GetRayCollisionBox() (2 input parameters)
+Function 506: GetRayCollisionBox() (2 input parameters)
Name: GetRayCollisionBox
Return type: RayCollision
Description: Get collision info between ray and box
Param[1]: ray (type: Ray)
Param[2]: box (type: BoundingBox)
-Function 505: GetRayCollisionMesh() (3 input parameters)
+Function 507: GetRayCollisionMesh() (3 input parameters)
Name: GetRayCollisionMesh
Return type: RayCollision
Description: Get collision info between ray and mesh
Param[1]: ray (type: Ray)
Param[2]: mesh (type: Mesh)
Param[3]: transform (type: Matrix)
-Function 506: GetRayCollisionTriangle() (4 input parameters)
+Function 508: GetRayCollisionTriangle() (4 input parameters)
Name: GetRayCollisionTriangle
Return type: RayCollision
Description: Get collision info between ray and triangle
@@ -4241,7 +4259,7 @@ Function 506: GetRayCollisionTriangle() (4 input parameters)
Param[2]: p1 (type: Vector3)
Param[3]: p2 (type: Vector3)
Param[4]: p3 (type: Vector3)
-Function 507: GetRayCollisionQuad() (5 input parameters)
+Function 509: GetRayCollisionQuad() (5 input parameters)
Name: GetRayCollisionQuad
Return type: RayCollision
Description: Get collision info between ray and quad
@@ -4250,158 +4268,158 @@ Function 507: GetRayCollisionQuad() (5 input parameters)
Param[3]: p2 (type: Vector3)
Param[4]: p3 (type: Vector3)
Param[5]: p4 (type: Vector3)
-Function 508: InitAudioDevice() (0 input parameters)
+Function 510: InitAudioDevice() (0 input parameters)
Name: InitAudioDevice
Return type: void
Description: Initialize audio device and context
No input parameters
-Function 509: CloseAudioDevice() (0 input parameters)
+Function 511: CloseAudioDevice() (0 input parameters)
Name: CloseAudioDevice
Return type: void
Description: Close the audio device and context
No input parameters
-Function 510: IsAudioDeviceReady() (0 input parameters)
+Function 512: IsAudioDeviceReady() (0 input parameters)
Name: IsAudioDeviceReady
Return type: bool
Description: Check if audio device has been initialized successfully
No input parameters
-Function 511: SetMasterVolume() (1 input parameters)
+Function 513: SetMasterVolume() (1 input parameters)
Name: SetMasterVolume
Return type: void
Description: Set master volume (listener)
Param[1]: volume (type: float)
-Function 512: GetMasterVolume() (0 input parameters)
+Function 514: GetMasterVolume() (0 input parameters)
Name: GetMasterVolume
Return type: float
Description: Get master volume (listener)
No input parameters
-Function 513: LoadWave() (1 input parameters)
+Function 515: LoadWave() (1 input parameters)
Name: LoadWave
Return type: Wave
Description: Load wave data from file
Param[1]: fileName (type: const char *)
-Function 514: LoadWaveFromMemory() (3 input parameters)
+Function 516: LoadWaveFromMemory() (3 input parameters)
Name: LoadWaveFromMemory
Return type: Wave
Description: Load wave from memory buffer, fileType refers to extension: i.e. '.wav'
Param[1]: fileType (type: const char *)
Param[2]: fileData (type: const unsigned char *)
Param[3]: dataSize (type: int)
-Function 515: IsWaveReady() (1 input parameters)
+Function 517: IsWaveReady() (1 input parameters)
Name: IsWaveReady
Return type: bool
Description: Checks if wave data is ready
Param[1]: wave (type: Wave)
-Function 516: LoadSound() (1 input parameters)
+Function 518: LoadSound() (1 input parameters)
Name: LoadSound
Return type: Sound
Description: Load sound from file
Param[1]: fileName (type: const char *)
-Function 517: LoadSoundFromWave() (1 input parameters)
+Function 519: LoadSoundFromWave() (1 input parameters)
Name: LoadSoundFromWave
Return type: Sound
Description: Load sound from wave data
Param[1]: wave (type: Wave)
-Function 518: LoadSoundAlias() (1 input parameters)
+Function 520: LoadSoundAlias() (1 input parameters)
Name: LoadSoundAlias
Return type: Sound
Description: Create a new sound that shares the same sample data as the source sound, does not own the sound data
Param[1]: source (type: Sound)
-Function 519: IsSoundReady() (1 input parameters)
+Function 521: IsSoundReady() (1 input parameters)
Name: IsSoundReady
Return type: bool
Description: Checks if a sound is ready
Param[1]: sound (type: Sound)
-Function 520: UpdateSound() (3 input parameters)
+Function 522: UpdateSound() (3 input parameters)
Name: UpdateSound
Return type: void
Description: Update sound buffer with new data
Param[1]: sound (type: Sound)
Param[2]: data (type: const void *)
Param[3]: sampleCount (type: int)
-Function 521: UnloadWave() (1 input parameters)
+Function 523: UnloadWave() (1 input parameters)
Name: UnloadWave
Return type: void
Description: Unload wave data
Param[1]: wave (type: Wave)
-Function 522: UnloadSound() (1 input parameters)
+Function 524: UnloadSound() (1 input parameters)
Name: UnloadSound
Return type: void
Description: Unload sound
Param[1]: sound (type: Sound)
-Function 523: UnloadSoundAlias() (1 input parameters)
+Function 525: UnloadSoundAlias() (1 input parameters)
Name: UnloadSoundAlias
Return type: void
Description: Unload a sound alias (does not deallocate sample data)
Param[1]: alias (type: Sound)
-Function 524: ExportWave() (2 input parameters)
+Function 526: ExportWave() (2 input parameters)
Name: ExportWave
Return type: bool
Description: Export wave data to file, returns true on success
Param[1]: wave (type: Wave)
Param[2]: fileName (type: const char *)
-Function 525: ExportWaveAsCode() (2 input parameters)
+Function 527: ExportWaveAsCode() (2 input parameters)
Name: ExportWaveAsCode
Return type: bool
Description: Export wave sample data to code (.h), returns true on success
Param[1]: wave (type: Wave)
Param[2]: fileName (type: const char *)
-Function 526: PlaySound() (1 input parameters)
+Function 528: PlaySound() (1 input parameters)
Name: PlaySound
Return type: void
Description: Play a sound
Param[1]: sound (type: Sound)
-Function 527: StopSound() (1 input parameters)
+Function 529: StopSound() (1 input parameters)
Name: StopSound
Return type: void
Description: Stop playing a sound
Param[1]: sound (type: Sound)
-Function 528: PauseSound() (1 input parameters)
+Function 530: PauseSound() (1 input parameters)
Name: PauseSound
Return type: void
Description: Pause a sound
Param[1]: sound (type: Sound)
-Function 529: ResumeSound() (1 input parameters)
+Function 531: ResumeSound() (1 input parameters)
Name: ResumeSound
Return type: void
Description: Resume a paused sound
Param[1]: sound (type: Sound)
-Function 530: IsSoundPlaying() (1 input parameters)
+Function 532: IsSoundPlaying() (1 input parameters)
Name: IsSoundPlaying
Return type: bool
Description: Check if a sound is currently playing
Param[1]: sound (type: Sound)
-Function 531: SetSoundVolume() (2 input parameters)
+Function 533: SetSoundVolume() (2 input parameters)
Name: SetSoundVolume
Return type: void
Description: Set volume for a sound (1.0 is max level)
Param[1]: sound (type: Sound)
Param[2]: volume (type: float)
-Function 532: SetSoundPitch() (2 input parameters)
+Function 534: SetSoundPitch() (2 input parameters)
Name: SetSoundPitch
Return type: void
Description: Set pitch for a sound (1.0 is base level)
Param[1]: sound (type: Sound)
Param[2]: pitch (type: float)
-Function 533: SetSoundPan() (2 input parameters)
+Function 535: SetSoundPan() (2 input parameters)
Name: SetSoundPan
Return type: void
Description: Set pan for a sound (0.5 is center)
Param[1]: sound (type: Sound)
Param[2]: pan (type: float)
-Function 534: WaveCopy() (1 input parameters)
+Function 536: WaveCopy() (1 input parameters)
Name: WaveCopy
Return type: Wave
Description: Copy a wave to a new wave
Param[1]: wave (type: Wave)
-Function 535: WaveCrop() (3 input parameters)
+Function 537: WaveCrop() (3 input parameters)
Name: WaveCrop
Return type: void
Description: Crop a wave to defined frames range
Param[1]: wave (type: Wave *)
Param[2]: initFrame (type: int)
Param[3]: finalFrame (type: int)
-Function 536: WaveFormat() (4 input parameters)
+Function 538: WaveFormat() (4 input parameters)
Name: WaveFormat
Return type: void
Description: Convert wave data to desired format
@@ -4409,203 +4427,203 @@ Function 536: WaveFormat() (4 input parameters)
Param[2]: sampleRate (type: int)
Param[3]: sampleSize (type: int)
Param[4]: channels (type: int)
-Function 537: LoadWaveSamples() (1 input parameters)
+Function 539: LoadWaveSamples() (1 input parameters)
Name: LoadWaveSamples
Return type: float *
Description: Load samples data from wave as a 32bit float data array
Param[1]: wave (type: Wave)
-Function 538: UnloadWaveSamples() (1 input parameters)
+Function 540: UnloadWaveSamples() (1 input parameters)
Name: UnloadWaveSamples
Return type: void
Description: Unload samples data loaded with LoadWaveSamples()
Param[1]: samples (type: float *)
-Function 539: LoadMusicStream() (1 input parameters)
+Function 541: LoadMusicStream() (1 input parameters)
Name: LoadMusicStream
Return type: Music
Description: Load music stream from file
Param[1]: fileName (type: const char *)
-Function 540: LoadMusicStreamFromMemory() (3 input parameters)
+Function 542: LoadMusicStreamFromMemory() (3 input parameters)
Name: LoadMusicStreamFromMemory
Return type: Music
Description: Load music stream from data
Param[1]: fileType (type: const char *)
Param[2]: data (type: const unsigned char *)
Param[3]: dataSize (type: int)
-Function 541: IsMusicReady() (1 input parameters)
+Function 543: IsMusicReady() (1 input parameters)
Name: IsMusicReady
Return type: bool
Description: Checks if a music stream is ready
Param[1]: music (type: Music)
-Function 542: UnloadMusicStream() (1 input parameters)
+Function 544: UnloadMusicStream() (1 input parameters)
Name: UnloadMusicStream
Return type: void
Description: Unload music stream
Param[1]: music (type: Music)
-Function 543: PlayMusicStream() (1 input parameters)
+Function 545: PlayMusicStream() (1 input parameters)
Name: PlayMusicStream
Return type: void
Description: Start music playing
Param[1]: music (type: Music)
-Function 544: IsMusicStreamPlaying() (1 input parameters)
+Function 546: IsMusicStreamPlaying() (1 input parameters)
Name: IsMusicStreamPlaying
Return type: bool
Description: Check if music is playing
Param[1]: music (type: Music)
-Function 545: UpdateMusicStream() (1 input parameters)
+Function 547: UpdateMusicStream() (1 input parameters)
Name: UpdateMusicStream
Return type: void
Description: Updates buffers for music streaming
Param[1]: music (type: Music)
-Function 546: StopMusicStream() (1 input parameters)
+Function 548: StopMusicStream() (1 input parameters)
Name: StopMusicStream
Return type: void
Description: Stop music playing
Param[1]: music (type: Music)
-Function 547: PauseMusicStream() (1 input parameters)
+Function 549: PauseMusicStream() (1 input parameters)
Name: PauseMusicStream
Return type: void
Description: Pause music playing
Param[1]: music (type: Music)
-Function 548: ResumeMusicStream() (1 input parameters)
+Function 550: ResumeMusicStream() (1 input parameters)
Name: ResumeMusicStream
Return type: void
Description: Resume playing paused music
Param[1]: music (type: Music)
-Function 549: SeekMusicStream() (2 input parameters)
+Function 551: SeekMusicStream() (2 input parameters)
Name: SeekMusicStream
Return type: void
Description: Seek music to a position (in seconds)
Param[1]: music (type: Music)
Param[2]: position (type: float)
-Function 550: SetMusicVolume() (2 input parameters)
+Function 552: SetMusicVolume() (2 input parameters)
Name: SetMusicVolume
Return type: void
Description: Set volume for music (1.0 is max level)
Param[1]: music (type: Music)
Param[2]: volume (type: float)
-Function 551: SetMusicPitch() (2 input parameters)
+Function 553: SetMusicPitch() (2 input parameters)
Name: SetMusicPitch
Return type: void
Description: Set pitch for a music (1.0 is base level)
Param[1]: music (type: Music)
Param[2]: pitch (type: float)
-Function 552: SetMusicPan() (2 input parameters)
+Function 554: SetMusicPan() (2 input parameters)
Name: SetMusicPan
Return type: void
Description: Set pan for a music (0.5 is center)
Param[1]: music (type: Music)
Param[2]: pan (type: float)
-Function 553: GetMusicTimeLength() (1 input parameters)
+Function 555: GetMusicTimeLength() (1 input parameters)
Name: GetMusicTimeLength
Return type: float
Description: Get music time length (in seconds)
Param[1]: music (type: Music)
-Function 554: GetMusicTimePlayed() (1 input parameters)
+Function 556: GetMusicTimePlayed() (1 input parameters)
Name: GetMusicTimePlayed
Return type: float
Description: Get current music time played (in seconds)
Param[1]: music (type: Music)
-Function 555: LoadAudioStream() (3 input parameters)
+Function 557: LoadAudioStream() (3 input parameters)
Name: LoadAudioStream
Return type: AudioStream
Description: Load audio stream (to stream raw audio pcm data)
Param[1]: sampleRate (type: unsigned int)
Param[2]: sampleSize (type: unsigned int)
Param[3]: channels (type: unsigned int)
-Function 556: IsAudioStreamReady() (1 input parameters)
+Function 558: IsAudioStreamReady() (1 input parameters)
Name: IsAudioStreamReady
Return type: bool
Description: Checks if an audio stream is ready
Param[1]: stream (type: AudioStream)
-Function 557: UnloadAudioStream() (1 input parameters)
+Function 559: UnloadAudioStream() (1 input parameters)
Name: UnloadAudioStream
Return type: void
Description: Unload audio stream and free memory
Param[1]: stream (type: AudioStream)
-Function 558: UpdateAudioStream() (3 input parameters)
+Function 560: UpdateAudioStream() (3 input parameters)
Name: UpdateAudioStream
Return type: void
Description: Update audio stream buffers with data
Param[1]: stream (type: AudioStream)
Param[2]: data (type: const void *)
Param[3]: frameCount (type: int)
-Function 559: IsAudioStreamProcessed() (1 input parameters)
+Function 561: IsAudioStreamProcessed() (1 input parameters)
Name: IsAudioStreamProcessed
Return type: bool
Description: Check if any audio stream buffers requires refill
Param[1]: stream (type: AudioStream)
-Function 560: PlayAudioStream() (1 input parameters)
+Function 562: PlayAudioStream() (1 input parameters)
Name: PlayAudioStream
Return type: void
Description: Play audio stream
Param[1]: stream (type: AudioStream)
-Function 561: PauseAudioStream() (1 input parameters)
+Function 563: PauseAudioStream() (1 input parameters)
Name: PauseAudioStream
Return type: void
Description: Pause audio stream
Param[1]: stream (type: AudioStream)
-Function 562: ResumeAudioStream() (1 input parameters)
+Function 564: ResumeAudioStream() (1 input parameters)
Name: ResumeAudioStream
Return type: void
Description: Resume audio stream
Param[1]: stream (type: AudioStream)
-Function 563: IsAudioStreamPlaying() (1 input parameters)
+Function 565: IsAudioStreamPlaying() (1 input parameters)
Name: IsAudioStreamPlaying
Return type: bool
Description: Check if audio stream is playing
Param[1]: stream (type: AudioStream)
-Function 564: StopAudioStream() (1 input parameters)
+Function 566: StopAudioStream() (1 input parameters)
Name: StopAudioStream
Return type: void
Description: Stop audio stream
Param[1]: stream (type: AudioStream)
-Function 565: SetAudioStreamVolume() (2 input parameters)
+Function 567: SetAudioStreamVolume() (2 input parameters)
Name: SetAudioStreamVolume
Return type: void
Description: Set volume for audio stream (1.0 is max level)
Param[1]: stream (type: AudioStream)
Param[2]: volume (type: float)
-Function 566: SetAudioStreamPitch() (2 input parameters)
+Function 568: SetAudioStreamPitch() (2 input parameters)
Name: SetAudioStreamPitch
Return type: void
Description: Set pitch for audio stream (1.0 is base level)
Param[1]: stream (type: AudioStream)
Param[2]: pitch (type: float)
-Function 567: SetAudioStreamPan() (2 input parameters)
+Function 569: SetAudioStreamPan() (2 input parameters)
Name: SetAudioStreamPan
Return type: void
Description: Set pan for audio stream (0.5 is centered)
Param[1]: stream (type: AudioStream)
Param[2]: pan (type: float)
-Function 568: SetAudioStreamBufferSizeDefault() (1 input parameters)
+Function 570: SetAudioStreamBufferSizeDefault() (1 input parameters)
Name: SetAudioStreamBufferSizeDefault
Return type: void
Description: Default size for new audio streams
Param[1]: size (type: int)
-Function 569: SetAudioStreamCallback() (2 input parameters)
+Function 571: SetAudioStreamCallback() (2 input parameters)
Name: SetAudioStreamCallback
Return type: void
Description: Audio thread callback to request new data
Param[1]: stream (type: AudioStream)
Param[2]: callback (type: AudioCallback)
-Function 570: AttachAudioStreamProcessor() (2 input parameters)
+Function 572: AttachAudioStreamProcessor() (2 input parameters)
Name: AttachAudioStreamProcessor
Return type: void
Description: Attach audio stream processor to stream, receives the samples as 'float'
Param[1]: stream (type: AudioStream)
Param[2]: processor (type: AudioCallback)
-Function 571: DetachAudioStreamProcessor() (2 input parameters)
+Function 573: DetachAudioStreamProcessor() (2 input parameters)
Name: DetachAudioStreamProcessor
Return type: void
Description: Detach audio stream processor from stream
Param[1]: stream (type: AudioStream)
Param[2]: processor (type: AudioCallback)
-Function 572: AttachAudioMixedProcessor() (1 input parameters)
+Function 574: AttachAudioMixedProcessor() (1 input parameters)
Name: AttachAudioMixedProcessor
Return type: void
Description: Attach audio stream processor to the entire audio pipeline, receives the samples as 'float'
Param[1]: processor (type: AudioCallback)
-Function 573: DetachAudioMixedProcessor() (1 input parameters)
+Function 575: DetachAudioMixedProcessor() (1 input parameters)
Name: DetachAudioMixedProcessor
Return type: void
Description: Detach audio stream processor from the entire audio pipeline
diff --git a/parser/output/raylib_api.xml b/parser/output/raylib_api.xml
index 8a6560f48..532b9e3b9 100644
--- a/parser/output/raylib_api.xml
+++ b/parser/output/raylib_api.xml
@@ -670,7 +670,7 @@
-
+
@@ -703,9 +703,9 @@
-
+
-
+
@@ -2637,6 +2637,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/external/RGFW.h b/src/external/RGFW.h
index 367a46fa6..35e782d4a 100644
--- a/src/external/RGFW.h
+++ b/src/external/RGFW.h
@@ -4999,7 +4999,9 @@ static const struct wl_callback_listener wl_surface_frame_listener = {
#define WIN32_LEAN_AND_MEAN
#define OEMRESOURCE
#include
-
+
+ __declspec(dllimport) int __stdcall WideCharToMultiByte( UINT CodePage, DWORD dwFlags, const WCHAR* lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar);
+
#include
#include
#include
diff --git a/src/platforms/rcore_desktop_glfw.c b/src/platforms/rcore_desktop_glfw.c
index d64bf60db..c6685846c 100644
--- a/src/platforms/rcore_desktop_glfw.c
+++ b/src/platforms/rcore_desktop_glfw.c
@@ -109,6 +109,7 @@ static void ErrorCallback(int error, const char *description);
// Window callbacks events
static void WindowSizeCallback(GLFWwindow *window, int width, int height); // GLFW3 WindowSize Callback, runs when window is resized
+static void WindowPosCallback(GLFWwindow* window, int x, int y); // GLFW3 WindowPos Callback, runs when window is moved
static void WindowIconifyCallback(GLFWwindow *window, int iconified); // GLFW3 WindowIconify Callback, runs when window is minimized/restored
static void WindowMaximizeCallback(GLFWwindow* window, int maximized); // GLFW3 Window Maximize Callback, runs when window is maximized
static void WindowFocusCallback(GLFWwindow *window, int focused); // GLFW3 WindowFocus Callback, runs when window get/lose focus
@@ -147,8 +148,8 @@ void ToggleFullscreen(void)
if (!CORE.Window.fullscreen)
{
// Store previous window position (in case we exit fullscreen)
- glfwGetWindowPos(platform.handle, &CORE.Window.position.x, &CORE.Window.position.y);
-
+ CORE.Window.previousPosition = CORE.Window.position;
+
int monitorCount = 0;
int monitorIndex = GetCurrentMonitor();
GLFWmonitor **monitors = glfwGetMonitors(&monitorCount);
@@ -179,7 +180,11 @@ void ToggleFullscreen(void)
CORE.Window.fullscreen = false;
CORE.Window.flags &= ~FLAG_FULLSCREEN_MODE;
- glfwSetWindowMonitor(platform.handle, NULL, CORE.Window.position.x, CORE.Window.position.y, CORE.Window.screen.width, CORE.Window.screen.height, GLFW_DONT_CARE);
+ glfwSetWindowMonitor(platform.handle, NULL, CORE.Window.previousPosition.x, CORE.Window.previousPosition.y, CORE.Window.screen.width, CORE.Window.screen.height, GLFW_DONT_CARE);
+
+ // we update the window position right away
+ CORE.Window.position.x = CORE.Window.previousPosition.x;
+ CORE.Window.position.y = CORE.Window.previousPosition.y;
}
// Try to enable GPU V-Sync, so frames are limited to screen refresh rate (60Hz -> 60 FPS)
@@ -190,11 +195,11 @@ void ToggleFullscreen(void)
// Toggle borderless windowed mode
void ToggleBorderlessWindowed(void)
{
- // Leave fullscreen before attempting to set borderless windowed mode and get screen position from it
+ // Leave fullscreen before attempting to set borderless windowed mode
bool wasOnFullscreen = false;
if (CORE.Window.fullscreen)
{
- CORE.Window.previousPosition = CORE.Window.position;
+ // fullscreen already saves the previous position so it does not need to be set here again
ToggleFullscreen();
wasOnFullscreen = true;
}
@@ -213,7 +218,7 @@ void ToggleBorderlessWindowed(void)
{
// Store screen position and size
// NOTE: If it was on fullscreen, screen position was already stored, so skip setting it here
- if (!wasOnFullscreen) glfwGetWindowPos(platform.handle, &CORE.Window.previousPosition.x, &CORE.Window.previousPosition.y);
+ if (!wasOnFullscreen) CORE.Window.previousPosition = CORE.Window.position;
CORE.Window.previousScreen = CORE.Window.screen;
// Set undecorated and topmost modes and flags
@@ -255,6 +260,9 @@ void ToggleBorderlessWindowed(void)
glfwFocusWindow(platform.handle);
CORE.Window.flags &= ~FLAG_BORDERLESS_WINDOWED_MODE;
+
+ CORE.Window.position.x = CORE.Window.previousPosition.x;
+ CORE.Window.position.y = CORE.Window.previousPosition.y;
}
}
else TRACELOG(LOG_WARNING, "GLFW: Failed to find video mode for selected monitor");
@@ -592,6 +600,9 @@ void SetWindowTitle(const char *title)
// Set window position on screen (windowed mode)
void SetWindowPosition(int x, int y)
{
+ // Update CORE.Window.position as well
+ CORE.Window.position.x = x;
+ CORE.Window.position.y = y;
glfwSetWindowPos(platform.handle, x, y);
}
@@ -614,8 +625,9 @@ void SetWindowMonitor(int monitor)
{
TRACELOG(LOG_INFO, "GLFW: Selected monitor: [%i] %s", monitor, glfwGetMonitorName(monitors[monitor]));
- const int screenWidth = CORE.Window.screen.width;
- const int screenHeight = CORE.Window.screen.height;
+ // Here the render width has to be used again in case high dpi flag is enabled
+ const int screenWidth = CORE.Window.render.width;
+ const int screenHeight = CORE.Window.render.height;
int monitorWorkareaX = 0;
int monitorWorkareaY = 0;
int monitorWorkareaWidth = 0;
@@ -1568,12 +1580,17 @@ int InitPlatform(void)
int monitorWidth = 0;
int monitorHeight = 0;
glfwGetMonitorWorkarea(monitor, &monitorX, &monitorY, &monitorWidth, &monitorHeight);
-
- int posX = monitorX + (monitorWidth - (int)CORE.Window.screen.width)/2;
- int posY = monitorY + (monitorHeight - (int)CORE.Window.screen.height)/2;
+
+ // Here CORE.Window.render.width/height should be used instead of CORE.Window.screen.width/height to center the window correctly when the high dpi flag is enabled.
+ int posX = monitorX + (monitorWidth - (int)CORE.Window.render.width)/2;
+ int posY = monitorY + (monitorHeight - (int)CORE.Window.render.height)/2;
if (posX < monitorX) posX = monitorX;
if (posY < monitorY) posY = monitorY;
SetWindowPosition(posX, posY);
+
+ // Update CORE.Window.position here so it is correct from the start
+ CORE.Window.position.x = posX;
+ CORE.Window.position.y = posY;
}
// Load OpenGL extensions
@@ -1585,6 +1602,7 @@ int InitPlatform(void)
//----------------------------------------------------------------------------
// Set window callback events
glfwSetWindowSizeCallback(platform.handle, WindowSizeCallback); // NOTE: Resizing not allowed by default!
+ glfwSetWindowPosCallback(platform.handle, WindowPosCallback);
glfwSetWindowMaximizeCallback(platform.handle, WindowMaximizeCallback);
glfwSetWindowIconifyCallback(platform.handle, WindowIconifyCallback);
glfwSetWindowFocusCallback(platform.handle, WindowFocusCallback);
@@ -1681,7 +1699,12 @@ static void WindowSizeCallback(GLFWwindow *window, int width, int height)
// NOTE: Postprocessing texture is not scaled to new size
}
-
+static void WindowPosCallback(GLFWwindow* window, int x, int y)
+{
+ // Set current window position
+ CORE.Window.position.x = x;
+ CORE.Window.position.y = y;
+}
static void WindowContentScaleCallback(GLFWwindow *window, float scalex, float scaley)
{
CORE.Window.screenScale = MatrixScale(scalex, scaley, 1.0f);
diff --git a/src/platforms/rcore_desktop_rgfw.c b/src/platforms/rcore_desktop_rgfw.c
index afea0c2e6..64ab432e6 100644
--- a/src/platforms/rcore_desktop_rgfw.c
+++ b/src/platforms/rcore_desktop_rgfw.c
@@ -76,9 +76,7 @@ void CloseWindow(void);
#define Size NSSIZE
#endif
-#if defined(_MSC_VER)
__declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int CodePage, unsigned long dwFlags, const char *lpMultiByteStr, int cbMultiByte, wchar_t *lpWideCharStr, int cchWideChar);
-#endif
#include "../external/RGFW.h"
@@ -538,10 +536,8 @@ void *GetWindowHandle(void)
{
#ifdef RGFW_WEBASM
return (void*)platform.window->src.ctx;
-#elif !defined(RGFW_WINDOWS)
- return (void *)platform.window->src.window;
#else
- return platform.window->src.hwnd;
+ return (void*)platform.window->src.window;
#endif
}
diff --git a/src/raylib.h b/src/raylib.h
index 0759c259f..7e9af7ada 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -968,8 +968,8 @@ RLAPI bool IsWindowResized(void); // Check if wi
RLAPI bool IsWindowState(unsigned int flag); // Check if one specific window flag is enabled
RLAPI void SetWindowState(unsigned int flags); // Set window configuration state using flags (only PLATFORM_DESKTOP)
RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags
-RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
-RLAPI void ToggleBorderlessWindowed(void); // Toggle window state: borderless windowed (only PLATFORM_DESKTOP)
+RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed [resizes monitor to match window resolution] (only PLATFORM_DESKTOP)
+RLAPI void ToggleBorderlessWindowed(void); // Toggle window state: borderless windowed [resizes window to match monitor resolution] (only PLATFORM_DESKTOP)
RLAPI void MaximizeWindow(void); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP)
RLAPI void RestoreWindow(void); // Set window state: not minimized/maximized (only PLATFORM_DESKTOP)
@@ -1545,6 +1545,8 @@ RLAPI void DrawModel(Model model, Vector3 position, float scale, Color tint);
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 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 DrawModelPoints(Model model, Vector3 position, float scale, Color tint); // Draw a model as points
+RLAPI void DrawModelPointsEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model as points with extended parameters
RLAPI void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires)
RLAPI void DrawBillboard(Camera camera, Texture2D texture, Vector3 position, float scale, 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
diff --git a/src/rcore.c b/src/rcore.c
index e8041ea41..972d58600 100644
--- a/src/rcore.c
+++ b/src/rcore.c
@@ -360,10 +360,15 @@ typedef struct CoreData {
//----------------------------------------------------------------------------------
RLAPI const char *raylib_version = RAYLIB_VERSION; // raylib version exported symbol, required for some bindings
-CoreData CORE = { 0 }; // Global CORE state context
+CoreData CORE = { 0 }; // Global CORE state context
+
+// Flag to note GPU acceleration is available,
+// referenced from other modules to support GPU data loading
+// NOTE: Useful to allow Texture, RenderTexture, Font.texture, Mesh.vaoId/vboId, Shader loading
+bool isGpuReady = false;
#if defined(SUPPORT_SCREEN_CAPTURE)
-static int screenshotCounter = 0; // Screenshots counter
+static int screenshotCounter = 0; // Screenshots counter
#endif
#if defined(SUPPORT_GIF_RECORDING)
@@ -637,28 +642,31 @@ void InitWindow(int width, int height, const char *title)
// Initialize rlgl default data (buffers and shaders)
// NOTE: CORE.Window.currentFbo.width and CORE.Window.currentFbo.height not used, just stored as globals in rlgl
rlglInit(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height);
+ isGpuReady = true; // Flag to note GPU has been initialized successfully
// Setup default viewport
SetupViewport(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height);
-#if defined(SUPPORT_MODULE_RTEXT) && defined(SUPPORT_DEFAULT_FONT)
- // Load default font
- // WARNING: External function: Module required: rtext
- LoadFontDefault();
- #if defined(SUPPORT_MODULE_RSHAPES)
- // Set font white rectangle for shapes drawing, so shapes and text can be batched together
- // WARNING: rshapes module is required, if not available, default internal white rectangle is used
- Rectangle rec = GetFontDefault().recs[95];
- if (CORE.Window.flags & FLAG_MSAA_4X_HINT)
- {
- // NOTE: We try to maxime rec padding to avoid pixel bleeding on MSAA filtering
- SetShapesTexture(GetFontDefault().texture, (Rectangle){ rec.x + 2, rec.y + 2, 1, 1 });
- }
- else
- {
- // NOTE: We set up a 1px padding on char rectangle to avoid pixel bleeding
- SetShapesTexture(GetFontDefault().texture, (Rectangle){ rec.x + 1, rec.y + 1, rec.width - 2, rec.height - 2 });
- }
+#if defined(SUPPORT_MODULE_RTEXT)
+ #if defined(SUPPORT_DEFAULT_FONT)
+ // Load default font
+ // WARNING: External function: Module required: rtext
+ LoadFontDefault();
+ #if defined(SUPPORT_MODULE_RSHAPES)
+ // Set font white rectangle for shapes drawing, so shapes and text can be batched together
+ // WARNING: rshapes module is required, if not available, default internal white rectangle is used
+ Rectangle rec = GetFontDefault().recs[95];
+ if (CORE.Window.flags & FLAG_MSAA_4X_HINT)
+ {
+ // NOTE: We try to maxime rec padding to avoid pixel bleeding on MSAA filtering
+ SetShapesTexture(GetFontDefault().texture, (Rectangle){ rec.x + 2, rec.y + 2, 1, 1 });
+ }
+ else
+ {
+ // NOTE: We set up a 1px padding on char rectangle to avoid pixel bleeding
+ SetShapesTexture(GetFontDefault().texture, (Rectangle){ rec.x + 1, rec.y + 1, rec.width - 2, rec.height - 2 });
+ }
+ #endif
#endif
#else
#if defined(SUPPORT_MODULE_RSHAPES)
diff --git a/src/rlgl.h b/src/rlgl.h
index 5fb9497cd..3efed736a 100644
--- a/src/rlgl.h
+++ b/src/rlgl.h
@@ -665,7 +665,7 @@ RLAPI void rlDisableScissorTest(void); // Disable scissor test
RLAPI void rlScissor(int x, int y, int width, int height); // Scissor test
RLAPI void rlEnableWireMode(void); // Enable wire mode
RLAPI void rlEnablePointMode(void); // Enable point mode
-RLAPI void rlDisableWireMode(void); // Disable wire mode ( and point ) maybe rename
+RLAPI void rlDisableWireMode(void); // Disable wire (and point) mode
RLAPI void rlSetLineWidth(float width); // Set the line drawing width
RLAPI float rlGetLineWidth(void); // Get the line drawing width
RLAPI void rlEnableSmoothLines(void); // Enable line aliasing
@@ -1948,6 +1948,7 @@ void rlEnableWireMode(void)
#endif
}
+// Enable point mode
void rlEnablePointMode(void)
{
#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33)
@@ -1956,6 +1957,7 @@ void rlEnablePointMode(void)
glEnable(GL_PROGRAM_POINT_SIZE);
#endif
}
+
// Disable wire mode
void rlDisableWireMode(void)
{
@@ -4236,6 +4238,8 @@ void rlSetUniform(int locIndex, const void *value, int uniformType, int count)
case RL_SHADER_UNIFORM_IVEC4: glUniform4iv(locIndex, count, (int *)value); break;
case RL_SHADER_UNIFORM_SAMPLER2D: glUniform1iv(locIndex, count, (int *)value); break;
default: TRACELOG(RL_LOG_WARNING, "SHADER: Failed to set uniform value, data type not recognized");
+
+ // TODO: Support glUniform1uiv(), glUniform2uiv(), glUniform3uiv(), glUniform4uiv()
}
#endif
}
@@ -4410,14 +4414,14 @@ void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSi
// Get SSBO buffer size
unsigned int rlGetShaderBufferSize(unsigned int id)
{
- GLint64 size = 0;
-
#if defined(GRAPHICS_API_OPENGL_43)
+ GLint64 size = 0;
glBindBuffer(GL_SHADER_STORAGE_BUFFER, id);
glGetBufferParameteri64v(GL_SHADER_STORAGE_BUFFER, GL_BUFFER_SIZE, &size);
-#endif
-
return (size > 0)? (unsigned int)size : 0;
+#else
+ return 0;
+#endif
}
// Read SSBO buffer data (GPU->CPU)
diff --git a/src/rmodels.c b/src/rmodels.c
index 8afa3df57..966a8665c 100644
--- a/src/rmodels.c
+++ b/src/rmodels.c
@@ -3631,6 +3631,30 @@ void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float
rlDisableWireMode();
}
+// Draw a model points
+void DrawModelPoints(Model model, Vector3 position, float scale, Color tint)
+{
+ rlEnablePointMode();
+ rlDisableBackfaceCulling();
+
+ DrawModel(model, position, scale, tint);
+
+ rlEnableBackfaceCulling();
+ rlDisableWireMode();
+}
+
+// Draw a model points
+void DrawModelPointsEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint)
+{
+ rlEnablePointMode();
+ rlDisableBackfaceCulling();
+
+ DrawModelEx(model, position, rotationAxis, rotationAngle, scale, tint);
+
+ rlEnableBackfaceCulling();
+ rlDisableWireMode();
+}
+
// Draw a billboard
void DrawBillboard(Camera camera, Texture2D texture, Vector3 position, float scale, Color tint)
{
diff --git a/src/rtext.c b/src/rtext.c
index 8c1dc3c5e..4f1be2cd7 100644
--- a/src/rtext.c
+++ b/src/rtext.c
@@ -124,6 +124,7 @@
//----------------------------------------------------------------------------------
// Global variables
//----------------------------------------------------------------------------------
+extern bool isGpuReady;
#if defined(SUPPORT_DEFAULT_FONT)
// Default font provided by raylib
// NOTE: Default font is loaded on InitWindow() and disposed on CloseWindow() [module: core]
@@ -252,7 +253,7 @@ extern void LoadFontDefault(void)
counter++;
}
- defaultFont.texture = LoadTextureFromImage(imFont);
+ if (isGpuReady) defaultFont.texture = LoadTextureFromImage(imFont);
// Reconstruct charSet using charsWidth[], charsHeight, charsDivisor, glyphCount
//------------------------------------------------------------------------------
@@ -308,7 +309,7 @@ extern void LoadFontDefault(void)
extern void UnloadFontDefault(void)
{
for (int i = 0; i < defaultFont.glyphCount; i++) UnloadImage(defaultFont.glyphs[i].image);
- UnloadTexture(defaultFont.texture);
+ if (isGpuReady) UnloadTexture(defaultFont.texture);
RL_FREE(defaultFont.glyphs);
RL_FREE(defaultFont.recs);
}
@@ -362,11 +363,14 @@ Font LoadFont(const char *fileName)
UnloadImage(image);
}
- if (font.texture.id == 0) TRACELOG(LOG_WARNING, "FONT: [%s] Failed to load font texture -> Using default font", fileName);
- else
+ if (isGpuReady)
{
- SetTextureFilter(font.texture, TEXTURE_FILTER_POINT); // By default, we set point filter (the best performance)
- TRACELOG(LOG_INFO, "FONT: Data loaded successfully (%i pixel size | %i glyphs)", FONT_TTF_DEFAULT_SIZE, FONT_TTF_DEFAULT_NUMCHARS);
+ if (font.texture.id == 0) TRACELOG(LOG_WARNING, "FONT: [%s] Failed to load font texture -> Using default font", fileName);
+ else
+ {
+ SetTextureFilter(font.texture, TEXTURE_FILTER_POINT); // By default, we set point filter (the best performance)
+ TRACELOG(LOG_INFO, "FONT: Data loaded successfully (%i pixel size | %i glyphs)", FONT_TTF_DEFAULT_SIZE, FONT_TTF_DEFAULT_NUMCHARS);
+ }
}
return font;
@@ -487,7 +491,7 @@ Font LoadFontFromImage(Image image, Color key, int firstChar)
};
// Set font with all data parsed from image
- font.texture = LoadTextureFromImage(fontClear); // Convert processed image to OpenGL texture
+ if (isGpuReady) font.texture = LoadTextureFromImage(fontClear); // Convert processed image to OpenGL texture
font.glyphCount = index;
font.glyphPadding = 0;
@@ -556,7 +560,7 @@ Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int
font.glyphPadding = FONT_TTF_DEFAULT_CHARS_PADDING;
Image atlas = GenImageFontAtlas(font.glyphs, &font.recs, font.glyphCount, font.baseSize, font.glyphPadding, 0);
- font.texture = LoadTextureFromImage(atlas);
+ if (isGpuReady) font.texture = LoadTextureFromImage(atlas);
// Update glyphs[i].image to use alpha, required to be used on ImageDrawText()
for (int i = 0; i < font.glyphCount; i++)
@@ -580,7 +584,7 @@ Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int
// Check if a font is ready
bool IsFontReady(Font font)
{
- return ((font.texture.id > 0) && // Validate OpenGL id fot font texture atlas
+ return ((font.texture.id > 0) && // Validate OpenGL id for font texture atlas
(font.baseSize > 0) && // Validate font size
(font.glyphCount > 0) && // Validate font contains some glyph
(font.recs != NULL) && // Validate font recs defining glyphs on texture atlas
@@ -946,7 +950,7 @@ void UnloadFont(Font font)
if (font.texture.id != GetFontDefault().texture.id)
{
UnloadFontData(font.glyphs, font.glyphCount);
- UnloadTexture(font.texture);
+ if (isGpuReady) UnloadTexture(font.texture);
RL_FREE(font.recs);
TRACELOGD("FONT: Unloaded font data from RAM and VRAM");
@@ -1066,7 +1070,7 @@ bool ExportFontAsCode(Font font, const char *fileName)
byteCount += sprintf(txtData + byteCount, " Image imFont = { fontImageData_%s, %i, %i, 1, %i };\n\n", styleName, image.width, image.height, image.format);
#endif
byteCount += sprintf(txtData + byteCount, " // Load texture from image\n");
- byteCount += sprintf(txtData + byteCount, " font.texture = LoadTextureFromImage(imFont);\n");
+ byteCount += sprintf(txtData + byteCount, " if (isGpuReady) font.texture = LoadTextureFromImage(imFont);\n");
#if defined(SUPPORT_COMPRESSED_FONT_ATLAS)
byteCount += sprintf(txtData + byteCount, " UnloadImage(imFont); // Uncompressed data can be unloaded from memory\n\n");
#endif
@@ -1277,7 +1281,7 @@ Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing
{
Vector2 textSize = { 0 };
- if ((font.texture.id == 0) || (text == NULL)) return textSize; // Security check
+ if ((isGpuReady && (font.texture.id == 0)) || (text == NULL)) return textSize; // Security check
int size = TextLength(text); // Get size in bytes of text
int tempByteCounter = 0; // Used to count longer text line num chars
@@ -2257,7 +2261,7 @@ static Font LoadBMFont(const char *fileName)
RL_FREE(imFonts);
- font.texture = LoadTextureFromImage(fullFont);
+ if (isGpuReady) font.texture = LoadTextureFromImage(fullFont);
// Fill font characters info data
font.baseSize = fontSize;
@@ -2299,7 +2303,7 @@ static Font LoadBMFont(const char *fileName)
UnloadImage(fullFont);
UnloadFileText(fileText);
- if (font.texture.id == 0)
+ if (isGpuReady && (font.texture.id == 0))
{
UnloadFont(font);
font = GetFontDefault();