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
literal 0
HcmV?d00001
From 9bf7699624fa0e761e0b82aa9dee3b268304e263 Mon Sep 17 00:00:00 2001
From: Hugo
Date: Wed, 8 Oct 2025 00:10:43 +0200
Subject: [PATCH 2/5] [examples] Added `shapes_kaleidoscope` (#5233)
* ADDED: example: `shapes_kaleidoscope`
* Add line reflection
* Updated with `rexm update`
* Follow raylib's conventions
---
examples/Makefile | 1 +
examples/Makefile.Web | 4 +
examples/README.md | 7 +-
examples/examples_list.txt | 1 +
examples/shapes/shapes_kaleidoscope.c | 92 +++
examples/shapes/shapes_kaleidoscope.png | Bin 0 -> 39307 bytes
.../examples/shapes_kaleidoscope.vcxproj | 569 ++++++++++++++++++
projects/VS2022/raylib.sln | 99 ++-
tools/rexm/examples_report.md | 3 +
9 files changed, 764 insertions(+), 12 deletions(-)
create mode 100644 examples/shapes/shapes_kaleidoscope.c
create mode 100644 examples/shapes/shapes_kaleidoscope.png
create mode 100644 projects/VS2022/examples/shapes_kaleidoscope.vcxproj
diff --git a/examples/Makefile b/examples/Makefile
index d5fb730ec..6e2853edb 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -554,6 +554,7 @@ SHAPES = \
shapes/shapes_easings_box \
shapes/shapes_easings_rectangles \
shapes/shapes_following_eyes \
+ shapes/shapes_kaleidoscope \
shapes/shapes_lines_bezier \
shapes/shapes_logo_raylib \
shapes/shapes_logo_raylib_anim \
diff --git a/examples/Makefile.Web b/examples/Makefile.Web
index c053528b6..f1662a301 100644
--- a/examples/Makefile.Web
+++ b/examples/Makefile.Web
@@ -554,6 +554,7 @@ SHAPES = \
shapes/shapes_easings_box \
shapes/shapes_easings_rectangles \
shapes/shapes_following_eyes \
+ shapes/shapes_kaleidoscope \
shapes/shapes_lines_bezier \
shapes/shapes_logo_raylib \
shapes/shapes_logo_raylib_anim \
@@ -855,6 +856,9 @@ shapes/shapes_easings_rectangles: shapes/shapes_easings_rectangles.c
shapes/shapes_following_eyes: shapes/shapes_following_eyes.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+shapes/shapes_kaleidoscope: shapes/shapes_kaleidoscope.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
shapes/shapes_lines_bezier: shapes/shapes_lines_bezier.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
diff --git a/examples/README.md b/examples/README.md
index 9f6784e65..441c5a368 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: 174]
+## EXAMPLES COLLECTION [TOTAL: 175]
### 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 [25]
+### category: shapes [26]
Examples using raylib shapes drawing functionality, provided by raylib [shapes](../src/rshapes.c) module.
@@ -84,8 +84,8 @@ Examples using raylib shapes drawing functionality, provided by raylib [shapes](
| [shapes_following_eyes](shapes/shapes_following_eyes.c) |
| ⭐⭐☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
| [shapes_easings_ball](shapes/shapes_easings_ball.c) |
| ⭐⭐☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
| [shapes_easings_box](shapes/shapes_easings_box.c) |
| ⭐⭐☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
-| [shapes_recursive_tree](shapes/shapes_recursive_tree.c) |
| ⭐⭐⭐☆ | 5.6-dev | 5.6-dev| [Jopestpe](https://github.com/jopestpe) |
| [shapes_easings_rectangles](shapes/shapes_easings_rectangles.c) |
| ⭐⭐⭐☆ | 2.0 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
+| [shapes_recursive_tree](shapes/shapes_recursive_tree.c) |
| ⭐⭐⭐☆ | 5.6-dev | 5.6-dev | [Jopestpe](https://github.com/jopestpe) |
| [shapes_ring_drawing](shapes/shapes_ring_drawing.c) |
| ⭐⭐⭐☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) |
| [shapes_circle_sector_drawing](shapes/shapes_circle_sector_drawing.c) |
| ⭐⭐⭐☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) |
| [shapes_rounded_rectangle_drawing](shapes/shapes_rounded_rectangle_drawing.c) |
| ⭐⭐⭐☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) |
@@ -97,6 +97,7 @@ Examples using raylib shapes drawing functionality, provided by raylib [shapes](
| [shapes_dashed_line](shapes/shapes_dashed_line.c) |
| ⭐☆☆☆ | 5.5 | 5.5 | [Luís Almeida](https://github.com/luis605) |
| [shapes_triangle_strip](shapes/shapes_triangle_strip.c) |
| ⭐⭐☆☆ | 5.6-dev | 5.6-dev | [Jopestpe](https://github.com/jopestpe) |
| [shapes_vector_angle](shapes/shapes_vector_angle.c) |
| ⭐⭐☆☆ | 1.0 | 5.0 | [Ramon Santamaria](https://github.com/raysan5) |
+| [shapes_kaleidoscope](shapes/shapes_kaleidoscope.c) |
| ⭐⭐☆☆ | 5.5 | 5.6 | [Hugo ARNAL](https://github.com/hugoarnal) |
### category: textures [26]
diff --git a/examples/examples_list.txt b/examples/examples_list.txt
index 879f5707b..c6f2a97b3 100644
--- a/examples/examples_list.txt
+++ b/examples/examples_list.txt
@@ -181,3 +181,4 @@ others;easings_testbed;★★★☆;2.5;3.0;2019;2025;"Juan Miguel López";@flas
others;raylib_opengl_interop;★★★★;3.8;4.0;2021;2025;"Stephan Soller";@arkanis
others;embedded_files_loading;★★☆☆;3.0;3.5;2020;2025;"Kristian Holmgren";@defutura
others;web_basic_window;★☆☆☆;5.6-dev;5.6-dev;2014;2025;"Ramon Santamaria";@raysan5
+shapes;shapes_kaleidoscope;★★☆☆;5.5;5.6;2025;2025;"Hugo ARNAL";@hugoarnal
diff --git a/examples/shapes/shapes_kaleidoscope.c b/examples/shapes/shapes_kaleidoscope.c
new file mode 100644
index 000000000..07c96344c
--- /dev/null
+++ b/examples/shapes/shapes_kaleidoscope.c
@@ -0,0 +1,92 @@
+/*******************************************************************************************
+*
+* raylib [shapes] example - kaleidoscope
+*
+* Example complexity rating: [★★☆☆] 2/4
+*
+* Example originally created with raylib 5.5, last time updated with raylib 5.6
+*
+* Example contributed by Hugo ARNAL (@hugoarnal) 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 Hugo ARNAL (@hugoarnal)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include "raymath.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shapes] example - kaleidoscope");
+
+ int symmetry = 6;
+ float angle = 360.0f/(float)symmetry;
+ float thickness = 3.0f;
+ Vector2 prevMousePos = { 0 };
+
+ SetTargetFPS(60);
+ ClearBackground(BLACK);
+
+ Vector2 offset = { (float)screenWidth/2.0f, (float)screenHeight/2.0f };
+ Camera2D camera = { 0 };
+ camera.target = (Vector2){ 0 };
+ camera.offset = offset;
+ camera.rotation = 0.0f;
+ camera.zoom = 1.0f;
+
+ Vector2 scaleVector = { 1.0f, -1.0f };
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ Vector2 mousePos = GetMousePosition();
+ Vector2 lineStart = Vector2Subtract(mousePos, offset);
+ Vector2 lineEnd = Vector2Subtract(prevMousePos, offset);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+ BeginMode2D(camera);
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) {
+ for (int i = 0; i < symmetry; i++) {
+ lineStart = Vector2Rotate(lineStart, angle*DEG2RAD);
+ lineEnd = Vector2Rotate(lineEnd, angle*DEG2RAD);
+
+ DrawLineEx(lineStart, lineEnd, thickness, WHITE);
+
+ Vector2 reflectLineStart = Vector2Multiply(lineStart, scaleVector);
+ Vector2 reflectLineEnd = Vector2Multiply(lineEnd, scaleVector);
+
+ DrawLineEx(reflectLineStart, reflectLineEnd, thickness, WHITE);
+ }
+ }
+
+ prevMousePos = mousePos;
+ EndMode2D();
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/examples/shapes/shapes_kaleidoscope.png b/examples/shapes/shapes_kaleidoscope.png
new file mode 100644
index 0000000000000000000000000000000000000000..d14571ab735c1d50b3dac244566dd5a8c04e4137
GIT binary patch
literal 39307
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