Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Artem Borovik 2024-08-30 20:36:39 +03:00
commit 3657948c1d
27 changed files with 919 additions and 444 deletions

View File

@ -36,9 +36,6 @@ include(CompilerFlags)
# Registers build options that are exposed to cmake # Registers build options that are exposed to cmake
include(CMakeOptions.txt) include(CMakeOptions.txt)
# Enforces a few environment and compiler configurations
include(BuildOptions)
if (UNIX AND NOT APPLE) if (UNIX AND NOT APPLE)
if (NOT GLFW_BUILD_WAYLAND AND NOT GLFW_BUILD_X11) if (NOT GLFW_BUILD_WAYLAND AND NOT GLFW_BUILD_X11)
MESSAGE(FATAL_ERROR "Cannot disable both Wayland and X11") MESSAGE(FATAL_ERROR "Cannot disable both Wayland and X11")

View File

@ -16,7 +16,6 @@ option(ENABLE_MSAN "Enable MemorySanitizer (MSan) for debugging (not recommended
# Shared library is always PIC. Static library should be PIC too if linked into a shared library # Shared library is always PIC. Static library should be PIC too if linked into a shared library
option(WITH_PIC "Compile static library as position-independent code" OFF) option(WITH_PIC "Compile static library as position-independent code" OFF)
option(BUILD_SHARED_LIBS "Build raylib as a shared library" OFF) option(BUILD_SHARED_LIBS "Build raylib as a shared library" OFF)
option(MACOS_FATLIB "Build fat library for both i386 and x86_64 on macOS" OFF)
cmake_dependent_option(USE_AUDIO "Build raylib with audio module" ON CUSTOMIZE_BUILD ON) cmake_dependent_option(USE_AUDIO "Build raylib with audio module" ON CUSTOMIZE_BUILD ON)
enum_option(USE_EXTERNAL_GLFW "OFF;IF_POSSIBLE;ON" "Link raylib against system GLFW instead of embedded one") enum_option(USE_EXTERNAL_GLFW "OFF;IF_POSSIBLE;ON" "Link raylib against system GLFW instead of embedded one")

View File

@ -1,18 +0,0 @@
if(${PLATFORM} MATCHES "Desktop" AND APPLE)
if(MACOS_FATLIB)
if (CMAKE_OSX_ARCHITECTURES)
message(FATAL_ERROR "User supplied -DCMAKE_OSX_ARCHITECTURES overrides -DMACOS_FATLIB=ON")
else()
set(CMAKE_OSX_ARCHITECTURES "x86_64;i386")
endif()
endif()
endif()
# This helps support the case where emsdk toolchain file is used
# either by setting it with -DCMAKE_TOOLCHAIN_FILE=<path_to_emsdk>/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake
# or by using "emcmake cmake -B build -S ." as described in https://emscripten.org/docs/compiling/Building-Projects.html
if(EMSCRIPTEN)
SET(PLATFORM Web CACHE STRING "Forcing PLATFORM_WEB because EMSCRIPTEN was detected")
endif()
# vim: ft=cmake

View File

@ -70,8 +70,9 @@ RAYLIB_SRC_PATH ?= ../src
# Locations of raylib.h and libraylib.a/libraylib.so # Locations of raylib.h and libraylib.a/libraylib.so
# NOTE: Those variables are only used for PLATFORM_OS: LINUX, BSD # NOTE: Those variables are only used for PLATFORM_OS: LINUX, BSD
RAYLIB_INCLUDE_PATH ?= /usr/local/include DESTDIR ?= /usr/local
RAYLIB_LIB_PATH ?= /usr/local/lib RAYLIB_INCLUDE_PATH ?= $(DESTDIR)/include
RAYLIB_LIB_PATH ?= $(DESTDIR)/lib
# Library type compilation: STATIC (.a) or SHARED (.so/.dll) # Library type compilation: STATIC (.a) or SHARED (.so/.dll)
RAYLIB_LIBTYPE ?= STATIC RAYLIB_LIBTYPE ?= STATIC
@ -582,6 +583,7 @@ MODELS = \
models/models_mesh_generation \ models/models_mesh_generation \
models/models_mesh_picking \ models/models_mesh_picking \
models/models_orthographic_projection \ models/models_orthographic_projection \
models/models_point_rendering \
models/models_rlgl_solar_system \ models/models_rlgl_solar_system \
models/models_skybox \ models/models_skybox \
models/models_waving_cubes \ models/models_waving_cubes \

View File

@ -35,8 +35,9 @@ RAYLIB_PATH ?= ..
# Locations of raylib.h and libraylib.a/libraylib.so # Locations of raylib.h and libraylib.a/libraylib.so
# NOTE: Those variables are only used for PLATFORM_OS: LINUX, BSD # NOTE: Those variables are only used for PLATFORM_OS: LINUX, BSD
RAYLIB_INCLUDE_PATH ?= /usr/local/include DESTDIR ?= /usr/local
RAYLIB_LIB_PATH ?= /usr/local/lib RAYLIB_INCLUDE_PATH ?= $(DESTDIR)/include
RAYLIB_LIB_PATH ?= $(DESTDIR)/lib
# Library type compilation: STATIC (.a) or SHARED (.so/.dll) # Library type compilation: STATIC (.a) or SHARED (.so/.dll)
RAYLIB_LIBTYPE ?= STATIC RAYLIB_LIBTYPE ?= STATIC
@ -447,6 +448,7 @@ MODELS = \
models/models_mesh_generation \ models/models_mesh_generation \
models/models_mesh_picking \ models/models_mesh_picking \
models/models_orthographic_projection \ models/models_orthographic_projection \
models/models_point_rendering \
models/models_rlgl_solar_system \ models/models_rlgl_solar_system \
models/models_skybox \ models/models_skybox \
models/models_waving_cubes \ models/models_waving_cubes \

View File

@ -147,11 +147,12 @@ Examples using raylib models functionality, including models loading/generation
| 91 | [models_loading_vox](models/models_loading_vox.c) | <img src="models/models_loading_vox.png" alt="models_loading_vox" width="80"> | ⭐️☆☆☆ | **4.0** | **4.0** | [Johann Nadalutti](https://github.com/procfxgen) | | 91 | [models_loading_vox](models/models_loading_vox.c) | <img src="models/models_loading_vox.png" alt="models_loading_vox" width="80"> | ⭐️☆☆☆ | **4.0** | **4.0** | [Johann Nadalutti](https://github.com/procfxgen) |
| 92 | [models_loading_m3d](models/models_loading_m3d.c) | <img src="models/models_loading_m3d.png" alt="models_loading_m3d" width="80"> | ⭐️☆☆☆ | **4.2** | **4.2** | [bzt](https://bztsrc.gitlab.io/model3d) | | 92 | [models_loading_m3d](models/models_loading_m3d.c) | <img src="models/models_loading_m3d.png" alt="models_loading_m3d" width="80"> | ⭐️☆☆☆ | **4.2** | **4.2** | [bzt](https://bztsrc.gitlab.io/model3d) |
| 93 | [models_orthographic_projection](models/models_orthographic_projection.c) | <img src="models/models_orthographic_projection.png" alt="models_orthographic_projection" width="80"> | ⭐️☆☆☆ | 2.0 | 3.7 | [Max Danielsson](https://github.com/autious) | | 93 | [models_orthographic_projection](models/models_orthographic_projection.c) | <img src="models/models_orthographic_projection.png" alt="models_orthographic_projection" width="80"> | ⭐️☆☆☆ | 2.0 | 3.7 | [Max Danielsson](https://github.com/autious) |
| 94 | [models_rlgl_solar_system](models/models_rlgl_solar_system.c) | <img src="models/models_rlgl_solar_system.png" alt="models_rlgl_solar_system" width="80"> | ⭐️⭐️⭐️⭐️ | 2.5 | **4.0** | [Ray](https://github.com/raysan5) | | 94 | [models_point_rendering](models/models_point_rendering.c) | <img src="models/models_point_rendering.png" alt="models_point_rendering" width="80"> | ⭐️⭐️☆☆ | 5.0 | 5.0 | [Reese Gallagher](https://github.com/satchelfrost) |
| 95 | [models_yaw_pitch_roll](models/models_yaw_pitch_roll.c) | <img src="models/models_yaw_pitch_roll.png" alt="models_yaw_pitch_roll" width="80"> | ⭐️⭐️☆☆ | 1.8 | **4.0** | [Berni](https://github.com/Berni8k) | | 95 | [models_rlgl_solar_system](models/models_rlgl_solar_system.c) | <img src="models/models_rlgl_solar_system.png" alt="models_rlgl_solar_system" width="80"> | ⭐️⭐️⭐️⭐️ | 2.5 | **4.0** | [Ray](https://github.com/raysan5) |
| 96 | [models_waving_cubes](models/models_waving_cubes.c) | <img src="models/models_waving_cubes.png" alt="models_waving_cubes" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [codecat](https://github.com/codecat) | | 96 | [models_yaw_pitch_roll](models/models_yaw_pitch_roll.c) | <img src="models/models_yaw_pitch_roll.png" alt="models_yaw_pitch_roll" width="80"> | ⭐️⭐️☆☆ | 1.8 | **4.0** | [Berni](https://github.com/Berni8k) |
| 97 | [models_heightmap](models/models_heightmap.c) | <img src="models/models_heightmap.png" alt="models_heightmap" width="80"> | ⭐️☆☆☆ | 1.8 | 3.5 | [Ray](https://github.com/raysan5) | | 97 | [models_waving_cubes](models/models_waving_cubes.c) | <img src="models/models_waving_cubes.png" alt="models_waving_cubes" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [codecat](https://github.com/codecat) |
| 98 | [models_skybox](models/models_skybox.c) | <img src="models/models_skybox.png" alt="models_skybox" width="80"> | ⭐️⭐️☆☆ | 1.8 | **4.0** | [Ray](https://github.com/raysan5) | | 98 | [models_heightmap](models/models_heightmap.c) | <img src="models/models_heightmap.png" alt="models_heightmap" width="80"> | ⭐️☆☆☆ | 1.8 | 3.5 | [Ray](https://github.com/raysan5) |
| 99 | [models_skybox](models/models_skybox.c) | <img src="models/models_skybox.png" alt="models_skybox" width="80"> | ⭐️⭐️☆☆ | 1.8 | **4.0** | [Ray](https://github.com/raysan5) |
### category: shaders ### category: shaders
@ -159,26 +160,25 @@ Examples using raylib shaders functionality, including shaders loading, paramete
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer | | ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------| |----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------|
| 99 | [shaders_basic_lighting](shaders/shaders_basic_lighting.c) | <img src="shaders/shaders_basic_lighting.png" alt="shaders_basic_lighting" width="80"> | ⭐️⭐️⭐️⭐️ | 3.0 | **4.2** | [Chris Camacho](https://github.com/codifies) | | 100 | [shaders_basic_lighting](shaders/shaders_basic_lighting.c) | <img src="shaders/shaders_basic_lighting.png" alt="shaders_basic_lighting" width="80"> | ⭐️⭐️⭐️⭐️ | 3.0 | **4.2** | [Chris Camacho](https://github.com/codifies) |
| 100 | [shaders_model_shader](shaders/shaders_model_shader.c) | <img src="shaders/shaders_model_shader.png" alt="shaders_model_shader" width="80"> | ⭐️⭐️☆☆ | 1.3 | 3.7 | [Ray](https://github.com/raysan5) | | 101 | [shaders_model_shader](shaders/shaders_model_shader.c) | <img src="shaders/shaders_model_shader.png" alt="shaders_model_shader" width="80"> | ⭐️⭐️☆☆ | 1.3 | 3.7 | [Ray](https://github.com/raysan5) |
| 101 | [shaders_shapes_textures](shaders/shaders_shapes_textures.c) | <img src="shaders/shaders_shapes_textures.png" alt="shaders_shapes_textures" width="80"> | ⭐️⭐️☆☆ | 1.7 | 3.7 | [Ray](https://github.com/raysan5) | | 102 | [shaders_shapes_textures](shaders/shaders_shapes_textures.c) | <img src="shaders/shaders_shapes_textures.png" alt="shaders_shapes_textures" width="80"> | ⭐️⭐️☆☆ | 1.7 | 3.7 | [Ray](https://github.com/raysan5) |
| 102 | [shaders_custom_uniform](shaders/shaders_custom_uniform.c) | <img src="shaders/shaders_custom_uniform.png" alt="shaders_custom_uniform" width="80"> | ⭐️⭐️☆☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) | | 103 | [shaders_custom_uniform](shaders/shaders_custom_uniform.c) | <img src="shaders/shaders_custom_uniform.png" alt="shaders_custom_uniform" width="80"> | ⭐️⭐️☆☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) |
| 103 | [shaders_postprocessing](shaders/shaders_postprocessing.c) | <img src="shaders/shaders_postprocessing.png" alt="shaders_postprocessing" width="80"> | ⭐️⭐️⭐️☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) | | 104 | [shaders_postprocessing](shaders/shaders_postprocessing.c) | <img src="shaders/shaders_postprocessing.png" alt="shaders_postprocessing" width="80"> | ⭐️⭐️⭐️☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) |
| 104 | [shaders_palette_switch](shaders/shaders_palette_switch.c) | <img src="shaders/shaders_palette_switch.png" alt="shaders_palette_switch" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Marco Lizza](https://github.com/MarcoLizza) | | 105 | [shaders_palette_switch](shaders/shaders_palette_switch.c) | <img src="shaders/shaders_palette_switch.png" alt="shaders_palette_switch" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Marco Lizza](https://github.com/MarcoLizza) |
| 105 | [shaders_raymarching](shaders/shaders_raymarching.c) | <img src="shaders/shaders_raymarching.png" alt="shaders_raymarching" width="80"> | ⭐️⭐️⭐️⭐️ | 2.0 | **4.2** | [Ray](https://github.com/raysan5) | | 106 | [shaders_raymarching](shaders/shaders_raymarching.c) | <img src="shaders/shaders_raymarching.png" alt="shaders_raymarching" width="80"> | ⭐️⭐️⭐️⭐️ | 2.0 | **4.2** | [Ray](https://github.com/raysan5) |
| 106 | [shaders_texture_drawing](shaders/shaders_texture_drawing.c) | <img src="shaders/shaders_texture_drawing.png" alt="shaders_texture_drawing" width="80"> | ⭐️⭐️☆☆ | 2.0 | 3.7 | [Michał Ciesielski](https://github.com/) | | 107 | [shaders_texture_drawing](shaders/shaders_texture_drawing.c) | <img src="shaders/shaders_texture_drawing.png" alt="shaders_texture_drawing" width="80"> | ⭐️⭐️☆☆ | 2.0 | 3.7 | [Michał Ciesielski](https://github.com/) |
| 107 | [shaders_texture_outline](shaders/shaders_texture_outline.c) | <img src="shaders/shaders_texture_outline.png" alt="shaders_texture_outline" width="80"> | ⭐️⭐️⭐️☆ | **4.0** | **4.0** | [Samuel Skiff](https://github.com/GoldenThumbs) | | 108 | [shaders_texture_outline](shaders/shaders_texture_outline.c) | <img src="shaders/shaders_texture_outline.png" alt="shaders_texture_outline" width="80"> | ⭐️⭐️⭐️☆ | **4.0** | **4.0** | [Samuel Skiff](https://github.com/GoldenThumbs) |
| 108 | [shaders_texture_waves](shaders/shaders_texture_waves.c) | <img src="shaders/shaders_texture_waves.png" alt="shaders_texture_waves" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Anata](https://github.com/anatagawa) | | 109 | [shaders_texture_waves](shaders/shaders_texture_waves.c) | <img src="shaders/shaders_texture_waves.png" alt="shaders_texture_waves" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Anata](https://github.com/anatagawa) |
| 109 | [shaders_julia_set](shaders/shaders_julia_set.c) | <img src="shaders/shaders_julia_set.png" alt="shaders_julia_set" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [eggmund](https://github.com/eggmund) | | 110 | [shaders_julia_set](shaders/shaders_julia_set.c) | <img src="shaders/shaders_julia_set.png" alt="shaders_julia_set" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [eggmund](https://github.com/eggmund) |
| 110 | [shaders_eratosthenes](shaders/shaders_eratosthenes.c) | <img src="shaders/shaders_eratosthenes.png" alt="shaders_eratosthenes" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [ProfJski](https://github.com/ProfJski) | | 111 | [shaders_eratosthenes](shaders/shaders_eratosthenes.c) | <img src="shaders/shaders_eratosthenes.png" alt="shaders_eratosthenes" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [ProfJski](https://github.com/ProfJski) |
| 111 | [shaders_fog](shaders/shaders_fog.c) | <img src="shaders/shaders_fog.png" alt="shaders_fog" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) | | 112 | [shaders_fog](shaders/shaders_fog.c) | <img src="shaders/shaders_fog.png" alt="shaders_fog" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) |
| 112 | [shaders_simple_mask](shaders/shaders_simple_mask.c) | <img src="shaders/shaders_simple_mask.png" alt="shaders_simple_mask" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) | | 113 | [shaders_simple_mask](shaders/shaders_simple_mask.c) | <img src="shaders/shaders_simple_mask.png" alt="shaders_simple_mask" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) |
| 113 | [shaders_hot_reloading](shaders/shaders_hot_reloading.c) | <img src="shaders/shaders_hot_reloading.png" alt="shaders_hot_reloading" width="80"> | ⭐️⭐️⭐️☆ | 3.0 | 3.5 | [Ray](https://github.com/raysan5) | | 114 | [shaders_hot_reloading](shaders/shaders_hot_reloading.c) | <img src="shaders/shaders_hot_reloading.png" alt="shaders_hot_reloading" width="80"> | ⭐️⭐️⭐️☆ | 3.0 | 3.5 | [Ray](https://github.com/raysan5) |
| 114 | [shaders_mesh_instancing](shaders/shaders_mesh_instancing.c) | <img src="shaders/shaders_mesh_instancing.png" alt="shaders_mesh_instancing" width="80"> | ⭐️⭐️⭐️⭐️ | 3.7 | **4.2** | [seanpringle](https://github.com/seanpringle) | | 115 | [shaders_mesh_instancing](shaders/shaders_mesh_instancing.c) | <img src="shaders/shaders_mesh_instancing.png" alt="shaders_mesh_instancing" width="80"> | ⭐️⭐️⭐️⭐️ | 3.7 | **4.2** | [seanpringle](https://github.com/seanpringle) |
| 115 | [shaders_multi_sample2d](shaders/shaders_multi_sample2d.c) | <img src="shaders/shaders_multi_sample2d.png" alt="shaders_multi_sample2d" width="80"> | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) | | 116 | [shaders_multi_sample2d](shaders/shaders_multi_sample2d.c) | <img src="shaders/shaders_multi_sample2d.png" alt="shaders_multi_sample2d" width="80"> | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) |
| 116 | [shaders_spotlight](shaders/shaders_spotlight.c) | <img src="shaders/shaders_spotlight.png" alt="shaders_spotlight" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) | | 117 | [shaders_spotlight](shaders/shaders_spotlight.c) | <img src="shaders/shaders_spotlight.png" alt="shaders_spotlight" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) |
| 117 | [shaders_deferred_render](shaders/shaders_deferred_render.c) | <img src="shaders/shaders_deferred_render.png" alt="shaders_deferred_render" width="80"> | ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) | | 118 | [shaders_deferred_render](shaders/shaders_deferred_render.c) | <img src="shaders/shaders_deferred_render.png" alt="shaders_deferred_render" width="80"> | ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) |
| 118 | [shaders_vertex_displacement](shaders/shaders_vertex_displacement.c) | <img src="shaders/shaders_vertex_displacement.png" alt="shaders_deferred_render" width="80"> | ⭐️☆☆☆ | 1.5 | 1.5 | [Alex ZH](https://github.com/ZzzhHe) |
### category: audio ### category: audio

View File

@ -88,7 +88,7 @@ int main(void)
// Update // Update
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
float deltaTime = 0.015f;//GetFrameTime(); float deltaTime = 0.015f;//GetFrameTime();
// Dropped files logic // Dropped files logic
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
if (IsFileDropped()) if (IsFileDropped())
@ -157,11 +157,6 @@ int main(void)
} }
else player.canJump = true; else player.canJump = true;
camera.zoom += ((float)GetMouseWheelMove()*0.05f);
if (camera.zoom > 3.0f) camera.zoom = 3.0f;
else if (camera.zoom < 0.25f) camera.zoom = 0.25f;
if (IsKeyPressed(KEY_R)) if (IsKeyPressed(KEY_R))
{ {
// Reset game state // Reset game state
@ -176,12 +171,44 @@ int main(void)
} }
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Events playing
// NOTE: Logic must be before Camera update because it depends on mouse-wheel value,
// that can be set by the played event... but some other inputs could be affected
//----------------------------------------------------------------------------------
if (eventPlaying)
{
// NOTE: Multiple events could be executed in a single frame
while (playFrameCounter == aelist.events[currentPlayFrame].frame)
{
PlayAutomationEvent(aelist.events[currentPlayFrame]);
currentPlayFrame++;
if (currentPlayFrame == aelist.count)
{
eventPlaying = false;
currentPlayFrame = 0;
playFrameCounter = 0;
TraceLog(LOG_INFO, "FINISH PLAYING!");
break;
}
}
playFrameCounter++;
}
//----------------------------------------------------------------------------------
// Update camera // Update camera
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
camera.target = player.position; camera.target = player.position;
camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f }; camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
float minX = 1000, minY = 1000, maxX = -1000, maxY = -1000; float minX = 1000, minY = 1000, maxX = -1000, maxY = -1000;
// WARNING: On event replay, mouse-wheel internal value is set
camera.zoom += ((float)GetMouseWheelMove()*0.05f);
if (camera.zoom > 3.0f) camera.zoom = 3.0f;
else if (camera.zoom < 0.25f) camera.zoom = 0.25f;
for (int i = 0; i < MAX_ENVIRONMENT_ELEMENTS; i++) for (int i = 0; i < MAX_ENVIRONMENT_ELEMENTS; i++)
{ {
EnvElement *element = &envElements[i]; EnvElement *element = &envElements[i];
@ -200,8 +227,8 @@ int main(void)
if (min.y > 0) camera.offset.y = screenHeight/2 - min.y; if (min.y > 0) camera.offset.y = screenHeight/2 - min.y;
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Toggle events recording // Events management
if (IsKeyPressed(KEY_S)) if (IsKeyPressed(KEY_S)) // Toggle events recording
{ {
if (!eventPlaying) if (!eventPlaying)
{ {
@ -222,7 +249,7 @@ int main(void)
} }
} }
} }
else if (IsKeyPressed(KEY_A)) else if (IsKeyPressed(KEY_A)) // Toggle events playing (WARNING: Starts next frame)
{ {
if (!eventRecording && (aelist.count > 0)) if (!eventRecording && (aelist.count > 0))
{ {
@ -241,32 +268,7 @@ int main(void)
camera.zoom = 1.0f; camera.zoom = 1.0f;
} }
} }
if (eventPlaying)
{
// NOTE: Multiple events could be executed in a single frame
while (playFrameCounter == aelist.events[currentPlayFrame].frame)
{
TraceLog(LOG_INFO, "PLAYING: PlayFrameCount: %i | currentPlayFrame: %i | Event Frame: %i, param: %i",
playFrameCounter, currentPlayFrame, aelist.events[currentPlayFrame].frame, aelist.events[currentPlayFrame].params[0]);
PlayAutomationEvent(aelist.events[currentPlayFrame]);
currentPlayFrame++;
if (currentPlayFrame == aelist.count)
{
eventPlaying = false;
currentPlayFrame = 0;
playFrameCounter = 0;
TraceLog(LOG_INFO, "FINISH PLAYING!");
break;
}
}
playFrameCounter++;
}
if (eventRecording || eventPlaying) frameCounter++; if (eventRecording || eventPlaying) frameCounter++;
else frameCounter = 0; else frameCounter = 0;
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------

View File

@ -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 <stdlib.h> // Required for: rand()
#include <math.h> // 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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

View File

@ -3215,12 +3215,12 @@
}, },
{ {
"name": "ToggleFullscreen", "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" "returnType": "void"
}, },
{ {
"name": "ToggleBorderlessWindowed", "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" "returnType": "void"
}, },
{ {
@ -5485,11 +5485,11 @@
}, },
{ {
"type": "Color", "type": "Color",
"name": "color1" "name": "inner"
}, },
{ {
"type": "Color", "type": "Color",
"name": "color2" "name": "outer"
} }
] ]
}, },
@ -5785,11 +5785,11 @@
}, },
{ {
"type": "Color", "type": "Color",
"name": "color1" "name": "top"
}, },
{ {
"type": "Color", "type": "Color",
"name": "color2" "name": "bottom"
} }
] ]
}, },
@ -5816,11 +5816,11 @@
}, },
{ {
"type": "Color", "type": "Color",
"name": "color1" "name": "left"
}, },
{ {
"type": "Color", "type": "Color",
"name": "color2" "name": "right"
} }
] ]
}, },
@ -5835,19 +5835,19 @@
}, },
{ {
"type": "Color", "type": "Color",
"name": "col1" "name": "topLeft"
}, },
{ {
"type": "Color", "type": "Color",
"name": "col2" "name": "bottomLeft"
}, },
{ {
"type": "Color", "type": "Color",
"name": "col3" "name": "topRight"
}, },
{ {
"type": "Color", "type": "Color",
"name": "col4" "name": "bottomRight"
} }
] ]
}, },
@ -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", "name": "DrawBoundingBox",
"description": "Draw bounding box (wires)", "description": "Draw bounding box (wires)",

