From eee9dd8c944331dd804752383692076ab4d2790e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnis=20Aldi=C5=86=C5=A1=20=22NeZv=C4=93rs?= Date: Mon, 23 Jun 2025 13:03:35 +0300 Subject: [PATCH 1/8] Example: core_3d_fps_controller Quake like camera animations and strafe jump movement --- examples/Makefile | 1 + examples/Makefile.Web | 4 + examples/core/core_3d_fps_controller.c | 360 +++++++++++++++++++++++++ examples/core/resources/huh_jump.wav | Bin 0 -> 19050 bytes 4 files changed, 365 insertions(+) create mode 100644 examples/core/core_3d_fps_controller.c create mode 100644 examples/core/resources/huh_jump.wav diff --git a/examples/Makefile b/examples/Makefile index 32a3a75ab..edd2eb399 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -500,6 +500,7 @@ CORE = \ core/core_3d_camera_free \ core/core_3d_camera_mode \ core/core_3d_camera_split_screen \ + core/core_3d_fps_controller \ core/core_3d_picking \ core/core_automation_events \ core/core_basic_screen_manager \ diff --git a/examples/Makefile.Web b/examples/Makefile.Web index 35ae70a18..5ba550eb0 100644 --- a/examples/Makefile.Web +++ b/examples/Makefile.Web @@ -382,6 +382,7 @@ CORE = \ core/core_3d_camera_free \ core/core_3d_camera_mode \ core/core_3d_camera_split_screen \ + core/core_3d_fps_controller \ core/core_3d_picking \ core/core_automation_events \ core/core_basic_screen_manager \ @@ -587,6 +588,9 @@ core/core_3d_camera_mode: core/core_3d_camera_mode.c core/core_3d_camera_split_screen: core/core_3d_camera_split_screen.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) +core/core_3d_fps_controller: core/core_3d_fps_controller.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) + core/core_3d_picking: core/core_3d_picking.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) diff --git a/examples/core/core_3d_fps_controller.c b/examples/core/core_3d_fps_controller.c new file mode 100644 index 000000000..56d8c4543 --- /dev/null +++ b/examples/core/core_3d_fps_controller.c @@ -0,0 +1,360 @@ +/******************************************************************************************* +* +* raylib [core] example - Input Gestures for Web +* +* Example complexity rating: [★★★☆] 3/4 +* +* Example originally created with raylib 5.5 +* +* Example contributed by Agnis Aldins (@nezvers) and reviewed by Ramon Santamaria (@raysan5) +* +* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software +* +* Copyright (c) 2025-2025 Agnis Aldins (@nezvers) +* +********************************************************************************************/ + +#include "raylib.h" +#include "raymath.h" +#include "rcamera.h" + +//#define PLATFORM_WEB + +#if defined(PLATFORM_WEB) +#include +#endif + +#if defined(PLATFORM_DESKTOP) +#define GLSL_VERSION 330 +#else // PLATFORM_ANDROID, PLATFORM_WEB +#define GLSL_VERSION 100 +#endif + + +/* Movement constants */ +#define GRAVITY 32.f +#define MAX_SPEED 20.f +#define CROUCH_SPEED 5.f +#define JUMP_FORCE 12.f +#define MAX_ACCEL 150.f +/* Grounded drag */ +#define FRICTION 0.86f +/* Increasing air drag, increases strafing speed */ +#define AIR_DRAG 0.98f +/* Responsiveness for turning movement direction to looked direction */ +#define CONTROL 15.f +#define CROUCH_HEIGHT 0.f +#define STAND_HEIGHT 1.f +#define BOTTOM_HEIGHT 0.5f + +#define NORMALIZE_INPUT 0 + +typedef struct { + Vector3 position; + Vector3 velocity; + Vector3 dir; + bool isGrounded; + Sound soundJump; +}Body; + +const int screenWidth = 1280; +const int screenHeight = 720; +Vector2 sensitivity = { 0.001f, 0.001f }; + +Body player; +Camera camera; +Vector2 lookRotation = { 0 }; +float headTimer; +float walkLerp; +float headLerp; +Vector2 lean; + +void UpdateDrawFrame(void); // Update and Draw one frame + +void DrawLevel(); + +void UpdateCameraAngle(Camera* camera, Vector2* rot, float headTimer, float walkLerp, Vector2 lean); + +void UpdateBody(Body* body, float rot, char side, char forward, bool jumpPressed, bool crouchHold); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "Raylib Quake-like controller"); + InitAudioDevice(); + + player = (Body){ Vector3Zero(), Vector3Zero(), Vector3Zero(), false, LoadSound("resources/huh_jump.wav")}; + camera = (Camera){ 0 }; + camera.fovy = 60.f; // Camera field-of-view Y + camera.projection = CAMERA_PERSPECTIVE; // Camera projection type + + lookRotation = Vector2Zero(); + headTimer = 0.f; + walkLerp = 0.f; + headLerp = STAND_HEIGHT; + lean = Vector2Zero(); + + camera.position = (Vector3){ + player.position.x, + player.position.y + (BOTTOM_HEIGHT + headLerp), + player.position.z, + }; + UpdateCameraAngle(&camera, &lookRotation, headTimer, walkLerp, lean); + + DisableCursor(); // Limit cursor to relative movement inside the 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 + //-------------------------------------------------------------------------------------- + UnloadSound(player.soundJump); + CloseAudioDevice(); + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + +void UpdateDrawFrame(void) +{ + // Update + //---------------------------------------------------------------------------------- + + Vector2 mouse_delta = GetMouseDelta(); + lookRotation.x -= mouse_delta.x * sensitivity.x; + lookRotation.y += mouse_delta.y * sensitivity.y; + + char sideway = (IsKeyDown(KEY_D) - IsKeyDown(KEY_A)); + char forward = (IsKeyDown(KEY_W) - IsKeyDown(KEY_S)); + bool crouching = IsKeyDown(KEY_LEFT_CONTROL); + UpdateBody(&player, lookRotation.x, sideway, forward, IsKeyPressed(KEY_SPACE), crouching); + + float delta = GetFrameTime(); + headLerp = Lerp(headLerp, (crouching ? CROUCH_HEIGHT : STAND_HEIGHT), 20.f * delta); + camera.position = (Vector3){ + player.position.x, + player.position.y + (BOTTOM_HEIGHT + headLerp), + player.position.z, + }; + + if (player.isGrounded && (forward != 0 || sideway != 0)) { + headTimer += delta * 3.f; + walkLerp = Lerp(walkLerp, 1.f, 10.f * delta); + camera.fovy = Lerp(camera.fovy, 55.f, 5.f * delta); + } + else { + walkLerp = Lerp(walkLerp, 0.f, 10.f * delta); + camera.fovy = Lerp(camera.fovy, 60.f, 5.f * delta); + } + + lean.x = Lerp(lean.x, sideway * 0.02f, 10.f * delta); + lean.y = Lerp(lean.y, forward * 0.015f, 10.f * delta); + + UpdateCameraAngle(&camera, &lookRotation, headTimer, walkLerp, lean); + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + BeginMode3D(camera); + + DrawLevel(); + + EndMode3D(); + + // Draw info box + 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(TextFormat("- Velocity Len: (%06.3f)", Vector2Length((Vector2) { player.velocity.x, player.velocity.z })), 15, 60, 10, BLACK); + + + EndDrawing(); + //---------------------------------------------------------------------------------- +} + +void UpdateBody(Body* body, float rot, char side, char forward, bool jumpPressed, bool crouchHold) +{ + Vector2 input = (Vector2){ (float)side, (float)-forward }; +#if defined(NORMALIZE_INPUT) + // Slow down diagonal movement + if (side != 0 & forward != 0) + { + input = Vector2Normalize(input); + } +#endif + + float delta = GetFrameTime(); + + if (!body->isGrounded) + { + body->velocity.y -= GRAVITY * delta; + } + if (body->isGrounded && jumpPressed) + { + body->velocity.y = JUMP_FORCE; + body->isGrounded = false; + SetSoundPitch(body->soundJump, 1.f + (GetRandomValue(-100, 100) * 0.001)); + PlaySound(body->soundJump); + } + + Vector3 front_vec = (Vector3){ sin(rot), 0.f, cos(rot) }; + Vector3 right_vec = (Vector3){ cos(-rot), 0.f, sin(-rot) }; + + Vector3 desired_dir = (Vector3){ + input.x * right_vec.x + input.y * front_vec.x, + 0.f, + input.x * right_vec.z + input.y * front_vec.z, + }; + + body->dir = Vector3Lerp(body->dir, desired_dir, CONTROL * delta); + + float decel = body->isGrounded ? FRICTION : AIR_DRAG; + Vector3 hvel = (Vector3){ + body->velocity.x * decel, + 0.f, + body->velocity.z * decel + }; + + float hvel_length = Vector3Length(hvel); // a.k.a. magnitude + if (hvel_length < MAX_SPEED * 0.01f) { + hvel = (Vector3){ 0 }; + } + + /* This is what creates strafing */ + float speed = Vector3DotProduct(hvel, body->dir); + + /* + Whenever the amount of acceleration to add is clamped by the maximum acceleration constant, + a Player can make the speed faster by bringing the direction closer to horizontal velocity angle + More info here: https://youtu.be/v3zT3Z5apaM?t=165 + */ + float max_speed = crouchHold ? CROUCH_SPEED : MAX_SPEED; + float accel = Clamp(max_speed - speed, 0.f, MAX_ACCEL * delta); + hvel.x += body->dir.x * accel; + hvel.z += body->dir.z * accel; + + body->velocity.x = hvel.x; + body->velocity.z = hvel.z; + + body->position.x += body->velocity.x * delta; + body->position.y += body->velocity.y * delta; + body->position.z += body->velocity.z * delta; + + /* Fancy collision system against "THE FLOOR" */ + if (body->position.y <= 0.f) + { + body->position.y = 0.f; + body->velocity.y = 0.f; + body->isGrounded = true; // <= enables jumping + } +} + +void UpdateCameraAngle(Camera* camera, Vector2* rot, float headTimer, float walkLerp, Vector2 lean) +{ + const Vector3 up = (Vector3){ 0.f, 1.f, 0.f }; + const Vector3 targetOffset = (Vector3){ 0.f, 0.f, -1.f }; + + /* Left & Right */ + Vector3 yaw = Vector3RotateByAxisAngle(targetOffset, up, rot->x); + + // Clamp view up + float maxAngleUp = Vector3Angle(up, yaw); + maxAngleUp -= 0.001f; // avoid numerical errors + if ( -(rot->y) > maxAngleUp) { rot->y = -maxAngleUp; } + + // Clamp view down + float maxAngleDown = Vector3Angle(Vector3Negate(up), yaw); + maxAngleDown *= -1.0f; // downwards angle is negative + maxAngleDown += 0.001f; // avoid numerical errors + if ( -(rot->y) < maxAngleDown) { rot->y = -maxAngleDown; } + + /* Up & Down */ + Vector3 right = Vector3Normalize(Vector3CrossProduct(yaw, up)); + + // Rotate view vector around right axis + Vector3 pitch = Vector3RotateByAxisAngle(yaw, right, -rot->y - lean.y); + + // Head animation + // Rotate up direction around forward axis + float _sin = sin(headTimer * PI); + float _cos = cos(headTimer * PI); + const float stepRotation = 0.01f; + camera->up = Vector3RotateByAxisAngle(up, pitch, _sin * stepRotation + lean.x); + + /* BOB */ + const float bobSide = 0.1f; + const float bobUp = 0.15f; + Vector3 bobbing = Vector3Scale(right, _sin * bobSide); + bobbing.y = fabsf(_cos * bobUp); + camera->position = Vector3Add(camera->position, Vector3Scale(bobbing, walkLerp)); + + camera->target = Vector3Add(camera->position, pitch); +} + + +void DrawLevel() +{ + const int floorExtent = 25; + const float tileSize = 5.f; + const Color tileColor1 = (Color){ 150, 200, 200, 255 }; + // Floor tiles + for (int y = -floorExtent; y < floorExtent; y++) + { + for (int x = -floorExtent; x < floorExtent; x++) + { + if ((y & 1) && (x & 1)) + { + DrawPlane((Vector3) { x * tileSize, 0.f, y * tileSize}, + (Vector2) {tileSize, tileSize}, tileColor1); + } + else if(!(y & 1) && !(x & 1)) + { + DrawPlane((Vector3) { x * tileSize, 0.f, y * tileSize}, + (Vector2) {tileSize, tileSize}, LIGHTGRAY); + } + } + } + + const Vector3 towerSize = (Vector3){ 16.f, 32.f, 16.f }; + const Color towerColor = (Color){ 150, 200, 200, 255 }; + + Vector3 towerPos = (Vector3){ 16.f, 16.f, 16.f }; + DrawCubeV(towerPos, towerSize, towerColor); + DrawCubeWiresV(towerPos, towerSize, DARKBLUE); + + towerPos.x *= -1; + DrawCubeV(towerPos, towerSize, towerColor); + DrawCubeWiresV(towerPos, towerSize, DARKBLUE); + + towerPos.z *= -1; + DrawCubeV(towerPos, towerSize, towerColor); + DrawCubeWiresV(towerPos, towerSize, DARKBLUE); + + towerPos.x *= -1; + DrawCubeV(towerPos, towerSize, towerColor); + DrawCubeWiresV(towerPos, towerSize, DARKBLUE); +} + diff --git a/examples/core/resources/huh_jump.wav b/examples/core/resources/huh_jump.wav new file mode 100644 index 0000000000000000000000000000000000000000..9ca8a2e683ef87d19f594be54d04a40dd0bade10 GIT binary patch literal 19050 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 Date: Mon, 23 Jun 2025 13:15:14 +0300 Subject: [PATCH 2/8] change game's resolution --- examples/core/core_3d_fps_controller.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/core/core_3d_fps_controller.c b/examples/core/core_3d_fps_controller.c index 56d8c4543..ff348daef 100644 --- a/examples/core/core_3d_fps_controller.c +++ b/examples/core/core_3d_fps_controller.c @@ -58,8 +58,8 @@ typedef struct { Sound soundJump; }Body; -const int screenWidth = 1280; -const int screenHeight = 720; +const int screenWidth = 800; +const int screenHeight = 450; Vector2 sensitivity = { 0.001f, 0.001f }; Body player; From 4233544670c9a2ef9a30e4dcbe747395efea7c85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnis=20Aldi=C5=86=C5=A1=20=22NeZv=C4=93rs?= Date: Mon, 23 Jun 2025 13:32:08 +0300 Subject: [PATCH 3/8] Update core_3d_fps_controller.c --- examples/core/core_3d_fps_controller.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/core/core_3d_fps_controller.c b/examples/core/core_3d_fps_controller.c index ff348daef..d4936388b 100644 --- a/examples/core/core_3d_fps_controller.c +++ b/examples/core/core_3d_fps_controller.c @@ -356,5 +356,7 @@ void DrawLevel() towerPos.x *= -1; DrawCubeV(towerPos, towerSize, towerColor); DrawCubeWiresV(towerPos, towerSize, DARKBLUE); -} + // Red sun + DrawSphere((Vector3) { 300.f, 300.f, 0.f }, 100.f, (Color) { 255, 0, 0, 255 }); +} From a2cf878190569f2d37c90ff475594d90205eafb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnis=20Aldi=C5=86=C5=A1=20=22NeZv=C4=93rs?= Date: Mon, 23 Jun 2025 13:43:38 +0300 Subject: [PATCH 4/8] cleanup variable shadowing --- examples/core/core_3d_fps_controller.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/core/core_3d_fps_controller.c b/examples/core/core_3d_fps_controller.c index d4936388b..3a21ac2dd 100644 --- a/examples/core/core_3d_fps_controller.c +++ b/examples/core/core_3d_fps_controller.c @@ -74,7 +74,7 @@ void UpdateDrawFrame(void); // Update and Draw one frame void DrawLevel(); -void UpdateCameraAngle(Camera* camera, Vector2* rot, float headTimer, float walkLerp, Vector2 lean); +void UpdateCameraAngle(); void UpdateBody(Body* body, float rot, char side, char forward, bool jumpPressed, bool crouchHold); @@ -167,7 +167,7 @@ void UpdateDrawFrame(void) lean.x = Lerp(lean.x, sideway * 0.02f, 10.f * delta); lean.y = Lerp(lean.y, forward * 0.015f, 10.f * delta); - UpdateCameraAngle(&camera, &lookRotation, headTimer, walkLerp, lean); + UpdateCameraAngle(); // Draw //---------------------------------------------------------------------------------- @@ -272,46 +272,46 @@ void UpdateBody(Body* body, float rot, char side, char forward, bool jumpPressed } } -void UpdateCameraAngle(Camera* camera, Vector2* rot, float headTimer, float walkLerp, Vector2 lean) +void UpdateCameraAngle() { const Vector3 up = (Vector3){ 0.f, 1.f, 0.f }; const Vector3 targetOffset = (Vector3){ 0.f, 0.f, -1.f }; /* Left & Right */ - Vector3 yaw = Vector3RotateByAxisAngle(targetOffset, up, rot->x); + Vector3 yaw = Vector3RotateByAxisAngle(targetOffset, up, lookRotation.x); // Clamp view up float maxAngleUp = Vector3Angle(up, yaw); maxAngleUp -= 0.001f; // avoid numerical errors - if ( -(rot->y) > maxAngleUp) { rot->y = -maxAngleUp; } + if ( -(lookRotation.y) > maxAngleUp) { lookRotation.y = -maxAngleUp; } // Clamp view down float maxAngleDown = Vector3Angle(Vector3Negate(up), yaw); maxAngleDown *= -1.0f; // downwards angle is negative maxAngleDown += 0.001f; // avoid numerical errors - if ( -(rot->y) < maxAngleDown) { rot->y = -maxAngleDown; } + if ( -(lookRotation.y) < maxAngleDown) { lookRotation.y = -maxAngleDown; } /* Up & Down */ Vector3 right = Vector3Normalize(Vector3CrossProduct(yaw, up)); // Rotate view vector around right axis - Vector3 pitch = Vector3RotateByAxisAngle(yaw, right, -rot->y - lean.y); + Vector3 pitch = Vector3RotateByAxisAngle(yaw, right, -lookRotation.y - lean.y); // Head animation // Rotate up direction around forward axis float _sin = sin(headTimer * PI); float _cos = cos(headTimer * PI); const float stepRotation = 0.01f; - camera->up = Vector3RotateByAxisAngle(up, pitch, _sin * stepRotation + lean.x); + camera.up = Vector3RotateByAxisAngle(up, pitch, _sin * stepRotation + lean.x); /* BOB */ const float bobSide = 0.1f; const float bobUp = 0.15f; Vector3 bobbing = Vector3Scale(right, _sin * bobSide); bobbing.y = fabsf(_cos * bobUp); - camera->position = Vector3Add(camera->position, Vector3Scale(bobbing, walkLerp)); + camera.position = Vector3Add(camera.position, Vector3Scale(bobbing, walkLerp)); - camera->target = Vector3Add(camera->position, pitch); + camera.target = Vector3Add(camera.position, pitch); } From fca2317640dc32e231316e33a0967cee70382c02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnis=20Aldi=C5=86=C5=A1=20=22NeZv=C4=93rs?= Date: Mon, 23 Jun 2025 13:44:50 +0300 Subject: [PATCH 5/8] remove //#define PLATFORM_WEB --- examples/core/core_3d_fps_controller.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/core/core_3d_fps_controller.c b/examples/core/core_3d_fps_controller.c index 3a21ac2dd..ddb25ba8a 100644 --- a/examples/core/core_3d_fps_controller.c +++ b/examples/core/core_3d_fps_controller.c @@ -19,8 +19,6 @@ #include "raymath.h" #include "rcamera.h" -//#define PLATFORM_WEB - #if defined(PLATFORM_WEB) #include #endif From fa9653d179b56a1c663f0e34a7167c2f6f3c299d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnis=20Aldi=C5=86=C5=A1=20=22NeZv=C4=93rs?= Date: Mon, 23 Jun 2025 13:50:24 +0300 Subject: [PATCH 6/8] Fix function call --- examples/core/core_3d_fps_controller.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/core/core_3d_fps_controller.c b/examples/core/core_3d_fps_controller.c index ddb25ba8a..c4ef367e9 100644 --- a/examples/core/core_3d_fps_controller.c +++ b/examples/core/core_3d_fps_controller.c @@ -102,7 +102,7 @@ int main(void) player.position.y + (BOTTOM_HEIGHT + headLerp), player.position.z, }; - UpdateCameraAngle(&camera, &lookRotation, headTimer, walkLerp, lean); + UpdateCameraAngle(); DisableCursor(); // Limit cursor to relative movement inside the window From f6b7168ed4c2c70d15c01ed9f3710e8c976b7452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnis=20Aldi=C5=86=C5=A1=20=22NeZv=C4=93rs?= Date: Mon, 23 Jun 2025 16:06:46 +0300 Subject: [PATCH 7/8] Add preview image --- examples/core/core_3d_fps_controller.png | Bin 0 -> 16483 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/core/core_3d_fps_controller.png diff --git a/examples/core/core_3d_fps_controller.png b/examples/core/core_3d_fps_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..65a908d529e5eeb82682af2230caf35d1877b4b2 GIT binary patch literal 16483 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 literal 0 HcmV?d00001 From ed022e89e5aabd91c80288df0c671efb4c7e9492 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnis=20Aldi=C5=86=C5=A1=20=22NeZv=C4=93rs?= Date: Mon, 23 Jun 2025 16:22:14 +0300 Subject: [PATCH 8/8] fix preview crop --- examples/core/core_3d_fps_controller.png | Bin 16483 -> 9083 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/core/core_3d_fps_controller.png b/examples/core/core_3d_fps_controller.png index 65a908d529e5eeb82682af2230caf35d1877b4b2..d4f83482ffbc77da8353983100d6590071719d23 100644 GIT binary patch literal 9083 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 V2;Vf*W?*1o@O1TaS?83{1OW3r=#BsY literal 16483 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