From 8b909583234c1a1018903bf7dec37ea13b5c663e Mon Sep 17 00:00:00 2001
From: Jopestpe <47086979+Jopestpe@users.noreply.github.com>
Date: Thu, 2 Oct 2025 15:12:14 -0300
Subject: [PATCH] ADDED: example: shapes_recursive_tree
---
examples/Makefile | 1 +
examples/Makefile.Web | 4 +
examples/README.md | 5 +-
examples/examples_list.txt | 1 +
examples/shapes/shapes_recursive_tree.c | 103 ++++++++++++++++++++++
examples/shapes/shapes_recursive_tree.png | Bin 0 -> 13440 bytes
6 files changed, 112 insertions(+), 2 deletions(-)
create mode 100644 examples/shapes/shapes_recursive_tree.c
create mode 100644 examples/shapes/shapes_recursive_tree.png
diff --git a/examples/Makefile b/examples/Makefile
index fb33b4894..a36b9e447 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -559,6 +559,7 @@ SHAPES = \
shapes/shapes_logo_raylib_anim \
shapes/shapes_rectangle_advanced \
shapes/shapes_rectangle_scaling \
+ shapes/shapes_recursive_tree \
shapes/shapes_ring_drawing \
shapes/shapes_rounded_rectangle_drawing \
shapes/shapes_splines_drawing \
diff --git a/examples/Makefile.Web b/examples/Makefile.Web
index 0dbefadf2..2d3018abf 100644
--- a/examples/Makefile.Web
+++ b/examples/Makefile.Web
@@ -559,6 +559,7 @@ SHAPES = \
shapes/shapes_logo_raylib_anim \
shapes/shapes_rectangle_advanced \
shapes/shapes_rectangle_scaling \
+ shapes/shapes_recursive_tree \
shapes/shapes_ring_drawing \
shapes/shapes_rounded_rectangle_drawing \
shapes/shapes_splines_drawing \
@@ -868,6 +869,9 @@ shapes/shapes_rectangle_advanced: shapes/shapes_rectangle_advanced.c
shapes/shapes_rectangle_scaling: shapes/shapes_rectangle_scaling.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+shapes/shapes_recursive_tree: shapes/shapes_recursive_tree.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
shapes/shapes_ring_drawing: shapes/shapes_ring_drawing.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
diff --git a/examples/README.md b/examples/README.md
index 70e07df2b..d852e7105 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: 172]
+## EXAMPLES COLLECTION [TOTAL: 173]
### 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 [23]
+### category: shapes [24]
Examples using raylib shapes drawing functionality, provided by raylib [shapes](../src/rshapes.c) module.
@@ -84,6 +84,7 @@ 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_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) |
diff --git a/examples/examples_list.txt b/examples/examples_list.txt
index 50643bf2b..5a0c679a4 100644
--- a/examples/examples_list.txt
+++ b/examples/examples_list.txt
@@ -60,6 +60,7 @@ shapes;shapes_following_eyes;★★☆☆;2.5;2.5;2013;2025;"Ramon Santamaria";@
shapes;shapes_easings_ball;★★☆☆;2.5;2.5;2014;2025;"Ramon Santamaria";@raysan5
shapes;shapes_easings_box;★★☆☆;2.5;2.5;2014;2025;"Ramon Santamaria";@raysan5
shapes;shapes_easings_rectangles;★★★☆;2.0;2.5;2014;2025;"Ramon Santamaria";@raysan5
+shapes;shapes_recursive_tree;★★★☆;5.6-dev;5.6-dev;2025;2025;"Jopestpe";@jopestpe
shapes;shapes_ring_drawing;★★★☆;2.5;2.5;2018;2025;"Vlad Adrian";@demizdor
shapes;shapes_circle_sector_drawing;★★★☆;2.5;2.5;2018;2025;"Vlad Adrian";@demizdor
shapes;shapes_rounded_rectangle_drawing;★★★☆;2.5;2.5;2018;2025;"Vlad Adrian";@demizdor
diff --git a/examples/shapes/shapes_recursive_tree.c b/examples/shapes/shapes_recursive_tree.c
new file mode 100644
index 000000000..c29899cc0
--- /dev/null
+++ b/examples/shapes/shapes_recursive_tree.c
@@ -0,0 +1,103 @@
+/*******************************************************************************************
+*
+* raylib [shapes] example - shapes recursive tree
+*
+* Example complexity rating: [★★★☆] 3/4
+*
+* Example originally created with raylib 5.6-dev, last time updated with raylib 5.6-dev
+*
+* Example contributed by Jopestpe (@jopestpe)
+*
+* 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-2025 Jopestpe (@jopestpe)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include
+
+#define RAYGUI_IMPLEMENTATION
+#include "raygui.h" // Required for GUI controls
+
+float theta;
+float thick = 1.0f;
+float branchDecay = 0.66f;
+bool bezier = false;
+
+void Branch(Vector2 start, float length, float angle) {
+ length *= branchDecay;
+
+ if (length > 2) {
+ Vector2 end = {
+ start.x + length * sinf(angle),
+ start.y - length * cosf(angle)
+ };
+
+ if(!bezier) DrawLineEx(start, end, thick, RED);
+ else DrawLineBezier(start, end, thick, RED);
+
+ Branch(end, length, angle + theta);
+ Branch(end, length, angle - theta);
+ }
+}
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shapes] example - shapes recursive tree");
+
+ Vector2 start = { (screenWidth / 2.0f) - 125, screenHeight };
+ Vector2 end = { (screenWidth / 2.0f) - 125, screenHeight - 120.0f };
+ float angle = 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
+ {
+ float a = (angle / screenWidth) * 90.0f;
+ theta = a * (PI / 180.0f);
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawLine(560, 0, 560, GetScreenHeight(), Fade(LIGHTGRAY, 0.6f));
+ DrawRectangle(560, 0, GetScreenWidth() - 500, GetScreenHeight(), Fade(LIGHTGRAY, 0.3f));
+
+ // Draw GUI controls
+ //------------------------------------------------------------------------------
+ GuiSliderBar((Rectangle){ 640, 40, 120, 20}, "Angle", TextFormat("%.2f", angle), &angle, 0, 1600);
+ GuiSliderBar((Rectangle){ 640, 70, 120, 20}, "Thick", TextFormat("%.2f", thick), &thick, 1, 8);
+ GuiSliderBar((Rectangle){ 640, 100, 120, 20}, "Branch Decay", TextFormat("%.2f", branchDecay), &branchDecay, 0.1f, 0.78f);
+ GuiCheckBox((Rectangle){ 640, 130, 20, 20 }, "Bezier", &bezier);
+ //------------------------------------------------------------------------------
+
+ DrawLineEx(start, end, thick, RED);
+ Branch(end, 120.0f, 0.0f);
+
+ DrawFPS(10, 10);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
\ No newline at end of file
diff --git a/examples/shapes/shapes_recursive_tree.png b/examples/shapes/shapes_recursive_tree.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a850284dd7bb5cd6103d4bbd897d472170794e1
GIT binary patch
literal 13440
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