View File

@ -3158,12 +3158,12 @@ return {
}, },
{ {
name = "ToggleFullscreen", 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" returnType = "void"
}, },
{ {
name = "ToggleBorderlessWindowed", 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" returnType = "void"
}, },
{ {
@ -4697,8 +4697,8 @@ return {
{type = "int", name = "centerX"}, {type = "int", name = "centerX"},
{type = "int", name = "centerY"}, {type = "int", name = "centerY"},
{type = "float", name = "radius"}, {type = "float", name = "radius"},
{type = "Color", name = "color1"}, {type = "Color", name = "inner"},
{type = "Color", name = "color2"} {type = "Color", name = "outer"}
} }
}, },
{ {
@ -4835,8 +4835,8 @@ return {
{type = "int", name = "posY"}, {type = "int", name = "posY"},
{type = "int", name = "width"}, {type = "int", name = "width"},
{type = "int", name = "height"}, {type = "int", name = "height"},
{type = "Color", name = "color1"}, {type = "Color", name = "top"},
{type = "Color", name = "color2"} {type = "Color", name = "bottom"}
} }
}, },
{ {
@ -4848,8 +4848,8 @@ return {
{type = "int", name = "posY"}, {type = "int", name = "posY"},
{type = "int", name = "width"}, {type = "int", name = "width"},
{type = "int", name = "height"}, {type = "int", name = "height"},
{type = "Color", name = "color1"}, {type = "Color", name = "left"},
{type = "Color", name = "color2"} {type = "Color", name = "right"}
} }
}, },
{ {
@ -4858,10 +4858,10 @@ return {
returnType = "void", returnType = "void",
params = { params = {
{type = "Rectangle", name = "rec"}, {type = "Rectangle", name = "rec"},
{type = "Color", name = "col1"}, {type = "Color", name = "topLeft"},
{type = "Color", name = "col2"}, {type = "Color", name = "bottomLeft"},
{type = "Color", name = "col3"}, {type = "Color", name = "topRight"},
{type = "Color", name = "col4"} {type = "Color", name = "bottomRight"}
} }
}, },
{ {
@ -7213,6 +7213,30 @@ return {
{type = "Color", name = "tint"} {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", name = "DrawBoundingBox",
description = "Draw bounding box (wires)", description = "Draw bounding box (wires)",

View File

@ -984,7 +984,7 @@ Callback 006: AudioCallback() (2 input parameters)
Param[1]: bufferData (type: void *) Param[1]: bufferData (type: void *)
Param[2]: frames (type: unsigned int) Param[2]: frames (type: unsigned int)
Functions found: 573 Functions found: 575
Function 001: InitWindow() (3 input parameters) Function 001: InitWindow() (3 input parameters)
Name: InitWindow Name: InitWindow
@ -1056,12 +1056,12 @@ Function 013: ClearWindowState() (1 input parameters)
Function 014: ToggleFullscreen() (0 input parameters) Function 014: ToggleFullscreen() (0 input parameters)
Name: ToggleFullscreen Name: ToggleFullscreen
Return type: void 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 No input parameters
Function 015: ToggleBorderlessWindowed() (0 input parameters) Function 015: ToggleBorderlessWindowed() (0 input parameters)
Name: ToggleBorderlessWindowed Name: ToggleBorderlessWindowed
Return type: void 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 No input parameters
Function 016: MaximizeWindow() (0 input parameters) Function 016: MaximizeWindow() (0 input parameters)
Name: MaximizeWindow Name: MaximizeWindow
@ -2176,8 +2176,8 @@ Function 217: DrawCircleGradient() (5 input parameters)
Param[1]: centerX (type: int) Param[1]: centerX (type: int)
Param[2]: centerY (type: int) Param[2]: centerY (type: int)
Param[3]: radius (type: float) Param[3]: radius (type: float)
Param[4]: color1 (type: Color) Param[4]: inner (type: Color)
Param[5]: color2 (type: Color) Param[5]: outer (type: Color)
Function 218: DrawCircleV() (3 input parameters) Function 218: DrawCircleV() (3 input parameters)
Name: DrawCircleV Name: DrawCircleV
Return type: void Return type: void
@ -2278,8 +2278,8 @@ Function 229: DrawRectangleGradientV() (6 input parameters)
Param[2]: posY (type: int) Param[2]: posY (type: int)
Param[3]: width (type: int) Param[3]: width (type: int)
Param[4]: height (type: int) Param[4]: height (type: int)
Param[5]: color1 (type: Color) Param[5]: top (type: Color)
Param[6]: color2 (type: Color) Param[6]: bottom (type: Color)
Function 230: DrawRectangleGradientH() (6 input parameters) Function 230: DrawRectangleGradientH() (6 input parameters)
Name: DrawRectangleGradientH Name: DrawRectangleGradientH
Return type: void Return type: void
@ -2288,17 +2288,17 @@ Function 230: DrawRectangleGradientH() (6 input parameters)
Param[2]: posY (type: int) Param[2]: posY (type: int)
Param[3]: width (type: int) Param[3]: width (type: int)
Param[4]: height (type: int) Param[4]: height (type: int)
Param[5]: color1 (type: Color) Param[5]: left (type: Color)
Param[6]: color2 (type: Color) Param[6]: right (type: Color)
Function 231: DrawRectangleGradientEx() (5 input parameters) Function 231: DrawRectangleGradientEx() (5 input parameters)
Name: DrawRectangleGradientEx Name: DrawRectangleGradientEx
Return type: void Return type: void
Description: Draw a gradient-filled rectangle with custom vertex colors Description: Draw a gradient-filled rectangle with custom vertex colors
Param[1]: rec (type: Rectangle) Param[1]: rec (type: Rectangle)
Param[2]: col1 (type: Color) Param[2]: topLeft (type: Color)
Param[3]: col2 (type: Color) Param[3]: bottomLeft (type: Color)
Param[4]: col3 (type: Color) Param[4]: topRight (type: Color)
Param[5]: col4 (type: Color) Param[5]: bottomRight (type: Color)
Function 232: DrawRectangleLines() (5 input parameters) Function 232: DrawRectangleLines() (5 input parameters)
Name: DrawRectangleLines Name: DrawRectangleLines
Return type: void Return type: void
@ -3955,13 +3955,31 @@ Function 464: DrawModelWiresEx() (6 input parameters)
Param[4]: rotationAngle (type: float) Param[4]: rotationAngle (type: float)
Param[5]: scale (type: Vector3) Param[5]: scale (type: Vector3)
Param[6]: tint (type: Color) 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 Name: DrawBoundingBox
Return type: void Return type: void
Description: Draw bounding box (wires) Description: Draw bounding box (wires)
Param[1]: box (type: BoundingBox) Param[1]: box (type: BoundingBox)
Param[2]: color (type: Color) Param[2]: color (type: Color)
Function 466: DrawBillboard() (5 input parameters) Function 468: DrawBillboard() (5 input parameters)
Name: DrawBillboard Name: DrawBillboard
Return type: void Return type: void
Description: Draw a billboard texture Description: Draw a billboard texture
@ -3970,7 +3988,7 @@ Function 466: DrawBillboard() (5 input parameters)
Param[3]: position (type: Vector3) Param[3]: position (type: Vector3)
Param[4]: scale (type: float) Param[4]: scale (type: float)
Param[5]: tint (type: Color) Param[5]: tint (type: Color)
Function 467: DrawBillboardRec() (6 input parameters) Function 469: DrawBillboardRec() (6 input parameters)
Name: DrawBillboardRec Name: DrawBillboardRec
Return type: void Return type: void
Description: Draw a billboard texture defined by source Description: Draw a billboard texture defined by source
@ -3980,7 +3998,7 @@ Function 467: DrawBillboardRec() (6 input parameters)
Param[4]: position (type: Vector3) Param[4]: position (type: Vector3)
Param[5]: size (type: Vector2) Param[5]: size (type: Vector2)
Param[6]: tint (type: Color) Param[6]: tint (type: Color)
Function 468: DrawBillboardPro() (9 input parameters) Function 470: DrawBillboardPro() (9 input parameters)
Name: DrawBillboardPro Name: DrawBillboardPro
Return type: void Return type: void
Description: Draw a billboard texture defined by source and rotation 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[7]: origin (type: Vector2)
Param[8]: rotation (type: float) Param[8]: rotation (type: float)
Param[9]: tint (type: Color) Param[9]: tint (type: Color)
Function 469: UploadMesh() (2 input parameters) Function 471: UploadMesh() (2 input parameters)
Name: UploadMesh Name: UploadMesh
Return type: void Return type: void
Description: Upload mesh vertex data in GPU and provide VAO/VBO ids Description: Upload mesh vertex data in GPU and provide VAO/VBO ids
Param[1]: mesh (type: Mesh *) Param[1]: mesh (type: Mesh *)
Param[2]: dynamic (type: bool) Param[2]: dynamic (type: bool)
Function 470: UpdateMeshBuffer() (5 input parameters) Function 472: UpdateMeshBuffer() (5 input parameters)
Name: UpdateMeshBuffer Name: UpdateMeshBuffer
Return type: void Return type: void
Description: Update mesh vertex data in GPU for a specific buffer index 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[3]: data (type: const void *)
Param[4]: dataSize (type: int) Param[4]: dataSize (type: int)
Param[5]: offset (type: int) Param[5]: offset (type: int)
Function 471: UnloadMesh() (1 input parameters) Function 473: UnloadMesh() (1 input parameters)
Name: UnloadMesh Name: UnloadMesh
Return type: void Return type: void
Description: Unload mesh data from CPU and GPU Description: Unload mesh data from CPU and GPU
Param[1]: mesh (type: Mesh) Param[1]: mesh (type: Mesh)
Function 472: DrawMesh() (3 input parameters) Function 474: DrawMesh() (3 input parameters)
Name: DrawMesh Name: DrawMesh
Return type: void Return type: void
Description: Draw a 3d mesh with material and transform Description: Draw a 3d mesh with material and transform
Param[1]: mesh (type: Mesh) Param[1]: mesh (type: Mesh)
Param[2]: material (type: Material) Param[2]: material (type: Material)
Param[3]: transform (type: Matrix) Param[3]: transform (type: Matrix)
Function 473: DrawMeshInstanced() (4 input parameters) Function 475: DrawMeshInstanced() (4 input parameters)
Name: DrawMeshInstanced Name: DrawMeshInstanced
Return type: void Return type: void
Description: Draw multiple mesh instances with material and different transforms 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[2]: material (type: Material)
Param[3]: transforms (type: const Matrix *) Param[3]: transforms (type: const Matrix *)
Param[4]: instances (type: int) Param[4]: instances (type: int)
Function 474: GetMeshBoundingBox() (1 input parameters) Function 476: GetMeshBoundingBox() (1 input parameters)
Name: GetMeshBoundingBox Name: GetMeshBoundingBox
Return type: BoundingBox Return type: BoundingBox
Description: Compute mesh bounding box limits Description: Compute mesh bounding box limits
Param[1]: mesh (type: Mesh) Param[1]: mesh (type: Mesh)
Function 475: GenMeshTangents() (1 input parameters) Function 477: GenMeshTangents() (1 input parameters)
Name: GenMeshTangents Name: GenMeshTangents
Return type: void Return type: void
Description: Compute mesh tangents Description: Compute mesh tangents
Param[1]: mesh (type: Mesh *) Param[1]: mesh (type: Mesh *)
Function 476: ExportMesh() (2 input parameters) Function 478: ExportMesh() (2 input parameters)
Name: ExportMesh Name: ExportMesh
Return type: bool Return type: bool
Description: Export mesh data to file, returns true on success Description: Export mesh data to file, returns true on success
Param[1]: mesh (type: Mesh) Param[1]: mesh (type: Mesh)
Param[2]: fileName (type: const char *) Param[2]: fileName (type: const char *)
Function 477: ExportMeshAsCode() (2 input parameters) Function 479: ExportMeshAsCode() (2 input parameters)
Name: ExportMeshAsCode Name: ExportMeshAsCode
Return type: bool Return type: bool
Description: Export mesh as code file (.h) defining multiple arrays of vertex attributes Description: Export mesh as code file (.h) defining multiple arrays of vertex attributes
Param[1]: mesh (type: Mesh) Param[1]: mesh (type: Mesh)
Param[2]: fileName (type: const char *) Param[2]: fileName (type: const char *)
Function 478: GenMeshPoly() (2 input parameters) Function 480: GenMeshPoly() (2 input parameters)
Name: GenMeshPoly Name: GenMeshPoly
Return type: Mesh Return type: Mesh
Description: Generate polygonal mesh Description: Generate polygonal mesh
Param[1]: sides (type: int) Param[1]: sides (type: int)
Param[2]: radius (type: float) Param[2]: radius (type: float)
Function 479: GenMeshPlane() (4 input parameters) Function 481: GenMeshPlane() (4 input parameters)
Name: GenMeshPlane Name: GenMeshPlane
Return type: Mesh Return type: Mesh
Description: Generate plane mesh (with subdivisions) Description: Generate plane mesh (with subdivisions)
@ -4064,42 +4082,42 @@ Function 479: GenMeshPlane() (4 input parameters)
Param[2]: length (type: float) Param[2]: length (type: float)
Param[3]: resX (type: int) Param[3]: resX (type: int)
Param[4]: resZ (type: int) Param[4]: resZ (type: int)
Function 480: GenMeshCube() (3 input parameters) Function 482: GenMeshCube() (3 input parameters)
Name: GenMeshCube Name: GenMeshCube
Return type: Mesh Return type: Mesh
Description: Generate cuboid mesh Description: Generate cuboid mesh
Param[1]: width (type: float) Param[1]: width (type: float)
Param[2]: height (type: float) Param[2]: height (type: float)
Param[3]: length (type: float) Param[3]: length (type: float)
Function 481: GenMeshSphere() (3 input parameters) Function 483: GenMeshSphere() (3 input parameters)
Name: GenMeshSphere Name: GenMeshSphere
Return type: Mesh Return type: Mesh
Description: Generate sphere mesh (standard sphere) Description: Generate sphere mesh (standard sphere)
Param[1]: radius (type: float) Param[1]: radius (type: float)
Param[2]: rings (type: int) Param[2]: rings (type: int)
Param[3]: slices (type: int) Param[3]: slices (type: int)
Function 482: GenMeshHemiSphere() (3 input parameters) Function 484: GenMeshHemiSphere() (3 input parameters)
Name: GenMeshHemiSphere Name: GenMeshHemiSphere
Return type: Mesh Return type: Mesh
Description: Generate half-sphere mesh (no bottom cap) Description: Generate half-sphere mesh (no bottom cap)
Param[1]: radius (type: float) Param[1]: radius (type: float)
Param[2]: rings (type: int) Param[2]: rings (type: int)
Param[3]: slices (type: int) Param[3]: slices (type: int)
Function 483: GenMeshCylinder() (3 input parameters) Function 485: GenMeshCylinder() (3 input parameters)
Name: GenMeshCylinder Name: GenMeshCylinder
Return type: Mesh Return type: Mesh
Description: Generate cylinder mesh Description: Generate cylinder mesh
Param[1]: radius (type: float) Param[1]: radius (type: float)
Param[2]: height (type: float) Param[2]: height (type: float)
Param[3]: slices (type: int) Param[3]: slices (type: int)
Function 484: GenMeshCone() (3 input parameters) Function 486: GenMeshCone() (3 input parameters)
Name: GenMeshCone Name: GenMeshCone
Return type: Mesh Return type: Mesh
Description: Generate cone/pyramid mesh Description: Generate cone/pyramid mesh
Param[1]: radius (type: float) Param[1]: radius (type: float)
Param[2]: height (type: float) Param[2]: height (type: float)
Param[3]: slices (type: int) Param[3]: slices (type: int)
Function 485: GenMeshTorus() (4 input parameters) Function 487: GenMeshTorus() (4 input parameters)
Name: GenMeshTorus Name: GenMeshTorus
Return type: Mesh Return type: Mesh
Description: Generate torus mesh Description: Generate torus mesh
@ -4107,7 +4125,7 @@ Function 485: GenMeshTorus() (4 input parameters)
Param[2]: size (type: float) Param[2]: size (type: float)
Param[3]: radSeg (type: int) Param[3]: radSeg (type: int)
Param[4]: sides (type: int) Param[4]: sides (type: int)
Function 486: GenMeshKnot() (4 input parameters) Function 488: GenMeshKnot() (4 input parameters)
Name: GenMeshKnot Name: GenMeshKnot
Return type: Mesh Return type: Mesh
Description: Generate trefoil knot mesh Description: Generate trefoil knot mesh
@ -4115,84 +4133,84 @@ Function 486: GenMeshKnot() (4 input parameters)
Param[2]: size (type: float) Param[2]: size (type: float)
Param[3]: radSeg (type: int) Param[3]: radSeg (type: int)
Param[4]: sides (type: int) Param[4]: sides (type: int)
Function 487: GenMeshHeightmap() (2 input parameters) Function 489: GenMeshHeightmap() (2 input parameters)
Name: GenMeshHeightmap Name: GenMeshHeightmap
Return type: Mesh Return type: Mesh
Description: Generate heightmap mesh from image data Description: Generate heightmap mesh from image data
Param[1]: heightmap (type: Image) Param[1]: heightmap (type: Image)
Param[2]: size (type: Vector3) Param[2]: size (type: Vector3)
Function 488: GenMeshCubicmap() (2 input parameters) Function 490: GenMeshCubicmap() (2 input parameters)
Name: GenMeshCubicmap Name: GenMeshCubicmap
Return type: Mesh Return type: Mesh
Description: Generate cubes-based map mesh from image data Description: Generate cubes-based map mesh from image data
Param[1]: cubicmap (type: Image) Param[1]: cubicmap (type: Image)
Param[2]: cubeSize (type: Vector3) Param[2]: cubeSize (type: Vector3)
Function 489: LoadMaterials() (2 input parameters) Function 491: LoadMaterials() (2 input parameters)
Name: LoadMaterials Name: LoadMaterials
Return type: Material * Return type: Material *
Description: Load materials from model file Description: Load materials from model file
Param[1]: fileName (type: const char *) Param[1]: fileName (type: const char *)
Param[2]: materialCount (type: int *) Param[2]: materialCount (type: int *)
Function 490: LoadMaterialDefault() (0 input parameters) Function 492: LoadMaterialDefault() (0 input parameters)
Name: LoadMaterialDefault Name: LoadMaterialDefault
Return type: Material Return type: Material
Description: Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps) Description: Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps)
No input parameters No input parameters
Function 491: IsMaterialReady() (1 input parameters) Function 493: IsMaterialReady() (1 input parameters)
Name: IsMaterialReady Name: IsMaterialReady
Return type: bool Return type: bool
Description: Check if a material is ready Description: Check if a material is ready
Param[1]: material (type: Material) Param[1]: material (type: Material)
Function 492: UnloadMaterial() (1 input parameters) Function 494: UnloadMaterial() (1 input parameters)
Name: UnloadMaterial Name: UnloadMaterial
Return type: void Return type: void
Description: Unload material from GPU memory (VRAM) Description: Unload material from GPU memory (VRAM)
Param[1]: material (type: Material) Param[1]: material (type: Material)
Function 493: SetMaterialTexture() (3 input parameters) Function 495: SetMaterialTexture() (3 input parameters)
Name: SetMaterialTexture Name: SetMaterialTexture
Return type: void Return type: void
Description: Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...) Description: Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...)
Param[1]: material (type: Material *) Param[1]: material (type: Material *)
Param[2]: mapType (type: int) Param[2]: mapType (type: int)
Param[3]: texture (type: Texture2D) Param[3]: texture (type: Texture2D)
Function 494: SetModelMeshMaterial() (3 input parameters) Function 496: SetModelMeshMaterial() (3 input parameters)
Name: SetModelMeshMaterial Name: SetModelMeshMaterial
Return type: void Return type: void
Description: Set material for a mesh Description: Set material for a mesh
Param[1]: model (type: Model *) Param[1]: model (type: Model *)
Param[2]: meshId (type: int) Param[2]: meshId (type: int)
Param[3]: materialId (type: int) Param[3]: materialId (type: int)
Function 495: LoadModelAnimations() (2 input parameters) Function 497: LoadModelAnimations() (2 input parameters)
Name: LoadModelAnimations Name: LoadModelAnimations
Return type: ModelAnimation * Return type: ModelAnimation *
Description: Load model animations from file Description: Load model animations from file
Param[1]: fileName (type: const char *) Param[1]: fileName (type: const char *)
Param[2]: animCount (type: int *) Param[2]: animCount (type: int *)
Function 496: UpdateModelAnimation() (3 input parameters) Function 498: UpdateModelAnimation() (3 input parameters)
Name: UpdateModelAnimation Name: UpdateModelAnimation
Return type: void Return type: void
Description: Update model animation pose Description: Update model animation pose
Param[1]: model (type: Model) Param[1]: model (type: Model)
Param[2]: anim (type: ModelAnimation) Param[2]: anim (type: ModelAnimation)
Param[3]: frame (type: int) Param[3]: frame (type: int)
Function 497: UnloadModelAnimation() (1 input parameters) Function 499: UnloadModelAnimation() (1 input parameters)
Name: UnloadModelAnimation Name: UnloadModelAnimation
Return type: void Return type: void
Description: Unload animation data Description: Unload animation data
Param[1]: anim (type: ModelAnimation) Param[1]: anim (type: ModelAnimation)
Function 498: UnloadModelAnimations() (2 input parameters) Function 500: UnloadModelAnimations() (2 input parameters)
Name: UnloadModelAnimations Name: UnloadModelAnimations
Return type: void Return type: void
Description: Unload animation array data Description: Unload animation array data
Param[1]: animations (type: ModelAnimation *) Param[1]: animations (type: ModelAnimation *)
Param[2]: animCount (type: int) Param[2]: animCount (type: int)
Function 499: IsModelAnimationValid() (2 input parameters) Function 501: IsModelAnimationValid() (2 input parameters)
Name: IsModelAnimationValid Name: IsModelAnimationValid
Return type: bool Return type: bool
Description: Check model animation skeleton match Description: Check model animation skeleton match
Param[1]: model (type: Model) Param[1]: model (type: Model)
Param[2]: anim (type: ModelAnimation) Param[2]: anim (type: ModelAnimation)
Function 500: CheckCollisionSpheres() (4 input parameters) Function 502: CheckCollisionSpheres() (4 input parameters)
Name: CheckCollisionSpheres Name: CheckCollisionSpheres
Return type: bool Return type: bool
Description: Check collision between two spheres Description: Check collision between two spheres
@ -4200,40 +4218,40 @@ Function 500: CheckCollisionSpheres() (4 input parameters)
Param[2]: radius1 (type: float) Param[2]: radius1 (type: float)
Param[3]: center2 (type: Vector3) Param[3]: center2 (type: Vector3)
Param[4]: radius2 (type: float) Param[4]: radius2 (type: float)
Function 501: CheckCollisionBoxes() (2 input parameters) Function 503: CheckCollisionBoxes() (2 input parameters)
Name: CheckCollisionBoxes Name: CheckCollisionBoxes
Return type: bool Return type: bool
Description: Check collision between two bounding boxes Description: Check collision between two bounding boxes
Param[1]: box1 (type: BoundingBox) Param[1]: box1 (type: BoundingBox)
Param[2]: box2 (type: BoundingBox) Param[2]: box2 (type: BoundingBox)
Function 502: CheckCollisionBoxSphere() (3 input parameters) Function 504: CheckCollisionBoxSphere() (3 input parameters)
Name: CheckCollisionBoxSphere Name: CheckCollisionBoxSphere
Return type: bool Return type: bool
Description: Check collision between box and sphere Description: Check collision between box and sphere
Param[1]: box (type: BoundingBox) Param[1]: box (type: BoundingBox)
Param[2]: center (type: Vector3) Param[2]: center (type: Vector3)
Param[3]: radius (type: float) Param[3]: radius (type: float)
Function 503: GetRayCollisionSphere() (3 input parameters) Function 505: GetRayCollisionSphere() (3 input parameters)
Name: GetRayCollisionSphere Name: GetRayCollisionSphere
Return type: RayCollision Return type: RayCollision
Description: Get collision info between ray and sphere Description: Get collision info between ray and sphere
Param[1]: ray (type: Ray) Param[1]: ray (type: Ray)
Param[2]: center (type: Vector3) Param[2]: center (type: Vector3)
Param[3]: radius (type: float) Param[3]: radius (type: float)
Function 504: GetRayCollisionBox() (2 input parameters) Function 506: GetRayCollisionBox() (2 input parameters)
Name: GetRayCollisionBox Name: GetRayCollisionBox
Return type: RayCollision Return type: RayCollision
Description: Get collision info between ray and box Description: Get collision info between ray and box
Param[1]: ray (type: Ray) Param[1]: ray (type: Ray)
Param[2]: box (type: BoundingBox) Param[2]: box (type: BoundingBox)
Function 505: GetRayCollisionMesh() (3 input parameters) Function 507: GetRayCollisionMesh() (3 input parameters)
Name: GetRayCollisionMesh Name: GetRayCollisionMesh
Return type: RayCollision Return type: RayCollision
Description: Get collision info between ray and mesh Description: Get collision info between ray and mesh
Param[1]: ray (type: Ray) Param[1]: ray (type: Ray)
Param[2]: mesh (type: Mesh) Param[2]: mesh (type: Mesh)
Param[3]: transform (type: Matrix) Param[3]: transform (type: Matrix)
Function 506: GetRayCollisionTriangle() (4 input parameters) Function 508: GetRayCollisionTriangle() (4 input parameters)
Name: GetRayCollisionTriangle Name: GetRayCollisionTriangle
Return type: RayCollision Return type: RayCollision
Description: Get collision info between ray and triangle Description: Get collision info between ray and triangle
@ -4241,7 +4259,7 @@ Function 506: GetRayCollisionTriangle() (4 input parameters)
Param[2]: p1 (type: Vector3) Param[2]: p1 (type: Vector3)
Param[3]: p2 (type: Vector3) Param[3]: p2 (type: Vector3)
Param[4]: p3 (type: Vector3) Param[4]: p3 (type: Vector3)
Function 507: GetRayCollisionQuad() (5 input parameters) Function 509: GetRayCollisionQuad() (5 input parameters)
Name: GetRayCollisionQuad Name: GetRayCollisionQuad
Return type: RayCollision Return type: RayCollision
Description: Get collision info between ray and quad Description: Get collision info between ray and quad
@ -4250,158 +4268,158 @@ Function 507: GetRayCollisionQuad() (5 input parameters)
Param[3]: p2 (type: Vector3) Param[3]: p2 (type: Vector3)
Param[4]: p3 (type: Vector3) Param[4]: p3 (type: Vector3)
Param[5]: p4 (type: Vector3) Param[5]: p4 (type: Vector3)
Function 508: InitAudioDevice() (0 input parameters) Function 510: InitAudioDevice() (0 input parameters)
Name: InitAudioDevice Name: InitAudioDevice
Return type: void Return type: void
Description: Initialize audio device and context Description: Initialize audio device and context
No input parameters No input parameters
Function 509: CloseAudioDevice() (0 input parameters) Function 511: CloseAudioDevice() (0 input parameters)
Name: CloseAudioDevice Name: CloseAudioDevice
Return type: void Return type: void
Description: Close the audio device and context Description: Close the audio device and context
No input parameters No input parameters
Function 510: IsAudioDeviceReady() (0 input parameters) Function 512: IsAudioDeviceReady() (0 input parameters)
Name: IsAudioDeviceReady Name: IsAudioDeviceReady
Return type: bool Return type: bool
Description: Check if audio device has been initialized successfully Description: Check if audio device has been initialized successfully
No input parameters No input parameters
Function 511: SetMasterVolume() (1 input parameters) Function 513: SetMasterVolume() (1 input parameters)
Name: SetMasterVolume Name: SetMasterVolume
Return type: void Return type: void
Description: Set master volume (listener) Description: Set master volume (listener)
Param[1]: volume (type: float) Param[1]: volume (type: float)
Function 512: GetMasterVolume() (0 input parameters) Function 514: GetMasterVolume() (0 input parameters)
Name: GetMasterVolume Name: GetMasterVolume
Return type: float Return type: float
Description: Get master volume (listener) Description: Get master volume (listener)
No input parameters No input parameters
Function 513: LoadWave() (1 input parameters) Function 515: LoadWave() (1 input parameters)
Name: LoadWave Name: LoadWave
Return type: Wave Return type: Wave
Description: Load wave data from file Description: Load wave data from file
Param[1]: fileName (type: const char *) Param[1]: fileName (type: const char *)
Function 514: LoadWaveFromMemory() (3 input parameters) Function 516: LoadWaveFromMemory() (3 input parameters)
Name: LoadWaveFromMemory Name: LoadWaveFromMemory
Return type: Wave Return type: Wave
Description: Load wave from memory buffer, fileType refers to extension: i.e. '.wav' Description: Load wave from memory buffer, fileType refers to extension: i.e. '.wav'
Param[1]: fileType (type: const char *) Param[1]: fileType (type: const char *)
Param[2]: fileData (type: const unsigned char *) Param[2]: fileData (type: const unsigned char *)
Param[3]: dataSize (type: int) Param[3]: dataSize (type: int)
Function 515: IsWaveReady() (1 input parameters) Function 517: IsWaveReady() (1 input parameters)
Name: IsWaveReady Name: IsWaveReady
Return type: bool Return type: bool
Description: Checks if wave data is ready Description: Checks if wave data is ready
Param[1]: wave (type: Wave) Param[1]: wave (type: Wave)
Function 516: LoadSound() (1 input parameters) Function 518: LoadSound() (1 input parameters)
Name: LoadSound Name: LoadSound
Return type: Sound Return type: Sound
Description: Load sound from file Description: Load sound from file
Param[1]: fileName (type: const char *) Param[1]: fileName (type: const char *)
Function 517: LoadSoundFromWave() (1 input parameters) Function 519: LoadSoundFromWave() (1 input parameters)
Name: LoadSoundFromWave Name: LoadSoundFromWave
Return type: Sound Return type: Sound
Description: Load sound from wave data Description: Load sound from wave data
Param[1]: wave (type: Wave) Param[1]: wave (type: Wave)
Function 518: LoadSoundAlias() (1 input parameters) Function 520: LoadSoundAlias() (1 input parameters)
Name: LoadSoundAlias Name: LoadSoundAlias
Return type: Sound Return type: Sound
Description: Create a new sound that shares the same sample data as the source sound, does not own the sound data 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) Param[1]: source (type: Sound)
Function 519: IsSoundReady() (1 input parameters) Function 521: IsSoundReady() (1 input parameters)
Name: IsSoundReady Name: IsSoundReady
Return type: bool Return type: bool
Description: Checks if a sound is ready Description: Checks if a sound is ready
Param[1]: sound (type: Sound) Param[1]: sound (type: Sound)
Function 520: UpdateSound() (3 input parameters) Function 522: UpdateSound() (3 input parameters)
Name: UpdateSound Name: UpdateSound
Return type: void Return type: void
Description: Update sound buffer with new data Description: Update sound buffer with new data
Param[1]: sound (type: Sound) Param[1]: sound (type: Sound)
Param[2]: data (type: const void *) Param[2]: data (type: const void *)
Param[3]: sampleCount (type: int) Param[3]: sampleCount (type: int)
Function 521: UnloadWave() (1 input parameters) Function 523: UnloadWave() (1 input parameters)
Name: UnloadWave Name: UnloadWave
Return type: void Return type: void
Description: Unload wave data Description: Unload wave data
Param[1]: wave (type: Wave) Param[1]: wave (type: Wave)
Function 522: UnloadSound() (1 input parameters) Function 524: UnloadSound() (1 input parameters)
Name: UnloadSound Name: UnloadSound
Return type: void Return type: void
Description: Unload sound Description: Unload sound
Param[1]: sound (type: Sound) Param[1]: sound (type: Sound)
Function 523: UnloadSoundAlias() (1 input parameters) Function 525: UnloadSoundAlias() (1 input parameters)
Name: UnloadSoundAlias Name: UnloadSoundAlias
Return type: void Return type: void
Description: Unload a sound alias (does not deallocate sample data) Description: Unload a sound alias (does not deallocate sample data)
Param[1]: alias (type: Sound) Param[1]: alias (type: Sound)
Function 524: ExportWave() (2 input parameters) Function 526: ExportWave() (2 input parameters)
Name: ExportWave Name: ExportWave
Return type: bool Return type: bool
Description: Export wave data to file, returns true on success Description: Export wave data to file, returns true on success
Param[1]: wave (type: Wave) Param[1]: wave (type: Wave)
Param[2]: fileName (type: const char *) Param[2]: fileName (type: const char *)
Function 525: ExportWaveAsCode() (2 input parameters) Function 527: ExportWaveAsCode() (2 input parameters)
Name: ExportWaveAsCode Name: ExportWaveAsCode
Return type: bool Return type: bool
Description: Export wave sample data to code (.h), returns true on success Description: Export wave sample data to code (.h), returns true on success
Param[1]: wave (type: Wave) Param[1]: wave (type: Wave)
Param[2]: fileName (type: const char *) Param[2]: fileName (type: const char *)
Function 526: PlaySound() (1 input parameters) Function 528: PlaySound() (1 input parameters)
Name: PlaySound Name: PlaySound
Return type: void Return type: void
Description: Play a sound Description: Play a sound
Param[1]: sound (type: Sound) Param[1]: sound (type: Sound)
Function 527: StopSound() (1 input parameters) Function 529: StopSound() (1 input parameters)
Name: StopSound Name: StopSound
Return type: void Return type: void
Description: Stop playing a sound Description: Stop playing a sound
Param[1]: sound (type: Sound) Param[1]: sound (type: Sound)
Function 528: PauseSound() (1 input parameters) Function 530: PauseSound() (1 input parameters)
Name: PauseSound Name: PauseSound
Return type: void Return type: void
Description: Pause a sound Description: Pause a sound
Param[1]: sound (type: Sound) Param[1]: sound (type: Sound)
Function 529: ResumeSound() (1 input parameters) Function 531: ResumeSound() (1 input parameters)
Name: ResumeSound Name: ResumeSound
Return type: void Return type: void
Description: Resume a paused sound Description: Resume a paused sound
Param[1]: sound (type: Sound) Param[1]: sound (type: Sound)
Function 530: IsSoundPlaying() (1 input parameters) Function 532: IsSoundPlaying() (1 input parameters)
Name: IsSoundPlaying Name: IsSoundPlaying
Return type: bool Return type: bool
Description: Check if a sound is currently playing Description: Check if a sound is currently playing
Param[1]: sound (type: Sound) Param[1]: sound (type: Sound)
Function 531: SetSoundVolume() (2 input parameters) Function 533: SetSoundVolume() (2 input parameters)
Name: SetSoundVolume Name: SetSoundVolume
Return type: void Return type: void
Description: Set volume for a sound (1.0 is max level) Description: Set volume for a sound (1.0 is max level)
Param[1]: sound (type: Sound) Param[1]: sound (type: Sound)
Param[2]: volume (type: float) Param[2]: volume (type: float)
Function 532: SetSoundPitch() (2 input parameters) Function 534: SetSoundPitch() (2 input parameters)
Name: SetSoundPitch Name: SetSoundPitch
Return type: void Return type: void
Description: Set pitch for a sound (1.0 is base level) Description: Set pitch for a sound (1.0 is base level)
Param[1]: sound (type: Sound) Param[1]: sound (type: Sound)
Param[2]: pitch (type: float) Param[2]: pitch (type: float)
Function 533: SetSoundPan() (2 input parameters) Function 535: SetSoundPan() (2 input parameters)
Name: SetSoundPan Name: SetSoundPan
Return type: void Return type: void
Description: Set pan for a sound (0.5 is center) Description: Set pan for a sound (0.5 is center)
Param[1]: sound (type: Sound) Param[1]: sound (type: Sound)
Param[2]: pan (type: float) Param[2]: pan (type: float)
Function 534: WaveCopy() (1 input parameters) Function 536: WaveCopy() (1 input parameters)
Name: WaveCopy Name: WaveCopy
Return type: Wave Return type: Wave
Description: Copy a wave to a new wave Description: Copy a wave to a new wave
Param[1]: wave (type: Wave) Param[1]: wave (type: Wave)
Function 535: WaveCrop() (3 input parameters) Function 537: WaveCrop() (3 input parameters)
Name: WaveCrop Name: WaveCrop
Return type: void Return type: void
Description: Crop a wave to defined frames range Description: Crop a wave to defined frames range
Param[1]: wave (type: Wave *) Param[1]: wave (type: Wave *)
Param[2]: initFrame (type: int) Param[2]: initFrame (type: int)
Param[3]: finalFrame (type: int) Param[3]: finalFrame (type: int)
Function 536: WaveFormat() (4 input parameters) Function 538: WaveFormat() (4 input parameters)
Name: WaveFormat Name: WaveFormat
Return type: void Return type: void
Description: Convert wave data to desired format Description: Convert wave data to desired format
@ -4409,203 +4427,203 @@ Function 536: WaveFormat() (4 input parameters)
Param[2]: sampleRate (type: int) Param[2]: sampleRate (type: int)
Param[3]: sampleSize (type: int) Param[3]: sampleSize (type: int)
Param[4]: channels (type: int) Param[4]: channels (type: int)
Function 537: LoadWaveSamples() (1 input parameters) Function 539: LoadWaveSamples() (1 input parameters)
Name: LoadWaveSamples Name: LoadWaveSamples
Return type: float * Return type: float *
Description: Load samples data from wave as a 32bit float data array Description: Load samples data from wave as a 32bit float data array
Param[1]: wave (type: Wave) Param[1]: wave (type: Wave)
Function 538: UnloadWaveSamples() (1 input parameters) Function 540: UnloadWaveSamples() (1 input parameters)
Name: UnloadWaveSamples Name: UnloadWaveSamples
Return type: void Return type: void
Description: Unload samples data loaded with LoadWaveSamples() Description: Unload samples data loaded with LoadWaveSamples()
Param[1]: samples (type: float *) Param[1]: samples (type: float *)
Function 539: LoadMusicStream() (1 input parameters) Function 541: LoadMusicStream() (1 input parameters)
Name: LoadMusicStream Name: LoadMusicStream
Return type: Music Return type: Music
Description: Load music stream from file Description: Load music stream from file
Param[1]: fileName (type: const char *) Param[1]: fileName (type: const char *)
Function 540: LoadMusicStreamFromMemory() (3 input parameters) Function 542: LoadMusicStreamFromMemory() (3 input parameters)
Name: LoadMusicStreamFromMemory Name: LoadMusicStreamFromMemory
Return type: Music Return type: Music
Description: Load music stream from data Description: Load music stream from data
Param[1]: fileType (type: const char *) Param[1]: fileType (type: const char *)
Param[2]: data (type: const unsigned char *) Param[2]: data (type: const unsigned char *)
Param[3]: dataSize (type: int) Param[3]: dataSize (type: int)
Function 541: IsMusicReady() (1 input parameters) Function 543: IsMusicReady() (1 input parameters)
Name: IsMusicReady Name: IsMusicReady
Return type: bool Return type: bool
Description: Checks if a music stream is ready Description: Checks if a music stream is ready
Param[1]: music (type: Music) Param[1]: music (type: Music)
Function 542: UnloadMusicStream() (1 input parameters) Function 544: UnloadMusicStream() (1 input parameters)
Name: UnloadMusicStream Name: UnloadMusicStream
Return type: void Return type: void
Description: Unload music stream Description: Unload music stream
Param[1]: music (type: Music) Param[1]: music (type: Music)
Function 543: PlayMusicStream() (1 input parameters) Function 545: PlayMusicStream() (1 input parameters)
Name: PlayMusicStream Name: PlayMusicStream
Return type: void Return type: void
Description: Start music playing Description: Start music playing
Param[1]: music (type: Music) Param[1]: music (type: Music)
Function 544: IsMusicStreamPlaying() (1 input parameters) Function 546: IsMusicStreamPlaying() (1 input parameters)
Name: IsMusicStreamPlaying Name: IsMusicStreamPlaying
Return type: bool Return type: bool
Description: Check if music is playing Description: Check if music is playing
Param[1]: music (type: Music) Param[1]: music (type: Music)
Function 545: UpdateMusicStream() (1 input parameters) Function 547: UpdateMusicStream() (1 input parameters)
Name: UpdateMusicStream Name: UpdateMusicStream
Return type: void Return type: void
Description: Updates buffers for music streaming Description: Updates buffers for music streaming
Param[1]: music (type: Music) Param[1]: music (type: Music)
Function 546: StopMusicStream() (1 input parameters) Function 548: StopMusicStream() (1 input parameters)
Name: StopMusicStream Name: StopMusicStream
Return type: void Return type: void
Description: Stop music playing Description: Stop music playing
Param[1]: music (type: Music) Param[1]: music (type: Music)
Function 547: PauseMusicStream() (1 input parameters) Function 549: PauseMusicStream() (1 input parameters)
Name: PauseMusicStream Name: PauseMusicStream
Return type: void Return type: void
Description: Pause music playing Description: Pause music playing
Param[1]: music (type: Music) Param[1]: music (type: Music)
Function 548: ResumeMusicStream() (1 input parameters) Function 550: ResumeMusicStream() (1 input parameters)
Name: ResumeMusicStream Name: ResumeMusicStream
Return type: void Return type: void
Description: Resume playing paused music Description: Resume playing paused music
Param[1]: music (type: Music) Param[1]: music (type: Music)
Function 549: SeekMusicStream() (2 input parameters) Function 551: SeekMusicStream() (2 input parameters)
Name: SeekMusicStream Name: SeekMusicStream
Return type: void Return type: void
Description: Seek music to a position (in seconds) Description: Seek music to a position (in seconds)
Param[1]: music (type: Music) Param[1]: music (type: Music)
Param[2]: position (type: float) Param[2]: position (type: float)
Function 550: SetMusicVolume() (2 input parameters) Function 552: SetMusicVolume() (2 input parameters)
Name: SetMusicVolume Name: SetMusicVolume
Return type: void Return type: void
Description: Set volume for music (1.0 is max level) Description: Set volume for music (1.0 is max level)
Param[1]: music (type: Music) Param[1]: music (type: Music)
Param[2]: volume (type: float) Param[2]: volume (type: float)
Function 551: SetMusicPitch() (2 input parameters) Function 553: SetMusicPitch() (2 input parameters)
Name: SetMusicPitch Name: SetMusicPitch
Return type: void Return type: void
Description: Set pitch for a music (1.0 is base level) Description: Set pitch for a music (1.0 is base level)
Param[1]: music (type: Music) Param[1]: music (type: Music)
Param[2]: pitch (type: float) Param[2]: pitch (type: float)
Function 552: SetMusicPan() (2 input parameters) Function 554: SetMusicPan() (2 input parameters)
Name: SetMusicPan Name: SetMusicPan
Return type: void Return type: void
Description: Set pan for a music (0.5 is center) Description: Set pan for a music (0.5 is center)
Param[1]: music (type: Music) Param[1]: music (type: Music)
Param[2]: pan (type: float) Param[2]: pan (type: float)
Function 553: GetMusicTimeLength() (1 input parameters) Function 555: GetMusicTimeLength() (1 input parameters)
Name: GetMusicTimeLength Name: GetMusicTimeLength
Return type: float Return type: float
Description: Get music time length (in seconds) Description: Get music time length (in seconds)
Param[1]: music (type: Music) Param[1]: music (type: Music)
Function 554: GetMusicTimePlayed() (1 input parameters) Function 556: GetMusicTimePlayed() (1 input parameters)
Name: GetMusicTimePlayed Name: GetMusicTimePlayed
Return type: float Return type: float
Description: Get current music time played (in seconds) Description: Get current music time played (in seconds)
Param[1]: music (type: Music) Param[1]: music (type: Music)
Function 555: LoadAudioStream() (3 input parameters) Function 557: LoadAudioStream() (3 input parameters)
Name: LoadAudioStream Name: LoadAudioStream
Return type: AudioStream Return type: AudioStream
Description: Load audio stream (to stream raw audio pcm data) Description: Load audio stream (to stream raw audio pcm data)
Param[1]: sampleRate (type: unsigned int) Param[1]: sampleRate (type: unsigned int)
Param[2]: sampleSize (type: unsigned int) Param[2]: sampleSize (type: unsigned int)
Param[3]: channels (type: unsigned int) Param[3]: channels (type: unsigned int)
Function 556: IsAudioStreamReady() (1 input parameters) Function 558: IsAudioStreamReady() (1 input parameters)
Name: IsAudioStreamReady Name: IsAudioStreamReady
Return type: bool Return type: bool
Description: Checks if an audio stream is ready Description: Checks if an audio stream is ready
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Function 557: UnloadAudioStream() (1 input parameters) Function 559: UnloadAudioStream() (1 input parameters)
Name: UnloadAudioStream Name: UnloadAudioStream
Return type: void Return type: void
Description: Unload audio stream and free memory Description: Unload audio stream and free memory
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Function 558: UpdateAudioStream() (3 input parameters) Function 560: UpdateAudioStream() (3 input parameters)
Name: UpdateAudioStream Name: UpdateAudioStream
Return type: void Return type: void
Description: Update audio stream buffers with data Description: Update audio stream buffers with data
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Param[2]: data (type: const void *) Param[2]: data (type: const void *)
Param[3]: frameCount (type: int) Param[3]: frameCount (type: int)
Function 559: IsAudioStreamProcessed() (1 input parameters) Function 561: IsAudioStreamProcessed() (1 input parameters)
Name: IsAudioStreamProcessed Name: IsAudioStreamProcessed
Return type: bool Return type: bool
Description: Check if any audio stream buffers requires refill Description: Check if any audio stream buffers requires refill
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Function 560: PlayAudioStream() (1 input parameters) Function 562: PlayAudioStream() (1 input parameters)
Name: PlayAudioStream Name: PlayAudioStream
Return type: void Return type: void
Description: Play audio stream Description: Play audio stream
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Function 561: PauseAudioStream() (1 input parameters) Function 563: PauseAudioStream() (1 input parameters)
Name: PauseAudioStream Name: PauseAudioStream
Return type: void Return type: void
Description: Pause audio stream Description: Pause audio stream
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Function 562: ResumeAudioStream() (1 input parameters) Function 564: ResumeAudioStream() (1 input parameters)
Name: ResumeAudioStream Name: ResumeAudioStream
Return type: void Return type: void
Description: Resume audio stream Description: Resume audio stream
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Function 563: IsAudioStreamPlaying() (1 input parameters) Function 565: IsAudioStreamPlaying() (1 input parameters)
Name: IsAudioStreamPlaying Name: IsAudioStreamPlaying
Return type: bool Return type: bool
Description: Check if audio stream is playing Description: Check if audio stream is playing
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Function 564: StopAudioStream() (1 input parameters) Function 566: StopAudioStream() (1 input parameters)
Name: StopAudioStream Name: StopAudioStream
Return type: void Return type: void
Description: Stop audio stream Description: Stop audio stream
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Function 565: SetAudioStreamVolume() (2 input parameters) Function 567: SetAudioStreamVolume() (2 input parameters)
Name: SetAudioStreamVolume Name: SetAudioStreamVolume
Return type: void Return type: void
Description: Set volume for audio stream (1.0 is max level) Description: Set volume for audio stream (1.0 is max level)
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Param[2]: volume (type: float) Param[2]: volume (type: float)
Function 566: SetAudioStreamPitch() (2 input parameters) Function 568: SetAudioStreamPitch() (2 input parameters)
Name: SetAudioStreamPitch Name: SetAudioStreamPitch
Return type: void Return type: void
Description: Set pitch for audio stream (1.0 is base level) Description: Set pitch for audio stream (1.0 is base level)
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Param[2]: pitch (type: float) Param[2]: pitch (type: float)
Function 567: SetAudioStreamPan() (2 input parameters) Function 569: SetAudioStreamPan() (2 input parameters)
Name: SetAudioStreamPan Name: SetAudioStreamPan
Return type: void Return type: void
Description: Set pan for audio stream (0.5 is centered) Description: Set pan for audio stream (0.5 is centered)
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Param[2]: pan (type: float) Param[2]: pan (type: float)
Function 568: SetAudioStreamBufferSizeDefault() (1 input parameters) Function 570: SetAudioStreamBufferSizeDefault() (1 input parameters)
Name: SetAudioStreamBufferSizeDefault Name: SetAudioStreamBufferSizeDefault
Return type: void Return type: void
Description: Default size for new audio streams Description: Default size for new audio streams
Param[1]: size (type: int) Param[1]: size (type: int)
Function 569: SetAudioStreamCallback() (2 input parameters) Function 571: SetAudioStreamCallback() (2 input parameters)
Name: SetAudioStreamCallback Name: SetAudioStreamCallback
Return type: void Return type: void
Description: Audio thread callback to request new data Description: Audio thread callback to request new data
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Param[2]: callback (type: AudioCallback) Param[2]: callback (type: AudioCallback)
Function 570: AttachAudioStreamProcessor() (2 input parameters) Function 572: AttachAudioStreamProcessor() (2 input parameters)
Name: AttachAudioStreamProcessor Name: AttachAudioStreamProcessor
Return type: void Return type: void
Description: Attach audio stream processor to stream, receives the samples as 'float' Description: Attach audio stream processor to stream, receives the samples as 'float'
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Param[2]: processor (type: AudioCallback) Param[2]: processor (type: AudioCallback)
Function 571: DetachAudioStreamProcessor() (2 input parameters) Function 573: DetachAudioStreamProcessor() (2 input parameters)
Name: DetachAudioStreamProcessor Name: DetachAudioStreamProcessor
Return type: void Return type: void
Description: Detach audio stream processor from stream Description: Detach audio stream processor from stream
Param[1]: stream (type: AudioStream) Param[1]: stream (type: AudioStream)
Param[2]: processor (type: AudioCallback) Param[2]: processor (type: AudioCallback)
Function 572: AttachAudioMixedProcessor() (1 input parameters) Function 574: AttachAudioMixedProcessor() (1 input parameters)
Name: AttachAudioMixedProcessor Name: AttachAudioMixedProcessor
Return type: void Return type: void
Description: Attach audio stream processor to the entire audio pipeline, receives the samples as 'float' Description: Attach audio stream processor to the entire audio pipeline, receives the samples as 'float'
Param[1]: processor (type: AudioCallback) Param[1]: processor (type: AudioCallback)
Function 573: DetachAudioMixedProcessor() (1 input parameters) Function 575: DetachAudioMixedProcessor() (1 input parameters)
Name: DetachAudioMixedProcessor Name: DetachAudioMixedProcessor
Return type: void Return type: void
Description: Detach audio stream processor from the entire audio pipeline Description: Detach audio stream processor from the entire audio pipeline

