diff --git a/examples/Makefile b/examples/Makefile
index 6e2853edb93e..5cef8156a2ca 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -564,6 +564,7 @@ SHAPES = \
shapes/shapes_ring_drawing \
shapes/shapes_rounded_rectangle_drawing \
shapes/shapes_splines_drawing \
+ shapes/shapes_starfield \
shapes/shapes_top_down_lights \
shapes/shapes_triangle_strip \
shapes/shapes_vector_angle
diff --git a/examples/Makefile.Web b/examples/Makefile.Web
index f1662a301843..76739d705a87 100644
--- a/examples/Makefile.Web
+++ b/examples/Makefile.Web
@@ -564,6 +564,7 @@ SHAPES = \
shapes/shapes_ring_drawing \
shapes/shapes_rounded_rectangle_drawing \
shapes/shapes_splines_drawing \
+ shapes/shapes_starfield \
shapes/shapes_top_down_lights \
shapes/shapes_triangle_strip \
shapes/shapes_vector_angle
diff --git a/examples/README.md b/examples/README.md
index 441c5a368774..36be8a527f55 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -17,7 +17,7 @@ You may find it easier to use than other toolchains, especially when it comes to
- `zig build [module]` to compile all examples for a module (e.g. `zig build core`)
- `zig build [example]` to compile _and run_ a particular example (e.g. `zig build core_basic_window`)
-## EXAMPLES COLLECTION [TOTAL: 175]
+## EXAMPLES COLLECTION [TOTAL: 176]
### category: core [40]
@@ -66,7 +66,7 @@ Examples using raylib[core](../src/rcore.c) platform functionality like window c
| [core_undo_redo](core/core_undo_redo.c) |
| ⭐⭐⭐☆ | 5.5 | 5.6 | [Ramon Santamaria](https://github.com/raysan5) |
| [core_input_actions](core/core_input_actions.c) |
| ⭐⭐☆☆ | 5.5 | 5.6 | [Jett](https://github.com/JettMonstersGoBoom) |
-### category: shapes [26]
+### category: shapes [27]
Examples using raylib shapes drawing functionality, provided by raylib [shapes](../src/rshapes.c) module.
@@ -92,6 +92,7 @@ Examples using raylib shapes drawing functionality, provided by raylib [shapes](
| [shapes_top_down_lights](shapes/shapes_top_down_lights.c) |
| ⭐⭐⭐⭐️ | 4.2 | 4.2 | [Jeffery Myers](https://github.com/JeffM2501) |
| [shapes_rectangle_advanced](shapes/shapes_rectangle_advanced.c) |
| ⭐⭐⭐⭐️ | 5.5 | 5.5 | [Everton Jr.](https://github.com/evertonse) |
| [shapes_splines_drawing](shapes/shapes_splines_drawing.c) |
| ⭐⭐⭐☆ | 5.0 | 5.0 | [Ramon Santamaria](https://github.com/raysan5) |
+| [shapes_starfield](shapes/shapes_starfield.c) |
| ⭐⭐⭐☆ | 5.5 | 5.5 | [JP Mortiboys](https://github.com/themushroompirates) |
| [shapes_digital_clock](shapes/shapes_digital_clock.c) |
| ⭐⭐⭐⭐️ | 5.5 | 5.6 | [Hamza RAHAL](https://github.com/hmz-rhl) |
| [shapes_double_pendulum](shapes/shapes_double_pendulum.c) |
| ⭐⭐☆☆ | 5.5 | 5.5 | [JoeCheong](https://github.com/Joecheong2006) |
| [shapes_dashed_line](shapes/shapes_dashed_line.c) |
| ⭐☆☆☆ | 5.5 | 5.5 | [Luís Almeida](https://github.com/luis605) |
diff --git a/examples/shapes/shapes_starfield.c b/examples/shapes/shapes_starfield.c
new file mode 100644
index 000000000000..457912dec05b
--- /dev/null
+++ b/examples/shapes/shapes_starfield.c
@@ -0,0 +1,143 @@
+/*******************************************************************************************
+*
+* raylib [shapes] example - simple starfield
+*
+* Example complexity rating: [★☆☆☆] 1/4
+*
+* Example originally created with raylib 5.5
+*
+* Example contributed by JP Mortiboys (@themushroompirates) 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 JP Mortiboys (@themushroompirates)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include "raymath.h" // Required for: Lerp()
+
+#define STAR_COUNT 420
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shapes] example - starfield");
+
+ Color bgColor = ColorLerp(DARKBLUE, BLACK, 0.69f);
+
+ // Speed at which we fly forward
+ float speed = 10.0f/9.0f;
+
+ // We're either drawing lines or circles
+ bool drawLines = true;
+
+ Vector3 stars[STAR_COUNT] = { 0 };
+ Vector2 starsScreenPos[STAR_COUNT] = { 0 };
+
+ // Setup the stars with a random position
+ for (int i = 0; i < STAR_COUNT; i++) {
+ stars[i].x = GetRandomValue(-screenWidth*.5, screenWidth*.5);
+ stars[i].y = GetRandomValue(-screenHeight*.5, screenHeight*.5);
+ stars[i].z = 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
+ //----------------------------------------------------------------------------------
+
+ // Change speed based on number keys
+ for (int i = 0; i <= 9; i++) {
+ if (IsKeyPressed(KEY_ZERO + i)) {
+ speed = 2.0f * (float)i / 9.0f;
+ }
+ }
+
+ // Toggle lines / points with space bar
+ if (IsKeyPressed(KEY_SPACE)) {
+ drawLines = !drawLines;
+ }
+
+ float dt = GetFrameTime();
+ for (int i = 0; i < STAR_COUNT; i++) {
+ // Update star's timer
+ stars[i].z -= dt * speed;
+ // Calculate the screen position
+ starsScreenPos[i] = (Vector2) {
+ screenWidth*.5f + stars[i].x / stars[i].z,
+ screenHeight*.5f + stars[i].y / stars[i].z,
+ };
+ // If the star is too old, or offscreen, it dies and we make a new random one
+ if (stars[i].z < 0.0f
+ || starsScreenPos[i].x < 0 || starsScreenPos[i].y < 0.0f
+ || starsScreenPos[i].x > screenWidth || starsScreenPos[i].y > screenHeight) {
+ stars[i].x = GetRandomValue(-screenWidth*.5, screenWidth*.5);
+ stars[i].y = GetRandomValue(-screenHeight*.5, screenHeight*.5);
+ stars[i].z = 1.0f;
+ }
+ }
+
+
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(bgColor);
+
+ for (int i = 0; i < STAR_COUNT; i++) {
+ if (drawLines) {
+ // Get the time a little while ago for this star, but clamp it
+ float t = Clamp(stars[i].z + 1.0f/32.0f, 0.0f, 1.0f);
+ // If it's different enough from the current time, we proceed
+ if (t - stars[i].z > 1e-3) {
+ // Calculate the screen position of the old point
+ Vector2 startPos = (Vector2) {
+ screenWidth*.5f + stars[i].x / t,
+ screenHeight*.5f + stars[i].y / t,
+ };
+ // Draw a line connecting the old point to the current point
+ DrawLineV(startPos, starsScreenPos[i], RAYWHITE);
+ }
+ }
+ else {
+ // Make the radius grow as the star ages
+ float radius = Lerp(stars[i].z, 1.0f, 5.0f);
+ // Draw the circle
+ DrawCircleV(starsScreenPos[i], radius, RAYWHITE);
+ }
+ }
+
+ DrawFPS(10, 10);
+
+ DrawText(TextFormat("Current Speed: %.0f [Number keys to change]", 9.0f * speed / 2.0f), 10, 30, 20, RAYWHITE);
+ DrawText(TextFormat("Drawing %s [Space to change]", drawLines ? "Lines" : "Circles"), 10, 50, 20, RAYWHITE);
+
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
\ No newline at end of file
diff --git a/examples/shapes/shapes_starfield.png b/examples/shapes/shapes_starfield.png
new file mode 100644
index 000000000000..6903f222b5e0
Binary files /dev/null and b/examples/shapes/shapes_starfield.png differ