From e08fc8ab808881ea793293804a9439fcd15152bb Mon Sep 17 00:00:00 2001 From: luis605 Date: Wed, 26 Mar 2025 16:59:05 +0000 Subject: [PATCH 01/22] Added new example - [shader] render depth texture --- .../resources/shaders/glsl100/depth.fs | 35 ++-- .../resources/shaders/glsl330/depth.fs | 32 ++-- examples/shaders/shaders_view_depth.c | 157 ++++++++++++++++++ 3 files changed, 183 insertions(+), 41 deletions(-) create mode 100644 examples/shaders/shaders_view_depth.c diff --git a/examples/shaders/resources/shaders/glsl100/depth.fs b/examples/shaders/resources/shaders/glsl100/depth.fs index e638e81d1..cdd45f17f 100644 --- a/examples/shaders/resources/shaders/glsl100/depth.fs +++ b/examples/shaders/resources/shaders/glsl100/depth.fs @@ -1,26 +1,19 @@ #version 100 -precision mediump float; +in vec2 fragTexCoord; +out vec4 finalColor; +uniform sampler2D depthTexture; -// Input vertex attributes (from vertex shader) -varying vec2 fragTexCoord; -varying vec4 fragColor; - -// Input uniform values -uniform sampler2D texture0; // Depth texture -uniform vec4 colDiffuse; - -// NOTE: Add your custom variables here - -void main() +float linearizeDepth(float depth) { - float zNear = 0.01; // camera z near - float zFar = 10.0; // camera z far - float z = texture2D(texture0, fragTexCoord).x; + float n = 0.1; // near plane + float f = 100.0; // far plane + return (2.0 * n) / (f + n - depth * (f - n)); +} - // Linearize depth value - float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear)); - - // Calculate final fragment color - gl_FragColor = vec4(depth, depth, depth, 1.0); -} \ No newline at end of file +void main() { + vec2 flippedTexCoord = vec2(fragTexCoord.x, 1.0 - fragTexCoord.y); + float depth = texture(depthTexture, flippedTexCoord).r; + float linearDepth = linearizeDepth(depth); + finalColor = vec4(vec3(linearDepth), 1.0); +} diff --git a/examples/shaders/resources/shaders/glsl330/depth.fs b/examples/shaders/resources/shaders/glsl330/depth.fs index 43e30f9be..ccda3111b 100644 --- a/examples/shaders/resources/shaders/glsl330/depth.fs +++ b/examples/shaders/resources/shaders/glsl330/depth.fs @@ -1,27 +1,19 @@ #version 330 -// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; -in vec4 fragColor; - -// Input uniform values -uniform sampler2D texture0; // Depth texture -uniform vec4 colDiffuse; - -// Output fragment color out vec4 finalColor; +uniform sampler2D depthTexture; -// NOTE: Add your custom variables here - -void main() +float linearizeDepth(float depth) { - float zNear = 0.01; // camera z near - float zFar = 10.0; // camera z far - float z = texture(texture0, fragTexCoord).x; + float n = 0.1; // near plane + float f = 100.0; // far plane + return (2.0 * n) / (f + n - depth * (f - n)); +} - // Linearize depth value - float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear)); - - // Calculate final fragment color - finalColor = vec4(depth, depth, depth, 1.0); -} \ No newline at end of file +void main() { + vec2 flippedTexCoord = vec2(fragTexCoord.x, 1.0 - fragTexCoord.y); + float depth = texture(depthTexture, flippedTexCoord).r; + float linearDepth = linearizeDepth(depth); + finalColor = vec4(vec3(linearDepth), 1.0); +} diff --git a/examples/shaders/shaders_view_depth.c b/examples/shaders/shaders_view_depth.c new file mode 100644 index 000000000..fa5393280 --- /dev/null +++ b/examples/shaders/shaders_view_depth.c @@ -0,0 +1,157 @@ +/******************************************************************************************* +* +* raylib [shader] example - render depth texture +* +* Example complexity rating: [★★★☆] 3/4 +* +* Example originally created with raylib 5.6-dev, last time updated with raylib 5.6-dev +* +* Example contributed by Luís Almeida (@luis605) +* +* 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) 2025 Luís Almeida (@luis605) +* +********************************************************************************************/ + +#include "raylib.h" +#include "rlgl.h" + +#if defined(PLATFORM_DESKTOP) + #define GLSL_VERSION 330 +#else // PLATFORM_ANDROID, PLATFORM_WEB + #define GLSL_VERSION 100 +#endif + +RenderTexture2D LoadRenderTextureWithDepth(int width, int height); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 600; + + InitWindow(screenWidth, screenHeight, "raylib [shader] example - render depth texture"); + + // Load camera + Camera camera = { 0 }; + camera.position = (Vector3){ 4.0f, 1.0f, 5.0f }; + camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; + camera.fovy = 45.0f; + camera.projection = CAMERA_PERSPECTIVE; + + // Load an empty render texture with a depth texture + RenderTexture2D target = LoadRenderTextureWithDepth(screenWidth, screenHeight); + + // Load depth shader and get depth texture shader location + Shader depthShader = LoadShader(0, TextFormat("resources/shaders/glsl%i/depth.fs", GLSL_VERSION)); + int depthLoc = GetShaderLocation(depthShader, "depthTexture"); + + // Load models + Model cube = LoadModelFromMesh(GenMeshCube(1.0f, 1.0f, 1.0f)); + Model floor = LoadModelFromMesh(GenMeshPlane(20.0f, 20.0f, 1, 1)); + + DisableCursor(); // Limit cursor to relative movement inside the window + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + UpdateCamera(&camera, CAMERA_FREE); + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginTextureMode(target); + + ClearBackground(WHITE); + + BeginMode3D(camera); + + DrawModel(cube, (Vector3){ 0.0f, 0.0f, 0.0f }, 3.0f, YELLOW); + DrawModel(floor, (Vector3){ 10.0f, 0.0f, 2.0f }, 2.0f, RED); + + EndMode3D(); + + EndTextureMode(); + + BeginDrawing(); + + BeginShaderMode(depthShader); + + SetShaderValueTexture(depthShader, depthLoc, target.depth); + DrawTexture(target.depth, 0, 0, WHITE); + + EndShaderMode(); + + DrawRectangle( 10, 10, 320, 93, Fade(SKYBLUE, 0.5f)); + DrawRectangleLines( 10, 10, 320, 93, BLUE); + + DrawText("Camera Controls:", 20, 20, 10, BLACK); + DrawText("- WASD to move", 40, 40, 10, DARKGRAY); + DrawText("- Mouse Wheel Pressed to Pan", 40, 60, 10, DARKGRAY); + DrawText("- Z to zoom to (0, 0, 0)", 40, 80, 10, DARKGRAY); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadModel(cube); // Unload model + UnloadModel(floor); // Unload model + UnloadRenderTexture(target); // Unload render texture + UnloadShader(depthShader); // Unload shader + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + return 0; +} + +RenderTexture2D LoadRenderTextureWithDepth(int width, int height) +{ + RenderTexture2D target = {0}; + + target.id = rlLoadFramebuffer(); // Load an empty framebuffer + + if (target.id > 0) + { + rlEnableFramebuffer(target.id); + + // Create color texture (default to RGBA) + target.texture.id = rlLoadTexture(0, width, height, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1); + target.texture.width = width; + target.texture.height = height; + target.texture.format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8; + target.texture.mipmaps = 1; + + // Create depth texture + target.depth.id = rlLoadTextureDepth(width, height, false); + target.depth.width = width; + target.depth.height = height; + target.depth.format = 19; //DEPTH_COMPONENT_24BIT? THIS DOESN'T EXIST IN RAYLIB + target.depth.mipmaps = 1; + + // Attach color texture and depth texture to FBO + rlFramebufferAttach(target.id, target.texture.id, RL_ATTACHMENT_COLOR_CHANNEL0, RL_ATTACHMENT_TEXTURE2D, 0); + rlFramebufferAttach(target.id, target.depth.id, RL_ATTACHMENT_DEPTH, RL_ATTACHMENT_TEXTURE2D, 0); + + // Check if fbo is complete with attachments (valid) + if (rlFramebufferComplete(target.id)) TRACELOG(LOG_INFO, "FBO: [ID %i] Framebuffer object created successfully", target.id); + + rlDisableFramebuffer(); + } + else TRACELOG(LOG_WARNING, "FBO: Framebuffer object can not be created"); + + return target; +} \ No newline at end of file From eeda7a4b82a05d7ee40b0d891820e435536ed139 Mon Sep 17 00:00:00 2001 From: luis605 Date: Wed, 26 Mar 2025 17:41:04 +0000 Subject: [PATCH 02/22] Added shaders_view_depth example to the build system --- examples/CMakeLists.txt | 3 ++- examples/Makefile | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index f77ece4c0..135db49f5 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -90,13 +90,14 @@ if (${PLATFORM} MATCHES "Android") list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_custom_uniform.c) list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_model_shader.c) + list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_view_depth.c) list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_postprocessing.c) list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_raymarching.c) list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_palette_switch.c) list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_basic_lighting.c) elseif (${PLATFORM} MATCHES "Web") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os") # Since WASM is used, ALLOW_MEMORY_GROWTH has no extra overheads set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s WASM=1 -s ASYNCIFY -s ALLOW_MEMORY_GROWTH=1 --shell-file ${CMAKE_SOURCE_DIR}/src/shell.html") set(CMAKE_EXECUTABLE_SUFFIX ".html") diff --git a/examples/Makefile b/examples/Makefile index 6a859eb5f..504b795a7 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -232,7 +232,7 @@ CFLAGS = -Wall -std=c99 -D_DEFAULT_SOURCE -Wno-missing-braces -Wunused-result ifeq ($(BUILD_MODE),DEBUG) CFLAGS += -g -D_DEBUG -else +else ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) ifeq ($(BUILD_WEB_ASYNCIFY),TRUE) CFLAGS += -O3 @@ -341,12 +341,12 @@ ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_R # --source-map-base # allow debugging in browser with source map # --shell-file shell.html # define a custom shell .html and output extension LDFLAGS += -sTOTAL_MEMORY=$(BUILD_WEB_HEAP_SIZE) -sFORCE_FILESYSTEM=1 -sMINIFY_HTML=0 - + # Using GLFW3 library (instead of RGFW) ifeq ($(TARGET_PLATFORM),PLATFORM_WEB) LDFLAGS += -sUSE_GLFW=3 endif - + # Build using asyncify ifeq ($(BUILD_WEB_ASYNCIFY),TRUE) LDFLAGS += -sASYNCIFY @@ -628,6 +628,7 @@ SHADERS = \ shaders/shaders_lightmap \ shaders/shaders_mesh_instancing \ shaders/shaders_model_shader \ + shaders/shaders_view_depth \ shaders/shaders_multi_sample2d \ shaders/shaders_palette_switch \ shaders/shaders_postprocessing \ From 8ec52e3b2554b2d0058f851e66f33a686660853b Mon Sep 17 00:00:00 2001 From: luis605 Date: Wed, 26 Mar 2025 19:47:45 +0000 Subject: [PATCH 03/22] Added example to build system --- examples/Makefile | 2 +- examples/Makefile.Web | 8 +- examples/README.md | 2 +- examples/shaders/shaders_view_depth.png | Bin 0 -> 7745 bytes .../examples/shaders_view_depth.vcxproj | 569 ++++++++++++++++++ projects/VS2022/raylib.sln | 2 + 6 files changed, 579 insertions(+), 4 deletions(-) create mode 100644 examples/shaders/shaders_view_depth.png create mode 100644 projects/VS2022/examples/shaders_view_depth.vcxproj diff --git a/examples/Makefile b/examples/Makefile index 504b795a7..44ca93bd8 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -628,7 +628,6 @@ SHADERS = \ shaders/shaders_lightmap \ shaders/shaders_mesh_instancing \ shaders/shaders_model_shader \ - shaders/shaders_view_depth \ shaders/shaders_multi_sample2d \ shaders/shaders_palette_switch \ shaders/shaders_postprocessing \ @@ -642,6 +641,7 @@ SHADERS = \ shaders/shaders_texture_outline \ shaders/shaders_texture_tiling \ shaders/shaders_texture_waves \ + shaders/shaders_view_depth \ shaders/shaders_write_depth \ shaders/shaders_vertex_displacement diff --git a/examples/Makefile.Web b/examples/Makefile.Web index b9a521bb0..66938fcd9 100644 --- a/examples/Makefile.Web +++ b/examples/Makefile.Web @@ -278,7 +278,7 @@ ifeq ($(PLATFORM),$(filter $(PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) # --source-map-base # allow debugging in browser with source map # --shell-file shell.html # define a custom shell .html and output extension LDFLAGS += -sTOTAL_MEMORY=$(BUILD_WEB_HEAP_SIZE) -sFORCE_FILESYSTEM=1 -sEXPORTED_RUNTIME_METHODS=ccall -sMINIFY_HTML=0 - + # Using GLFW3 library (instead of RGFW) ifeq ($(PLATFORM),PLATFORM_WEB) LDFLAGS += -sUSE_GLFW=3 @@ -524,6 +524,7 @@ SHADERS = \ shaders/shaders_texture_tiling \ shaders/shaders_texture_waves \ shaders/shaders_vertex_displacement \ + shaders/shaders_view_depth \ shaders/shaders_write_depth AUDIO = \ @@ -1149,6 +1150,10 @@ shaders/shaders_texture_waves: shaders/shaders_texture_waves.c --preload-file shaders/resources/space.png@resources/space.png \ --preload-file shaders/resources/shaders/glsl100/wave.fs@resources/shaders/glsl100/wave.fs +shaders/shaders_view_depth: shaders/shaders_view_depth.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \ + --preload-file shaders/resources/shaders/glsl100/write_depth.fs@resources/shaders/glsl100/write_depth.fs + shaders/shaders_write_depth: shaders/shaders_write_depth.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \ --preload-file shaders/resources/shaders/glsl100/write_depth.fs@resources/shaders/glsl100/write_depth.fs @@ -1234,4 +1239,3 @@ ifeq ($(PLATFORM),$(filter $(PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) del *.o *.html *.js endif @echo Cleaning done - diff --git a/examples/README.md b/examples/README.md index c42a701a2..b65251562 100644 --- a/examples/README.md +++ b/examples/README.md @@ -200,6 +200,7 @@ Examples using raylib shaders functionality, including shaders loading, paramete | 139 | [shaders_basic_pbr](shaders/shaders_basic_pbr.c) | shaders_basic_pbr | ⭐️⭐️⭐️⭐️ | 5.0 | 5.1-dev | [Afan OLOVCIC](https://github.com/_DevDad) | | 140 | [shaders_lightmap](shaders/shaders_lightmap.c) | shaders_lightmap | ⭐️⭐️⭐️☆ | 4.5 | 4.5 | [Jussi Viitala](https://github.com/nullstare) | | 141 | [shaders_rounded_rectangle](shaders/shaders_rounded_rectangle.c) | shaders_rounded_rectangle | ⭐️⭐️⭐️☆ | 5.5 | 5.5 | [Anstro Pleuton](https://github.com/anstropleuton) | +| 142 | [shaders_view_depth](shaders/shaders_view_depth.c) | shaders_view_depth | ⭐️⭐️⭐️☆ | 5.6-dev | 5.6-dev | [Luís Almeida](https://github.com/luis605) | ### category: audio @@ -229,4 +230,3 @@ Examples showing raylib misc functionality that does not fit in other categories | 154 | [raymath_vector_angle](others/raymath_vector_angle.c) | raymath_vector_angle | ⭐️⭐️☆☆ | 1.0 | 4.6 | [Ray](https://github.com/raysan5) | As always contributions are welcome, feel free to send new examples! Here is an [examples template](examples_template.c) to start with! - diff --git a/examples/shaders/shaders_view_depth.png b/examples/shaders/shaders_view_depth.png new file mode 100644 index 0000000000000000000000000000000000000000..bcce1fd61497f5884d045a9b1bafab3b34dcaa0b GIT binary patch literal 7745 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 Z5my%4zIxHG!oa}5;OXk;vd$@?2>`Kn*!%zh literal 0 HcmV?d00001 diff --git a/projects/VS2022/examples/shaders_view_depth.vcxproj b/projects/VS2022/examples/shaders_view_depth.vcxproj new file mode 100644 index 000000000..5f6250256 --- /dev/null +++ b/projects/VS2022/examples/shaders_view_depth.vcxproj @@ -0,0 +1,569 @@ + + + + + Debug.DLL + ARM64 + + + Debug.DLL + Win32 + + + Debug.DLL + x64 + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release.DLL + ARM64 + + + Release.DLL + Win32 + + + Release.DLL + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {70B35F59-AFC2-4D8F-8833-5314D2047A81} + Win32Proj + shaders_view_depth + 10.0 + shaders_view_depth + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + /FS %(AdditionalOptions) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + /FS %(AdditionalOptions) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + Copy Debug DLL to output directory + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + Copy Debug DLL to output directory + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + Copy Debug DLL to output directory + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + + + Copy Release DLL to output directory + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + + + Copy Release DLL to output directory + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + + + Copy Release DLL to output directory + + + + + + + + + + + {e89d61ac-55de-4482-afd4-df7242ebc859} + + + + + + \ No newline at end of file diff --git a/projects/VS2022/raylib.sln b/projects/VS2022/raylib.sln index 3859c15b0..254a13196 100644 --- a/projects/VS2022/raylib.sln +++ b/projects/VS2022/raylib.sln @@ -269,6 +269,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "models_loading_m3d", "examp EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shaders_write_depth", "examples\shaders_write_depth.vcxproj", "{70B35F59-AFC2-4D8F-8833-5314D2047A81}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shaders_view_depth", "examples\shaders_view_depth.vcxproj", "{70B35F59-AFC2-4D8F-8833-5314D2047A81}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shaders_hybrid_render", "examples\shaders_hybrid_render.vcxproj", "{3755E9F4-CB48-4EC3-B561-3B85964EBDEF}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "audio_sound_multi", "examples\audio_sound_multi.vcxproj", "{F81C5819-85B4-4D2E-B6DC-104A7634461B}" From 4960cc74e09dada8837745e5f14d4571c15836c8 Mon Sep 17 00:00:00 2001 From: luis605 Date: Fri, 4 Apr 2025 22:41:34 +0100 Subject: [PATCH 04/22] [examples] Reviewed shader view depth --- .../resources/shaders/glsl100/depth.fs | 37 ++++++++++++------ .../resources/shaders/glsl330/depth.fs | 36 ++++++++++++----- examples/shaders/shaders_view_depth.c | 2 + examples/shaders/shaders_view_depth.png | Bin 7745 -> 11335 bytes 4 files changed, 55 insertions(+), 20 deletions(-) diff --git a/examples/shaders/resources/shaders/glsl100/depth.fs b/examples/shaders/resources/shaders/glsl100/depth.fs index cdd45f17f..0ea7c46e7 100644 --- a/examples/shaders/resources/shaders/glsl100/depth.fs +++ b/examples/shaders/resources/shaders/glsl100/depth.fs @@ -1,19 +1,34 @@ #version 100 -in vec2 fragTexCoord; -out vec4 finalColor; -uniform sampler2D depthTexture; +// Input vertex attributes (from vertex shader) +varying vec2 fragTexCoord; +// Input uniform values +uniform sampler2D depthTexture; +uniform bool flipY; + +float nearPlane = 0.1; +float farPlane = 100.0; + +// Function to linearize depth from non-linear depth buffer float linearizeDepth(float depth) { - float n = 0.1; // near plane - float f = 100.0; // far plane - return (2.0 * n) / (f + n - depth * (f - n)); + return (2.0 * nearPlane) / (farPlane + nearPlane - depth * (farPlane - nearPlane)); } -void main() { - vec2 flippedTexCoord = vec2(fragTexCoord.x, 1.0 - fragTexCoord.y); - float depth = texture(depthTexture, flippedTexCoord).r; +void main() +{ + // Handle potential Y-flipping + vec2 texCoord = fragTexCoord; + if (flipY) + texCoord.y = 1.0 - texCoord.y; + + // Sample depth texture + float depth = texture2D(depthTexture, texCoord).r; + + // Linearize depth float linearDepth = linearizeDepth(depth); - finalColor = vec4(vec3(linearDepth), 1.0); -} + + // Output final color + gl_FragColor = vec4(vec3(linearDepth), 1.0); +} \ No newline at end of file diff --git a/examples/shaders/resources/shaders/glsl330/depth.fs b/examples/shaders/resources/shaders/glsl330/depth.fs index ccda3111b..cbcb6da67 100644 --- a/examples/shaders/resources/shaders/glsl330/depth.fs +++ b/examples/shaders/resources/shaders/glsl330/depth.fs @@ -1,19 +1,37 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; -out vec4 finalColor; -uniform sampler2D depthTexture; +// Input uniform values +uniform sampler2D depthTexture; +uniform bool flipY; + +const float nearPlane = 0.1; +const float farPlane = 100.0; + +// Output fragment color +out vec4 finalColor; + +// Linearizes the depth buffer value float linearizeDepth(float depth) { - float n = 0.1; // near plane - float f = 100.0; // far plane - return (2.0 * n) / (f + n - depth * (f - n)); + return (2.0 * nearPlane) / (farPlane + nearPlane - depth * (farPlane - nearPlane)); } -void main() { - vec2 flippedTexCoord = vec2(fragTexCoord.x, 1.0 - fragTexCoord.y); - float depth = texture(depthTexture, flippedTexCoord).r; +void main() +{ + // Handle potential Y-flipping + vec2 texCoord = fragTexCoord; + if (flipY) + texCoord.y = 1.0 - texCoord.y; + + // Sample depth + float depth = texture(depthTexture, texCoord).r; + + // Linearize depth value float linearDepth = linearizeDepth(depth); + + // Output final color finalColor = vec4(vec3(linearDepth), 1.0); -} +} \ No newline at end of file diff --git a/examples/shaders/shaders_view_depth.c b/examples/shaders/shaders_view_depth.c index fa5393280..5da0c1ca4 100644 --- a/examples/shaders/shaders_view_depth.c +++ b/examples/shaders/shaders_view_depth.c @@ -52,6 +52,8 @@ int main(void) // Load depth shader and get depth texture shader location Shader depthShader = LoadShader(0, TextFormat("resources/shaders/glsl%i/depth.fs", GLSL_VERSION)); int depthLoc = GetShaderLocation(depthShader, "depthTexture"); + int flipTextureLoc = GetShaderLocation(depthShader, "flipY"); + SetShaderValue(depthShader, flipTextureLoc, (int[]){ 1 }, SHADER_UNIFORM_INT); // Flip Y texture // Load models Model cube = LoadModelFromMesh(GenMeshCube(1.0f, 1.0f, 1.0f)); diff --git a/examples/shaders/shaders_view_depth.png b/examples/shaders/shaders_view_depth.png index bcce1fd61497f5884d045a9b1bafab3b34dcaa0b..b68de9644cab86bc0ff3422f147bdee0a59a2494 100644 GIT binary patch literal 11335 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 Wvux(SwEYYW3=E#GelF{r5}E+rzr5f8 literal 7745 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 Z5my%4zIxHG!oa}5;OXk;vd$@?2>`Kn*!%zh From a554ef339b23d460938a33534fcccb995d495dc9 Mon Sep 17 00:00:00 2001 From: Bigfoot71 Date: Wed, 9 Apr 2025 17:27:45 +0200 Subject: [PATCH 05/22] add `audio_sound_positionning` example --- examples/audio/audio_sound_positioning.c | 115 +++++++++++++++++++++ examples/audio/audio_sound_positioning.png | Bin 0 -> 12217 bytes 2 files changed, 115 insertions(+) create mode 100644 examples/audio/audio_sound_positioning.c create mode 100644 examples/audio/audio_sound_positioning.png diff --git a/examples/audio/audio_sound_positioning.c b/examples/audio/audio_sound_positioning.c new file mode 100644 index 000000000..4c78b66e3 --- /dev/null +++ b/examples/audio/audio_sound_positioning.c @@ -0,0 +1,115 @@ +/******************************************************************************************* +* +* raylib [audio] example - Playing spatialized 3D sound +* +* Example complexity rating: [★★☆☆] 2/4 +* +* Example originally created with raylib 5.5, last time updated with raylib 5.5 +* +* Example contributed by Le Juez Victor (@Bigfoot71) 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) 2025 Le Juez Victor (@Bigfoot71) +* +********************************************************************************************/ + +#include +#include + +//------------------------------------------------------------------------------------ +// Sound positioning function +//------------------------------------------------------------------------------------ +static void SetSoundPosition(Camera listener, Sound sound, Vector3 position, float maxDist) +{ + // Calculate direction vector and distance between listener and sound source + Vector3 direction = Vector3Subtract(position, listener.position); + float distance = Vector3Length(direction); + + // Apply logarithmic distance attenuation and clamp between 0-1 + float attenuation = 1.0f / (1.0f + (distance / maxDist)); + attenuation = Clamp(attenuation, 0.0f, 1.0f); + + // Calculate normalized vectors for spatial positioning + Vector3 normalizedDirection = Vector3Normalize(direction); + Vector3 forward = Vector3Normalize(Vector3Subtract(listener.target, listener.position)); + Vector3 right = Vector3Normalize(Vector3CrossProduct(forward, listener.up)); + + // Reduce volume for sounds behind the listener + float dotProduct = Vector3DotProduct(forward, normalizedDirection); + if (dotProduct < 0.0f) { + attenuation *= (1.0f + dotProduct * 0.5f); + } + + // Set stereo panning based on sound position relative to listener + float pan = 0.5f + 0.5f * Vector3DotProduct(normalizedDirection, right); + + // Apply final sound properties + SetSoundVolume(sound, attenuation); + SetSoundPan(sound, pan); +} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + InitWindow(800, 600, "Quick Spatial Sound"); + InitAudioDevice(); + + SetTargetFPS(60); + DisableCursor(); + + Sound sound = LoadSound("resources/coin.wav"); + + Camera camera = { + .position = (Vector3) { 0, 5, 5 }, + .target = (Vector3) { 0, 0, 0 }, + .up = (Vector3) { 0, 1, 0 }, + .fovy = 60, + }; + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) + { + // Update + //---------------------------------------------------------------------------------- + UpdateCamera(&camera, CAMERA_FREE); + + float th = GetTime(); + + Vector3 spherePos = { + .x = 5.0f * cosf(th), + .y = 0.0f, + .z = 5.0f * sinf(th) + }; + + SetSoundPosition(camera, sound, spherePos, 20.0f); + if (!IsSoundPlaying(sound)) PlaySound(sound); + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + { + ClearBackground(BLACK); + + BeginMode3D(camera); + DrawGrid(10, 2); + DrawSphere(spherePos, 0.5f, RED); + EndMode3D(); + } + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadSound(sound); + CloseAudioDevice(); + CloseWindow(); +} diff --git a/examples/audio/audio_sound_positioning.png b/examples/audio/audio_sound_positioning.png new file mode 100644 index 0000000000000000000000000000000000000000..3e7a8ffdd0362afc0840717bc176d30d6f1daa0a GIT binary patch literal 12217 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 F2>|2Ff8GE9 literal 0 HcmV?d00001 From d5733ffb9acd1cac1e5c12cbd70daed5c199de24 Mon Sep 17 00:00:00 2001 From: Bigfoot71 Date: Wed, 9 Apr 2025 18:09:32 +0200 Subject: [PATCH 06/22] update example makefiles --- examples/Makefile | 1 + examples/Makefile.Web | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/Makefile b/examples/Makefile index 5f2a18c6f..be7770894 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -652,6 +652,7 @@ AUDIO = \ audio/audio_raw_stream \ audio/audio_sound_loading \ audio/audio_sound_multi \ + audio/audio_sound_positioning \ audio/audio_stream_effects OTHERS = \ diff --git a/examples/Makefile.Web b/examples/Makefile.Web index 7ec6868e2..85e25f9e7 100644 --- a/examples/Makefile.Web +++ b/examples/Makefile.Web @@ -534,6 +534,7 @@ AUDIO = \ audio/audio_raw_stream \ audio/audio_sound_loading \ audio/audio_sound_multi \ + audio/audio_sound_positioning \ audio/audio_stream_effects OTHERS = \ From 59dc53d20edf6353442322e49cafb1092441d3f7 Mon Sep 17 00:00:00 2001 From: Bigfoot71 Date: Wed, 9 Apr 2025 18:09:50 +0200 Subject: [PATCH 07/22] update readme --- examples/README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/README.md b/examples/README.md index 38daad717..055e24d3c 100644 --- a/examples/README.md +++ b/examples/README.md @@ -215,6 +215,7 @@ Examples using raylib audio functionality, including sound/music loading and pla | 146 | [audio_mixed_processor](audio/audio_mixed_processor.c) | audio_mixed_processor | ⭐️⭐️⭐️⭐️ | 4.2 | 4.2 | [hkc](https://github.com/hatkidchan) | | 147 | [audio_stream_effects](audio/audio_stream_effects.c) | audio_stream_effects | ⭐️⭐️⭐️⭐️ | 4.2 | 5.0 | [Ray](https://github.com/raysan5) | | 148 | [audio_sound_multi](audio/audio_sound_multi.c) | audio_sound_multi | ⭐️⭐️☆☆ | 4.6 | 4.6 | [Jeffery Myers](https://github.com/JeffM2501) | +| 149 | [audio_sound_positioning](audio/audio_sound_positioning.c) | audio_sound_positioning | ⭐️⭐️☆☆ | 5.5 | 5.5 | [Le Juez Victor](https://github.com/Bigfoot71) | ### category: others @@ -222,12 +223,12 @@ Examples showing raylib misc functionality that does not fit in other categories | ## | example | image | difficulty
level | version
created | last version
updated | original
developer | |----|----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------| -| 149 | [rlgl_standalone](others/rlgl_standalone.c) | rlgl_standalone | ⭐️⭐️⭐️⭐️ | 1.6 | 4.0 | [Ray](https://github.com/raysan5) | -| 150 | [rlgl_compute_shader](others/rlgl_compute_shader.c) | rlgl_compute_shader | ⭐️⭐️⭐️⭐️ | 4.0 | 4.0 | [Teddy Astie](https://github.com/tsnake41) | -| 151 | [easings_testbed](others/easings_testbed.c) | easings_testbed | ⭐️⭐️⭐️☆ | 2.5 | 3.0 | [Juan Miguel López](https://github.com/flashback-fx) | -| 152 | [raylib_opengl_interop](others/raylib_opengl_interop.c) | raylib_opengl_interop | ⭐️⭐️⭐️⭐️ | 3.8 | 4.0 | [Stephan Soller](https://github.com/arkanis) | -| 153 | [embedded_files_loading](others/embedded_files_loading.c) | embedded_files_loading | ⭐️⭐️☆☆ | 3.0 | 3.5 | [Kristian Holmgren](https://github.com/defutura) | -| 154 | [raymath_vector_angle](others/raymath_vector_angle.c) | raymath_vector_angle | ⭐️⭐️☆☆ | 1.0 | 4.6 | [Ray](https://github.com/raysan5) | +| 150 | [rlgl_standalone](others/rlgl_standalone.c) | rlgl_standalone | ⭐️⭐️⭐️⭐️ | 1.6 | 4.0 | [Ray](https://github.com/raysan5) | +| 151 | [rlgl_compute_shader](others/rlgl_compute_shader.c) | rlgl_compute_shader | ⭐️⭐️⭐️⭐️ | 4.0 | 4.0 | [Teddy Astie](https://github.com/tsnake41) | +| 152 | [easings_testbed](others/easings_testbed.c) | easings_testbed | ⭐️⭐️⭐️☆ | 2.5 | 3.0 | [Juan Miguel López](https://github.com/flashback-fx) | +| 153 | [raylib_opengl_interop](others/raylib_opengl_interop.c) | raylib_opengl_interop | ⭐️⭐️⭐️⭐️ | 3.8 | 4.0 | [Stephan Soller](https://github.com/arkanis) | +| 154 | [embedded_files_loading](others/embedded_files_loading.c) | embedded_files_loading | ⭐️⭐️☆☆ | 3.0 | 3.5 | [Kristian Holmgren](https://github.com/defutura) | +| 155 | [raymath_vector_angle](others/raymath_vector_angle.c) | raymath_vector_angle | ⭐️⭐️☆☆ | 1.0 | 4.6 | [Ray](https://github.com/raysan5) | As always contributions are welcome, feel free to send new examples! Here is an [examples template](examples_template.c) to start with! From 60eb3a14d7d1bc27adfd1e5586fefa540016edab Mon Sep 17 00:00:00 2001 From: Jeffery Myers Date: Thu, 10 Apr 2025 13:59:09 -0700 Subject: [PATCH 08/22] Only scale the screenshot by the DPI scale if we are doing automatic High DPI scaling, otherwise the native resolution is correct. --- src/rcore.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/rcore.c b/src/rcore.c index 65c37a23c..ea971b52f 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -1879,7 +1879,10 @@ void TakeScreenshot(const char *fileName) // Security check to (partially) avoid malicious code if (strchr(fileName, '\'') != NULL) { TRACELOG(LOG_WARNING, "SYSTEM: Provided fileName could be potentially malicious, avoid [\'] character"); return; } - Vector2 scale = GetWindowScaleDPI(); + // apply a scale if we are doing HIGHDPI auto-scaling + Vector2 scale = { 1,1 }; + if (IsWindowState(FLAG_WINDOW_HIGHDPI)) scale = GetWindowScaleDPI(); + unsigned char *imgData = rlReadScreenPixels((int)((float)CORE.Window.render.width*scale.x), (int)((float)CORE.Window.render.height*scale.y)); Image image = { imgData, (int)((float)CORE.Window.render.width*scale.x), (int)((float)CORE.Window.render.height*scale.y), 1, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 }; From 7a6b3ebf3a19bfbbdb6d5442a910a6d69553916c Mon Sep 17 00:00:00 2001 From: eutro Date: Fri, 11 Apr 2025 00:02:47 +0100 Subject: [PATCH 09/22] Update `racket-raylib` version in BINDING.md --- BINDINGS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BINDINGS.md b/BINDINGS.md index 6f96103c7..df53bb0ed 100644 --- a/BINDINGS.md +++ b/BINDINGS.md @@ -71,7 +71,7 @@ Some people ported raylib to other languages in the form of bindings or wrappers | [raylib-rs](https://github.com/raylib-rs/raylib-rs) | **5.5** | [Rust](https://www.rust-lang.org) | Zlib | | [raylib-ruby](https://github.com/wilsonsilva/raylib-ruby) | 4.5 | [Ruby](https://www.ruby-lang.org) | Zlib | | [Relib](https://github.com/RedCubeDev-ByteSpace/Relib) | 3.5 | [ReCT](https://github.com/RedCubeDev-ByteSpace/ReCT) | **???** | -| [racket-raylib](https://github.com/eutro/racket-raylib) | 4.0 | [Racket](https://racket-lang.org) | MIT/Apache-2.0 | +| [racket-raylib](https://github.com/eutro/racket-raylib) | **5.5** | [Racket](https://racket-lang.org) | MIT/Apache-2.0 | | [raylib-swift](https://github.com/STREGAsGate/Raylib) | 4.0 | [Swift](https://swift.org) | MIT | | [raylib-scopes](https://github.com/salotz/raylib-scopes) | auto | [Scopes](http://scopes.rocks) | MIT | | [raylib-SmallBASIC](https://github.com/smallbasic/smallbasic.plugins/tree/master/raylib) | **5.5** | [SmallBASIC](https://github.com/smallbasic/SmallBASIC) | GPLv3 | From 3d792f3363d409a6f3aaff617cde742732875f08 Mon Sep 17 00:00:00 2001 From: Jonathan Marler Date: Fri, 11 Apr 2025 09:43:08 -0600 Subject: [PATCH 10/22] build.zig: run zig fmt --- build.zig | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/build.zig b/build.zig index d7d118003..b3da65984 100644 --- a/build.zig +++ b/build.zig @@ -192,7 +192,6 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std. setDesktopPlatform(raylib, options.platform); }, .linux => { - if (options.platform == .drm) { if (options.opengl_version == .auto) { raylib.linkSystemLibrary("GLESv2"); @@ -209,34 +208,32 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std. } else if (target.result.abi == .android) { //these are the only tag options per https://developer.android.com/ndk/guides/other_build_systems - const hostTuple = switch(builtin.target.os.tag) { - .linux => "linux-x86_64", + const hostTuple = switch (builtin.target.os.tag) { + .linux => "linux-x86_64", .windows => "windows-x86_64", - .macos => "darwin-x86_64", - else => { - @panic("unsupported host OS"); - } + .macos => "darwin-x86_64", + else => @panic("unsupported host OS"), }; const androidTriple = try target.result.linuxTriple(b.allocator); const androidNdkPathString: []const u8 = options.android_ndk; - if(androidNdkPathString.len < 1) @panic("no ndk path provided and ANDROID_NDK_HOME is not set"); + if (androidNdkPathString.len < 1) @panic("no ndk path provided and ANDROID_NDK_HOME is not set"); const androidApiLevel: []const u8 = options.android_api_version; - const androidSysroot = try std.fs.path.join(b.allocator, &.{androidNdkPathString, "/toolchains/llvm/prebuilt/", hostTuple, "/sysroot"}); - const androidLibPath = try std.fs.path.join(b.allocator, &.{androidSysroot, "/usr/lib/", androidTriple}); - const androidApiSpecificPath = try std.fs.path.join(b.allocator, &.{androidLibPath, androidApiLevel}); - const androidIncludePath = try std.fs.path.join(b.allocator, &.{androidSysroot, "/usr/include"}); - const androidArchIncludePath = try std.fs.path.join(b.allocator, &.{androidIncludePath, androidTriple}); - const androidAsmPath = try std.fs.path.join(b.allocator, &.{androidIncludePath, "/asm-generic"}); - const androidGluePath = try std.fs.path.join(b.allocator, &.{androidNdkPathString, "/sources/android/native_app_glue/"}); + const androidSysroot = try std.fs.path.join(b.allocator, &.{ androidNdkPathString, "/toolchains/llvm/prebuilt/", hostTuple, "/sysroot" }); + const androidLibPath = try std.fs.path.join(b.allocator, &.{ androidSysroot, "/usr/lib/", androidTriple }); + const androidApiSpecificPath = try std.fs.path.join(b.allocator, &.{ androidLibPath, androidApiLevel }); + const androidIncludePath = try std.fs.path.join(b.allocator, &.{ androidSysroot, "/usr/include" }); + const androidArchIncludePath = try std.fs.path.join(b.allocator, &.{ androidIncludePath, androidTriple }); + const androidAsmPath = try std.fs.path.join(b.allocator, &.{ androidIncludePath, "/asm-generic" }); + const androidGluePath = try std.fs.path.join(b.allocator, &.{ androidNdkPathString, "/sources/android/native_app_glue/" }); - raylib.addLibraryPath(.{ .cwd_relative = androidLibPath}); + raylib.addLibraryPath(.{ .cwd_relative = androidLibPath }); raylib.root_module.addLibraryPath(.{ .cwd_relative = androidApiSpecificPath }); raylib.addSystemIncludePath(.{ .cwd_relative = androidIncludePath }); - raylib.addSystemIncludePath(.{ .cwd_relative = androidArchIncludePath}); - raylib.addSystemIncludePath( .{ .cwd_relative = androidAsmPath}); - raylib.addSystemIncludePath(.{ .cwd_relative = androidGluePath}); + raylib.addSystemIncludePath(.{ .cwd_relative = androidArchIncludePath }); + raylib.addSystemIncludePath(.{ .cwd_relative = androidAsmPath }); + raylib.addSystemIncludePath(.{ .cwd_relative = androidGluePath }); var libcData = std.ArrayList(u8).init(b.allocator); const writer = libcData.writer(); @@ -442,7 +439,7 @@ pub const PlatformBackend = enum { rgfw, sdl, drm, - android + android, }; pub fn build(b: *std.Build) !void { From cc5739a6d7f6514e9c60173b14c0a38c4a928955 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 13 Apr 2025 20:55:38 +0200 Subject: [PATCH 11/22] REVIEWED: Some PRs formating --- examples/audio/audio_sound_positioning.c | 94 ++++++++++-------- examples/audio/audio_sound_positioning.png | Bin 12217 -> 26205 bytes .../resources/shaders/glsl100/depth.fs | 8 +- .../resources/shaders/glsl330/depth.fs | 11 +- examples/shaders/shaders_view_depth.c | 14 +-- examples/shaders/shaders_view_depth.png | Bin 11335 -> 30653 bytes examples/shaders/shaders_write_depth.c | 2 - .../examples/shaders_view_depth.vcxproj | 2 +- projects/VS2022/raylib.sln | 50 +++++++++- src/platforms/rcore_desktop_sdl.c | 5 +- src/rcore.c | 4 +- 11 files changed, 111 insertions(+), 79 deletions(-) diff --git a/examples/audio/audio_sound_positioning.c b/examples/audio/audio_sound_positioning.c index 4c78b66e3..45f211ec4 100644 --- a/examples/audio/audio_sound_positioning.c +++ b/examples/audio/audio_sound_positioning.c @@ -15,40 +15,12 @@ * ********************************************************************************************/ -#include -#include +#include "raylib.h" + +#include "raymath.h" -//------------------------------------------------------------------------------------ // Sound positioning function -//------------------------------------------------------------------------------------ -static void SetSoundPosition(Camera listener, Sound sound, Vector3 position, float maxDist) -{ - // Calculate direction vector and distance between listener and sound source - Vector3 direction = Vector3Subtract(position, listener.position); - float distance = Vector3Length(direction); - - // Apply logarithmic distance attenuation and clamp between 0-1 - float attenuation = 1.0f / (1.0f + (distance / maxDist)); - attenuation = Clamp(attenuation, 0.0f, 1.0f); - - // Calculate normalized vectors for spatial positioning - Vector3 normalizedDirection = Vector3Normalize(direction); - Vector3 forward = Vector3Normalize(Vector3Subtract(listener.target, listener.position)); - Vector3 right = Vector3Normalize(Vector3CrossProduct(forward, listener.up)); - - // Reduce volume for sounds behind the listener - float dotProduct = Vector3DotProduct(forward, normalizedDirection); - if (dotProduct < 0.0f) { - attenuation *= (1.0f + dotProduct * 0.5f); - } - - // Set stereo panning based on sound position relative to listener - float pan = 0.5f + 0.5f * Vector3DotProduct(normalizedDirection, right); - - // Apply final sound properties - SetSoundVolume(sound, attenuation); - SetSoundPan(sound, pan); -} +static void SetSoundPosition(Camera listener, Sound sound, Vector3 position, float maxDist); //------------------------------------------------------------------------------------ // Program main entry point @@ -57,12 +29,13 @@ int main(void) { // Initialization //-------------------------------------------------------------------------------------- - InitWindow(800, 600, "Quick Spatial Sound"); + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [audio] example - Playing spatialized 3D sound"); + InitAudioDevice(); - SetTargetFPS(60); - DisableCursor(); - Sound sound = LoadSound("resources/coin.wav"); Camera camera = { @@ -70,7 +43,12 @@ int main(void) .target = (Vector3) { 0, 0, 0 }, .up = (Vector3) { 0, 1, 0 }, .fovy = 60, + .projection = CAMERA_PERSPECTIVE }; + + DisableCursor(); + + SetTargetFPS(60); //-------------------------------------------------------------------------------------- // Main game loop @@ -83,9 +61,9 @@ int main(void) float th = GetTime(); Vector3 spherePos = { - .x = 5.0f * cosf(th), + .x = 5.0f*cosf(th), .y = 0.0f, - .z = 5.0f * sinf(th) + .z = 5.0f*sinf(th) }; SetSoundPosition(camera, sound, spherePos, 20.0f); @@ -95,14 +73,14 @@ int main(void) // Draw //---------------------------------------------------------------------------------- BeginDrawing(); - { - ClearBackground(BLACK); + + ClearBackground(RAYWHITE); BeginMode3D(camera); DrawGrid(10, 2); DrawSphere(spherePos, 0.5f, RED); EndMode3D(); - } + EndDrawing(); //---------------------------------------------------------------------------------- } @@ -110,6 +88,36 @@ int main(void) // De-Initialization //-------------------------------------------------------------------------------------- UnloadSound(sound); - CloseAudioDevice(); - CloseWindow(); + CloseAudioDevice(); // Close audio device + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- } + +// Sound positioning function +static void SetSoundPosition(Camera listener, Sound sound, Vector3 position, float maxDist) +{ + // Calculate direction vector and distance between listener and sound source + Vector3 direction = Vector3Subtract(position, listener.position); + float distance = Vector3Length(direction); + + // Apply logarithmic distance attenuation and clamp between 0-1 + float attenuation = 1.0f/(1.0f + (distance/maxDist)); + attenuation = Clamp(attenuation, 0.0f, 1.0f); + + // Calculate normalized vectors for spatial positioning + Vector3 normalizedDirection = Vector3Normalize(direction); + Vector3 forward = Vector3Normalize(Vector3Subtract(listener.target, listener.position)); + Vector3 right = Vector3Normalize(Vector3CrossProduct(forward, listener.up)); + + // Reduce volume for sounds behind the listener + float dotProduct = Vector3DotProduct(forward, normalizedDirection); + if (dotProduct < 0.0f) attenuation *= (1.0f + dotProduct*0.5f); + + // Set stereo panning based on sound position relative to listener + float pan = 0.5f + 0.5f*Vector3DotProduct(normalizedDirection, right); + + // Apply final sound properties + SetSoundVolume(sound, attenuation); + SetSoundPan(sound, pan); +} \ No newline at end of file diff --git a/examples/audio/audio_sound_positioning.png b/examples/audio/audio_sound_positioning.png index 3e7a8ffdd0362afc0840717bc176d30d6f1daa0a..6feaf7e4ce62bf764021dc199659ebb3bbf89f0a 100644 GIT binary patch literal 26205 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYU_8XZ#=yWJp1k%114EjMr;B4qMO^ZqUteF> zw*?wVF)dcaL6mSXF1r{Y$J=;OKmselSk-zUgFVG$ZExFw42~Wwgh5Z4gPZU{?2*GaR-HNW5+6QQL;o4Z9$2*oe~&ASYbL;l7@>10Ntx2pM&P&pt4vtjoD;yrlePmZgO>-`*Ge?Qx2L?ZjZ&lvH%X-Xtt&D^OMO^lJ#){_=+ioFX< ztOk6HS!D`t*2;?`Q$ZGk9o8TPvE3bJ`x&POIoZ~WOQROwOhc%;15TRD=E7W~rs!}^ zNIR>twxle@L>iGE1*Dl4%TBns#R%#UXA2g#oO$f%1WMH1haaN z6W9}r+#%_p;hds_Uvrg)*`dsb&n})jkx?cKHD#eZIOIZXpsp$5V)RO5oG{nohV;WL zpVSv-NP>c=6lzXFMjJSCpF$nQ!0X&_ZEowqOOld2@4zlN1#^K3#05c6oeifH4FY%{ zHg1?6w^??H+r^CZ6qD$FsMj7q0`rvHe|tp^gadM;-_J9_3!&V}XkLCGSr2AV9` z!Z|?YP4E+Fcm)VBIVUce8PgoDh)6<1KXRegE*zM~D8RCmR}0^0q!rT|BcKYFb+o z*d3SOLf!FzvvH!4lU*NLss*|X}#f9Y<8x9 z4MU{ve(Bo{N+FF_&=k=E2^cR(!1!(&(>h-SLQEAY2I^l(hQaiWCQBBN^gyGLs;+QgZCsQSFrtXXg{4WZ>`ju%(N{Uu-Hba;&^roEGT!*-(XV3 z9?d*`-aE-Nviv!cIa`d4qCP+p-4jTe@E;stiNZ|GcR6HNxIGQXsJX0_(-w6+8Km|B zL~R=b^I=f+DGClOo|gg=Ym`rZDYzbxTN5m0)@*ui<-~~-{<0b6m)t**!3e3JWFY=s z2lh-`32OU(AUyZ@7v z_;A#=YI({QXQQYI;MB>p6yoLUU<)0^nUq(4>^!?(dGE*GdmrR7A3FLiFWz$445}KG zIpCG?1VJX{(k=30A&X`EgC8t7U_Q%!&f$)zm!P6C>JK=Oc)kfp%w?4HT?|e@%u-B? zd*20r_~4#b(ZA%J#LhZdz0CG$g}pLv3tG%}g=B9z04acYAjz&BtgD2-@uHjHzpsB! z2pU;E@{jo>v+5yBk-4okD<~td{sVgy6cN1Oi0GLiaNzm}N!hpZ_j+?m?q9Up*Y2cT zZLs7gDB-c1fD>MTqJb5&(X4OaWS1euw8UgfTXu7Y*gvVRx!W2GJ|}nwH=Ev@aF{bh zp-1nk)LIFMLP>Da`(g?*!{MvI0=LEa8fF_VGEb7Lli-@W?V!+fX2~#TU0eRv64R&> zNbuf;1TQ!~8CSJ1td-JP%xnH=ak_!26ni!Ew77TDezKVXUNUnfCD$5&?O7oRwxe8WzgQp}t z!N9bLy}EgJT%oCmwcHIMJJUniJ6c!`Sq~@3OGxP61E&|ZbZ~kJeg+CghQk5589ZM! z>^1JRUE(m;mFhmcbE9uoMemY6_O({|i;sQ;sXB0i1Dwmfz>#%8n#p-#psCd<|0<A@NuN5bYt!NR z?8hIQTOS>G9V3#fRh9{V+2WFQOM-XvMXz*lxdf_m+1#8HTG|g3uKI5y66w_gIaA~}<+Jwc;gQLf6lc1pOtqTX| zzW8XWxX!aFPEPHaj66+W!}Z3jMZft%eTwo*)o4OrZ?v+wZcOyJq~^|x~7O?J~u zCkuSC7c2j{@%enh?x*t4PJwE;t3NV0c=kfl;;oAU5^9PKcLZeC&JdhvWwoh)x3SyX zw%Y;kdwTjlT-IM3u=$3pY=Pw3WA4rgFCgujt9@+;1o#Z)~%p*}a=*#Th$-+8$XICM<5yiso+y2hTwPg{_T7K~_pzK0OcM-``mBKOxg6 z`Sdeq#W;4QKW*NXjWT5met;TEQFr^>4m{ulr>!g*-bO_srYka6#@a6p;7<@!Fw_0uoOY9lDQQ3dn6xbQiUiO5QQ) zn8Ph!pCZ{eAFVGGn#)MtxWae%VSw6%peg*{Y;2+o``Zo_@PjRtlILx7lwkU@N~S$& zaq@ri%g#YQbqb_+|zNsBLvZ zaOc7c7SeC>WIVp}PCsU<`^RvOwcL#^y`WPQCyJRJ5&OEJz_Q>0LvwR8^Wlv2lr5bG zQcPPQUOpwo+sMe*c<>5`L=Nwy#y3+Y&enPH^4Y^%4NKf4`pnizN_=Ql_Q=~(*lRnz zytLGC%G9Zis_jXVCQ&Q<+YSUk@}!k4ZzCf|$ zcKXMDvfpe?p?JoI50bealkfdJa9vXJ?S)=5WjE)BFOYzrbx~kJAqP*po3id-gGo|X zpP2k{lkT1&DPrs6R&~55K(I}}#_h7W%9jb#VfN62B z!=p(YMHannlBu%%C3lq#Z8Bdze`qqpK;qJ|0FLtqjb1zEv|7)(^ddt!*@R^SBzwp9 zv@uK*kkI|(`MRVbBw2c+^xF=FLldPE4TUbL?!9~_fG>E$ZT8z9KNEP)FTD2CLBH1h z_2P?ZrwVw$8E2OqFJlJB0j{6S?0gNbD=Kv!7jUNpNp~vmRCdzd&%fP3mgk?OR-)CF zJDu4LO>$2k1-!3$@VbX5Wk;WxjGJ@AC5R6e3d%F>(E9u^tT0e{k!J3Xo+W)8d;eI; z91?lbe$ZqRKlkN>Hx5YWB)aD8bb4GCFB3Mjye>FpyoK-bM5_uDP!_nr3u^-j3NuX+ zIj6i)*{PrHd_iUiuUS3Mw*uK!AMFI*$*r4P8gbP5t=s1pXG~R6CLR`5F{)a1Eh9M} z8iu}nzXcYgvD)3y-rgwXD4jdulA3g1Sx<)ax-EG(8Xx7Wn96AC*1K8D@3{QiVd~q( zzH2TD91sOp^;-;eoExUKzAc!;E2+bKb>SsJ$t>Arjd?XZ&jV|sTHY4$=_hH+1RXBj z^4YN_6x0#S{lVJ?3ADqB!c1TELfW0(Q#P2DxZQQ#o#Xj_1M5xmAh(Yz1-B_{?pbkB zQu6L{_o~RoImbX<<=z90T;OQCCH+a!;6m@!g=U}3rfAJMcu7#QPx;c8ZzdUL?l$`J{t}Srn)<~-|FqP*sjO=+9m!}G2$Go~#J4!ntxC}9 z)(qwSj~Op{X574*@ncb&zJ|>TOXn7ueG0SP(&xKLPl63C@SGBm;1fOJaHg$i%Q1zm zf2?nH9E;--IMse7??z9{BMIBJy~}JLCC$C#ICtVb$%XE6vTr~1nyI*3D=f}T@Mu3! zpnD|auArpuA4!Q5xkq}<{&naZO*ouoa_5A0)<;t|_s@p!43=K&`Q*W!T=TLwthe=I ziOnqmRWoo${qm`X_5&W7X9B7tuVp9;7{3$}R$DBp@-wo|;GJY&3H@`ks_{uism8SXY<7?Hv2IJBCqdJ!TdYA^j7%7h+6{Tltk%c)soE zX_KuySz>ZWprR{tl6U>Zg0>dpwbG4;cYZXxpw6N6e9A(xb6fn% zw`A!kv>Tu3yBNIH&Fyf>7G|Scj0-(Ec%E}jy2aRLcgtL=Y)Y%aKDQ4U%rgsa1T7Xc z4!ZooVafW3Qr0SY2bNRO)oYv@ZTY2f{#N(OLiU-yG6y$n1r}$9 z=v3>d4-=;qXyk6_(L259evo3o8NTa%ClbzXch=m~?tIhyLhsgzVe>93?QwsdaHsS` zMtVwyNe(Ds%L=Sfbns!5(`ERmE|(?Vq+Dv2q9DE8d1YdczA2w*JB6d|-PiHP=weruQCbM2nq8j_HX=&*7~>%TyvSSoyd)xu)Y}8%bzs&uW$+d!3<)RtQIZ|^|7u7zl*ureoWTo(B#ew!>W)91hJZANLSNl!` z`0F>H{HwgO(dl%7yk@Gz%20XBug5c$`FG)+Occ6T7Q;W+vVS&-b zf*c;+R;J7qAwLeUooGJcpX5p2w5;E?7Sp1)tZ?C++Pe6+?F#W%Co+q+1o}kom^6F8 z`{B7}z8^12PDs3URFbE6(!-#c{9D=XC9M0?UY$I1-aqM+vix6?W?$MM!R!4=+v&>& z>A7DQ_&#S2pT*wUuP3e~^Xy7i|A9-^XO3Ompl-jnzs#X6ke$UcnP-}h;S}v}3-4)2 z`p8b4cTLth zN3Y}+A~w!TC&~A*{&eW`==*Za$n>xMt&a+8H>iokEq>^E_Z0umIg+^o!D8E{T$#Q& zv0w7rlooYOLrbY|OP2n=$ag~EZ3EBIQ>?no$!UHj?3* zd@w|^_sF4{*JLMNJjV8qsrAYSNnZa~q8AqT8omlITQWs`@k4)$KbbcpfXET|3yBI!vV~PO)v7LEHt>aA~|8fw@qs<8mQJz5x&3TMn*-@{v~dD#cqeEfBLX= z36CUi{hNpW>#GWvn6$BbKWDbx=5DP#K|pdYqvR6XNfQGcF7GaoSodx8Gtb}#2jjiZMP zUe+v_-f-AZzo*RM#SKQuTm@mioFc8i7u%S=3LCCbe)QnM0RyXUm%ATSRrmHS%YAfs zUKnrx#JD{Ekmt!e%n!6>Iah9Y-o8+3-I6OtCkh*~1-cVC8ZPp2^eSg=x$GFnAROG$ zV|FfMa>c~Mr5jA_B-$7ksO;@qR(glCVP2x~rALVyp8a1a$A5U~M4KD8%#{~@Zd|J( zv+C`ci+mi+Z>0-)7B{RBI1o02=W36c$Rvh!UUTPV?{7~ITbP!dxkb5YmJ{2mgNAn= zC$4z%b76!$&vmy?4#$rc@P-GyKC*C%x|_8^NY2L|v%Z!0Yh3t(C%jyIx-moiSj(ZZ zEy_++H!iOVl6fgR@!+HX4UlFMe1W`(x7W4(Zrwt`>eTt~$u+@D^5`i{ZW2cC4VI`{AVR?8z}bSJ;efUwxP; zwavM<3{*v=owXFwuB$RNDiDoW+{#m$)F72vUSh^l9m5l{(?ICd;)RcnFO(8LT$s=( z*BhVY_4MK{ZXvHN9sL(KsIHGSkoa^ggT19?hqO+sdR z?L4KeAFZYKZPAo}arK?-+XjON@8>FiKjSWJ{Z+`?RIB0Qj{~yu%ohu!Gka$)oba!$ zh`G+<+53Yc@{6l?N=Rhfydbr9{)ue;2}0_N6Mb$oay{9hu(jBu=d_!(g2zG^pF{G# zAEu~QWQ8Aa-r4Bdy(rnB<#@sS4xXbX=2Pz22z@d!EalamEw*?r|CtL*)8_PS6J9a7 z>f_Oq84{QGeQw-m(sxUClHh$t#pM?yeSa)bt*HvxrfloSmb^H3hiOrp^WlmOzY|rS zC089knen{2;IC`uoStohEACsk<+(Tb$lFeu|4&w+L|QZVcJB?o6B&$$9f}>^ca?7W zc*x+zfr1&ll6LZeDoDx~Q+ZNvVA<5bM=-`9n7ulrWp1yD~ zlK&KUUec>=7q|G#Kga&-Ud)WOi{Bc)YO!DXQo?fmgV!p2zxg=UN*`Iw%BOOWf7`KJ z1-;W3-qVoN;$1j#+In`S*xnXCxus_rvsx}@Ja7Kho0Rj>=$6=m`sd7d-J-UCmvG}) zP!@GeRR8ccW~cL~a#h4_ns*8s&Uut-VS0`2bIu8me38qi|1a(}y%c5iHIGHt`bz7L7T+Z-Z)Or~Qv*z(?n-C|Ta@Uq?kW-dk8$7#y%t=2_g3rs&|eOHTLs z$!@-?DT<5d3VPhRuzQc(7ug95XBo6*9kmYPI(bmQezB;~JFZSK<(-Qk`tJQEv2cS7 zZ}zWk|1N$$o$T5~5%ob`}R ztIkcD{Ya?8m07%!y!p4xj$JtYa$(RrLmp-ajsBixwXfWawqE|0k8ho>acXwsu} zg+o;VXB&8qpO8B<^<&1H*)3gDsynlN^4Sm*4XjnqF39NHU`r}*(PT)?=!f)@91g!dEji-gUyvDaVwJ*qvq4S8)8IgXx(KJ2RFXxtzdN98~;1AonrfZN3v8?@Jb_Cset9$yn+XdDP#} zrnk-Vuk^tMY?3ctT)Y^`|Ety3@@0)let?+$6{`u2GtMb_oXx0{+H<<0t$KErM!Ca= z(l_l+by8)r6E1SK|68necyGd@^3T(5_*l-m_VWHm2fpGelXDVoj20{!Ygf2^=6cE5 zDYjXzCB{(7zqwwXNrSIFdai%wPos$Lmj`A1nI)fv#5S4UVo@sm`<>yQlJJSqavR_EHny$F2?|#7C+Z|trrrtgneS}7&dqD4!Hrudop&)C z-Fm68|I|X2NA8E`?(2<@i0N(neW1s1V$e>$lEuA=GZ>>n0~X6x{NYSBSo(Nk$h(VL zdoQn!kXTh{dgbukIX`513QZ?G^!vthBIBv!+(#`}PRR3qKX{)ZO@cLqm$8WJ#KoHe zrxrKFrJl{0*(Mdl)+1PQOr<%f0mvF$Q+dp)Ui!?EiH{NE4S z7#qE?R#-fj@0ZDr4XP~{H^}c;r?T)+)s_oOV((m7v`8j)nrloAZ=2gGkGCB>S52&B zUag!MGLL`T52>}@AE%$)(zX7ez&nd{2e&L$g9)3}H?SB=eQVzSxbe-Vi%pYveRO$U zVs9nwv}2L9&++wrONt71luT$(nj;w8S8r0Nv~t5^`_27{8V!x_dU~!cT(VRs>)7=L zuN!!_%`-gA!L&Hhe#1oHyrY(rq&&BDDOR;V%y4HhRb#J~l6zN~V{z^r?^KJ!*Ey88 zUT$1nBa<~(u!`5|0e5vUdZ{f11y)qs&{i zPF=K6)<4H)bjR)2CY`LMwN+2AEqoT|^w3Di>d+LkNf|S@y}0<(q3r*QH5|_l9M70N z*-CTHl^U~%TiPLe*;^7t1Z0_7v@Ty{)6EqY)|E0|TzJf3>lgp^i&B=HYvXyk#Y)CX zNqOUE>lu%D!+$NmwuXJ(r|cCaP6_Xphq4!KS+^vX*WG6h@3ar{ZyPRbyzG*dCU zS5`^58|zd~G`S#|XL3(MqAlpLz_e3sw{uPe^e`6{{Ym)t{KY}`AIVeX3ftG($gMbc zJm7uHfjjSSYB@4bsX-Zd_~%i2zOWd2F)p1W{f zTD$Y&LX~OK&AR7%&sFi%+_aUjmOs2yxapqcL33@RTYZu;vI0*m7KP59DlxyW%wfe8 zIkqg8_Cyhb2|)~eAqBlln#y;S?rKY7E>bD4VGph}xb;(E{gI_whfGg; z*cBO5XnyOb#E)ZA3oRCur-NFCjy7n$>BjoU_7YTU+%V-sf)b17`6`>M94E z?r8LyzIZPGE0Y}>z4l-J7+g5LZbR#-g4Znv{#Xd)s@7V< ztS<1by~xI6n?t91CVhWZorK4jlZ!s>c z=dRtNY-Ca8`ed7IrfB_QSplI-M-x^(a4%9%u`t=v=KQDk3ETSw>AP|#pE9ltwbs4- z_Qe|Zx6)BZ%-Y(#o->Oj9j+8h+3?0PLE>OTR4L2GpZzly$h~b4;84wCGuwLkpGS5H z&vv%=0e$-~vgtD)PLOyhcXFp#0vs4=UT4>e7>F0+8CL@6LPp%vOL8nY4x3>3)UMww^^>6i*v)eQ0B_eZ^JuXhPxte}Dh8zjC{Da9UbhmYT#m z-iZ^h+>m`!XmRV~f%vG4#bzlcdKtmR6QtKIp4)#gc=F@bhuMptCtI9rnh?Fbx6EzD z{P{2L?o%-1bGKIDasIr?S zSyOOSq3WJP|M81_9Dg5mM?Jlg@z;5-h4hIkX0djK`3wBZ8m1@oUh&G^q55v2T>s+M zvkzYK^dDnQWwqbxe$@SO^S|EMnnXLR*M>W+gx?6HR?cSdY}V0KH5i5=Uv*2a5+ zl5cBx=AL6evvk4D{@ItUB-pCeQ!GjxGGgO;w@G@Ou5aG@k6~x_krIas+7ln%$&};b zoid`as^gC{=3H17qOe`rNJ_qW{X*`di!bJ#JSePxWZFdM#Gj%XA?;P{DO=7- z)##o+ct_5~k~LeyB*wG%-o&U*{%3LTGgSR*w3fO5lFfZ_Y566E)F(9-(~dewBCL!y6MbF-oql%ppTQym{$f!(0EHk9O3PS(uX2*1CNbt`%mp{F(BF zMd#MBiwU~B-Ky@%6v+w%7|D8xKFr9UUU1Mz;G<=f=H+DvmYc-5OYdx6Ey|nqz{Onowh6a8#rA(z`?7G-0ypj4 zM_jd4N1tb?`pkC|S^3dYN}s1$sNvDm1C7iH+b3SSkt)Gz!prF8w@d15_7>@yg-iCy zzir?-SFx}>&@9MG*?A%JA)_m=HeNh5caH?K=$$P-6Bd7Tx5`N=?8Bs8e-VG z+#?ouMIHav_s#bNKV#MrMjbo%&vIXb9tC9h1U|a`u;~Bs0FCMi)*BaBmLw$eJm=v! z5!tMIxqphBw(TUQt&dAgnE7+qj*0$T{L!dlwUbk2!IycRjh)s}t-mwkme|;>49w?! zCOKi@Ek;S5To{kF1CE}N249qathZ4 zH}|BJn6>Qt=+WS=^5uP{*~Rb zy5*$rg2hu`Jji>{_iW}tN&6?ywqNYyc>8$rJ!8McsTv;(z23H6NqE!HbFPl3-*NH5 zN8Jmr7^+w>GjWAfRb*@lSXTc@)hw?4a0kO-1GW>D=_c~L>pGT&)qn-O-KJkK*( z|ENDWYO6I{uzJdt&xR&i&lX-`lPZ%Hh$?e(<9^t9w&91+>x?@*?+yvZ|KVBcl(FL* z?@C$r#hVqccxyJVbT*GVmvl^9_w@RUd>pAiGnQP}-SCHt>*&E9j}kPF@&_6#TzS{P z^Nk}#B9X!NU|(2=GpLdB>7w6>14oqCemA zqxe;%=!YZLR=*9uNJlm6p6AItanbML1AU&8C+!zk_U-%V zb)GAsBvR~Up|!}N9F^yhRnO)(&fsh;b!mGQw|C*S153kS+DF{-KfH_CDNj9Ri=fF4 z>FtZ>_Ak8nbHS2JQfnnR)9_u~VCLq7wdF^4dORvs0YAk+nm$UI~70=NfvTL0? zw6obZ*_ytwRyb1TR? zxkcgXEVn1EUUaDZeOA|) z%(7o8zP;H{$9;P0!ej3XxcVQ?Drfhubza@av9a2gt@uyhHcpMz<}WT@lrfYQ2nbQA zo+j6L+JH-gk1>dA$3>>}1RlWliH-vq(USy@P!H=UuZttI*g71ANd_OE^<^TJrR6%R*#UHA+b?niP z8Rql56}hLVoMGWzx}`&RF5kCL?RWY(w)$;vI{MyW`$o6doVT_xuaMmDY}$7su8FmK z(#3PfAH1yzSllF~TazKbpIP#l^Ik#c^>@st9L`kHJuTHaciqAnX6;3Lo9-AcydJoV zS@ihgulBWB5)pqU-M%Ta>Z8jgTZJ1|vWq!OK9oAFh>hqyW|-^lz~-!8XVO=A{9^&f z?1>i)^D;L&w{~#O|3FS-kImu?m=aI>TnN+nbl0UDvHG>N$MCF8E+Z8Ij*$CW1QB-nHv`kpV8^M4>IkfnO(qKo%$6Ke^r$rmfs z?B=x>Mf7f|kX!k(N~6rh?NM5>SN8PAHP&vgd46q8PyEQUY2uu}t&0nf8mKTV{b(a$ zb8<)h|9}6l++wkwRgfvZlsU4p=Ul}^x%JJu`%d`IJbYCC#~*v4KOR1R_@~}%0S(Z+ zlB`<({bJd{1Eya+dS74Mkt7ksAQtbu)!6Bp;hq+)&leY0uAJV+Ui>&?%Z5We&mZ2J zA-k^7c2-;92R7wbJ6b{I^W{GNy{Vy>2^reMak1(-WyL zn2#?0Xu3qrUV`JO_`V%-I(D*e8+bOEn2SieDertBmC1Ya;e-1ZyQckc$~Q3i<^H|; z!tzOr((cKfO>W+A*e!E^@yDYEPZ%@{%_6LoOf3ToX=~P%#y1Q-=c+F3k9EnklgvHCw|8R6gl_lg=lJJVELQ2~T~;+AO?JXXKaRrA zN(<92H?O0{w$;<@7wG%Y&LI)jR+ z+dm!3e`f5o-0^tQt;*a5x0aZ^ZD?3juqD7r<;lcJE8C;z^ot#9;eLEj;`!oK{a{ewc!7k_ly?=^XrY}>`i{)HDiT+hcZp4RXmyz_mfxbxx)O* zS@jn(*jw6OW-Up-wJ^%CS8Usp^sYv}-4~BtI1n;rN|~ISwY>9sLF*_#Bc4cyJWJ1h zH_gKu2c(&p1CL+Sy7%%DBV+3`k1UBEu`?ZijITVZ-NNWS_tN}(4=rXrXWMs8t=tS; z8AZozu(6xl$&McU_ux0O{xru9ENeNcM)mNo4wFDj%; zuv$1L81QeIDE+KEGuyN=5S^2;zIwuJLI)w1!nXo7Vw7NeqKZBLrotCVGpr#zf>nfZ^0NvT$5nEY!i>yn5qGu`sI|I#1xsCvGfKl~{_ zJ$;g=B#J!XXrMW##h>)^`qO{x{)bl;J!LL! zaWz4k_sE?+|E2%`!7KNqdh0Jeu3u5^kYMNbzJo7cz* zf}+~LcJG6y4V(_XaQm`Q{^OQY&5NHJ*Iqi7pzG}Zc>a$c@_k`PvFD|qw>5hD2Vlan0rcIE^<84Tf-f5{C z&gOeR3%2}ORwpHqmHIM6>VOaPVp)N1OPhCSxgwVIzx06$WQqddgf@OcrZ%o+q{TvtnlAmYS3V3BAn3B}Y_G7i4bl z6>~bg{jp)x2EMmDmWKUloR-u3>~o_pcXO&_NMxj>g@W7k)QR)u+PrsiMW3>aGVAF( zv~W3VKu1qpo<+swqYLIRGO~&rwkoeVAnBWOc=3aS;f+0IPHk~Amp3^Y%#wRCUydz1 zxxU1#WzQCan9mnH-gNX#Yv1wtK!6XwvZ@_>E;~!SdP>QX6JmL`iaZ^DD$Q7gk=&U{4X)TF6$N zlqkWP(#oJZ^-xBm^$(%D4&k2`XEy!HOwura;-2ojVR`$+IsR?Q?kQXDEM9X*x+gPf z3$u~OEpt#Ietq}Cur_(!3U>cn5;}#3v(#2hS8F@1b11`|WultfXLc1Gw&cZ=@6555 zT7E_IGn@A;iOi3d8T}7gRkfc8^Sb#PN!*$%7?twj;-T_{%SRGqZJqS2CEOTKDjLX4 zH|YJ68o4-CHO)-omF&ce7E9|M@_7q0hqm{WIk0UwbSzw3_IU|dn!(fi_} zkNK8aEML0TUo3IlUt%~#>-EJF$C_Odp2jT7E0v9Av3HzjUYsg@SmS^Y(-$vsWyAG+ zFNAc0l*_gl$Vxpu>>%=Fab~lfvXgVJ=97S|5T1~Caw|_yZri=z{j|%cqALmd#%_;G z6TG}4b}`)a>#i!;!tAuXVyQ}Vf7-r-w>c$WG*z4AUQo;BX?OdRaqGZ5Gq+#&Iv!d{ z8_l|>sn5-xywhB2ee>eK&fQxKZ!s<`yc48-$<6rTgI6s)%bKc8as$kBd6s{W@s(bY znY^UjZh~{NMX8J1Wy`Op9in=xCcnCLafj@@-1!rw)|)6*48 zOVeb}_At*DXRrRzzl{IW<>MY4yC=@Fb4$17c;3D6mZP-p=NG~1d@k-OCV7%=JPPWy zJy(7#{l&v!Yy3Q8*^>HsG98De$Hez7DcylB_;9Mp@Y>ELX*+FW4yA4R?0EZDjX}%%j7qZ|(K%D5sV@F#{U`c~ z@?Jf)UCc%|n6pea2hEFgcS@6Z`7*_1zQA<+~Uk^%6VzE|mUKwaLEAgavnzLr#%83)*lB^^%3vGlhpL|i* z-?%dErR=-KU+-MVnK3Ddt^b(e;SKCN9#yDZy=q~t;A|@3W~}$|XPJt*mwS+vxx7Y2S5-`(9>Nt-wlR($=i5KjgUp5@D;pzIj(2Cb&Rwd{2 zyA$txbl{u&a9)_(gN6Yw$1QxCb0Xue*`8ZVcbs~Du|jU=X89X6b~3k~ z?nn~3!zh`@JM|(@k2Q0D8*kPPp6eeZdedKpCp8=TxLeCNZ{Fziw(mqno!q|OpeNt1 zXV@6`oU1c;IY5IzyFu-n;qw7Y?S6)ZJ`>IH7)3{=30gDG@iu`uM`bt z94g=P+3<(3h3TV=EqcikhP{_ATFpuXO@4ClOs|@kWxkMqTZnN~hI3NN7Dum`Q!;!n zQ%%lZUN0hbVuRe>9J?*IG^QN6o-t3(aI5eEx ziXPfVbxe%w;Jy0ANa{Lsa3ZfumE_#761#eZgFtvD41x@%*r#RT|5t zC*Eb0?3_E{qEq)Kr|cD>zZUmSXGFS&Tua-NR5eFKJ((a;~%mnJebWZse4?~O+>+LpZn=Q z3+L;+n7KXiC96nQbLsr=8{Rkcv_ww0*wp!p^>RWUOOIIqTe_=DcZKBL_lA3JFM1(+ z`r;njTR#;{*h6vJ)QO;*`|w$cPr;-FECiMh*YJuJ&1lCRVQv zjieTD@LL92?O$LsaZ;j40xzT2>**JNC1j|sIe1~7L{4Vf7G@(B?&BAm+Uq8oMOY~| zuQfKgwd{aA)0AV^GoB}>EHwzI0&N+%aT(Mmy_wC@!m#z!my6#HT=39oUdh+KR5IWM z?~?_`J6<+4FjcKEf8@qJt5Gw9&FF5=v7Z-mJ15M}bF-FLUjMguPMF){`X9&bbze=n zxGSk(`Rs$Y{>hvuFW8yQTPRqif5UwQXu#?OCW z+?)S!HeW{Uy8dnAZ1J}wxk`UJERmje(d|&i`braC0Y1hHCaQb6CSK%9`LV>~#uu}N zTa0f#keRtuU|k7gbericJ-2N2AZLc1XBc0~-VHaI)z-nu_@%_Te~a;>GzW)9t6S2t zXD2*qW3Y8w@21`JaHd`1(zzES`!AkjUnn5qt9)3wm&fIHa*0FsgUjavGK!P9Ril>A z6}-tPd1mf}i-(dvgqv*9@Ns)wn_}X0@p0vrM9W)06+mlho!jc7Bu})x$dENQc$vPU z%x;2ncUWdRsFFUl<>H~lj8MHRS|M(aYoC}oI4+m#omXM<>Cya4o07LE8<|`_laSfb zcg^yPul?bL%uL*d5w{pWuG|=ue5B05fzd)j=vYRgL5Z}&lx6cDh8P(3FfDRU_;Rm( z;_QeOGoQPspKtTClIltQn{m6@?q&LpYoD)p*ema1Ho7o(!bP?h7xFtM2)8e0{eL32 zVUf9%`{hF?Jh``MymwD`Zgcx3d8YJlhNR1G6BD6Z6;qbXzsPrDWpK&<+A@>F{OjG= zHCxYQEHB>jxlxzJ?eftNe&SpD?qBRX@xa&KSv9|ZoA-+OZEit3`Mm8H1gMl%Uh8<@ zaG_W%#iW`4z8l-ZrZkgxl5QpnX*+UAmPQ;yy!XhKjS#F2-A}}C8kl8ynnYCUnsP=B`A5r#3bg^ zhYVY{I4ddL!-5alyqy&UpFE8O4ai<`SaeObU~y;u6Eiz^?wmG3{uLWV(zftO?mC%a zaP;nrO*+4pFMc?q-2JubqstdFZuVNQnQ-}H20M%H91UNK#WPD%w%Znd{o+3RiLyG& ziklClb^Y7oc1ia1_Fudy@N3!Phj$ocbtiKyUwV;`qcG9r7URMo_7s!gKC_J%x#wPV z%6PJrGpg6Df7#N76Q{9N+w_*XWX$h#^NN$r{rtesd+}4#!k;-?n447RczD_@o>{Qv zaiczOkC=KO?~K zmRWI1hnw-;j8lxQ3=2z~e4?ayPcD>Y`jU0#;3XlAEi1N$=bF6jJtM#%+hYJ~`21Qa z$h2Wo#ui_bS@S%28!t)<$SAh0Pqe&sSoUnj60vQIGt(-T&1{tNl=Jm(*0$w+`a|Mv zM}WF+?=w#ii@q;?Co-%Q?Cg8X96q#&Ryj$%eb`@S9mgNJkT z(v4y-<> zVa;0`&1NloF@ITG@r?d5mkxjb#g+X#Hb`;4U3qbf!7avxJJg)cYb@@}dh*RVBQ&FL z*~*2}m$Cg8ntIX1b-#&e(4nf5NU?_|rnBCAoGu3qEY9Nd(64u&p0Kc0a-ECGtQ~G~ z>Mhp_?Pe`&^P455#k=ug)K30oQ;aTsdix@W<-BR?c2<`D=luuG?qzET6tFHz!>D z;;?&;t;p#$7rz+XVpP;((eS;qm^1fBsRNt$oW5mi4^G_H_L$>+#w{iL+}<|XcN?TT zWhY+z;xNCcYDI~Q+hyjTFB4tPHUwxd>`~kC@FJ&V59^(bTT(Z+n9i9#y=R&3rOVec zW(bO>DQ8Ar%b2wwU()u5wbJ63iCdVP%vmxfHn#?(aNbRZ+L z)xKr=Y)#E!&V|Nr5;Uf^XS=7EoagDYsyDd$aB*hSCKE%Q=?NFL8~fDuExgJpnf1|h z*1nAS``kWt+AV(B&G`JlRnSW6J?3{lUCXGGjQRRE;YCN!vd)Wq95yU$N{)SM2M*rn zl=M+nThewd^BjJ{=tZH#N(CE6?{PRUNZxX18^u)0Q{!@4EU z&pgf8wZJBp=cj4}^TZDqnrlrI`Svko87$$>YCDx7wb(DCucdd>leQ}!{>h6gd%ivW z5%A_m|FZ6dm#vqj@3o($=T^X;vcc5AUHI_>%_VKwF+Ix+PhGn4Vh#Jl57IeLwf1^V zy|~A9|EFpVUZ$R9+--`SF9Q2|m-PzXV3b@V`XnPs=0{PMipe~;%aWBZbGCeTjM~w= zq{M92a<*k}D7$p&P0(19E}&x zu~&K~t2|kG(Wv@CckjVj_U@ODeOMW^;%=Rcue9(0dz zH;ZL%->U=W&1x_HCw11jdHELUoXS#@T%PkEb+V?WFMgTKQsU5-_0)Wp#mnG|-Y*4m zzUezI-+Zx#z4Y^g0`Kg_mFWd$2JGJMDJHcBJlPJOw~I`21N1X_PN_yXZ+*Q&E0*(TwVlg|I?QwS;yL!*PxlKvvlmyUeb}zcZp7cejK58g`9!97&$9l+Ta1!^ zyr(a^c>OiX+48v2*2n#_lv0eFwfy3_^)-qHv%=f_ZWk$}IlEnEKit7`WSg$rW%km^ z#}~|Clw8Mq`r;9v2PP_(7W$;nd9qaj=R$ndZ+ZU7lrhy#at44=i#G#<;*Q*)xEuCc5MEO6E`f| zd2v&Dg_+LEyMmIw>WgIsK-=Hc7W)2L5Y3*V;{G7xpwz$!)RbT;Vkoq}C=hBN#eDztfzUo)> z&$lJdlD_-iaL4Pt2PgHrpT0fuvfZL3J`%p_i{EA>S<9c8+jsFBSLr2QZr#cEGoHD% z=xKcHYh(X*#Y{?X%gNTmx@SR4UH%W+zk&%)&R$V;UdC|muy?}$> zbBD6Na~%`JKbg#Alzc1OXSStNHdNy5o-O)D?as*sTRt0pkrHQ~`p(VTUU|2oS5Bni zEI&7Eog-}w3%3~EdM3*vJK>^-f(+;4Ryma(x5JJ5TK@;|y}x+w_=Q}J3%mU!bi>`G zr!EjsFp)Nz<>z*pbE}p7iDy0A8a=(kLuN8c@|Ij;s#OuMTb!Btfa~AF8SlUyjD-&U zTg-2*kjV{M)XuQ3??gtFq_6gt7Yzr_$mBj35Z@(I>fpvabB~Wr5cmFzPW2DC|1K0_ zU;KJ!dpvXFw9Nc1Ig+^nkGL71H1=HFVl*qvgOkzg(&-Fo$$F2;R~aRFLrxig@X%s$ zzkK?E)(7_LThepCO6=ohiJHQ?nD^90HdRAK2I(sW1qBHbcTH?&rFC#JW=+*yoU8C= zp>Gj;%9ahwe;x0YX=*(NoYKgHP1T4`}6mo3YS$a6hcwh6njr)&}Q{NH0C zqjlw?+rbNZ2iTQBj$J&}u82cmGMoG9nHNo*-=1Tya!)DAKan9Ny`m^>$=3aWRtk$- ze;-KQvry{WV%cjCgCi~*^Y)e5xoKDCC^oFOkz709?J|$0qC?g$$+^6ezUj=d*LtRu ziSA%Fy44{gBbm1%bi-oaribAHmzDiM&J(p+DB$4VzBu)4#;k?z&zW!bUF+LEiaOWuYT3ne$1`>iVm)Z26tLm9H?TML^<1aV%lWv#! zS1LN3HOeXZkg|o@NWv*$N2!aOwL-H&eDAjd?%KBx2Hgl;{LuW?PYK`iPudvP=*Y
igok{TJJmm(Jy%@$X_$ zhKa7AFw++g^~FzbeemgaUfUxH8e!x+p>Wo{Sy7p1dfc~+t-g^Q6DEtfyK}h*%c?3i zXrJw!=DGM~R{+O_)$e3rq=%ZnO?*_Kguy~_-96b%GkCT&qRs=4$iKtH@K${pm#Ta1Yg>u)&zx#&B8v8YWI zhd{7Jf0>=zW!|;c@&=#XtrZt%^6q^nb)qVJ%NyxiFAFWEsyi=LHoC|Z8dRcbfET2bNKi-waKx1@Q#UVo8u;(~Ac;f;TdK@A?+35pZq zGv*q$-P&?DBh-3>V#7Q+ckR0uMLaV(0-}!f^3CgcV`6dRQT-MlnW&eAJEqGwZ|yy9 z6jj6Hd35OFr$UohzBYk| ztsmK<-BU`~QaYaSXMMlmo^I>L?dIj2u%$@W*SUG&=f*c}7mISAEIoP9uFBR*+UUpS zCmypMWp$oD$zV_6n0o!nDHUbi&An#AE9IFsoI9QoCFL9Yq>VxM^0|y%GLkQgG>(4G za8D^%c5-4&7*C0NOXikeGM0)AUO9_JKWB6;H({BOZkOO4@8(=;!s5Zn7&YB_@yj9; zTfS`q47#V85+mGGOxoO>6Bal#g!mmgJ2{Id&SJ1tyw|U+cNVT-dz_6#oZ5&78txJZq<$blVjU z#-wl6JRv+V4{sb=loHGO3+Y-X{2)3|ROo*ySW@uF(P;Vowwyc`zK z%--VYvHl$UiFp@O^%uY7jpyJ=sWh2o=6?BE0#D<`)X2pziwxQr_D)OdJ=ef<@k{@D zBl))#Jz`l`xEPE4c1iixFMi2y%fjY8Yr*vs_cFK^#B%Ul|CCx{*79#>+Lm=ndS^02 z^ZLph+6sId=T*9CU%!|&f0iu&gvbq_-*}pqZ%L5%?cN|D(UX~IQp1(`+%3vZ z^S4+=u}zRWcO@^mFV4ln=N9MUnVDM-x}QDAzEhTehP0c0o3w9#vn7k$<>wi{WY#De zRCPYgxFxej(cvvOuY0;fTSb)o+^-V4YgR}yUD+2?uqD}M)8*$0{r@k1Dt@u#{KSZ9 zJ?Gjk=+*XJ^PSSJyY%UEP~>mtPms(oQSL2sS|P}^W!KFbliI#BUo59Qsx|55duL*G z>2dlNWv9DeEN9(cDL+p^IMG<;$Sk`mu4@80(hWxEGuWiwmIN5HWL*8(AnLVY;-rfa zpgqG^PA$I}yveQjSpr|<#mk%AE6zwqg}?D)5wod}d%ClRck<$wo!^#?ypegMXs}Bs+oYH8n}EU=lk5_< z6oKOk8!tzkh?97Gw_nVw#VKKdl{`r8XTvK_4Reetwy-SnHE7|D>QG}wm@ZZPuix7Y7E;1Byy%+$*_`@dkLC&%ZOT9A0^9MeCcqF0goQ< zv!GlPU*5hOjgaD3XZwQh0w)XaWvEHNZCKELAYttcx67|C_^npf{O5LA>+hvk84;7^ zuPxrJxZ`l1Ni6TWU!W1cjz`V2W+s~~?k#glP&ByVeiWp~XSK57y%mNICQ(KY`5P~O zYOvBw*`nMe)wlR%)`zJ!i)UY8cbwB;#J1J=_zSgD7qjFP*)1?cHJ(q+R^P zcj{u*GZ`E_&jcjyF0q?s$6n3RbFP7>fal^aCHc2s`|mhqtXRt~=eycjd2Qb@VU>Aq zhZ}#rECuZZWa~NCW?;~>Z0*7D{h%o%4L^sOj47sT`>)BKEm2<2Y&1oC_Qfw&J1)P@ z__N>`|K3v{CkAx&F4Mhr{FBGq4v@acCXhabxEFIJ-Hh*_c-g|!9vt9y`Sk;z^@~3? zS;x5@Zu?|nE!Fnr^mpaATh?6MVrubv%0*j+k{#W=5YX^=!D~O+FI%^+WekN!Zr0@>UGOkP$WxoA> zCo-NMG~jv>(AI0V!jt>S#ZA+Ge30T@eK4?v_d2L($=EJZEgv&>C><&_(P{JhYaEj9>~{Ia1OMd3 z-Wyg3xG(0cE!om=P0_$gm5=k`#itQld@~oPO1?c*Ug9aHlH-2)#)Vb-?$c9yx8-Mu zGA%Y%5NUZ6F#D^+_g5LN1}0q7CfdDj)Sc#bS?}xRcNsG-t+$alnP@xfTw7Ul*@`Rf zi(lq^SibopAIHo>lNh1z8EUe3W|nOE+-O|~(sAisM#QE4G7_DMcC*e&w6RLOG5)mp zWlo05=8LKkD#wI15}UX5%*#4tz?C7xw0JK6A4Z#9GTm031zR@B%~+IE;(0AY)F{L` zp(OHJ#;v7ppwvD=pzH9~MRK_fJnIgnl9a?idqfJ&uvaIA<^PUO`-~CJ4Z)eQlUFTJ0ar}5jl=MI4 zXU(Y(Kw9Q*G26w`?GV$emev;Nuv|dmZOsJv3yV*0^x)oou_*V0X!c_7O>V1aEtFwe ze0r1HW&M?))5e;VkGLIL!@ldfyR<5EctcN_-3sAvi!)~wSoF1Be2}lfv)n?;H(z;k zqE$fYt&A#ZtCzW3n484Hl{Y?alwnysbNarS9=(%NzQ>(y zS=^?l_AX1T0Xd6_XD%rI<~g`oCvDL;akG}+!vFYUNsrXA#SaZjq?w%!-??4Bo$*-M zmL((deebgE3#Z?6t6@(uxtQd?W${C&-DhlW{ag_5XgRA-G0|3v&w0P0#gs<{CZK+5 zK`X=BX{o)-b}pR$%-86{O^aDoZJiUge0IG5#cY>McVps~Bssa%J1-`! zxwtFKqUFGgO=~We@NhQ@T7s5R3r}ZsJKR~t3R)V}s9WNm6(x7}@Zrsy2EGZ_8$zi=-aZzW>$H7xpRTRvG*CX zq~F#|5N4XfccFLL?u9eoxt$SObCJa=%7D*>qX*Qv-X-mMdZXLv-4EmM_3E9JT6?+8 zn*+3lWoBmOjq?pX=c)qcZE%-1e$x6d<9Tv{*s8;}w*AkpPYj>Q-)152TfSIUDXW!1 zv-Ek!F6mt_^CHR}+=SJ>3O&n+5R#v^__r-veWOLp<c}YvU+i; z?pAQh|KJ~dIFBu5i^7uFMY6one-f>4{gkL;eOBOkd2wa&7RC-4rY}DHi!<|0-dH9J;>`Sv<+jTnPAYZaEHp8^WM($e{f1k2%oR{t<~b{3D0Asc#!mAnsfFzaG9qnf zskKFOG^DvWeAUUxyq3Yk|5rdl%vfQusKH;MM;Q^xZC^8W+gbv z&f?2?i)AN(PQN*K{KL8m_Ugk~TOOL<`k-vivLdv;Z`r|%CKeJ_@+a~@bBcRSESH!q zJj}KC;<@7o)VECBb+T~FXTv|*_b&48S=_t&p%l}CExwt*h@# z`0LjU_7*KggQy$4?^;ZR9;KIDOMVizqgk`Ie_HEeUi++ehLz3L5FOvnv2XhAX06n0 zy_fHn!ME`{J)Z9{B8T zF5>6VY3zOXRYHpOUO}v}eN;wo*p3AP5-(u-_!=+P`Y+DRv1mW=Lba{gxQzWO&xsdn zj$hDaYKv9|+oHI*{eZ)gkD$)1)sl3M2dkRhFF(w%l3BG`{>3}F*lDH}mp(0c+0Y|a z;Jm*AV@Pxs>H9%lK~%=Z`% znm#g`^|U>WgXig~tSt^wXG@Q?FxX!Dk+C@6M3=9GCG+}1xKups=GbguXX z{b?_+F*2&kP1x?Xya?3BRAg~Ww{_DF&T3^a)jD?Z*xigOnKN_wXWVvs{qbUnm4Kpw zz|+SW?k(R8eW$BNY&c?k>!*Ze>-B_r+vGtWTXcno(d+WBjOWQFwtQ0s7?ys$s2aKW zWvL3N%+$Gc+{icG!Oh*YdfUg*7Pj%jA~`D%>=*>IK|do+i@Y&G}G?=o&J zb?4w|D>1W@cA7mSP10xT$BZ&LUdE`l10bVoFB-8VC?7s@?n|H91GmeM6Sx_JE~$L- zIq~9E+r=$5bDSAWq?tb5&v0+qwbAD*A1HBTIJU?zEipTlAy~Dz^;pKNCE*-AZC~u9 zZZB4JIRAxjQ}z~P+gZ=toH!K9T@v10oS|;dvSJrY_7(vt->w}_2@5VAd$Hzt#w?i* z0fi~|+)tmnSYmm@so|1|<*a4ymrb@hCm1YWd9l&=RPt;sSx}O{*wj8lU_p7J5ooYu zI^9KV!c*xAEc@-?IV|T&Yhp+*|%gEYIM)mXT;2b%W;`sEF%X zcD9j^G3WF~&`9yiB8zs09Q_j+R`R~jl~qBN<3#z(Dd!t{#0(a*g2snlml#_~8P3vU zkLEaV=}*Q?%UNdZ$s8B7V*8eTzxc(^lY{5z7vo$16m*YyzH4X@Vm;AyF<9S?TfE4* zA&m7j#Aj<14Q@$D`_5Kg`I+(a>x}9|le_%e%9w1EQnn~N#b`_}5ma0w1WLVPTFtsF zAa`XJZ78=(=-qg6h7@n(L?NaH+n7ET?pKma~7kd>`@6_lNGW| zS7Zc1MbWbJ2c?)^ysRlvOEFo?H%(wcd6bOr@5Pz(ZwN^EWu}&xv6Qb7e$&t+CbhVg zZLL$or7fnjHiEj+e2g(KtGD>b`fg{IWn!Mn=J>7YkKL}WBoqDz+>H+--1@eK8zjp- z*Nj-qdNhO4a0a+qGO6V|dX9a~N7GxJlD_+u4O!g$PfGcIS2ksF^FMv4r*e(4!s4lq zGZY=y3n-|s?F9|qJP&wVqp-Vr%N$wXG~ah<<2n_1bXOxwh)(%+K~;WV?|OwLF!Br}YbKk+KGl8@r2pTAYL~ zv!sMu5O_Q*>N)Q$0SEmWQ1o^dFDbEe0}Wx-f|jTKwZA1GTlq85>_K@vXv*o)ZN;{L?O` z*hw)pYqEewe#`jYoOyHch9qy}K`Ev!SvL+!#V*Rf>G+VN~2#xG})_k$X!IOh$x!YZ^EsGTo95A>u zEw%StL(j5TjQor-dw*RFoOtnw?F>zKWRBo;A5^}-*_mg#PiyRQ^Jc= zWnO-?l<_+)^|qnsS}wB`(~o5$?%Yc+9jDbty9%~6Nck>d7G-KSeB1l1{o2FvcT3NnX~+he=eTs4IGUN zi=wW*;5m`8YH1}$Kz39?$(9t8jhD1p+MJ@K!5ToLOU%s78axh(M!Qt9KRoZf_{D3! zh18kTo80o9JV|(>%C3jXPZLv8b`+f1xq=IMN z7fq};d^C!Hq=IcvSI99fKE2LO_-X)m>beY7a+ zH>{O5l-+h{IS)#pA)ZqOBswDdFJ9b#@rZY?fJEQR43m7G|9cFjjxRa>@x`PyjpxM| zzbq@5=F5DsO?ob)WbWZW8K%YF>)eDd2JkjMjFRl@`@#3##`0E&vVNWW^pxIfp^Ft8 zY+2ZnCjSCOPu3C*7PeiV4Wk76)e?%F6I7PWz4*t_=JWB4JwbBo7bjX6R3@9;VXvR* zvflR<$Q$3JBNYuI`~n#)>$W&Z`yN@+cEH2Sc=6BVil_Y-e=LcsX*wj7BK79qgo~4= zY*RFtRn{KHwfHN;=NGOmi&gnfDjMv1l4Wv{=c#~1=F|r-T3ZjR@9#5vutIwJVsY`l zYpIJB8?0F-_@7#IRJCofvBKh&{YwNS*39j{*i~twC@jpRY&o~**~EqO-Q6BfC@Zv( z+P3Aq{NhBLlG6%NYpOswVcYEvzQ%)gpADmS^s1$SCQ|JrB-{=sym&V8;tuIt1^%Z( zbtZrL`hU%w_4dHU;0vyx6q*VvAAKPu{;K231zqF7zC}cuczX5$`m6hljRN zkNQF9@h7w~nEIavjVt;lRyZdZ=BF}-R%3+0#=PnG*8Ap`0VA9r_d*kQw@Ki^Zt7?`*j z@;X%CdzIoR4`+~I!-`o;TQqbTSi~3>WxabpDH3GBRM)Fw zM;9+-Z8*Rb;2XjkXahFO!8GvegZXn;RoK1K^5Rz5z_4J}iYSH6O6Hds1R@v=yhC`W zTOX9p1Q`&avg+OGxs9NVEW$oQ%rCfgP%cT=KAc4e1uYwad1{T+d)MU3U zT*wO29~a^}A@co|t8uOFnT#xA3_XIOuT!rzJHESW6(`HYBF1p$s_N%+VHTgw%QNT3 zmj7c=*uZc^DD?QByvt|PZaj5dH!(7vH^>>}Fo96*y6-igGao3Z?=`pinf~?y6Ne7N zQP->Ay#6m(x!IwECsQ+4PJJoJ-d7!~*7tRGDQq^I7yRprKHL7E>p3H>X&f}bhN ztSPv}6kP2m6~)lVx}amlEsf3lE(sUj%G|w#AFNxeV^ylr>pua_C)VtBI=w73_DQ^*T%LSG z)l_eG(whcTh!oqOrz@9t$uGYjbhNTi((&zF$+qH$j7;1P3V~l=^7Gc%m)^-ZoRcZF zSGst`+^pN?%Y#8-ArLB^5_ar+aQZQs&&>^ocYa`KWPMO`x2m@G@5jgPEk$+zc5kly zTKCP@`eXmvUtS576S)K;80HCU*w_F2^YwN3gpIa0Ce*1|Zpd077NfuUP+Y2PfeJ$- zt3c@ekY5T?uXBIisT2Eic6M2teDu}?`#XidPE>=_Qpc)b(HGCp&p%%HW@==i-i^wz zJ31@AFZ7eSd)uwbItP?48(3bYcx%7DEG7BM_rl}ZWqmx;BhFvQTDVX9%PRqe4Gj^C zUM)Um^=$j5qPrVE7oKr%^IkLk<-(hJR{y_)!-PX+mEF|H!=~4sPCRZ|YTL1^>XgxG zlj8;EclS58pJ8fbP1wKU*NTmOf@{|_>Mv1}VVBxaXJ6O6^K^#!{<$_~@sl_NA{YWq z!_#6fL`-Ire{OMMgORq=nHb|f=?VrWZjQSQGZt>_D_*6f%<6o$|CKxZcIxj&jh>sazke)zG0ib6qwxS!Rp%;6 zsiZZ>toj~bUmx!n7tglyc){M&llC34c_drvmf3iKX;;UpAGICVuU}UZX_(; z;*h|Y>U!0!x3uU_VV=RCjHL=wjh=a*F-<%9TkiAu35!az7@4?TuC56(j82Z#cy%!< z($HFfkzZ;4^31%t9?65{^53Pv?p@Wn>Sn3od)~JGDu18rMa;!!^t09!+^`JuB_ivVW%2ehTkRXSxwrArRqU z8dw@{r8DDbQ`oi5i&S#7wG-ynoeI;oKRHKgqqrQ83CP{aE}>_9s@#&-PH!`giu|4~ z_;yayhDYyj2fnSHZMp4Xm3@FINLe{|<$>wG$2&K3mi1P8XlMV>StPq{o<~~iFRjlz zw#OITV`f;&%EWD&VTC zWuG5>4OsW*^44D;AG^!^+^3zxz{EY%<*JcpvAy8&ixKkAg+8zyp4^p~+$i(zLSS*H z!sdNd(h_?vgHuu9)eG&vma7r-txSIJy~zD+llF~sISKuLs?M!;7Kl(- zm6o|i%3Ua?z;{dZqW!Z@O#F85#n-JhGllkUXtXW5?BUGKBG$3W&?@ckM3%(USqH+x z{s{l+e{Q}+f8Gfj!}9p)?O9T_RkO5bvNCb6b`8Dp{_(jNGxkaqw!L%h;@to*xT;Jbi1udHLo|Q%e)w4#wXXk-qmR*=c%i z!0Ebu_8dAP!l55c!@7E{&qw8-X8v*|?AnCS`h69D7e0=+j#!y`?O6D+gZ3M*TwrQ! z)m)^t>_F9qLiLr$x<1$*{2*k#$0+xE{xR;{eX?;f9QIY z)YNwycm8*tnEm1Q?A%A(2bagKVfXh{*f1d|T=$$#wqM1r&kE9&yKkI6?Oh{Uv1#ho z?{c$~)8@a?C|r2fI`*rd)$#mebM|mttG z$l;#7GWd$^Pr7~k(> ze%Wi3FZq_apX+AYFZ+Djw5vuxC%JApJ9}=MSYxZ}BCQ1ntTzAqoV8}saqG2n?%oT# zR_UBNC352ZWB2&iimaCn|F;69aOvH?*h5QSE!(*N@tIFE%e&5Mye>WPlyh0frTyk? zX^{b%Q;wXH-z%IZ6~!VJ82bFz{y<@$l8Z%)o=i=BePiR2sivNWC;sLukHg%t1fY`X*_MQ?AWi8rpRBp>1|T#g8o^lXJ;gsy#4g{Y5&dCuxY)| z8I@11c4k_=Y+YCJw89U+r!sR*&!0QPJ6X1pZ?oKuQ?p{DwjDq4llM(!YSqCre{3|}Z~f#<>jR_LZ$A|6y?5$s;HvO;mawL2 z4tp2oiT7pmSg(?E=WFgSK6ACy`tqr+#j?x8);yHH!gTGrNV(%Zf1QQb7PN^qx+biZ z$lW5HyIfALqUYWMsn0&wuc)WjY3n5UrQ{f#u~ReY;N4u~T2UPI@%!Y7kt|}3ra1?m zZtv5*+$Y%daAoGR+|;A>&*Xwuhsp78t9_jOP}sCs_Wh!Tt_c?-w!7U_3P|upN;ijH^iFXUK6fsUT=8)=C4i@v8AmGy48OK{13Q&X#f2HYq>Tb z<2su?v!BKP4b*R_|MzESZCSS1xdZW?b1vJ-M(SK9Z|fp0ZuO|O9@*nM>z%}9b8-SI85 zy=w1|F*`OTn!Rd&WZq)eXYf*7UA_8A;WD#o1LJ>nH*QoI81SxDe39_B^4p=Kd^WdiK~n>&?6M>9R9l zv#rS%jx~FiW?X;y>Ndap{yEQ#_Jy9Dk*$}0V{cdD-;+Vkb%qnqR9RoS^6JA%WznM8 z_NyDR8#Xb$K4dSH68!npeW@Eu{RKtk?=QK+_dejg?e#r+GXLU?{{2+ukE=}Yd7IxZ zTaXppZc-ZG72eK&;oz>--xp{8?6LmRuQK~fw#=8Rv>S=@1DXMV10S56Fku4(_{<_u%EtqG?j&0j9h2(&SMBhtSl+1lsywoAu1zTK>RQu<-N z`@9v`jkGSWo4={;nsv#Bb6o#jZs&d4mwkS>wo<+?RBZJY1qr@q~FGc8|O^`+XL zJ#6<)KXIt1WoHORq|d+Yb#J9iL2J(a<@L{nrQ>_oPLC9S64-KjM!D=J`zOYiV#1}C z-`iOq^Gok{N6D?Q^rfx|qB-6%(v>o%J1@OS4tAK<@YCY;o`rRBx~{u>EZpf7u&*CHzx+VBwv-QJa9IJo6R`?ny0;_x9qFq<-0d2-QPR;JNNo4vjaZA6RY}g zHN9)%_FGGqHis@z|M=!Xv;9e5qu;Y4*?VSA7WV(U;OEAvqH9yP>ZDz|+r1~-!1SK< zve~WS?JGV+{LlMv(7tX?`p>VM`Mz$vvAJ3E!l|zM*e^fN9r$?AU-|7g#96TPXACw4XaKJQ;s8y`uek{Dg`|pkAeZwf0FuuUh2UgS5 z+2xIQu32Nk`~8hP|9!T!>k*RcYa)%eng0HMIPamqtb}hAbNz>|4{J_8uAf|UW!LGa zPkub!KK=R4{cq>}ef(wh0S@=LyX7CPf2&t5HTrY)>Z9_+i*b8xw@Pf@U-kLbhKUEf z)_!@tSL4jrDaK`Ua=*X%f7R#wwq-%vH{CN+;fg;XW67sHWA9tNe}`8)GiC2xk@Yq6 z#{G}a-^%rC8RTZ4IUXCfId!I#v(k~s+Fa)scXKCA5$iP#48NM;v}S(YD}h&ga_iTa zom#PR(!B_qRcE%}J!Jp#IoFqeCv}*#A0>H+PkFyAJ|QqxL)UiuTlwwLVcbt{t$TFK zC2i~7L;IhpKXSkL_+e&-V8r&2qdoc)j9;y~BK7f*$RqW>o5|4&8k@4$O#Zd_Rg_0b znA5lQ<%jK#rv9&!+1OO)JB3C6_A4(v!8w6Zxj)ygT&nszs-k?E&-2(n?vFSBc%NQj z)P3OA`hCfEYixeMTN9*XdVgoVPqlQ#r{$B^HB}j{{;c;;VW#e(sqRygPFhBsugp8q zC{w+DJ!jFHi)W4fHp#y$4Y7RsbeXc!oZzkHJh}N*os)%>EleKFy?MMZy8n~h%(k^YOYdvR9{dH>b!*?q-MzR(chXsY7tq==zeHSt@iCg9OTN7ut{kE1zZho))&%Haz zX!U0or@35)`6~OAWCAXJu3KL4e|4|I{QoXLR($xk+}zZz`sZTrx<5YxAN-zcEib|L zM=$4k0-N6XH}c;9WGiRp-_i3?d0_s)bl=N$nj572RBjbVEDbBZ_oC|hCaujr^Kw&L za|5T`d_QR&XULChi__JG{@2N^=i^*sTihvA)9r40Rb(gAn}clMyrf?Dobf8$A3Zbn zTdLU}vB{C9b}tk+XRL7*KB@FdyLSFmr32?q^m%!{I+#+t^s(1-mnl1icLllX7w@@w z_EtLowbI?wDR!!C-DQ%ZJUTz=`)r=4?tX=kokd|~>x&usg@f1W<$-43%Q zlWvEcSR*F-=;rgzTYRgwWR@&gcT1J8>+J*0Z@WHdYr~2G0hH16O zgw#JmyCb^xykFL%zv`7}o3f|&>bGZ)^s7I;eKOm^dKK2#&I&Vz0EqXqC#x0}MxebZJnFrdg9Y6R-I@jdXCS$#u_o|z}FY$b9 zditK{+>1f~-~Ru5|McWv(TD2){z~<&?V0)ZeJ2olu z+4|$t6gOZz;l_JoD8 zJZ8BsSzDP9ni}>kYwNL8b>;R0vv$Xvc6rs)BzweS@|F`3jiomKV-rJrzm{ix)w**a zEX?F_$lq=I{moBb;aC%~a(_fg*xwb^Zm;Cmt?R3Po;=lOV(8Pyf5XCj_8c>id5LHD~NZSA^$H|ydq?ulPt=yh~? zu)^kbsUb|-j@Bx_-voX6e9TI(@4za-$-JNceN55Tp00VVzwBxGZ}*FPw{4qiJKLL6 zM=JZ;l}mfoWnb(FV0yjc-@?+*VPOxu=9#N6FFsW%EP8L=*Bgc6i#iS{Z8&y*UFEU) zOV+*PShM(7VB=QtyWwls9D2Vbi({@1->%PDi#(lQ&+6pRVamSohRfzAi+F^u$+fLV zV&jr!^P?iamW9fn)X(wIa(UOk_FML^*{;0@7HxcYZe7IjAN$@Xm2C)ed3H7>*82MY ziIMhoe=KU;CL0JP@tw@QAH3EjK`>%_$=|>)3#M34?$X)N$9Dh2^?NKofBmY`*?-U= zT*8H~;ZS<$lqr$sYh4m9MuY`Q^_sdQv~r#6-5#+duHUet!P{&-MT3pJ3AV=(68-@9?bH+$+~2#BFALH10bj?vge= z(s_?_f?$MrH4n?R<4xb6-~aRLt9AvucbC8J+Iy{Y!opsipBCO%bG=aXk_Vb_?mMeN+SUvlzLX=0b^Ixy+x`t>cJm|lOB zxxa0V-M{s>^{e?rSKRJbUR8Uf@@Lq!<eEpN@e>szuT5OGOgZyY}fz3J^jb3?rfT+ zwPD$+)t+^0YCrg&nRI#c)YLx7$;Br2=QfBoUbR{{J^t|G9WmS6GS;xZ%37e^oS)q* zw$AvJ&(*MN(a{qlO^u4@@O|$w6o`1sa;>Lf-6~Kf*E|1l*|Df)>)!3&^zCf+PA~7h zVb_+&WnZ$hUv*z*>-Uv8^VV{#iMv@7#B$xcc>cBJU!}4)?%HK@w&ZP#S~f!;>;Lx~|MwEy{+d~* z^ujyS>oX7Vy_l7*8>XzL@4xxRo%HI>&MPiN1UD6VzfkGDK6zKx50m6qtBj3x!;Xoa zQEl2eulMsFzsw+u`?`l$ZJswJcZD{ScKbRnsjbhW!{&-V-#s(zt-zVt;U?WjuSYoR zTw5|#RQ>bwsD)QV8>bePF6FqR*#Bv*N!WaqxQM9U-v1&=Tl_CrM0hX ziZ)#l?VTDCew6d+!+hr1I=Awh*M_!P+24GVcJtDyPa8isZBW^~Li^{g2e)pR{)kR;vZZ>zn9hnvwKI!ZGNw*EMr?gDk^f>KA>E(#`pGx1pJRcpv_;%W%*~$ASW^K(` zxq2Vd>Kc|avu}Ny78-ZfQ0vLA)OBG$tA0HC^tO1;#;sOo8(+OxvGLa&ZgKms-y_c( z^A#;wmvwrLU7^tB{hRq$hSdfb1eXg>SzHp@)omB$8oS-vN-ArOb+=yZuGiaK*L-*y ze#9-fG4+&oa80rJdds65LtkX2PF;WJu3l+rtu;qq*=Jw%wN5)LQZKC$ztnei=i-e~ zvN1tvrdKCKUJ-3v+WB?wIxnrY+jdu6&s%5|_|{{CHNVZ*D#h2cJ#(in)nRcoC_Htu z^lF@b{`nr(b0^AFZp?JObykXZyL0N4$Sa~5YxGM)B{R3)JH4>%S=s6Zw%b$oMz59a zF(_@iYu7iiQbB5&|IQ`rqF%meklgS*Jb7+(WM0xrS({qEq}E;0iPu7-!?bH)x*HsS~U7v@EF#@XFORhdv@lGzC5GMF+ z)AgQQ+Z9to>jLxVh?lnZZTxiQuy*fN1Mcq=!=~=3%>6SrIx;>s@n%fC)+~h$dTE!^ zCu=rdb&pzGzAJxj)08vwq+Tz6DI>Zp$>~|_uL)ksUnhp0o+Ec{Qm(#S=Iv9zvJcN= zUt-C|YV`hVPo;fkS)6YD^Lrl_O>I+O|BUO0};{^9=l6gbvM=()%IfT*DtCxv{P=+_1y58{ftSNd8X*uue;jPCOg_^fv5&1|WiyM%#(zXY@vVBe;oj5W`KBL201 z__ci9sZTL4Jo4nlPHs-tmpGYm{()w8qv!6EI;-VQHt9URcJasQ9LGnW%Y3$dz4Vjg z=BcPP)pr>ATe>%2iGSJ>n{&D-d%Jr0_b#6P?M8q3Iq~mNTUVXgbZnx+gIV)CZA@3bmGb$_{O;*}Za0mbb$fs6hPX|7 z-Y9AqzBpC1;32DL%31y$(_7C=FFZW&h3-zh1&Mc$a-QkkbI$zI_EXDKFHH!JcrLkN zYHipv+ux2$O-(L|g+_-7iY1^St2F8G$Mw(emTx74%ZHiH)~dltvObbX>wipYsm3P5ucBKX`SmtEPanSDTJ9Fy*F9>l>1Ss z+uLGg<j|#a;rCS>imnzIa#%Q&V7qCD;MM_-O^+lG=I+o zRWq55lh2(9I&MAlsLtu6=81`_OUygeznZrDS*lpQe305-E_M3iS?+6FS2T0Yx~;I} z>MV}JbdPU_(Q5B~9Fu)}Z9lS!hPVkRPJR1kS)BK?M%FEx)Lc8x@LW}@6-$_~QZQ(- z-0mF8!p+#{rpKv=9<|z9n9LSCg!)=&)XVmdqnN2`HLenW9Mvsf0zGrVDiMs>tcO2 zJf(}$(za}Se`Cq{d+Fi7wnSM^U+$J{J6kCwK|{z?-by$B{9H|^qaVL_s<|f5GZxF_EI6?wU-J}2v2q@+P5Z{CgglRDmR zn_7Roi+-c~+iR-bODnB}4>6D9(+bw=%oKaHyHsw=C;P2zo7Zs8Fe>xgQkwHo|5C&x z&X$VHDY+l(Q;Vm~lrmPeZndlX+MvLJ33pmi>#va->3E+ z>KO9t#Bxf?Ke~HcqqnU4r_t-x4NoU$ zfrM-Od}@C$WYV7*w~gobn*RA-yUb#>y$>*JUvu6vSv+bf&+V8;67y@rj%9gfr(cY4 zlAWr4%O>kgE;nFDol^H8|?z2KD9ZIed)*SNC%=ZQI0RW{}-#axyP3e@goM+wq!Ga_4P*rQDM_ zGY>Q;AG8s=@Q?TX$+ShiZEthVaIDoi$kP+Ap0`?c?X2f9(=GG(Rnly>ZQFE1USem| zsX2Qlm@nUvx}t4Y=$v;ECpp*MHWmBLd|0ffM@(_8%C8xL3>txxpXltaU9~anl#U*Q zjm|Ysy_b6e^wZLI9C%b^HfP4`jb}D(X_Rpd{MJ7q{!`V##LZgMS~tWcpPd%Dhv81G z&z7!j%V#jfttbqL>@O%YdF@mVT+$C;$c z143RoE2_RKzyIwUZq?Q+-)5!1nMHkp%%;%D$Gdf-d3d(7InTWw@jX>6n>nZ^%z0}4 z$A{Z;xC?eDOT5yYsj9%Zb;I z(Hz4<&DWYUk8Wsq61P+C%a#q?n{^L+22a~G?@~m1ir8c(qiVI{%Ef|Nzw%1gEGf}l zm!3N90P~WsT+b%`b#@I`Dlg%XHn(|qDPsO99W$0CUrnARoe5wo%yD^pGcxb|DV=M~ zPrlSVyR?H#G(oQ{$4I~XU1aZ9_q2`D3JcXYNMwrY9*B7(k!$sCwopRD*EaPts+--p zHyFtkIxkf@7SN!2{Yp}gnC`JVZ*SCaO;ZtO42xyWJepB>Xw9m7zP2l4tKaLG9AjLw zcg>})qmNoF?TmK2$JG~;#i+MnNMotPdfJ-dN1!IaPM_?vBN z_ip^WpgQS}kK_h5YY*+RXyKfF+}zSRoqsOrw&+M6n6<{BaA(fEyEn|%_}*EXyNqGY z8TZe!Ut?!KkjyskUA^Jsv|oB}KRKpeWe`hW8KS+C*F-i`)bh!lhsjwCYtAqA-xzdT z;Id)zlL^J#TRj;!cwP6@=FIE3YqGAXea`DGzU&RHyP~2_7W#zWC}~}Pd7YvDY4#0a zub&6Ze7C82hF;p0o1%Gt7}nhQD?IVdyBXbI7qQNh-r6hE;QG6c%Wm_j7Yf(9g)8!| zn58jX%jL*aeSOzl@U?5l-g)vePiAeM%5)(@_VeO9<;UIEY%doz*}ng_C}YHdh4Qwk z2dvE!_r^Xv{^?`y0rv)x%OO#oP0n|YG`v=xaQ5-+rhW#^V;oBl?dF=nINfzYa9r?> zmVO4N)yeNB^R`DfFkau$FgIADeKy0))-98S+jn{f&dhZd^Al{j!*W7r$F`GfEd&{eNN_RV^A9d`RsmfQ$H6g%b z^|i>N#?2v8r&rxBdZy`MHZd~lxz|^<>ARASi7Y(f+mQ2!b9er(nD;uN=^Za;7*>2J z7H~+I80I_qnOpiwTj!o*JrfsCENAd++45?J$##F2pOQ&>X+4s?f0#U!mW1xUB6%cU z>w-r8#*{4$PXry<6xZHTy^yi|T+~!&pCgkBg{0ycCT)FnBm14<)eTuDrz~_N71b&k zCs=b$%Q~g-GUMnajm;aL+?$b7@9;=rt<=dT5k29M#WBYw?M|BXlri#g)uU;SmzG{} z(F(BWHDXO(7rrZp@4=(VGrvsK+qmrWED7lhmSZt5MXs@ZD6vvlYZSI=Ph7TK&OXPJ zFQm%YKE${wteq6Li7CD0E6+kn;q5Ky(vw>mZKjK-^!B8#=}~(pRu}v{Tlai)QV#cn z&Mm78r*7#H{Twx4A;utByQKj_I+Jg2lL}9Lw5?O#+UN2l7KMvXw&{MJ#(6hv-Ib-x3@_ET z>`J;VRe1YC|F@Zp4L!oQmYkVwRbst5CEkmvVTtgG8QZo`?~L15d`+Ce!?y73i9M2w zr(f5)*=Wvq!Y-2c$B%+QwNs)8V!}>J?csD_(#p0KJ12C&&R0Y1z#dKqDX+{epTn(< z!~ZZmTb6X}VE}_sU}WaeLy<`{n!9FpI5T><#pWD65u+R^q0X>Uc>atReN!VW5+rVy zgzEQLiZraba?Y+t=9KT9K>ePdA`M5ToHSb8bNED|(oFqVu152jCYb!b)iP1JqE{Tk zHM|^=+~z1znQw5rB-C`qPSJ*vn|DRt>^a@36K^`BQmmn5<^d+|o&)DzH_tq~n$7q; z(*$i#?Xr8q=Xv5x=T(X|#AIH36BA>8T3Sqy;Y8$Y?hUs#oH^kWYqVsiXoF7XCZD}G z_xQx>EU^@6(2*?fGkgB6GjZ8Ek*j++9lA^$mnwCYq`i^~JloIk07N^^n%m- zv*cJ5>}O4xC3tbtnz`m1e)2Uuktnp9n7*WF%@)P%be^0zXP*Y55QQK8h?n|E+Fv}8PKn|nKk zNA6Cl42y#kkI92Kz2<@2FP-L*Gdr}Ctsy64%d!bqU3la!H~(RB(CRTdXCxV!8JQ!) z*8j|1j!{8WYT?U}3m0x$WQ14jTKeFeYWm|lp;cz=4SJFr z-ZHO?G`22hZcx$qKdXA8=IUQ>co{WR0mJFTAA`jIgjbH+ z(vugwdY$m`j0?jC%j#Q&SGP4>{kD5Wnhe8@Y0gh?ZZkc@dR0l7!N9IJE2eZ^N^Ok( z2}zc-8&ArvHePdf?VkR&d(W#FW_;T6>SyV0Zk}UnZZa~wS`zY}Wp?=1bN9r5>M$?_ zZ(8-`)}C#g48MdJ3@o;Lt)Htshhc#+3j@Q6wR;ZyUXyr@L1C}bD&-yXe2*|Ncx>8p z;H6ITG6se7N=uY;c5PBxQ^hbL%d%;`F4tz}w2%K8Ta9_QEanrRz`(%3;OXk;vd$@? F2>|2Ff8GE9 diff --git a/examples/shaders/resources/shaders/glsl100/depth.fs b/examples/shaders/resources/shaders/glsl100/depth.fs index 0ea7c46e7..b330bd9c6 100644 --- a/examples/shaders/resources/shaders/glsl100/depth.fs +++ b/examples/shaders/resources/shaders/glsl100/depth.fs @@ -10,12 +10,6 @@ uniform bool flipY; float nearPlane = 0.1; float farPlane = 100.0; -// Function to linearize depth from non-linear depth buffer -float linearizeDepth(float depth) -{ - return (2.0 * nearPlane) / (farPlane + nearPlane - depth * (farPlane - nearPlane)); -} - void main() { // Handle potential Y-flipping @@ -27,7 +21,7 @@ void main() float depth = texture2D(depthTexture, texCoord).r; // Linearize depth - float linearDepth = linearizeDepth(depth); + float linearDepth = (2.0*nearPlane)/(farPlane + nearPlane - depth*(farPlane - nearPlane)); // Output final color gl_FragColor = vec4(vec3(linearDepth), 1.0); diff --git a/examples/shaders/resources/shaders/glsl330/depth.fs b/examples/shaders/resources/shaders/glsl330/depth.fs index cbcb6da67..65592c83f 100644 --- a/examples/shaders/resources/shaders/glsl330/depth.fs +++ b/examples/shaders/resources/shaders/glsl330/depth.fs @@ -13,24 +13,17 @@ const float farPlane = 100.0; // Output fragment color out vec4 finalColor; -// Linearizes the depth buffer value -float linearizeDepth(float depth) -{ - return (2.0 * nearPlane) / (farPlane + nearPlane - depth * (farPlane - nearPlane)); -} - void main() { // Handle potential Y-flipping vec2 texCoord = fragTexCoord; - if (flipY) - texCoord.y = 1.0 - texCoord.y; + if (flipY) texCoord.y = 1.0 - texCoord.y; // Sample depth float depth = texture(depthTexture, texCoord).r; // Linearize depth value - float linearDepth = linearizeDepth(depth); + float linearDepth = (2.0*nearPlane)/(farPlane + nearPlane - depth*(farPlane - nearPlane)); // Output final color finalColor = vec4(vec3(linearDepth), 1.0); diff --git a/examples/shaders/shaders_view_depth.c b/examples/shaders/shaders_view_depth.c index 5da0c1ca4..4f141acb9 100644 --- a/examples/shaders/shaders_view_depth.c +++ b/examples/shaders/shaders_view_depth.c @@ -34,11 +34,11 @@ int main(void) // Initialization //-------------------------------------------------------------------------------------- const int screenWidth = 800; - const int screenHeight = 600; + const int screenHeight = 450; InitWindow(screenWidth, screenHeight, "raylib [shader] example - render depth texture"); - // Load camera + // Init camera Camera camera = { 0 }; camera.position = (Vector3){ 4.0f, 1.0f, 5.0f }; camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; @@ -56,7 +56,7 @@ int main(void) SetShaderValue(depthShader, flipTextureLoc, (int[]){ 1 }, SHADER_UNIFORM_INT); // Flip Y texture // Load models - Model cube = LoadModelFromMesh(GenMeshCube(1.0f, 1.0f, 1.0f)); + Model cube = LoadModelFromMesh(GenMeshCube(1.0f, 1.0f, 1.0f)); Model floor = LoadModelFromMesh(GenMeshPlane(20.0f, 20.0f, 1, 1)); DisableCursor(); // Limit cursor to relative movement inside the window @@ -75,25 +75,19 @@ int main(void) // Draw //---------------------------------------------------------------------------------- BeginTextureMode(target); - ClearBackground(WHITE); - + BeginMode3D(camera); - DrawModel(cube, (Vector3){ 0.0f, 0.0f, 0.0f }, 3.0f, YELLOW); DrawModel(floor, (Vector3){ 10.0f, 0.0f, 2.0f }, 2.0f, RED); - EndMode3D(); - EndTextureMode(); BeginDrawing(); BeginShaderMode(depthShader); - SetShaderValueTexture(depthShader, depthLoc, target.depth); DrawTexture(target.depth, 0, 0, WHITE); - EndShaderMode(); DrawRectangle( 10, 10, 320, 93, Fade(SKYBLUE, 0.5f)); diff --git a/examples/shaders/shaders_view_depth.png b/examples/shaders/shaders_view_depth.png index b68de9644cab86bc0ff3422f147bdee0a59a2494..ae4c8450223497fb977d33ccb038789ac4f840e0 100644 GIT binary patch literal 30653 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

uP@zKimId|c7#HR(#6nW@9GUb8?6 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 b1H&!%-0pii#yc4p7#KWV{an^LB{Ts56y0O# literal 11335 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 Wvux(SwEYYW3=E#GelF{r5}E+rzr5f8 diff --git a/examples/shaders/shaders_write_depth.c b/examples/shaders/shaders_write_depth.c index d47ea1ae3..2d24dcaed 100644 --- a/examples/shaders/shaders_write_depth.c +++ b/examples/shaders/shaders_write_depth.c @@ -74,7 +74,6 @@ int main(void) // Draw //---------------------------------------------------------------------------------- - // Draw into our custom render texture (framebuffer) BeginTextureMode(target); ClearBackground(WHITE); @@ -93,7 +92,6 @@ int main(void) // Draw into screen our custom render texture BeginDrawing(); ClearBackground(RAYWHITE); - DrawTextureRec(target.texture, (Rectangle) { 0, 0, (float)screenWidth, (float)-screenHeight }, (Vector2) { 0, 0 }, WHITE); DrawFPS(10, 10); EndDrawing(); diff --git a/projects/VS2022/examples/shaders_view_depth.vcxproj b/projects/VS2022/examples/shaders_view_depth.vcxproj index 5f6250256..c176cbf33 100644 --- a/projects/VS2022/examples/shaders_view_depth.vcxproj +++ b/projects/VS2022/examples/shaders_view_depth.vcxproj @@ -51,7 +51,7 @@ - {70B35F59-AFC2-4D8F-8833-5314D2047A81} + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7} Win32Proj shaders_view_depth 10.0 diff --git a/projects/VS2022/raylib.sln b/projects/VS2022/raylib.sln index 8c0c7f747..4f8c3beea 100644 --- a/projects/VS2022/raylib.sln +++ b/projects/VS2022/raylib.sln @@ -271,7 +271,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "models_loading_m3d", "examp EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shaders_write_depth", "examples\shaders_write_depth.vcxproj", "{70B35F59-AFC2-4D8F-8833-5314D2047A81}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shaders_view_depth", "examples\shaders_view_depth.vcxproj", "{70B35F59-AFC2-4D8F-8833-5314D2047A81}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shaders_view_depth", "examples\shaders_view_depth.vcxproj", "{DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shaders_hybrid_render", "examples\shaders_hybrid_render.vcxproj", "{3755E9F4-CB48-4EC3-B561-3B85964EBDEF}" EndProject @@ -761,6 +761,30 @@ Global {0199E349-0701-40BC-8A7F-06A54FFA3E7C}.Release|x64.Build.0 = Release|x64 {0199E349-0701-40BC-8A7F-06A54FFA3E7C}.Release|x86.ActiveCfg = Release|Win32 {0199E349-0701-40BC-8A7F-06A54FFA3E7C}.Release|x86.Build.0 = Release|Win32 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Debug.DLL|ARM64.ActiveCfg = Debug.DLL|ARM64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Debug.DLL|ARM64.Build.0 = Debug.DLL|ARM64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Debug.DLL|x64.Build.0 = Debug.DLL|x64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Debug|ARM64.Build.0 = Debug|ARM64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Debug|x64.ActiveCfg = Debug|x64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Debug|x64.Build.0 = Debug|x64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Debug|x86.ActiveCfg = Debug|Win32 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Debug|x86.Build.0 = Debug|Win32 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Release.DLL|ARM64.ActiveCfg = Release.DLL|ARM64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Release.DLL|ARM64.Build.0 = Release.DLL|ARM64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Release.DLL|x64.ActiveCfg = Release.DLL|x64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Release.DLL|x64.Build.0 = Release.DLL|x64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Release.DLL|x86.Build.0 = Release.DLL|Win32 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Release|ARM64.ActiveCfg = Release|ARM64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Release|ARM64.Build.0 = Release|ARM64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Release|x64.ActiveCfg = Release|x64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Release|x64.Build.0 = Release|x64 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Release|x86.ActiveCfg = Release|Win32 + {BCB71111-8505-4B35-8CEF-EC6115DC9D4D}.Release|x86.Build.0 = Release|Win32 {8F19E3DA-8929-4000-87B5-3CA6929636CC}.Debug.DLL|ARM64.ActiveCfg = Debug.DLL|ARM64 {8F19E3DA-8929-4000-87B5-3CA6929636CC}.Debug.DLL|ARM64.Build.0 = Debug.DLL|ARM64 {8F19E3DA-8929-4000-87B5-3CA6929636CC}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64 @@ -3293,6 +3317,30 @@ Global {70B35F59-AFC2-4D8F-8833-5314D2047A81}.Release|x64.Build.0 = Release|x64 {70B35F59-AFC2-4D8F-8833-5314D2047A81}.Release|x86.ActiveCfg = Release|Win32 {70B35F59-AFC2-4D8F-8833-5314D2047A81}.Release|x86.Build.0 = Release|Win32 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Debug.DLL|ARM64.ActiveCfg = Debug.DLL|ARM64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Debug.DLL|ARM64.Build.0 = Debug.DLL|ARM64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Debug.DLL|x64.Build.0 = Debug.DLL|x64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Debug|ARM64.Build.0 = Debug|ARM64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Debug|x64.ActiveCfg = Debug|x64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Debug|x64.Build.0 = Debug|x64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Debug|x86.ActiveCfg = Debug|Win32 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Debug|x86.Build.0 = Debug|Win32 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Release.DLL|ARM64.ActiveCfg = Release.DLL|ARM64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Release.DLL|ARM64.Build.0 = Release.DLL|ARM64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Release.DLL|x64.ActiveCfg = Release.DLL|x64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Release.DLL|x64.Build.0 = Release.DLL|x64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Release.DLL|x86.Build.0 = Release.DLL|Win32 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Release|ARM64.ActiveCfg = Release|ARM64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Release|ARM64.Build.0 = Release|ARM64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Release|x64.ActiveCfg = Release|x64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Release|x64.Build.0 = Release|x64 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Release|x86.ActiveCfg = Release|Win32 + {DFDE29A7-4F54-455D-B20B-D2BF79D3B3F7}.Release|x86.Build.0 = Release|Win32 {3755E9F4-CB48-4EC3-B561-3B85964EBDEF}.Debug.DLL|ARM64.ActiveCfg = Debug.DLL|ARM64 {3755E9F4-CB48-4EC3-B561-3B85964EBDEF}.Debug.DLL|ARM64.Build.0 = Debug.DLL|ARM64 {3755E9F4-CB48-4EC3-B561-3B85964EBDEF}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64 diff --git a/src/platforms/rcore_desktop_sdl.c b/src/platforms/rcore_desktop_sdl.c index 517e43914..70d529202 100644 --- a/src/platforms/rcore_desktop_sdl.c +++ b/src/platforms/rcore_desktop_sdl.c @@ -1363,10 +1363,7 @@ void PollInputEvents(void) for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.previousTouchState[i] = CORE.Input.Touch.currentTouchState[i]; // Map touch position to mouse position for convenience - if (CORE.Input.Touch.pointCount == 0) - { - CORE.Input.Touch.position[0] = CORE.Input.Mouse.currentPosition; - } + if (CORE.Input.Touch.pointCount == 0) CORE.Input.Touch.position[0] = CORE.Input.Mouse.currentPosition; int touchAction = -1; // 0-TOUCH_ACTION_UP, 1-TOUCH_ACTION_DOWN, 2-TOUCH_ACTION_MOVE bool realTouch = false; // Flag to differentiate real touch gestures from mouse ones diff --git a/src/rcore.c b/src/rcore.c index ea971b52f..ec6c94e94 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -1879,8 +1879,8 @@ void TakeScreenshot(const char *fileName) // Security check to (partially) avoid malicious code if (strchr(fileName, '\'') != NULL) { TRACELOG(LOG_WARNING, "SYSTEM: Provided fileName could be potentially malicious, avoid [\'] character"); return; } - // apply a scale if we are doing HIGHDPI auto-scaling - Vector2 scale = { 1,1 }; + // Apply a scale if we are doing HIGHDPI auto-scaling + Vector2 scale = { 1.0f, 1.0f }; if (IsWindowState(FLAG_WINDOW_HIGHDPI)) scale = GetWindowScaleDPI(); unsigned char *imgData = rlReadScreenPixels((int)((float)CORE.Window.render.width*scale.x), (int)((float)CORE.Window.render.height*scale.y)); From 80fcca4155fde407b1551721b6271f9a1fe527d3 Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 14 Apr 2025 12:37:06 +0200 Subject: [PATCH 12/22] Update rcore_desktop_glfw.c --- src/platforms/rcore_desktop_glfw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platforms/rcore_desktop_glfw.c b/src/platforms/rcore_desktop_glfw.c index a08033a93..ca7756627 100644 --- a/src/platforms/rcore_desktop_glfw.c +++ b/src/platforms/rcore_desktop_glfw.c @@ -1759,7 +1759,7 @@ static void WindowSizeCallback(GLFWwindow *window, int width, int height) width = (int)(width/GetWindowScaleDPI().x); height = (int)(height/GetWindowScaleDPI().y); } - + // Set render size CORE.Window.render.width = width; CORE.Window.render.height = height; From 5b940692ea298e62c06f2fa9e5547b7253e69dc9 Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 15 Apr 2025 13:09:44 +0200 Subject: [PATCH 13/22] REVIEWED: `ExportFontAsCode()` not checking `isGpuReady` #4894 --- src/rtext.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rtext.c b/src/rtext.c index 0d06caa9a..e7bc341f1 100644 --- a/src/rtext.c +++ b/src/rtext.c @@ -1075,7 +1075,7 @@ bool ExportFontAsCode(Font font, const char *fileName) byteCount += sprintf(txtData + byteCount, " Image imFont = { fontImageData_%s, %i, %i, 1, %i };\n\n", styleName, image.width, image.height, image.format); #endif byteCount += sprintf(txtData + byteCount, " // Load texture from image\n"); - byteCount += sprintf(txtData + byteCount, " if (isGpuReady) font.texture = LoadTextureFromImage(imFont);\n"); + byteCount += sprintf(txtData + byteCount, " font.texture = LoadTextureFromImage(imFont);\n"); #if defined(SUPPORT_COMPRESSED_FONT_ATLAS) byteCount += sprintf(txtData + byteCount, " UnloadImage(imFont); // Uncompressed data can be unloaded from memory\n\n"); #endif From fdb92b373b09882d239dc31d992d246f0395bc25 Mon Sep 17 00:00:00 2001 From: AndrewHamel111 Date: Tue, 15 Apr 2025 21:08:35 -0400 Subject: [PATCH 14/22] Warning to direct users to appropriate function --- src/platforms/rcore_desktop_glfw.c | 2 ++ src/platforms/rcore_desktop_rgfw.c | 2 ++ src/platforms/rcore_desktop_sdl.c | 2 ++ src/platforms/rcore_web.c | 2 ++ src/rcore.c | 2 ++ 5 files changed, 10 insertions(+) diff --git a/src/platforms/rcore_desktop_glfw.c b/src/platforms/rcore_desktop_glfw.c index ca7756627..239df0657 100644 --- a/src/platforms/rcore_desktop_glfw.c +++ b/src/platforms/rcore_desktop_glfw.c @@ -307,6 +307,8 @@ void RestoreWindow(void) // Set window configuration state using flags void SetWindowState(unsigned int flags) { + if (!CORE.Window.ready) TRACELOG(LOG_WARNING, "WINDOW: SetWindowState does nothing before window initialization, Use \"SetConfigFlags\" instead"); + // Check previous state and requested state to apply required changes // NOTE: In most cases the functions already change the flags internally diff --git a/src/platforms/rcore_desktop_rgfw.c b/src/platforms/rcore_desktop_rgfw.c index 9a5841c83..92e3def05 100644 --- a/src/platforms/rcore_desktop_rgfw.c +++ b/src/platforms/rcore_desktop_rgfw.c @@ -350,6 +350,8 @@ void RestoreWindow(void) // Set window configuration state using flags void SetWindowState(unsigned int flags) { + if (!CORE.Window.ready) TRACELOG(LOG_WARNING, "WINDOW: SetWindowState does nothing before window initialization, Use \"SetConfigFlags\" instead"); + CORE.Window.flags |= flags; if (flags & FLAG_VSYNC_HINT) diff --git a/src/platforms/rcore_desktop_sdl.c b/src/platforms/rcore_desktop_sdl.c index 70d529202..1621dd2a5 100644 --- a/src/platforms/rcore_desktop_sdl.c +++ b/src/platforms/rcore_desktop_sdl.c @@ -518,6 +518,8 @@ void RestoreWindow(void) // Set window configuration state using flags void SetWindowState(unsigned int flags) { + if (!CORE.Window.ready) TRACELOG(LOG_WARNING, "WINDOW: SetWindowState does nothing before window initialization, Use \"SetConfigFlags\" instead"); + CORE.Window.flags |= flags; if (flags & FLAG_VSYNC_HINT) diff --git a/src/platforms/rcore_web.c b/src/platforms/rcore_web.c index b3bb43b5b..bf5a6ba5a 100644 --- a/src/platforms/rcore_web.c +++ b/src/platforms/rcore_web.c @@ -364,6 +364,8 @@ void RestoreWindow(void) // Set window configuration state using flags void SetWindowState(unsigned int flags) { + if (!CORE.Window.ready) TRACELOG(LOG_WARNING, "WINDOW: SetWindowState does nothing before window initialization, Use \"SetConfigFlags\" instead"); + // Check previous state and requested state to apply required changes // NOTE: In most cases the functions already change the flags internally diff --git a/src/rcore.c b/src/rcore.c index ec6c94e94..5b2679c95 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -1905,6 +1905,8 @@ void TakeScreenshot(const char *fileName) // To configure window states after creation, just use SetWindowState() void SetConfigFlags(unsigned int flags) { + if (CORE.Window.ready) TRACELOG(LOG_WARNING, "WINDOW: SetConfigFlags called after window initialization, Use \"SetWindowState\" to set flags instead"); + // Selected flags are set but not evaluated at this point, // flag evaluation happens at InitWindow() or SetWindowState() CORE.Window.flags |= flags; From b4f1ff9a00e1dab70fbcb667beae623fdcf948be Mon Sep 17 00:00:00 2001 From: "d.isakov" Date: Wed, 16 Apr 2025 07:49:26 +0200 Subject: [PATCH 15/22] #4888 fix UpdateModelAnimationBones scale transform --- src/rmodels.c | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/src/rmodels.c b/src/rmodels.c index 73dba6aa7..2653760cd 100644 --- a/src/rmodels.c +++ b/src/rmodels.c @@ -2289,29 +2289,19 @@ void UpdateModelAnimationBones(Model model, ModelAnimation anim, int frame) // Update all bones and boneMatrices of first mesh with bones. for (int boneId = 0; boneId < anim.boneCount; boneId++) { - Vector3 inTranslation = model.bindPose[boneId].translation; - Quaternion inRotation = model.bindPose[boneId].rotation; - Vector3 inScale = model.bindPose[boneId].scale; + Transform *bindTransform = &model.bindPose[boneId]; + Matrix bindMatrix = MatrixMultiply(MatrixMultiply( + MatrixScale(bindTransform->scale.x, bindTransform->scale.y, bindTransform->scale.z), + QuaternionToMatrix(bindTransform->rotation)), + MatrixTranslate(bindTransform->translation.x, bindTransform->translation.y, bindTransform->translation.z)); - Vector3 outTranslation = anim.framePoses[frame][boneId].translation; - Quaternion outRotation = anim.framePoses[frame][boneId].rotation; - Vector3 outScale = anim.framePoses[frame][boneId].scale; + Transform *targetTransform = &anim.framePoses[frame][boneId]; + Matrix targetMatrix = MatrixMultiply(MatrixMultiply( + MatrixScale(targetTransform->scale.x, targetTransform->scale.y, targetTransform->scale.z), + QuaternionToMatrix(targetTransform->rotation)), + MatrixTranslate(targetTransform->translation.x, targetTransform->translation.y, targetTransform->translation.z)); - Quaternion invRotation = QuaternionInvert(inRotation); - Vector3 invTranslation = Vector3RotateByQuaternion(Vector3Negate(inTranslation), invRotation); - Vector3 invScale = Vector3Divide((Vector3){ 1.0f, 1.0f, 1.0f }, inScale); - - Vector3 boneTranslation = Vector3Add(Vector3RotateByQuaternion( - Vector3Multiply(outScale, invTranslation), outRotation), outTranslation); - Quaternion boneRotation = QuaternionMultiply(outRotation, invRotation); - Vector3 boneScale = Vector3Multiply(outScale, invScale); - - Matrix boneMatrix = MatrixMultiply(MatrixMultiply( - QuaternionToMatrix(boneRotation), - MatrixTranslate(boneTranslation.x, boneTranslation.y, boneTranslation.z)), - MatrixScale(boneScale.x, boneScale.y, boneScale.z)); - - model.meshes[firstMeshWithBones].boneMatrices[boneId] = boneMatrix; + model.meshes[firstMeshWithBones].boneMatrices[boneId] = MatrixMultiply(MatrixInvert(bindMatrix), targetMatrix); } // Update remaining meshes with bones From 42a40b3920500e7c56996c5ea480d61cecf698cc Mon Sep 17 00:00:00 2001 From: "d.isakov" Date: Wed, 16 Apr 2025 08:04:58 +0200 Subject: [PATCH 16/22] move first mesh bones calculation under check for its presense --- src/rmodels.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/rmodels.c b/src/rmodels.c index 2653760cd..a7f48fd11 100644 --- a/src/rmodels.c +++ b/src/rmodels.c @@ -2286,28 +2286,28 @@ void UpdateModelAnimationBones(Model model, ModelAnimation anim, int frame) } } - // Update all bones and boneMatrices of first mesh with bones. - for (int boneId = 0; boneId < anim.boneCount; boneId++) - { - Transform *bindTransform = &model.bindPose[boneId]; - Matrix bindMatrix = MatrixMultiply(MatrixMultiply( - MatrixScale(bindTransform->scale.x, bindTransform->scale.y, bindTransform->scale.z), - QuaternionToMatrix(bindTransform->rotation)), - MatrixTranslate(bindTransform->translation.x, bindTransform->translation.y, bindTransform->translation.z)); - - Transform *targetTransform = &anim.framePoses[frame][boneId]; - Matrix targetMatrix = MatrixMultiply(MatrixMultiply( - MatrixScale(targetTransform->scale.x, targetTransform->scale.y, targetTransform->scale.z), - QuaternionToMatrix(targetTransform->rotation)), - MatrixTranslate(targetTransform->translation.x, targetTransform->translation.y, targetTransform->translation.z)); - - model.meshes[firstMeshWithBones].boneMatrices[boneId] = MatrixMultiply(MatrixInvert(bindMatrix), targetMatrix); - } - - // Update remaining meshes with bones - // NOTE: Using deep copy because shallow copy results in double free with 'UnloadModel()' if (firstMeshWithBones != -1) { + // Update all bones and boneMatrices of first mesh with bones. + for (int boneId = 0; boneId < anim.boneCount; boneId++) + { + Transform *bindTransform = &model.bindPose[boneId]; + Matrix bindMatrix = MatrixMultiply(MatrixMultiply( + MatrixScale(bindTransform->scale.x, bindTransform->scale.y, bindTransform->scale.z), + QuaternionToMatrix(bindTransform->rotation)), + MatrixTranslate(bindTransform->translation.x, bindTransform->translation.y, bindTransform->translation.z)); + + Transform *targetTransform = &anim.framePoses[frame][boneId]; + Matrix targetMatrix = MatrixMultiply(MatrixMultiply( + MatrixScale(targetTransform->scale.x, targetTransform->scale.y, targetTransform->scale.z), + QuaternionToMatrix(targetTransform->rotation)), + MatrixTranslate(targetTransform->translation.x, targetTransform->translation.y, targetTransform->translation.z)); + + model.meshes[firstMeshWithBones].boneMatrices[boneId] = MatrixMultiply(MatrixInvert(bindMatrix), targetMatrix); + } + + // Update remaining meshes with bones + // NOTE: Using deep copy because shallow copy results in double free with 'UnloadModel()' for (int i = firstMeshWithBones + 1; i < model.meshCount; i++) { if (model.meshes[i].boneMatrices) From 5185d4c4272dd745e94273a442b4df148e8f5b4c Mon Sep 17 00:00:00 2001 From: Jeffery Myers Date: Wed, 16 Apr 2025 18:13:41 -0700 Subject: [PATCH 17/22] use the device channels and sample size when computing the default buffer size. --- src/raudio.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/raudio.c b/src/raudio.c index 2b6628a24..3fdee4517 100644 --- a/src/raudio.c +++ b/src/raudio.c @@ -2104,8 +2104,12 @@ AudioStream LoadAudioStream(unsigned int sampleRate, unsigned int sampleSize, un // The size of a streaming buffer must be at least double the size of a period unsigned int periodSize = AUDIO.System.device.playback.internalPeriodSizeInFrames; - // If the buffer is not set, compute one that would give us a buffer good enough for a decent frame rate - unsigned int subBufferSize = (AUDIO.Buffer.defaultSize == 0)? AUDIO.System.device.sampleRate/30 : AUDIO.Buffer.defaultSize; + // If the buffer is not set, compute one that would give us a buffer good enough for a decent frame rate at the device bit size/rate + int deviceBitsPerSample = AUDIO.System.device.playback.format; + if (deviceBitsPerSample > 4) deviceBitsPerSample = 4; + deviceBitsPerSample *= AUDIO.System.device.playback.channels; + + unsigned int subBufferSize = (AUDIO.Buffer.defaultSize == 0) ? (AUDIO.System.device.sampleRate / 30 * deviceBitsPerSample) : AUDIO.Buffer.defaultSize; if (subBufferSize < periodSize) subBufferSize = periodSize; From eb3d96a36a92e028f8f7181cc49c56e39316e500 Mon Sep 17 00:00:00 2001 From: Jeffery Myers Date: Wed, 16 Apr 2025 18:23:55 -0700 Subject: [PATCH 18/22] Fix cast warnings in examples. --- examples/core/core_high_dpi.c | 10 +++++----- examples/shaders/shaders_rounded_rectangle.c | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/core/core_high_dpi.c b/examples/core/core_high_dpi.c index db0d6e9e6..b9417bd63 100644 --- a/examples/core/core_high_dpi.c +++ b/examples/core/core_high_dpi.c @@ -15,9 +15,9 @@ static void DrawTextCenter(const char *text, int x, int y, int fontSize, Color color) { - Vector2 size = MeasureTextEx(GetFontDefault(), text, fontSize, 3); + Vector2 size = MeasureTextEx(GetFontDefault(), text, (float)fontSize, 3); Vector2 pos = (Vector2){x - size.x/2, y - size.y/2 }; - DrawTextEx(GetFontDefault(), text, pos, fontSize, 3, color); + DrawTextEx(GetFontDefault(), text, pos, (float)fontSize, 3, color); } //------------------------------------------------------------------------------------ @@ -86,11 +86,11 @@ int main(void) const int minTextSpace = 30; int last_text_x = -minTextSpace; for (int i = cellSize; i < GetRenderWidth(); i += cellSize, odd = !odd) { - int x = ((float)i) / dpiScale.x; + int x = (int)(((float)i) / dpiScale.x); if (odd) { - DrawRectangle(x, pixelGridTop, cellSizePx, pixelGridBottom-pixelGridTop, CLITERAL(Color){ 0, 121, 241, 100 }); + DrawRectangle(x, pixelGridTop, (int)cellSizePx, pixelGridBottom-pixelGridTop, CLITERAL(Color){ 0, 121, 241, 100 }); } - DrawLine(x, pixelGridTop, ((float)i) / dpiScale.x, pixelGridLabelY - 10, GRAY); + DrawLine(x, pixelGridTop, (int)(((float)i) / dpiScale.x), pixelGridLabelY - 10, GRAY); if (x - last_text_x >= minTextSpace) { DrawTextCenter(TextFormat("%d", i), x, pixelGridLabelY, 12, LIGHTGRAY); last_text_x = x; diff --git a/examples/shaders/shaders_rounded_rectangle.c b/examples/shaders/shaders_rounded_rectangle.c index 754110d92..2256db6c3 100644 --- a/examples/shaders/shaders_rounded_rectangle.c +++ b/examples/shaders/shaders_rounded_rectangle.c @@ -108,8 +108,8 @@ int main(void) // Draw rectangle box with rounded corners using shader Rectangle rec = { 50, 70, 110, 60 }; - DrawRectangleLines(rec.x - 20, rec.y - 20, rec.width + 40, rec.height + 40, DARKGRAY); - DrawText("Rounded rectangle", rec.x - 20, rec.y - 35, 10, DARKGRAY); + DrawRectangleLines((int)rec.x - 20, (int)rec.y - 20, (int)rec.width + 40, (int)rec.height + 40, DARKGRAY); + DrawText("Rounded rectangle", (int)rec.x - 20, (int)rec.y - 35, 10, DARKGRAY); // Flip Y axis to match shader coordinate system rec.y = screenHeight - rec.y - rec.height; @@ -128,8 +128,8 @@ int main(void) // Draw rectangle shadow using shader rec = (Rectangle){ 50, 200, 110, 60 }; - DrawRectangleLines(rec.x - 20, rec.y - 20, rec.width + 40, rec.height + 40, DARKGRAY); - DrawText("Rounded rectangle shadow", rec.x - 20, rec.y - 35, 10, DARKGRAY); + DrawRectangleLines((int)rec.x - 20, (int)rec.y - 20, (int)rec.width + 40, (int)rec.height + 40, DARKGRAY); + DrawText("Rounded rectangle shadow", (int)rec.x - 20, (int)rec.y - 35, 10, DARKGRAY); rec.y = screenHeight - rec.y - rec.height; SetShaderValue(shader, roundedRectangle.rectangleLoc, (float[]){ rec.x, rec.y, rec.width, rec.height }, SHADER_UNIFORM_VEC4); @@ -147,8 +147,8 @@ int main(void) // Draw rectangle's border using shader rec = (Rectangle){ 50, 330, 110, 60 }; - DrawRectangleLines(rec.x - 20, rec.y - 20, rec.width + 40, rec.height + 40, DARKGRAY); - DrawText("Rounded rectangle border", rec.x - 20, rec.y - 35, 10, DARKGRAY); + DrawRectangleLines((int)rec.x - 20, (int)rec.y - 20, (int)rec.width + 40, (int)rec.height + 40, DARKGRAY); + DrawText("Rounded rectangle border", (int)rec.x - 20, (int)rec.y - 35, 10, DARKGRAY); rec.y = screenHeight - rec.y - rec.height; SetShaderValue(shader, roundedRectangle.rectangleLoc, (float[]){ rec.x, rec.y, rec.width, rec.height }, SHADER_UNIFORM_VEC4); @@ -166,8 +166,8 @@ int main(void) // Draw one more rectangle with all three colors rec = (Rectangle){ 240, 80, 500, 300 }; - DrawRectangleLines(rec.x - 30, rec.y - 30, rec.width + 60, rec.height + 60, DARKGRAY); - DrawText("Rectangle with all three combined", rec.x - 30, rec.y - 45, 10, DARKGRAY); + DrawRectangleLines((int)rec.x - 30, (int)rec.y - 30, (int)rec.width + 60, (int)rec.height + 60, DARKGRAY); + DrawText("Rectangle with all three combined", (int)rec.x - 30, (int)rec.y - 45, 10, DARKGRAY); rec.y = screenHeight - rec.y - rec.height; SetShaderValue(shader, roundedRectangle.rectangleLoc, (float[]){ rec.x, rec.y, rec.width, rec.height }, SHADER_UNIFORM_VEC4); From 0b37251fbd0256e328f54a7a62fe3e9c526124bb Mon Sep 17 00:00:00 2001 From: Jeffery Myers Date: Wed, 16 Apr 2025 18:26:06 -0700 Subject: [PATCH 19/22] Remove duplicate resource file --- projects/VS2022/examples/models_loading_gltf.vcxproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/projects/VS2022/examples/models_loading_gltf.vcxproj b/projects/VS2022/examples/models_loading_gltf.vcxproj index a9989ef3b..f3d4f765b 100644 --- a/projects/VS2022/examples/models_loading_gltf.vcxproj +++ b/projects/VS2022/examples/models_loading_gltf.vcxproj @@ -555,9 +555,6 @@ - - - From cf1713e6dd8165e1a44db11b33272e633d02f1af Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Apr 2025 10:25:40 +0200 Subject: [PATCH 20/22] REVIEWED: VS2022 projects use a custom resource file... ...instead of relying in src/raylib provided one. #4900 --- examples/examples.rc | 24 +++++++++---------- .../examples/audio_mixed_processor.vcxproj | 2 +- .../examples/audio_module_playing.vcxproj | 2 +- .../examples/audio_music_stream.vcxproj | 2 +- .../VS2022/examples/audio_raw_stream.vcxproj | 2 +- .../examples/audio_sound_loading.vcxproj | 2 +- .../VS2022/examples/audio_sound_multi.vcxproj | 2 +- .../examples/audio_stream_effects.vcxproj | 2 +- .../VS2022/examples/core_2d_camera.vcxproj | 2 +- .../core_2d_camera_mouse_zoom.vcxproj | 2 +- .../core_2d_camera_platformer.vcxproj | 2 +- .../core_2d_camera_split_screen.vcxproj | 2 +- .../core_3d_camera_first_person.vcxproj | 2 +- .../examples/core_3d_camera_free.vcxproj | 2 +- .../examples/core_3d_camera_mode.vcxproj | 2 +- .../core_3d_camera_split_screen.vcxproj | 2 +- .../VS2022/examples/core_3d_picking.vcxproj | 2 +- .../examples/core_automation_events.vcxproj | 2 +- .../core_basic_screen_manager.vcxproj | 2 +- .../VS2022/examples/core_basic_window.vcxproj | 2 +- .../core_custom_frame_control.vcxproj | 2 +- .../examples/core_custom_logging.vcxproj | 2 +- .../VS2022/examples/core_drop_files.vcxproj | 2 +- .../VS2022/examples/core_high_dpi.vcxproj | 2 +- .../examples/core_input_gamepad.vcxproj | 2 +- .../examples/core_input_gestures.vcxproj | 2 +- .../VS2022/examples/core_input_keys.vcxproj | 2 +- .../VS2022/examples/core_input_mouse.vcxproj | 2 +- .../examples/core_input_mouse_wheel.vcxproj | 2 +- .../examples/core_input_multitouch.vcxproj | 2 +- .../core_input_virtual_controls.vcxproj | 2 +- .../examples/core_loading_thread.vcxproj | 2 +- .../examples/core_random_sequence.vcxproj | 2 +- .../examples/core_random_values.vcxproj | 2 +- .../VS2022/examples/core_scissor_test.vcxproj | 2 +- .../examples/core_smooth_pixelperfect.vcxproj | 2 +- .../examples/core_storage_values.vcxproj | 2 +- .../VS2022/examples/core_vr_simulator.vcxproj | 2 +- .../VS2022/examples/core_window_flags.vcxproj | 2 +- .../examples/core_window_letterbox.vcxproj | 2 +- .../examples/core_window_should_close.vcxproj | 2 +- .../VS2022/examples/core_world_screen.vcxproj | 2 +- .../VS2022/examples/easings_testbed.vcxproj | 2 +- .../examples/embedded_files_loading.vcxproj | 2 +- .../VS2022/examples/models_animation.vcxproj | 2 +- .../VS2022/examples/models_billboard.vcxproj | 2 +- .../examples/models_bone_socket.vcxproj | 2 +- .../examples/models_box_collisions.vcxproj | 2 +- .../VS2022/examples/models_cubicmap.vcxproj | 2 +- .../examples/models_draw_cube_texture.vcxproj | 2 +- .../examples/models_first_person_maze.vcxproj | 2 +- .../examples/models_geometric_shapes.vcxproj | 2 +- .../examples/models_gpu_skinning.vcxproj | 2 +- .../VS2022/examples/models_heightmap.vcxproj | 2 +- .../VS2022/examples/models_loading.vcxproj | 2 +- .../examples/models_loading_gltf.vcxproj | 2 +- .../examples/models_loading_m3d.vcxproj | 2 +- .../examples/models_loading_vox.vcxproj | 2 +- .../examples/models_mesh_generation.vcxproj | 2 +- .../examples/models_mesh_picking.vcxproj | 2 +- .../models_orthographic_projection.vcxproj | 2 +- .../examples/models_rlgl_solar_system.vcxproj | 2 +- .../VS2022/examples/models_skybox.vcxproj | 2 +- .../examples/models_waving_cubes.vcxproj | 2 +- .../examples/models_yaw_pitch_roll.vcxproj | 2 +- .../examples/rlgl_compute_shaders.vcxproj | 2 +- .../examples/shaders_basic_lighting.vcxproj | 2 +- .../examples/shaders_custom_uniform.vcxproj | 2 +- .../examples/shaders_deferred_render.vcxproj | 2 +- .../examples/shaders_eratosthenes.vcxproj | 2 +- projects/VS2022/examples/shaders_fog.vcxproj | 2 +- .../examples/shaders_hot_reloading.vcxproj | 2 +- .../examples/shaders_hybrid_render.vcxproj | 2 +- .../VS2022/examples/shaders_julia_set.vcxproj | 2 +- .../examples/shaders_mesh_instancing.vcxproj | 2 +- .../examples/shaders_model_shader.vcxproj | 2 +- .../examples/shaders_multi_sample2d.vcxproj | 2 +- .../examples/shaders_palette_switch.vcxproj | 2 +- .../examples/shaders_postprocessing.vcxproj | 2 +- .../examples/shaders_raymarching.vcxproj | 2 +- .../shaders_rounded_rectangle.vcxproj | 2 +- .../VS2022/examples/shaders_shadowmap.vcxproj | 2 +- .../examples/shaders_shapes_textures.vcxproj | 2 +- .../examples/shaders_simple_mask.vcxproj | 2 +- .../VS2022/examples/shaders_spotlight.vcxproj | 2 +- .../examples/shaders_texture_drawing.vcxproj | 2 +- .../examples/shaders_texture_outline.vcxproj | 2 +- .../examples/shaders_texture_tiling.vcxproj | 2 +- .../examples/shaders_texture_waves.vcxproj | 2 +- .../shaders_vertex_displacement.vcxproj | 2 +- .../examples/shaders_view_depth.vcxproj | 2 +- .../examples/shaders_write_depth.vcxproj | 2 +- .../examples/shapes_basic_shapes.vcxproj | 2 +- .../examples/shapes_bouncing_ball.vcxproj | 2 +- .../examples/shapes_collision_area.vcxproj | 2 +- .../examples/shapes_colors_palette.vcxproj | 2 +- .../shapes_draw_circle_sector.vcxproj | 2 +- .../shapes_draw_rectangle_rounded.vcxproj | 2 +- .../VS2022/examples/shapes_draw_ring.vcxproj | 2 +- .../examples/shapes_easings_ball_anim.vcxproj | 2 +- .../examples/shapes_easings_box_anim.vcxproj | 2 +- .../shapes_easings_rectangle_array.vcxproj | 2 +- .../examples/shapes_following_eyes.vcxproj | 2 +- .../examples/shapes_lines_bezier.vcxproj | 2 +- .../examples/shapes_logo_raylib.vcxproj | 2 +- .../examples/shapes_logo_raylib_anim.vcxproj | 2 +- .../shapes_rectangle_advanced.vcxproj | 2 +- .../examples/shapes_rectangle_scaling.vcxproj | 2 +- .../examples/shapes_splines_drawing.vcxproj | 2 +- .../examples/shapes_top_down_lights.vcxproj | 2 +- .../examples/text_codepoints_loading.vcxproj | 2 +- projects/VS2022/examples/text_draw_3d.vcxproj | 2 +- .../VS2022/examples/text_font_filters.vcxproj | 2 +- .../VS2022/examples/text_font_loading.vcxproj | 2 +- .../VS2022/examples/text_font_sdf.vcxproj | 2 +- .../examples/text_font_spritefont.vcxproj | 2 +- .../VS2022/examples/text_format_text.vcxproj | 2 +- .../VS2022/examples/text_input_box.vcxproj | 2 +- .../VS2022/examples/text_raylib_fonts.vcxproj | 2 +- .../examples/text_rectangle_bounds.vcxproj | 2 +- projects/VS2022/examples/text_unicode.vcxproj | 2 +- .../VS2022/examples/text_writing_anim.vcxproj | 2 +- .../textures_background_scrolling.vcxproj | 2 +- .../examples/textures_blend_modes.vcxproj | 2 +- .../examples/textures_bunnymark.vcxproj | 2 +- .../examples/textures_draw_tiled.vcxproj | 2 +- .../examples/textures_fog_of_war.vcxproj | 2 +- .../examples/textures_gif_player.vcxproj | 2 +- .../examples/textures_image_drawing.vcxproj | 2 +- .../textures_image_generation.vcxproj | 2 +- .../examples/textures_image_loading.vcxproj | 2 +- .../textures_image_processing.vcxproj | 2 +- .../examples/textures_image_text.vcxproj | 2 +- .../examples/textures_logo_raylib.vcxproj | 2 +- .../examples/textures_mouse_painting.vcxproj | 2 +- .../examples/textures_npatch_drawing.vcxproj | 2 +- .../textures_particles_blending.vcxproj | 2 +- .../VS2022/examples/textures_polygon.vcxproj | 2 +- .../VS2022/examples/textures_raw_data.vcxproj | 2 +- .../examples/textures_sprite_anim.vcxproj | 2 +- .../examples/textures_sprite_button.vcxproj | 2 +- .../textures_sprite_explosion.vcxproj | 2 +- .../examples/textures_srcrec_dstrec.vcxproj | 2 +- .../examples/textures_svg_loading.vcxproj | 2 +- .../examples/textures_textured_curve.vcxproj | 2 +- .../VS2022/examples/textures_to_image.vcxproj | 2 +- 146 files changed, 157 insertions(+), 157 deletions(-) diff --git a/examples/examples.rc b/examples/examples.rc index e5024b731..14938ae9d 100644 --- a/examples/examples.rc +++ b/examples/examples.rc @@ -1,27 +1,27 @@ GLFW_ICON ICON "raylib.ico" 1 VERSIONINFO -FILEVERSION 1,0,0,0 -PRODUCTVERSION 1,0,0,0 +FILEVERSION 5,5,0,0 +PRODUCTVERSION 5,5,0,0 BEGIN BLOCK "StringFileInfo" BEGIN - //BLOCK "080904E4" // English UK - BLOCK "040904E4" // English US + //BLOCK "080904E4" // English UK + BLOCK "040904E4" // English US BEGIN - VALUE "CompanyName", "raylib technologies" - VALUE "FileDescription", "raylib example" - VALUE "FileVersion", "1.0" + VALUE "CompanyName", "raylib technologies" + VALUE "FileDescription", "raylib application (www.raylib.com)" + VALUE "FileVersion", "5.5.0" VALUE "InternalName", "raylib-example" - VALUE "LegalCopyright", "(c) 2025 raylib technologies (@raylibtech)" - //VALUE "OriginalFilename", "raylib_app.exe" + VALUE "LegalCopyright", "(c) 2025 Ramon Santamaria (@raysan5)" + VALUE "OriginalFilename", "raylib-example" VALUE "ProductName", "raylib-example" - VALUE "ProductVersion", "1.0" + VALUE "ProductVersion", "5.5.0" END END BLOCK "VarFileInfo" BEGIN - //VALUE "Translation", 0x809, 1252 // English UK - VALUE "Translation", 0x409, 1252 // English US + //VALUE "Translation", 0x809, 1252 // English UK + VALUE "Translation", 0x409, 1252 // English US END END diff --git a/projects/VS2022/examples/audio_mixed_processor.vcxproj b/projects/VS2022/examples/audio_mixed_processor.vcxproj index 9adf33344..9efacd72f 100644 --- a/projects/VS2022/examples/audio_mixed_processor.vcxproj +++ b/projects/VS2022/examples/audio_mixed_processor.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/audio_module_playing.vcxproj b/projects/VS2022/examples/audio_module_playing.vcxproj index 32535ada7..c13247e6b 100644 --- a/projects/VS2022/examples/audio_module_playing.vcxproj +++ b/projects/VS2022/examples/audio_module_playing.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/audio_music_stream.vcxproj b/projects/VS2022/examples/audio_music_stream.vcxproj index 1507a8458..afa3b1b65 100644 --- a/projects/VS2022/examples/audio_music_stream.vcxproj +++ b/projects/VS2022/examples/audio_music_stream.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/audio_raw_stream.vcxproj b/projects/VS2022/examples/audio_raw_stream.vcxproj index 48da2c9a0..3c39abf1a 100644 --- a/projects/VS2022/examples/audio_raw_stream.vcxproj +++ b/projects/VS2022/examples/audio_raw_stream.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/audio_sound_loading.vcxproj b/projects/VS2022/examples/audio_sound_loading.vcxproj index 65af71240..9f189225b 100644 --- a/projects/VS2022/examples/audio_sound_loading.vcxproj +++ b/projects/VS2022/examples/audio_sound_loading.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/audio_sound_multi.vcxproj b/projects/VS2022/examples/audio_sound_multi.vcxproj index ca4eb2b38..ae53a0a72 100644 --- a/projects/VS2022/examples/audio_sound_multi.vcxproj +++ b/projects/VS2022/examples/audio_sound_multi.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/audio_stream_effects.vcxproj b/projects/VS2022/examples/audio_stream_effects.vcxproj index b9ac9c4df..a6e1b789c 100644 --- a/projects/VS2022/examples/audio_stream_effects.vcxproj +++ b/projects/VS2022/examples/audio_stream_effects.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_2d_camera.vcxproj b/projects/VS2022/examples/core_2d_camera.vcxproj index fc2a75b2d..f82685b09 100644 --- a/projects/VS2022/examples/core_2d_camera.vcxproj +++ b/projects/VS2022/examples/core_2d_camera.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_2d_camera_mouse_zoom.vcxproj b/projects/VS2022/examples/core_2d_camera_mouse_zoom.vcxproj index 30df1d318..f3a568d0a 100644 --- a/projects/VS2022/examples/core_2d_camera_mouse_zoom.vcxproj +++ b/projects/VS2022/examples/core_2d_camera_mouse_zoom.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_2d_camera_platformer.vcxproj b/projects/VS2022/examples/core_2d_camera_platformer.vcxproj index 789998f1c..287d52594 100644 --- a/projects/VS2022/examples/core_2d_camera_platformer.vcxproj +++ b/projects/VS2022/examples/core_2d_camera_platformer.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_2d_camera_split_screen.vcxproj b/projects/VS2022/examples/core_2d_camera_split_screen.vcxproj index 7e63a4589..734f3789d 100644 --- a/projects/VS2022/examples/core_2d_camera_split_screen.vcxproj +++ b/projects/VS2022/examples/core_2d_camera_split_screen.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_3d_camera_first_person.vcxproj b/projects/VS2022/examples/core_3d_camera_first_person.vcxproj index 9831a3f6d..39f971318 100644 --- a/projects/VS2022/examples/core_3d_camera_first_person.vcxproj +++ b/projects/VS2022/examples/core_3d_camera_first_person.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_3d_camera_free.vcxproj b/projects/VS2022/examples/core_3d_camera_free.vcxproj index d2640f751..638f8123c 100644 --- a/projects/VS2022/examples/core_3d_camera_free.vcxproj +++ b/projects/VS2022/examples/core_3d_camera_free.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_3d_camera_mode.vcxproj b/projects/VS2022/examples/core_3d_camera_mode.vcxproj index 552d7fb73..fc6ec60ab 100644 --- a/projects/VS2022/examples/core_3d_camera_mode.vcxproj +++ b/projects/VS2022/examples/core_3d_camera_mode.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_3d_camera_split_screen.vcxproj b/projects/VS2022/examples/core_3d_camera_split_screen.vcxproj index 529aff1f1..dba830c87 100644 --- a/projects/VS2022/examples/core_3d_camera_split_screen.vcxproj +++ b/projects/VS2022/examples/core_3d_camera_split_screen.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_3d_picking.vcxproj b/projects/VS2022/examples/core_3d_picking.vcxproj index b38ef71d9..e0d216235 100644 --- a/projects/VS2022/examples/core_3d_picking.vcxproj +++ b/projects/VS2022/examples/core_3d_picking.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_automation_events.vcxproj b/projects/VS2022/examples/core_automation_events.vcxproj index 275d39c98..71bbb0730 100644 --- a/projects/VS2022/examples/core_automation_events.vcxproj +++ b/projects/VS2022/examples/core_automation_events.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_basic_screen_manager.vcxproj b/projects/VS2022/examples/core_basic_screen_manager.vcxproj index 8794ef92f..c741f89a9 100644 --- a/projects/VS2022/examples/core_basic_screen_manager.vcxproj +++ b/projects/VS2022/examples/core_basic_screen_manager.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_basic_window.vcxproj b/projects/VS2022/examples/core_basic_window.vcxproj index baec0bf2b..c8c7879ba 100644 --- a/projects/VS2022/examples/core_basic_window.vcxproj +++ b/projects/VS2022/examples/core_basic_window.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_custom_frame_control.vcxproj b/projects/VS2022/examples/core_custom_frame_control.vcxproj index e37b43ca1..5b69e0aaf 100644 --- a/projects/VS2022/examples/core_custom_frame_control.vcxproj +++ b/projects/VS2022/examples/core_custom_frame_control.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_custom_logging.vcxproj b/projects/VS2022/examples/core_custom_logging.vcxproj index 373671308..dbdd74c59 100644 --- a/projects/VS2022/examples/core_custom_logging.vcxproj +++ b/projects/VS2022/examples/core_custom_logging.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_drop_files.vcxproj b/projects/VS2022/examples/core_drop_files.vcxproj index 6936f2806..512681f5e 100644 --- a/projects/VS2022/examples/core_drop_files.vcxproj +++ b/projects/VS2022/examples/core_drop_files.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_high_dpi.vcxproj b/projects/VS2022/examples/core_high_dpi.vcxproj index 9e4fa1406..11e1b41c0 100644 --- a/projects/VS2022/examples/core_high_dpi.vcxproj +++ b/projects/VS2022/examples/core_high_dpi.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_input_gamepad.vcxproj b/projects/VS2022/examples/core_input_gamepad.vcxproj index 8b5e0274e..bdc31509b 100644 --- a/projects/VS2022/examples/core_input_gamepad.vcxproj +++ b/projects/VS2022/examples/core_input_gamepad.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_input_gestures.vcxproj b/projects/VS2022/examples/core_input_gestures.vcxproj index 56485cea3..36c5ec228 100644 --- a/projects/VS2022/examples/core_input_gestures.vcxproj +++ b/projects/VS2022/examples/core_input_gestures.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_input_keys.vcxproj b/projects/VS2022/examples/core_input_keys.vcxproj index efdf5e9cc..8b1838a00 100644 --- a/projects/VS2022/examples/core_input_keys.vcxproj +++ b/projects/VS2022/examples/core_input_keys.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_input_mouse.vcxproj b/projects/VS2022/examples/core_input_mouse.vcxproj index ab8964094..abdeca101 100644 --- a/projects/VS2022/examples/core_input_mouse.vcxproj +++ b/projects/VS2022/examples/core_input_mouse.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_input_mouse_wheel.vcxproj b/projects/VS2022/examples/core_input_mouse_wheel.vcxproj index 41ffebd82..e7975abcf 100644 --- a/projects/VS2022/examples/core_input_mouse_wheel.vcxproj +++ b/projects/VS2022/examples/core_input_mouse_wheel.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_input_multitouch.vcxproj b/projects/VS2022/examples/core_input_multitouch.vcxproj index b3b18a8bd..fb57bca70 100644 --- a/projects/VS2022/examples/core_input_multitouch.vcxproj +++ b/projects/VS2022/examples/core_input_multitouch.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_input_virtual_controls.vcxproj b/projects/VS2022/examples/core_input_virtual_controls.vcxproj index 63d6a6cc6..8a86ba29a 100644 --- a/projects/VS2022/examples/core_input_virtual_controls.vcxproj +++ b/projects/VS2022/examples/core_input_virtual_controls.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_loading_thread.vcxproj b/projects/VS2022/examples/core_loading_thread.vcxproj index 57d68768c..f9c5203cf 100644 --- a/projects/VS2022/examples/core_loading_thread.vcxproj +++ b/projects/VS2022/examples/core_loading_thread.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_random_sequence.vcxproj b/projects/VS2022/examples/core_random_sequence.vcxproj index de86d3f2b..5afdebe91 100644 --- a/projects/VS2022/examples/core_random_sequence.vcxproj +++ b/projects/VS2022/examples/core_random_sequence.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_random_values.vcxproj b/projects/VS2022/examples/core_random_values.vcxproj index 0567c4d7b..822d8c741 100644 --- a/projects/VS2022/examples/core_random_values.vcxproj +++ b/projects/VS2022/examples/core_random_values.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_scissor_test.vcxproj b/projects/VS2022/examples/core_scissor_test.vcxproj index 3f5a5a6e1..69b72776b 100644 --- a/projects/VS2022/examples/core_scissor_test.vcxproj +++ b/projects/VS2022/examples/core_scissor_test.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_smooth_pixelperfect.vcxproj b/projects/VS2022/examples/core_smooth_pixelperfect.vcxproj index 61870fac4..8abffabc0 100644 --- a/projects/VS2022/examples/core_smooth_pixelperfect.vcxproj +++ b/projects/VS2022/examples/core_smooth_pixelperfect.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_storage_values.vcxproj b/projects/VS2022/examples/core_storage_values.vcxproj index 14c9e07e8..782f6c89c 100644 --- a/projects/VS2022/examples/core_storage_values.vcxproj +++ b/projects/VS2022/examples/core_storage_values.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_vr_simulator.vcxproj b/projects/VS2022/examples/core_vr_simulator.vcxproj index eaa45c83f..a47bf5d10 100644 --- a/projects/VS2022/examples/core_vr_simulator.vcxproj +++ b/projects/VS2022/examples/core_vr_simulator.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_window_flags.vcxproj b/projects/VS2022/examples/core_window_flags.vcxproj index cd8fbbfea..188c2ab98 100644 --- a/projects/VS2022/examples/core_window_flags.vcxproj +++ b/projects/VS2022/examples/core_window_flags.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_window_letterbox.vcxproj b/projects/VS2022/examples/core_window_letterbox.vcxproj index f2678eed1..c589d623d 100644 --- a/projects/VS2022/examples/core_window_letterbox.vcxproj +++ b/projects/VS2022/examples/core_window_letterbox.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_window_should_close.vcxproj b/projects/VS2022/examples/core_window_should_close.vcxproj index 4135ed8c7..30c18941b 100644 --- a/projects/VS2022/examples/core_window_should_close.vcxproj +++ b/projects/VS2022/examples/core_window_should_close.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/core_world_screen.vcxproj b/projects/VS2022/examples/core_world_screen.vcxproj index 241e67008..8a04dc873 100644 --- a/projects/VS2022/examples/core_world_screen.vcxproj +++ b/projects/VS2022/examples/core_world_screen.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/easings_testbed.vcxproj b/projects/VS2022/examples/easings_testbed.vcxproj index 38736ddd1..44cd894f1 100644 --- a/projects/VS2022/examples/easings_testbed.vcxproj +++ b/projects/VS2022/examples/easings_testbed.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/embedded_files_loading.vcxproj b/projects/VS2022/examples/embedded_files_loading.vcxproj index 8f717a619..73c603a25 100644 --- a/projects/VS2022/examples/embedded_files_loading.vcxproj +++ b/projects/VS2022/examples/embedded_files_loading.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_animation.vcxproj b/projects/VS2022/examples/models_animation.vcxproj index 434dea9bf..5b9399265 100644 --- a/projects/VS2022/examples/models_animation.vcxproj +++ b/projects/VS2022/examples/models_animation.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_billboard.vcxproj b/projects/VS2022/examples/models_billboard.vcxproj index 62eb6539c..7ee85637c 100644 --- a/projects/VS2022/examples/models_billboard.vcxproj +++ b/projects/VS2022/examples/models_billboard.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_bone_socket.vcxproj b/projects/VS2022/examples/models_bone_socket.vcxproj index 481b4efc3..85ccf99a4 100644 --- a/projects/VS2022/examples/models_bone_socket.vcxproj +++ b/projects/VS2022/examples/models_bone_socket.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_box_collisions.vcxproj b/projects/VS2022/examples/models_box_collisions.vcxproj index fc5176cd0..870e8400b 100644 --- a/projects/VS2022/examples/models_box_collisions.vcxproj +++ b/projects/VS2022/examples/models_box_collisions.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_cubicmap.vcxproj b/projects/VS2022/examples/models_cubicmap.vcxproj index cd92efc26..1ef1738a0 100644 --- a/projects/VS2022/examples/models_cubicmap.vcxproj +++ b/projects/VS2022/examples/models_cubicmap.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_draw_cube_texture.vcxproj b/projects/VS2022/examples/models_draw_cube_texture.vcxproj index d44ddabc9..a2ca31eb2 100644 --- a/projects/VS2022/examples/models_draw_cube_texture.vcxproj +++ b/projects/VS2022/examples/models_draw_cube_texture.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_first_person_maze.vcxproj b/projects/VS2022/examples/models_first_person_maze.vcxproj index c963da561..c3b7eb803 100644 --- a/projects/VS2022/examples/models_first_person_maze.vcxproj +++ b/projects/VS2022/examples/models_first_person_maze.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_geometric_shapes.vcxproj b/projects/VS2022/examples/models_geometric_shapes.vcxproj index 7c3784ac9..190ec51ab 100644 --- a/projects/VS2022/examples/models_geometric_shapes.vcxproj +++ b/projects/VS2022/examples/models_geometric_shapes.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_gpu_skinning.vcxproj b/projects/VS2022/examples/models_gpu_skinning.vcxproj index 7d58012e0..25b94488f 100644 --- a/projects/VS2022/examples/models_gpu_skinning.vcxproj +++ b/projects/VS2022/examples/models_gpu_skinning.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_heightmap.vcxproj b/projects/VS2022/examples/models_heightmap.vcxproj index 5875f0ee3..734d68565 100644 --- a/projects/VS2022/examples/models_heightmap.vcxproj +++ b/projects/VS2022/examples/models_heightmap.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_loading.vcxproj b/projects/VS2022/examples/models_loading.vcxproj index c0d83f258..e81631339 100644 --- a/projects/VS2022/examples/models_loading.vcxproj +++ b/projects/VS2022/examples/models_loading.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_loading_gltf.vcxproj b/projects/VS2022/examples/models_loading_gltf.vcxproj index f3d4f765b..29b14abcd 100644 --- a/projects/VS2022/examples/models_loading_gltf.vcxproj +++ b/projects/VS2022/examples/models_loading_gltf.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_loading_m3d.vcxproj b/projects/VS2022/examples/models_loading_m3d.vcxproj index d6110af04..61e647ffb 100644 --- a/projects/VS2022/examples/models_loading_m3d.vcxproj +++ b/projects/VS2022/examples/models_loading_m3d.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_loading_vox.vcxproj b/projects/VS2022/examples/models_loading_vox.vcxproj index 60b961c05..3490fd377 100644 --- a/projects/VS2022/examples/models_loading_vox.vcxproj +++ b/projects/VS2022/examples/models_loading_vox.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_mesh_generation.vcxproj b/projects/VS2022/examples/models_mesh_generation.vcxproj index 42dbb3e6a..67fe94609 100644 --- a/projects/VS2022/examples/models_mesh_generation.vcxproj +++ b/projects/VS2022/examples/models_mesh_generation.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_mesh_picking.vcxproj b/projects/VS2022/examples/models_mesh_picking.vcxproj index 937d7756f..689816721 100644 --- a/projects/VS2022/examples/models_mesh_picking.vcxproj +++ b/projects/VS2022/examples/models_mesh_picking.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_orthographic_projection.vcxproj b/projects/VS2022/examples/models_orthographic_projection.vcxproj index 0a001c1bf..fad2e9786 100644 --- a/projects/VS2022/examples/models_orthographic_projection.vcxproj +++ b/projects/VS2022/examples/models_orthographic_projection.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_rlgl_solar_system.vcxproj b/projects/VS2022/examples/models_rlgl_solar_system.vcxproj index 0386214ba..6d0fa7cfd 100644 --- a/projects/VS2022/examples/models_rlgl_solar_system.vcxproj +++ b/projects/VS2022/examples/models_rlgl_solar_system.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_skybox.vcxproj b/projects/VS2022/examples/models_skybox.vcxproj index 55856ab2c..3fbdc170e 100644 --- a/projects/VS2022/examples/models_skybox.vcxproj +++ b/projects/VS2022/examples/models_skybox.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_waving_cubes.vcxproj b/projects/VS2022/examples/models_waving_cubes.vcxproj index f7b927290..6b1d7e748 100644 --- a/projects/VS2022/examples/models_waving_cubes.vcxproj +++ b/projects/VS2022/examples/models_waving_cubes.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/models_yaw_pitch_roll.vcxproj b/projects/VS2022/examples/models_yaw_pitch_roll.vcxproj index d4f9f16a0..26b1a9c6f 100644 --- a/projects/VS2022/examples/models_yaw_pitch_roll.vcxproj +++ b/projects/VS2022/examples/models_yaw_pitch_roll.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/rlgl_compute_shaders.vcxproj b/projects/VS2022/examples/rlgl_compute_shaders.vcxproj index 0dc6301c7..48e5b20f6 100644 --- a/projects/VS2022/examples/rlgl_compute_shaders.vcxproj +++ b/projects/VS2022/examples/rlgl_compute_shaders.vcxproj @@ -557,7 +557,7 @@ - + diff --git a/projects/VS2022/examples/shaders_basic_lighting.vcxproj b/projects/VS2022/examples/shaders_basic_lighting.vcxproj index febc38190..b0941b092 100644 --- a/projects/VS2022/examples/shaders_basic_lighting.vcxproj +++ b/projects/VS2022/examples/shaders_basic_lighting.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_custom_uniform.vcxproj b/projects/VS2022/examples/shaders_custom_uniform.vcxproj index 03b0a292f..3cf7a092e 100644 --- a/projects/VS2022/examples/shaders_custom_uniform.vcxproj +++ b/projects/VS2022/examples/shaders_custom_uniform.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_deferred_render.vcxproj b/projects/VS2022/examples/shaders_deferred_render.vcxproj index b9750389c..1ac650091 100644 --- a/projects/VS2022/examples/shaders_deferred_render.vcxproj +++ b/projects/VS2022/examples/shaders_deferred_render.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_eratosthenes.vcxproj b/projects/VS2022/examples/shaders_eratosthenes.vcxproj index 1efb47922..a8050804c 100644 --- a/projects/VS2022/examples/shaders_eratosthenes.vcxproj +++ b/projects/VS2022/examples/shaders_eratosthenes.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_fog.vcxproj b/projects/VS2022/examples/shaders_fog.vcxproj index eddd00e7f..0c00c5124 100644 --- a/projects/VS2022/examples/shaders_fog.vcxproj +++ b/projects/VS2022/examples/shaders_fog.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_hot_reloading.vcxproj b/projects/VS2022/examples/shaders_hot_reloading.vcxproj index 29820341e..95e1842d1 100644 --- a/projects/VS2022/examples/shaders_hot_reloading.vcxproj +++ b/projects/VS2022/examples/shaders_hot_reloading.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_hybrid_render.vcxproj b/projects/VS2022/examples/shaders_hybrid_render.vcxproj index 799e4e40b..4072e3988 100644 --- a/projects/VS2022/examples/shaders_hybrid_render.vcxproj +++ b/projects/VS2022/examples/shaders_hybrid_render.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_julia_set.vcxproj b/projects/VS2022/examples/shaders_julia_set.vcxproj index 21ca5d36b..c8027f0e5 100644 --- a/projects/VS2022/examples/shaders_julia_set.vcxproj +++ b/projects/VS2022/examples/shaders_julia_set.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_mesh_instancing.vcxproj b/projects/VS2022/examples/shaders_mesh_instancing.vcxproj index 00f3de055..e5727f629 100644 --- a/projects/VS2022/examples/shaders_mesh_instancing.vcxproj +++ b/projects/VS2022/examples/shaders_mesh_instancing.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_model_shader.vcxproj b/projects/VS2022/examples/shaders_model_shader.vcxproj index a558602bc..bf8fe16fe 100644 --- a/projects/VS2022/examples/shaders_model_shader.vcxproj +++ b/projects/VS2022/examples/shaders_model_shader.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_multi_sample2d.vcxproj b/projects/VS2022/examples/shaders_multi_sample2d.vcxproj index 0dd3046a5..61be03f08 100644 --- a/projects/VS2022/examples/shaders_multi_sample2d.vcxproj +++ b/projects/VS2022/examples/shaders_multi_sample2d.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_palette_switch.vcxproj b/projects/VS2022/examples/shaders_palette_switch.vcxproj index c427b3c01..34ed5e7b3 100644 --- a/projects/VS2022/examples/shaders_palette_switch.vcxproj +++ b/projects/VS2022/examples/shaders_palette_switch.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_postprocessing.vcxproj b/projects/VS2022/examples/shaders_postprocessing.vcxproj index edb3a8869..4b15a06e2 100644 --- a/projects/VS2022/examples/shaders_postprocessing.vcxproj +++ b/projects/VS2022/examples/shaders_postprocessing.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_raymarching.vcxproj b/projects/VS2022/examples/shaders_raymarching.vcxproj index 6845f7de4..c796134bc 100644 --- a/projects/VS2022/examples/shaders_raymarching.vcxproj +++ b/projects/VS2022/examples/shaders_raymarching.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_rounded_rectangle.vcxproj b/projects/VS2022/examples/shaders_rounded_rectangle.vcxproj index 6c1a215e2..d67b3ee2d 100644 --- a/projects/VS2022/examples/shaders_rounded_rectangle.vcxproj +++ b/projects/VS2022/examples/shaders_rounded_rectangle.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_shadowmap.vcxproj b/projects/VS2022/examples/shaders_shadowmap.vcxproj index 8c10615ed..48dbcb3e5 100644 --- a/projects/VS2022/examples/shaders_shadowmap.vcxproj +++ b/projects/VS2022/examples/shaders_shadowmap.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_shapes_textures.vcxproj b/projects/VS2022/examples/shaders_shapes_textures.vcxproj index e27f2f944..6d1dc545e 100644 --- a/projects/VS2022/examples/shaders_shapes_textures.vcxproj +++ b/projects/VS2022/examples/shaders_shapes_textures.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_simple_mask.vcxproj b/projects/VS2022/examples/shaders_simple_mask.vcxproj index bed9ea8de..b4f402694 100644 --- a/projects/VS2022/examples/shaders_simple_mask.vcxproj +++ b/projects/VS2022/examples/shaders_simple_mask.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_spotlight.vcxproj b/projects/VS2022/examples/shaders_spotlight.vcxproj index c137e618e..39545d2a6 100644 --- a/projects/VS2022/examples/shaders_spotlight.vcxproj +++ b/projects/VS2022/examples/shaders_spotlight.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_texture_drawing.vcxproj b/projects/VS2022/examples/shaders_texture_drawing.vcxproj index cebe69330..744642015 100644 --- a/projects/VS2022/examples/shaders_texture_drawing.vcxproj +++ b/projects/VS2022/examples/shaders_texture_drawing.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_texture_outline.vcxproj b/projects/VS2022/examples/shaders_texture_outline.vcxproj index ceb3be8f8..8d608b2a6 100644 --- a/projects/VS2022/examples/shaders_texture_outline.vcxproj +++ b/projects/VS2022/examples/shaders_texture_outline.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_texture_tiling.vcxproj b/projects/VS2022/examples/shaders_texture_tiling.vcxproj index 5c733ae99..18220515b 100644 --- a/projects/VS2022/examples/shaders_texture_tiling.vcxproj +++ b/projects/VS2022/examples/shaders_texture_tiling.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_texture_waves.vcxproj b/projects/VS2022/examples/shaders_texture_waves.vcxproj index b7510fcd2..d9cfa3e6d 100644 --- a/projects/VS2022/examples/shaders_texture_waves.vcxproj +++ b/projects/VS2022/examples/shaders_texture_waves.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_vertex_displacement.vcxproj b/projects/VS2022/examples/shaders_vertex_displacement.vcxproj index 44d6deeaa..0a770afa5 100644 --- a/projects/VS2022/examples/shaders_vertex_displacement.vcxproj +++ b/projects/VS2022/examples/shaders_vertex_displacement.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_view_depth.vcxproj b/projects/VS2022/examples/shaders_view_depth.vcxproj index c176cbf33..859628de8 100644 --- a/projects/VS2022/examples/shaders_view_depth.vcxproj +++ b/projects/VS2022/examples/shaders_view_depth.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shaders_write_depth.vcxproj b/projects/VS2022/examples/shaders_write_depth.vcxproj index 836ab1a5c..4c19cd4b2 100644 --- a/projects/VS2022/examples/shaders_write_depth.vcxproj +++ b/projects/VS2022/examples/shaders_write_depth.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_basic_shapes.vcxproj b/projects/VS2022/examples/shapes_basic_shapes.vcxproj index ba3805967..6e30a1fca 100644 --- a/projects/VS2022/examples/shapes_basic_shapes.vcxproj +++ b/projects/VS2022/examples/shapes_basic_shapes.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_bouncing_ball.vcxproj b/projects/VS2022/examples/shapes_bouncing_ball.vcxproj index 542a62165..162427c53 100644 --- a/projects/VS2022/examples/shapes_bouncing_ball.vcxproj +++ b/projects/VS2022/examples/shapes_bouncing_ball.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_collision_area.vcxproj b/projects/VS2022/examples/shapes_collision_area.vcxproj index 45230ca39..5088493ec 100644 --- a/projects/VS2022/examples/shapes_collision_area.vcxproj +++ b/projects/VS2022/examples/shapes_collision_area.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_colors_palette.vcxproj b/projects/VS2022/examples/shapes_colors_palette.vcxproj index 6f9234444..97b7f262f 100644 --- a/projects/VS2022/examples/shapes_colors_palette.vcxproj +++ b/projects/VS2022/examples/shapes_colors_palette.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_draw_circle_sector.vcxproj b/projects/VS2022/examples/shapes_draw_circle_sector.vcxproj index 6a2278000..7189288fd 100644 --- a/projects/VS2022/examples/shapes_draw_circle_sector.vcxproj +++ b/projects/VS2022/examples/shapes_draw_circle_sector.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_draw_rectangle_rounded.vcxproj b/projects/VS2022/examples/shapes_draw_rectangle_rounded.vcxproj index 9ad7fd3e1..4317cb1cb 100644 --- a/projects/VS2022/examples/shapes_draw_rectangle_rounded.vcxproj +++ b/projects/VS2022/examples/shapes_draw_rectangle_rounded.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_draw_ring.vcxproj b/projects/VS2022/examples/shapes_draw_ring.vcxproj index 526006f3d..a22feb5e4 100644 --- a/projects/VS2022/examples/shapes_draw_ring.vcxproj +++ b/projects/VS2022/examples/shapes_draw_ring.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_easings_ball_anim.vcxproj b/projects/VS2022/examples/shapes_easings_ball_anim.vcxproj index c85bb7493..682d29c96 100644 --- a/projects/VS2022/examples/shapes_easings_ball_anim.vcxproj +++ b/projects/VS2022/examples/shapes_easings_ball_anim.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_easings_box_anim.vcxproj b/projects/VS2022/examples/shapes_easings_box_anim.vcxproj index e9fbdbec3..27b85b82b 100644 --- a/projects/VS2022/examples/shapes_easings_box_anim.vcxproj +++ b/projects/VS2022/examples/shapes_easings_box_anim.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_easings_rectangle_array.vcxproj b/projects/VS2022/examples/shapes_easings_rectangle_array.vcxproj index 71ec5198e..cf14665b8 100644 --- a/projects/VS2022/examples/shapes_easings_rectangle_array.vcxproj +++ b/projects/VS2022/examples/shapes_easings_rectangle_array.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_following_eyes.vcxproj b/projects/VS2022/examples/shapes_following_eyes.vcxproj index c4ff36235..1527bb0ae 100644 --- a/projects/VS2022/examples/shapes_following_eyes.vcxproj +++ b/projects/VS2022/examples/shapes_following_eyes.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_lines_bezier.vcxproj b/projects/VS2022/examples/shapes_lines_bezier.vcxproj index b07622ac2..86af34f5a 100644 --- a/projects/VS2022/examples/shapes_lines_bezier.vcxproj +++ b/projects/VS2022/examples/shapes_lines_bezier.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_logo_raylib.vcxproj b/projects/VS2022/examples/shapes_logo_raylib.vcxproj index 86f4d161f..c325c6ea3 100644 --- a/projects/VS2022/examples/shapes_logo_raylib.vcxproj +++ b/projects/VS2022/examples/shapes_logo_raylib.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_logo_raylib_anim.vcxproj b/projects/VS2022/examples/shapes_logo_raylib_anim.vcxproj index a1553a422..9b6841c0b 100644 --- a/projects/VS2022/examples/shapes_logo_raylib_anim.vcxproj +++ b/projects/VS2022/examples/shapes_logo_raylib_anim.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_rectangle_advanced.vcxproj b/projects/VS2022/examples/shapes_rectangle_advanced.vcxproj index 809254c83..8f46e7360 100644 --- a/projects/VS2022/examples/shapes_rectangle_advanced.vcxproj +++ b/projects/VS2022/examples/shapes_rectangle_advanced.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_rectangle_scaling.vcxproj b/projects/VS2022/examples/shapes_rectangle_scaling.vcxproj index fadd78ae8..d632f7eef 100644 --- a/projects/VS2022/examples/shapes_rectangle_scaling.vcxproj +++ b/projects/VS2022/examples/shapes_rectangle_scaling.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_splines_drawing.vcxproj b/projects/VS2022/examples/shapes_splines_drawing.vcxproj index 249b40d22..d4f29e67c 100644 --- a/projects/VS2022/examples/shapes_splines_drawing.vcxproj +++ b/projects/VS2022/examples/shapes_splines_drawing.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/shapes_top_down_lights.vcxproj b/projects/VS2022/examples/shapes_top_down_lights.vcxproj index d8b1817f7..1eb11724e 100644 --- a/projects/VS2022/examples/shapes_top_down_lights.vcxproj +++ b/projects/VS2022/examples/shapes_top_down_lights.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/text_codepoints_loading.vcxproj b/projects/VS2022/examples/text_codepoints_loading.vcxproj index f56507a90..f92d39c61 100644 --- a/projects/VS2022/examples/text_codepoints_loading.vcxproj +++ b/projects/VS2022/examples/text_codepoints_loading.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/text_draw_3d.vcxproj b/projects/VS2022/examples/text_draw_3d.vcxproj index f21549544..c3dd4a37d 100644 --- a/projects/VS2022/examples/text_draw_3d.vcxproj +++ b/projects/VS2022/examples/text_draw_3d.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/text_font_filters.vcxproj b/projects/VS2022/examples/text_font_filters.vcxproj index 80dc4a786..962695d9f 100644 --- a/projects/VS2022/examples/text_font_filters.vcxproj +++ b/projects/VS2022/examples/text_font_filters.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/text_font_loading.vcxproj b/projects/VS2022/examples/text_font_loading.vcxproj index 1cdd7413f..0a7f20d93 100644 --- a/projects/VS2022/examples/text_font_loading.vcxproj +++ b/projects/VS2022/examples/text_font_loading.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/text_font_sdf.vcxproj b/projects/VS2022/examples/text_font_sdf.vcxproj index 967273ee7..3bc5d8a59 100644 --- a/projects/VS2022/examples/text_font_sdf.vcxproj +++ b/projects/VS2022/examples/text_font_sdf.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/text_font_spritefont.vcxproj b/projects/VS2022/examples/text_font_spritefont.vcxproj index 4c73d87cd..7ea74daa8 100644 --- a/projects/VS2022/examples/text_font_spritefont.vcxproj +++ b/projects/VS2022/examples/text_font_spritefont.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/text_format_text.vcxproj b/projects/VS2022/examples/text_format_text.vcxproj index 5ca406ef8..2b7d250e4 100644 --- a/projects/VS2022/examples/text_format_text.vcxproj +++ b/projects/VS2022/examples/text_format_text.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/text_input_box.vcxproj b/projects/VS2022/examples/text_input_box.vcxproj index 6655dff57..6e1db62f6 100644 --- a/projects/VS2022/examples/text_input_box.vcxproj +++ b/projects/VS2022/examples/text_input_box.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/text_raylib_fonts.vcxproj b/projects/VS2022/examples/text_raylib_fonts.vcxproj index 29847ed58..4ca414afd 100644 --- a/projects/VS2022/examples/text_raylib_fonts.vcxproj +++ b/projects/VS2022/examples/text_raylib_fonts.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/text_rectangle_bounds.vcxproj b/projects/VS2022/examples/text_rectangle_bounds.vcxproj index 9c379294d..3175bd09b 100644 --- a/projects/VS2022/examples/text_rectangle_bounds.vcxproj +++ b/projects/VS2022/examples/text_rectangle_bounds.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/text_unicode.vcxproj b/projects/VS2022/examples/text_unicode.vcxproj index 4dbc45524..26a679de1 100644 --- a/projects/VS2022/examples/text_unicode.vcxproj +++ b/projects/VS2022/examples/text_unicode.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/text_writing_anim.vcxproj b/projects/VS2022/examples/text_writing_anim.vcxproj index 0b685a32b..2920eaf5b 100644 --- a/projects/VS2022/examples/text_writing_anim.vcxproj +++ b/projects/VS2022/examples/text_writing_anim.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_background_scrolling.vcxproj b/projects/VS2022/examples/textures_background_scrolling.vcxproj index 2004a1338..ab8cf2248 100644 --- a/projects/VS2022/examples/textures_background_scrolling.vcxproj +++ b/projects/VS2022/examples/textures_background_scrolling.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_blend_modes.vcxproj b/projects/VS2022/examples/textures_blend_modes.vcxproj index c7aaeaa00..4ada1c3cd 100644 --- a/projects/VS2022/examples/textures_blend_modes.vcxproj +++ b/projects/VS2022/examples/textures_blend_modes.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_bunnymark.vcxproj b/projects/VS2022/examples/textures_bunnymark.vcxproj index d3c1ee256..0c230fd13 100644 --- a/projects/VS2022/examples/textures_bunnymark.vcxproj +++ b/projects/VS2022/examples/textures_bunnymark.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_draw_tiled.vcxproj b/projects/VS2022/examples/textures_draw_tiled.vcxproj index 2566985d7..209a12091 100644 --- a/projects/VS2022/examples/textures_draw_tiled.vcxproj +++ b/projects/VS2022/examples/textures_draw_tiled.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_fog_of_war.vcxproj b/projects/VS2022/examples/textures_fog_of_war.vcxproj index 46377acc1..9ab2544c0 100644 --- a/projects/VS2022/examples/textures_fog_of_war.vcxproj +++ b/projects/VS2022/examples/textures_fog_of_war.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_gif_player.vcxproj b/projects/VS2022/examples/textures_gif_player.vcxproj index 89c7a37f6..96b028a03 100644 --- a/projects/VS2022/examples/textures_gif_player.vcxproj +++ b/projects/VS2022/examples/textures_gif_player.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_image_drawing.vcxproj b/projects/VS2022/examples/textures_image_drawing.vcxproj index 27bba85ef..8aca17c08 100644 --- a/projects/VS2022/examples/textures_image_drawing.vcxproj +++ b/projects/VS2022/examples/textures_image_drawing.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_image_generation.vcxproj b/projects/VS2022/examples/textures_image_generation.vcxproj index a780b82de..1f32eaabe 100644 --- a/projects/VS2022/examples/textures_image_generation.vcxproj +++ b/projects/VS2022/examples/textures_image_generation.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_image_loading.vcxproj b/projects/VS2022/examples/textures_image_loading.vcxproj index c772c064e..2d7f98faf 100644 --- a/projects/VS2022/examples/textures_image_loading.vcxproj +++ b/projects/VS2022/examples/textures_image_loading.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_image_processing.vcxproj b/projects/VS2022/examples/textures_image_processing.vcxproj index 604926e8b..f91f8d70c 100644 --- a/projects/VS2022/examples/textures_image_processing.vcxproj +++ b/projects/VS2022/examples/textures_image_processing.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_image_text.vcxproj b/projects/VS2022/examples/textures_image_text.vcxproj index 6c20b084c..97f17cb22 100644 --- a/projects/VS2022/examples/textures_image_text.vcxproj +++ b/projects/VS2022/examples/textures_image_text.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_logo_raylib.vcxproj b/projects/VS2022/examples/textures_logo_raylib.vcxproj index d68b61d23..0b97aeb4a 100644 --- a/projects/VS2022/examples/textures_logo_raylib.vcxproj +++ b/projects/VS2022/examples/textures_logo_raylib.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_mouse_painting.vcxproj b/projects/VS2022/examples/textures_mouse_painting.vcxproj index dc9546e62..a164c5cc7 100644 --- a/projects/VS2022/examples/textures_mouse_painting.vcxproj +++ b/projects/VS2022/examples/textures_mouse_painting.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_npatch_drawing.vcxproj b/projects/VS2022/examples/textures_npatch_drawing.vcxproj index e7482f90c..0759bc180 100644 --- a/projects/VS2022/examples/textures_npatch_drawing.vcxproj +++ b/projects/VS2022/examples/textures_npatch_drawing.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_particles_blending.vcxproj b/projects/VS2022/examples/textures_particles_blending.vcxproj index 8b3d96fe9..9d9dfb414 100644 --- a/projects/VS2022/examples/textures_particles_blending.vcxproj +++ b/projects/VS2022/examples/textures_particles_blending.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_polygon.vcxproj b/projects/VS2022/examples/textures_polygon.vcxproj index f655da8c0..3c15bc8f3 100644 --- a/projects/VS2022/examples/textures_polygon.vcxproj +++ b/projects/VS2022/examples/textures_polygon.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_raw_data.vcxproj b/projects/VS2022/examples/textures_raw_data.vcxproj index 705cdd93f..8040d5fe6 100644 --- a/projects/VS2022/examples/textures_raw_data.vcxproj +++ b/projects/VS2022/examples/textures_raw_data.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_sprite_anim.vcxproj b/projects/VS2022/examples/textures_sprite_anim.vcxproj index ef69ed173..ee2259dfa 100644 --- a/projects/VS2022/examples/textures_sprite_anim.vcxproj +++ b/projects/VS2022/examples/textures_sprite_anim.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_sprite_button.vcxproj b/projects/VS2022/examples/textures_sprite_button.vcxproj index 058bad757..ae15d9aec 100644 --- a/projects/VS2022/examples/textures_sprite_button.vcxproj +++ b/projects/VS2022/examples/textures_sprite_button.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_sprite_explosion.vcxproj b/projects/VS2022/examples/textures_sprite_explosion.vcxproj index 066965dc5..0ceb1e3af 100644 --- a/projects/VS2022/examples/textures_sprite_explosion.vcxproj +++ b/projects/VS2022/examples/textures_sprite_explosion.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_srcrec_dstrec.vcxproj b/projects/VS2022/examples/textures_srcrec_dstrec.vcxproj index f3150aea7..d0ddbdf66 100644 --- a/projects/VS2022/examples/textures_srcrec_dstrec.vcxproj +++ b/projects/VS2022/examples/textures_srcrec_dstrec.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_svg_loading.vcxproj b/projects/VS2022/examples/textures_svg_loading.vcxproj index 8b59d9526..fc2375aff 100644 --- a/projects/VS2022/examples/textures_svg_loading.vcxproj +++ b/projects/VS2022/examples/textures_svg_loading.vcxproj @@ -377,7 +377,7 @@ - + diff --git a/projects/VS2022/examples/textures_textured_curve.vcxproj b/projects/VS2022/examples/textures_textured_curve.vcxproj index f8b720335..cd87a0536 100644 --- a/projects/VS2022/examples/textures_textured_curve.vcxproj +++ b/projects/VS2022/examples/textures_textured_curve.vcxproj @@ -556,7 +556,7 @@ - + diff --git a/projects/VS2022/examples/textures_to_image.vcxproj b/projects/VS2022/examples/textures_to_image.vcxproj index 41e7faf71..07271a554 100644 --- a/projects/VS2022/examples/textures_to_image.vcxproj +++ b/projects/VS2022/examples/textures_to_image.vcxproj @@ -556,7 +556,7 @@ - + From 0f6b9ee738a98824b356540e881d5698ee4d1919 Mon Sep 17 00:00:00 2001 From: Jeffery Myers Date: Fri, 18 Apr 2025 07:27:20 -0700 Subject: [PATCH 21/22] format math the way ray likes it --- src/raudio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/raudio.c b/src/raudio.c index 3fdee4517..66d337567 100644 --- a/src/raudio.c +++ b/src/raudio.c @@ -2109,7 +2109,7 @@ AudioStream LoadAudioStream(unsigned int sampleRate, unsigned int sampleSize, un if (deviceBitsPerSample > 4) deviceBitsPerSample = 4; deviceBitsPerSample *= AUDIO.System.device.playback.channels; - unsigned int subBufferSize = (AUDIO.Buffer.defaultSize == 0) ? (AUDIO.System.device.sampleRate / 30 * deviceBitsPerSample) : AUDIO.Buffer.defaultSize; + unsigned int subBufferSize = (AUDIO.Buffer.defaultSize == 0) ? (AUDIO.System.device.sampleRate/30*deviceBitsPerSample) : AUDIO.Buffer.defaultSize; if (subBufferSize < periodSize) subBufferSize = periodSize; From 688a81d3334c789493b24617778a334ac786f52e Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 20 Apr 2025 13:15:28 +0200 Subject: [PATCH 22/22] Update ROADMAP.md --- ROADMAP.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 87ca2e1c8..9a8111133 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -3,16 +3,18 @@ Here is a wishlist with features and ideas to improve the library. Note that features listed here are usually long term improvements or just describe a route to follow for the library. There are also some additional places to look for raylib improvements and ideas: - [GitHub Issues](https://github.com/raysan5/raylib/issues) has several open issues for possible improvements or bugs to fix. + - [GitHub PRs](https://github.com/raysan5/raylib/pulls) open with improvements to be reviewed. - [raylib source code](https://github.com/raysan5/raylib/tree/master/src) has multiple *TODO* comments around code with pending things to review or improve. - raylib wishlists discussions are open to everyone to ask for improvements, feel free to check and comment: - - [raylib wishlist 2021](https://github.com/raysan5/raylib/discussions/1502) - - [raylib wishlist 2022](https://github.com/raysan5/raylib/discussions/2272) + - [raylib 6.0 wishlist](https://github.com/raysan5/raylib/discussions/4660) - [raylib 5.0 wishlist](https://github.com/raysan5/raylib/discussions/2952) - + - [raylib wishlist 2022](https://github.com/raysan5/raylib/discussions/2272) + - [raylib wishlist 2021](https://github.com/raysan5/raylib/discussions/1502) + _Current version of raylib is complete and functional but there is always room for improvements._ **raylib 5.x** - - [ ] `rcore`: Support additional platforms: iOS, Xbox Series S|X + - [ ] `rcore`: Support additional platforms: iOS, consoles? - [ ] `rcore_web`: Avoid GLFW dependency, functionality can be directly implemented using emscripten SDK - [ ] `rlgl`: Review GLSL shaders naming conventions for consistency - [ ] `textures`: Improve compressed textures support, loading and saving