View File

@ -670,7 +670,7 @@
<Param type="unsigned int" name="frames" desc="" /> <Param type="unsigned int" name="frames" desc="" />
</Callback> </Callback>
</Callbacks> </Callbacks>
<Functions count="573"> <Functions count="575">
<Function name="InitWindow" retType="void" paramCount="3" desc="Initialize window and OpenGL context"> <Function name="InitWindow" retType="void" paramCount="3" desc="Initialize window and OpenGL context">
<Param type="int" name="width" desc="" /> <Param type="int" name="width" desc="" />
<Param type="int" name="height" desc="" /> <Param type="int" name="height" desc="" />
@ -703,9 +703,9 @@
<Function name="ClearWindowState" retType="void" paramCount="1" desc="Clear window configuration state flags"> <Function name="ClearWindowState" retType="void" paramCount="1" desc="Clear window configuration state flags">
<Param type="unsigned int" name="flags" desc="" /> <Param type="unsigned int" name="flags" desc="" />
</Function> </Function>
<Function name="ToggleFullscreen" retType="void" paramCount="0" desc="Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)"> <Function name="ToggleFullscreen" retType="void" paramCount="0" desc="Toggle window state: fullscreen/windowed [resizes monitor to match window resolution] (only PLATFORM_DESKTOP)">
</Function> </Function>
<Function name="ToggleBorderlessWindowed" retType="void" paramCount="0" desc="Toggle window state: borderless windowed (only PLATFORM_DESKTOP)"> <Function name="ToggleBorderlessWindowed" retType="void" paramCount="0" desc="Toggle window state: borderless windowed [resizes window to match monitor resolution] (only PLATFORM_DESKTOP)">
</Function> </Function>
<Function name="MaximizeWindow" retType="void" paramCount="0" desc="Set window state: maximized, if resizable (only PLATFORM_DESKTOP)"> <Function name="MaximizeWindow" retType="void" paramCount="0" desc="Set window state: maximized, if resizable (only PLATFORM_DESKTOP)">
</Function> </Function>
@ -1353,8 +1353,8 @@
<Param type="int" name="centerX" desc="" /> <Param type="int" name="centerX" desc="" />
<Param type="int" name="centerY" desc="" /> <Param type="int" name="centerY" desc="" />
<Param type="float" name="radius" desc="" /> <Param type="float" name="radius" desc="" />
<Param type="Color" name="color1" desc="" /> <Param type="Color" name="inner" desc="" />
<Param type="Color" name="color2" desc="" /> <Param type="Color" name="outer" desc="" />
</Function> </Function>
<Function name="DrawCircleV" retType="void" paramCount="3" desc="Draw a color-filled circle (Vector version)"> <Function name="DrawCircleV" retType="void" paramCount="3" desc="Draw a color-filled circle (Vector version)">
<Param type="Vector2" name="center" desc="" /> <Param type="Vector2" name="center" desc="" />
@ -1431,23 +1431,23 @@
<Param type="int" name="posY" desc="" /> <Param type="int" name="posY" desc="" />
<Param type="int" name="width" desc="" /> <Param type="int" name="width" desc="" />
<Param type="int" name="height" desc="" /> <Param type="int" name="height" desc="" />
<Param type="Color" name="color1" desc="" /> <Param type="Color" name="top" desc="" />
<Param type="Color" name="color2" desc="" /> <Param type="Color" name="bottom" desc="" />
</Function> </Function>
<Function name="DrawRectangleGradientH" retType="void" paramCount="6" desc="Draw a horizontal-gradient-filled rectangle"> <Function name="DrawRectangleGradientH" retType="void" paramCount="6" desc="Draw a horizontal-gradient-filled rectangle">
<Param type="int" name="posX" desc="" /> <Param type="int" name="posX" desc="" />
<Param type="int" name="posY" desc="" /> <Param type="int" name="posY" desc="" />
<Param type="int" name="width" desc="" /> <Param type="int" name="width" desc="" />
<Param type="int" name="height" desc="" /> <Param type="int" name="height" desc="" />
<Param type="Color" name="color1" desc="" /> <Param type="Color" name="left" desc="" />
<Param type="Color" name="color2" desc="" /> <Param type="Color" name="right" desc="" />
</Function> </Function>
<Function name="DrawRectangleGradientEx" retType="void" paramCount="5" desc="Draw a gradient-filled rectangle with custom vertex colors"> <Function name="DrawRectangleGradientEx" retType="void" paramCount="5" desc="Draw a gradient-filled rectangle with custom vertex colors">
<Param type="Rectangle" name="rec" desc="" /> <Param type="Rectangle" name="rec" desc="" />
<Param type="Color" name="col1" desc="" /> <Param type="Color" name="topLeft" desc="" />
<Param type="Color" name="col2" desc="" /> <Param type="Color" name="bottomLeft" desc="" />
<Param type="Color" name="col3" desc="" /> <Param type="Color" name="topRight" desc="" />
<Param type="Color" name="col4" desc="" /> <Param type="Color" name="bottomRight" desc="" />
</Function> </Function>
<Function name="DrawRectangleLines" retType="void" paramCount="5" desc="Draw rectangle outline"> <Function name="DrawRectangleLines" retType="void" paramCount="5" desc="Draw rectangle outline">
<Param type="int" name="posX" desc="" /> <Param type="int" name="posX" desc="" />
@ -2637,6 +2637,20 @@
<Param type="Vector3" name="scale" desc="" /> <Param type="Vector3" name="scale" desc="" />
<Param type="Color" name="tint" desc="" /> <Param type="Color" name="tint" desc="" />
</Function> </Function>
<Function name="DrawModelPoints" retType="void" paramCount="4" desc="Draw a model as points">
<Param type="Model" name="model" desc="" />
<Param type="Vector3" name="position" desc="" />
<Param type="float" name="scale" desc="" />
<Param type="Color" name="tint" desc="" />
</Function>
<Function name="DrawModelPointsEx" retType="void" paramCount="6" desc="Draw a model as points with extended parameters">
<Param type="Model" name="model" desc="" />
<Param type="Vector3" name="position" desc="" />
<Param type="Vector3" name="rotationAxis" desc="" />
<Param type="float" name="rotationAngle" desc="" />
<Param type="Vector3" name="scale" desc="" />
<Param type="Color" name="tint" desc="" />
</Function>
<Function name="DrawBoundingBox" retType="void" paramCount="2" desc="Draw bounding box (wires)"> <Function name="DrawBoundingBox" retType="void" paramCount="2" desc="Draw bounding box (wires)">
<Param type="BoundingBox" name="box" desc="" /> <Param type="BoundingBox" name="box" desc="" />
<Param type="Color" name="color" desc="" /> <Param type="Color" name="color" desc="" />

