From 619d09081c59b7472d38c6dc07b1eab5eacfb4ec Mon Sep 17 00:00:00 2001 From: evertonse Date: Fri, 25 Oct 2024 13:45:39 -0300 Subject: [PATCH 1/2] [rshapes] Add function --- examples/Makefile | 3 +- examples/Makefile.Web | 3 + examples/README.md | 163 ++++---- examples/shapes/shapes_rectangle_advanced.c | 306 ++++++++++++++ examples/shapes/shapes_rectangle_advanced.png | Bin 0 -> 16847 bytes .../shapes_rectangle_advanced.vcxproj | 390 ++++++++++++++++++ projects/VS2022/raylib.sln | 2 + 7 files changed, 785 insertions(+), 82 deletions(-) create mode 100644 examples/shapes/shapes_rectangle_advanced.c create mode 100644 examples/shapes/shapes_rectangle_advanced.png create mode 100644 projects/VS2022/examples/shapes_rectangle_advanced.vcxproj diff --git a/examples/Makefile b/examples/Makefile index be9751db1035..ad894e96e9ea 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -522,7 +522,8 @@ SHAPES = \ shapes/shapes_logo_raylib_anim \ shapes/shapes_rectangle_scaling \ shapes/shapes_splines_drawing \ - shapes/shapes_top_down_lights + shapes/shapes_top_down_lights \ + shapes/shapes_rectangle_advanced TEXTURES = \ textures/textures_background_scrolling \ diff --git a/examples/Makefile.Web b/examples/Makefile.Web index 5155458e0b8c..224071710b89 100644 --- a/examples/Makefile.Web +++ b/examples/Makefile.Web @@ -677,6 +677,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_rectangle_advanced: shapes/shapes_rectangle_advanced.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) + # Compile TEXTURES examples textures/textures_background_scrolling: textures/textures_background_scrolling.c diff --git a/examples/README.md b/examples/README.md index ee528d04999a..d25ad10cc867 100644 --- a/examples/README.md +++ b/examples/README.md @@ -80,6 +80,7 @@ Examples using raylib shapes drawing functionality, provided by raylib [shapes]( | 47 | [shapes_draw_circle_sector](shapes/shapes_draw_circle_sector.c) | shapes_draw_circle_sector | ⭐️⭐️⭐️☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) | | 48 | [shapes_draw_rectangle_rounded](shapes/shapes_draw_rectangle_rounded.c) | shapes_draw_rectangle_rounded | ⭐️⭐️⭐️☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) | | 49 | [shapes_top_down_lights](shapes/shapes_top_down_lights.c) | shapes_top_down_lights | ⭐️⭐️⭐️⭐️ | **4.2** | **4.2** | [Jeffery Myers](https://github.com/JeffM2501) | +| 50 | [shapes_rectangle_advanced](shapes/shapes_rectangle_advanced.c) | shapes_rectangle_advanced | ⭐️⭐️⭐️⭐️⭐️| **5.0** | **5.0** | [ExCyber](https://github.com/evertonse) | ### category: textures @@ -87,28 +88,28 @@ Examples using raylib textures functionality, including image/textures loading/g | ## | example | image | difficulty
level | version
created | last version
updated | original
developer | |----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------| -| 50 | [textures_logo_raylib](textures/textures_logo_raylib.c) | textures_logo_raylib | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) | -| 51 | [textures_srcrec_dstrec](textures/textures_srcrec_dstrec.c) | textures_srcrec_dstrec | ⭐️⭐️⭐️☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) | -| 52 | [textures_image_drawing](textures/textures_image_drawing.c) | textures_image_drawing | ⭐️⭐️☆☆ | 1.4 | 1.4 | [Ray](https://github.com/raysan5) | -| 53 | [textures_image_generation](textures/textures_image_generation.c) | textures_image_generation | ⭐️⭐️☆☆ | 1.8 | 1.8 | [Ray](https://github.com/raysan5) | -| 54 | [textures_image_loading](textures/textures_image_loading.c) | textures_image_loading | ⭐️☆☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) | -| 55 | [textures_image_processing](textures/textures_image_processing.c) | textures_image_processing | ⭐️⭐️⭐️☆ | 1.4 | 3.5 | [Ray](https://github.com/raysan5) | -| 56 | [textures_image_text](textures/textures_image_text.c) | textures_image_text | ⭐️⭐️☆☆ | 1.8 | **4.0** | [Ray](https://github.com/raysan5) | -| 57 | [textures_to_image](textures/textures_to_image.c) | textures_to_image | ⭐️☆☆☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) | -| 58 | [textures_raw_data](textures/textures_raw_data.c) | textures_raw_data | ⭐️⭐️⭐️☆ | 1.3 | 3.5 | [Ray](https://github.com/raysan5) | -| 59 | [textures_particles_blending](textures/textures_particles_blending.c) | textures_particles_blending | ⭐️☆☆☆ | 1.7 | 3.5 | [Ray](https://github.com/raysan5) | -| 60 | [textures_npatch_drawing](textures/textures_npatch_drawing.c) | textures_npatch_drawing | ⭐️⭐️⭐️☆ | 2.0 | 2.5 | [Jorge A. Gomes](https://github.com/overdev) | -| 61 | [textures_background_scrolling](textures/textures_background_scrolling.c) | textures_background_scrolling | ⭐️☆☆☆ | 2.0 | 2.5 | [Ray](https://github.com/raysan5) | -| 62 | [textures_sprite_anim](textures/textures_sprite_anim.c) | textures_sprite_anim | ⭐️⭐️☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) | -| 63 | [textures_sprite_button](textures/textures_sprite_button.c) | textures_sprite_button | ⭐️⭐️☆☆ | 2.5 | 2.5 | [Ray](https://github.com/raysan5) | -| 64 | [textures_sprite_explosion](textures/textures_sprite_explosion.c) | textures_sprite_explosion | ⭐️⭐️☆☆ | 2.5 | 3.5 | [Ray](https://github.com/raysan5) | -| 65 | [textures_bunnymark](textures/textures_bunnymark.c) | textures_bunnymark | ⭐️⭐️⭐️☆ | 1.6 | 2.5 | [Ray](https://github.com/raysan5) | -| 66 | [textures_mouse_painting](textures/textures_mouse_painting.c) | textures_mouse_painting | ⭐️⭐️⭐️☆ | 3.0 | 3.0 | [Chris Dill](https://github.com/MysteriousSpace) | -| 67 | [textures_blend_modes](textures/textures_blend_modes.c) | textures_blend_modes | ⭐️☆☆☆ | 3.5 | 3.5 | [Karlo Licudine](https://github.com/accidentalrebel) | -| 68 | [textures_draw_tiled](textures/textures_draw_tiled.c) | textures_draw_tiled | ⭐️⭐️⭐️☆ | 3.0 | **4.2** | [Vlad Adrian](https://github.com/demizdor) | -| 69 | [textures_polygon](textures/textures_polygon.c) | textures_polygon | ⭐️☆☆☆ | 3.7 | 3.7 | [Chris Camacho](https://github.com/codifies) | -| 70 | [textures_fog_of_war](textures/textures_fog_of_war.c) | textures_fog_of_war | ⭐️⭐️⭐️☆ | **4.2** | **4.2** | [Ray](https://github.com/raysan5) | -| 71 | [textures_gif_player](textures/textures_gif_player.c) | textures_gif_player | ⭐️⭐️⭐️☆ | **4.2** | **4.2** | [Ray](https://github.com/raysan5) | +| 51 | [textures_logo_raylib](textures/textures_logo_raylib.c) | textures_logo_raylib | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) | +| 52 | [textures_srcrec_dstrec](textures/textures_srcrec_dstrec.c) | textures_srcrec_dstrec | ⭐️⭐️⭐️☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) | +| 53 | [textures_image_drawing](textures/textures_image_drawing.c) | textures_image_drawing | ⭐️⭐️☆☆ | 1.4 | 1.4 | [Ray](https://github.com/raysan5) | +| 54 | [textures_image_generation](textures/textures_image_generation.c) | textures_image_generation | ⭐️⭐️☆☆ | 1.8 | 1.8 | [Ray](https://github.com/raysan5) | +| 55 | [textures_image_loading](textures/textures_image_loading.c) | textures_image_loading | ⭐️☆☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) | +| 56 | [textures_image_processing](textures/textures_image_processing.c) | textures_image_processing | ⭐️⭐️⭐️☆ | 1.4 | 3.5 | [Ray](https://github.com/raysan5) | +| 57 | [textures_image_text](textures/textures_image_text.c) | textures_image_text | ⭐️⭐️☆☆ | 1.8 | **4.0** | [Ray](https://github.com/raysan5) | +| 58 | [textures_to_image](textures/textures_to_image.c) | textures_to_image | ⭐️☆☆☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) | +| 59 | [textures_raw_data](textures/textures_raw_data.c) | textures_raw_data | ⭐️⭐️⭐️☆ | 1.3 | 3.5 | [Ray](https://github.com/raysan5) | +| 60 | [textures_particles_blending](textures/textures_particles_blending.c) | textures_particles_blending | ⭐️☆☆☆ | 1.7 | 3.5 | [Ray](https://github.com/raysan5) | +| 61 | [textures_npatch_drawing](textures/textures_npatch_drawing.c) | textures_npatch_drawing | ⭐️⭐️⭐️☆ | 2.0 | 2.5 | [Jorge A. Gomes](https://github.com/overdev) | +| 62 | [textures_background_scrolling](textures/textures_background_scrolling.c) | textures_background_scrolling | ⭐️☆☆☆ | 2.0 | 2.5 | [Ray](https://github.com/raysan5) | +| 63 | [textures_sprite_anim](textures/textures_sprite_anim.c) | textures_sprite_anim | ⭐️⭐️☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) | +| 64 | [textures_sprite_button](textures/textures_sprite_button.c) | textures_sprite_button | ⭐️⭐️☆☆ | 2.5 | 2.5 | [Ray](https://github.com/raysan5) | +| 65 | [textures_sprite_explosion](textures/textures_sprite_explosion.c) | textures_sprite_explosion | ⭐️⭐️☆☆ | 2.5 | 3.5 | [Ray](https://github.com/raysan5) | +| 66 | [textures_bunnymark](textures/textures_bunnymark.c) | textures_bunnymark | ⭐️⭐️⭐️☆ | 1.6 | 2.5 | [Ray](https://github.com/raysan5) | +| 67 | [textures_mouse_painting](textures/textures_mouse_painting.c) | textures_mouse_painting | ⭐️⭐️⭐️☆ | 3.0 | 3.0 | [Chris Dill](https://github.com/MysteriousSpace) | +| 68 | [textures_blend_modes](textures/textures_blend_modes.c) | textures_blend_modes | ⭐️☆☆☆ | 3.5 | 3.5 | [Karlo Licudine](https://github.com/accidentalrebel) | +| 69 | [textures_draw_tiled](textures/textures_draw_tiled.c) | textures_draw_tiled | ⭐️⭐️⭐️☆ | 3.0 | **4.2** | [Vlad Adrian](https://github.com/demizdor) | +| 70 | [textures_polygon](textures/textures_polygon.c) | textures_polygon | ⭐️☆☆☆ | 3.7 | 3.7 | [Chris Camacho](https://github.com/codifies) | +| 71 | [textures_fog_of_war](textures/textures_fog_of_war.c) | textures_fog_of_war | ⭐️⭐️⭐️☆ | **4.2** | **4.2** | [Ray](https://github.com/raysan5) | +| 72 | [textures_gif_player](textures/textures_gif_player.c) | textures_gif_player | ⭐️⭐️⭐️☆ | **4.2** | **4.2** | [Ray](https://github.com/raysan5) | ### category: text @@ -116,18 +117,18 @@ Examples using raylib text functionality, including sprite fonts loading/generat | ## | example | image | difficulty
level | version
created | last version
updated | original
developer | |----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------| -| 72 | [text_raylib_fonts](text/text_raylib_fonts.c) | text_raylib_fonts | ⭐️☆☆☆ | 1.7 | 3.7 | [Ray](https://github.com/raysan5) | -| 73 | [text_font_spritefont](text/text_font_spritefont.c) | text_font_spritefont | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) | -| 74 | [text_font_filters](text/text_font_filters.c) | text_font_filters | ⭐️⭐️☆☆ | 1.3 | **4.2** | [Ray](https://github.com/raysan5) | -| 75 | [text_font_loading](text/text_font_loading.c) | text_font_loading | ⭐️☆☆☆ | 1.4 | 3.0 | [Ray](https://github.com/raysan5) | -| 76 | [text_font_sdf](text/text_font_sdf.c) | text_font_sdf | ⭐️⭐️⭐️☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) | -| 77 | [text_format_text](text/text_format_text.c) | text_format_text | ⭐️☆☆☆ | 1.1 | 3.0 | [Ray](https://github.com/raysan5) | -| 78 | [text_input_box](text/text_input_box.c) | text_input_box | ⭐️⭐️☆☆ | 1.7 | 3.5 | [Ray](https://github.com/raysan5) | -| 79 | [text_writing_anim](text/text_writing_anim.c) | text_writing_anim | ⭐️⭐️☆☆ | 1.4 | 1.4 | [Ray](https://github.com/raysan5) | -| 80 | [text_rectangle_bounds](text/text_rectangle_bounds.c) | text_rectangle_bounds | ⭐️⭐️⭐️⭐️ | 2.5 | **4.0** | [Vlad Adrian](https://github.com/demizdor) | -| 81 | [text_unicode](text/text_unicode.c) | text_unicode | ⭐️⭐️⭐️⭐️ | 2.5 | **4.0** | [Vlad Adrian](https://github.com/demizdor) | -| 82 | [text_draw_3d](text/text_draw_3d.c) | text_draw_3d | ⭐️⭐️⭐️⭐️ | 3.5 | **4.0** | [Vlad Adrian](https://github.com/demizdor) | -| 83 | [text_codepoints_loading](text/text_codepoints_loading.c) | text_codepoints_loading | ⭐️⭐️⭐️☆ | **4.2** | **4.2** | [Ray](https://github.com/raysan5) | +| 73 | [text_raylib_fonts](text/text_raylib_fonts.c) | text_raylib_fonts | ⭐️☆☆☆ | 1.7 | 3.7 | [Ray](https://github.com/raysan5) | +| 74 | [text_font_spritefont](text/text_font_spritefont.c) | text_font_spritefont | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) | +| 75 | [text_font_filters](text/text_font_filters.c) | text_font_filters | ⭐️⭐️☆☆ | 1.3 | **4.2** | [Ray](https://github.com/raysan5) | +| 76 | [text_font_loading](text/text_font_loading.c) | text_font_loading | ⭐️☆☆☆ | 1.4 | 3.0 | [Ray](https://github.com/raysan5) | +| 77 | [text_font_sdf](text/text_font_sdf.c) | text_font_sdf | ⭐️⭐️⭐️☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) | +| 78 | [text_format_text](text/text_format_text.c) | text_format_text | ⭐️☆☆☆ | 1.1 | 3.0 | [Ray](https://github.com/raysan5) | +| 79 | [text_input_box](text/text_input_box.c) | text_input_box | ⭐️⭐️☆☆ | 1.7 | 3.5 | [Ray](https://github.com/raysan5) | +| 80 | [text_writing_anim](text/text_writing_anim.c) | text_writing_anim | ⭐️⭐️☆☆ | 1.4 | 1.4 | [Ray](https://github.com/raysan5) | +| 81 | [text_rectangle_bounds](text/text_rectangle_bounds.c) | text_rectangle_bounds | ⭐️⭐️⭐️⭐️ | 2.5 | **4.0** | [Vlad Adrian](https://github.com/demizdor) | +| 82 | [text_unicode](text/text_unicode.c) | text_unicode | ⭐️⭐️⭐️⭐️ | 2.5 | **4.0** | [Vlad Adrian](https://github.com/demizdor) | +| 83 | [text_draw_3d](text/text_draw_3d.c) | text_draw_3d | ⭐️⭐️⭐️⭐️ | 3.5 | **4.0** | [Vlad Adrian](https://github.com/demizdor) | +| 84 | [text_codepoints_loading](text/text_codepoints_loading.c) | text_codepoints_loading | ⭐️⭐️⭐️☆ | **4.2** | **4.2** | [Ray](https://github.com/raysan5) | ### category: models @@ -135,25 +136,25 @@ Examples using raylib models functionality, including models loading/generation | ## | example | image | difficulty
level | version
created | last version
updated | original
developer | |----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------| -| 84 | [models_animation](models/models_animation.c) | models_animation | ⭐️⭐️☆☆ | 2.5 | 3.5 | [culacant](https://github.com/culacant) | -| 85 | [models_billboard](models/models_billboard.c) | models_billboard | ⭐️⭐️⭐️☆ | 1.3 | 3.5 | [Ray](https://github.com/raysan5) | -| 86 | [models_box_collisions](models/models_box_collisions.c) | models_box_collisions | ⭐️☆☆☆ | 1.3 | 3.5 | [Ray](https://github.com/raysan5) | -| 87 | [models_cubicmap](models/models_cubicmap.c) | models_cubicmap | ⭐️⭐️☆☆ | 1.8 | 3.5 | [Ray](https://github.com/raysan5) | -| 88 | [models_first_person_maze](models/models_first_person_maze.c) | models_first_person_maze | ⭐️⭐️☆☆ | 2.5 | 3.5 | [Ray](https://github.com/raysan5) | -| 89 | [models_geometric_shapes](models/models_geometric_shapes.c) | models_geometric_shapes | ⭐️☆☆☆ | 1.0 | 3.5 | [Ray](https://github.com/raysan5) | -| 90 | [models_mesh_generation](models/models_mesh_generation.c) | models_mesh_generation | ⭐️⭐️☆☆ | 1.8 | **4.0** | [Ray](https://github.com/raysan5) | -| 91 | [models_mesh_picking](models/models_mesh_picking.c) | models_mesh_picking | ⭐️⭐️⭐️☆ | 1.7 | **4.0** | [Joel Davis](https://github.com/joeld42) | -| 92 | [models_loading](models/models_loading.c) | models_loading | ⭐️☆☆☆ | 2.5 | **4.0** | [Ray](https://github.com/raysan5) | -| 93 | [models_loading_gltf](models/models_loading_gltf.c) | models_loading_gltf | ⭐️☆☆☆ | 3.7 | **4.2** | [Ray](https://github.com/raysan5) | -| 94 | [models_loading_vox](models/models_loading_vox.c) | models_loading_vox | ⭐️☆☆☆ | **4.0** | **4.0** | [Johann Nadalutti](https://github.com/procfxgen) | -| 95 | [models_loading_m3d](models/models_loading_m3d.c) | models_loading_m3d | ⭐️☆☆☆ | **4.2** | **4.2** | [bzt](https://bztsrc.gitlab.io/model3d) | -| 96 | [models_orthographic_projection](models/models_orthographic_projection.c) | models_orthographic_projection | ⭐️☆☆☆ | 2.0 | 3.7 | [Max Danielsson](https://github.com/autious) | -| 97 | [models_point_rendering](models/models_point_rendering.c) | models_point_rendering | ⭐️⭐️☆☆ | 5.0 | 5.0 | [Reese Gallagher](https://github.com/satchelfrost) | -| 98 | [models_rlgl_solar_system](models/models_rlgl_solar_system.c) | models_rlgl_solar_system | ⭐️⭐️⭐️⭐️ | 2.5 | **4.0** | [Ray](https://github.com/raysan5) | -| 99 | [models_yaw_pitch_roll](models/models_yaw_pitch_roll.c) | models_yaw_pitch_roll | ⭐️⭐️☆☆ | 1.8 | **4.0** | [Berni](https://github.com/Berni8k) | -| 100 | [models_waving_cubes](models/models_waving_cubes.c) | models_waving_cubes | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [codecat](https://github.com/codecat) | -| 101 | [models_heightmap](models/models_heightmap.c) | models_heightmap | ⭐️☆☆☆ | 1.8 | 3.5 | [Ray](https://github.com/raysan5) | -| 102 | [models_skybox](models/models_skybox.c) | models_skybox | ⭐️⭐️☆☆ | 1.8 | **4.0** | [Ray](https://github.com/raysan5) | +| 85 | [models_animation](models/models_animation.c) | models_animation | ⭐️⭐️☆☆ | 2.5 | 3.5 | [culacant](https://github.com/culacant) | +| 86 | [models_billboard](models/models_billboard.c) | models_billboard | ⭐️⭐️⭐️☆ | 1.3 | 3.5 | [Ray](https://github.com/raysan5) | +| 87 | [models_box_collisions](models/models_box_collisions.c) | models_box_collisions | ⭐️☆☆☆ | 1.3 | 3.5 | [Ray](https://github.com/raysan5) | +| 88 | [models_cubicmap](models/models_cubicmap.c) | models_cubicmap | ⭐️⭐️☆☆ | 1.8 | 3.5 | [Ray](https://github.com/raysan5) | +| 89 | [models_first_person_maze](models/models_first_person_maze.c) | models_first_person_maze | ⭐️⭐️☆☆ | 2.5 | 3.5 | [Ray](https://github.com/raysan5) | +| 90 | [models_geometric_shapes](models/models_geometric_shapes.c) | models_geometric_shapes | ⭐️☆☆☆ | 1.0 | 3.5 | [Ray](https://github.com/raysan5) | +| 91 | [models_mesh_generation](models/models_mesh_generation.c) | models_mesh_generation | ⭐️⭐️☆☆ | 1.8 | **4.0** | [Ray](https://github.com/raysan5) | +| 92 | [models_mesh_picking](models/models_mesh_picking.c) | models_mesh_picking | ⭐️⭐️⭐️☆ | 1.7 | **4.0** | [Joel Davis](https://github.com/joeld42) | +| 93 | [models_loading](models/models_loading.c) | models_loading | ⭐️☆☆☆ | 2.5 | **4.0** | [Ray](https://github.com/raysan5) | +| 94 | [models_loading_gltf](models/models_loading_gltf.c) | models_loading_gltf | ⭐️☆☆☆ | 3.7 | **4.2** | [Ray](https://github.com/raysan5) | +| 95 | [models_loading_vox](models/models_loading_vox.c) | models_loading_vox | ⭐️☆☆☆ | **4.0** | **4.0** | [Johann Nadalutti](https://github.com/procfxgen) | +| 96 | [models_loading_m3d](models/models_loading_m3d.c) | models_loading_m3d | ⭐️☆☆☆ | **4.2** | **4.2** | [bzt](https://bztsrc.gitlab.io/model3d) | +| 97 | [models_orthographic_projection](models/models_orthographic_projection.c) | models_orthographic_projection | ⭐️☆☆☆ | 2.0 | 3.7 | [Max Danielsson](https://github.com/autious) | +| 98 | [models_point_rendering](models/models_point_rendering.c) | models_point_rendering | ⭐️⭐️☆☆ | 5.0 | 5.0 | [Reese Gallagher](https://github.com/satchelfrost) | +| 99 | [models_rlgl_solar_system](models/models_rlgl_solar_system.c) | models_rlgl_solar_system | ⭐️⭐️⭐️⭐️ | 2.5 | **4.0** | [Ray](https://github.com/raysan5) | +| 100 | [models_yaw_pitch_roll](models/models_yaw_pitch_roll.c) | models_yaw_pitch_roll | ⭐️⭐️☆☆ | 1.8 | **4.0** | [Berni](https://github.com/Berni8k) | +| 101 | [models_waving_cubes](models/models_waving_cubes.c) | models_waving_cubes | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [codecat](https://github.com/codecat) | +| 102 | [models_heightmap](models/models_heightmap.c) | models_heightmap | ⭐️☆☆☆ | 1.8 | 3.5 | [Ray](https://github.com/raysan5) | +| 103 | [models_skybox](models/models_skybox.c) | models_skybox | ⭐️⭐️☆☆ | 1.8 | **4.0** | [Ray](https://github.com/raysan5) | ### category: shaders @@ -161,25 +162,25 @@ Examples using raylib shaders functionality, including shaders loading, paramete | ## | example | image | difficulty
level | version
created | last version
updated | original
developer | |----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------| -| 103 | [shaders_basic_lighting](shaders/shaders_basic_lighting.c) | shaders_basic_lighting | ⭐️⭐️⭐️⭐️ | 3.0 | **4.2** | [Chris Camacho](https://github.com/codifies) | -| 104 | [shaders_model_shader](shaders/shaders_model_shader.c) | shaders_model_shader | ⭐️⭐️☆☆ | 1.3 | 3.7 | [Ray](https://github.com/raysan5) | -| 105 | [shaders_shapes_textures](shaders/shaders_shapes_textures.c) | shaders_shapes_textures | ⭐️⭐️☆☆ | 1.7 | 3.7 | [Ray](https://github.com/raysan5) | -| 106 | [shaders_custom_uniform](shaders/shaders_custom_uniform.c) | shaders_custom_uniform | ⭐️⭐️☆☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) | -| 107 | [shaders_postprocessing](shaders/shaders_postprocessing.c) | shaders_postprocessing | ⭐️⭐️⭐️☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) | -| 108 | [shaders_palette_switch](shaders/shaders_palette_switch.c) | shaders_palette_switch | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Marco Lizza](https://github.com/MarcoLizza) | -| 109 | [shaders_raymarching](shaders/shaders_raymarching.c) | shaders_raymarching | ⭐️⭐️⭐️⭐️ | 2.0 | **4.2** | [Ray](https://github.com/raysan5) | -| 110 | [shaders_texture_drawing](shaders/shaders_texture_drawing.c) | shaders_texture_drawing | ⭐️⭐️☆☆ | 2.0 | 3.7 | [Michał Ciesielski](https://github.com/) | -| 111 | [shaders_texture_outline](shaders/shaders_texture_outline.c) | shaders_texture_outline | ⭐️⭐️⭐️☆ | **4.0** | **4.0** | [Samuel Skiff](https://github.com/GoldenThumbs) | -| 112 | [shaders_texture_waves](shaders/shaders_texture_waves.c) | shaders_texture_waves | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Anata](https://github.com/anatagawa) | -| 113 | [shaders_julia_set](shaders/shaders_julia_set.c) | shaders_julia_set | ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [eggmund](https://github.com/eggmund) | -| 114 | [shaders_eratosthenes](shaders/shaders_eratosthenes.c) | shaders_eratosthenes | ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [ProfJski](https://github.com/ProfJski) | -| 115 | [shaders_fog](shaders/shaders_fog.c) | shaders_fog | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) | -| 116 | [shaders_simple_mask](shaders/shaders_simple_mask.c) | shaders_simple_mask | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) | -| 117 | [shaders_hot_reloading](shaders/shaders_hot_reloading.c) | shaders_hot_reloading | ⭐️⭐️⭐️☆ | 3.0 | 3.5 | [Ray](https://github.com/raysan5) | -| 118 | [shaders_mesh_instancing](shaders/shaders_mesh_instancing.c) | shaders_mesh_instancing | ⭐️⭐️⭐️⭐️ | 3.7 | **4.2** | [seanpringle](https://github.com/seanpringle) | -| 119 | [shaders_multi_sample2d](shaders/shaders_multi_sample2d.c) | shaders_multi_sample2d | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) | -| 120 | [shaders_spotlight](shaders/shaders_spotlight.c) | shaders_spotlight | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) | -| 121 | [shaders_deferred_render](shaders/shaders_deferred_render.c) | shaders_deferred_render | ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) | +| 104 | [shaders_basic_lighting](shaders/shaders_basic_lighting.c) | shaders_basic_lighting | ⭐️⭐️⭐️⭐️ | 3.0 | **4.2** | [Chris Camacho](https://github.com/codifies) | +| 105 | [shaders_model_shader](shaders/shaders_model_shader.c) | shaders_model_shader | ⭐️⭐️☆☆ | 1.3 | 3.7 | [Ray](https://github.com/raysan5) | +| 106 | [shaders_shapes_textures](shaders/shaders_shapes_textures.c) | shaders_shapes_textures | ⭐️⭐️☆☆ | 1.7 | 3.7 | [Ray](https://github.com/raysan5) | +| 107 | [shaders_custom_uniform](shaders/shaders_custom_uniform.c) | shaders_custom_uniform | ⭐️⭐️☆☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) | +| 108 | [shaders_postprocessing](shaders/shaders_postprocessing.c) | shaders_postprocessing | ⭐️⭐️⭐️☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) | +| 109 | [shaders_palette_switch](shaders/shaders_palette_switch.c) | shaders_palette_switch | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Marco Lizza](https://github.com/MarcoLizza) | +| 110 | [shaders_raymarching](shaders/shaders_raymarching.c) | shaders_raymarching | ⭐️⭐️⭐️⭐️ | 2.0 | **4.2** | [Ray](https://github.com/raysan5) | +| 111 | [shaders_texture_drawing](shaders/shaders_texture_drawing.c) | shaders_texture_drawing | ⭐️⭐️☆☆ | 2.0 | 3.7 | [Michał Ciesielski](https://github.com/) | +| 112 | [shaders_texture_outline](shaders/shaders_texture_outline.c) | shaders_texture_outline | ⭐️⭐️⭐️☆ | **4.0** | **4.0** | [Samuel Skiff](https://github.com/GoldenThumbs) | +| 113 | [shaders_texture_waves](shaders/shaders_texture_waves.c) | shaders_texture_waves | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Anata](https://github.com/anatagawa) | +| 114 | [shaders_julia_set](shaders/shaders_julia_set.c) | shaders_julia_set | ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [eggmund](https://github.com/eggmund) | +| 115 | [shaders_eratosthenes](shaders/shaders_eratosthenes.c) | shaders_eratosthenes | ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [ProfJski](https://github.com/ProfJski) | +| 116 | [shaders_fog](shaders/shaders_fog.c) | shaders_fog | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) | +| 117 | [shaders_simple_mask](shaders/shaders_simple_mask.c) | shaders_simple_mask | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) | +| 118 | [shaders_hot_reloading](shaders/shaders_hot_reloading.c) | shaders_hot_reloading | ⭐️⭐️⭐️☆ | 3.0 | 3.5 | [Ray](https://github.com/raysan5) | +| 119 | [shaders_mesh_instancing](shaders/shaders_mesh_instancing.c) | shaders_mesh_instancing | ⭐️⭐️⭐️⭐️ | 3.7 | **4.2** | [seanpringle](https://github.com/seanpringle) | +| 120 | [shaders_multi_sample2d](shaders/shaders_multi_sample2d.c) | shaders_multi_sample2d | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) | +| 121 | [shaders_spotlight](shaders/shaders_spotlight.c) | shaders_spotlight | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) | +| 122 | [shaders_deferred_render](shaders/shaders_deferred_render.c) | shaders_deferred_render | ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) | ### category: audio @@ -187,10 +188,10 @@ Examples using raylib audio functionality, including sound/music loading and pla | ## | example | image | difficulty
level | version
created | last version
updated | original
developer | |----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------| -| 122 | [audio_module_playing](audio/audio_module_playing.c) | audio_module_playing | ⭐️☆☆☆ | 1.5 | 3.5 | [Ray](https://github.com/raysan5) | -| 123 | [audio_music_stream](audio/audio_music_stream.c) | audio_music_stream | ⭐️☆☆☆ | 1.3 | **4.2** | [Ray](https://github.com/raysan5) | -| 124 | [audio_raw_stream](audio/audio_raw_stream.c) | audio_raw_stream | ⭐️⭐️⭐️☆ | 1.6 | **4.2** | [Ray](https://github.com/raysan5) | -| 125 | [audio_sound_loading](audio/audio_sound_loading.c) | audio_sound_loading | ⭐️☆☆☆ | 1.1 | 3.5 | [Ray](https://github.com/raysan5) | +| 123 | [audio_module_playing](audio/audio_module_playing.c) | audio_module_playing | ⭐️☆☆☆ | 1.5 | 3.5 | [Ray](https://github.com/raysan5) | +| 124 | [audio_music_stream](audio/audio_music_stream.c) | audio_music_stream | ⭐️☆☆☆ | 1.3 | **4.2** | [Ray](https://github.com/raysan5) | +| 125 | [audio_raw_stream](audio/audio_raw_stream.c) | audio_raw_stream | ⭐️⭐️⭐️☆ | 1.6 | **4.2** | [Ray](https://github.com/raysan5) | +| 126 | [audio_sound_loading](audio/audio_sound_loading.c) | audio_sound_loading | ⭐️☆☆☆ | 1.1 | 3.5 | [Ray](https://github.com/raysan5) | ### category: others @@ -198,11 +199,11 @@ Examples showing raylib misc functionality that does not fit in other categories | ## | example | image | difficulty
level | version
created | last version
updated | original
developer | |----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------| -| 126 | [rlgl_standalone](others/rlgl_standalone.c) | rlgl_standalone | ⭐️⭐️⭐️⭐️ | 1.6 | **4.0** | [Ray](https://github.com/raysan5) | -| 127 | [rlgl_compute_shader](others/rlgl_compute_shader.c) | rlgl_compute_shader | ⭐️⭐️⭐️⭐️ | **4.0** | **4.0** | [Teddy Astie](https://github.com/tsnake41) | -| 128 | [easings_testbed](others/easings_testbed.c) | easings_testbed | ⭐️⭐️⭐️☆ | 3.0 | 3.0 | [Juan Miguel López](https://github.com/flashback-fx) | -| 129 | [raylib_opengl_interop](others/raylib_opengl_interop.c) | raylib_opengl_interop | ⭐️⭐️⭐️⭐️ | **4.0** | **4.0** | [Stephan Soller](https://github.com/arkanis) | -| 130 | [embedded_files_loading](others/embedded_files_loading.c) | embedded_files_loading | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Kristian Holmgren](https://github.com/defutura) | +| 127 | [rlgl_standalone](others/rlgl_standalone.c) | rlgl_standalone | ⭐️⭐️⭐️⭐️ | 1.6 | **4.0** | [Ray](https://github.com/raysan5) | +| 128 | [rlgl_compute_shader](others/rlgl_compute_shader.c) | rlgl_compute_shader | ⭐️⭐️⭐️⭐️ | **4.0** | **4.0** | [Teddy Astie](https://github.com/tsnake41) | +| 129 | [easings_testbed](others/easings_testbed.c) | easings_testbed | ⭐️⭐️⭐️☆ | 3.0 | 3.0 | [Juan Miguel López](https://github.com/flashback-fx) | +| 130 | [raylib_opengl_interop](others/raylib_opengl_interop.c) | raylib_opengl_interop | ⭐️⭐️⭐️⭐️ | **4.0** | **4.0** | [Stephan Soller](https://github.com/arkanis) | +| 131 | [embedded_files_loading](others/embedded_files_loading.c) | embedded_files_loading | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Kristian Holmgren](https://github.com/defutura) | As always contributions are welcome, feel free to send new examples! Here is an [examples template](examples_template.c) to start with! diff --git a/examples/shapes/shapes_rectangle_advanced.c b/examples/shapes/shapes_rectangle_advanced.c new file mode 100644 index 000000000000..ee1bfd2ef1ef --- /dev/null +++ b/examples/shapes/shapes_rectangle_advanced.c @@ -0,0 +1,306 @@ +#include "raylib.h" +#include "rlgl.h" +#include + +// Draw rectangle with rounded edges and horizontal gradient, with options to choose side of roundness +void DrawRectangleRoundedGradientH(Rectangle rec, float roundnessLeft, float roundnessRight, int segments, Color left, Color right) +{ + // Neither side is rounded + if ((roundnessLeft <= 0.0f && roundnessRight <= 0.0f) || (rec.width < 1) || (rec.height < 1 )) + { + DrawRectangleGradientEx(rec, left, left, right, right); + return; + } + + if (roundnessLeft >= 1.0f) roundnessLeft = 1.0f; + if (roundnessRight >= 1.0f) roundnessRight = 1.0f; + + // Calculate corner radius both from right and left + float recSize = rec.width > rec.height ? rec.height : rec.width; + float radiusLeft = (recSize*roundnessLeft)/2; + float radiusRight = (recSize*roundnessRight)/2; + + if (radiusLeft <= 0.0f) radiusLeft = 0.0f; + if (radiusRight <= 0.0f) radiusRight = 0.0f; + + if (radiusRight <= 0.0f && radiusLeft <= 0.0f) return; + + float stepLength = 90.0f/(float)segments; + + /* + Diagram Copied here for reference, original at `DrawRectangleRounded` source code + + P0____________________P1 + /| |\ + /1| 2 |3\ + P7 /__|____________________|__\ P2 + | |P8 P9| | + | 8 | 9 | 4 | + | __|____________________|__ | + P6 \ |P11 P10| / P3 + \7| 6 |5/ + \|____________________|/ + P5 P4 + */ + + // Coordinates of the 12 points also apdated from `DrawRectangleRounded` + const Vector2 point[12] = { + // PO, P1, P2 + {(float)rec.x + radiusLeft, rec.y}, {(float)(rec.x + rec.width) - radiusRight, rec.y}, { rec.x + rec.width, (float)rec.y + radiusRight }, + // P3, P4 + {rec.x + rec.width, (float)(rec.y + rec.height) - radiusRight}, {(float)(rec.x + rec.width) - radiusRight, rec.y + rec.height}, + // P5, P6, P7 + {(float)rec.x + radiusLeft, rec.y + rec.height}, { rec.x, (float)(rec.y + rec.height) - radiusLeft}, {rec.x, (float)rec.y + radiusLeft}, + // P8, P9 + {(float)rec.x + radiusLeft, (float)rec.y + radiusLeft}, {(float)(rec.x + rec.width) - radiusRight, (float)rec.y + radiusRight}, + // P10, P11 + {(float)(rec.x + rec.width) - radiusRight, (float)(rec.y + rec.height) - radiusRight}, {(float)rec.x + radiusLeft, (float)(rec.y + rec.height) - radiusLeft} + }; + + const Vector2 centers[4] = { point[8], point[9], point[10], point[11] }; + const float angles[4] = { 180.0f, 270.0f, 0.0f, 90.0f }; + +#if defined(SUPPORT_QUADS_DRAW_MODE) + rlSetTexture(GetShapesTexture().id); + Rectangle shapeRect = GetShapesTextureRectangle(); + + rlBegin(RL_QUADS); + // Draw all the 4 corners: [1] Upper Left Corner, [3] Upper Right Corner, [5] Lower Right Corner, [7] Lower Left Corner + for (int k = 0; k < 4; ++k) + { + Color color; + float radius; + if (k == 0) color = left, radius = radiusLeft; // [1] Upper Left Corner + if (k == 1) color = right, radius = radiusRight; // [3] Upper Right Corner + if (k == 2) color = right, radius = radiusRight; // [5] Lower Right Corner + if (k == 3) color = left, radius = radiusLeft; // [7] Lower Left Corner + float angle = angles[k]; + const Vector2 center = centers[k]; + + for (int i = 0; i < segments/2; i++) + { + rlColor4ub(color.r, color.g, color.b, color.a); + rlTexCoord2f(shapeRect.x/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(center.x, center.y); + + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(center.x + cosf(DEG2RAD*(angle + stepLength*2))*radius, center.y + sinf(DEG2RAD*(angle + stepLength*2))*radius); + + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(center.x + cosf(DEG2RAD*(angle + stepLength))*radius, center.y + sinf(DEG2RAD*(angle + stepLength))*radius); + + rlTexCoord2f(shapeRect.x/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(center.x + cosf(DEG2RAD*angle)*radius, center.y + sinf(DEG2RAD*angle)*radius); + + angle += (stepLength*2); + } + + // End one even segments + if ( segments % 2) + { + rlTexCoord2f(shapeRect.x/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(center.x, center.y); + + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(center.x + cosf(DEG2RAD*(angle + stepLength))*radius, center.y + sinf(DEG2RAD*(angle + stepLength))*radius); + + rlTexCoord2f(shapeRect.x/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(center.x + cosf(DEG2RAD*angle)*radius, center.y + sinf(DEG2RAD*angle)*radius); + + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(center.x, center.y); + } + } + + // + // Here we use the `Diagram` to guide ourselves to which point receives what color. + // + // By choosing the color correctly associated with a pointe the gradient effect + // will naturally come from OpenGL interpolation. + // + + // [2] Upper Rectangle + rlColor4ub(left.r, left.g, left.b, left.a); + rlTexCoord2f(shapeRect.x/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(point[0].x, point[0].y); + rlTexCoord2f(shapeRect.x/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(point[8].x, point[8].y); + + rlColor4ub(right.r, right.g, right.b, right.a); + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(point[9].x, point[9].y); + + rlColor4ub(right.r, right.g, right.b, right.a); + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(point[1].x, point[1].y); + + // [4] Left Rectangle + rlColor4ub(right.r, right.g, right.b, right.a); + rlTexCoord2f(shapeRect.x/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(point[2].x, point[2].y); + rlTexCoord2f(shapeRect.x/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(point[9].x, point[9].y); + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(point[10].x, point[10].y); + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(point[3].x, point[3].y); + + // [6] Bottom Rectangle + rlColor4ub(left.r, left.g, left.b, left.a); + rlTexCoord2f(shapeRect.x/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(point[11].x, point[11].y); + rlTexCoord2f(shapeRect.x/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(point[5].x, point[5].y); + + rlColor4ub(right.r, right.g, right.b, right.a); + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(point[4].x, point[4].y); + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(point[10].x, point[10].y); + + // [8] left Rectangle + rlColor4ub(left.r, left.g, left.b, left.a); + rlTexCoord2f(shapeRect.x/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(point[7].x, point[7].y); + rlTexCoord2f(shapeRect.x/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(point[6].x, point[6].y); + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(point[11].x, point[11].y); + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(point[8].x, point[8].y); + + // [9] Middle Rectangle + rlColor4ub(left.r, left.g, left.b, left.a); + rlTexCoord2f(shapeRect.x/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(point[8].x, point[8].y); + rlTexCoord2f(shapeRect.x/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(point[11].x, point[11].y); + + rlColor4ub(right.r, right.g, right.b, right.a); + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height); + rlVertex2f(point[10].x, point[10].y); + rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, shapeRect.y/texShapes.height); + rlVertex2f(point[9].x, point[9].y); + + rlEnd(); + rlSetTexture(0); +#else + + // + // Here we use the `Diagram` to guide ourselves to which point receives what color. + // + // By choosing the color correctly associated with a pointe the gradient effect + // will naturally come from OpenGL interpolation. + // But this time instead of Quad, we think in triangles. + // + + rlBegin(RL_TRIANGLES); + + // Draw all of the 4 corners: [1] Upper Left Corner, [3] Upper Right Corner, [5] Lower Right Corner, [7] Lower Left Corner + for (int k = 0; k < 4; ++k) + { + Color color; + float radius; + if (k == 0) color = left, radius = radiusLeft; // [1] Upper Left Corner + if (k == 1) color = right, radius = radiusRight; // [3] Upper Right Corner + if (k == 2) color = right, radius = radiusRight; // [5] Lower Right Corner + if (k == 3) color = left, radius = radiusLeft; // [7] Lower Left Corner + float angle = angles[k]; + const Vector2 center = centers[k]; + for (int i = 0; i < segments; i++) + { + rlColor4ub(color.r, color.g, color.b, color.a); + rlVertex2f(center.x, center.y); + rlVertex2f(center.x + cosf(DEG2RAD*(angle + stepLength))*radius, center.y + sinf(DEG2RAD*(angle + stepLength))*radius); + rlVertex2f(center.x + cosf(DEG2RAD*angle)*radius, center.y + sinf(DEG2RAD*angle)*radius); + angle += stepLength; + } + } + + // [2] Upper Rectangle + rlColor4ub(left.r, left.g, left.b, left.a); + rlVertex2f(point[0].x, point[0].y); + rlVertex2f(point[8].x, point[8].y); + rlColor4ub(right.r, right.g, right.b, right.a); + rlVertex2f(point[9].x, point[9].y); + rlVertex2f(point[1].x, point[1].y); + rlColor4ub(left.r, left.g, left.b, left.a); + rlVertex2f(point[0].x, point[0].y); + rlColor4ub(right.r, right.g, right.b, right.a); + rlVertex2f(point[9].x, point[9].y); + + // [4] Right Rectangle + rlColor4ub(right.r, right.g, right.b, right.a); + rlVertex2f(point[9].x, point[9].y); + rlVertex2f(point[10].x, point[10].y); + rlVertex2f(point[3].x, point[3].y); + rlVertex2f(point[2].x, point[2].y); + rlVertex2f(point[9].x, point[9].y); + rlVertex2f(point[3].x, point[3].y); + + // [6] Bottom Rectangle + rlColor4ub(left.r, left.g, left.b, left.a); + rlVertex2f(point[11].x, point[11].y); + rlVertex2f(point[5].x, point[5].y); + rlColor4ub(right.r, right.g, right.b, right.a); + rlVertex2f(point[4].x, point[4].y); + rlVertex2f(point[10].x, point[10].y); + rlColor4ub(left.r, left.g, left.b, left.a); + rlVertex2f(point[11].x, point[11].y); + rlColor4ub(right.r, right.g, right.b, right.a); + rlVertex2f(point[4].x, point[4].y); + + // [8] Left Rectangle + rlColor4ub(left.r, left.g, left.b, left.a); + rlVertex2f(point[7].x, point[7].y); + rlVertex2f(point[6].x, point[6].y); + rlVertex2f(point[11].x, point[11].y); + rlVertex2f(point[8].x, point[8].y); + rlVertex2f(point[7].x, point[7].y); + rlVertex2f(point[11].x, point[11].y); + + // [9] Middle Rectangle + rlColor4ub(left.r, left.g, left.b, left.a); + rlVertex2f(point[8].x, point[8].y); + rlVertex2f(point[11].x, point[11].y); + rlColor4ub(right.r, right.g, right.b, right.a); + rlVertex2f(point[10].x, point[10].y); + rlVertex2f(point[9].x, point[9].y); + rlColor4ub(left.r, left.g, left.b, left.a); + rlVertex2f(point[8].x, point[8].y); + rlColor4ub(right.r, right.g, right.b, right.a); + rlVertex2f(point[10].x, point[10].y); + rlEnd(); +#endif +} + +int main(int argc, char *argv[]) { + InitWindow(600, 900, "Rectangle Rounded Gradient"); + double width = 600/2.0, height = 900/6.0; + + while (!WindowShouldClose()) { + BeginDrawing(); + ClearBackground(RAYWHITE); + Rectangle rec = { + GetScreenWidth() / 2.0 - width/2, + GetScreenHeight() / 2.0 - (5)*(height/2), + width, height + }; + DrawRectangleRoundedGradientH(rec, 0.8, 0.8, 36, BLUE, RED); + + rec.y += rec.height + 1; + DrawRectangleRoundedGradientH(rec, 0.5, 1.0, 36, RED, PINK); + + rec.y += rec.height + 1; + DrawRectangleRoundedGradientH(rec, 1.0, 0.5, 36, RED, BLUE); + + rec.y += rec.height + 1; + DrawRectangleRoundedGradientH(rec, 0.0, 1.0, 36, BLUE, BLACK); + + rec.y += rec.height + 1; + DrawRectangleRoundedGradientH(rec, 1.0, 0.0, 36, BLUE, PINK); + EndDrawing(); + } + return 0; +} + diff --git a/examples/shapes/shapes_rectangle_advanced.png b/examples/shapes/shapes_rectangle_advanced.png new file mode 100644 index 0000000000000000000000000000000000000000..be25afed303f83db20daac02e42239f29f885d0a GIT binary patch literal 16847 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 QVURmyeDpxpz7v=K3yggNyZ`_I literal 0 HcmV?d00001 diff --git a/projects/VS2022/examples/shapes_rectangle_advanced.vcxproj b/projects/VS2022/examples/shapes_rectangle_advanced.vcxproj new file mode 100644 index 000000000000..9e5a0471036e --- /dev/null +++ b/projects/VS2022/examples/shapes_rectangle_advanced.vcxproj @@ -0,0 +1,390 @@ + + + + + Debug.DLL + Win32 + + + Debug.DLL + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release.DLL + Win32 + + + Release.DLL + x64 + + + Release + Win32 + + + Release + x64 + + + + {703BE7BA-5B99-4F70-806D-3A259F6A991E} + Win32Proj + shapes_rectangle_advanced + 10.0 + shapes_rectangle_advanced + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + /FS %(AdditionalOptions) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + Copy Debug DLL to output directory + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + Copy Debug DLL to output directory + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + + + Copy Release DLL to output directory + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + + + Copy Release DLL to output directory + + + + + + + + + + + {e89d61ac-55de-4482-afd4-df7242ebc859} + + + + + + diff --git a/projects/VS2022/raylib.sln b/projects/VS2022/raylib.sln index acda9e25ab15..e2f512d810e8 100644 --- a/projects/VS2022/raylib.sln +++ b/projects/VS2022/raylib.sln @@ -297,6 +297,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shapes_splines_drawing", "e EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shapes_top_down_lights", "examples\shapes_top_down_lights.vcxproj", "{703BE7BA-5B99-4F70-806D-3A259F6A991E}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shapes_rectangle_advanced", "examples\shapes_rectangle_advanced.vcxproj", "{703BE7BA-5B99-4F70-806D-3A259F6A991E}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "models_gpu_skinning", "examples\models_gpu_skinning.vcxproj", "{8245DAD9-D402-4D5C-8F45-32229CD3B263}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shaders_shadowmap", "examples\shaders_shadowmap.vcxproj", "{41BBCC10-6FDE-48A1-B2E0-A0EC6A668629}" From ef0c18b4479410cef40f872aa2bd68a35f010126 Mon Sep 17 00:00:00 2001 From: evertonse Date: Tue, 29 Oct 2024 17:57:54 -0300 Subject: [PATCH 2/2] "[shapes] rectangle advanced: fix screen width and height to fit with other examples" --- examples/shapes/shapes_rectangle_advanced.c | 46 +++++++++++++----- examples/shapes/shapes_rectangle_advanced.png | Bin 16847 -> 6839 bytes 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/examples/shapes/shapes_rectangle_advanced.c b/examples/shapes/shapes_rectangle_advanced.c index ee1bfd2ef1ef..a103e82a14a2 100644 --- a/examples/shapes/shapes_rectangle_advanced.c +++ b/examples/shapes/shapes_rectangle_advanced.c @@ -3,6 +3,7 @@ #include // Draw rectangle with rounded edges and horizontal gradient, with options to choose side of roundness +// Adapted from both `DrawRectangleRounded` and `DrawRectangleGradientH` void DrawRectangleRoundedGradientH(Rectangle rec, float roundnessLeft, float roundnessRight, int segments, Color left, Color right) { // Neither side is rounded @@ -197,7 +198,7 @@ void DrawRectangleRoundedGradientH(Rectangle rec, float roundnessLeft, float rou rlBegin(RL_TRIANGLES); // Draw all of the 4 corners: [1] Upper Left Corner, [3] Upper Right Corner, [5] Lower Right Corner, [7] Lower Left Corner - for (int k = 0; k < 4; ++k) + for (int k = 0; k < 4; ++k) { Color color; float radius; @@ -274,18 +275,35 @@ void DrawRectangleRoundedGradientH(Rectangle rec, float roundnessLeft, float rou #endif } -int main(int argc, char *argv[]) { - InitWindow(600, 900, "Rectangle Rounded Gradient"); - double width = 600/2.0, height = 900/6.0; - - while (!WindowShouldClose()) { +int main(int argc, char *argv[]) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + InitWindow(screenWidth, screenHeight, "raylib [shapes] example - rectangle avanced"); + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update rectangle bounds + //---------------------------------------------------------------------------------- + double width = GetScreenWidth()/2.0, height = GetScreenHeight()/6.0; + Rectangle rec = { + GetScreenWidth() / 2.0 - width/2, + GetScreenHeight() / 2.0 - (5)*(height/2), + width, height + }; + //-------------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- BeginDrawing(); ClearBackground(RAYWHITE); - Rectangle rec = { - GetScreenWidth() / 2.0 - width/2, - GetScreenHeight() / 2.0 - (5)*(height/2), - width, height - }; + + // Draw All Rectangles with different roundess for each side and different gradients DrawRectangleRoundedGradientH(rec, 0.8, 0.8, 36, BLUE, RED); rec.y += rec.height + 1; @@ -300,7 +318,13 @@ int main(int argc, char *argv[]) { rec.y += rec.height + 1; DrawRectangleRoundedGradientH(rec, 1.0, 0.0, 36, BLUE, PINK); EndDrawing(); + //-------------------------------------------------------------------------------------- } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- return 0; } diff --git a/examples/shapes/shapes_rectangle_advanced.png b/examples/shapes/shapes_rectangle_advanced.png index be25afed303f83db20daac02e42239f29f885d0a..a68170a31f5c9ba3e184a002b510b12fe82c3a2a 100644 GIT binary patch literal 6839 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 ytITia zHvHI8(}nZb%$JjsTX^W;fnVk1zO#~(n;rkdci;_@zxfaF&n%x`P4~%VHLhiV#vIqZ zW_#u2vhfOnlXF3P-i3pI@oZMdLLkIR+`8$nt$|t(GV8!fZx6hv1 zaj!CV)oIP<>+61K31XE_Q{OpdPg8>`s0OPPb}c`!_`s~a=|4VtliI-)hg@V;bhGso zK8(I9oE9Wc;K*g#PM9;JuN5B#b#bsLnF^ z*Y1%wmgZ&zl^C9GV}hhL7U@69nPW! z+GN2vuahayseeQ+6RvJ1{z&zdG^ zvqd`i3A0ItBV1kFXk`KR3~w{x-pnOD%D36NK&xn`!z08Fy_jrS<~v$ii5|OVFZP+C z1&5*E-F_-y6Fay0JCI-Y_HEuC&s`{beT|eRx?tS7Cmvqgn>YJxx&ksy3p>_svX*QY zTU2|8WP|PZaDBrLn&O+odq)WRLuRZ_@mAJbu?jk?57W67(Kmfbr-?T-LwnZ5r3`xxQtfK<8vL`VcaK9k*SCBil`QO$=W$I%O38sSkH+PZ+W(K9Be#NEz zl%TSS{tEKULQ(EunzpFraa__x0-H#y3}e0UyFIMS>!_UWFL!mXAhivXhu+YVjh^wz zhZa#^GiyT47fl>XJ2e*1LxfU~+&~FWj8V=k3X57T$SPN7HZ4d-5kne#h!skEf*s(Q zqN!d*5*+UTVoaw(Nr!#AqJ5hnPDQ|6V5GN=-R?51u9%DxCk`;z?l}o4miL4m5x7;5 z7NL#{{key~hyRHi@2TkZky9JC6S#+dFv|(fo75$%IB~8yQpY;FX;XEjRAGydDt=ML zF76-b6*sb4l(imX2x0?rZ_v;mD?@8I{BuGR2lykxwwF!M4NF<==0ve=NFHt*x0TTTUm>kJXlYtO{oJ=y2k$;pK->+Xd@GUE8j~;X&T#xwnRubb^yO z6Y_XitdQohAg~HC3sq-#XTNXgQB76PBMG=8yoX2@I~w_6B027Z zxO@;M$abX(b;--gH1TKwXLJIM<7`~LXH|)pB8A1`D36Xg;!bdn8XhBSr@7Kp$i2ug zygb}>thQHiZCP_W>>&$vYSsNqz0+-Q_puYF*1K~iJn99d%TR(b_L%$`!Vxkqyu2x6 zVX_So9RxlzJ!D+tI=8%D#nnc4xnZ`-g6F()x~ukfFso!yR{81Q zjXGKaajoCH|{KrbW3*qW!+klHEM>pS_w7Yhr~@SBk6NalV${AsOhVUWg-L%&MJvy z0td|ZcIMHa}S;}eapMm>7hP9*X@&<~7h4H<7&hs(73SA~x6XuI(HR?uL1RLex zoYB3RxNX@hLz^@$g{i%060DtOEq=?xEJV!!JMR_FmM0g8Afp;N4Me(?UE?V&6dMnd z7KvlRz8BY3#BFDz(sps3g*x)uWujL-X%xk4OFV4h%hzLaBp9)`S&1P z6o4=_Sw5$r`(o$yzJgb8%pQhN;>dy3FfljGfc0!7Ya_qk5z`jZP|R%X#7!_!!qEcq z426WVjblx9qKO52*vcg_?TW*gL0)Cf1x9>wt9vMH_qO0evzO8O<;hvN7h}_H*H9{D<0q|#wHM-$Q_p5jxi_?L z!ZbtQvT4c>N6rVQr0}XdWYUg#~tU86k_<*40i9Xj|=?EX>nsT#Fmn z4-yasiApL%cd6}C{4IwfMBpDD^aIhn{SZ-n7(*CNqnID1>3VW#$nQh$&-rad-VO2m zcH0Uu52-9t-z#_A;wD{Q&T^kXZb*ea`wvW|;&0R?aJj%V-cGs68{Ap14e0W}u%OJi z0Vg*Z{ht^A*dCT7{h3CWQS{NWKAZwt+f&`HpHA?Xw zrXqCEN&I^u*?%aJAg)g&2$_jY)m{9KuqF{>!x_hkN4D^p>3FyZACH6wR$Jraz4}8M zp3$>gwL`il>s8?+rsj7qGM1Say+5SxD0sh2n@3xw?a*Hd+rzoSA_cyfOH>h;Qtw}&LjGyEetrt{!x~x>x?0WvfWW2H}Co>Aq8&ES%&Su=Cz5Vc# zg!Zaz&)-8Q+N+3S&M$&vJ1fdcx=*4yM6b0+{fCq;>Q7D>z`Q%M!V-%*%L$#ro~BW+ z*RE6gL#;tD?qlpC!TU0K+$r&FBi!>@FoO$XylRQqbkRFjMcC-{{fa4J&k{ba=OvaF z^2Uf|aE36gT09*T-O0bxHyt<~9#qQw(~zcjz6tZ{?Zk-Aw0~!YAyq$UTDPfNXf|;% zs87&MeR86`olwGLCKob22zm7$$+`7JLh%GKxnM$rKyKA=de&NxdfHd-RMLk)<@6z( z@+%@yWfhT5*+K0N5w0i=T+dbh_JmP~QkN8lZjO5auHRMuD8gytmoLY2uU~gx> z-B@(yK&elCA*;i?akG6Ru4!d1wYcil^m(Jc*$L+2o-?gRPv0GaQ70?$o`ElFb{UHL z64p-FnnerWRM!Lt_NBmcn=J^PLoY3L_t2j%R1^!Yg<(&I?k7JhUyrgA_q4XdhcuWf zTnc9qx1)$3a=KgCcpO7OXXQ@EGe7vXbp+vpMhqKq)uV%ZP8ayJcW{b5M!ZFK1|jH% zB(38O!WnPn6g^Um>zwDVs5?g^;8jx$J75yRZ3 z`~AH%PeE&%r|*cRuHfAkWkGNZCxm^+k3uCw9cQ_U+}n~lPh+3pxR!0TjVE|@z7qY+ zH}{42V)*F(l}~Dq2r5Yw?!s74hi6E7jbUBO&Y5rmH)=p}CU0^6q#-NCpG zk+c(xYuCPK_mP|n?{z?(c0-+%)fU5J>+E*+FN3p{5rW}V`?aHLIL%n=^i-&i2I$kN zQi->VeKe(pqw7++6ojr}sXDGSw(9W+)WZ<;nEeYr92Mf?vZfrUroWUN$XN9nNpH8b zjWvNZ8?7Wc=`WbP#pPJE{dv<2h-}Fw#zoH&Zork^p6hl8ux8o;)}ecwuA|7#JJ+xw zGOGX?|JUmD_6@cXCU8K;vl@{3Y4RGEW88K>8`3-%A~RpO4p;iS@mU9mj5i=Nd%xm! z)J)EIQC>iA6+Eic_uQr=?h38?CVzDtyx`72<*3*&ND(mYu;x^WI z=u82f!eJ`waaDCMTCakJaX29G`=&eGn9anaroaYDn{b>KuLlR{$cGvFD)C&nOJzsxM^uUWokGx*u_=wSldVW#o-(PqpSjW1*$pc}Pb^u=6Q zJyEoW4a}Odp;9|PLrVpi1~m(^IqYUQ>YS~kzR_QPm6$@w-X<;@a5EPS{lHexL?EVt zU`P`%Gy4x7rz;(gjUD~#uM(x_#-^t70k>sv{e6P(>RVcbGGke|IL_M+R=_F9l*Xr) zk{{({UAgvD-PE?agoZ+%enue^7kb39`J4BH2K?uuB4yZZ9y)&|)c?|*r?wH!36qEPy0 z?(7rP-Hdq{Dw8JSR@Flf&`?-I{+r;V#xzTV0^N2TwuV_-!ch>lC4QuFEH-fz zIF+`8pymF9-JgOWhl_x0TaA*iM=ZqWk6 zbvW!zzq6V^3lQ~NEbhZ9Nv1i=qafoa0i7j@0%4P~1jHIr0vk~iYP5t*t-ZXX4kEb? z$2jp?hu&^#d)s6e5HPDsTV)>4R1mnOzU3^?z5Ovawc;1;&snW#8QFKikOrHXr+M@| zL~;XA={MD7aFe)S!1(MM?e59RWN!9xo5!(WJV=z1ycwQjV>SbHs$N0%jjZUd#FKCJ zySsxGq8rQon0(hqwpjt|qAS@5-5oow!=^VO+TTMxazGC#hkL~P8%5)v(VFj_*!Ja zu!(L)5qlxg)4Rf*v#ZoAufa38V*rs~6-7h`^bOm0KdZLU&CKSQd7SfUZ7p!j8S%99 z;U~0p-KREqjQCI38EmEMTr8VeUEEbNmBsP24Jxp2dnb(bn>t?NH(lb=UFvCzVcEBJ z1~murHSI!Z#!Oa$zw!t2+0fZ5&tK@tRBkgEYFnsS=9jX6CAx1vx|{nXu;9Em_k6-y zuTC{nYQ9@(if8BKQ0Fd#fvLa*SP*}prn_v0U4XV=UFj^?&7Rt7UUZuMusfSFX^?-< ztEP=}hMLXEFvyR`4$>P6eL4#fyI74Q1GK{K%fVxSFLxsqaEybm=SIw zs;!ezNbX_;kh^AP5L1^?qvJ17BjXRMIyqJ34$emKq>?)_sr9(L&ias2zQ#&49w`dM zBeznMNg_@%X{I5WBy4cvI87&%I*AiXX;1w5CF}xz2?IPc1^l+4dh|4wiJlJXyj3d1 z@X3APnZU@u32J98@}Fic+LKCUDF!#O6a!heN?FtLWbw3oNY8ZG8-5RL(adYuBH`FA z?0dy9>?C+Hs4zt_7d(|PJoo)A>@eOG#{UcVnFJr z-R;voUX*rnX(dT%&1(BX$f&kG~Y`HZ>p|?f_l&M98l=3sk-+9yfKadeYX6uR}j(ilJW*9qJ3QOJ)&l| z+G4Wz4rzt0uo@J#zd!G;B(05-28IVvQLFys3U|eWCF#4MsJk1Kd~UPY8YUa8&O?Fr zqNJo{g`?)JiE(!WVW1Z()|7c>g2S&LSs{Q&Ype&>so0MSNBKt`$kPQ1cuPv!z(ax; z9zUg*0@=c0R~M7tuEDzd0RqNVfak$UJh!TC$dU*V*a~>sK5zw9o(aJ&2^j7YROKzh z{)oG@lm2E3*sTt#Qy&d2WGiGWNy~={x^qA-A7l7+)QPCwd4_=LEl94dfxig8^Qe^U z4J1q-t&wgE=0k<}b5MvIQ#Q5!02D>y00AA7=1T2!lXw%5B|xrSOjoi_IkExFFG?Fy zK?hXj7CY;9Tm~v|HUc3Jr5yXzg}}A=fgPD{@o)(+6Uh`vyhwQ?s0}|dIAR~-E{pYQOHKnwD>JQAb8+@$88P}Z5e$2`cI;K zrC8t^z^BJz{x|s003TO8sL}tHk5dicgR4~kd(xHoeV@l+Ap?Fl@8}mIu{Ay`1Wn0j zb3hsDvoQ(Wtxoz^4yb+RLZgFX9274ft^E%=q^9~n)%&Lb|L*oyNBxM(pT3Z=B{k*X zkuMnjrvu~{1n$4v@PDQEKVK@FQJ*~t+PHtQh=HGhKqPZf5LdqNDvlwJ!CeC4=*Iw| zj$6L(i^cwBPkkKYgTE=(q{B>9{?~6OCGIz;m5x#V>zk~o#e}iqiEdG4$ z^h#u3>Za(wmz9YWw46*i@M-O$@btK&Yp#9{O<(&p*o&OGgZQK=(^$~5I_2!A(O-u- z0XKEF38PZ`iAiDyl;L{W2-8T_#pLH}yxfCiQB3w@EgLZyf&2VpRkgOtmcadjQy!C# zDPSqZtS0*=4lQFxW;UnUKmp{0;OjKt2G#ANCFHR+;qGWj<^V{^U(?Fc9a|_ZP>KMG z?3s+=#{6L+sezIE1TES3X&?|q9m|8Z?_+@4H7ZySJN8kk!GKdW+DR)HlW)nA<65%s z(G&C78m1}MmH=5GKVl=o<^VLx*zLWfW>)$c$MAnXhmO2wlKt=k5T_j2b?%PqpK>zD z!1{_$G{L6Cq~M`5=&&8^GiG(^e9r80Y=o=aXbg7+@n%*n6eL^OA9KIMh7-3T{07q( zH|l@fh>k2XsjvwIG#qcBq$Py*j-T_rK`LO{2wH>-HI9C&MNsPWxKX#ebJ)x{6De?a zIvQ1kKiN`A!mqKmZv>VG1q_3Fb@PunA?0i*R$AmBbTy9bWHXCRdPiLVpA@Kczi&o2 zZ8_)&VL9ikw7aiv+d{ATc}I>eRPns2)b4iOW+Xj8=zGJh?{5*(H#0>5WW?py@!B(U z%FPKyy*tgjht!Flf<9~A!oWN;lEe924VzBEI6y1kwdR-jax%4S0f?EE-B9ImE~s}6 z0GJt_A!3Gs!;^t%n!QijL|exUgoKXT6(>*J=!O7Nno|%yw~adS%5RF-rXNJeZZx7D z$IwWmVp@A!rx>8D7kE5*T!1jN?5U_6)z$O6xU=VV6Waf+o3biy*u*sWV#)>yTubE+ znV%1SrM^pV3PN+U&G6!(hw8!3t;^sL*xPlkLw*-QBx-Oi!A!)n-koaOZ2t;39qU8Q z>+iyx+sPWSZwTqMQJ@xaUg)B+;|ciz1Ih&fZOZxBDP}&l(W3x6>X9ErB^CsUi1{Jq z8u=l;^%(!=`iuT-1jfHM5);gbycqmW0TVc*a51oI0)y-K!Qd!97jc|iOh7~K#ek98 z;xfUEd!~qqs3wi~-lDSk-&DF)T5^^*({del70oeXV^C^H!yqL3InRlg?j!->z#ouB;66t2Qyk`c$Np<&`(PW??36nW_^b(4oZ0 zX>x8`_FzW9heC7sXtBpy40X7MK<;4E>^WByk^^5%BlUXa#XPfzAapGi! z`qAR|>{cyo*Hf5q8k~(72*+z)J)^^29cG5&k;0l+L@{;%57T3+vAd0I&^IY<~f&^=~8;Ta5_(s+p)6z_)A3zal^{J909?iZb-1!GfW zy_x9Y_XY`w>D6ExoN~K=gbHGk?hMxq+C|J`r#RZS#6kd#r7{GIA0mgtEVVywgi|35 z+=h2paQA21QZ+pgJZzx-0fqr%pPuh5t>Go8IRCEE61dt%jke{G6FRe%HM?6U!3O&0 z9BGVN0t&JsGGi9|bd|F-=A}S&SBj-R`*eVdG{&BWAmJLz9qiME&eGx*Z12lkGR^N- z;`zVtbaMtlLKzKJx4(o};)6ay+{@q{8*rNTu@9O-+(CZ;kTmvgSeLN;o=UIjF7zX{&dgkHW5LwrO=00;rL569-SH`L0I>X9YzmGx4j+HVWA zbGZKl-BhU_33!+b&f>WoM=4%I@_;J(g=`4X$YykaA1m=w*HPv!sf-@bkf7~9EJ@^Y ztZeQr0;Z7;wup`Q1Py?nfZ}>70DW1Xpky$Z>@0(=Km+gW$KXPgl!1)Lmc#;-UIz3+ zV(gQFw7>|ZzspcoFm5L2(E%v##zDJ>Z2;SS;bJ^*hh#TkNJl=)*mMaPM;-UnRB$-9 z|ED&Y;MqB`R}v(UoGM$xrtQ`RNsSJOyVUJl3IYFg)1XSyFSf>)Wy-ABL_GK!gyL}6 z$P#jk^Sp2a8IyaO>%G7L36qFhoDGvQCKfrkDYT1xpmxfIc z)B_RLF3DJ3CF^xHZfD9}ne<~hXO@G56$vdR`;|9t$xL*r{;~y>iY0S<&UV{j0GCOm zkKC$Ya!AJHl1tvEb227RGFD!dfO}w;=EhPUJdrVZo@2KhKx0xS$892C$e4Ur?{4u{ z#>C2YOPy>UBDWxn17u7rTpn+NN(PB0>6$D0WlW4?QXiDam^{j{x&t<>QYO~15#ur@ z59)rkp#JY*^6xa)H|HeVrF;{#xtEwLUvt$)nYq3_@lI_wPRY#mqW+!*1aC+t{+}(i zuU6;!9Pj1QEjU=6(VD8wKoW^R)ZMJwz>^XFrau_h@|HlglEfc&*zTjtoGwNUaj;7^ z+26UWn5Qpufj=^S-1~{iovT05WlX;5*&FMd(^wQC;$LH-)`U@lVB z{j2y{1S;t(0M-xOB0ad1*p82aREht+WzH#8;K6nc`4nAQbI{E@>p8Ji&v z*Fp8{#@j2n`<<<{0^bk`Dq+Sl_USrj&b{|QN)vDZ!fJujYu?mL%W03DIL4V&QYHSP z%OQIan8v*2WM7XKG`(iXIiPqNyf8a2XmR`jaUIroXD%9ACu%UVFJW(}UV zLp%FwC^v{i2GY7UE90S~MUroTUyBPR9G-r(*J6B&|PdQ1;SY(i*KdDT)k0LFa zvGaS0B!-fIRS6FCdmTp%EwfVLRt-NF6BluV{hqr~L}@mBY*q&=mr_P}JSFtaYf4MU z8rhBr!`)eUWDqu^gPB4}hGk80kLA_K6T9KZMnod_f@$mG(t-|-Atfu#s<@=Mqu-Iz z$jZ2gGtF!5BqmYqM!2!=VY*0zlE)pQD9RN2QGO6MubY{E9%X-?f6qMuiR>&%@8HEy z+DMP`18wvA5yY+FN)?;#9;sxVKz`C8m`gd+MA{YPl*jNPnh`9|kAHB#?P{$I&+RyS zGOzivd&Lap+C=)o0UPC4kJ|{2nQ)>V`b-}6hI==IQq-F6cQn1tDBF(D9bR2y-LyO3 zj(OKTGljSlpWe17Cy=*<(yB;m+nr(8_u8GaKb@kOm3;A7UdJqoJ0D3LMP?SEId8D( zX`_yrImo=aWQyg~qvV_*4!PLcoSGLnu0^?hF)R7$X%5`LN}P-3RF0&pd)gbGOcX4Ejq}zlUEJ}EM_Nd%Id{zPjBpsvQd@J_`% zysMQs+lIsPu)zlgavtqWH_dV~9CxE^u*pi7Vo79#gBP>d7BV1o1IHLQz=} zjby?{K&n8&09dhtXhp;mo)3{oB|6g5Nb-J zXvg#yJfU|PLIcBTzvwT0@?)2-v~hrO;`z8&%>lqq9T)Gr>xAAj#|KLxsK@27`kc`i z<&A(KoL#IAux>-2IBCCWEtM6=S5BKk)ae*Pi`%8|b)}7h#FqF=^SV|_iH{>{z8@V( zz78Y=_hb(0>pi)m{G)`Py#-_JH*S@LtH$~ySYT7;VxS~A!AkVKGNe1bS3+8MHDg^f za`d-HV0b0^763Hj97KQ97zdX)LLB(gUk?Ad%(&^zVA0hGS^6ii89gmzEkBFB@xp^ElGbq{Qp@~pE`Hm4x0Elx+uCfj#v)8+crQZ^8DJ!mJToC0oz zunS|Q#D>7pcyN}Bbo@%joTZ5hABPz0Uz#(xPdeoE&7m6NSY(v9eAk+RwF zd!urdm)n1LUy?QBPm4`Tf8+5Tx1(40dq+u!d=(@%GHzJxh|`k>i7(^Ix5H0@9ph}X zVircKz}1$*2f7a9Qq|J`+;2>HHY`>8&O!BvWUpQ+(^^DLxX5cn+BkIBHQdR2=5HFc z2j#=dyyc}KT|-@EJ+A@#F$iDr#SIx2?2~XUc+k>2iyevh?=c+Q<#^uRwM;63_hHxX z)h^h7Oc0xsR-V1!^LN?8yk-5RpaHFL$&|)!PFnm7>3K(@k@oGz?=|HM5K>(&^jAFz z?%FOT{$Z^T{y;q=RZA*f-)BKq@bl+@%F%(j|mYmZFpo!ffYmz3-H+Plj(&8 zP(KY&q^=CxRoEnHY{q>~xFG#XbMbfJZg6g37KkTabgJfz<%emNjG&aLQ)mTr(AyXGu(Gi> zQ_T|2O$9Xe%?o33*@fm5B`sdl)kxLc3(X;0OZu}F&@-&L1$#Wpx0)ZnP`^y6O8{5! z#I;;bAe8hBh#fCXSg!1PT6a0Y#_>X{yMkw62lx|pp>K_XXE5)wa=XKYKAn|aPo@OQ zZSf%$MHA@bXwgDu6B!pe(~jOP=0y#n$h88dZjv~%VL*IpVut+olt?>2Q5=~$C=O1T zfzvLEnhFxc6C;D-b72ASPA_WH#e37ajswDT?E&p0yI4itgN_9?CCsTrOt;fSR<|oP zkKb5)ksQ!I3TJi99uQ7G4}cqdq~|@l)3l* z`T++~gkBukd#ayw5BrYjikiCjF0SDq+vG855HHng`D~`VVI)m?!x4iW^GC6m+x&^jEN8 zw*kenJrnY2O@ead8Bvdi4q42Jr-`dyu?X8I__V|sA-bWY=T*E?;?9Z7xvoxQN#IYN ziJ-wo0TttlW0kC?8H7~ND81S(=Ib4?>|QtxUE=^neA=$gpCy?W3|r>~1}6h7U-7 zj%3ix4Va3pjl906xuP8-ui)ke6WXnfM|8Ju5C4P&OZL=fk+DzvrFZdE*{6qHq*p&6 zOb`C>hz;qG40r%Htv$_Zp%M_loUq%sR(Q;pp$*4Z+dk@$9HjzS?-R@mK^OS`80oEM z3B6c^jpS;9WS0ysVW~yQK(oKcbfvrL1-4<;GW?+iRV%&1CZ$(5u0w^2X-L>x8HT4n zsgbR@$5AFwN@PD#CMiz~aTFticw}gT#0+2I3|}>Po9d6~$_NCidmM3O3t zfj`M^DgtDc_oMWZu9Wn8*-cr1lRCYW-KPa;YOt-<0~sFq73T64WSgU@o-LC(A|~&r zu8)&|`U=>wTzTud3@V&kw`Hj>v@7^4Wcw9*^c7@#Cj)k0rpmV=Tho>JAsLgeAlt>Z zdh=xl*EnDk{hdtU!@s+v-1s<0;HvbyO{ZmY&9U88CmW)m?P0QAM);pWwr_Jz+>xQ$ z{|vHK&?Fk4lri}qVvzrf(A581xbVNzT>lJ4{|d7GXITB0knKNPYG19+`8Q)yev_?E zZ)f&(>HYh^K(^oZhcAyXQfrqkm0^mcFCp8n&Pl$4Y#(a=wB(c1ebcjTV{adqE!(U0 z5lf*DStOqQC1e|;9eMbUOp~vI%>NlgE5&P*GPWmyTWiuriuB_MY2)#y&n5uI`&EOa zxyw;@aKS8=e!L+WlaeBoiLV)ZHBCX*_{lb?T4wK>Uu|*Kvh$n$m$I+}KJSrTfitAnjMqu;+(}ZGh8n^uNG5{}c$K7@?VD|- z*B~URYxD1Z9*1T0WT&8#bCpj>tKo~VIW$&QWz{V|LUa+~agn6jc^kIceqv3ysT+FW&2xeeey QVURmyeDpxpz7v=K3yggNyZ`_I