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) | core_undo_redo | ⭐⭐⭐☆ | 5.5 | 5.6 | [Ramon Santamaria](https://github.com/raysan5) | | [core_input_actions](core/core_input_actions.c) | core_input_actions | ⭐⭐☆☆ | 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) | shapes_following_eyes | ⭐⭐☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) | | [shapes_easings_ball](shapes/shapes_easings_ball.c) | shapes_easings_ball | ⭐⭐☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) | | [shapes_easings_box](shapes/shapes_easings_box.c) | shapes_easings_box | ⭐⭐☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) | +| [shapes_recursive_tree](shapes/shapes_recursive_tree.c) | shapes_recursive_tree | ⭐⭐⭐☆ | 5.6-dev | 5.6-dev| [Jopestpe](https://github.com/jopestpe) | | [shapes_easings_rectangles](shapes/shapes_easings_rectangles.c) | shapes_easings_rectangles | ⭐⭐⭐☆ | 2.0 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) | | [shapes_ring_drawing](shapes/shapes_ring_drawing.c) | shapes_ring_drawing | ⭐⭐⭐☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) | | [shapes_circle_sector_drawing](shapes/shapes_circle_sector_drawing.c) | shapes_circle_sector_drawing | ⭐⭐⭐☆ | 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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 TbaU`uiYRo?8EWRAvAy$Ow;RBh literal 0 HcmV?d00001