View File

@ -17,9 +17,8 @@ if (NOT raylib_FOUND) # If there's none, fetch and build raylib
FetchContent_GetProperties(raylib) FetchContent_GetProperties(raylib)
if (NOT raylib_POPULATED) # Have we downloaded raylib yet? if (NOT raylib_POPULATED) # Have we downloaded raylib yet?
set(FETCHCONTENT_QUIET NO) set(FETCHCONTENT_QUIET NO)
FetchContent_Populate(raylib) FetchContent_MakeAvailable(raylib)
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) # don't build the supplied examples set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) # don't build the supplied examples
add_subdirectory(${raylib_SOURCE_DIR} ${raylib_BINARY_DIR})
endif() endif()
endif() endif()

4
src/external/RGFW.h vendored
View File

@ -4999,7 +4999,9 @@ static const struct wl_callback_listener wl_surface_frame_listener = {
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#define OEMRESOURCE #define OEMRESOURCE
#include <windows.h> #include <windows.h>
__declspec(dllimport) int __stdcall WideCharToMultiByte( UINT CodePage, DWORD dwFlags, const WCHAR* lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar);
#include <processthreadsapi.h> #include <processthreadsapi.h>
#include <wchar.h> #include <wchar.h>
#include <locale.h> #include <locale.h>

View File

@ -281,14 +281,15 @@ void android_main(struct android_app *app)
// Request to end the native activity // Request to end the native activity
ANativeActivity_finish(app->activity); ANativeActivity_finish(app->activity);
// Android ALooper_pollAll() variables // Android ALooper_pollOnce() variables
int pollResult = 0; int pollResult = 0;
int pollEvents = 0; int pollEvents = 0;
// Waiting for application events before complete finishing // Waiting for application events before complete finishing
while (!app->destroyRequested) while (!app->destroyRequested)
{ {
while ((pollResult = ALooper_pollAll(0, NULL, &pollEvents, (void **)&platform.source)) >= 0) // Poll all events until we reach return value TIMEOUT, meaning no events left to process
while ((pollResult = ALooper_pollOnce(0, NULL, &pollEvents, (void **)&platform.source)) > ALOOPER_POLL_TIMEOUT)
{ {
if (platform.source != NULL) platform.source->process(app, platform.source); if (platform.source != NULL) platform.source->process(app, platform.source);
} }
@ -682,22 +683,23 @@ void PollInputEvents(void)
CORE.Input.Keyboard.keyRepeatInFrame[i] = 0; CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
} }
// Android ALooper_pollAll() variables // Android ALooper_pollOnce() variables
int pollResult = 0; int pollResult = 0;
int pollEvents = 0; int pollEvents = 0;
// Poll Events (registered events) // Poll Events (registered events) until we reach TIMEOUT which indicates there are no events left to poll
// NOTE: Activity is paused if not enabled (platform.appEnabled) // NOTE: Activity is paused if not enabled (platform.appEnabled)
while ((pollResult = ALooper_pollAll(platform.appEnabled? 0 : -1, NULL, &pollEvents, (void**)&platform.source)) >= 0) while ((pollResult = ALooper_pollOnce(platform.appEnabled? 0 : -1, NULL, &pollEvents, (void**)&platform.source)) > ALOOPER_POLL_TIMEOUT)
{ {
// Process this event // Process this event
if (platform.source != NULL) platform.source->process(platform.app, platform.source); if (platform.source != NULL) platform.source->process(platform.app, platform.source);
// NOTE: Never close window, native activity is controlled by the system! // NOTE: Allow closing the window in case a configuration change happened.
// The android_main function should be allowed to return to its caller in order for the
// Android OS to relaunch the activity.
if (platform.app->destroyRequested != 0) if (platform.app->destroyRequested != 0)
{ {
//CORE.Window.shouldClose = true; CORE.Window.shouldClose = true;
//ANativeActivity_finish(platform.app->activity);
} }
} }
} }
@ -767,20 +769,20 @@ int InitPlatform(void)
TRACELOG(LOG_INFO, "PLATFORM: ANDROID: Initialized successfully"); TRACELOG(LOG_INFO, "PLATFORM: ANDROID: Initialized successfully");
// Android ALooper_pollAll() variables // Android ALooper_pollOnce() variables
int pollResult = 0; int pollResult = 0;
int pollEvents = 0; int pollEvents = 0;
// Wait for window to be initialized (display and context) // Wait for window to be initialized (display and context)
while (!CORE.Window.ready) while (!CORE.Window.ready)
{ {
// Process events loop // Process events until we reach TIMEOUT, which indicates no more events queued.
while ((pollResult = ALooper_pollAll(0, NULL, &pollEvents, (void**)&platform.source)) >= 0) while ((pollResult = ALooper_pollOnce(0, NULL, &pollEvents, (void**)&platform.source)) > ALOOPER_POLL_TIMEOUT)
{ {
// Process this event // Process this event
if (platform.source != NULL) platform.source->process(platform.app, platform.source); if (platform.source != NULL) platform.source->process(platform.app, platform.source);
// NOTE: Never close window, native activity is controlled by the system! // NOTE: It's highly likely destroyRequested will never be non-zero at the start of the activity lifecycle.
//if (platform.app->destroyRequested != 0) CORE.Window.shouldClose = true; //if (platform.app->destroyRequested != 0) CORE.Window.shouldClose = true;
} }
} }
@ -811,6 +813,12 @@ void ClosePlatform(void)
eglTerminate(platform.device); eglTerminate(platform.device);
platform.device = EGL_NO_DISPLAY; platform.device = EGL_NO_DISPLAY;
} }
// NOTE: Reset global state in case the activity is being relaunched.
if (platform.app->destroyRequested != 0) {
CORE = (CoreData){0};
platform = (PlatformData){0};
}
} }
// Initialize display device and framebuffer // Initialize display device and framebuffer

