aboutsummaryrefslogtreecommitdiff
path: root/deps/raylib/examples/core
diff options
context:
space:
mode:
Diffstat (limited to 'deps/raylib/examples/core')
-rw-r--r--deps/raylib/examples/core/core_2d_camera.c136
-rw-r--r--deps/raylib/examples/core/core_2d_camera.pngbin0 -> 21470 bytes
-rw-r--r--deps/raylib/examples/core/core_2d_camera_mouse_zoom.c142
-rw-r--r--deps/raylib/examples/core/core_2d_camera_mouse_zoom.pngbin0 -> 16175 bytes
-rw-r--r--deps/raylib/examples/core/core_2d_camera_platformer.c301
-rw-r--r--deps/raylib/examples/core/core_2d_camera_platformer.pngbin0 -> 16355 bytes
-rw-r--r--deps/raylib/examples/core/core_2d_camera_split_screen.c167
-rw-r--r--deps/raylib/examples/core/core_2d_camera_split_screen.pngbin0 -> 21543 bytes
-rw-r--r--deps/raylib/examples/core/core_3d_camera_first_person.c206
-rw-r--r--deps/raylib/examples/core/core_3d_camera_first_person.pngbin0 -> 17403 bytes
-rw-r--r--deps/raylib/examples/core/core_3d_camera_free.c86
-rw-r--r--deps/raylib/examples/core/core_3d_camera_free.pngbin0 -> 25956 bytes
-rw-r--r--deps/raylib/examples/core/core_3d_camera_mode.c78
-rw-r--r--deps/raylib/examples/core/core_3d_camera_mode.pngbin0 -> 8492 bytes
-rw-r--r--deps/raylib/examples/core/core_3d_camera_split_screen.c174
-rw-r--r--deps/raylib/examples/core/core_3d_camera_split_screen.pngbin0 -> 16165 bytes
-rw-r--r--deps/raylib/examples/core/core_3d_picking.c118
-rw-r--r--deps/raylib/examples/core/core_3d_picking.pngbin0 -> 24402 bytes
-rw-r--r--deps/raylib/examples/core/core_automation_events.c336
-rw-r--r--deps/raylib/examples/core/core_automation_events.pngbin0 -> 20515 bytes
-rw-r--r--deps/raylib/examples/core/core_basic_screen_manager.c152
-rw-r--r--deps/raylib/examples/core/core_basic_screen_manager.pngbin0 -> 15374 bytes
-rw-r--r--deps/raylib/examples/core/core_basic_window.c70
-rw-r--r--deps/raylib/examples/core/core_basic_window.pngbin0 -> 10297 bytes
-rw-r--r--deps/raylib/examples/core/core_basic_window_web.c87
-rw-r--r--deps/raylib/examples/core/core_custom_frame_control.c130
-rw-r--r--deps/raylib/examples/core/core_custom_frame_control.pngbin0 -> 16952 bytes
-rw-r--r--deps/raylib/examples/core/core_custom_logging.c88
-rw-r--r--deps/raylib/examples/core/core_custom_logging.pngbin0 -> 15200 bytes
-rw-r--r--deps/raylib/examples/core/core_drop_files.c106
-rw-r--r--deps/raylib/examples/core/core_drop_files.pngbin0 -> 4682 bytes
-rw-r--r--deps/raylib/examples/core/core_input_gamepad.c287
-rw-r--r--deps/raylib/examples/core/core_input_gamepad.pngbin0 -> 38066 bytes
-rw-r--r--deps/raylib/examples/core/core_input_gamepad_info.c83
-rw-r--r--deps/raylib/examples/core/core_input_gestures.c119
-rw-r--r--deps/raylib/examples/core/core_input_gestures.pngbin0 -> 19480 bytes
-rw-r--r--deps/raylib/examples/core/core_input_gestures_web.c330
-rw-r--r--deps/raylib/examples/core/core_input_gestures_web.pngbin0 -> 8937 bytes
-rw-r--r--deps/raylib/examples/core/core_input_keys.c64
-rw-r--r--deps/raylib/examples/core/core_input_keys.pngbin0 -> 10379 bytes
-rw-r--r--deps/raylib/examples/core/core_input_mouse.c70
-rw-r--r--deps/raylib/examples/core/core_input_mouse.pngbin0 -> 15444 bytes
-rw-r--r--deps/raylib/examples/core/core_input_mouse_wheel.c63
-rw-r--r--deps/raylib/examples/core/core_input_mouse_wheel.pngbin0 -> 15375 bytes
-rw-r--r--deps/raylib/examples/core/core_input_multitouch.c79
-rw-r--r--deps/raylib/examples/core/core_input_multitouch.pngbin0 -> 17177 bytes
-rw-r--r--deps/raylib/examples/core/core_input_virtual_controls.c123
-rw-r--r--deps/raylib/examples/core/core_input_virtual_controls.pngbin0 -> 9094 bytes
-rw-r--r--deps/raylib/examples/core/core_loading_thread.c156
-rw-r--r--deps/raylib/examples/core/core_loading_thread.pngbin0 -> 15032 bytes
-rw-r--r--deps/raylib/examples/core/core_random_sequence.c176
-rw-r--r--deps/raylib/examples/core/core_random_sequence.pngbin0 -> 34025 bytes
-rw-r--r--deps/raylib/examples/core/core_random_values.c72
-rw-r--r--deps/raylib/examples/core/core_random_values.pngbin0 -> 15247 bytes
-rw-r--r--deps/raylib/examples/core/core_scissor_test.c76
-rw-r--r--deps/raylib/examples/core/core_scissor_test.pngbin0 -> 15348 bytes
-rw-r--r--deps/raylib/examples/core/core_smooth_pixelperfect.c122
-rw-r--r--deps/raylib/examples/core/core_smooth_pixelperfect.pngbin0 -> 15791 bytes
-rw-r--r--deps/raylib/examples/core/core_storage_values.c193
-rw-r--r--deps/raylib/examples/core/core_storage_values.pngbin0 -> 16147 bytes
-rw-r--r--deps/raylib/examples/core/core_vr_simulator.c150
-rw-r--r--deps/raylib/examples/core/core_vr_simulator.pngbin0 -> 177237 bytes
-rw-r--r--deps/raylib/examples/core/core_window_flags.c196
-rw-r--r--deps/raylib/examples/core/core_window_flags.pngbin0 -> 22040 bytes
-rw-r--r--deps/raylib/examples/core/core_window_letterbox.c107
-rw-r--r--deps/raylib/examples/core/core_window_letterbox.pngbin0 -> 23608 bytes
-rw-r--r--deps/raylib/examples/core/core_window_should_close.c77
-rw-r--r--deps/raylib/examples/core/core_window_should_close.pngbin0 -> 15199 bytes
-rw-r--r--deps/raylib/examples/core/core_world_screen.c85
-rw-r--r--deps/raylib/examples/core/core_world_screen.pngbin0 -> 23813 bytes
-rw-r--r--deps/raylib/examples/core/resources/LICENSE.md4
-rw-r--r--deps/raylib/examples/core/resources/distortion100.fs52
-rw-r--r--deps/raylib/examples/core/resources/distortion330.fs53
-rw-r--r--deps/raylib/examples/core/resources/ps3.pngbin0 -> 19280 bytes
-rw-r--r--deps/raylib/examples/core/resources/xbox.pngbin0 -> 16112 bytes
75 files changed, 5114 insertions, 0 deletions
diff --git a/deps/raylib/examples/core/core_2d_camera.c b/deps/raylib/examples/core/core_2d_camera.c
new file mode 100644
index 0000000..99b61d4
--- /dev/null
+++ b/deps/raylib/examples/core/core_2d_camera.c
@@ -0,0 +1,136 @@
+/*******************************************************************************************
+*
+* raylib [core] example - 2D Camera system
+*
+* Example originally created with raylib 1.5, last time updated with raylib 3.0
+*
+* 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) 2016-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#define MAX_BUILDINGS 100
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera");
+
+ Rectangle player = { 400, 280, 40, 40 };
+ Rectangle buildings[MAX_BUILDINGS] = { 0 };
+ Color buildColors[MAX_BUILDINGS] = { 0 };
+
+ int spacing = 0;
+
+ for (int i = 0; i < MAX_BUILDINGS; i++)
+ {
+ buildings[i].width = (float)GetRandomValue(50, 200);
+ buildings[i].height = (float)GetRandomValue(100, 800);
+ buildings[i].y = screenHeight - 130.0f - buildings[i].height;
+ buildings[i].x = -6000.0f + spacing;
+
+ spacing += (int)buildings[i].width;
+
+ buildColors[i] = (Color){ GetRandomValue(200, 240), GetRandomValue(200, 240), GetRandomValue(200, 250), 255 };
+ }
+
+ Camera2D camera = { 0 };
+ camera.target = (Vector2){ player.x + 20.0f, player.y + 20.0f };
+ camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
+ camera.rotation = 0.0f;
+ camera.zoom = 1.0f;
+
+ 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
+ //----------------------------------------------------------------------------------
+ // Player movement
+ if (IsKeyDown(KEY_RIGHT)) player.x += 2;
+ else if (IsKeyDown(KEY_LEFT)) player.x -= 2;
+
+ // Camera target follows player
+ camera.target = (Vector2){ player.x + 20, player.y + 20 };
+
+ // Camera rotation controls
+ if (IsKeyDown(KEY_A)) camera.rotation--;
+ else if (IsKeyDown(KEY_S)) camera.rotation++;
+
+ // Limit camera rotation to 80 degrees (-40 to 40)
+ if (camera.rotation > 40) camera.rotation = 40;
+ else if (camera.rotation < -40) camera.rotation = -40;
+
+ // Camera zoom controls
+ camera.zoom += ((float)GetMouseWheelMove()*0.05f);
+
+ if (camera.zoom > 3.0f) camera.zoom = 3.0f;
+ else if (camera.zoom < 0.1f) camera.zoom = 0.1f;
+
+ // Camera reset (zoom and rotation)
+ if (IsKeyPressed(KEY_R))
+ {
+ camera.zoom = 1.0f;
+ camera.rotation = 0.0f;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginMode2D(camera);
+
+ DrawRectangle(-6000, 320, 13000, 8000, DARKGRAY);
+
+ for (int i = 0; i < MAX_BUILDINGS; i++) DrawRectangleRec(buildings[i], buildColors[i]);
+
+ DrawRectangleRec(player, RED);
+
+ DrawLine((int)camera.target.x, -screenHeight*10, (int)camera.target.x, screenHeight*10, GREEN);
+ DrawLine(-screenWidth*10, (int)camera.target.y, screenWidth*10, (int)camera.target.y, GREEN);
+
+ EndMode2D();
+
+ DrawText("SCREEN AREA", 640, 10, 20, RED);
+
+ DrawRectangle(0, 0, screenWidth, 5, RED);
+ DrawRectangle(0, 5, 5, screenHeight - 10, RED);
+ DrawRectangle(screenWidth - 5, 5, 5, screenHeight - 10, RED);
+ DrawRectangle(0, screenHeight - 5, screenWidth, 5, RED);
+
+ DrawRectangle( 10, 10, 250, 113, Fade(SKYBLUE, 0.5f));
+ DrawRectangleLines( 10, 10, 250, 113, BLUE);
+
+ DrawText("Free 2d camera controls:", 20, 20, 10, BLACK);
+ DrawText("- Right/Left to move Offset", 40, 40, 10, DARKGRAY);
+ DrawText("- Mouse Wheel to Zoom in-out", 40, 60, 10, DARKGRAY);
+ DrawText("- A / S to Rotate", 40, 80, 10, DARKGRAY);
+ DrawText("- R to reset Zoom and Rotation", 40, 100, 10, DARKGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_2d_camera.png b/deps/raylib/examples/core/core_2d_camera.png
new file mode 100644
index 0000000..d2f9e63
--- /dev/null
+++ b/deps/raylib/examples/core/core_2d_camera.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_2d_camera_mouse_zoom.c b/deps/raylib/examples/core/core_2d_camera_mouse_zoom.c
new file mode 100644
index 0000000..a9864b1
--- /dev/null
+++ b/deps/raylib/examples/core/core_2d_camera_mouse_zoom.c
@@ -0,0 +1,142 @@
+/*******************************************************************************************
+*
+* raylib [core] example - 2d camera mouse zoom
+*
+* Example originally created with raylib 4.2, last time updated with raylib 4.2
+*
+* 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) 2022-2024 Jeffery Myers (@JeffM2501)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include "rlgl.h"
+#include "raymath.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main ()
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera mouse zoom");
+
+ Camera2D camera = { 0 };
+ camera.zoom = 1.0f;
+
+ int zoomMode = 0; // 0-Mouse Wheel, 1-Mouse Move
+
+ 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
+ //----------------------------------------------------------------------------------
+ if (IsKeyPressed(KEY_ONE)) zoomMode = 0;
+ else if (IsKeyPressed(KEY_TWO)) zoomMode = 1;
+
+ // Translate based on mouse right click
+ if (IsMouseButtonDown(MOUSE_BUTTON_LEFT))
+ {
+ Vector2 delta = GetMouseDelta();
+ delta = Vector2Scale(delta, -1.0f/camera.zoom);
+ camera.target = Vector2Add(camera.target, delta);
+ }
+
+ if (zoomMode == 0)
+ {
+ // Zoom based on mouse wheel
+ float wheel = GetMouseWheelMove();
+ if (wheel != 0)
+ {
+ // Get the world point that is under the mouse
+ Vector2 mouseWorldPos = GetScreenToWorld2D(GetMousePosition(), camera);
+
+ // Set the offset to where the mouse is
+ camera.offset = GetMousePosition();
+
+ // Set the target to match, so that the camera maps the world space point
+ // under the cursor to the screen space point under the cursor at any zoom
+ camera.target = mouseWorldPos;
+
+ // Zoom increment
+ float scaleFactor = 1.0f + (0.25f*fabsf(wheel));
+ if (wheel < 0) scaleFactor = 1.0f/scaleFactor;
+ camera.zoom = Clamp(camera.zoom*scaleFactor, 0.125f, 64.0f);
+ }
+ }
+ else
+ {
+ // Zoom based on mouse right click
+ if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT))
+ {
+ // Get the world point that is under the mouse
+ Vector2 mouseWorldPos = GetScreenToWorld2D(GetMousePosition(), camera);
+
+ // Set the offset to where the mouse is
+ camera.offset = GetMousePosition();
+
+ // Set the target to match, so that the camera maps the world space point
+ // under the cursor to the screen space point under the cursor at any zoom
+ camera.target = mouseWorldPos;
+ }
+ if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
+ {
+ // Zoom increment
+ float deltaX = GetMouseDelta().x;
+ float scaleFactor = 1.0f + (0.01f*fabsf(deltaX));
+ if (deltaX < 0) scaleFactor = 1.0f/scaleFactor;
+ camera.zoom = Clamp(camera.zoom*scaleFactor, 0.125f, 64.0f);
+ }
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+ ClearBackground(RAYWHITE);
+
+ BeginMode2D(camera);
+
+ // Draw the 3d grid, rotated 90 degrees and centered around 0,0
+ // just so we have something in the XY plane
+ rlPushMatrix();
+ rlTranslatef(0, 25*50, 0);
+ rlRotatef(90, 1, 0, 0);
+ DrawGrid(100, 50);
+ rlPopMatrix();
+
+ // Draw a reference circle
+ DrawCircle(GetScreenWidth()/2, GetScreenHeight()/2, 50, MAROON);
+
+ EndMode2D();
+
+ // Draw mouse reference
+ //Vector2 mousePos = GetWorldToScreen2D(GetMousePosition(), camera)
+ DrawCircleV(GetMousePosition(), 4, DARKGRAY);
+ DrawTextEx(GetFontDefault(), TextFormat("[%i, %i]", GetMouseX(), GetMouseY()),
+ Vector2Add(GetMousePosition(), (Vector2){ -44, -24 }), 20, 2, BLACK);
+
+ DrawText("[1][2] Select mouse zoom mode (Wheel or Move)", 20, 20, 20, DARKGRAY);
+ if (zoomMode == 0) DrawText("Mouse left button drag to move, mouse wheel to zoom", 20, 50, 20, DARKGRAY);
+ else DrawText("Mouse left button drag to move, mouse press and move to zoom", 20, 50, 20, DARKGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_2d_camera_mouse_zoom.png b/deps/raylib/examples/core/core_2d_camera_mouse_zoom.png
new file mode 100644
index 0000000..b920d5c
--- /dev/null
+++ b/deps/raylib/examples/core/core_2d_camera_mouse_zoom.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_2d_camera_platformer.c b/deps/raylib/examples/core/core_2d_camera_platformer.c
new file mode 100644
index 0000000..3743de8
--- /dev/null
+++ b/deps/raylib/examples/core/core_2d_camera_platformer.c
@@ -0,0 +1,301 @@
+/*******************************************************************************************
+*
+* raylib [core] example - 2D Camera platformer
+*
+* Example originally created with raylib 2.5, last time updated with raylib 3.0
+*
+* Example contributed by arvyy (@arvyy) 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) 2019-2024 arvyy (@arvyy)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include "raymath.h"
+
+#define G 400
+#define PLAYER_JUMP_SPD 350.0f
+#define PLAYER_HOR_SPD 200.0f
+
+typedef struct Player {
+ Vector2 position;
+ float speed;
+ bool canJump;
+} Player;
+
+typedef struct EnvItem {
+ Rectangle rect;
+ int blocking;
+ Color color;
+} EnvItem;
+
+//----------------------------------------------------------------------------------
+// Module functions declaration
+//----------------------------------------------------------------------------------
+void UpdatePlayer(Player *player, EnvItem *envItems, int envItemsLength, float delta);
+void UpdateCameraCenter(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height);
+void UpdateCameraCenterInsideMap(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height);
+void UpdateCameraCenterSmoothFollow(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height);
+void UpdateCameraEvenOutOnLanding(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height);
+void UpdateCameraPlayerBoundsPush(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height);
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera");
+
+ Player player = { 0 };
+ player.position = (Vector2){ 400, 280 };
+ player.speed = 0;
+ player.canJump = false;
+ EnvItem envItems[] = {
+ {{ 0, 0, 1000, 400 }, 0, LIGHTGRAY },
+ {{ 0, 400, 1000, 200 }, 1, GRAY },
+ {{ 300, 200, 400, 10 }, 1, GRAY },
+ {{ 250, 300, 100, 10 }, 1, GRAY },
+ {{ 650, 300, 100, 10 }, 1, GRAY }
+ };
+
+ int envItemsLength = sizeof(envItems)/sizeof(envItems[0]);
+
+ Camera2D camera = { 0 };
+ camera.target = player.position;
+ camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
+ camera.rotation = 0.0f;
+ camera.zoom = 1.0f;
+
+ // Store pointers to the multiple update camera functions
+ void (*cameraUpdaters[])(Camera2D*, Player*, EnvItem*, int, float, int, int) = {
+ UpdateCameraCenter,
+ UpdateCameraCenterInsideMap,
+ UpdateCameraCenterSmoothFollow,
+ UpdateCameraEvenOutOnLanding,
+ UpdateCameraPlayerBoundsPush
+ };
+
+ int cameraOption = 0;
+ int cameraUpdatersLength = sizeof(cameraUpdaters)/sizeof(cameraUpdaters[0]);
+
+ char *cameraDescriptions[] = {
+ "Follow player center",
+ "Follow player center, but clamp to map edges",
+ "Follow player center; smoothed",
+ "Follow player center horizontally; update player center vertically after landing",
+ "Player push camera on getting too close to screen edge"
+ };
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose())
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ float deltaTime = GetFrameTime();
+
+ UpdatePlayer(&player, envItems, envItemsLength, deltaTime);
+
+ camera.zoom += ((float)GetMouseWheelMove()*0.05f);
+
+ if (camera.zoom > 3.0f) camera.zoom = 3.0f;
+ else if (camera.zoom < 0.25f) camera.zoom = 0.25f;
+
+ if (IsKeyPressed(KEY_R))
+ {
+ camera.zoom = 1.0f;
+ player.position = (Vector2){ 400, 280 };
+ }
+
+ if (IsKeyPressed(KEY_C)) cameraOption = (cameraOption + 1)%cameraUpdatersLength;
+
+ // Call update camera function by its pointer
+ cameraUpdaters[cameraOption](&camera, &player, envItems, envItemsLength, deltaTime, screenWidth, screenHeight);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(LIGHTGRAY);
+
+ BeginMode2D(camera);
+
+ for (int i = 0; i < envItemsLength; i++) DrawRectangleRec(envItems[i].rect, envItems[i].color);
+
+ Rectangle playerRect = { player.position.x - 20, player.position.y - 40, 40.0f, 40.0f };
+ DrawRectangleRec(playerRect, RED);
+
+ DrawCircleV(player.position, 5.0f, GOLD);
+
+ EndMode2D();
+
+ DrawText("Controls:", 20, 20, 10, BLACK);
+ DrawText("- Right/Left to move", 40, 40, 10, DARKGRAY);
+ DrawText("- Space to jump", 40, 60, 10, DARKGRAY);
+ DrawText("- Mouse Wheel to Zoom in-out, R to reset zoom", 40, 80, 10, DARKGRAY);
+ DrawText("- C to change camera mode", 40, 100, 10, DARKGRAY);
+ DrawText("Current camera mode:", 20, 120, 10, BLACK);
+ DrawText(cameraDescriptions[cameraOption], 40, 140, 10, DARKGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+void UpdatePlayer(Player *player, EnvItem *envItems, int envItemsLength, float delta)
+{
+ if (IsKeyDown(KEY_LEFT)) player->position.x -= PLAYER_HOR_SPD*delta;
+ if (IsKeyDown(KEY_RIGHT)) player->position.x += PLAYER_HOR_SPD*delta;
+ if (IsKeyDown(KEY_SPACE) && player->canJump)
+ {
+ player->speed = -PLAYER_JUMP_SPD;
+ player->canJump = false;
+ }
+
+ bool hitObstacle = false;
+ for (int i = 0; i < envItemsLength; i++)
+ {
+ EnvItem *ei = envItems + i;
+ Vector2 *p = &(player->position);
+ if (ei->blocking &&
+ ei->rect.x <= p->x &&
+ ei->rect.x + ei->rect.width >= p->x &&
+ ei->rect.y >= p->y &&
+ ei->rect.y <= p->y + player->speed*delta)
+ {
+ hitObstacle = true;
+ player->speed = 0.0f;
+ p->y = ei->rect.y;
+ break;
+ }
+ }
+
+ if (!hitObstacle)
+ {
+ player->position.y += player->speed*delta;
+ player->speed += G*delta;
+ player->canJump = false;
+ }
+ else player->canJump = true;
+}
+
+void UpdateCameraCenter(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height)
+{
+ camera->offset = (Vector2){ width/2.0f, height/2.0f };
+ camera->target = player->position;
+}
+
+void UpdateCameraCenterInsideMap(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height)
+{
+ camera->target = player->position;
+ camera->offset = (Vector2){ width/2.0f, height/2.0f };
+ float minX = 1000, minY = 1000, maxX = -1000, maxY = -1000;
+
+ for (int i = 0; i < envItemsLength; i++)
+ {
+ EnvItem *ei = envItems + i;
+ minX = fminf(ei->rect.x, minX);
+ maxX = fmaxf(ei->rect.x + ei->rect.width, maxX);
+ minY = fminf(ei->rect.y, minY);
+ maxY = fmaxf(ei->rect.y + ei->rect.height, maxY);
+ }
+
+ Vector2 max = GetWorldToScreen2D((Vector2){ maxX, maxY }, *camera);
+ Vector2 min = GetWorldToScreen2D((Vector2){ minX, minY }, *camera);
+
+ if (max.x < width) camera->offset.x = width - (max.x - width/2);
+ if (max.y < height) camera->offset.y = height - (max.y - height/2);
+ if (min.x > 0) camera->offset.x = width/2 - min.x;
+ if (min.y > 0) camera->offset.y = height/2 - min.y;
+}
+
+void UpdateCameraCenterSmoothFollow(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height)
+{
+ static float minSpeed = 30;
+ static float minEffectLength = 10;
+ static float fractionSpeed = 0.8f;
+
+ camera->offset = (Vector2){ width/2.0f, height/2.0f };
+ Vector2 diff = Vector2Subtract(player->position, camera->target);
+ float length = Vector2Length(diff);
+
+ if (length > minEffectLength)
+ {
+ float speed = fmaxf(fractionSpeed*length, minSpeed);
+ camera->target = Vector2Add(camera->target, Vector2Scale(diff, speed*delta/length));
+ }
+}
+
+void UpdateCameraEvenOutOnLanding(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height)
+{
+ static float evenOutSpeed = 700;
+ static int eveningOut = false;
+ static float evenOutTarget;
+
+ camera->offset = (Vector2){ width/2.0f, height/2.0f };
+ camera->target.x = player->position.x;
+
+ if (eveningOut)
+ {
+ if (evenOutTarget > camera->target.y)
+ {
+ camera->target.y += evenOutSpeed*delta;
+
+ if (camera->target.y > evenOutTarget)
+ {
+ camera->target.y = evenOutTarget;
+ eveningOut = 0;
+ }
+ }
+ else
+ {
+ camera->target.y -= evenOutSpeed*delta;
+
+ if (camera->target.y < evenOutTarget)
+ {
+ camera->target.y = evenOutTarget;
+ eveningOut = 0;
+ }
+ }
+ }
+ else
+ {
+ if (player->canJump && (player->speed == 0) && (player->position.y != camera->target.y))
+ {
+ eveningOut = 1;
+ evenOutTarget = player->position.y;
+ }
+ }
+}
+
+void UpdateCameraPlayerBoundsPush(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height)
+{
+ static Vector2 bbox = { 0.2f, 0.2f };
+
+ Vector2 bboxWorldMin = GetScreenToWorld2D((Vector2){ (1 - bbox.x)*0.5f*width, (1 - bbox.y)*0.5f*height }, *camera);
+ Vector2 bboxWorldMax = GetScreenToWorld2D((Vector2){ (1 + bbox.x)*0.5f*width, (1 + bbox.y)*0.5f*height }, *camera);
+ camera->offset = (Vector2){ (1 - bbox.x)*0.5f * width, (1 - bbox.y)*0.5f*height };
+
+ if (player->position.x < bboxWorldMin.x) camera->target.x = player->position.x;
+ if (player->position.y < bboxWorldMin.y) camera->target.y = player->position.y;
+ if (player->position.x > bboxWorldMax.x) camera->target.x = bboxWorldMin.x + (player->position.x - bboxWorldMax.x);
+ if (player->position.y > bboxWorldMax.y) camera->target.y = bboxWorldMin.y + (player->position.y - bboxWorldMax.y);
+}
diff --git a/deps/raylib/examples/core/core_2d_camera_platformer.png b/deps/raylib/examples/core/core_2d_camera_platformer.png
new file mode 100644
index 0000000..518c8cd
--- /dev/null
+++ b/deps/raylib/examples/core/core_2d_camera_platformer.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_2d_camera_split_screen.c b/deps/raylib/examples/core/core_2d_camera_split_screen.c
new file mode 100644
index 0000000..60b5a2e
--- /dev/null
+++ b/deps/raylib/examples/core/core_2d_camera_split_screen.c
@@ -0,0 +1,167 @@
+/*******************************************************************************************
+*
+* raylib [core] example - 2d camera split screen
+*
+* Addapted from the core_3d_camera_split_screen example:
+* https://github.com/raysan5/raylib/blob/master/examples/core/core_3d_camera_split_screen.c
+*
+* Example originally created with raylib 4.5, last time updated with raylib 4.5
+*
+* Example contributed by Gabriel dos Santos Sanches (@gabrielssanches) 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) 2023 Gabriel dos Santos Sanches (@gabrielssanches)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#define PLAYER_SIZE 40
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 440;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera split screen");
+
+ Rectangle player1 = { 200, 200, PLAYER_SIZE, PLAYER_SIZE };
+ Rectangle player2 = { 250, 200, PLAYER_SIZE, PLAYER_SIZE };
+
+ Camera2D camera1 = { 0 };
+ camera1.target = (Vector2){ player1.x, player1.y };
+ camera1.offset = (Vector2){ 200.0f, 200.0f };
+ camera1.rotation = 0.0f;
+ camera1.zoom = 1.0f;
+
+ Camera2D camera2 = { 0 };
+ camera2.target = (Vector2){ player2.x, player2.y };
+ camera2.offset = (Vector2){ 200.0f, 200.0f };
+ camera2.rotation = 0.0f;
+ camera2.zoom = 1.0f;
+
+ RenderTexture screenCamera1 = LoadRenderTexture(screenWidth/2, screenHeight);
+ RenderTexture screenCamera2 = LoadRenderTexture(screenWidth/2, screenHeight);
+
+ // Build a flipped rectangle the size of the split view to use for drawing later
+ Rectangle splitScreenRect = { 0.0f, 0.0f, (float)screenCamera1.texture.width, (float)-screenCamera1.texture.height };
+
+ 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
+ //----------------------------------------------------------------------------------
+ if (IsKeyDown(KEY_S)) player1.y += 3.0f;
+ else if (IsKeyDown(KEY_W)) player1.y -= 3.0f;
+ if (IsKeyDown(KEY_D)) player1.x += 3.0f;
+ else if (IsKeyDown(KEY_A)) player1.x -= 3.0f;
+
+ if (IsKeyDown(KEY_UP)) player2.y -= 3.0f;
+ else if (IsKeyDown(KEY_DOWN)) player2.y += 3.0f;
+ if (IsKeyDown(KEY_RIGHT)) player2.x += 3.0f;
+ else if (IsKeyDown(KEY_LEFT)) player2.x -= 3.0f;
+
+ camera1.target = (Vector2){ player1.x, player1.y };
+ camera2.target = (Vector2){ player2.x, player2.y };
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginTextureMode(screenCamera1);
+ ClearBackground(RAYWHITE);
+
+ BeginMode2D(camera1);
+
+ // Draw full scene with first camera
+ for (int i = 0; i < screenWidth/PLAYER_SIZE + 1; i++)
+ {
+ DrawLineV((Vector2){(float)PLAYER_SIZE*i, 0}, (Vector2){ (float)PLAYER_SIZE*i, (float)screenHeight}, LIGHTGRAY);
+ }
+
+ for (int i = 0; i < screenHeight/PLAYER_SIZE + 1; i++)
+ {
+ DrawLineV((Vector2){0, (float)PLAYER_SIZE*i}, (Vector2){ (float)screenWidth, (float)PLAYER_SIZE*i}, LIGHTGRAY);
+ }
+
+ for (int i = 0; i < screenWidth/PLAYER_SIZE; i++)
+ {
+ for (int j = 0; j < screenHeight/PLAYER_SIZE; j++)
+ {
+ DrawText(TextFormat("[%i,%i]", i, j), 10 + PLAYER_SIZE*i, 15 + PLAYER_SIZE*j, 10, LIGHTGRAY);
+ }
+ }
+
+ DrawRectangleRec(player1, RED);
+ DrawRectangleRec(player2, BLUE);
+ EndMode2D();
+
+ DrawRectangle(0, 0, GetScreenWidth()/2, 30, Fade(RAYWHITE, 0.6f));
+ DrawText("PLAYER1: W/S/A/D to move", 10, 10, 10, MAROON);
+
+ EndTextureMode();
+
+ BeginTextureMode(screenCamera2);
+ ClearBackground(RAYWHITE);
+
+ BeginMode2D(camera2);
+
+ // Draw full scene with second camera
+ for (int i = 0; i < screenWidth/PLAYER_SIZE + 1; i++)
+ {
+ DrawLineV((Vector2){ (float)PLAYER_SIZE*i, 0}, (Vector2){ (float)PLAYER_SIZE*i, (float)screenHeight}, LIGHTGRAY);
+ }
+
+ for (int i = 0; i < screenHeight/PLAYER_SIZE + 1; i++)
+ {
+ DrawLineV((Vector2){0, (float)PLAYER_SIZE*i}, (Vector2){ (float)screenWidth, (float)PLAYER_SIZE*i}, LIGHTGRAY);
+ }
+
+ for (int i = 0; i < screenWidth/PLAYER_SIZE; i++)
+ {
+ for (int j = 0; j < screenHeight/PLAYER_SIZE; j++)
+ {
+ DrawText(TextFormat("[%i,%i]", i, j), 10 + PLAYER_SIZE*i, 15 + PLAYER_SIZE*j, 10, LIGHTGRAY);
+ }
+ }
+
+ DrawRectangleRec(player1, RED);
+ DrawRectangleRec(player2, BLUE);
+
+ EndMode2D();
+
+ DrawRectangle(0, 0, GetScreenWidth()/2, 30, Fade(RAYWHITE, 0.6f));
+ DrawText("PLAYER2: UP/DOWN/LEFT/RIGHT to move", 10, 10, 10, DARKBLUE);
+
+ EndTextureMode();
+
+ // Draw both views render textures to the screen side by side
+ BeginDrawing();
+ ClearBackground(BLACK);
+
+ DrawTextureRec(screenCamera1.texture, splitScreenRect, (Vector2){ 0, 0 }, WHITE);
+ DrawTextureRec(screenCamera2.texture, splitScreenRect, (Vector2){ screenWidth/2.0f, 0 }, WHITE);
+
+ DrawRectangle(GetScreenWidth()/2 - 2, 0, 4, GetScreenHeight(), LIGHTGRAY);
+ EndDrawing();
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadRenderTexture(screenCamera1); // Unload render texture
+ UnloadRenderTexture(screenCamera2); // Unload render texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_2d_camera_split_screen.png b/deps/raylib/examples/core/core_2d_camera_split_screen.png
new file mode 100644
index 0000000..a441e39
--- /dev/null
+++ b/deps/raylib/examples/core/core_2d_camera_split_screen.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_3d_camera_first_person.c b/deps/raylib/examples/core/core_3d_camera_first_person.c
new file mode 100644
index 0000000..35b18ac
--- /dev/null
+++ b/deps/raylib/examples/core/core_3d_camera_first_person.c
@@ -0,0 +1,206 @@
+/*******************************************************************************************
+*
+* raylib [core] example - 3d camera first person
+*
+* Example originally created with raylib 1.3, last time updated with raylib 1.3
+*
+* 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) 2015-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include "rcamera.h"
+
+#define MAX_COLUMNS 20
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera first person");
+
+ // Define the camera to look into our 3d world (position, target, up vector)
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 0.0f, 2.0f, 4.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 2.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 60.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ int cameraMode = CAMERA_FIRST_PERSON;
+
+ // Generates some random columns
+ float heights[MAX_COLUMNS] = { 0 };
+ Vector3 positions[MAX_COLUMNS] = { 0 };
+ Color colors[MAX_COLUMNS] = { 0 };
+
+ for (int i = 0; i < MAX_COLUMNS; i++)
+ {
+ heights[i] = (float)GetRandomValue(1, 12);
+ positions[i] = (Vector3){ (float)GetRandomValue(-15, 15), heights[i]/2.0f, (float)GetRandomValue(-15, 15) };
+ colors[i] = (Color){ GetRandomValue(20, 255), GetRandomValue(10, 55), 30, 255 };
+ }
+
+ 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
+ //----------------------------------------------------------------------------------
+ // Switch camera mode
+ if (IsKeyPressed(KEY_ONE))
+ {
+ cameraMode = CAMERA_FREE;
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll
+ }
+
+ if (IsKeyPressed(KEY_TWO))
+ {
+ cameraMode = CAMERA_FIRST_PERSON;
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll
+ }
+
+ if (IsKeyPressed(KEY_THREE))
+ {
+ cameraMode = CAMERA_THIRD_PERSON;
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll
+ }
+
+ if (IsKeyPressed(KEY_FOUR))
+ {
+ cameraMode = CAMERA_ORBITAL;
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll
+ }
+
+ // Switch camera projection
+ if (IsKeyPressed(KEY_P))
+ {
+ if (camera.projection == CAMERA_PERSPECTIVE)
+ {
+ // Create isometric view
+ cameraMode = CAMERA_THIRD_PERSON;
+ // Note: The target distance is related to the render distance in the orthographic projection
+ camera.position = (Vector3){ 0.0f, 2.0f, -100.0f };
+ camera.target = (Vector3){ 0.0f, 2.0f, 0.0f };
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
+ camera.projection = CAMERA_ORTHOGRAPHIC;
+ camera.fovy = 20.0f; // near plane width in CAMERA_ORTHOGRAPHIC
+ CameraYaw(&camera, -135 * DEG2RAD, true);
+ CameraPitch(&camera, -45 * DEG2RAD, true, true, false);
+ }
+ else if (camera.projection == CAMERA_ORTHOGRAPHIC)
+ {
+ // Reset to default view
+ cameraMode = CAMERA_THIRD_PERSON;
+ camera.position = (Vector3){ 0.0f, 2.0f, 10.0f };
+ camera.target = (Vector3){ 0.0f, 2.0f, 0.0f };
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
+ camera.projection = CAMERA_PERSPECTIVE;
+ camera.fovy = 60.0f;
+ }
+ }
+
+ // Update camera computes movement internally depending on the camera mode
+ // Some default standard keyboard/mouse inputs are hardcoded to simplify use
+ // For advance camera controls, it's reecommended to compute camera movement manually
+ UpdateCamera(&camera, cameraMode); // Update camera
+
+/*
+ // Camera PRO usage example (EXPERIMENTAL)
+ // This new camera function allows custom movement/rotation values to be directly provided
+ // as input parameters, with this approach, rcamera module is internally independent of raylib inputs
+ UpdateCameraPro(&camera,
+ (Vector3){
+ (IsKeyDown(KEY_W) || IsKeyDown(KEY_UP))*0.1f - // Move forward-backward
+ (IsKeyDown(KEY_S) || IsKeyDown(KEY_DOWN))*0.1f,
+ (IsKeyDown(KEY_D) || IsKeyDown(KEY_RIGHT))*0.1f - // Move right-left
+ (IsKeyDown(KEY_A) || IsKeyDown(KEY_LEFT))*0.1f,
+ 0.0f // Move up-down
+ },
+ (Vector3){
+ GetMouseDelta().x*0.05f, // Rotation: yaw
+ GetMouseDelta().y*0.05f, // Rotation: pitch
+ 0.0f // Rotation: roll
+ },
+ GetMouseWheelMove()*2.0f); // Move to target (zoom)
+*/
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginMode3D(camera);
+
+ DrawPlane((Vector3){ 0.0f, 0.0f, 0.0f }, (Vector2){ 32.0f, 32.0f }, LIGHTGRAY); // Draw ground
+ DrawCube((Vector3){ -16.0f, 2.5f, 0.0f }, 1.0f, 5.0f, 32.0f, BLUE); // Draw a blue wall
+ DrawCube((Vector3){ 16.0f, 2.5f, 0.0f }, 1.0f, 5.0f, 32.0f, LIME); // Draw a green wall
+ DrawCube((Vector3){ 0.0f, 2.5f, 16.0f }, 32.0f, 5.0f, 1.0f, GOLD); // Draw a yellow wall
+
+ // Draw some cubes around
+ for (int i = 0; i < MAX_COLUMNS; i++)
+ {
+ DrawCube(positions[i], 2.0f, heights[i], 2.0f, colors[i]);
+ DrawCubeWires(positions[i], 2.0f, heights[i], 2.0f, MAROON);
+ }
+
+ // Draw player cube
+ if (cameraMode == CAMERA_THIRD_PERSON)
+ {
+ DrawCube(camera.target, 0.5f, 0.5f, 0.5f, PURPLE);
+ DrawCubeWires(camera.target, 0.5f, 0.5f, 0.5f, DARKPURPLE);
+ }
+
+ EndMode3D();
+
+ // Draw info boxes
+ DrawRectangle(5, 5, 330, 100, Fade(SKYBLUE, 0.5f));
+ DrawRectangleLines(5, 5, 330, 100, BLUE);
+
+ DrawText("Camera controls:", 15, 15, 10, BLACK);
+ DrawText("- Move keys: W, A, S, D, Space, Left-Ctrl", 15, 30, 10, BLACK);
+ DrawText("- Look around: arrow keys or mouse", 15, 45, 10, BLACK);
+ DrawText("- Camera mode keys: 1, 2, 3, 4", 15, 60, 10, BLACK);
+ DrawText("- Zoom keys: num-plus, num-minus or mouse scroll", 15, 75, 10, BLACK);
+ DrawText("- Camera projection key: P", 15, 90, 10, BLACK);
+
+ DrawRectangle(600, 5, 195, 100, Fade(SKYBLUE, 0.5f));
+ DrawRectangleLines(600, 5, 195, 100, BLUE);
+
+ DrawText("Camera status:", 610, 15, 10, BLACK);
+ DrawText(TextFormat("- Mode: %s", (cameraMode == CAMERA_FREE) ? "FREE" :
+ (cameraMode == CAMERA_FIRST_PERSON) ? "FIRST_PERSON" :
+ (cameraMode == CAMERA_THIRD_PERSON) ? "THIRD_PERSON" :
+ (cameraMode == CAMERA_ORBITAL) ? "ORBITAL" : "CUSTOM"), 610, 30, 10, BLACK);
+ DrawText(TextFormat("- Projection: %s", (camera.projection == CAMERA_PERSPECTIVE) ? "PERSPECTIVE" :
+ (camera.projection == CAMERA_ORTHOGRAPHIC) ? "ORTHOGRAPHIC" : "CUSTOM"), 610, 45, 10, BLACK);
+ DrawText(TextFormat("- Position: (%06.3f, %06.3f, %06.3f)", camera.position.x, camera.position.y, camera.position.z), 610, 60, 10, BLACK);
+ DrawText(TextFormat("- Target: (%06.3f, %06.3f, %06.3f)", camera.target.x, camera.target.y, camera.target.z), 610, 75, 10, BLACK);
+ DrawText(TextFormat("- Up: (%06.3f, %06.3f, %06.3f)", camera.up.x, camera.up.y, camera.up.z), 610, 90, 10, BLACK);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_3d_camera_first_person.png b/deps/raylib/examples/core/core_3d_camera_first_person.png
new file mode 100644
index 0000000..a995591
--- /dev/null
+++ b/deps/raylib/examples/core/core_3d_camera_first_person.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_3d_camera_free.c b/deps/raylib/examples/core/core_3d_camera_free.c
new file mode 100644
index 0000000..9899dbd
--- /dev/null
+++ b/deps/raylib/examples/core/core_3d_camera_free.c
@@ -0,0 +1,86 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Initialize 3d camera free
+*
+* Example originally created with raylib 1.3, last time updated with raylib 1.3
+*
+* 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) 2015-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera free");
+
+ // Define the camera to look into our 3d world
+ Camera3D camera = { 0 };
+ camera.position = (Vector3){ 10.0f, 10.0f, 10.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ Vector3 cubePosition = { 0.0f, 0.0f, 0.0f };
+
+ 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);
+
+ if (IsKeyPressed('Z')) camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginMode3D(camera);
+
+ DrawCube(cubePosition, 2.0f, 2.0f, 2.0f, RED);
+ DrawCubeWires(cubePosition, 2.0f, 2.0f, 2.0f, MAROON);
+
+ DrawGrid(10, 1.0f);
+
+ EndMode3D();
+
+ DrawRectangle( 10, 10, 320, 93, Fade(SKYBLUE, 0.5f));
+ DrawRectangleLines( 10, 10, 320, 93, BLUE);
+
+ DrawText("Free camera default controls:", 20, 20, 10, BLACK);
+ DrawText("- Mouse Wheel to Zoom in-out", 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
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_3d_camera_free.png b/deps/raylib/examples/core/core_3d_camera_free.png
new file mode 100644
index 0000000..71dfc1c
--- /dev/null
+++ b/deps/raylib/examples/core/core_3d_camera_free.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_3d_camera_mode.c b/deps/raylib/examples/core/core_3d_camera_mode.c
new file mode 100644
index 0000000..0600fd3
--- /dev/null
+++ b/deps/raylib/examples/core/core_3d_camera_mode.c
@@ -0,0 +1,78 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Initialize 3d camera mode
+*
+* Example originally created with raylib 1.0, last time updated with raylib 1.0
+*
+* 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) 2014-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera mode");
+
+ // Define the camera to look into our 3d world
+ Camera3D camera = { 0 };
+ camera.position = (Vector3){ 0.0f, 10.0f, 10.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera mode type
+
+ Vector3 cubePosition = { 0.0f, 0.0f, 0.0f };
+
+ 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
+ //----------------------------------------------------------------------------------
+ // TODO: Update your variables here
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginMode3D(camera);
+
+ DrawCube(cubePosition, 2.0f, 2.0f, 2.0f, RED);
+ DrawCubeWires(cubePosition, 2.0f, 2.0f, 2.0f, MAROON);
+
+ DrawGrid(10, 1.0f);
+
+ EndMode3D();
+
+ DrawText("Welcome to the third dimension!", 10, 40, 20, DARKGRAY);
+
+ DrawFPS(10, 10);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_3d_camera_mode.png b/deps/raylib/examples/core/core_3d_camera_mode.png
new file mode 100644
index 0000000..de65dae
--- /dev/null
+++ b/deps/raylib/examples/core/core_3d_camera_mode.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_3d_camera_split_screen.c b/deps/raylib/examples/core/core_3d_camera_split_screen.c
new file mode 100644
index 0000000..5294e89
--- /dev/null
+++ b/deps/raylib/examples/core/core_3d_camera_split_screen.c
@@ -0,0 +1,174 @@
+/*******************************************************************************************
+*
+* raylib [core] example - 3d cmaera split screen
+*
+* Example originally created with raylib 3.7, last time updated with raylib 4.0
+*
+* Example contributed by Jeffery Myers (@JeffM2501) 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) 2021-2024 Jeffery Myers (@JeffM2501)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera split screen");
+
+ // Setup player 1 camera and screen
+ Camera cameraPlayer1 = { 0 };
+ cameraPlayer1.fovy = 45.0f;
+ cameraPlayer1.up.y = 1.0f;
+ cameraPlayer1.target.y = 1.0f;
+ cameraPlayer1.position.z = -3.0f;
+ cameraPlayer1.position.y = 1.0f;
+
+ RenderTexture screenPlayer1 = LoadRenderTexture(screenWidth/2, screenHeight);
+
+ // Setup player two camera and screen
+ Camera cameraPlayer2 = { 0 };
+ cameraPlayer2.fovy = 45.0f;
+ cameraPlayer2.up.y = 1.0f;
+ cameraPlayer2.target.y = 3.0f;
+ cameraPlayer2.position.x = -3.0f;
+ cameraPlayer2.position.y = 3.0f;
+
+ RenderTexture screenPlayer2 = LoadRenderTexture(screenWidth / 2, screenHeight);
+
+ // Build a flipped rectangle the size of the split view to use for drawing later
+ Rectangle splitScreenRect = { 0.0f, 0.0f, (float)screenPlayer1.texture.width, (float)-screenPlayer1.texture.height };
+
+ // Grid data
+ int count = 5;
+ float spacing = 4;
+
+ 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
+ //----------------------------------------------------------------------------------
+ // If anyone moves this frame, how far will they move based on the time since the last frame
+ // this moves thigns at 10 world units per second, regardless of the actual FPS
+ float offsetThisFrame = 10.0f*GetFrameTime();
+
+ // Move Player1 forward and backwards (no turning)
+ if (IsKeyDown(KEY_W))
+ {
+ cameraPlayer1.position.z += offsetThisFrame;
+ cameraPlayer1.target.z += offsetThisFrame;
+ }
+ else if (IsKeyDown(KEY_S))
+ {
+ cameraPlayer1.position.z -= offsetThisFrame;
+ cameraPlayer1.target.z -= offsetThisFrame;
+ }
+
+ // Move Player2 forward and backwards (no turning)
+ if (IsKeyDown(KEY_UP))
+ {
+ cameraPlayer2.position.x += offsetThisFrame;
+ cameraPlayer2.target.x += offsetThisFrame;
+ }
+ else if (IsKeyDown(KEY_DOWN))
+ {
+ cameraPlayer2.position.x -= offsetThisFrame;
+ cameraPlayer2.target.x -= offsetThisFrame;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ // Draw Player1 view to the render texture
+ BeginTextureMode(screenPlayer1);
+ ClearBackground(SKYBLUE);
+
+ BeginMode3D(cameraPlayer1);
+
+ // Draw scene: grid of cube trees on a plane to make a "world"
+ DrawPlane((Vector3){ 0, 0, 0 }, (Vector2){ 50, 50 }, BEIGE); // Simple world plane
+
+ for (float x = -count*spacing; x <= count*spacing; x += spacing)
+ {
+ for (float z = -count*spacing; z <= count*spacing; z += spacing)
+ {
+ DrawCube((Vector3) { x, 1.5f, z }, 1, 1, 1, LIME);
+ DrawCube((Vector3) { x, 0.5f, z }, 0.25f, 1, 0.25f, BROWN);
+ }
+ }
+
+ // Draw a cube at each player's position
+ DrawCube(cameraPlayer1.position, 1, 1, 1, RED);
+ DrawCube(cameraPlayer2.position, 1, 1, 1, BLUE);
+
+ EndMode3D();
+
+ DrawRectangle(0, 0, GetScreenWidth()/2, 40, Fade(RAYWHITE, 0.8f));
+ DrawText("PLAYER1: W/S to move", 10, 10, 20, MAROON);
+
+ EndTextureMode();
+
+ // Draw Player2 view to the render texture
+ BeginTextureMode(screenPlayer2);
+ ClearBackground(SKYBLUE);
+
+ BeginMode3D(cameraPlayer2);
+
+ // Draw scene: grid of cube trees on a plane to make a "world"
+ DrawPlane((Vector3){ 0, 0, 0 }, (Vector2){ 50, 50 }, BEIGE); // Simple world plane
+
+ for (float x = -count*spacing; x <= count*spacing; x += spacing)
+ {
+ for (float z = -count*spacing; z <= count*spacing; z += spacing)
+ {
+ DrawCube((Vector3) { x, 1.5f, z }, 1, 1, 1, LIME);
+ DrawCube((Vector3) { x, 0.5f, z }, 0.25f, 1, 0.25f, BROWN);
+ }
+ }
+
+ // Draw a cube at each player's position
+ DrawCube(cameraPlayer1.position, 1, 1, 1, RED);
+ DrawCube(cameraPlayer2.position, 1, 1, 1, BLUE);
+
+ EndMode3D();
+
+ DrawRectangle(0, 0, GetScreenWidth()/2, 40, Fade(RAYWHITE, 0.8f));
+ DrawText("PLAYER2: UP/DOWN to move", 10, 10, 20, DARKBLUE);
+
+ EndTextureMode();
+
+ // Draw both views render textures to the screen side by side
+ BeginDrawing();
+ ClearBackground(BLACK);
+
+ DrawTextureRec(screenPlayer1.texture, splitScreenRect, (Vector2){ 0, 0 }, WHITE);
+ DrawTextureRec(screenPlayer2.texture, splitScreenRect, (Vector2){ screenWidth/2.0f, 0 }, WHITE);
+
+ DrawRectangle(GetScreenWidth()/2 - 2, 0, 4, GetScreenHeight(), LIGHTGRAY);
+ EndDrawing();
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadRenderTexture(screenPlayer1); // Unload render texture
+ UnloadRenderTexture(screenPlayer2); // Unload render texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_3d_camera_split_screen.png b/deps/raylib/examples/core/core_3d_camera_split_screen.png
new file mode 100644
index 0000000..bc323d6
--- /dev/null
+++ b/deps/raylib/examples/core/core_3d_camera_split_screen.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_3d_picking.c b/deps/raylib/examples/core/core_3d_picking.c
new file mode 100644
index 0000000..634afba
--- /dev/null
+++ b/deps/raylib/examples/core/core_3d_picking.c
@@ -0,0 +1,118 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Picking in 3d mode
+*
+* Example originally created with raylib 1.3, last time updated with raylib 4.0
+*
+* 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) 2015-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d picking");
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 10.0f, 10.0f, 10.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ Vector3 cubePosition = { 0.0f, 1.0f, 0.0f };
+ Vector3 cubeSize = { 2.0f, 2.0f, 2.0f };
+
+ Ray ray = { 0 }; // Picking line ray
+ RayCollision collision = { 0 }; // Ray collision hit info
+
+ 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
+ //----------------------------------------------------------------------------------
+ if (IsCursorHidden()) UpdateCamera(&camera, CAMERA_FIRST_PERSON);
+
+ // Toggle camera controls
+ if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT))
+ {
+ if (IsCursorHidden()) EnableCursor();
+ else DisableCursor();
+ }
+
+ if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT))
+ {
+ if (!collision.hit)
+ {
+ ray = GetScreenToWorldRay(GetMousePosition(), camera);
+
+ // Check collision between ray and box
+ collision = GetRayCollisionBox(ray,
+ (BoundingBox){(Vector3){ cubePosition.x - cubeSize.x/2, cubePosition.y - cubeSize.y/2, cubePosition.z - cubeSize.z/2 },
+ (Vector3){ cubePosition.x + cubeSize.x/2, cubePosition.y + cubeSize.y/2, cubePosition.z + cubeSize.z/2 }});
+ }
+ else collision.hit = false;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginMode3D(camera);
+
+ if (collision.hit)
+ {
+ DrawCube(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, RED);
+ DrawCubeWires(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, MAROON);
+
+ DrawCubeWires(cubePosition, cubeSize.x + 0.2f, cubeSize.y + 0.2f, cubeSize.z + 0.2f, GREEN);
+ }
+ else
+ {
+ DrawCube(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, GRAY);
+ DrawCubeWires(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, DARKGRAY);
+ }
+
+ DrawRay(ray, MAROON);
+ DrawGrid(10, 1.0f);
+
+ EndMode3D();
+
+ DrawText("Try clicking on the box with your mouse!", 240, 10, 20, DARKGRAY);
+
+ if (collision.hit) DrawText("BOX SELECTED", (screenWidth - MeasureText("BOX SELECTED", 30)) / 2, (int)(screenHeight * 0.1f), 30, GREEN);
+
+ DrawText("Right click mouse to toggle camera controls", 10, 430, 10, GRAY);
+
+ DrawFPS(10, 10);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_3d_picking.png b/deps/raylib/examples/core/core_3d_picking.png
new file mode 100644
index 0000000..254f2f8
--- /dev/null
+++ b/deps/raylib/examples/core/core_3d_picking.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_automation_events.c b/deps/raylib/examples/core/core_automation_events.c
new file mode 100644
index 0000000..64ca51f
--- /dev/null
+++ b/deps/raylib/examples/core/core_automation_events.c
@@ -0,0 +1,336 @@
+/*******************************************************************************************
+*
+* raylib [core] example - automation events
+*
+* Example originally created with raylib 5.0, last time updated with raylib 5.0
+*
+* Example based on 2d_camera_platformer example by arvyy (@arvyy)
+*
+* 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) 2023 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include "raymath.h"
+
+#define GRAVITY 400
+#define PLAYER_JUMP_SPD 350.0f
+#define PLAYER_HOR_SPD 200.0f
+
+#define MAX_ENVIRONMENT_ELEMENTS 5
+
+typedef struct Player {
+ Vector2 position;
+ float speed;
+ bool canJump;
+} Player;
+
+typedef struct EnvElement {
+ Rectangle rect;
+ int blocking;
+ Color color;
+} EnvElement;
+
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - automation events");
+
+ // Define player
+ Player player = { 0 };
+ player.position = (Vector2){ 400, 280 };
+ player.speed = 0;
+ player.canJump = false;
+
+ // Define environment elements (platforms)
+ EnvElement envElements[MAX_ENVIRONMENT_ELEMENTS] = {
+ {{ 0, 0, 1000, 400 }, 0, LIGHTGRAY },
+ {{ 0, 400, 1000, 200 }, 1, GRAY },
+ {{ 300, 200, 400, 10 }, 1, GRAY },
+ {{ 250, 300, 100, 10 }, 1, GRAY },
+ {{ 650, 300, 100, 10 }, 1, GRAY }
+ };
+
+ // Define camera
+ Camera2D camera = { 0 };
+ camera.target = player.position;
+ camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
+ camera.rotation = 0.0f;
+ camera.zoom = 1.0f;
+
+ // Automation events
+ AutomationEventList aelist = LoadAutomationEventList(0); // Initialize list of automation events to record new events
+ SetAutomationEventList(&aelist);
+ bool eventRecording = false;
+ bool eventPlaying = false;
+
+ unsigned int frameCounter = 0;
+ unsigned int playFrameCounter = 0;
+ unsigned int currentPlayFrame = 0;
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose())
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ float deltaTime = 0.015f;//GetFrameTime();
+
+ // Dropped files logic
+ //----------------------------------------------------------------------------------
+ if (IsFileDropped())
+ {
+ FilePathList droppedFiles = LoadDroppedFiles();
+
+ // Supports loading .rgs style files (text or binary) and .png style palette images
+ if (IsFileExtension(droppedFiles.paths[0], ".txt;.rae"))
+ {
+ UnloadAutomationEventList(aelist);
+ aelist = LoadAutomationEventList(droppedFiles.paths[0]);
+
+ eventRecording = false;
+
+ // Reset scene state to play
+ eventPlaying = true;
+ playFrameCounter = 0;
+ currentPlayFrame = 0;
+
+ player.position = (Vector2){ 400, 280 };
+ player.speed = 0;
+ player.canJump = false;
+
+ camera.target = player.position;
+ camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
+ camera.rotation = 0.0f;
+ camera.zoom = 1.0f;
+ }
+
+ UnloadDroppedFiles(droppedFiles); // Unload filepaths from memory
+ }
+ //----------------------------------------------------------------------------------
+
+ // Update player
+ //----------------------------------------------------------------------------------
+ if (IsKeyDown(KEY_LEFT)) player.position.x -= PLAYER_HOR_SPD*deltaTime;
+ if (IsKeyDown(KEY_RIGHT)) player.position.x += PLAYER_HOR_SPD*deltaTime;
+ if (IsKeyDown(KEY_SPACE) && player.canJump)
+ {
+ player.speed = -PLAYER_JUMP_SPD;
+ player.canJump = false;
+ }
+
+ int hitObstacle = 0;
+ for (int i = 0; i < MAX_ENVIRONMENT_ELEMENTS; i++)
+ {
+ EnvElement *element = &envElements[i];
+ Vector2 *p = &(player.position);
+ if (element->blocking &&
+ element->rect.x <= p->x &&
+ element->rect.x + element->rect.width >= p->x &&
+ element->rect.y >= p->y &&
+ element->rect.y <= p->y + player.speed*deltaTime)
+ {
+ hitObstacle = 1;
+ player.speed = 0.0f;
+ p->y = element->rect.y;
+ }
+ }
+
+ if (!hitObstacle)
+ {
+ player.position.y += player.speed*deltaTime;
+ player.speed += GRAVITY*deltaTime;
+ player.canJump = false;
+ }
+ else player.canJump = true;
+
+ if (IsKeyPressed(KEY_R))
+ {
+ // Reset game state
+ player.position = (Vector2){ 400, 280 };
+ player.speed = 0;
+ player.canJump = false;
+
+ camera.target = player.position;
+ camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
+ camera.rotation = 0.0f;
+ camera.zoom = 1.0f;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Events playing
+ // NOTE: Logic must be before Camera update because it depends on mouse-wheel value,
+ // that can be set by the played event... but some other inputs could be affected
+ //----------------------------------------------------------------------------------
+ if (eventPlaying)
+ {
+ // NOTE: Multiple events could be executed in a single frame
+ while (playFrameCounter == aelist.events[currentPlayFrame].frame)
+ {
+ PlayAutomationEvent(aelist.events[currentPlayFrame]);
+ currentPlayFrame++;
+
+ if (currentPlayFrame == aelist.count)
+ {
+ eventPlaying = false;
+ currentPlayFrame = 0;
+ playFrameCounter = 0;
+
+ TraceLog(LOG_INFO, "FINISH PLAYING!");
+ break;
+ }
+ }
+
+ playFrameCounter++;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Update camera
+ //----------------------------------------------------------------------------------
+ camera.target = player.position;
+ camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
+ float minX = 1000, minY = 1000, maxX = -1000, maxY = -1000;
+
+ // WARNING: On event replay, mouse-wheel internal value is set
+ camera.zoom += ((float)GetMouseWheelMove()*0.05f);
+ if (camera.zoom > 3.0f) camera.zoom = 3.0f;
+ else if (camera.zoom < 0.25f) camera.zoom = 0.25f;
+
+ for (int i = 0; i < MAX_ENVIRONMENT_ELEMENTS; i++)
+ {
+ EnvElement *element = &envElements[i];
+ minX = fminf(element->rect.x, minX);
+ maxX = fmaxf(element->rect.x + element->rect.width, maxX);
+ minY = fminf(element->rect.y, minY);
+ maxY = fmaxf(element->rect.y + element->rect.height, maxY);
+ }
+
+ Vector2 max = GetWorldToScreen2D((Vector2){ maxX, maxY }, camera);
+ Vector2 min = GetWorldToScreen2D((Vector2){ minX, minY }, camera);
+
+ if (max.x < screenWidth) camera.offset.x = screenWidth - (max.x - screenWidth/2);
+ if (max.y < screenHeight) camera.offset.y = screenHeight - (max.y - screenHeight/2);
+ if (min.x > 0) camera.offset.x = screenWidth/2 - min.x;
+ if (min.y > 0) camera.offset.y = screenHeight/2 - min.y;
+ //----------------------------------------------------------------------------------
+
+ // Events management
+ if (IsKeyPressed(KEY_S)) // Toggle events recording
+ {
+ if (!eventPlaying)
+ {
+ if (eventRecording)
+ {
+ StopAutomationEventRecording();
+ eventRecording = false;
+
+ ExportAutomationEventList(aelist, "automation.rae");
+
+ TraceLog(LOG_INFO, "RECORDED FRAMES: %i", aelist.count);
+ }
+ else
+ {
+ SetAutomationEventBaseFrame(180);
+ StartAutomationEventRecording();
+ eventRecording = true;
+ }
+ }
+ }
+ else if (IsKeyPressed(KEY_A)) // Toggle events playing (WARNING: Starts next frame)
+ {
+ if (!eventRecording && (aelist.count > 0))
+ {
+ // Reset scene state to play
+ eventPlaying = true;
+ playFrameCounter = 0;
+ currentPlayFrame = 0;
+
+ player.position = (Vector2){ 400, 280 };
+ player.speed = 0;
+ player.canJump = false;
+
+ camera.target = player.position;
+ camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
+ camera.rotation = 0.0f;
+ camera.zoom = 1.0f;
+ }
+ }
+
+ if (eventRecording || eventPlaying) frameCounter++;
+ else frameCounter = 0;
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(LIGHTGRAY);
+
+ BeginMode2D(camera);
+
+ // Draw environment elements
+ for (int i = 0; i < MAX_ENVIRONMENT_ELEMENTS; i++)
+ {
+ DrawRectangleRec(envElements[i].rect, envElements[i].color);
+ }
+
+ // Draw player rectangle
+ DrawRectangleRec((Rectangle){ player.position.x - 20, player.position.y - 40, 40, 40 }, RED);
+
+ EndMode2D();
+
+ // Draw game controls
+ DrawRectangle(10, 10, 290, 145, Fade(SKYBLUE, 0.5f));
+ DrawRectangleLines(10, 10, 290, 145, Fade(BLUE, 0.8f));
+
+ DrawText("Controls:", 20, 20, 10, BLACK);
+ DrawText("- RIGHT | LEFT: Player movement", 30, 40, 10, DARKGRAY);
+ DrawText("- SPACE: Player jump", 30, 60, 10, DARKGRAY);
+ DrawText("- R: Reset game state", 30, 80, 10, DARKGRAY);
+
+ DrawText("- S: START/STOP RECORDING INPUT EVENTS", 30, 110, 10, BLACK);
+ DrawText("- A: REPLAY LAST RECORDED INPUT EVENTS", 30, 130, 10, BLACK);
+
+ // Draw automation events recording indicator
+ if (eventRecording)
+ {
+ DrawRectangle(10, 160, 290, 30, Fade(RED, 0.3f));
+ DrawRectangleLines(10, 160, 290, 30, Fade(MAROON, 0.8f));
+ DrawCircle(30, 175, 10, MAROON);
+
+ if (((frameCounter/15)%2) == 1) DrawText(TextFormat("RECORDING EVENTS... [%i]", aelist.count), 50, 170, 10, MAROON);
+ }
+ else if (eventPlaying)
+ {
+ DrawRectangle(10, 160, 290, 30, Fade(LIME, 0.3f));
+ DrawRectangleLines(10, 160, 290, 30, Fade(DARKGREEN, 0.8f));
+ DrawTriangle((Vector2){ 20, 155 + 10 }, (Vector2){ 20, 155 + 30 }, (Vector2){ 40, 155 + 20 }, DARKGREEN);
+
+ if (((frameCounter/15)%2) == 1) DrawText(TextFormat("PLAYING RECORDED EVENTS... [%i]", currentPlayFrame), 50, 170, 10, DARKGREEN);
+ }
+
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_automation_events.png b/deps/raylib/examples/core/core_automation_events.png
new file mode 100644
index 0000000..ac8cb3b
--- /dev/null
+++ b/deps/raylib/examples/core/core_automation_events.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_basic_screen_manager.c b/deps/raylib/examples/core/core_basic_screen_manager.c
new file mode 100644
index 0000000..728ef12
--- /dev/null
+++ b/deps/raylib/examples/core/core_basic_screen_manager.c
@@ -0,0 +1,152 @@
+/*******************************************************************************************
+*
+* raylib [core] examples - basic screen manager
+*
+* NOTE: This example illustrates a very simple screen manager based on a states machines
+*
+* Example originally created with raylib 4.0, last time updated with raylib 4.0
+*
+* 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) 2021-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------------
+// Types and Structures Definition
+//------------------------------------------------------------------------------------------
+typedef enum GameScreen { LOGO = 0, TITLE, GAMEPLAY, ENDING } GameScreen;
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - basic screen manager");
+
+ GameScreen currentScreen = LOGO;
+
+ // TODO: Initialize all required variables and load all required data here!
+
+ int framesCounter = 0; // Useful to count frames
+
+ SetTargetFPS(60); // Set desired framerate (frames-per-second)
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ switch(currentScreen)
+ {
+ case LOGO:
+ {
+ // TODO: Update LOGO screen variables here!
+
+ framesCounter++; // Count frames
+
+ // Wait for 2 seconds (120 frames) before jumping to TITLE screen
+ if (framesCounter > 120)
+ {
+ currentScreen = TITLE;
+ }
+ } break;
+ case TITLE:
+ {
+ // TODO: Update TITLE screen variables here!
+
+ // Press enter to change to GAMEPLAY screen
+ if (IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP))
+ {
+ currentScreen = GAMEPLAY;
+ }
+ } break;
+ case GAMEPLAY:
+ {
+ // TODO: Update GAMEPLAY screen variables here!
+
+ // Press enter to change to ENDING screen
+ if (IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP))
+ {
+ currentScreen = ENDING;
+ }
+ } break;
+ case ENDING:
+ {
+ // TODO: Update ENDING screen variables here!
+
+ // Press enter to return to TITLE screen
+ if (IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP))
+ {
+ currentScreen = TITLE;
+ }
+ } break;
+ default: break;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ switch(currentScreen)
+ {
+ case LOGO:
+ {
+ // TODO: Draw LOGO screen here!
+ DrawText("LOGO SCREEN", 20, 20, 40, LIGHTGRAY);
+ DrawText("WAIT for 2 SECONDS...", 290, 220, 20, GRAY);
+
+ } break;
+ case TITLE:
+ {
+ // TODO: Draw TITLE screen here!
+ DrawRectangle(0, 0, screenWidth, screenHeight, GREEN);
+ DrawText("TITLE SCREEN", 20, 20, 40, DARKGREEN);
+ DrawText("PRESS ENTER or TAP to JUMP to GAMEPLAY SCREEN", 120, 220, 20, DARKGREEN);
+
+ } break;
+ case GAMEPLAY:
+ {
+ // TODO: Draw GAMEPLAY screen here!
+ DrawRectangle(0, 0, screenWidth, screenHeight, PURPLE);
+ DrawText("GAMEPLAY SCREEN", 20, 20, 40, MAROON);
+ DrawText("PRESS ENTER or TAP to JUMP to ENDING SCREEN", 130, 220, 20, MAROON);
+
+ } break;
+ case ENDING:
+ {
+ // TODO: Draw ENDING screen here!
+ DrawRectangle(0, 0, screenWidth, screenHeight, BLUE);
+ DrawText("ENDING SCREEN", 20, 20, 40, DARKBLUE);
+ DrawText("PRESS ENTER or TAP to RETURN to TITLE SCREEN", 120, 220, 20, DARKBLUE);
+
+ } break;
+ default: break;
+ }
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+
+ // TODO: Unload all loaded data (textures, fonts, audio) here!
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_basic_screen_manager.png b/deps/raylib/examples/core/core_basic_screen_manager.png
new file mode 100644
index 0000000..532002b
--- /dev/null
+++ b/deps/raylib/examples/core/core_basic_screen_manager.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_basic_window.c b/deps/raylib/examples/core/core_basic_window.c
new file mode 100644
index 0000000..3cf2c7c
--- /dev/null
+++ b/deps/raylib/examples/core/core_basic_window.c
@@ -0,0 +1,70 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Basic window
+*
+* Welcome to raylib!
+*
+* To test examples, just press F6 and execute 'raylib_compile_execute' script
+* Note that compiled executable is placed in the same folder as .c file
+*
+* To test the examples on Web, press F6 and execute 'raylib_compile_execute_web' script
+* Web version of the program is generated in the same folder as .c file
+*
+* You can find all basic examples on C:\raylib\raylib\examples folder or
+* raylib official webpage: www.raylib.com
+*
+* Enjoy using raylib. :)
+*
+* Example originally created with raylib 1.0, last time updated with raylib 1.0
+*
+* 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) 2013-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - basic 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
+ //----------------------------------------------------------------------------------
+ // TODO: Update your variables here
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText("Congrats! You created your first window!", 190, 200, 20, LIGHTGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_basic_window.png b/deps/raylib/examples/core/core_basic_window.png
new file mode 100644
index 0000000..3461844
--- /dev/null
+++ b/deps/raylib/examples/core/core_basic_window.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_basic_window_web.c b/deps/raylib/examples/core/core_basic_window_web.c
new file mode 100644
index 0000000..8726908
--- /dev/null
+++ b/deps/raylib/examples/core/core_basic_window_web.c
@@ -0,0 +1,87 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Basic window (adapted for HTML5 platform)
+*
+* NOTE: This example is prepared to compile for PLATFORM_WEB, and PLATFORM_DESKTOP
+* As you will notice, code structure is slightly diferent to the other examples...
+* To compile it for PLATFORM_WEB just uncomment #define PLATFORM_WEB at beginning
+*
+* Example originally created with raylib 1.3, last time updated with raylib 1.3
+*
+* 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) 2015-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//#define PLATFORM_WEB
+
+#if defined(PLATFORM_WEB)
+ #include <emscripten/emscripten.h>
+#endif
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition
+//----------------------------------------------------------------------------------
+const int screenWidth = 800;
+const int screenHeight = 450;
+
+//----------------------------------------------------------------------------------
+// Module functions declaration
+//----------------------------------------------------------------------------------
+void UpdateDrawFrame(void); // Update and Draw one frame
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - basic window");
+
+#if defined(PLATFORM_WEB)
+ emscripten_set_main_loop(UpdateDrawFrame, 0, 1);
+#else
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ UpdateDrawFrame();
+ }
+#endif
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition
+//----------------------------------------------------------------------------------
+void UpdateDrawFrame(void)
+{
+ // Update
+ //----------------------------------------------------------------------------------
+ // TODO: Update your variables here
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText("Congrats! You created your first window!", 190, 200, 20, LIGHTGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_custom_frame_control.c b/deps/raylib/examples/core/core_custom_frame_control.c
new file mode 100644
index 0000000..9793fc3
--- /dev/null
+++ b/deps/raylib/examples/core/core_custom_frame_control.c
@@ -0,0 +1,130 @@
+/*******************************************************************************************
+*
+* raylib [core] example - custom frame control
+*
+* NOTE: WARNING: This is an example for advanced users willing to have full control over
+* the frame processes. By default, EndDrawing() calls the following processes:
+* 1. Draw remaining batch data: rlDrawRenderBatchActive()
+* 2. SwapScreenBuffer()
+* 3. Frame time control: WaitTime()
+* 4. PollInputEvents()
+*
+* To avoid steps 2, 3 and 4, flag SUPPORT_CUSTOM_FRAME_CONTROL can be enabled in
+* config.h (it requires recompiling raylib). This way those steps are up to the user.
+*
+* Note that enabling this flag invalidates some functions:
+* - GetFrameTime()
+* - SetTargetFPS()
+* - GetFPS()
+*
+* Example originally created with raylib 4.0, last time updated with raylib 4.0
+*
+* 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) 2021-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - custom frame control");
+
+ // Custom timming variables
+ double previousTime = GetTime(); // Previous time measure
+ double currentTime = 0.0; // Current time measure
+ double updateDrawTime = 0.0; // Update + Draw time
+ double waitTime = 0.0; // Wait time (if target fps required)
+ float deltaTime = 0.0f; // Frame time (Update + Draw + Wait time)
+
+ float timeCounter = 0.0f; // Accumulative time counter (seconds)
+ float position = 0.0f; // Circle position
+ bool pause = false; // Pause control flag
+
+ int targetFPS = 60; // Our initial target fps
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ PollInputEvents(); // Poll input events (SUPPORT_CUSTOM_FRAME_CONTROL)
+
+ if (IsKeyPressed(KEY_SPACE)) pause = !pause;
+
+ if (IsKeyPressed(KEY_UP)) targetFPS += 20;
+ else if (IsKeyPressed(KEY_DOWN)) targetFPS -= 20;
+
+ if (targetFPS < 0) targetFPS = 0;
+
+ if (!pause)
+ {
+ position += 200*deltaTime; // We move at 200 pixels per second
+ if (position >= GetScreenWidth()) position = 0;
+ timeCounter += deltaTime; // We count time (seconds)
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ for (int i = 0; i < GetScreenWidth()/200; i++) DrawRectangle(200*i, 0, 1, GetScreenHeight(), SKYBLUE);
+
+ DrawCircle((int)position, GetScreenHeight()/2 - 25, 50, RED);
+
+ DrawText(TextFormat("%03.0f ms", timeCounter*1000.0f), (int)position - 40, GetScreenHeight()/2 - 100, 20, MAROON);
+ DrawText(TextFormat("PosX: %03.0f", position), (int)position - 50, GetScreenHeight()/2 + 40, 20, BLACK);
+
+ DrawText("Circle is moving at a constant 200 pixels/sec,\nindependently of the frame rate.", 10, 10, 20, DARKGRAY);
+ DrawText("PRESS SPACE to PAUSE MOVEMENT", 10, GetScreenHeight() - 60, 20, GRAY);
+ DrawText("PRESS UP | DOWN to CHANGE TARGET FPS", 10, GetScreenHeight() - 30, 20, GRAY);
+ DrawText(TextFormat("TARGET FPS: %i", targetFPS), GetScreenWidth() - 220, 10, 20, LIME);
+ DrawText(TextFormat("CURRENT FPS: %i", (int)(1.0f/deltaTime)), GetScreenWidth() - 220, 40, 20, GREEN);
+
+ EndDrawing();
+
+ // NOTE: In case raylib is configured to SUPPORT_CUSTOM_FRAME_CONTROL,
+ // Events polling, screen buffer swap and frame time control must be managed by the user
+
+ SwapScreenBuffer(); // Flip the back buffer to screen (front buffer)
+
+ currentTime = GetTime();
+ updateDrawTime = currentTime - previousTime;
+
+ if (targetFPS > 0) // We want a fixed frame rate
+ {
+ waitTime = (1.0f/(float)targetFPS) - updateDrawTime;
+ if (waitTime > 0.0)
+ {
+ WaitTime((float)waitTime);
+ currentTime = GetTime();
+ deltaTime = (float)(currentTime - previousTime);
+ }
+ }
+ else deltaTime = (float)updateDrawTime; // Framerate could be variable
+
+ previousTime = currentTime;
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_custom_frame_control.png b/deps/raylib/examples/core/core_custom_frame_control.png
new file mode 100644
index 0000000..7d615ef
--- /dev/null
+++ b/deps/raylib/examples/core/core_custom_frame_control.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_custom_logging.c b/deps/raylib/examples/core/core_custom_logging.c
new file mode 100644
index 0000000..f886267
--- /dev/null
+++ b/deps/raylib/examples/core/core_custom_logging.c
@@ -0,0 +1,88 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Custom logging
+*
+* Example originally created with raylib 2.5, last time updated with raylib 2.5
+*
+* Example contributed by Pablo Marcos Oltra (@pamarcos) 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) 2018-2024 Pablo Marcos Oltra (@pamarcos) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include <stdio.h> // Required for: fopen(), fclose(), fputc(), fwrite(), printf(), fprintf(), funopen()
+#include <time.h> // Required for: time_t, tm, time(), localtime(), strftime()
+
+// Custom logging function
+void CustomLog(int msgType, const char *text, va_list args)
+{
+ char timeStr[64] = { 0 };
+ time_t now = time(NULL);
+ struct tm *tm_info = localtime(&now);
+
+ strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", tm_info);
+ printf("[%s] ", timeStr);
+
+ switch (msgType)
+ {
+ case LOG_INFO: printf("[INFO] : "); break;
+ case LOG_ERROR: printf("[ERROR]: "); break;
+ case LOG_WARNING: printf("[WARN] : "); break;
+ case LOG_DEBUG: printf("[DEBUG]: "); break;
+ default: break;
+ }
+
+ vprintf(text, args);
+ printf("\n");
+}
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ // Set custom logger
+ SetTraceLogCallback(CustomLog);
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - custom logging");
+
+ 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
+ //----------------------------------------------------------------------------------
+ // TODO: Update your variables here
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText("Check out the console output to see the custom logger in action!", 60, 200, 20, LIGHTGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_custom_logging.png b/deps/raylib/examples/core/core_custom_logging.png
new file mode 100644
index 0000000..478fef7
--- /dev/null
+++ b/deps/raylib/examples/core/core_custom_logging.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_drop_files.c b/deps/raylib/examples/core/core_drop_files.c
new file mode 100644
index 0000000..2e51d87
--- /dev/null
+++ b/deps/raylib/examples/core/core_drop_files.c
@@ -0,0 +1,106 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Windows drop files
+*
+* NOTE: This example only works on platforms that support drag & drop (Windows, Linux, OSX, Html5?)
+*
+* Example originally created with raylib 1.3, last time updated with raylib 4.2
+*
+* 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) 2015-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include <stdlib.h> // Required for: calloc(), free()
+
+#define MAX_FILEPATH_RECORDED 4096
+#define MAX_FILEPATH_SIZE 2048
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - drop files");
+
+ int filePathCounter = 0;
+ char *filePaths[MAX_FILEPATH_RECORDED] = { 0 }; // We will register a maximum of filepaths
+
+ // Allocate space for the required file paths
+ for (int i = 0; i < MAX_FILEPATH_RECORDED; i++)
+ {
+ filePaths[i] = (char *)RL_CALLOC(MAX_FILEPATH_SIZE, 1);
+ }
+
+ 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
+ //----------------------------------------------------------------------------------
+ if (IsFileDropped())
+ {
+ FilePathList droppedFiles = LoadDroppedFiles();
+
+ for (int i = 0, offset = filePathCounter; i < (int)droppedFiles.count; i++)
+ {
+ if (filePathCounter < (MAX_FILEPATH_RECORDED - 1))
+ {
+ TextCopy(filePaths[offset + i], droppedFiles.paths[i]);
+ filePathCounter++;
+ }
+ }
+
+ UnloadDroppedFiles(droppedFiles); // Unload filepaths from memory
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ if (filePathCounter == 0) DrawText("Drop your files to this window!", 100, 40, 20, DARKGRAY);
+ else
+ {
+ DrawText("Dropped files:", 100, 40, 20, DARKGRAY);
+
+ for (int i = 0; i < filePathCounter; i++)
+ {
+ if (i%2 == 0) DrawRectangle(0, 85 + 40*i, screenWidth, 40, Fade(LIGHTGRAY, 0.5f));
+ else DrawRectangle(0, 85 + 40*i, screenWidth, 40, Fade(LIGHTGRAY, 0.3f));
+
+ DrawText(filePaths[i], 120, 100 + 40*i, 10, GRAY);
+ }
+
+ DrawText("Drop new files...", 100, 110 + 40*filePathCounter, 20, DARKGRAY);
+ }
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ for (int i = 0; i < MAX_FILEPATH_RECORDED; i++)
+ {
+ RL_FREE(filePaths[i]); // Free allocated memory for all filepaths
+ }
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_drop_files.png b/deps/raylib/examples/core/core_drop_files.png
new file mode 100644
index 0000000..d46c44c
--- /dev/null
+++ b/deps/raylib/examples/core/core_drop_files.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_input_gamepad.c b/deps/raylib/examples/core/core_input_gamepad.c
new file mode 100644
index 0000000..f9310fd
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_gamepad.c
@@ -0,0 +1,287 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Gamepad input
+*
+* NOTE: This example requires a Gamepad connected to the system
+* raylib is configured to work with the following gamepads:
+* - Xbox 360 Controller (Xbox 360, Xbox One)
+* - PLAYSTATION(R)3 Controller
+* Check raylib.h for buttons configuration
+*
+* Example originally created with raylib 1.1, last time updated with raylib 4.2
+*
+* 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) 2013-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+// NOTE: Gamepad name ID depends on drivers and OS
+#define XBOX_ALIAS_1 "xbox"
+#define XBOX_ALIAS_2 "x-box"
+#define PS_ALIAS "playstation"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ SetConfigFlags(FLAG_MSAA_4X_HINT); // Set MSAA 4X hint before windows creation
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - gamepad input");
+
+ Texture2D texPs3Pad = LoadTexture("resources/ps3.png");
+ Texture2D texXboxPad = LoadTexture("resources/xbox.png");
+
+ // Set axis deadzones
+ const float leftStickDeadzoneX = 0.1f;
+ const float leftStickDeadzoneY = 0.1f;
+ const float rightStickDeadzoneX = 0.1f;
+ const float rightStickDeadzoneY = 0.1f;
+ const float leftTriggerDeadzone = -0.9f;
+ const float rightTriggerDeadzone = -0.9f;
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ int gamepad = 0; // which gamepad to display
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ // ...
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ if (IsKeyPressed(KEY_LEFT) && gamepad > 0) gamepad--;
+ if (IsKeyPressed(KEY_RIGHT)) gamepad++;
+
+ if (IsGamepadAvailable(gamepad))
+ {
+ DrawText(TextFormat("GP%d: %s", gamepad, GetGamepadName(gamepad)), 10, 10, 10, BLACK);
+
+ // Get axis values
+ float leftStickX = GetGamepadAxisMovement(gamepad, GAMEPAD_AXIS_LEFT_X);
+ float leftStickY = GetGamepadAxisMovement(gamepad, GAMEPAD_AXIS_LEFT_Y);
+ float rightStickX = GetGamepadAxisMovement(gamepad, GAMEPAD_AXIS_RIGHT_X);
+ float rightStickY = GetGamepadAxisMovement(gamepad, GAMEPAD_AXIS_RIGHT_Y);
+ float leftTrigger = GetGamepadAxisMovement(gamepad, GAMEPAD_AXIS_LEFT_TRIGGER);
+ float rightTrigger = GetGamepadAxisMovement(gamepad, GAMEPAD_AXIS_RIGHT_TRIGGER);
+
+ // Calculate deadzones
+ if (leftStickX > -leftStickDeadzoneX && leftStickX < leftStickDeadzoneX) leftStickX = 0.0f;
+ if (leftStickY > -leftStickDeadzoneY && leftStickY < leftStickDeadzoneY) leftStickY = 0.0f;
+ if (rightStickX > -rightStickDeadzoneX && rightStickX < rightStickDeadzoneX) rightStickX = 0.0f;
+ if (rightStickY > -rightStickDeadzoneY && rightStickY < rightStickDeadzoneY) rightStickY = 0.0f;
+ if (leftTrigger < leftTriggerDeadzone) leftTrigger = -1.0f;
+ if (rightTrigger < rightTriggerDeadzone) rightTrigger = -1.0f;
+
+ if (TextFindIndex(TextToLower(GetGamepadName(gamepad)), XBOX_ALIAS_1) > -1 || TextFindIndex(TextToLower(GetGamepadName(gamepad)), XBOX_ALIAS_2) > -1)
+ {
+ DrawTexture(texXboxPad, 0, 0, DARKGRAY);
+
+ // Draw buttons: xbox home
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_MIDDLE)) DrawCircle(394, 89, 19, RED);
+
+ // Draw buttons: basic
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_MIDDLE_RIGHT)) DrawCircle(436, 150, 9, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_MIDDLE_LEFT)) DrawCircle(352, 150, 9, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_LEFT)) DrawCircle(501, 151, 15, BLUE);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_DOWN)) DrawCircle(536, 187, 15, LIME);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_RIGHT)) DrawCircle(572, 151, 15, MAROON);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_UP)) DrawCircle(536, 115, 15, GOLD);
+
+ // Draw buttons: d-pad
+ DrawRectangle(317, 202, 19, 71, BLACK);
+ DrawRectangle(293, 228, 69, 19, BLACK);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_UP)) DrawRectangle(317, 202, 19, 26, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_DOWN)) DrawRectangle(317, 202 + 45, 19, 26, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_LEFT)) DrawRectangle(292, 228, 25, 19, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_RIGHT)) DrawRectangle(292 + 44, 228, 26, 19, RED);
+
+ // Draw buttons: left-right back
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_TRIGGER_1)) DrawCircle(259, 61, 20, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_TRIGGER_1)) DrawCircle(536, 61, 20, RED);
+
+ // Draw axis: left joystick
+ Color leftGamepadColor = BLACK;
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_THUMB)) leftGamepadColor = RED;
+ DrawCircle(259, 152, 39, BLACK);
+ DrawCircle(259, 152, 34, LIGHTGRAY);
+ DrawCircle(259 + (int)(leftStickX*20),
+ 152 + (int)(leftStickY*20), 25, leftGamepadColor);
+
+ // Draw axis: right joystick
+ Color rightGamepadColor = BLACK;
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_THUMB)) rightGamepadColor = RED;
+ DrawCircle(461, 237, 38, BLACK);
+ DrawCircle(461, 237, 33, LIGHTGRAY);
+ DrawCircle(461 + (int)(rightStickX*20),
+ 237 + (int)(rightStickY*20), 25, rightGamepadColor);
+
+ // Draw axis: left-right triggers
+ DrawRectangle(170, 30, 15, 70, GRAY);
+ DrawRectangle(604, 30, 15, 70, GRAY);
+ DrawRectangle(170, 30, 15, (int)(((1 + leftTrigger)/2)*70), RED);
+ DrawRectangle(604, 30, 15, (int)(((1 + rightTrigger)/2)*70), RED);
+
+ //DrawText(TextFormat("Xbox axis LT: %02.02f", GetGamepadAxisMovement(gamepad, GAMEPAD_AXIS_LEFT_TRIGGER)), 10, 40, 10, BLACK);
+ //DrawText(TextFormat("Xbox axis RT: %02.02f", GetGamepadAxisMovement(gamepad, GAMEPAD_AXIS_RIGHT_TRIGGER)), 10, 60, 10, BLACK);
+ }
+ else if (TextFindIndex(TextToLower(GetGamepadName(gamepad)), PS_ALIAS) > -1)
+ {
+ DrawTexture(texPs3Pad, 0, 0, DARKGRAY);
+
+ // Draw buttons: ps
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_MIDDLE)) DrawCircle(396, 222, 13, RED);
+
+ // Draw buttons: basic
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_MIDDLE_LEFT)) DrawRectangle(328, 170, 32, 13, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_MIDDLE_RIGHT)) DrawTriangle((Vector2){ 436, 168 }, (Vector2){ 436, 185 }, (Vector2){ 464, 177 }, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_UP)) DrawCircle(557, 144, 13, LIME);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_RIGHT)) DrawCircle(586, 173, 13, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_DOWN)) DrawCircle(557, 203, 13, VIOLET);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_LEFT)) DrawCircle(527, 173, 13, PINK);
+
+ // Draw buttons: d-pad
+ DrawRectangle(225, 132, 24, 84, BLACK);
+ DrawRectangle(195, 161, 84, 25, BLACK);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_UP)) DrawRectangle(225, 132, 24, 29, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_DOWN)) DrawRectangle(225, 132 + 54, 24, 30, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_LEFT)) DrawRectangle(195, 161, 30, 25, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_RIGHT)) DrawRectangle(195 + 54, 161, 30, 25, RED);
+
+ // Draw buttons: left-right back buttons
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_TRIGGER_1)) DrawCircle(239, 82, 20, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_TRIGGER_1)) DrawCircle(557, 82, 20, RED);
+
+ // Draw axis: left joystick
+ Color leftGamepadColor = BLACK;
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_THUMB)) leftGamepadColor = RED;
+ DrawCircle(319, 255, 35, BLACK);
+ DrawCircle(319, 255, 31, LIGHTGRAY);
+ DrawCircle(319 + (int)(leftStickX*20),
+ 255 + (int)(leftStickY*20), 25, leftGamepadColor);
+
+ // Draw axis: right joystick
+ Color rightGamepadColor = BLACK;
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_THUMB)) rightGamepadColor = RED;
+ DrawCircle(475, 255, 35, BLACK);
+ DrawCircle(475, 255, 31, LIGHTGRAY);
+ DrawCircle(475 + (int)(rightStickX*20),
+ 255 + (int)(rightStickY*20), 25, rightGamepadColor);
+
+ // Draw axis: left-right triggers
+ DrawRectangle(169, 48, 15, 70, GRAY);
+ DrawRectangle(611, 48, 15, 70, GRAY);
+ DrawRectangle(169, 48, 15, (int)(((1 + leftTrigger)/2)*70), RED);
+ DrawRectangle(611, 48, 15, (int)(((1 + rightTrigger)/2)*70), RED);
+ }
+ else
+ {
+
+ // Draw background: generic
+ DrawRectangleRounded((Rectangle){ 175, 110, 460, 220}, 0.3f, 16, DARKGRAY);
+
+ // Draw buttons: basic
+ DrawCircle(365, 170, 12, RAYWHITE);
+ DrawCircle(405, 170, 12, RAYWHITE);
+ DrawCircle(445, 170, 12, RAYWHITE);
+ DrawCircle(516, 191, 17, RAYWHITE);
+ DrawCircle(551, 227, 17, RAYWHITE);
+ DrawCircle(587, 191, 17, RAYWHITE);
+ DrawCircle(551, 155, 17, RAYWHITE);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_MIDDLE_LEFT)) DrawCircle(365, 170, 10, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_MIDDLE)) DrawCircle(405, 170, 10, GREEN);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_MIDDLE_RIGHT)) DrawCircle(445, 170, 10, BLUE);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_LEFT)) DrawCircle(516, 191, 15, GOLD);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_DOWN)) DrawCircle(551, 227, 15, BLUE);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_RIGHT)) DrawCircle(587, 191, 15, GREEN);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_FACE_UP)) DrawCircle(551, 155, 15, RED);
+
+ // Draw buttons: d-pad
+ DrawRectangle(245, 145, 28, 88, RAYWHITE);
+ DrawRectangle(215, 174, 88, 29, RAYWHITE);
+ DrawRectangle(247, 147, 24, 84, BLACK);
+ DrawRectangle(217, 176, 84, 25, BLACK);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_UP)) DrawRectangle(247, 147, 24, 29, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_DOWN)) DrawRectangle(247, 147 + 54, 24, 30, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_LEFT)) DrawRectangle(217, 176, 30, 25, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_FACE_RIGHT)) DrawRectangle(217 + 54, 176, 30, 25, RED);
+
+ // Draw buttons: left-right back
+ DrawRectangleRounded((Rectangle){ 215, 98, 100, 10}, 0.5f, 16, DARKGRAY);
+ DrawRectangleRounded((Rectangle){ 495, 98, 100, 10}, 0.5f, 16, DARKGRAY);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_TRIGGER_1)) DrawRectangleRounded((Rectangle){ 215, 98, 100, 10}, 0.5f, 16, RED);
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_TRIGGER_1)) DrawRectangleRounded((Rectangle){ 495, 98, 100, 10}, 0.5f, 16, RED);
+
+ // Draw axis: left joystick
+ Color leftGamepadColor = BLACK;
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_THUMB)) leftGamepadColor = RED;
+ DrawCircle(345, 260, 40, BLACK);
+ DrawCircle(345, 260, 35, LIGHTGRAY);
+ DrawCircle(345 + (int)(leftStickX*20),
+ 260 + (int)(leftStickY*20), 25, leftGamepadColor);
+
+ // Draw axis: right joystick
+ Color rightGamepadColor = BLACK;
+ if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_THUMB)) rightGamepadColor = RED;
+ DrawCircle(465, 260, 40, BLACK);
+ DrawCircle(465, 260, 35, LIGHTGRAY);
+ DrawCircle(465 + (int)(rightStickX*20),
+ 260 + (int)(rightStickY*20), 25, rightGamepadColor);
+
+ // Draw axis: left-right triggers
+ DrawRectangle(151, 110, 15, 70, GRAY);
+ DrawRectangle(644, 110, 15, 70, GRAY);
+ DrawRectangle(151, 110, 15, (int)(((1 + leftTrigger)/2)*70), RED);
+ DrawRectangle(644, 110, 15, (int)(((1 + rightTrigger)/2)*70), RED);
+
+ }
+
+ DrawText(TextFormat("DETECTED AXIS [%i]:", GetGamepadAxisCount(0)), 10, 50, 10, MAROON);
+
+ for (int i = 0; i < GetGamepadAxisCount(0); i++)
+ {
+ DrawText(TextFormat("AXIS %i: %.02f", i, GetGamepadAxisMovement(0, i)), 20, 70 + 20*i, 10, DARKGRAY);
+ }
+
+ if (GetGamepadButtonPressed() != GAMEPAD_BUTTON_UNKNOWN) DrawText(TextFormat("DETECTED BUTTON: %i", GetGamepadButtonPressed()), 10, 430, 10, RED);
+ else DrawText("DETECTED BUTTON: NONE", 10, 430, 10, GRAY);
+ }
+ else
+ {
+ DrawText(TextFormat("GP%d: NOT DETECTED", gamepad), 10, 10, 10, GRAY);
+
+ DrawTexture(texXboxPad, 0, 0, LIGHTGRAY);
+ }
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadTexture(texPs3Pad);
+ UnloadTexture(texXboxPad);
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_input_gamepad.png b/deps/raylib/examples/core/core_input_gamepad.png
new file mode 100644
index 0000000..5996eec
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_gamepad.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_input_gamepad_info.c b/deps/raylib/examples/core/core_input_gamepad_info.c
new file mode 100644
index 0000000..0962946
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_gamepad_info.c
@@ -0,0 +1,83 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Gamepad information
+*
+* NOTE: This example requires a Gamepad connected to the system
+* Check raylib.h for buttons configuration
+*
+* Example originally created with raylib 4.6, last time updated with raylib 4.6
+*
+* 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) 2013-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ SetConfigFlags(FLAG_MSAA_4X_HINT); // Set MSAA 4X hint before windows creation
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - gamepad information");
+
+ 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
+ //----------------------------------------------------------------------------------
+ // TODO: Update your variables here
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ for (int i = 0, y = 5; i < 4; i++) // MAX_GAMEPADS = 4
+ {
+ if (IsGamepadAvailable(i))
+ {
+ DrawText(TextFormat("Gamepad name: %s", GetGamepadName(i)), 10, y, 10, BLACK);
+ y += 11;
+ DrawText(TextFormat("\tAxis count: %d", GetGamepadAxisCount(i)), 10, y, 10, BLACK);
+ y += 11;
+
+ for (int axis = 0; axis < GetGamepadAxisCount(i); axis++)
+ {
+ DrawText(TextFormat("\tAxis %d = %f", axis, GetGamepadAxisMovement(i, axis)), 10, y, 10, BLACK);
+ y += 11;
+ }
+
+ for (int button = 0; button < 32; button++)
+ {
+ DrawText(TextFormat("\tButton %d = %d", button, IsGamepadButtonDown(i, button)), 10, y, 10, BLACK);
+ y += 11;
+ }
+ }
+ }
+
+ DrawFPS(GetScreenWidth() - 100, 100);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+}
diff --git a/deps/raylib/examples/core/core_input_gestures.c b/deps/raylib/examples/core/core_input_gestures.c
new file mode 100644
index 0000000..27ecef5
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_gestures.c
@@ -0,0 +1,119 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Input Gestures Detection
+*
+* Example originally created with raylib 1.4, last time updated with raylib 4.2
+*
+* 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) 2016-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#define MAX_GESTURE_STRINGS 20
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - input gestures");
+
+ Vector2 touchPosition = { 0, 0 };
+ Rectangle touchArea = { 220, 10, screenWidth - 230.0f, screenHeight - 20.0f };
+
+ int gesturesCount = 0;
+ char gestureStrings[MAX_GESTURE_STRINGS][32];
+
+ int currentGesture = GESTURE_NONE;
+ int lastGesture = GESTURE_NONE;
+
+ //SetGesturesEnabled(0b0000000000001001); // Enable only some gestures to be detected
+
+ 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
+ //----------------------------------------------------------------------------------
+ lastGesture = currentGesture;
+ currentGesture = GetGestureDetected();
+ touchPosition = GetTouchPosition(0);
+
+ if (CheckCollisionPointRec(touchPosition, touchArea) && (currentGesture != GESTURE_NONE))
+ {
+ if (currentGesture != lastGesture)
+ {
+ // Store gesture string
+ switch (currentGesture)
+ {
+ case GESTURE_TAP: TextCopy(gestureStrings[gesturesCount], "GESTURE TAP"); break;
+ case GESTURE_DOUBLETAP: TextCopy(gestureStrings[gesturesCount], "GESTURE DOUBLETAP"); break;
+ case GESTURE_HOLD: TextCopy(gestureStrings[gesturesCount], "GESTURE HOLD"); break;
+ case GESTURE_DRAG: TextCopy(gestureStrings[gesturesCount], "GESTURE DRAG"); break;
+ case GESTURE_SWIPE_RIGHT: TextCopy(gestureStrings[gesturesCount], "GESTURE SWIPE RIGHT"); break;
+ case GESTURE_SWIPE_LEFT: TextCopy(gestureStrings[gesturesCount], "GESTURE SWIPE LEFT"); break;
+ case GESTURE_SWIPE_UP: TextCopy(gestureStrings[gesturesCount], "GESTURE SWIPE UP"); break;
+ case GESTURE_SWIPE_DOWN: TextCopy(gestureStrings[gesturesCount], "GESTURE SWIPE DOWN"); break;
+ case GESTURE_PINCH_IN: TextCopy(gestureStrings[gesturesCount], "GESTURE PINCH IN"); break;
+ case GESTURE_PINCH_OUT: TextCopy(gestureStrings[gesturesCount], "GESTURE PINCH OUT"); break;
+ default: break;
+ }
+
+ gesturesCount++;
+
+ // Reset gestures strings
+ if (gesturesCount >= MAX_GESTURE_STRINGS)
+ {
+ for (int i = 0; i < MAX_GESTURE_STRINGS; i++) TextCopy(gestureStrings[i], "\0");
+
+ gesturesCount = 0;
+ }
+ }
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawRectangleRec(touchArea, GRAY);
+ DrawRectangle(225, 15, screenWidth - 240, screenHeight - 30, RAYWHITE);
+
+ DrawText("GESTURES TEST AREA", screenWidth - 270, screenHeight - 40, 20, Fade(GRAY, 0.5f));
+
+ for (int i = 0; i < gesturesCount; i++)
+ {
+ if (i%2 == 0) DrawRectangle(10, 30 + 20*i, 200, 20, Fade(LIGHTGRAY, 0.5f));
+ else DrawRectangle(10, 30 + 20*i, 200, 20, Fade(LIGHTGRAY, 0.3f));
+
+ if (i < gesturesCount - 1) DrawText(gestureStrings[i], 35, 36 + 20*i, 10, DARKGRAY);
+ else DrawText(gestureStrings[i], 35, 36 + 20*i, 10, MAROON);
+ }
+
+ DrawRectangleLines(10, 29, 200, screenHeight - 50, GRAY);
+ DrawText("DETECTED GESTURES", 50, 15, 10, GRAY);
+
+ if (currentGesture != GESTURE_NONE) DrawCircleV(touchPosition, 30, MAROON);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_input_gestures.png b/deps/raylib/examples/core/core_input_gestures.png
new file mode 100644
index 0000000..d2bbb5d
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_gestures.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_input_gestures_web.c b/deps/raylib/examples/core/core_input_gestures_web.c
new file mode 100644
index 0000000..e149224
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_gestures_web.c
@@ -0,0 +1,330 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Input Gestures for Web
+*
+* Example originally created with raylib 4.6-dev, last time updated with raylib 4.6-dev
+*
+* Example contributed by ubkp (@ubkp) 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) 2023 ubkp (@ubkp)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include "math.h" // Required for the protractor angle graphic drawing
+
+#if defined(PLATFORM_WEB)
+ #include <emscripten/emscripten.h> // Required for the Web/HTML5
+#endif
+
+//--------------------------------------------------------------------------------------
+// Global definitions and declarations
+//--------------------------------------------------------------------------------------
+
+// Common variables definitions
+//--------------------------------------------------------------------------------------
+int screenWidth = 800; // Update depending on web canvas
+const int screenHeight = 450;
+Vector2 messagePosition = { 160, 7 };
+
+// Last gesture variables definitions
+//--------------------------------------------------------------------------------------
+int lastGesture = 0;
+Vector2 lastGesturePosition = { 165, 130 };
+
+// Gesture log variables definitions and functions declarations
+//--------------------------------------------------------------------------------------
+#define GESTURE_LOG_SIZE 20
+char gestureLog[GESTURE_LOG_SIZE][12] = { "" }; // The gesture log uses an array (as an inverted circular queue) to store the performed gestures
+int gestureLogIndex = GESTURE_LOG_SIZE; // The index for the inverted circular queue (moving from last to first direction, then looping around)
+int previousGesture = 0;
+
+char const *GetGestureName(int i)
+{
+ switch (i) {
+ case 0: return "None"; break;
+ case 1: return "Tap"; break;
+ case 2: return "Double Tap"; break;
+ case 4: return "Hold"; break;
+ case 8: return "Drag"; break;
+ case 16: return "Swipe Right"; break;
+ case 32: return "Swipe Left"; break;
+ case 64: return "Swipe Up"; break;
+ case 128: return "Swipe Down"; break;
+ case 256: return "Pinch In"; break;
+ case 512: return "Pinch Out"; break;
+ default: return "Unknown"; break;
+ }
+}
+
+Color GetGestureColor(int i)
+{
+ switch (i) {
+ case 0: return BLACK; break;
+ case 1: return BLUE; break;
+ case 2: return SKYBLUE; break;
+ case 4: return BLACK; break;
+ case 8: return LIME; break;
+ case 16: return RED; break;
+ case 32: return RED; break;
+ case 64: return RED; break;
+ case 128: return RED; break;
+ case 256: return VIOLET; break;
+ case 512: return ORANGE; break;
+ default: return BLACK; break;
+ }
+}
+
+int logMode = 1; // Log mode values: 0 shows repeated events; 1 hides repeated events; 2 shows repeated events but hide hold events; 3 hides repeated events and hide hold events
+
+Color gestureColor = { 0, 0, 0, 255 };
+Rectangle logButton1 = { 53, 7, 48, 26 };
+Rectangle logButton2 = { 108, 7, 36, 26 };
+Vector2 gestureLogPosition = { 10, 10 };
+
+// Protractor variables definitions
+//--------------------------------------------------------------------------------------
+float angleLength = 90.0f;
+float currentAngleDegrees = 0.0f;
+Vector2 finalVector = { 0.0f, 0.0f };
+char currentAngleStr[7] = "";
+Vector2 protractorPosition = { 266.0f, 315.0f };
+
+// Update
+//--------------------------------------------------------------------------------------
+void Update(void)
+{
+ // Handle common
+ //--------------------------------------------------------------------------------------
+ int i, ii; // Iterators that will be reused by all for loops
+ const int currentGesture = GetGestureDetected();
+ const float currentDragDegrees = GetGestureDragAngle();
+ const float currentPitchDegrees = GetGesturePinchAngle();
+ const int touchCount = GetTouchPointCount();
+
+ // Handle last gesture
+ //--------------------------------------------------------------------------------------
+ if ((currentGesture != 0) && (currentGesture != 4) && (currentGesture != previousGesture)) lastGesture = currentGesture; // Filter the meaningful gestures (1, 2, 8 to 512) for the display
+
+ // Handle gesture log
+ //--------------------------------------------------------------------------------------
+ if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT))
+ {
+ if (CheckCollisionPointRec(GetMousePosition(), logButton1))
+ {
+ switch (logMode)
+ {
+ case 3: logMode=2; break;
+ case 2: logMode=3; break;
+ case 1: logMode=0; break;
+ default: logMode=1; break;
+ }
+ }
+ else if (CheckCollisionPointRec(GetMousePosition(), logButton2))
+ {
+ switch (logMode)
+ {
+ case 3: logMode=1; break;
+ case 2: logMode=0; break;
+ case 1: logMode=3; break;
+ default: logMode=2; break;
+ }
+ }
+ }
+
+ int fillLog = 0; // Gate variable to be used to allow or not the gesture log to be filled
+ if (currentGesture !=0)
+ {
+ if (logMode == 3) // 3 hides repeated events and hide hold events
+ {
+ if (((currentGesture != 4) && (currentGesture != previousGesture)) || (currentGesture < 3)) fillLog = 1;
+ }
+ else if (logMode == 2) // 2 shows repeated events but hide hold events
+ {
+ if (currentGesture != 4) fillLog = 1;
+ }
+ else if (logMode == 1) // 1 hides repeated events
+ {
+ if (currentGesture != previousGesture) fillLog = 1;
+ }
+ else // 0 shows repeated events
+ {
+ fillLog = 1;
+ }
+ }
+
+ if (fillLog) // If one of the conditions from logMode was met, fill the gesture log
+ {
+ previousGesture = currentGesture;
+ gestureColor = GetGestureColor(currentGesture);
+ if (gestureLogIndex <= 0) gestureLogIndex = GESTURE_LOG_SIZE;
+ gestureLogIndex--;
+
+ // Copy the gesture respective name to the gesture log array
+ TextCopy(gestureLog[gestureLogIndex], GetGestureName(currentGesture));
+ }
+
+ // Handle protractor
+ //--------------------------------------------------------------------------------------
+ if (currentGesture > 255) // aka Pinch In and Pinch Out
+ {
+ currentAngleDegrees = currentPitchDegrees;
+ }
+ else if (currentGesture > 15) // aka Swipe Right, Swipe Left, Swipe Up and Swipe Down
+ {
+ currentAngleDegrees = currentDragDegrees;
+ }
+ else if (currentGesture > 0) // aka Tap, Doubletap, Hold and Grab
+ {
+ currentAngleDegrees = 0.0f;
+ }
+
+ float currentAngleRadians = ((currentAngleDegrees +90.0f)*PI/180); // Convert the current angle to Radians
+ finalVector = (Vector2){ (angleLength*sinf(currentAngleRadians)) + protractorPosition.x, (angleLength*cosf(currentAngleRadians)) + protractorPosition.y }; // Calculate the final vector for display
+
+ // Handle touch and mouse pointer points
+ //--------------------------------------------------------------------------------------
+ #define MAX_TOUCH_COUNT 32
+
+ Vector2 touchPosition[MAX_TOUCH_COUNT] = { 0 };
+ Vector2 mousePosition = {0, 0};
+ if (currentGesture != GESTURE_NONE)
+ {
+ if (touchCount != 0)
+ {
+ for (i = 0; i < touchCount; i++) touchPosition[i] = GetTouchPosition(i); // Fill the touch positions
+ }
+ else mousePosition = GetMousePosition();
+ }
+
+ // Draw
+ //--------------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ // Draw common
+ //--------------------------------------------------------------------------------------
+ DrawText("*", messagePosition.x + 5, messagePosition.y + 5, 10, BLACK);
+ DrawText("Example optimized for Web/HTML5\non Smartphones with Touch Screen.", messagePosition.x + 15, messagePosition.y + 5, 10, BLACK);
+ DrawText("*", messagePosition.x + 5, messagePosition.y + 35, 10, BLACK);
+ DrawText("While running on Desktop Web Browsers,\ninspect and turn on Touch Emulation.", messagePosition.x + 15, messagePosition.y + 35, 10, BLACK);
+
+ // Draw last gesture
+ //--------------------------------------------------------------------------------------
+ DrawText("Last gesture", lastGesturePosition.x + 33, lastGesturePosition.y - 47, 20, BLACK);
+ DrawText("Swipe Tap Pinch Touch", lastGesturePosition.x + 17, lastGesturePosition.y - 18, 10, BLACK);
+ DrawRectangle(lastGesturePosition.x + 20, lastGesturePosition.y, 20, 20, lastGesture == GESTURE_SWIPE_UP ? RED : LIGHTGRAY);
+ DrawRectangle(lastGesturePosition.x, lastGesturePosition.y + 20, 20, 20, lastGesture == GESTURE_SWIPE_LEFT ? RED : LIGHTGRAY);
+ DrawRectangle(lastGesturePosition.x + 40, lastGesturePosition.y + 20, 20, 20, lastGesture == GESTURE_SWIPE_RIGHT ? RED : LIGHTGRAY);
+ DrawRectangle(lastGesturePosition.x + 20, lastGesturePosition.y + 40, 20, 20, lastGesture == GESTURE_SWIPE_DOWN ? RED : LIGHTGRAY);
+ DrawCircle(lastGesturePosition.x + 80, lastGesturePosition.y + 16, 10, lastGesture == GESTURE_TAP ? BLUE : LIGHTGRAY);
+ DrawRing( (Vector2){lastGesturePosition.x + 103, lastGesturePosition.y + 16}, 6.0f, 11.0f, 0.0f, 360.0f, 0, lastGesture == GESTURE_DRAG ? LIME : LIGHTGRAY);
+ DrawCircle(lastGesturePosition.x + 80, lastGesturePosition.y + 43, 10, lastGesture == GESTURE_DOUBLETAP ? SKYBLUE : LIGHTGRAY);
+ DrawCircle(lastGesturePosition.x + 103, lastGesturePosition.y + 43, 10, lastGesture == GESTURE_DOUBLETAP ? SKYBLUE : LIGHTGRAY);
+ DrawTriangle((Vector2){ lastGesturePosition.x + 122, lastGesturePosition.y + 16 }, (Vector2){ lastGesturePosition.x + 137, lastGesturePosition.y + 26 }, (Vector2){ lastGesturePosition.x + 137, lastGesturePosition.y + 6 }, lastGesture == GESTURE_PINCH_OUT? ORANGE : LIGHTGRAY);
+ DrawTriangle((Vector2){ lastGesturePosition.x + 147, lastGesturePosition.y + 6 }, (Vector2){ lastGesturePosition.x + 147, lastGesturePosition.y + 26 }, (Vector2){ lastGesturePosition.x + 162, lastGesturePosition.y + 16 }, lastGesture == GESTURE_PINCH_OUT? ORANGE : LIGHTGRAY);
+ DrawTriangle((Vector2){ lastGesturePosition.x + 125, lastGesturePosition.y + 33 }, (Vector2){ lastGesturePosition.x + 125, lastGesturePosition.y + 53 }, (Vector2){ lastGesturePosition.x + 140, lastGesturePosition.y + 43 }, lastGesture == GESTURE_PINCH_IN? VIOLET : LIGHTGRAY);
+ DrawTriangle((Vector2){ lastGesturePosition.x + 144, lastGesturePosition.y + 43 }, (Vector2){ lastGesturePosition.x + 159, lastGesturePosition.y + 53 }, (Vector2){ lastGesturePosition.x + 159, lastGesturePosition.y + 33 }, lastGesture == GESTURE_PINCH_IN? VIOLET : LIGHTGRAY);
+ for (i = 0; i < 4; i++) DrawCircle(lastGesturePosition.x + 180, lastGesturePosition.y + 7 + i*15, 5, touchCount <= i? LIGHTGRAY : gestureColor);
+
+ // Draw gesture log
+ //--------------------------------------------------------------------------------------
+ DrawText("Log", gestureLogPosition.x, gestureLogPosition.y, 20, BLACK);
+
+ // Loop in both directions to print the gesture log array in the inverted order (and looping around if the index started somewhere in the middle)
+ for (i = 0, ii = gestureLogIndex; i < GESTURE_LOG_SIZE; i++, ii = (ii + 1) % GESTURE_LOG_SIZE) DrawText(gestureLog[ii], gestureLogPosition.x, gestureLogPosition.y + 410 - i*20, 20, (i == 0 ? gestureColor : LIGHTGRAY));
+ Color logButton1Color, logButton2Color;
+ switch (logMode)
+ {
+ case 3: logButton1Color=MAROON; logButton2Color=MAROON; break;
+ case 2: logButton1Color=GRAY; logButton2Color=MAROON; break;
+ case 1: logButton1Color=MAROON; logButton2Color=GRAY; break;
+ default: logButton1Color=GRAY; logButton2Color=GRAY; break;
+ }
+ DrawRectangleRec(logButton1, logButton1Color);
+ DrawText("Hide", logButton1.x + 7, logButton1.y + 3, 10, WHITE);
+ DrawText("Repeat", logButton1.x + 7, logButton1.y + 13, 10, WHITE);
+ DrawRectangleRec(logButton2, logButton2Color);
+ DrawText("Hide", logButton1.x + 62, logButton1.y + 3, 10, WHITE);
+ DrawText("Hold", logButton1.x + 62, logButton1.y + 13, 10, WHITE);
+
+ // Draw protractor
+ //--------------------------------------------------------------------------------------
+ DrawText("Angle", protractorPosition.x + 55, protractorPosition.y + 76, 10, BLACK);
+ const char *angleString = TextFormat("%f", currentAngleDegrees);
+ const int angleStringDot = TextFindIndex(angleString, ".");
+ const char *angleStringTrim = TextSubtext(angleString, 0, angleStringDot + 3);
+ DrawText( angleStringTrim, protractorPosition.x + 55, protractorPosition.y + 92, 20, gestureColor);
+ DrawCircle(protractorPosition.x, protractorPosition.y, 80.0f, WHITE);
+ DrawLineEx((Vector2){ protractorPosition.x - 90, protractorPosition.y }, (Vector2){ protractorPosition.x + 90, protractorPosition.y }, 3.0f, LIGHTGRAY);
+ DrawLineEx((Vector2){ protractorPosition.x, protractorPosition.y - 90 }, (Vector2){ protractorPosition.x, protractorPosition.y + 90 }, 3.0f, LIGHTGRAY);
+ DrawLineEx((Vector2){ protractorPosition.x - 80, protractorPosition.y - 45 }, (Vector2){ protractorPosition.x + 80, protractorPosition.y + 45 }, 3.0f, GREEN);
+ DrawLineEx((Vector2){ protractorPosition.x - 80, protractorPosition.y + 45 }, (Vector2){ protractorPosition.x + 80, protractorPosition.y - 45 }, 3.0f, GREEN);
+ DrawText("0", protractorPosition.x + 96, protractorPosition.y - 9, 20, BLACK);
+ DrawText("30", protractorPosition.x + 74, protractorPosition.y - 68, 20, BLACK);
+ DrawText("90", protractorPosition.x - 11, protractorPosition.y - 110, 20, BLACK);
+ DrawText("150", protractorPosition.x - 100, protractorPosition.y - 68, 20, BLACK);
+ DrawText("180", protractorPosition.x - 124, protractorPosition.y - 9, 20, BLACK);
+ DrawText("210", protractorPosition.x - 100, protractorPosition.y + 50, 20, BLACK);
+ DrawText("270", protractorPosition.x - 18, protractorPosition.y + 92, 20, BLACK);
+ DrawText("330", protractorPosition.x + 72, protractorPosition.y + 50, 20, BLACK);
+ if (currentAngleDegrees != 0.0f) DrawLineEx(protractorPosition, finalVector, 3.0f, gestureColor);
+
+ // Draw touch and mouse pointer points
+ //--------------------------------------------------------------------------------------
+ if (currentGesture != GESTURE_NONE)
+ {
+ if ( touchCount != 0 )
+ {
+ for (i = 0; i < touchCount; i++)
+ {
+ DrawCircleV(touchPosition[i], 50.0f, Fade(gestureColor, 0.5f));
+ DrawCircleV(touchPosition[i], 5.0f, gestureColor);
+ }
+
+ if (touchCount == 2) DrawLineEx(touchPosition[0], touchPosition[1], ((currentGesture == 512)? 8 : 12), gestureColor);
+ }
+ else
+ {
+ DrawCircleV(mousePosition, 35.0f, Fade(gestureColor, 0.5f));
+ DrawCircleV(mousePosition, 5.0f, gestureColor);
+ }
+ }
+
+ EndDrawing();
+ //--------------------------------------------------------------------------------------
+
+}
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - input gestures web");
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ //--------------------------------------------------------------------------------------
+ #if defined(PLATFORM_WEB)
+ emscripten_set_main_loop(Update, 0, 1);
+ #else
+ SetTargetFPS(60);
+ while (!WindowShouldClose()) Update(); // Detect window close button or ESC key
+ #endif
+ //--------------------------------------------------------------------------------------
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_input_gestures_web.png b/deps/raylib/examples/core/core_input_gestures_web.png
new file mode 100644
index 0000000..dd604e8
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_gestures_web.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_input_keys.c b/deps/raylib/examples/core/core_input_keys.c
new file mode 100644
index 0000000..8e74b93
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_keys.c
@@ -0,0 +1,64 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Keyboard input
+*
+* Example originally created with raylib 1.0, last time updated with raylib 1.0
+*
+* 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) 2014-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - keyboard input");
+
+ Vector2 ballPosition = { (float)screenWidth/2, (float)screenHeight/2 };
+
+ 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
+ //----------------------------------------------------------------------------------
+ if (IsKeyDown(KEY_RIGHT)) ballPosition.x += 2.0f;
+ if (IsKeyDown(KEY_LEFT)) ballPosition.x -= 2.0f;
+ if (IsKeyDown(KEY_UP)) ballPosition.y -= 2.0f;
+ if (IsKeyDown(KEY_DOWN)) ballPosition.y += 2.0f;
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText("move the ball with arrow keys", 10, 10, 20, DARKGRAY);
+
+ DrawCircleV(ballPosition, 50, MAROON);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_input_keys.png b/deps/raylib/examples/core/core_input_keys.png
new file mode 100644
index 0000000..4837032
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_keys.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_input_mouse.c b/deps/raylib/examples/core/core_input_mouse.c
new file mode 100644
index 0000000..e6a3e15
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_mouse.c
@@ -0,0 +1,70 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Mouse input
+*
+* Example originally created with raylib 1.0, last time updated with raylib 4.0
+*
+* 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) 2014-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - mouse input");
+
+ Vector2 ballPosition = { -100.0f, -100.0f };
+ Color ballColor = DARKBLUE;
+
+ 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
+ //----------------------------------------------------------------------------------
+ ballPosition = GetMousePosition();
+
+ if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) ballColor = MAROON;
+ else if (IsMouseButtonPressed(MOUSE_BUTTON_MIDDLE)) ballColor = LIME;
+ else if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT)) ballColor = DARKBLUE;
+ else if (IsMouseButtonPressed(MOUSE_BUTTON_SIDE)) ballColor = PURPLE;
+ else if (IsMouseButtonPressed(MOUSE_BUTTON_EXTRA)) ballColor = YELLOW;
+ else if (IsMouseButtonPressed(MOUSE_BUTTON_FORWARD)) ballColor = ORANGE;
+ else if (IsMouseButtonPressed(MOUSE_BUTTON_BACK)) ballColor = BEIGE;
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawCircleV(ballPosition, 40, ballColor);
+
+ DrawText("move ball with mouse and click mouse button to change color", 10, 10, 20, DARKGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_input_mouse.png b/deps/raylib/examples/core/core_input_mouse.png
new file mode 100644
index 0000000..a96e7fa
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_mouse.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_input_mouse_wheel.c b/deps/raylib/examples/core/core_input_mouse_wheel.c
new file mode 100644
index 0000000..d261e93
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_mouse_wheel.c
@@ -0,0 +1,63 @@
+/*******************************************************************************************
+*
+* raylib [core] examples - Mouse wheel input
+*
+* Example originally created with raylib 1.1, last time updated with raylib 1.3
+*
+* 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) 2014-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - input mouse wheel");
+
+ int boxPositionY = screenHeight/2 - 40;
+ int scrollSpeed = 4; // Scrolling speed in pixels
+
+ 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
+ //----------------------------------------------------------------------------------
+ boxPositionY -= (int)(GetMouseWheelMove()*scrollSpeed);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawRectangle(screenWidth/2 - 40, boxPositionY, 80, 80, MAROON);
+
+ DrawText("Use mouse wheel to move the cube up and down!", 10, 10, 20, GRAY);
+ DrawText(TextFormat("Box position Y: %03i", boxPositionY), 10, 40, 20, LIGHTGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_input_mouse_wheel.png b/deps/raylib/examples/core/core_input_mouse_wheel.png
new file mode 100644
index 0000000..26a1f24
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_mouse_wheel.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_input_multitouch.c b/deps/raylib/examples/core/core_input_multitouch.c
new file mode 100644
index 0000000..73b3635
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_multitouch.c
@@ -0,0 +1,79 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Input multitouch
+*
+* Example originally created with raylib 2.1, last time updated with raylib 2.5
+*
+* Example contributed by Berni (@Berni8k) 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) 2019-2024 Berni (@Berni8k) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#define MAX_TOUCH_POINTS 10
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - input multitouch");
+
+ Vector2 touchPositions[MAX_TOUCH_POINTS] = { 0 };
+
+ 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
+ //----------------------------------------------------------------------------------
+ // Get the touch point count ( how many fingers are touching the screen )
+ int tCount = GetTouchPointCount();
+ // Clamp touch points available ( set the maximum touch points allowed )
+ if(tCount > MAX_TOUCH_POINTS) tCount = MAX_TOUCH_POINTS;
+ // Get touch points positions
+ for (int i = 0; i < tCount; ++i) touchPositions[i] = GetTouchPosition(i);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ for (int i = 0; i < tCount; ++i)
+ {
+ // Make sure point is not (0, 0) as this means there is no touch for it
+ if ((touchPositions[i].x > 0) && (touchPositions[i].y > 0))
+ {
+ // Draw circle and touch index number
+ DrawCircleV(touchPositions[i], 34, ORANGE);
+ DrawText(TextFormat("%d", i), (int)touchPositions[i].x - 10, (int)touchPositions[i].y - 70, 40, BLACK);
+ }
+ }
+
+ DrawText("touch the screen at multiple locations to get multiple balls", 10, 10, 20, DARKGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_input_multitouch.png b/deps/raylib/examples/core/core_input_multitouch.png
new file mode 100644
index 0000000..74284f8
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_multitouch.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_input_virtual_controls.c b/deps/raylib/examples/core/core_input_virtual_controls.c
new file mode 100644
index 0000000..bbbad20
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_virtual_controls.c
@@ -0,0 +1,123 @@
+/*******************************************************************************************
+*
+* raylib [core] example - input virtual controls
+*
+* Example originally created with raylib 5.0, last time updated with raylib 5.0
+*
+* Example create by GreenSnakeLinux (@GreenSnakeLinux),
+* lighter by oblerion (@oblerion) and
+* reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include <math.h>
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - input virtual controls");
+
+ const float dpadX = 90;
+ const float dpadY = 300;
+ const float dpadRad = 25.0f;//radius of each pad
+ Color dpadColor = BLUE;
+ int dpadKeydown = -1;//-1 if not down, else 0,1,2,3
+
+
+ const float dpadCollider[4][2]= // collider array with x,y position
+ {
+ {dpadX,dpadY-dpadRad*1.5f},//up
+ {dpadX-dpadRad*1.5f,dpadY},//left
+ {dpadX+dpadRad*1.5f,dpadY},//right
+ {dpadX,dpadY+dpadRad*1.5f}//down
+ };
+ const char dpadLabel[4]="XYBA";//label of Dpad
+
+ float playerX=100;
+ float playerY=100;
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //--------------------------------------------------------------------------
+ dpadKeydown = -1; //reset
+ int inputX = 0;
+ int inputY = 0;
+ if(GetTouchPointCount()>0)
+ {//use touch pos
+ inputX = GetTouchX();
+ inputY = GetTouchY();
+ }
+ else
+ {//use mouse pos
+ inputX = GetMouseX();
+ inputY = GetMouseY();
+ }
+ for(int i=0;i<4;i++)
+ {
+ //test distance each collider and input < radius
+ if( fabsf(dpadCollider[i][1]-inputY) + fabsf(dpadCollider[i][0]-inputX) < dpadRad)
+ {
+ dpadKeydown = i;
+ break;
+ }
+ }
+ // move player
+ switch(dpadKeydown){
+ case 0: playerY -= 50*GetFrameTime();
+ break;
+ case 1: playerX -= 50*GetFrameTime();
+ break;
+ case 2: playerX += 50*GetFrameTime();
+ break;
+ case 3: playerY += 50*GetFrameTime();
+ default:;
+ };
+ //--------------------------------------------------------------------------
+ // Draw
+ //--------------------------------------------------------------------------
+ BeginDrawing();
+ ClearBackground(RAYWHITE);
+ for(int i=0;i<4;i++)
+ {
+ //draw all pad
+ DrawCircleV((Vector2) { dpadCollider[i][0], dpadCollider[i][1] }, dpadRad, dpadColor);
+ if(i!=dpadKeydown)
+ {
+ //draw label
+ DrawText(TextSubtext(dpadLabel,i,1),
+ (int)dpadCollider[i][0]-7,
+ (int)dpadCollider[i][1]-8,20,BLACK);
+ }
+ }
+
+ DrawRectangleRec((Rectangle) { playerX - 4, playerY - 4, 75, 28 }, RED);
+ DrawText("Player", (int)playerX, (int)playerY, 20, WHITE);
+ EndDrawing();
+ //--------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
diff --git a/deps/raylib/examples/core/core_input_virtual_controls.png b/deps/raylib/examples/core/core_input_virtual_controls.png
new file mode 100644
index 0000000..cb14445
--- /dev/null
+++ b/deps/raylib/examples/core/core_input_virtual_controls.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_loading_thread.c b/deps/raylib/examples/core/core_loading_thread.c
new file mode 100644
index 0000000..8e09c99
--- /dev/null
+++ b/deps/raylib/examples/core/core_loading_thread.c
@@ -0,0 +1,156 @@
+/*******************************************************************************************
+*
+* raylib [core] example - loading thread
+*
+* NOTE: This example requires linking with pthreads library on MinGW,
+* it can be accomplished passing -static parameter to compiler
+*
+* Example originally created with raylib 2.5, last time updated with raylib 3.0
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+*
+* Copyright (c) 2014-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+// WARNING: This example does not build on Windows with MSVC compiler
+#include "pthread.h" // POSIX style threads management
+
+#include <stdatomic.h> // C11 atomic data types
+
+#include <time.h> // Required for: clock()
+
+// Using C11 atomics for synchronization
+// NOTE: A plain bool (or any plain data type for that matter) can't be used for inter-thread synchronization
+static atomic_bool dataLoaded = false; // Data Loaded completion indicator
+static void *LoadDataThread(void *arg); // Loading data thread function declaration
+
+static atomic_int dataProgress = 0; // Data progress accumulator
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - loading thread");
+
+ pthread_t threadId = { 0 }; // Loading data thread id
+
+ enum { STATE_WAITING, STATE_LOADING, STATE_FINISHED } state = STATE_WAITING;
+ int framesCounter = 0;
+
+ 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
+ //----------------------------------------------------------------------------------
+ switch (state)
+ {
+ case STATE_WAITING:
+ {
+ if (IsKeyPressed(KEY_ENTER))
+ {
+ int error = pthread_create(&threadId, NULL, &LoadDataThread, NULL);
+ if (error != 0) TraceLog(LOG_ERROR, "Error creating loading thread");
+ else TraceLog(LOG_INFO, "Loading thread initialized successfully");
+
+ state = STATE_LOADING;
+ }
+ } break;
+ case STATE_LOADING:
+ {
+ framesCounter++;
+ if (atomic_load_explicit(&dataLoaded, memory_order_relaxed))
+ {
+ framesCounter = 0;
+ int error = pthread_join(threadId, NULL);
+ if (error != 0) TraceLog(LOG_ERROR, "Error joining loading thread");
+ else TraceLog(LOG_INFO, "Loading thread terminated successfully");
+
+ state = STATE_FINISHED;
+ }
+ } break;
+ case STATE_FINISHED:
+ {
+ if (IsKeyPressed(KEY_ENTER))
+ {
+ // Reset everything to launch again
+ atomic_store_explicit(&dataLoaded, false, memory_order_relaxed);
+ atomic_store_explicit(&dataProgress, 0, memory_order_relaxed);
+ state = STATE_WAITING;
+ }
+ } break;
+ default: break;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ switch (state)
+ {
+ case STATE_WAITING: DrawText("PRESS ENTER to START LOADING DATA", 150, 170, 20, DARKGRAY); break;
+ case STATE_LOADING:
+ {
+ DrawRectangle(150, 200, atomic_load_explicit(&dataProgress, memory_order_relaxed), 60, SKYBLUE);
+ if ((framesCounter/15)%2) DrawText("LOADING DATA...", 240, 210, 40, DARKBLUE);
+
+ } break;
+ case STATE_FINISHED:
+ {
+ DrawRectangle(150, 200, 500, 60, LIME);
+ DrawText("DATA LOADED!", 250, 210, 40, GREEN);
+
+ } break;
+ default: break;
+ }
+
+ DrawRectangleLines(150, 200, 500, 60, DARKGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+// Loading data thread function definition
+static void *LoadDataThread(void *arg)
+{
+ int timeCounter = 0; // Time counted in ms
+ clock_t prevTime = clock(); // Previous time
+
+ // We simulate data loading with a time counter for 5 seconds
+ while (timeCounter < 5000)
+ {
+ clock_t currentTime = clock() - prevTime;
+ timeCounter = currentTime*1000/CLOCKS_PER_SEC;
+
+ // We accumulate time over a global variable to be used in
+ // main thread as a progress bar
+ atomic_store_explicit(&dataProgress, timeCounter/10, memory_order_relaxed);
+ }
+
+ // When data has finished loading, we set global variable
+ atomic_store_explicit(&dataLoaded, true, memory_order_relaxed);
+
+ return NULL;
+}
diff --git a/deps/raylib/examples/core/core_loading_thread.png b/deps/raylib/examples/core/core_loading_thread.png
new file mode 100644
index 0000000..957bd19
--- /dev/null
+++ b/deps/raylib/examples/core/core_loading_thread.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_random_sequence.c b/deps/raylib/examples/core/core_random_sequence.c
new file mode 100644
index 0000000..2f7c3be
--- /dev/null
+++ b/deps/raylib/examples/core/core_random_sequence.c
@@ -0,0 +1,176 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Generates a random sequence
+*
+* Example originally created with raylib 5.0, last time updated with raylib 5.0
+*
+* Example contributed by Dalton Overmyer (@REDl3east) 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) 2023 Dalton Overmyer (@REDl3east)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include "raymath.h"
+
+#include <stdlib.h> // Required for: malloc() and free()
+
+typedef struct ColorRect{
+ Color c;
+ Rectangle r;
+} ColorRect;
+
+static Color GenerateRandomColor();
+static ColorRect* GenerateRandomColorRectSequence(float rectCount, float rectWidth, float screenWidth, float screenHeight);
+static void ShuffleColorRectSequence(ColorRect* rectangles, int rectCount);
+static void DrawTextCenterKeyHelp(const char* key, const char* text, int posX, int posY, int fontSize, Color color);
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void) {
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - Generates a random sequence");
+
+ int rectCount = 20;
+ float rectSize = (float)screenWidth/rectCount;
+ ColorRect* rectangles = GenerateRandomColorRectSequence((float)rectCount, rectSize, (float)screenWidth, 0.75f * screenHeight);
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+
+ if(IsKeyPressed(KEY_SPACE))
+ {
+ ShuffleColorRectSequence(rectangles, rectCount);
+ }
+
+ if(IsKeyPressed(KEY_UP))
+ {
+ rectCount++;
+ rectSize = (float)screenWidth/rectCount;
+ free(rectangles);
+ rectangles = GenerateRandomColorRectSequence((float)rectCount, rectSize, (float)screenWidth, 0.75f * screenHeight);
+ }
+
+ if(IsKeyPressed(KEY_DOWN))
+ {
+ if(rectCount >= 4){
+ rectCount--;
+ rectSize = (float)screenWidth/rectCount;
+ free(rectangles);
+ rectangles = GenerateRandomColorRectSequence((float)rectCount, rectSize, (float)screenWidth, 0.75f * screenHeight);
+ }
+ }
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ int fontSize = 20;
+ for(int x=0;x<rectCount;x++)
+ {
+ DrawRectangleRec(rectangles[x].r, rectangles[x].c);
+ DrawTextCenterKeyHelp("SPACE", "to shuffle the sequence.", 10, screenHeight - 96, fontSize, BLACK);
+ DrawTextCenterKeyHelp("UP", "to add a rectangle and generate a new sequence.", 10, screenHeight - 64, fontSize, BLACK);
+ DrawTextCenterKeyHelp("DOWN", "to remove a rectangle and generate a new sequence.", 10, screenHeight - 32, fontSize, BLACK);
+ }
+
+ const char* rectCountText = TextFormat("%d rectangles", rectCount);
+ int rectCountTextSize = MeasureText(rectCountText, fontSize);
+ DrawText(rectCountText, screenWidth - rectCountTextSize - 10, 10, fontSize, BLACK);
+
+ DrawFPS(10, 10);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+
+ free(rectangles);
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+static Color GenerateRandomColor()
+{
+ return CLITERAL(Color){
+ GetRandomValue(0, 255),
+ GetRandomValue(0, 255),
+ GetRandomValue(0, 255),
+ 255,
+ };
+}
+
+static ColorRect* GenerateRandomColorRectSequence(float rectCount, float rectWidth, float screenWidth, float screenHeight){
+ int *seq = LoadRandomSequence((unsigned int)rectCount, 0, (unsigned int)rectCount-1);
+ ColorRect* rectangles = (ColorRect *)malloc((int)rectCount*sizeof(ColorRect));
+
+ float rectSeqWidth = rectCount * rectWidth;
+ float startX = (screenWidth - rectSeqWidth) * 0.5f;
+
+ for(int x=0;x<rectCount;x++){
+ int rectHeight = (int)Remap((float)seq[x], 0, rectCount-1, 0, screenHeight);
+ rectangles[x].c = GenerateRandomColor();
+ rectangles[x].r = CLITERAL(Rectangle){
+ startX + x * rectWidth, screenHeight - rectHeight, rectWidth, (float)rectHeight
+ };
+ }
+ UnloadRandomSequence(seq);
+ return rectangles;
+}
+
+static void ShuffleColorRectSequence(ColorRect* rectangles, int rectCount)
+{
+ int *seq = LoadRandomSequence(rectCount, 0, rectCount-1);
+ for(int i1=0;i1<rectCount;i1++){
+ ColorRect* r1 = &rectangles[i1];
+ ColorRect* r2 = &rectangles[seq[i1]];
+
+ // swap only the color and height
+ ColorRect tmp = *r1;
+ r1->c = r2->c;
+ r1->r.height = r2->r.height;
+ r1->r.y = r2->r.y;
+ r2->c = tmp.c;
+ r2->r.height = tmp.r.height;
+ r2->r.y = tmp.r.y;
+
+ }
+ UnloadRandomSequence(seq);
+}
+
+static void DrawTextCenterKeyHelp(const char* key, const char* text, int posX, int posY, int fontSize, Color color)
+{
+ int spaceSize = MeasureText(" ", fontSize);
+ int pressSize = MeasureText("Press", fontSize);
+ int keySize = MeasureText(key, fontSize);
+ int textSize = MeasureText(text, fontSize);
+ int totalSize = pressSize + 2 * spaceSize + keySize + 2 * spaceSize + textSize;
+ int textSizeCurrent = 0;
+
+ DrawText("Press", posX, posY, fontSize, color);
+ textSizeCurrent += pressSize + 2 * spaceSize;
+ DrawText(key, posX + textSizeCurrent, posY, fontSize, RED);
+ DrawRectangle(posX + textSizeCurrent, posY + fontSize, keySize, 3, RED);
+ textSizeCurrent += keySize + 2 * spaceSize;
+ DrawText(text, posX + textSizeCurrent, posY, fontSize, color);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_random_sequence.png b/deps/raylib/examples/core/core_random_sequence.png
new file mode 100644
index 0000000..206aa8b
--- /dev/null
+++ b/deps/raylib/examples/core/core_random_sequence.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_random_values.c b/deps/raylib/examples/core/core_random_values.c
new file mode 100644
index 0000000..46516ea
--- /dev/null
+++ b/deps/raylib/examples/core/core_random_values.c
@@ -0,0 +1,72 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Generate random values
+*
+* Example originally created with raylib 1.1, last time updated with raylib 1.1
+*
+* 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) 2014-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - generate random values");
+
+ // SetRandomSeed(0xaabbccff); // Set a custom random seed if desired, by default: "time(NULL)"
+
+ int randValue = GetRandomValue(-8, 5); // Get a random integer number between -8 and 5 (both included)
+
+ unsigned int framesCounter = 0; // Variable used to count frames
+
+ 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
+ //----------------------------------------------------------------------------------
+ framesCounter++;
+
+ // Every two seconds (120 frames) a new random value is generated
+ if (((framesCounter/120)%2) == 1)
+ {
+ randValue = GetRandomValue(-8, 5);
+ framesCounter = 0;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText("Every 2 seconds a new random value is generated:", 130, 100, 20, MAROON);
+
+ DrawText(TextFormat("%i", randValue), 360, 180, 80, LIGHTGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_random_values.png b/deps/raylib/examples/core/core_random_values.png
new file mode 100644
index 0000000..6dd4947
--- /dev/null
+++ b/deps/raylib/examples/core/core_random_values.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_scissor_test.c b/deps/raylib/examples/core/core_scissor_test.c
new file mode 100644
index 0000000..62ae080
--- /dev/null
+++ b/deps/raylib/examples/core/core_scissor_test.c
@@ -0,0 +1,76 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Scissor test
+*
+* Example originally created with raylib 2.5, last time updated with raylib 3.0
+*
+* Example contributed by Chris Dill (@MysteriousSpace) 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) 2019-2024 Chris Dill (@MysteriousSpace)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - scissor test");
+
+ Rectangle scissorArea = { 0, 0, 300, 300 };
+ bool scissorMode = true;
+
+ 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
+ //----------------------------------------------------------------------------------
+ if (IsKeyPressed(KEY_S)) scissorMode = !scissorMode;
+
+ // Centre the scissor area around the mouse position
+ scissorArea.x = GetMouseX() - scissorArea.width/2;
+ scissorArea.y = GetMouseY() - scissorArea.height/2;
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ if (scissorMode) BeginScissorMode((int)scissorArea.x, (int)scissorArea.y, (int)scissorArea.width, (int)scissorArea.height);
+
+ // Draw full screen rectangle and some text
+ // NOTE: Only part defined by scissor area will be rendered
+ DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), RED);
+ DrawText("Move the mouse around to reveal this text!", 190, 200, 20, LIGHTGRAY);
+
+ if (scissorMode) EndScissorMode();
+
+ DrawRectangleLinesEx(scissorArea, 1, BLACK);
+ DrawText("Press S to toggle scissor test", 10, 10, 20, BLACK);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_scissor_test.png b/deps/raylib/examples/core/core_scissor_test.png
new file mode 100644
index 0000000..194872b
--- /dev/null
+++ b/deps/raylib/examples/core/core_scissor_test.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_smooth_pixelperfect.c b/deps/raylib/examples/core/core_smooth_pixelperfect.c
new file mode 100644
index 0000000..d765576
--- /dev/null
+++ b/deps/raylib/examples/core/core_smooth_pixelperfect.c
@@ -0,0 +1,122 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Smooth Pixel-perfect camera
+*
+* Example originally created with raylib 3.7, last time updated with raylib 4.0
+*
+* Example contributed by Giancamillo Alessandroni (@NotManyIdeasDev) 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) 2021-2024 Giancamillo Alessandroni (@NotManyIdeasDev) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include <math.h> // Required for: sinf(), cosf()
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ const int virtualScreenWidth = 160;
+ const int virtualScreenHeight = 90;
+
+ const float virtualRatio = (float)screenWidth/(float)virtualScreenWidth;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - smooth pixel-perfect camera");
+
+ Camera2D worldSpaceCamera = { 0 }; // Game world camera
+ worldSpaceCamera.zoom = 1.0f;
+
+ Camera2D screenSpaceCamera = { 0 }; // Smoothing camera
+ screenSpaceCamera.zoom = 1.0f;
+
+ RenderTexture2D target = LoadRenderTexture(virtualScreenWidth, virtualScreenHeight); // This is where we'll draw all our objects.
+
+ Rectangle rec01 = { 70.0f, 35.0f, 20.0f, 20.0f };
+ Rectangle rec02 = { 90.0f, 55.0f, 30.0f, 10.0f };
+ Rectangle rec03 = { 80.0f, 65.0f, 15.0f, 25.0f };
+
+ // The target's height is flipped (in the source Rectangle), due to OpenGL reasons
+ Rectangle sourceRec = { 0.0f, 0.0f, (float)target.texture.width, -(float)target.texture.height };
+ Rectangle destRec = { -virtualRatio, -virtualRatio, screenWidth + (virtualRatio*2), screenHeight + (virtualRatio*2) };
+
+ Vector2 origin = { 0.0f, 0.0f };
+
+ float rotation = 0.0f;
+
+ float cameraX = 0.0f;
+ float cameraY = 0.0f;
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ rotation += 60.0f*GetFrameTime(); // Rotate the rectangles, 60 degrees per second
+
+ // Make the camera move to demonstrate the effect
+ cameraX = (sinf((float)GetTime())*50.0f) - 10.0f;
+ cameraY = cosf((float)GetTime())*30.0f;
+
+ // Set the camera's target to the values computed above
+ screenSpaceCamera.target = (Vector2){ cameraX, cameraY };
+
+ // Round worldSpace coordinates, keep decimals into screenSpace coordinates
+ worldSpaceCamera.target.x = truncf(screenSpaceCamera.target.x);
+ screenSpaceCamera.target.x -= worldSpaceCamera.target.x;
+ screenSpaceCamera.target.x *= virtualRatio;
+
+ worldSpaceCamera.target.y = truncf(screenSpaceCamera.target.y);
+ screenSpaceCamera.target.y -= worldSpaceCamera.target.y;
+ screenSpaceCamera.target.y *= virtualRatio;
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginTextureMode(target);
+ ClearBackground(RAYWHITE);
+
+ BeginMode2D(worldSpaceCamera);
+ DrawRectanglePro(rec01, origin, rotation, BLACK);
+ DrawRectanglePro(rec02, origin, -rotation, RED);
+ DrawRectanglePro(rec03, origin, rotation + 45.0f, BLUE);
+ EndMode2D();
+ EndTextureMode();
+
+ BeginDrawing();
+ ClearBackground(RED);
+
+ BeginMode2D(screenSpaceCamera);
+ DrawTexturePro(target.texture, sourceRec, destRec, origin, 0.0f, WHITE);
+ EndMode2D();
+
+ DrawText(TextFormat("Screen resolution: %ix%i", screenWidth, screenHeight), 10, 10, 20, DARKBLUE);
+ DrawText(TextFormat("World resolution: %ix%i", virtualScreenWidth, virtualScreenHeight), 10, 40, 20, DARKGREEN);
+ DrawFPS(GetScreenWidth() - 95, 10);
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadRenderTexture(target); // Unload render texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_smooth_pixelperfect.png b/deps/raylib/examples/core/core_smooth_pixelperfect.png
new file mode 100644
index 0000000..d3b6ce0
--- /dev/null
+++ b/deps/raylib/examples/core/core_smooth_pixelperfect.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_storage_values.c b/deps/raylib/examples/core/core_storage_values.c
new file mode 100644
index 0000000..70386da
--- /dev/null
+++ b/deps/raylib/examples/core/core_storage_values.c
@@ -0,0 +1,193 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Storage save/load values
+*
+* Example originally created with raylib 1.4, last time updated with raylib 4.2
+*
+* 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) 2015-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include <stdlib.h> // Required for: calloc(), free()
+
+#define STORAGE_DATA_FILE "storage.data" // Storage file
+
+// NOTE: Storage positions must start with 0, directly related to file memory layout
+typedef enum {
+ STORAGE_POSITION_SCORE = 0,
+ STORAGE_POSITION_HISCORE = 1
+} StorageData;
+
+// Persistent storage functions
+static bool SaveStorageValue(unsigned int position, int value);
+static int LoadStorageValue(unsigned int position);
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - storage save/load values");
+
+ int score = 0;
+ int hiscore = 0;
+ int framesCounter = 0;
+
+ 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
+ //----------------------------------------------------------------------------------
+ if (IsKeyPressed(KEY_R))
+ {
+ score = GetRandomValue(1000, 2000);
+ hiscore = GetRandomValue(2000, 4000);
+ }
+
+ if (IsKeyPressed(KEY_ENTER))
+ {
+ SaveStorageValue(STORAGE_POSITION_SCORE, score);
+ SaveStorageValue(STORAGE_POSITION_HISCORE, hiscore);
+ }
+ else if (IsKeyPressed(KEY_SPACE))
+ {
+ // NOTE: If requested position could not be found, value 0 is returned
+ score = LoadStorageValue(STORAGE_POSITION_SCORE);
+ hiscore = LoadStorageValue(STORAGE_POSITION_HISCORE);
+ }
+
+ framesCounter++;
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText(TextFormat("SCORE: %i", score), 280, 130, 40, MAROON);
+ DrawText(TextFormat("HI-SCORE: %i", hiscore), 210, 200, 50, BLACK);
+
+ DrawText(TextFormat("frames: %i", framesCounter), 10, 10, 20, LIME);
+
+ DrawText("Press R to generate random numbers", 220, 40, 20, LIGHTGRAY);
+ DrawText("Press ENTER to SAVE values", 250, 310, 20, LIGHTGRAY);
+ DrawText("Press SPACE to LOAD values", 252, 350, 20, LIGHTGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+// Save integer value to storage file (to defined position)
+// NOTE: Storage positions is directly related to file memory layout (4 bytes each integer)
+bool SaveStorageValue(unsigned int position, int value)
+{
+ bool success = false;
+ int dataSize = 0;
+ unsigned int newDataSize = 0;
+ unsigned char *fileData = LoadFileData(STORAGE_DATA_FILE, &dataSize);
+ unsigned char *newFileData = NULL;
+
+ if (fileData != NULL)
+ {
+ if (dataSize <= (position*sizeof(int)))
+ {
+ // Increase data size up to position and store value
+ newDataSize = (position + 1)*sizeof(int);
+ newFileData = (unsigned char *)RL_REALLOC(fileData, newDataSize);
+
+ if (newFileData != NULL)
+ {
+ // RL_REALLOC succeded
+ int *dataPtr = (int *)newFileData;
+ dataPtr[position] = value;
+ }
+ else
+ {
+ // RL_REALLOC failed
+ TraceLog(LOG_WARNING, "FILEIO: [%s] Failed to realloc data (%u), position in bytes (%u) bigger than actual file size", STORAGE_DATA_FILE, dataSize, position*sizeof(int));
+
+ // We store the old size of the file
+ newFileData = fileData;
+ newDataSize = dataSize;
+ }
+ }
+ else
+ {
+ // Store the old size of the file
+ newFileData = fileData;
+ newDataSize = dataSize;
+
+ // Replace value on selected position
+ int *dataPtr = (int *)newFileData;
+ dataPtr[position] = value;
+ }
+
+ success = SaveFileData(STORAGE_DATA_FILE, newFileData, newDataSize);
+ RL_FREE(newFileData);
+
+ TraceLog(LOG_INFO, "FILEIO: [%s] Saved storage value: %i", STORAGE_DATA_FILE, value);
+ }
+ else
+ {
+ TraceLog(LOG_INFO, "FILEIO: [%s] File created successfully", STORAGE_DATA_FILE);
+
+ dataSize = (position + 1)*sizeof(int);
+ fileData = (unsigned char *)RL_MALLOC(dataSize);
+ int *dataPtr = (int *)fileData;
+ dataPtr[position] = value;
+
+ success = SaveFileData(STORAGE_DATA_FILE, fileData, dataSize);
+ UnloadFileData(fileData);
+
+ TraceLog(LOG_INFO, "FILEIO: [%s] Saved storage value: %i", STORAGE_DATA_FILE, value);
+ }
+
+ return success;
+}
+
+// Load integer value from storage file (from defined position)
+// NOTE: If requested position could not be found, value 0 is returned
+int LoadStorageValue(unsigned int position)
+{
+ int value = 0;
+ int dataSize = 0;
+ unsigned char *fileData = LoadFileData(STORAGE_DATA_FILE, &dataSize);
+
+ if (fileData != NULL)
+ {
+ if (dataSize < ((int)(position*4))) TraceLog(LOG_WARNING, "FILEIO: [%s] Failed to find storage position: %i", STORAGE_DATA_FILE, position);
+ else
+ {
+ int *dataPtr = (int *)fileData;
+ value = dataPtr[position];
+ }
+
+ UnloadFileData(fileData);
+
+ TraceLog(LOG_INFO, "FILEIO: [%s] Loaded storage value: %i", STORAGE_DATA_FILE, value);
+ }
+
+ return value;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_storage_values.png b/deps/raylib/examples/core/core_storage_values.png
new file mode 100644
index 0000000..6cfd552
--- /dev/null
+++ b/deps/raylib/examples/core/core_storage_values.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_vr_simulator.c b/deps/raylib/examples/core/core_vr_simulator.c
new file mode 100644
index 0000000..021698e
--- /dev/null
+++ b/deps/raylib/examples/core/core_vr_simulator.c
@@ -0,0 +1,150 @@
+/*******************************************************************************************
+*
+* raylib [core] example - VR Simulator (Oculus Rift CV1 parameters)
+*
+* Example originally created with raylib 2.5, last time updated with raylib 4.0
+*
+* 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) 2017-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ // NOTE: screenWidth/screenHeight should match VR device aspect ratio
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - vr simulator");
+
+ // VR device parameters definition
+ VrDeviceInfo device = {
+ // Oculus Rift CV1 parameters for simulator
+ .hResolution = 2160, // Horizontal resolution in pixels
+ .vResolution = 1200, // Vertical resolution in pixels
+ .hScreenSize = 0.133793f, // Horizontal size in meters
+ .vScreenSize = 0.0669f, // Vertical size in meters
+ .eyeToScreenDistance = 0.041f, // Distance between eye and display in meters
+ .lensSeparationDistance = 0.07f, // Lens separation distance in meters
+ .interpupillaryDistance = 0.07f, // IPD (distance between pupils) in meters
+
+ // NOTE: CV1 uses fresnel-hybrid-asymmetric lenses with specific compute shaders
+ // Following parameters are just an approximation to CV1 distortion stereo rendering
+ .lensDistortionValues[0] = 1.0f, // Lens distortion constant parameter 0
+ .lensDistortionValues[1] = 0.22f, // Lens distortion constant parameter 1
+ .lensDistortionValues[2] = 0.24f, // Lens distortion constant parameter 2
+ .lensDistortionValues[3] = 0.0f, // Lens distortion constant parameter 3
+ .chromaAbCorrection[0] = 0.996f, // Chromatic aberration correction parameter 0
+ .chromaAbCorrection[1] = -0.004f, // Chromatic aberration correction parameter 1
+ .chromaAbCorrection[2] = 1.014f, // Chromatic aberration correction parameter 2
+ .chromaAbCorrection[3] = 0.0f, // Chromatic aberration correction parameter 3
+ };
+
+ // Load VR stereo config for VR device parameteres (Oculus Rift CV1 parameters)
+ VrStereoConfig config = LoadVrStereoConfig(device);
+
+ // Distortion shader (uses device lens distortion and chroma)
+ Shader distortion = LoadShader(0, TextFormat("resources/distortion%i.fs", GLSL_VERSION));
+
+ // Update distortion shader with lens and distortion-scale parameters
+ SetShaderValue(distortion, GetShaderLocation(distortion, "leftLensCenter"),
+ config.leftLensCenter, SHADER_UNIFORM_VEC2);
+ SetShaderValue(distortion, GetShaderLocation(distortion, "rightLensCenter"),
+ config.rightLensCenter, SHADER_UNIFORM_VEC2);
+ SetShaderValue(distortion, GetShaderLocation(distortion, "leftScreenCenter"),
+ config.leftScreenCenter, SHADER_UNIFORM_VEC2);
+ SetShaderValue(distortion, GetShaderLocation(distortion, "rightScreenCenter"),
+ config.rightScreenCenter, SHADER_UNIFORM_VEC2);
+
+ SetShaderValue(distortion, GetShaderLocation(distortion, "scale"),
+ config.scale, SHADER_UNIFORM_VEC2);
+ SetShaderValue(distortion, GetShaderLocation(distortion, "scaleIn"),
+ config.scaleIn, SHADER_UNIFORM_VEC2);
+ SetShaderValue(distortion, GetShaderLocation(distortion, "deviceWarpParam"),
+ device.lensDistortionValues, SHADER_UNIFORM_VEC4);
+ SetShaderValue(distortion, GetShaderLocation(distortion, "chromaAbParam"),
+ device.chromaAbCorrection, SHADER_UNIFORM_VEC4);
+
+ // Initialize framebuffer for stereo rendering
+ // NOTE: Screen size should match HMD aspect ratio
+ RenderTexture2D target = LoadRenderTexture(device.hResolution, device.vResolution);
+
+ // The target's height is flipped (in the source Rectangle), due to OpenGL reasons
+ Rectangle sourceRec = { 0.0f, 0.0f, (float)target.texture.width, -(float)target.texture.height };
+ Rectangle destRec = { 0.0f, 0.0f, (float)GetScreenWidth(), (float)GetScreenHeight() };
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 5.0f, 2.0f, 5.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 2.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector
+ camera.fovy = 60.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ Vector3 cubePosition = { 0.0f, 0.0f, 0.0f };
+
+ 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_FIRST_PERSON);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginTextureMode(target);
+ ClearBackground(RAYWHITE);
+ BeginVrStereoMode(config);
+ BeginMode3D(camera);
+
+ DrawCube(cubePosition, 2.0f, 2.0f, 2.0f, RED);
+ DrawCubeWires(cubePosition, 2.0f, 2.0f, 2.0f, MAROON);
+ DrawGrid(40, 1.0f);
+
+ EndMode3D();
+ EndVrStereoMode();
+ EndTextureMode();
+
+ BeginDrawing();
+ ClearBackground(RAYWHITE);
+ BeginShaderMode(distortion);
+ DrawTexturePro(target.texture, sourceRec, destRec, (Vector2){ 0.0f, 0.0f }, 0.0f, WHITE);
+ EndShaderMode();
+ DrawFPS(10, 10);
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadVrStereoConfig(config); // Unload stereo config
+
+ UnloadRenderTexture(target); // Unload stereo render fbo
+ UnloadShader(distortion); // Unload distortion shader
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_vr_simulator.png b/deps/raylib/examples/core/core_vr_simulator.png
new file mode 100644
index 0000000..aa4d093
--- /dev/null
+++ b/deps/raylib/examples/core/core_vr_simulator.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_window_flags.c b/deps/raylib/examples/core/core_window_flags.c
new file mode 100644
index 0000000..c9f8589
--- /dev/null
+++ b/deps/raylib/examples/core/core_window_flags.c
@@ -0,0 +1,196 @@
+/*******************************************************************************************
+*
+* raylib [core] example - window flags
+*
+* Example originally created with raylib 3.5, last time updated with raylib 3.5
+*
+* 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) 2020-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //---------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ // Possible window flags
+ /*
+ FLAG_VSYNC_HINT
+ FLAG_FULLSCREEN_MODE -> not working properly -> wrong scaling!
+ FLAG_WINDOW_RESIZABLE
+ FLAG_WINDOW_UNDECORATED
+ FLAG_WINDOW_TRANSPARENT
+ FLAG_WINDOW_HIDDEN
+ FLAG_WINDOW_MINIMIZED -> Not supported on window creation
+ FLAG_WINDOW_MAXIMIZED -> Not supported on window creation
+ FLAG_WINDOW_UNFOCUSED
+ FLAG_WINDOW_TOPMOST
+ FLAG_WINDOW_HIGHDPI -> errors after minimize-resize, fb size is recalculated
+ FLAG_WINDOW_ALWAYS_RUN
+ FLAG_MSAA_4X_HINT
+ */
+
+ // Set configuration flags for window creation
+ //SetConfigFlags(FLAG_VSYNC_HINT | FLAG_MSAA_4X_HINT | FLAG_WINDOW_HIGHDPI);
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - window flags");
+
+ Vector2 ballPosition = { GetScreenWidth() / 2.0f, GetScreenHeight() / 2.0f };
+ Vector2 ballSpeed = { 5.0f, 4.0f };
+ float ballRadius = 20;
+
+ int framesCounter = 0;
+
+ //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
+ //-----------------------------------------------------
+ if (IsKeyPressed(KEY_F)) ToggleFullscreen(); // modifies window size when scaling!
+
+ if (IsKeyPressed(KEY_R))
+ {
+ if (IsWindowState(FLAG_WINDOW_RESIZABLE)) ClearWindowState(FLAG_WINDOW_RESIZABLE);
+ else SetWindowState(FLAG_WINDOW_RESIZABLE);
+ }
+
+ if (IsKeyPressed(KEY_D))
+ {
+ if (IsWindowState(FLAG_WINDOW_UNDECORATED)) ClearWindowState(FLAG_WINDOW_UNDECORATED);
+ else SetWindowState(FLAG_WINDOW_UNDECORATED);
+ }
+
+ if (IsKeyPressed(KEY_H))
+ {
+ if (!IsWindowState(FLAG_WINDOW_HIDDEN)) SetWindowState(FLAG_WINDOW_HIDDEN);
+
+ framesCounter = 0;
+ }
+
+ if (IsWindowState(FLAG_WINDOW_HIDDEN))
+ {
+ framesCounter++;
+ if (framesCounter >= 240) ClearWindowState(FLAG_WINDOW_HIDDEN); // Show window after 3 seconds
+ }
+
+ if (IsKeyPressed(KEY_N))
+ {
+ if (!IsWindowState(FLAG_WINDOW_MINIMIZED)) MinimizeWindow();
+
+ framesCounter = 0;
+ }
+
+ if (IsWindowState(FLAG_WINDOW_MINIMIZED))
+ {
+ framesCounter++;
+ if (framesCounter >= 240) RestoreWindow(); // Restore window after 3 seconds
+ }
+
+ if (IsKeyPressed(KEY_M))
+ {
+ // NOTE: Requires FLAG_WINDOW_RESIZABLE enabled!
+ if (IsWindowState(FLAG_WINDOW_MAXIMIZED)) RestoreWindow();
+ else MaximizeWindow();
+ }
+
+ if (IsKeyPressed(KEY_U))
+ {
+ if (IsWindowState(FLAG_WINDOW_UNFOCUSED)) ClearWindowState(FLAG_WINDOW_UNFOCUSED);
+ else SetWindowState(FLAG_WINDOW_UNFOCUSED);
+ }
+
+ if (IsKeyPressed(KEY_T))
+ {
+ if (IsWindowState(FLAG_WINDOW_TOPMOST)) ClearWindowState(FLAG_WINDOW_TOPMOST);
+ else SetWindowState(FLAG_WINDOW_TOPMOST);
+ }
+
+ if (IsKeyPressed(KEY_A))
+ {
+ if (IsWindowState(FLAG_WINDOW_ALWAYS_RUN)) ClearWindowState(FLAG_WINDOW_ALWAYS_RUN);
+ else SetWindowState(FLAG_WINDOW_ALWAYS_RUN);
+ }
+
+ if (IsKeyPressed(KEY_V))
+ {
+ if (IsWindowState(FLAG_VSYNC_HINT)) ClearWindowState(FLAG_VSYNC_HINT);
+ else SetWindowState(FLAG_VSYNC_HINT);
+ }
+
+ // Bouncing ball logic
+ ballPosition.x += ballSpeed.x;
+ ballPosition.y += ballSpeed.y;
+ if ((ballPosition.x >= (GetScreenWidth() - ballRadius)) || (ballPosition.x <= ballRadius)) ballSpeed.x *= -1.0f;
+ if ((ballPosition.y >= (GetScreenHeight() - ballRadius)) || (ballPosition.y <= ballRadius)) ballSpeed.y *= -1.0f;
+ //-----------------------------------------------------
+
+ // Draw
+ //-----------------------------------------------------
+ BeginDrawing();
+
+ if (IsWindowState(FLAG_WINDOW_TRANSPARENT)) ClearBackground(BLANK);
+ else ClearBackground(RAYWHITE);
+
+ DrawCircleV(ballPosition, ballRadius, MAROON);
+ DrawRectangleLinesEx((Rectangle) { 0, 0, (float)GetScreenWidth(), (float)GetScreenHeight() }, 4, RAYWHITE);
+
+ DrawCircleV(GetMousePosition(), 10, DARKBLUE);
+
+ DrawFPS(10, 10);
+
+ DrawText(TextFormat("Screen Size: [%i, %i]", GetScreenWidth(), GetScreenHeight()), 10, 40, 10, GREEN);
+
+ // Draw window state info
+ DrawText("Following flags can be set after window creation:", 10, 60, 10, GRAY);
+ if (IsWindowState(FLAG_FULLSCREEN_MODE)) DrawText("[F] FLAG_FULLSCREEN_MODE: on", 10, 80, 10, LIME);
+ else DrawText("[F] FLAG_FULLSCREEN_MODE: off", 10, 80, 10, MAROON);
+ if (IsWindowState(FLAG_WINDOW_RESIZABLE)) DrawText("[R] FLAG_WINDOW_RESIZABLE: on", 10, 100, 10, LIME);
+ else DrawText("[R] FLAG_WINDOW_RESIZABLE: off", 10, 100, 10, MAROON);
+ if (IsWindowState(FLAG_WINDOW_UNDECORATED)) DrawText("[D] FLAG_WINDOW_UNDECORATED: on", 10, 120, 10, LIME);
+ else DrawText("[D] FLAG_WINDOW_UNDECORATED: off", 10, 120, 10, MAROON);
+ if (IsWindowState(FLAG_WINDOW_HIDDEN)) DrawText("[H] FLAG_WINDOW_HIDDEN: on", 10, 140, 10, LIME);
+ else DrawText("[H] FLAG_WINDOW_HIDDEN: off", 10, 140, 10, MAROON);
+ if (IsWindowState(FLAG_WINDOW_MINIMIZED)) DrawText("[N] FLAG_WINDOW_MINIMIZED: on", 10, 160, 10, LIME);
+ else DrawText("[N] FLAG_WINDOW_MINIMIZED: off", 10, 160, 10, MAROON);
+ if (IsWindowState(FLAG_WINDOW_MAXIMIZED)) DrawText("[M] FLAG_WINDOW_MAXIMIZED: on", 10, 180, 10, LIME);
+ else DrawText("[M] FLAG_WINDOW_MAXIMIZED: off", 10, 180, 10, MAROON);
+ if (IsWindowState(FLAG_WINDOW_UNFOCUSED)) DrawText("[G] FLAG_WINDOW_UNFOCUSED: on", 10, 200, 10, LIME);
+ else DrawText("[U] FLAG_WINDOW_UNFOCUSED: off", 10, 200, 10, MAROON);
+ if (IsWindowState(FLAG_WINDOW_TOPMOST)) DrawText("[T] FLAG_WINDOW_TOPMOST: on", 10, 220, 10, LIME);
+ else DrawText("[T] FLAG_WINDOW_TOPMOST: off", 10, 220, 10, MAROON);
+ if (IsWindowState(FLAG_WINDOW_ALWAYS_RUN)) DrawText("[A] FLAG_WINDOW_ALWAYS_RUN: on", 10, 240, 10, LIME);
+ else DrawText("[A] FLAG_WINDOW_ALWAYS_RUN: off", 10, 240, 10, MAROON);
+ if (IsWindowState(FLAG_VSYNC_HINT)) DrawText("[V] FLAG_VSYNC_HINT: on", 10, 260, 10, LIME);
+ else DrawText("[V] FLAG_VSYNC_HINT: off", 10, 260, 10, MAROON);
+
+ DrawText("Following flags can only be set before window creation:", 10, 300, 10, GRAY);
+ if (IsWindowState(FLAG_WINDOW_HIGHDPI)) DrawText("FLAG_WINDOW_HIGHDPI: on", 10, 320, 10, LIME);
+ else DrawText("FLAG_WINDOW_HIGHDPI: off", 10, 320, 10, MAROON);
+ if (IsWindowState(FLAG_WINDOW_TRANSPARENT)) DrawText("FLAG_WINDOW_TRANSPARENT: on", 10, 340, 10, LIME);
+ else DrawText("FLAG_WINDOW_TRANSPARENT: off", 10, 340, 10, MAROON);
+ if (IsWindowState(FLAG_MSAA_4X_HINT)) DrawText("FLAG_MSAA_4X_HINT: on", 10, 360, 10, LIME);
+ else DrawText("FLAG_MSAA_4X_HINT: off", 10, 360, 10, MAROON);
+
+ EndDrawing();
+ //-----------------------------------------------------
+ }
+
+ // De-Initialization
+ //---------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //----------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_window_flags.png b/deps/raylib/examples/core/core_window_flags.png
new file mode 100644
index 0000000..413d2a8
--- /dev/null
+++ b/deps/raylib/examples/core/core_window_flags.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_window_letterbox.c b/deps/raylib/examples/core/core_window_letterbox.c
new file mode 100644
index 0000000..ded7824
--- /dev/null
+++ b/deps/raylib/examples/core/core_window_letterbox.c
@@ -0,0 +1,107 @@
+/*******************************************************************************************
+*
+* raylib [core] example - window scale letterbox (and virtual mouse)
+*
+* Example originally created with raylib 2.5, last time updated with raylib 4.0
+*
+* Example contributed by Anata (@anatagawa) 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) 2019-2024 Anata (@anatagawa) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include "raymath.h" // Required for: Vector2Clamp()
+
+#define MAX(a, b) ((a)>(b)? (a) : (b))
+#define MIN(a, b) ((a)<(b)? (a) : (b))
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ const int windowWidth = 800;
+ const int windowHeight = 450;
+
+ // Enable config flags for resizable window and vertical synchro
+ SetConfigFlags(FLAG_WINDOW_RESIZABLE | FLAG_VSYNC_HINT);
+ InitWindow(windowWidth, windowHeight, "raylib [core] example - window scale letterbox");
+ SetWindowMinSize(320, 240);
+
+ int gameScreenWidth = 640;
+ int gameScreenHeight = 480;
+
+ // Render texture initialization, used to hold the rendering result so we can easily resize it
+ RenderTexture2D target = LoadRenderTexture(gameScreenWidth, gameScreenHeight);
+ SetTextureFilter(target.texture, TEXTURE_FILTER_BILINEAR); // Texture scale filter to use
+
+ Color colors[10] = { 0 };
+ for (int i = 0; i < 10; i++) colors[i] = (Color){ GetRandomValue(100, 250), GetRandomValue(50, 150), GetRandomValue(10, 100), 255 };
+
+ 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
+ //----------------------------------------------------------------------------------
+ // Compute required framebuffer scaling
+ float scale = MIN((float)GetScreenWidth()/gameScreenWidth, (float)GetScreenHeight()/gameScreenHeight);
+
+ if (IsKeyPressed(KEY_SPACE))
+ {
+ // Recalculate random colors for the bars
+ for (int i = 0; i < 10; i++) colors[i] = (Color){ GetRandomValue(100, 250), GetRandomValue(50, 150), GetRandomValue(10, 100), 255 };
+ }
+
+ // Update virtual mouse (clamped mouse value behind game screen)
+ Vector2 mouse = GetMousePosition();
+ Vector2 virtualMouse = { 0 };
+ virtualMouse.x = (mouse.x - (GetScreenWidth() - (gameScreenWidth*scale))*0.5f)/scale;
+ virtualMouse.y = (mouse.y - (GetScreenHeight() - (gameScreenHeight*scale))*0.5f)/scale;
+ virtualMouse = Vector2Clamp(virtualMouse, (Vector2){ 0, 0 }, (Vector2){ (float)gameScreenWidth, (float)gameScreenHeight });
+
+ // Apply the same transformation as the virtual mouse to the real mouse (i.e. to work with raygui)
+ //SetMouseOffset(-(GetScreenWidth() - (gameScreenWidth*scale))*0.5f, -(GetScreenHeight() - (gameScreenHeight*scale))*0.5f);
+ //SetMouseScale(1/scale, 1/scale);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ // Draw everything in the render texture, note this will not be rendered on screen, yet
+ BeginTextureMode(target);
+ ClearBackground(RAYWHITE); // Clear render texture background color
+
+ for (int i = 0; i < 10; i++) DrawRectangle(0, (gameScreenHeight/10)*i, gameScreenWidth, gameScreenHeight/10, colors[i]);
+
+ DrawText("If executed inside a window,\nyou can resize the window,\nand see the screen scaling!", 10, 25, 20, WHITE);
+ DrawText(TextFormat("Default Mouse: [%i , %i]", (int)mouse.x, (int)mouse.y), 350, 25, 20, GREEN);
+ DrawText(TextFormat("Virtual Mouse: [%i , %i]", (int)virtualMouse.x, (int)virtualMouse.y), 350, 55, 20, YELLOW);
+ EndTextureMode();
+
+ BeginDrawing();
+ ClearBackground(BLACK); // Clear screen background
+
+ // Draw render texture to screen, properly scaled
+ DrawTexturePro(target.texture, (Rectangle){ 0.0f, 0.0f, (float)target.texture.width, (float)-target.texture.height },
+ (Rectangle){ (GetScreenWidth() - ((float)gameScreenWidth*scale))*0.5f, (GetScreenHeight() - ((float)gameScreenHeight*scale))*0.5f,
+ (float)gameScreenWidth*scale, (float)gameScreenHeight*scale }, (Vector2){ 0, 0 }, 0.0f, WHITE);
+ EndDrawing();
+ //--------------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadRenderTexture(target); // Unload render texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_window_letterbox.png b/deps/raylib/examples/core/core_window_letterbox.png
new file mode 100644
index 0000000..fbdbb86
--- /dev/null
+++ b/deps/raylib/examples/core/core_window_letterbox.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_window_should_close.c b/deps/raylib/examples/core/core_window_should_close.c
new file mode 100644
index 0000000..e28ef7d
--- /dev/null
+++ b/deps/raylib/examples/core/core_window_should_close.c
@@ -0,0 +1,77 @@
+/*******************************************************************************************
+*
+* raylib [core] example - Window should close
+*
+* Example originally created with raylib 4.2, last time updated with raylib 4.2
+*
+* 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) 2013-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main()
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - window should close");
+
+ SetExitKey(KEY_NULL); // Disable KEY_ESCAPE to close window, X-button still works
+
+ bool exitWindowRequested = false; // Flag to request window to exit
+ bool exitWindow = false; // Flag to set window to exit
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!exitWindow)
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ // Detect if X-button or KEY_ESCAPE have been pressed to close window
+ if (WindowShouldClose() || IsKeyPressed(KEY_ESCAPE)) exitWindowRequested = true;
+
+ if (exitWindowRequested)
+ {
+ // A request for close window has been issued, we can save data before closing
+ // or just show a message asking for confirmation
+
+ if (IsKeyPressed(KEY_Y)) exitWindow = true;
+ else if (IsKeyPressed(KEY_N)) exitWindowRequested = false;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ if (exitWindowRequested)
+ {
+ DrawRectangle(0, 100, screenWidth, 200, BLACK);
+ DrawText("Are you sure you want to exit program? [Y/N]", 40, 180, 30, WHITE);
+ }
+ else DrawText("Try to close the window to get confirmation message!", 120, 200, 20, LIGHTGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/core/core_window_should_close.png b/deps/raylib/examples/core/core_window_should_close.png
new file mode 100644
index 0000000..4ef088a
--- /dev/null
+++ b/deps/raylib/examples/core/core_window_should_close.png
Binary files differ
diff --git a/deps/raylib/examples/core/core_world_screen.c b/deps/raylib/examples/core/core_world_screen.c
new file mode 100644
index 0000000..82fa312
--- /dev/null
+++ b/deps/raylib/examples/core/core_world_screen.c
@@ -0,0 +1,85 @@
+/*******************************************************************************************
+*
+* raylib [core] example - World to screen
+*
+* Example originally created with raylib 1.3, last time updated with raylib 1.4
+*
+* 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) 2015-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - core world screen");
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 10.0f, 10.0f, 10.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ Vector3 cubePosition = { 0.0f, 0.0f, 0.0f };
+ Vector2 cubeScreenPosition = { 0.0f, 0.0f };
+
+ 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_THIRD_PERSON);
+
+ // Calculate cube screen space position (with a little offset to be in top)
+ cubeScreenPosition = GetWorldToScreen((Vector3){cubePosition.x, cubePosition.y + 2.5f, cubePosition.z}, camera);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginMode3D(camera);
+
+ DrawCube(cubePosition, 2.0f, 2.0f, 2.0f, RED);
+ DrawCubeWires(cubePosition, 2.0f, 2.0f, 2.0f, MAROON);
+
+ DrawGrid(10, 1.0f);
+
+ EndMode3D();
+
+ DrawText("Enemy: 100 / 100", (int)cubeScreenPosition.x - MeasureText("Enemy: 100/100", 20)/2, (int)cubeScreenPosition.y, 20, BLACK);
+
+ DrawText(TextFormat("Cube position in screen space coordinates: [%i, %i]", (int)cubeScreenPosition.x, (int)cubeScreenPosition.y), 10, 10, 20, LIME);
+ DrawText("Text 2d should be always on top of the cube", 10, 40, 20, GRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/core/core_world_screen.png b/deps/raylib/examples/core/core_world_screen.png
new file mode 100644
index 0000000..b4853b4
--- /dev/null
+++ b/deps/raylib/examples/core/core_world_screen.png
Binary files differ
diff --git a/deps/raylib/examples/core/resources/LICENSE.md b/deps/raylib/examples/core/resources/LICENSE.md
new file mode 100644
index 0000000..d7d797a
--- /dev/null
+++ b/deps/raylib/examples/core/resources/LICENSE.md
@@ -0,0 +1,4 @@
+| resource | author | licence | notes |
+| :------------ | :---------: | :------ | :---- |
+| ps3.png | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | - |
+| xbox.png | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | - |
diff --git a/deps/raylib/examples/core/resources/distortion100.fs b/deps/raylib/examples/core/resources/distortion100.fs
new file mode 100644
index 0000000..f72c689
--- /dev/null
+++ b/deps/raylib/examples/core/resources/distortion100.fs
@@ -0,0 +1,52 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+uniform vec2 leftLensCenter;
+uniform vec2 rightLensCenter;
+uniform vec2 leftScreenCenter;
+uniform vec2 rightScreenCenter;
+uniform vec2 scale;
+uniform vec2 scaleIn;
+uniform vec4 deviceWarpParam;
+uniform vec4 chromaAbParam;
+
+void main()
+{
+ // Compute lens distortion
+ vec2 lensCenter = fragTexCoord.x < 0.5? leftLensCenter : rightLensCenter;
+ vec2 screenCenter = fragTexCoord.x < 0.5? leftScreenCenter : rightScreenCenter;
+ vec2 theta = (fragTexCoord - lensCenter)*scaleIn;
+ float rSq = theta.x*theta.x + theta.y*theta.y;
+ vec2 theta1 = theta*(deviceWarpParam.x + deviceWarpParam.y*rSq + deviceWarpParam.z*rSq*rSq + deviceWarpParam.w*rSq*rSq*rSq);
+ vec2 thetaBlue = theta1*(chromaAbParam.z + chromaAbParam.w*rSq);
+ vec2 tcBlue = lensCenter + scale*thetaBlue;
+
+ if (any(bvec2(clamp(tcBlue, screenCenter - vec2(0.25, 0.5), screenCenter + vec2(0.25, 0.5)) - tcBlue)))
+ {
+ // Set black fragment for everything outside the lens border
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+ }
+ else
+ {
+ // Compute color chroma aberration
+ float blue = texture2D(texture0, tcBlue).b;
+ vec2 tcGreen = lensCenter + scale*theta1;
+ float green = texture2D(texture0, tcGreen).g;
+
+ vec2 thetaRed = theta1*(chromaAbParam.x + chromaAbParam.y*rSq);
+ vec2 tcRed = lensCenter + scale*thetaRed;
+
+ float red = texture2D(texture0, tcRed).r;
+ gl_FragColor = vec4(red, green, blue, 1.0);
+ }
+}
diff --git a/deps/raylib/examples/core/resources/distortion330.fs b/deps/raylib/examples/core/resources/distortion330.fs
new file mode 100644
index 0000000..97044c4
--- /dev/null
+++ b/deps/raylib/examples/core/resources/distortion330.fs
@@ -0,0 +1,53 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+uniform vec2 leftLensCenter = vec2(0.288, 0.5);
+uniform vec2 rightLensCenter = vec2(0.712, 0.5);
+uniform vec2 leftScreenCenter = vec2(0.25, 0.5);
+uniform vec2 rightScreenCenter = vec2(0.75, 0.5);
+uniform vec2 scale = vec2(0.25, 0.45);
+uniform vec2 scaleIn = vec2(4, 2.2222);
+uniform vec4 deviceWarpParam = vec4(1, 0.22, 0.24, 0);
+uniform vec4 chromaAbParam = vec4(0.996, -0.004, 1.014, 0.0);
+
+void main()
+{
+ // Compute lens distortion
+ vec2 lensCenter = fragTexCoord.x < 0.5? leftLensCenter : rightLensCenter;
+ vec2 screenCenter = fragTexCoord.x < 0.5? leftScreenCenter : rightScreenCenter;
+ vec2 theta = (fragTexCoord - lensCenter)*scaleIn;
+ float rSq = theta.x*theta.x + theta.y*theta.y;
+ vec2 theta1 = theta*(deviceWarpParam.x + deviceWarpParam.y*rSq + deviceWarpParam.z*rSq*rSq + deviceWarpParam.w*rSq*rSq*rSq);
+ vec2 thetaBlue = theta1*(chromaAbParam.z + chromaAbParam.w*rSq);
+ vec2 tcBlue = lensCenter + scale*thetaBlue;
+
+ if (any(bvec2(clamp(tcBlue, screenCenter - vec2(0.25, 0.5), screenCenter + vec2(0.25, 0.5)) - tcBlue)))
+ {
+ // Set black fragment for everything outside the lens border
+ finalColor = vec4(0.0, 0.0, 0.0, 1.0);
+ }
+ else
+ {
+ // Compute color chroma aberration
+ float blue = texture(texture0, tcBlue).b;
+ vec2 tcGreen = lensCenter + scale*theta1;
+ float green = texture(texture0, tcGreen).g;
+
+ vec2 thetaRed = theta1*(chromaAbParam.x + chromaAbParam.y*rSq);
+ vec2 tcRed = lensCenter + scale*thetaRed;
+
+ float red = texture(texture0, tcRed).r;
+ finalColor = vec4(red, green, blue, 1.0);
+ }
+}
diff --git a/deps/raylib/examples/core/resources/ps3.png b/deps/raylib/examples/core/resources/ps3.png
new file mode 100644
index 0000000..59c0b35
--- /dev/null
+++ b/deps/raylib/examples/core/resources/ps3.png
Binary files differ
diff --git a/deps/raylib/examples/core/resources/xbox.png b/deps/raylib/examples/core/resources/xbox.png
new file mode 100644
index 0000000..1a57058
--- /dev/null
+++ b/deps/raylib/examples/core/resources/xbox.png
Binary files differ