From 4cfae99a746b60d5747a0e20a16c84a5c4b0d2f6 Mon Sep 17 00:00:00 2001 From: Jopestpe <47086979+Jopestpe@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:25:22 -0300 Subject: [PATCH] [examples] Added `shapes_triangle_strip` (#5240) * [examples] Add shapes_triangle_strip * Remove functions --- examples/Makefile | 1 + examples/Makefile.Web | 4 + examples/README.md | 5 +- examples/examples_list.txt | 1 + examples/shapes/shapes_triangle_strip.c | 106 ++++++++++++++++++++++ examples/shapes/shapes_triangle_strip.png | Bin 0 -> 12694 bytes 6 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 examples/shapes/shapes_triangle_strip.c create mode 100644 examples/shapes/shapes_triangle_strip.png diff --git a/examples/Makefile b/examples/Makefile index a36b9e447..d5fb730ec 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -564,6 +564,7 @@ SHAPES = \ shapes/shapes_rounded_rectangle_drawing \ shapes/shapes_splines_drawing \ shapes/shapes_top_down_lights \ + shapes/shapes_triangle_strip \ shapes/shapes_vector_angle TEXTURES = \ diff --git a/examples/Makefile.Web b/examples/Makefile.Web index 2d3018abf..c053528b6 100644 --- a/examples/Makefile.Web +++ b/examples/Makefile.Web @@ -564,6 +564,7 @@ SHAPES = \ shapes/shapes_rounded_rectangle_drawing \ shapes/shapes_splines_drawing \ shapes/shapes_top_down_lights \ + shapes/shapes_triangle_strip \ shapes/shapes_vector_angle TEXTURES = \ @@ -884,6 +885,9 @@ shapes/shapes_splines_drawing: shapes/shapes_splines_drawing.c shapes/shapes_top_down_lights: shapes/shapes_top_down_lights.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) +shapes/shapes_triangle_strip: shapes/shapes_triangle_strip.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) + shapes/shapes_vector_angle: shapes/shapes_vector_angle.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) diff --git a/examples/README.md b/examples/README.md index d852e7105..9f6784e65 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: 173] +## EXAMPLES COLLECTION [TOTAL: 174] ### 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 [24] +### category: shapes [25] Examples using raylib shapes drawing functionality, provided by raylib [shapes](../src/rshapes.c) module. @@ -95,6 +95,7 @@ Examples using raylib shapes drawing functionality, provided by raylib [shapes]( | [shapes_digital_clock](shapes/shapes_digital_clock.c) | shapes_digital_clock | ⭐⭐⭐⭐️ | 5.5 | 5.6 | [Hamza RAHAL](https://github.com/hmz-rhl) | | [shapes_double_pendulum](shapes/shapes_double_pendulum.c) | shapes_double_pendulum | ⭐⭐☆☆ | 5.5 | 5.5 | [JoeCheong](https://github.com/Joecheong2006) | | [shapes_dashed_line](shapes/shapes_dashed_line.c) | shapes_dashed_line | ⭐☆☆☆ | 5.5 | 5.5 | [Luís Almeida](https://github.com/luis605) | +| [shapes_triangle_strip](shapes/shapes_triangle_strip.c) | shapes_triangle_strip | ⭐⭐☆☆ | 5.6-dev | 5.6-dev | [Jopestpe](https://github.com/jopestpe) | | [shapes_vector_angle](shapes/shapes_vector_angle.c) | shapes_vector_angle | ⭐⭐☆☆ | 1.0 | 5.0 | [Ramon Santamaria](https://github.com/raysan5) | ### category: textures [26] diff --git a/examples/examples_list.txt b/examples/examples_list.txt index 5a0c679a4..879f5707b 100644 --- a/examples/examples_list.txt +++ b/examples/examples_list.txt @@ -70,6 +70,7 @@ shapes;shapes_splines_drawing;★★★☆;5.0;5.0;2023;2025;"Ramon Santamaria"; shapes;shapes_digital_clock;★★★★;5.5;5.6;2025;2025;"Hamza RAHAL";@hmz-rhl shapes;shapes_double_pendulum;★★☆☆;5.5;5.5;2025;2025;"JoeCheong";@Joecheong2006 shapes;shapes_dashed_line;★☆☆☆;5.5;5.5;2025;2025;"Luís Almeida";@luis605 +shapes;shapes_triangle_strip;★★☆☆;5.6-dev;5.6-dev;2025;2025;"Jopestpe";@jopestpe shapes;shapes_vector_angle;★★☆☆;1.0;5.0;2023;2025;"Ramon Santamaria";@raysan5 textures;textures_logo_raylib;★☆☆☆;1.0;1.0;2014;2025;"Ramon Santamaria";@raysan5 textures;textures_srcrec_dstrec;★★★☆;1.3;1.3;2015;2025;"Ramon Santamaria";@raysan5 diff --git a/examples/shapes/shapes_triangle_strip.c b/examples/shapes/shapes_triangle_strip.c new file mode 100644 index 000000000..ee4556d25 --- /dev/null +++ b/examples/shapes/shapes_triangle_strip.c @@ -0,0 +1,106 @@ +/******************************************************************************************* +* +* raylib [shapes] example - triangle strip +* +* Example complexity rating: [★★☆☆] 2/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 + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [shapes] example - triangle strip"); + + Vector2 points[120] = { 0 }; + Vector2 center = { (screenWidth/2.0f) - 125.f, screenHeight/2.0f }; + float segments = 6.0f; + float insideRadius = 100.0f; + float outsideRadius = 150.0f; + bool outline = true; + + 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 + //---------------------------------------------------------------------------------- + int pointCount = (int)(segments); + float angleStep = (360.0f/pointCount)*DEG2RAD; + + for (int i = 0, i2 = 0; i < pointCount; i++, i2 += 2) + { + float angle1 = i*angleStep; + points[i2] = (Vector2){ center.x + cosf(angle1)*insideRadius, center.y + sinf(angle1)*insideRadius }; + float angle2 = angle1 + angleStep/2.0f; + points[i2 + 1] = (Vector2){ center.x + cosf(angle2)*outsideRadius, center.y + sinf(angle2)*outsideRadius }; + } + + points[pointCount*2] = points[0]; + points[pointCount*2 + 1] = points[1]; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + for (int i = 0, i2 = 0; i < pointCount; i++, i2 += 2) + { + float angle1 = i*angleStep; + Color color = ColorFromHSV(angle1*RAD2DEG, 1.0f, 1.0f); + DrawTriangle(points[i2 + 2], points[i2 + 1], points[i2], color); + if (outline) DrawTriangleLines(points[i2], points[i2 + 1], points[i2 + 2], BLACK); + + float angle2 = angle1 + angleStep/2.0f; + color = ColorFromHSV(angle2*RAD2DEG, 1.0f, 1.0f); + DrawTriangle(points[i2 + 3], points[i2 + 1], points[i2 + 2], color); + if (outline) DrawTriangleLines(points[i2 + 2], points[i2 + 1], points[i2 + 3], BLACK); + } + + DrawLine(580, 0, 580, GetScreenHeight(), (Color){ 218, 218, 218, 255 }); + DrawRectangle(580, 0, GetScreenWidth(), GetScreenHeight(), (Color){ 232, 232, 232, 255 }); + + // Draw GUI controls + //------------------------------------------------------------------------------ + GuiSliderBar((Rectangle){ 640, 40, 120, 20}, "Segments", TextFormat("%.0f", segments), &segments, 6.0f, 60.f); + GuiCheckBox((Rectangle){ 640, 70, 20, 20 }, "Outline", &outline); + //------------------------------------------------------------------------------ + + 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_triangle_strip.png b/examples/shapes/shapes_triangle_strip.png new file mode 100644 index 0000000000000000000000000000000000000000..c291a084918ee0a2ae7c9f3ae267cb5716f9f167 GIT binary patch literal 12694 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 literal 0 HcmV?d00001