View File

@ -109,6 +109,7 @@ static void ErrorCallback(int error, const char *description);
// Window callbacks events // Window callbacks events
static void WindowSizeCallback(GLFWwindow *window, int width, int height); // GLFW3 WindowSize Callback, runs when window is resized 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 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 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 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) if (!CORE.Window.fullscreen)
{ {
// Store previous window position (in case we exit 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 monitorCount = 0;
int monitorIndex = GetCurrentMonitor(); int monitorIndex = GetCurrentMonitor();
GLFWmonitor **monitors = glfwGetMonitors(&monitorCount); GLFWmonitor **monitors = glfwGetMonitors(&monitorCount);
@ -179,7 +180,11 @@ void ToggleFullscreen(void)
CORE.Window.fullscreen = false; CORE.Window.fullscreen = false;
CORE.Window.flags &= ~FLAG_FULLSCREEN_MODE; 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) // 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 // Toggle borderless windowed mode
void ToggleBorderlessWindowed(void) 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; bool wasOnFullscreen = false;
if (CORE.Window.fullscreen) 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(); ToggleFullscreen();
wasOnFullscreen = true; wasOnFullscreen = true;
} }
@ -213,7 +218,7 @@ void ToggleBorderlessWindowed(void)
{ {
// Store screen position and size // Store screen position and size
// NOTE: If it was on fullscreen, screen position was already stored, so skip setting it here // 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; CORE.Window.previousScreen = CORE.Window.screen;
// Set undecorated and topmost modes and flags // Set undecorated and topmost modes and flags
@ -255,6 +260,9 @@ void ToggleBorderlessWindowed(void)
glfwFocusWindow(platform.handle); glfwFocusWindow(platform.handle);
CORE.Window.flags &= ~FLAG_BORDERLESS_WINDOWED_MODE; 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"); 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) // Set window position on screen (windowed mode)
void SetWindowPosition(int x, int y) 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); 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])); TRACELOG(LOG_INFO, "GLFW: Selected monitor: [%i] %s", monitor, glfwGetMonitorName(monitors[monitor]));
const int screenWidth = CORE.Window.screen.width; // Here the render width has to be used again in case high dpi flag is enabled
const int screenHeight = CORE.Window.screen.height; const int screenWidth = CORE.Window.render.width;
const int screenHeight = CORE.Window.render.height;
int monitorWorkareaX = 0; int monitorWorkareaX = 0;
int monitorWorkareaY = 0; int monitorWorkareaY = 0;
int monitorWorkareaWidth = 0; int monitorWorkareaWidth = 0;
@ -1568,12 +1580,17 @@ int InitPlatform(void)
int monitorWidth = 0; int monitorWidth = 0;
int monitorHeight = 0; int monitorHeight = 0;
glfwGetMonitorWorkarea(monitor, &monitorX, &monitorY, &monitorWidth, &monitorHeight); glfwGetMonitorWorkarea(monitor, &monitorX, &monitorY, &monitorWidth, &monitorHeight);
int posX = monitorX + (monitorWidth - (int)CORE.Window.screen.width)/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 posY = monitorY + (monitorHeight - (int)CORE.Window.screen.height)/2; 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 (posX < monitorX) posX = monitorX;
if (posY < monitorY) posY = monitorY; if (posY < monitorY) posY = monitorY;
SetWindowPosition(posX, posY); 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 // Load OpenGL extensions
@ -1585,6 +1602,7 @@ int InitPlatform(void)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Set window callback events // Set window callback events
glfwSetWindowSizeCallback(platform.handle, WindowSizeCallback); // NOTE: Resizing not allowed by default! glfwSetWindowSizeCallback(platform.handle, WindowSizeCallback); // NOTE: Resizing not allowed by default!
glfwSetWindowPosCallback(platform.handle, WindowPosCallback);
glfwSetWindowMaximizeCallback(platform.handle, WindowMaximizeCallback); glfwSetWindowMaximizeCallback(platform.handle, WindowMaximizeCallback);
glfwSetWindowIconifyCallback(platform.handle, WindowIconifyCallback); glfwSetWindowIconifyCallback(platform.handle, WindowIconifyCallback);
glfwSetWindowFocusCallback(platform.handle, WindowFocusCallback); 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 // 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) static void WindowContentScaleCallback(GLFWwindow *window, float scalex, float scaley)
{ {
CORE.Window.screenScale = MatrixScale(scalex, scaley, 1.0f); CORE.Window.screenScale = MatrixScale(scalex, scaley, 1.0f);

View File

@ -76,9 +76,7 @@ void CloseWindow(void);
#define Size NSSIZE #define Size NSSIZE
#endif #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); __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" #include "../external/RGFW.h"
@ -538,10 +536,8 @@ void *GetWindowHandle(void)
{ {
#ifdef RGFW_WEBASM #ifdef RGFW_WEBASM
return (void*)platform.window->src.ctx; return (void*)platform.window->src.ctx;
#elif !defined(RGFW_WINDOWS)
return (void *)platform.window->src.window;
#else #else
return platform.window->src.hwnd; return (void*)platform.window->src.window;
#endif #endif
} }

View File

@ -206,7 +206,7 @@ static const short linuxToRaylibMap[KEYMAP_SIZE] = {
[BTN_TL] = GAMEPAD_BUTTON_LEFT_TRIGGER_1, [BTN_TL] = GAMEPAD_BUTTON_LEFT_TRIGGER_1,
[BTN_TL2] = GAMEPAD_BUTTON_LEFT_TRIGGER_2, [BTN_TL2] = GAMEPAD_BUTTON_LEFT_TRIGGER_2,
[BTN_TR] = GAMEPAD_BUTTON_RIGHT_TRIGGER_1, [BTN_TR] = GAMEPAD_BUTTON_RIGHT_TRIGGER_1,
[BTN_TR2] GAMEPAD_BUTTON_RIGHT_TRIGGER_2, [BTN_TR2] = GAMEPAD_BUTTON_RIGHT_TRIGGER_2,
[BTN_SELECT] = GAMEPAD_BUTTON_MIDDLE_LEFT, [BTN_SELECT] = GAMEPAD_BUTTON_MIDDLE_LEFT,
[BTN_MODE] = GAMEPAD_BUTTON_MIDDLE, [BTN_MODE] = GAMEPAD_BUTTON_MIDDLE,
[BTN_START] = GAMEPAD_BUTTON_MIDDLE_RIGHT, [BTN_START] = GAMEPAD_BUTTON_MIDDLE_RIGHT,

View File

@ -1626,7 +1626,9 @@ Music LoadMusicStreamFromMemory(const char *fileType, const unsigned char *data,
{ {
music.ctxType = MUSIC_AUDIO_FLAC; music.ctxType = MUSIC_AUDIO_FLAC;
music.ctxData = ctxFlac; music.ctxData = ctxFlac;
music.stream = LoadAudioStream(ctxFlac->sampleRate, ctxFlac->bitsPerSample, ctxFlac->channels); int sampleSize = ctxFlac->bitsPerSample;
if (ctxFlac->bitsPerSample == 24) sampleSize = 16; // Forcing conversion to s16 on UpdateMusicStream()
music.stream = LoadAudioStream(ctxFlac->sampleRate, sampleSize, ctxFlac->channels);
music.frameCount = (unsigned int)ctxFlac->totalPCMFrameCount; music.frameCount = (unsigned int)ctxFlac->totalPCMFrameCount;
music.looping = true; // Looping enabled by default music.looping = true; // Looping enabled by default
musicLoaded = true; musicLoaded = true;

View File

@ -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 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 SetWindowState(unsigned int flags); // Set window configuration state using flags (only PLATFORM_DESKTOP)
RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags
RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP) RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed [resizes monitor to match window resolution] (only PLATFORM_DESKTOP)
RLAPI void ToggleBorderlessWindowed(void); // Toggle window state: borderless windowed (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 MaximizeWindow(void); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP) RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP)
RLAPI void RestoreWindow(void); // Set window state: not minimized/maximized (only PLATFORM_DESKTOP) RLAPI void RestoreWindow(void); // Set window state: not minimized/maximized (only PLATFORM_DESKTOP)
@ -1238,7 +1238,7 @@ RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color c
RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle
RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle
RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline
RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2); // Draw a gradient-filled circle RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color inner, Color outer); // Draw a gradient-filled circle
RLAPI void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version) RLAPI void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version)
RLAPI void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline RLAPI void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline
RLAPI void DrawCircleLinesV(Vector2 center, float radius, Color color); // Draw circle outline (Vector version) RLAPI void DrawCircleLinesV(Vector2 center, float radius, Color color); // Draw circle outline (Vector version)
@ -1250,9 +1250,9 @@ RLAPI void DrawRectangle(int posX, int posY, int width, int height, Color color)
RLAPI void DrawRectangleV(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version) RLAPI void DrawRectangleV(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version)
RLAPI void DrawRectangleRec(Rectangle rec, Color color); // Draw a color-filled rectangle RLAPI void DrawRectangleRec(Rectangle rec, Color color); // Draw a color-filled rectangle
RLAPI void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color); // Draw a color-filled rectangle with pro parameters RLAPI void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color); // Draw a color-filled rectangle with pro parameters
RLAPI void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2);// Draw a vertical-gradient-filled rectangle RLAPI void DrawRectangleGradientV(int posX, int posY, int width, int height, Color top, Color bottom); // Draw a vertical-gradient-filled rectangle
RLAPI void DrawRectangleGradientH(int posX, int posY, int width, int height, Color color1, Color color2);// Draw a horizontal-gradient-filled rectangle RLAPI void DrawRectangleGradientH(int posX, int posY, int width, int height, Color left, Color right); // Draw a horizontal-gradient-filled rectangle
RLAPI void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // Draw a gradient-filled rectangle with custom vertex colors RLAPI void DrawRectangleGradientEx(Rectangle rec, Color topLeft, Color bottomLeft, Color topRight, Color bottomRight); // Draw a gradient-filled rectangle with custom vertex colors
RLAPI void DrawRectangleLines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline RLAPI void DrawRectangleLines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline
RLAPI void DrawRectangleLinesEx(Rectangle rec, float lineThick, Color color); // Draw rectangle outline with extended parameters RLAPI void DrawRectangleLinesEx(Rectangle rec, float lineThick, Color color); // Draw rectangle outline with extended parameters
RLAPI void DrawRectangleRounded(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle with rounded edges RLAPI void DrawRectangleRounded(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle with rounded edges
@ -1443,7 +1443,7 @@ RLAPI int GetPixelDataSize(int width, int height, int format); // G
// Font loading/unloading functions // Font loading/unloading functions
RLAPI Font GetFontDefault(void); // Get the default Font RLAPI Font GetFontDefault(void); // Get the default Font
RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM) RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM)
RLAPI Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // Load font from file with extended parameters, use NULL for codepoints and 0 for codepointCount to load the default character set RLAPI Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // Load font from file with extended parameters, use NULL for codepoints and 0 for codepointCount to load the default character set, font size is provided in pixels height
RLAPI Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style) RLAPI Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style)
RLAPI Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *codepoints, int codepointCount); // Load font from memory buffer, fileType refers to extension: i.e. '.ttf' RLAPI Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *codepoints, int codepointCount); // Load font from memory buffer, fileType refers to extension: i.e. '.ttf'
RLAPI bool IsFontReady(Font font); // Check if a font is ready RLAPI bool IsFontReady(Font font); // Check if a font is ready
@ -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 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 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 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 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 RLAPI void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector2 size, Color tint); // Draw a billboard texture defined by source

View File

@ -360,10 +360,15 @@ typedef struct CoreData {
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
RLAPI const char *raylib_version = RAYLIB_VERSION; // raylib version exported symbol, required for some bindings 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) #if defined(SUPPORT_SCREEN_CAPTURE)
static int screenshotCounter = 0; // Screenshots counter static int screenshotCounter = 0; // Screenshots counter
#endif #endif
#if defined(SUPPORT_GIF_RECORDING) #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) // 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 // 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); rlglInit(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height);
isGpuReady = true; // Flag to note GPU has been initialized successfully
// Setup default viewport // Setup default viewport
SetupViewport(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height); SetupViewport(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height);
#if defined(SUPPORT_MODULE_RTEXT) && defined(SUPPORT_DEFAULT_FONT) #if defined(SUPPORT_MODULE_RTEXT)
// Load default font #if defined(SUPPORT_DEFAULT_FONT)
// WARNING: External function: Module required: rtext // Load default font
LoadFontDefault(); // WARNING: External function: Module required: rtext
#if defined(SUPPORT_MODULE_RSHAPES) LoadFontDefault();
// Set font white rectangle for shapes drawing, so shapes and text can be batched together #if defined(SUPPORT_MODULE_RSHAPES)
// WARNING: rshapes module is required, if not available, default internal white rectangle is used // Set font white rectangle for shapes drawing, so shapes and text can be batched together
Rectangle rec = GetFontDefault().recs[95]; // WARNING: rshapes module is required, if not available, default internal white rectangle is used
if (CORE.Window.flags & FLAG_MSAA_4X_HINT) 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 }); // 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 }
{ 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 }); // 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 #endif
#else #else
#if defined(SUPPORT_MODULE_RSHAPES) #if defined(SUPPORT_MODULE_RSHAPES)
@ -669,7 +677,6 @@ void InitWindow(int width, int height, const char *title)
#endif #endif
#endif #endif
CORE.Time.frameCounter = 0; CORE.Time.frameCounter = 0;
CORE.Window.shouldClose = false; CORE.Window.shouldClose = false;
@ -2707,8 +2714,8 @@ void PlayAutomationEvent(AutomationEvent event)
} break; } break;
case INPUT_MOUSE_WHEEL_MOTION: // param[0]: x delta, param[1]: y delta case INPUT_MOUSE_WHEEL_MOTION: // param[0]: x delta, param[1]: y delta
{ {
CORE.Input.Mouse.currentWheelMove.x = (float)event.params[0]; break; CORE.Input.Mouse.currentWheelMove.x = (float)event.params[0];
CORE.Input.Mouse.currentWheelMove.y = (float)event.params[1]; break; CORE.Input.Mouse.currentWheelMove.y = (float)event.params[1];
} break; } break;
case INPUT_TOUCH_UP: CORE.Input.Touch.currentTouchState[event.params[0]] = false; break; // param[0]: id case INPUT_TOUCH_UP: CORE.Input.Touch.currentTouchState[event.params[0]] = false; break; // param[0]: id
case INPUT_TOUCH_DOWN: CORE.Input.Touch.currentTouchState[event.params[0]] = true; break; // param[0]: id case INPUT_TOUCH_DOWN: CORE.Input.Touch.currentTouchState[event.params[0]] = true; break; // param[0]: id
@ -2745,6 +2752,8 @@ void PlayAutomationEvent(AutomationEvent event)
case ACTION_SETTARGETFPS: SetTargetFPS(event.params[0]); break; case ACTION_SETTARGETFPS: SetTargetFPS(event.params[0]); break;
default: break; default: break;
} }
TRACELOG(LOG_INFO, "AUTOMATION PLAY: Frame: %i | Event type: %i | Event parameters: %i, %i, %i", event.frame, event.type, event.params[0], event.params[1], event.params[2]);
} }
#endif #endif
} }

View File

@ -527,6 +527,10 @@ typedef enum {
RL_SHADER_UNIFORM_IVEC2, // Shader uniform type: ivec2 (2 int) RL_SHADER_UNIFORM_IVEC2, // Shader uniform type: ivec2 (2 int)
RL_SHADER_UNIFORM_IVEC3, // Shader uniform type: ivec3 (3 int) RL_SHADER_UNIFORM_IVEC3, // Shader uniform type: ivec3 (3 int)
RL_SHADER_UNIFORM_IVEC4, // Shader uniform type: ivec4 (4 int) RL_SHADER_UNIFORM_IVEC4, // Shader uniform type: ivec4 (4 int)
RL_SHADER_UNIFORM_UINT, // Shader uniform type: unsigned int
RL_SHADER_UNIFORM_UIVEC2, // Shader uniform type: uivec2 (2 unsigned int)
RL_SHADER_UNIFORM_UIVEC3, // Shader uniform type: uivec3 (3 unsigned int)
RL_SHADER_UNIFORM_UIVEC4, // Shader uniform type: uivec4 (4 unsigned int)
RL_SHADER_UNIFORM_SAMPLER2D // Shader uniform type: sampler2d RL_SHADER_UNIFORM_SAMPLER2D // Shader uniform type: sampler2d
} rlShaderUniformDataType; } rlShaderUniformDataType;
@ -665,7 +669,7 @@ RLAPI void rlDisableScissorTest(void); // Disable scissor test
RLAPI void rlScissor(int x, int y, int width, int height); // Scissor test RLAPI void rlScissor(int x, int y, int width, int height); // Scissor test
RLAPI void rlEnableWireMode(void); // Enable wire mode RLAPI void rlEnableWireMode(void); // Enable wire mode
RLAPI void rlEnablePointMode(void); // Enable point 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 void rlSetLineWidth(float width); // Set the line drawing width
RLAPI float rlGetLineWidth(void); // Get the line drawing width RLAPI float rlGetLineWidth(void); // Get the line drawing width
RLAPI void rlEnableSmoothLines(void); // Enable line aliasing RLAPI void rlEnableSmoothLines(void); // Enable line aliasing
@ -1949,6 +1953,7 @@ void rlEnableWireMode(void)
#endif #endif
} }
// Enable point mode
void rlEnablePointMode(void) void rlEnablePointMode(void)
{ {
#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33)
@ -1957,6 +1962,7 @@ void rlEnablePointMode(void)
glEnable(GL_PROGRAM_POINT_SIZE); glEnable(GL_PROGRAM_POINT_SIZE);
#endif #endif
} }
// Disable wire mode // Disable wire mode
void rlDisableWireMode(void) void rlDisableWireMode(void)
{ {
@ -4235,8 +4241,16 @@ void rlSetUniform(int locIndex, const void *value, int uniformType, int count)
case RL_SHADER_UNIFORM_IVEC2: glUniform2iv(locIndex, count, (int *)value); break; case RL_SHADER_UNIFORM_IVEC2: glUniform2iv(locIndex, count, (int *)value); break;
case RL_SHADER_UNIFORM_IVEC3: glUniform3iv(locIndex, count, (int *)value); break; case RL_SHADER_UNIFORM_IVEC3: glUniform3iv(locIndex, count, (int *)value); break;
case RL_SHADER_UNIFORM_IVEC4: glUniform4iv(locIndex, count, (int *)value); break; case RL_SHADER_UNIFORM_IVEC4: glUniform4iv(locIndex, count, (int *)value); break;
#if !defined(GRAPHICS_API_OPENGL_ES2)
case RL_SHADER_UNIFORM_UINT: glUniform1uiv(locIndex, count, (unsigned int *)value); break;
case RL_SHADER_UNIFORM_UIVEC2: glUniform2uiv(locIndex, count, (unsigned int *)value); break;
case RL_SHADER_UNIFORM_UIVEC3: glUniform3uiv(locIndex, count, (unsigned int *)value); break;
case RL_SHADER_UNIFORM_UIVEC4: glUniform4uiv(locIndex, count, (unsigned int *)value); break;
#endif
case RL_SHADER_UNIFORM_SAMPLER2D: glUniform1iv(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"); default: TRACELOG(RL_LOG_WARNING, "SHADER: Failed to set uniform value, data type not recognized");
// TODO: Support glUniform1uiv(), glUniform2uiv(), glUniform3uiv(), glUniform4uiv()
} }
#endif #endif
} }
@ -4411,14 +4425,14 @@ void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSi
// Get SSBO buffer size // Get SSBO buffer size
unsigned int rlGetShaderBufferSize(unsigned int id) unsigned int rlGetShaderBufferSize(unsigned int id)
{ {
GLint64 size = 0;
#if defined(GRAPHICS_API_OPENGL_43) #if defined(GRAPHICS_API_OPENGL_43)
GLint64 size = 0;
glBindBuffer(GL_SHADER_STORAGE_BUFFER, id); glBindBuffer(GL_SHADER_STORAGE_BUFFER, id);
glGetBufferParameteri64v(GL_SHADER_STORAGE_BUFFER, GL_BUFFER_SIZE, &size); glGetBufferParameteri64v(GL_SHADER_STORAGE_BUFFER, GL_BUFFER_SIZE, &size);
#endif
return (size > 0)? (unsigned int)size : 0; return (size > 0)? (unsigned int)size : 0;
#else
return 0;
#endif
} }
// Read SSBO buffer data (GPU->CPU) // Read SSBO buffer data (GPU->CPU)

View File

@ -2016,6 +2016,8 @@ static void ProcessMaterialsOBJ(Material *materials, tinyobj_material_t *mats, i
// NOTE: Uses default shader, which only supports MATERIAL_MAP_DIFFUSE // NOTE: Uses default shader, which only supports MATERIAL_MAP_DIFFUSE
materials[m] = LoadMaterialDefault(); materials[m] = LoadMaterialDefault();
if (mats == NULL) continue;
// Get default texture, in case no texture is defined // Get default texture, in case no texture is defined
// NOTE: rlgl default texture is a 1x1 pixel UNCOMPRESSED_R8G8B8A8 // NOTE: rlgl default texture is a 1x1 pixel UNCOMPRESSED_R8G8B8A8
materials[m].maps[MATERIAL_MAP_DIFFUSE].texture = (Texture2D){ rlGetTextureIdDefault(), 1, 1, 1, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 }; materials[m].maps[MATERIAL_MAP_DIFFUSE].texture = (Texture2D){ rlGetTextureIdDefault(), 1, 1, 1, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 };
@ -3631,6 +3633,30 @@ void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float
rlDisableWireMode(); 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 // Draw a billboard
void DrawBillboard(Camera camera, Texture2D texture, Vector3 position, float scale, Color tint) void DrawBillboard(Camera camera, Texture2D texture, Vector3 position, float scale, Color tint)
{ {
@ -4049,124 +4075,236 @@ static void BuildPoseFromParentJoints(BoneInfo *bones, int boneCount, Transform
// - the mesh is automatically triangulated by tinyobj // - the mesh is automatically triangulated by tinyobj
static Model LoadOBJ(const char *fileName) static Model LoadOBJ(const char *fileName)
{ {
tinyobj_attrib_t objAttributes = { 0 };
tinyobj_shape_t* objShapes = NULL;
unsigned int objShapeCount = 0;
tinyobj_material_t* objMaterials = NULL;
unsigned int objMaterialCount = 0;
Model model = { 0 }; Model model = { 0 };
model.transform = MatrixIdentity();
tinyobj_attrib_t attrib = { 0 }; char* fileText = LoadFileText(fileName);
tinyobj_shape_t *meshes = NULL;
unsigned int meshCount = 0;
tinyobj_material_t *materials = NULL; if (fileText == NULL)
unsigned int materialCount = 0;
char *fileText = LoadFileText(fileName);
if (fileText != NULL)
{ {
unsigned int dataSize = (unsigned int)strlen(fileText); TRACELOG(LOG_ERROR, "MODEL Unable to read obj file %s", fileName);
return model;
}
char currentDir[1024] = { 0 }; char currentDir[1024] = { 0 };
strcpy(currentDir, GetWorkingDirectory()); // Save current working directory strcpy(currentDir, GetWorkingDirectory()); // Save current working directory
const char *workingDir = GetDirectoryPath(fileName); // Switch to OBJ directory for material path correctness const char* workingDir = GetDirectoryPath(fileName); // Switch to OBJ directory for material path correctness
if (CHDIR(workingDir) != 0) if (CHDIR(workingDir) != 0)
{
TRACELOG(LOG_WARNING, "MODEL: [%s] Failed to change working directory", workingDir);
}
unsigned int dataSize = (unsigned int)strlen(fileText);
unsigned int flags = TINYOBJ_FLAG_TRIANGULATE;
int ret = tinyobj_parse_obj(&objAttributes, &objShapes, &objShapeCount, &objMaterials, &objMaterialCount, fileText, dataSize, flags);
if (ret != TINYOBJ_SUCCESS)
{
TRACELOG(LOG_ERROR, "MODEL Unable to read obj data %s", fileName);
return model;
}
UnloadFileText(fileText);
unsigned int faceVertIndex = 0;
unsigned int nextShape = 1;
int lastMaterial = -1;
unsigned int meshIndex = 0;
// count meshes
unsigned int nextShapeEnd = objAttributes.num_face_num_verts;
// see how many verts till the next shape
if (objShapeCount > 1) nextShapeEnd = objShapes[nextShape].face_offset;
// walk all the faces
for (unsigned int faceId = 0; faceId < objAttributes.num_faces; faceId++)
{
if (faceVertIndex >= nextShapeEnd)
{ {
TRACELOG(LOG_WARNING, "MODEL: [%s] Failed to change working directory", workingDir); // try to find the last vert in the next shape
nextShape++;
if (nextShape < objShapeCount) nextShapeEnd = objShapes[nextShape].face_offset;
else nextShapeEnd = objAttributes.num_face_num_verts; // this is actually the total number of face verts in the file, not faces
meshIndex++;
}
else if (lastMaterial != -1 && objAttributes.material_ids[faceId] != lastMaterial)
{
meshIndex++;// if this is a new material, we need to allocate a new mesh
} }
unsigned int flags = TINYOBJ_FLAG_TRIANGULATE; lastMaterial = objAttributes.material_ids[faceId];
int ret = tinyobj_parse_obj(&attrib, &meshes, &meshCount, &materials, &materialCount, fileText, dataSize, flags); faceVertIndex += objAttributes.face_num_verts[faceId];
}
if (ret != TINYOBJ_SUCCESS) TRACELOG(LOG_WARNING, "MODEL: [%s] Failed to load OBJ data", fileName); // allocate the base meshes and materials
else TRACELOG(LOG_INFO, "MODEL: [%s] OBJ data loaded successfully: %i meshes/%i materials", fileName, meshCount, materialCount); model.meshCount = meshIndex + 1;
model.meshes = (Mesh*)MemAlloc(sizeof(Mesh) * model.meshCount);
// WARNING: We are not splitting meshes by materials (previous implementation) if (objMaterialCount > 0)
// Depending on the provided OBJ that was not the best option and it just crashed {
// so, implementation was simplified to prioritize parsed meshes model.materialCount = objMaterialCount;
model.meshCount = meshCount; model.materials = (Material*)MemAlloc(sizeof(Material) * objMaterialCount);
}
else // we must allocate at least one material
{
model.materialCount = 1;
model.materials = (Material*)MemAlloc(sizeof(Material) * 1);
}
// Set number of materials available model.meshMaterial = (int*)MemAlloc(sizeof(int) * model.meshCount);
// NOTE: There could be more materials available than meshes but it will be resolved at
// model.meshMaterial, just assigning the right material to corresponding mesh // see how many verts are in each mesh
model.materialCount = materialCount; unsigned int* localMeshVertexCounts = (unsigned int*)MemAlloc(sizeof(unsigned int) * model.meshCount);
if (model.materialCount == 0)
faceVertIndex = 0;
nextShapeEnd = objAttributes.num_face_num_verts;
lastMaterial = -1;
meshIndex = 0;
unsigned int localMeshVertexCount = 0;
nextShape = 1;
if (objShapeCount > 1)
nextShapeEnd = objShapes[nextShape].face_offset;
// walk all the faces
for (unsigned int faceId = 0; faceId < objAttributes.num_faces; faceId++)
{
bool newMesh = false; // do we need a new mesh?
if (faceVertIndex >= nextShapeEnd)
{ {
model.materialCount = 1; // try to find the last vert in the next shape
TRACELOG(LOG_INFO, "MODEL: No materials provided, setting one default material for all meshes"); nextShape++;
if (nextShape < objShapeCount) nextShapeEnd = objShapes[nextShape].face_offset;
else nextShapeEnd = objAttributes.num_face_num_verts; // this is actually the total number of face verts in the file, not faces
newMesh = true;
}
else if (lastMaterial != -1 && objAttributes.material_ids[faceId] != lastMaterial)
{
newMesh = true;
} }
// Init model meshes and materials lastMaterial = objAttributes.material_ids[faceId];
model.meshes = (Mesh *)RL_CALLOC(model.meshCount, sizeof(Mesh));
model.meshMaterial = (int *)RL_CALLOC(model.meshCount, sizeof(int)); // Material index assigned to each mesh
model.materials = (Material *)RL_CALLOC(model.materialCount, sizeof(Material));
// Process each provided mesh if (newMesh)
for (int i = 0; i < model.meshCount; i++)
{ {
// WARNING: We need to calculate the mesh triangles manually using meshes[i].face_offset localMeshVertexCounts[meshIndex] = localMeshVertexCount;
// because in case of triangulated quads, meshes[i].length actually report quads,
// despite the triangulation that is efectively considered on attrib.num_faces
unsigned int tris = 0;
if (i == model.meshCount - 1) tris = attrib.num_faces - meshes[i].face_offset;
else tris = meshes[i + 1].face_offset;
model.meshes[i].vertexCount = tris*3; localMeshVertexCount = 0;
model.meshes[i].triangleCount = tris; // Face count (triangulated) meshIndex++;
model.meshes[i].vertices = (float *)RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float));
model.meshes[i].texcoords = (float *)RL_CALLOC(model.meshes[i].vertexCount*2, sizeof(float));
model.meshes[i].normals = (float *)RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float));
model.meshMaterial[i] = 0; // By default, assign material 0 to each mesh
// Process all mesh faces
for (unsigned int face = 0, f = meshes[i].face_offset, v = 0, vt = 0, vn = 0; face < tris; face++, f++, v += 3, vt += 3, vn += 3)
{
// Get indices for the face
tinyobj_vertex_index_t idx0 = attrib.faces[f*3 + 0];
tinyobj_vertex_index_t idx1 = attrib.faces[f*3 + 1];
tinyobj_vertex_index_t idx2 = attrib.faces[f*3 + 2];
// Fill vertices buffer (float) using vertex index of the face
for (int n = 0; n < 3; n++) { model.meshes[i].vertices[v*3 + n] = attrib.vertices[idx0.v_idx*3 + n]; }
for (int n = 0; n < 3; n++) { model.meshes[i].vertices[(v + 1)*3 + n] = attrib.vertices[idx1.v_idx*3 + n]; }
for (int n = 0; n < 3; n++) { model.meshes[i].vertices[(v + 2)*3 + n] = attrib.vertices[idx2.v_idx*3 + n]; }
if (attrib.num_texcoords > 0)
{
// Fill texcoords buffer (float) using vertex index of the face
// NOTE: Y-coordinate must be flipped upside-down
model.meshes[i].texcoords[vt*2 + 0] = attrib.texcoords[idx0.vt_idx*2 + 0];
model.meshes[i].texcoords[vt*2 + 1] = 1.0f - attrib.texcoords[idx0.vt_idx*2 + 1];
model.meshes[i].texcoords[(vt + 1)*2 + 0] = attrib.texcoords[idx1.vt_idx*2 + 0];
model.meshes[i].texcoords[(vt + 1)*2 + 1] = 1.0f - attrib.texcoords[idx1.vt_idx*2 + 1];
model.meshes[i].texcoords[(vt + 2)*2 + 0] = attrib.texcoords[idx2.vt_idx*2 + 0];
model.meshes[i].texcoords[(vt + 2)*2 + 1] = 1.0f - attrib.texcoords[idx2.vt_idx*2 + 1];
}
if (attrib.num_normals > 0)
{
// Fill normals buffer (float) using vertex index of the face
for (int n = 0; n < 3; n++) { model.meshes[i].normals[vn*3 + n] = attrib.normals[idx0.vn_idx*3 + n]; }
for (int n = 0; n < 3; n++) { model.meshes[i].normals[(vn + 1)*3 + n] = attrib.normals[idx1.vn_idx*3 + n]; }
for (int n = 0; n < 3; n++) { model.meshes[i].normals[(vn + 2)*3 + n] = attrib.normals[idx2.vn_idx*3 + n]; }
}
}
} }
// Init model materials faceVertIndex += objAttributes.face_num_verts[faceId];
if (materialCount > 0) ProcessMaterialsOBJ(model.materials, materials, materialCount); localMeshVertexCount += objAttributes.face_num_verts[faceId];
else model.materials[0] = LoadMaterialDefault(); // Set default material for the mesh }
localMeshVertexCounts[meshIndex] = localMeshVertexCount;
tinyobj_attrib_free(&attrib); for (int i = 0; i < model.meshCount; i++)
tinyobj_shapes_free(meshes, model.meshCount); {
tinyobj_materials_free(materials, materialCount); // allocate the buffers for each mesh
unsigned int vertexCount = localMeshVertexCounts[i];
UnloadFileText(fileText); model.meshes[i].vertexCount = vertexCount;
model.meshes[i].triangleCount = vertexCount / 3;
// Restore current working directory model.meshes[i].vertices = (float*)MemAlloc(sizeof(float) * vertexCount * 3);
if (CHDIR(currentDir) != 0) model.meshes[i].normals = (float*)MemAlloc(sizeof(float) * vertexCount * 3);
model.meshes[i].texcoords = (float*)MemAlloc(sizeof(float) * vertexCount * 2);
model.meshes[i].colors = (unsigned char*)MemAlloc(sizeof(unsigned char) * vertexCount * 4);
}
MemFree(localMeshVertexCounts);
localMeshVertexCounts = NULL;
// fill meshes
faceVertIndex = 0;
nextShapeEnd = objAttributes.num_face_num_verts;
// see how many verts till the next shape
nextShape = 1;
if (objShapeCount > 1) nextShapeEnd = objShapes[nextShape].face_offset;
lastMaterial = -1;
meshIndex = 0;
localMeshVertexCount = 0;
// walk all the faces
for (unsigned int faceId = 0; faceId < objAttributes.num_faces; faceId++)
{
bool newMesh = false; // do we need a new mesh?
if (faceVertIndex >= nextShapeEnd)
{ {
TRACELOG(LOG_WARNING, "MODEL: [%s] Failed to change working directory", currentDir); // try to find the last vert in the next shape
nextShape++;
if (nextShape < objShapeCount) nextShapeEnd = objShapes[nextShape].face_offset;
else nextShapeEnd = objAttributes.num_face_num_verts; // this is actually the total number of face verts in the file, not faces
newMesh = true;
} }
// if this is a new material, we need to allocate a new mesh
if (lastMaterial != -1 && objAttributes.material_ids[faceId] != lastMaterial) newMesh = true;
lastMaterial = objAttributes.material_ids[faceId];;
if (newMesh)
{
localMeshVertexCount = 0;
meshIndex++;
}
int matId = 0;
if (lastMaterial >= 0 && lastMaterial < (int)objMaterialCount)
matId = lastMaterial;
model.meshMaterial[meshIndex] = matId;
for (int f = 0; f < objAttributes.face_num_verts[faceId]; f++)
{
int vertIndex = objAttributes.faces[faceVertIndex].v_idx;
int normalIndex = objAttributes.faces[faceVertIndex].vn_idx;
int texcordIndex = objAttributes.faces[faceVertIndex].vt_idx;
for (int i = 0; i < 3; i++)
model.meshes[meshIndex].vertices[localMeshVertexCount * 3 + i] = objAttributes.vertices[vertIndex * 3 + i];
for (int i = 0; i < 3; i++)
model.meshes[meshIndex].normals[localMeshVertexCount * 3 + i] = objAttributes.normals[normalIndex * 3 + i];
for (int i = 0; i < 2; i++)
model.meshes[meshIndex].texcoords[localMeshVertexCount * 2 + i] = objAttributes.texcoords[texcordIndex * 2 + i];
model.meshes[meshIndex].texcoords[localMeshVertexCount * 2 + 1] = 1.0f - model.meshes[meshIndex].texcoords[localMeshVertexCount * 2 + 1];
for (int i = 0; i < 4; i++)
model.meshes[meshIndex].colors[localMeshVertexCount * 4 + i] = 255;
faceVertIndex++;
localMeshVertexCount++;
}
}
if (objMaterialCount > 0) ProcessMaterialsOBJ(model.materials, objMaterials, objMaterialCount);
else model.materials[0] = LoadMaterialDefault(); // Set default material for the mesh
tinyobj_attrib_free(&objAttributes);
tinyobj_shapes_free(objShapes, objShapeCount);
tinyobj_materials_free(objMaterials, objMaterialCount);
for (int i = 0; i < model.meshCount; i++)
UploadMesh(model.meshes + i, true);
// Restore current working directory
if (CHDIR(currentDir) != 0)
{
TRACELOG(LOG_WARNING, "MODEL: [%s] Failed to change working directory", currentDir);
} }
return model; return model;

View File

@ -430,17 +430,16 @@ void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float
} }
// Draw a gradient-filled circle // Draw a gradient-filled circle
// NOTE: Gradient goes from center (color1) to border (color2) void DrawCircleGradient(int centerX, int centerY, float radius, Color inner, Color outer)
void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2)
{ {
rlBegin(RL_TRIANGLES); rlBegin(RL_TRIANGLES);
for (int i = 0; i < 360; i += 10) for (int i = 0; i < 360; i += 10)
{ {
rlColor4ub(color1.r, color1.g, color1.b, color1.a); rlColor4ub(inner.r, inner.g, inner.b, inner.a);
rlVertex2f((float)centerX, (float)centerY); rlVertex2f((float)centerX, (float)centerY);
rlColor4ub(color2.r, color2.g, color2.b, color2.a); rlColor4ub(outer.r, outer.g, outer.b, outer.a);
rlVertex2f((float)centerX + cosf(DEG2RAD*(i + 10))*radius, (float)centerY + sinf(DEG2RAD*(i + 10))*radius); rlVertex2f((float)centerX + cosf(DEG2RAD*(i + 10))*radius, (float)centerY + sinf(DEG2RAD*(i + 10))*radius);
rlColor4ub(color2.r, color2.g, color2.b, color2.a); rlColor4ub(outer.r, outer.g, outer.b, outer.a);
rlVertex2f((float)centerX + cosf(DEG2RAD*i)*radius, (float)centerY + sinf(DEG2RAD*i)*radius); rlVertex2f((float)centerX + cosf(DEG2RAD*i)*radius, (float)centerY + sinf(DEG2RAD*i)*radius);
} }
rlEnd(); rlEnd();
@ -772,22 +771,19 @@ void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color
} }
// Draw a vertical-gradient-filled rectangle // Draw a vertical-gradient-filled rectangle
// NOTE: Gradient goes from bottom (color1) to top (color2) void DrawRectangleGradientV(int posX, int posY, int width, int height, Color top, Color bottom)
void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2)
{ {
DrawRectangleGradientEx((Rectangle){ (float)posX, (float)posY, (float)width, (float)height }, color1, color2, color2, color1); DrawRectangleGradientEx((Rectangle){ (float)posX, (float)posY, (float)width, (float)height }, top, bottom, bottom, top);
} }
// Draw a horizontal-gradient-filled rectangle // Draw a horizontal-gradient-filled rectangle
// NOTE: Gradient goes from bottom (color1) to top (color2) void DrawRectangleGradientH(int posX, int posY, int width, int height, Color left, Color right)
void DrawRectangleGradientH(int posX, int posY, int width, int height, Color color1, Color color2)
{ {
DrawRectangleGradientEx((Rectangle){ (float)posX, (float)posY, (float)width, (float)height }, color1, color1, color2, color2); DrawRectangleGradientEx((Rectangle){ (float)posX, (float)posY, (float)width, (float)height }, left, left, right, right);
} }
// Draw a gradient-filled rectangle // Draw a gradient-filled rectangle
// NOTE: Colors refer to corners, starting at top-lef corner and counter-clockwise void DrawRectangleGradientEx(Rectangle rec, Color topLeft, Color bottomLeft, Color topRight, Color bottomRight)
void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4)
{ {
rlSetTexture(GetShapesTexture().id); rlSetTexture(GetShapesTexture().id);
Rectangle shapeRect = GetShapesTextureRectangle(); Rectangle shapeRect = GetShapesTextureRectangle();
@ -796,19 +792,19 @@ void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3,
rlNormal3f(0.0f, 0.0f, 1.0f); rlNormal3f(0.0f, 0.0f, 1.0f);
// NOTE: Default raylib font character 95 is a white square // NOTE: Default raylib font character 95 is a white square
rlColor4ub(col1.r, col1.g, col1.b, col1.a); rlColor4ub(topLeft.r, topLeft.g, topLeft.b, topLeft.a);
rlTexCoord2f(shapeRect.x/texShapes.width, shapeRect.y/texShapes.height); rlTexCoord2f(shapeRect.x/texShapes.width, shapeRect.y/texShapes.height);
rlVertex2f(rec.x, rec.y); rlVertex2f(rec.x, rec.y);
rlColor4ub(col2.r, col2.g, col2.b, col2.a); rlColor4ub(bottomLeft.r, bottomLeft.g, bottomLeft.b, bottomLeft.a);
rlTexCoord2f(shapeRect.x/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); rlTexCoord2f(shapeRect.x/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height);
rlVertex2f(rec.x, rec.y + rec.height); rlVertex2f(rec.x, rec.y + rec.height);
rlColor4ub(col3.r, col3.g, col3.b, col3.a); rlColor4ub(topRight.r, topRight.g, topRight.b, topRight.a);
rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height);
rlVertex2f(rec.x + rec.width, rec.y + rec.height); rlVertex2f(rec.x + rec.width, rec.y + rec.height);
rlColor4ub(col4.r, col4.g, col4.b, col4.a); rlColor4ub(bottomRight.r, bottomRight.g, bottomRight.b, bottomRight.a);
rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, shapeRect.y/texShapes.height); rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, shapeRect.y/texShapes.height);
rlVertex2f(rec.x + rec.width, rec.y); rlVertex2f(rec.x + rec.width, rec.y);
rlEnd(); rlEnd();

View File

@ -124,6 +124,7 @@
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Global variables // Global variables
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
extern bool isGpuReady;
#if defined(SUPPORT_DEFAULT_FONT) #if defined(SUPPORT_DEFAULT_FONT)
// Default font provided by raylib // Default font provided by raylib
// NOTE: Default font is loaded on InitWindow() and disposed on CloseWindow() [module: core] // NOTE: Default font is loaded on InitWindow() and disposed on CloseWindow() [module: core]
@ -252,7 +253,7 @@ extern void LoadFontDefault(void)
counter++; counter++;
} }
defaultFont.texture = LoadTextureFromImage(imFont); if (isGpuReady) defaultFont.texture = LoadTextureFromImage(imFont);
// Reconstruct charSet using charsWidth[], charsHeight, charsDivisor, glyphCount // Reconstruct charSet using charsWidth[], charsHeight, charsDivisor, glyphCount
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@ -308,7 +309,7 @@ extern void LoadFontDefault(void)
extern void UnloadFontDefault(void) extern void UnloadFontDefault(void)
{ {
for (int i = 0; i < defaultFont.glyphCount; i++) UnloadImage(defaultFont.glyphs[i].image); 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.glyphs);
RL_FREE(defaultFont.recs); RL_FREE(defaultFont.recs);
} }
@ -362,11 +363,14 @@ Font LoadFont(const char *fileName)
UnloadImage(image); UnloadImage(image);
} }
if (font.texture.id == 0) TRACELOG(LOG_WARNING, "FONT: [%s] Failed to load font texture -> Using default font", fileName); if (isGpuReady)
else
{ {
SetTextureFilter(font.texture, TEXTURE_FILTER_POINT); // By default, we set point filter (the best performance) if (font.texture.id == 0) TRACELOG(LOG_WARNING, "FONT: [%s] Failed to load font texture -> Using default font", fileName);
TRACELOG(LOG_INFO, "FONT: Data loaded successfully (%i pixel size | %i glyphs)", FONT_TTF_DEFAULT_SIZE, FONT_TTF_DEFAULT_NUMCHARS); 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; return font;
@ -487,7 +491,7 @@ Font LoadFontFromImage(Image image, Color key, int firstChar)
}; };
// Set font with all data parsed from image // 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.glyphCount = index;
font.glyphPadding = 0; font.glyphPadding = 0;
@ -556,7 +560,7 @@ Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int
font.glyphPadding = FONT_TTF_DEFAULT_CHARS_PADDING; font.glyphPadding = FONT_TTF_DEFAULT_CHARS_PADDING;
Image atlas = GenImageFontAtlas(font.glyphs, &font.recs, font.glyphCount, font.baseSize, font.glyphPadding, 0); 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() // Update glyphs[i].image to use alpha, required to be used on ImageDrawText()
for (int i = 0; i < font.glyphCount; i++) 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 // Check if a font is ready
bool IsFontReady(Font font) 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.baseSize > 0) && // Validate font size
(font.glyphCount > 0) && // Validate font contains some glyph (font.glyphCount > 0) && // Validate font contains some glyph
(font.recs != NULL) && // Validate font recs defining glyphs on texture atlas (font.recs != NULL) && // Validate font recs defining glyphs on texture atlas
@ -673,6 +677,8 @@ GlyphInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSiz
{ {
stbtt_GetCodepointHMetrics(&fontInfo, ch, &chars[i].advanceX, NULL); stbtt_GetCodepointHMetrics(&fontInfo, ch, &chars[i].advanceX, NULL);
chars[i].advanceX = (int)((float)chars[i].advanceX*scaleFactor); chars[i].advanceX = (int)((float)chars[i].advanceX*scaleFactor);
if (chh > fontSize) TRACELOG(LOG_WARNING, "FONT: Character [0x%08x] size is bigger than expected font size", ch);
// Load characters images // Load characters images
chars[i].image.width = chw; chars[i].image.width = chw;
@ -946,7 +952,7 @@ void UnloadFont(Font font)
if (font.texture.id != GetFontDefault().texture.id) if (font.texture.id != GetFontDefault().texture.id)
{ {
UnloadFontData(font.glyphs, font.glyphCount); UnloadFontData(font.glyphs, font.glyphCount);
UnloadTexture(font.texture); if (isGpuReady) UnloadTexture(font.texture);
RL_FREE(font.recs); RL_FREE(font.recs);
TRACELOGD("FONT: Unloaded font data from RAM and VRAM"); TRACELOGD("FONT: Unloaded font data from RAM and VRAM");
@ -1066,7 +1072,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); byteCount += sprintf(txtData + byteCount, " Image imFont = { fontImageData_%s, %i, %i, 1, %i };\n\n", styleName, image.width, image.height, image.format);
#endif #endif
byteCount += sprintf(txtData + byteCount, " // Load texture from image\n"); 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) #if defined(SUPPORT_COMPRESSED_FONT_ATLAS)
byteCount += sprintf(txtData + byteCount, " UnloadImage(imFont); // Uncompressed data can be unloaded from memory\n\n"); byteCount += sprintf(txtData + byteCount, " UnloadImage(imFont); // Uncompressed data can be unloaded from memory\n\n");
#endif #endif
@ -1277,7 +1283,7 @@ Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing
{ {
Vector2 textSize = { 0 }; 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 size = TextLength(text); // Get size in bytes of text
int tempByteCounter = 0; // Used to count longer text line num chars int tempByteCounter = 0; // Used to count longer text line num chars
@ -1467,8 +1473,7 @@ float TextToFloat(const char *text)
int i = 0; int i = 0;
for (; ((text[i] >= '0') && (text[i] <= '9')); i++) value = value*10.0f + (float)(text[i] - '0'); for (; ((text[i] >= '0') && (text[i] <= '9')); i++) value = value*10.0f + (float)(text[i] - '0');
if (text[i++] != '.') value *= sign; if (text[i++] == '.')
else
{ {
float divisor = 10.0f; float divisor = 10.0f;
for (; ((text[i] >= '0') && (text[i] <= '9')); i++) for (; ((text[i] >= '0') && (text[i] <= '9')); i++)
@ -1478,7 +1483,7 @@ float TextToFloat(const char *text)
} }
} }
return value; return value*sign;
} }
#if defined(SUPPORT_TEXT_MANIPULATION) #if defined(SUPPORT_TEXT_MANIPULATION)
@ -2258,7 +2263,7 @@ static Font LoadBMFont(const char *fileName)
RL_FREE(imFonts); RL_FREE(imFonts);
font.texture = LoadTextureFromImage(fullFont); if (isGpuReady) font.texture = LoadTextureFromImage(fullFont);
// Fill font characters info data // Fill font characters info data
font.baseSize = fontSize; font.baseSize = fontSize;
@ -2300,7 +2305,7 @@ static Font LoadBMFont(const char *fileName)
UnloadImage(fullFont); UnloadImage(fullFont);
UnloadFileText(fileText); UnloadFileText(fileText);
if (font.texture.id == 0) if (isGpuReady && (font.texture.id == 0))
{ {
UnloadFont(font); UnloadFont(font);
font = GetFontDefault(); font = GetFontDefault();

View File

@ -371,7 +371,7 @@ Image LoadImageSvg(const char *fileNameOrString, int width, int height)
if (isSvgStringValid) if (isSvgStringValid)
{ {
struct NSVGimage *svgImage = nsvgParse(fileData, "px", 96.0f); struct NSVGimage *svgImage = nsvgParse((char *)fileData, "px", 96.0f);
unsigned char *img = RL_MALLOC(width*height*4); unsigned char *img = RL_MALLOC(width*height*4);
@ -404,7 +404,7 @@ Image LoadImageSvg(const char *fileNameOrString, int width, int height)
nsvgDeleteRasterizer(rast); nsvgDeleteRasterizer(rast);
} }
if (isSvgStringValid && (fileData != fileNameOrString)) UnloadFileData(fileData); if (isSvgStringValid && (fileData != (unsigned char *)fileNameOrString)) UnloadFileData(fileData);
} }
#else #else
TRACELOG(LOG_WARNING, "SVG image support not enabled, image can not be loaded"); TRACELOG(LOG_WARNING, "SVG image support not enabled, image can not be loaded");
@ -611,7 +611,7 @@ Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, i
(fileData[2] == 'v') && (fileData[2] == 'v') &&
(fileData[3] == 'g')) (fileData[3] == 'g'))
{ {
struct NSVGimage *svgImage = nsvgParse(fileData, "px", 96.0f); struct NSVGimage *svgImage = nsvgParse((char *)fileData, "px", 96.0f);
unsigned char *img = RL_MALLOC(svgImage->width*svgImage->height*4); unsigned char *img = RL_MALLOC(svgImage->width*svgImage->height*4);
// Rasterize // Rasterize
@ -1112,6 +1112,7 @@ Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float
{ {
Color *pixels = (Color *)RL_MALLOC(width*height*sizeof(Color)); Color *pixels = (Color *)RL_MALLOC(width*height*sizeof(Color));
float aspectRatio = (float)width / (float)height;
for (int y = 0; y < height; y++) for (int y = 0; y < height; y++)
{ {
for (int x = 0; x < width; x++) for (int x = 0; x < width; x++)
@ -1119,6 +1120,10 @@ Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float
float nx = (float)(x + offsetX)*(scale/(float)width); float nx = (float)(x + offsetX)*(scale/(float)width);
float ny = (float)(y + offsetY)*(scale/(float)height); float ny = (float)(y + offsetY)*(scale/(float)height);
// Apply aspect ratio compensation to wider side
if (width > height) nx *= aspectRatio;
else ny /= aspectRatio;
// Basic perlin noise implementation (not used) // Basic perlin noise implementation (not used)
//float p = (stb_perlin_noise3(nx, ny, 0.0f, 0, 0, 0); //float p = (stb_perlin_noise3(nx, ny, 0.0f, 0, 0, 0);