From 424d3ca8d9c5d612606444b2a2099cfad37f1888 Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 14 May 2019 15:34:23 +0200 Subject: [PATCH] examples review Redesigns, deletes and renames Also noted authors propertly on contributed examples --- .../{core_3d_mode.c => core_3d_camera_mode.c} | 10 +- ...re_3d_mode.png => core_3d_camera_mode.png} | Bin examples/core/core_color_select.c | 94 -------- examples/core/core_color_select.png | Bin 14328 -> 0 bytes examples/core/core_custom_logging.c | 4 +- ...ures_detection.c => core_input_gestures.c} | 4 +- ..._detection.png => core_input_gestures.png} | Bin ...mouse_wheel.c => core_input_mouse_wheel.c} | 4 +- ...e_wheel.png => core_input_mouse_wheel.png} | Bin examples/core/core_input_multitouch.c | 4 +- examples/core/core_loading_thread.c | 86 ++++---- ...le_letterbox.c => core_window_letterbox.c} | 4 +- ...etterbox.png => core_window_letterbox.png} | Bin .../models/models_orthographic_projection.c | 6 +- examples/models/models_yaw_pitch_roll.c | 4 +- examples/shaders/shaders_julia_set.c | 206 ++++++++---------- examples/shaders/shaders_palette_switch.c | 4 +- examples/shaders/shaders_texture_drawing.c | 2 + examples/shaders/shaders_texture_waves.c | 4 +- examples/shapes/shapes_colors_palette.c | 114 +++++----- examples/shapes/shapes_colors_palette.png | Bin 6591 -> 18089 bytes examples/shapes/shapes_draw_circle_sector.c | 4 +- .../shapes/shapes_draw_rectangle_rounded.c | 4 +- examples/shapes/shapes_draw_ring.c | 4 +- ...ing_mouse.c => shapes_rectangle_scaling.c} | 4 +- ...mouse.png => shapes_rectangle_scaling.png} | Bin examples/text/text_bmfont_ttf.c | 38 +++- examples/text/text_bmfont_ttf.png | Bin 19542 -> 20086 bytes examples/text/text_bmfont_unordered.c | 65 ------ examples/text/text_bmfont_unordered.png | Bin 18713 -> 0 bytes ...de_rectangle.c => text_rectangle_bounds.c} | 6 +- ...ectangle.png => text_rectangle_bounds.png} | Bin examples/text/text_unicode.c | 2 + examples/textures/textures_image_npatch.png | Bin 18306 -> 0 bytes ...age_npatch.c => textures_npatch_drawing.c} | 43 ++-- examples/textures/textures_npatch_drawing.png | Bin 0 -> 26858 bytes 36 files changed, 289 insertions(+), 431 deletions(-) rename examples/core/{core_3d_mode.c => core_3d_camera_mode.c} (93%) rename examples/core/{core_3d_mode.png => core_3d_camera_mode.png} (100%) delete mode 100644 examples/core/core_color_select.c delete mode 100644 examples/core/core_color_select.png rename examples/core/{core_gestures_detection.c => core_input_gestures.c} (98%) rename examples/core/{core_gestures_detection.png => core_input_gestures.png} (100%) rename examples/core/{core_mouse_wheel.c => core_input_mouse_wheel.c} (96%) rename examples/core/{core_mouse_wheel.png => core_input_mouse_wheel.png} (100%) rename examples/core/{core_window_scale_letterbox.c => core_window_letterbox.c} (95%) rename examples/core/{core_window_scale_letterbox.png => core_window_letterbox.png} (100%) rename examples/shapes/{shapes_rectangle_scaling_mouse.c => shapes_rectangle_scaling.c} (95%) rename examples/shapes/{shapes_rectangle_scaling_mouse.png => shapes_rectangle_scaling.png} (100%) delete mode 100644 examples/text/text_bmfont_unordered.c delete mode 100644 examples/text/text_bmfont_unordered.png rename examples/text/{text_draw_inside_rectangle.c => text_rectangle_bounds.c} (96%) rename examples/text/{text_draw_inside_rectangle.png => text_rectangle_bounds.png} (100%) delete mode 100644 examples/textures/textures_image_npatch.png rename examples/textures/{textures_image_npatch.c => textures_npatch_drawing.c} (72%) create mode 100644 examples/textures/textures_npatch_drawing.png diff --git a/examples/core/core_3d_mode.c b/examples/core/core_3d_camera_mode.c similarity index 93% rename from examples/core/core_3d_mode.c rename to examples/core/core_3d_camera_mode.c index 39c0752ab..a4962200f 100644 --- a/examples/core/core_3d_mode.c +++ b/examples/core/core_3d_camera_mode.c @@ -1,6 +1,6 @@ /******************************************************************************************* * -* raylib [core] example - Initialize 3d mode +* raylib [core] example - Initialize 3d camera mode * * This example has been created using raylib 1.0 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) @@ -15,13 +15,13 @@ int main() { // Initialization //-------------------------------------------------------------------------------------- - int screenWidth = 800; - int screenHeight = 450; + const int screenWidth = 800; + const int screenHeight = 450; - InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d mode"); + InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera mode"); // Define the camera to look into our 3d world - Camera3D camera; + Camera3D camera = { 0 }; camera.position = (Vector3){ 0.0f, 10.0f, 10.0f }; // Camera position camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) diff --git a/examples/core/core_3d_mode.png b/examples/core/core_3d_camera_mode.png similarity index 100% rename from examples/core/core_3d_mode.png rename to examples/core/core_3d_camera_mode.png diff --git a/examples/core/core_color_select.c b/examples/core/core_color_select.c deleted file mode 100644 index 002a69312..000000000 --- a/examples/core/core_color_select.c +++ /dev/null @@ -1,94 +0,0 @@ -/******************************************************************************************* -* -* raylib [core] example - Color selection by mouse (collision detection) -* -* This example has been created using raylib 1.0 (www.raylib.com) -* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) -* -* Copyright (c) 2014 Ramon Santamaria (@raysan5) -* -********************************************************************************************/ - -#include "raylib.h" - -int main() -{ - // Initialization - //-------------------------------------------------------------------------------------- - int screenWidth = 800; - int screenHeight = 450; - - InitWindow(screenWidth, screenHeight, "raylib [core] example - color selection (collision detection)"); - - Color colors[21] = { DARKGRAY, MAROON, ORANGE, DARKGREEN, DARKBLUE, DARKPURPLE, DARKBROWN, - GRAY, RED, GOLD, LIME, BLUE, VIOLET, BROWN, LIGHTGRAY, PINK, YELLOW, - GREEN, SKYBLUE, PURPLE, BEIGE }; - - Rectangle colorsRecs[21]; // Rectangles array - - // Fills colorsRecs data (for every rectangle) - for (int i = 0; i < 21; i++) - { - colorsRecs[i].x = 20 + 100*(i%7) + 10*(i%7); - colorsRecs[i].y = 60 + 100*(i/7) + 10*(i/7); - colorsRecs[i].width = 100; - colorsRecs[i].height = 100; - } - - bool selected[21] = { false }; // Selected rectangles indicator - - Vector2 mousePoint; - - 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 - //---------------------------------------------------------------------------------- - mousePoint = GetMousePosition(); - - for (int i = 0; i < 21; i++) // Iterate along all the rectangles - { - if (CheckCollisionPointRec(mousePoint, colorsRecs[i])) - { - colors[i].a = 120; - - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) selected[i] = !selected[i]; - } - else colors[i].a = 255; - } - //---------------------------------------------------------------------------------- - - // Draw - //---------------------------------------------------------------------------------- - BeginDrawing(); - - ClearBackground(RAYWHITE); - - for (int i = 0; i < 21; i++) // Draw all rectangles - { - DrawRectangleRec(colorsRecs[i], colors[i]); - - // Draw four rectangles around selected rectangle - if (selected[i]) - { - DrawRectangle(colorsRecs[i].x, colorsRecs[i].y, 100, 10, RAYWHITE); // Square top rectangle - DrawRectangle(colorsRecs[i].x, colorsRecs[i].y, 10, 100, RAYWHITE); // Square left rectangle - DrawRectangle(colorsRecs[i].x + 90, colorsRecs[i].y, 10, 100, RAYWHITE); // Square right rectangle - DrawRectangle(colorsRecs[i].x, colorsRecs[i].y + 90, 100, 10, RAYWHITE); // Square bottom rectangle - } - } - - EndDrawing(); - //---------------------------------------------------------------------------------- - } - - // De-Initialization - //-------------------------------------------------------------------------------------- - CloseWindow(); // Close window and OpenGL context - //-------------------------------------------------------------------------------------- - - return 0; -} \ No newline at end of file diff --git a/examples/core/core_color_select.png b/examples/core/core_color_select.png deleted file mode 100644 index 93ab83ae36ea17db91d4d0ffc4fa134a7cf08e11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14328 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 a&t#doisi+%(?>v?**snST-G@yGywo%;@@BZ diff --git a/examples/core/core_custom_logging.c b/examples/core/core_custom_logging.c index 4c4caf5d7..cf1a601fa 100644 --- a/examples/core/core_custom_logging.c +++ b/examples/core/core_custom_logging.c @@ -5,7 +5,9 @@ * This example has been created using raylib 2.1 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2018 Ramon Santamaria (@raysan5) and Pablo Marcos Oltra (@pamarcos) +* Example contributed by Pablo Marcos Oltra (@pamarcos) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2018 Pablo Marcos Oltra (@pamarcos) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/core/core_gestures_detection.c b/examples/core/core_input_gestures.c similarity index 98% rename from examples/core/core_gestures_detection.c rename to examples/core/core_input_gestures.c index 63a1e6bdf..ce2ed86c7 100644 --- a/examples/core/core_gestures_detection.c +++ b/examples/core/core_input_gestures.c @@ -1,6 +1,6 @@ /******************************************************************************************* * -* raylib [core] example - Gestures Detection +* raylib [core] example - Input Gestures Detection * * This example has been created using raylib 1.4 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) @@ -21,7 +21,7 @@ int main() int screenWidth = 800; int screenHeight = 450; - InitWindow(screenWidth, screenHeight, "raylib [core] example - gestures detection"); + InitWindow(screenWidth, screenHeight, "raylib [core] example - input gestures"); Vector2 touchPosition = { 0, 0 }; Rectangle touchArea = { 220, 10, screenWidth - 230, screenHeight - 20 }; diff --git a/examples/core/core_gestures_detection.png b/examples/core/core_input_gestures.png similarity index 100% rename from examples/core/core_gestures_detection.png rename to examples/core/core_input_gestures.png diff --git a/examples/core/core_mouse_wheel.c b/examples/core/core_input_mouse_wheel.c similarity index 96% rename from examples/core/core_mouse_wheel.c rename to examples/core/core_input_mouse_wheel.c index 6a5252ee5..48cf70426 100644 --- a/examples/core/core_mouse_wheel.c +++ b/examples/core/core_input_mouse_wheel.c @@ -1,6 +1,6 @@ /******************************************************************************************* * -* raylib [core] examples - Mouse wheel +* raylib [core] examples - Mouse wheel input * * This test has been created using raylib 1.1 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) @@ -18,7 +18,7 @@ int main() int screenWidth = 800; int screenHeight = 450; - InitWindow(screenWidth, screenHeight, "raylib [core] example - mouse wheel"); + InitWindow(screenWidth, screenHeight, "raylib [core] example - input mouse wheel"); int boxPositionY = screenHeight/2 - 40; int scrollSpeed = 4; // Scrolling speed in pixels diff --git a/examples/core/core_mouse_wheel.png b/examples/core/core_input_mouse_wheel.png similarity index 100% rename from examples/core/core_mouse_wheel.png rename to examples/core/core_input_mouse_wheel.png diff --git a/examples/core/core_input_multitouch.c b/examples/core/core_input_multitouch.c index ef8fa7ae2..5baab2712 100644 --- a/examples/core/core_input_multitouch.c +++ b/examples/core/core_input_multitouch.c @@ -5,7 +5,9 @@ * This example has been created using raylib 2.1 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2014-2019 Berni and Ramon Santamaria (@raysan5) +* Example contributed by Berni (@Berni8k) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2019 Berni (@Berni8k) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/core/core_loading_thread.c b/examples/core/core_loading_thread.c index 4ffc9d0bf..1dacd69f2 100644 --- a/examples/core/core_loading_thread.c +++ b/examples/core/core_loading_thread.c @@ -15,10 +15,13 @@ #include "raylib.h" #include "pthread.h" // POSIX style threads management -#include -#include // Required for clock() function +#include // C11 atomic data types +#include // Required for: clock() + +// Using C11 atomics for synchronization +// NOTE: A plain bool (or any plain data type for that matter) can't be used for inter-thread synchronization static atomic_bool dataLoaded = ATOMIC_VAR_INIT(false); // Data Loaded completion indicator static void *LoadDataThread(void *arg); // Loading data thread function declaration @@ -48,33 +51,37 @@ int main() //---------------------------------------------------------------------------------- switch (state) { - case STATE_WAITING: - if (IsKeyPressed(KEY_ENTER)) + case STATE_WAITING: { - int error = pthread_create(&threadId, NULL, &LoadDataThread, NULL); - if (error != 0) TraceLog(LOG_ERROR, "Error creating loading thread"); - else TraceLog(LOG_INFO, "Loading thread initialized successfully"); + if (IsKeyPressed(KEY_ENTER)) + { + int error = pthread_create(&threadId, NULL, &LoadDataThread, NULL); + if (error != 0) TraceLog(LOG_ERROR, "Error creating loading thread"); + else TraceLog(LOG_INFO, "Loading thread initialized successfully"); - state = STATE_LOADING; - } - break; - case STATE_LOADING: - framesCounter++; - if (atomic_load(&dataLoaded)) + state = STATE_LOADING; + } + } break; + case STATE_LOADING: { - framesCounter = 0; - state = STATE_FINISHED; - } - break; - case STATE_FINISHED: - if (IsKeyPressed(KEY_ENTER)) + framesCounter++; + if (atomic_load(&dataLoaded)) + { + framesCounter = 0; + state = STATE_FINISHED; + } + } break; + case STATE_FINISHED: { - // Reset everything to launch again - atomic_store(&dataLoaded, false); - dataProgress = 0; - state = STATE_WAITING; - } - break; + if (IsKeyPressed(KEY_ENTER)) + { + // Reset everything to launch again + atomic_store(&dataLoaded, false); + dataProgress = 0; + state = STATE_WAITING; + } + } break; + default: break; } //---------------------------------------------------------------------------------- @@ -84,19 +91,22 @@ int main() ClearBackground(RAYWHITE); - switch(state) { - case STATE_WAITING: - DrawText("PRESS ENTER to START LOADING DATA", 150, 170, 20, DARKGRAY); - break; - case STATE_LOADING: - DrawRectangle(150, 200, dataProgress, 60, SKYBLUE); - if ((framesCounter/15)%2) - DrawText("LOADING DATA...", 240, 210, 40, DARKBLUE); - break; - case STATE_FINISHED: - DrawRectangle(150, 200, 500, 60, LIME); - DrawText("DATA LOADED!", 250, 210, 40, GREEN); - break; + switch (state) + { + case STATE_WAITING: DrawText("PRESS ENTER to START LOADING DATA", 150, 170, 20, DARKGRAY); break; + case STATE_LOADING: + { + DrawRectangle(150, 200, dataProgress, 60, SKYBLUE); + if ((framesCounter/15)%2) DrawText("LOADING DATA...", 240, 210, 40, DARKBLUE); + + } break; + case STATE_FINISHED: + { + DrawRectangle(150, 200, 500, 60, LIME); + DrawText("DATA LOADED!", 250, 210, 40, GREEN); + + } break; + default: break; } DrawRectangleLines(150, 200, 500, 60, DARKGRAY); diff --git a/examples/core/core_window_scale_letterbox.c b/examples/core/core_window_letterbox.c similarity index 95% rename from examples/core/core_window_scale_letterbox.c rename to examples/core/core_window_letterbox.c index ea4a375a2..8c0843d25 100644 --- a/examples/core/core_window_scale_letterbox.c +++ b/examples/core/core_window_letterbox.c @@ -5,7 +5,9 @@ * This example has been created using raylib 2.5 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2019 Anata and Ramon Santamaria (@raysan5) +* Example contributed by Anata (@anatagawa) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2019 Anata (@anatagawa) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/core/core_window_scale_letterbox.png b/examples/core/core_window_letterbox.png similarity index 100% rename from examples/core/core_window_scale_letterbox.png rename to examples/core/core_window_letterbox.png diff --git a/examples/models/models_orthographic_projection.c b/examples/models/models_orthographic_projection.c index f9b54b6d0..3ad32b608 100644 --- a/examples/models/models_orthographic_projection.c +++ b/examples/models/models_orthographic_projection.c @@ -4,10 +4,12 @@ * * This program is heavily based on the geometric objects example * -* This example has been created using raylib 1.9.7 (www.raylib.com) +* This example has been created using raylib 2.0 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2018 Max Danielsson & Ramon Santamaria (@raysan5) +* Example contributed by Max Danielsson (@autious) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2018 Max Danielsson (@autious) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/models/models_yaw_pitch_roll.c b/examples/models/models_yaw_pitch_roll.c index 7eaaf0bea..658be0846 100644 --- a/examples/models/models_yaw_pitch_roll.c +++ b/examples/models/models_yaw_pitch_roll.c @@ -5,9 +5,9 @@ * This example has been created using raylib 1.8 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Example based on Berni work on Raspberry Pi. +* Example contributed by Berni (@Berni8k) and reviewed by Ramon Santamaria (@raysan5) * -* Copyright (c) 2017 Ramon Santamaria (@raysan5) +* Copyright (c) 2017 Berni (@Berni8k) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/shaders/shaders_julia_set.c b/examples/shaders/shaders_julia_set.c index 381cd33ef..c4dac6d20 100644 --- a/examples/shaders/shaders_julia_set.c +++ b/examples/shaders/shaders_julia_set.c @@ -1,6 +1,6 @@ /******************************************************************************************* * -* raylib [shaders] example - Render julia sets using a shader. +* raylib [shaders] example - julia sets * * NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support, * OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version. @@ -10,73 +10,68 @@ * This example has been created using raylib 2.5 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Author: eggmund (https://github.com/eggmund) +* Example contributed by eggmund (@eggmund) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2019 eggmund (@eggmund) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ #include "raylib.h" -#include // For memcpy -// Speed when using auto -const float AUTO_SPEED = 0.0005; +#include "raymath.h" // A few good julia sets const float POINTS_OF_INTEREST[6][2] = { - {-0.348827, 0.607167}, - {-0.786268, 0.169728}, - {-0.8, 0.156}, - {0.285, 0.0}, - {-0.835, -0.2321}, - {-0.70176, -0.3842}, + { -0.348827, 0.607167 }, + { -0.786268, 0.169728 }, + { -0.8, 0.156 }, + { 0.285, 0.0 }, + { -0.835, -0.2321 }, + { -0.70176, -0.3842 }, }; int main() { // Initialization //-------------------------------------------------------------------------------------- - int screenWidth = 1280; - int screenHeight = 720; + const int screenWidth = 800; + const int screenHeight = 450; - InitWindow(screenWidth, screenHeight, "raylib [shaders] example - julia set renderer"); - - // If julia set is rendered for this frame. - bool rendered = false; - - bool showControls = true; - - // Multiplier of speed to change c value. Set to 3 to start off with. - int incrementSpeed = 3; - - // Offset and zoom to draw the julia set at. (centered on screen and 1.6 times smaller) - float offset[2] = { -(float)screenWidth/2, -(float)screenHeight/2 }; - float zoom = 1.6; - - // c constant to use in z^2 + c - float c[2]; - // Copy a point of interest into the c variable. 4 bytes per float (32 bits). - memcpy(c, &POINTS_OF_INTEREST[0], 8); + InitWindow(screenWidth, screenHeight, "raylib [shaders] example - julia sets"); // Load julia set shader // NOTE: Defining 0 (NULL) for vertex shader forces usage of internal default vertex shader Shader shader = LoadShader(0, "resources/shaders/glsl330/julia_shader.fs"); - // Get variable (uniform) location on the shader to connect with the program + // c constant to use in z^2 + c + float c[2] = { POINTS_OF_INTEREST[0][0], POINTS_OF_INTEREST[0][1] }; + + // Offset and zoom to draw the julia set at. (centered on screen and 1.6 times smaller) + float offset[2] = { -(float)screenWidth/2, -(float)screenHeight/2 }; + float zoom = 1.6f; + + // Get variable (uniform) locations on the shader to connect with the program // NOTE: If uniform variable could not be found in the shader, function returns -1 - // The location of c will be stored since we will need to change this whenever c changes int cLoc = GetShaderLocation(shader, "c"); + int zoomLoc = GetShaderLocation(shader, "zoom"); + int offsetLoc = GetShaderLocation(shader, "offset"); // Tell the shader what the screen dimensions, zoom, offset and c are float screenDims[2] = { (float)screenWidth, (float)screenHeight }; SetShaderValue(shader, GetShaderLocation(shader, "screenDims"), screenDims, UNIFORM_VEC2); - SetShaderValue(shader, GetShaderLocation(shader, "zoom"), &zoom, UNIFORM_FLOAT); - SetShaderValue(shader, GetShaderLocation(shader, "offset"), offset, UNIFORM_VEC2); - - SetShaderValue(shader, cLoc, c, UNIFORM_VEC2); + SetShaderValue(shader, cLoc, c, UNIFORM_VEC2); + SetShaderValue(shader, zoomLoc, &zoom, UNIFORM_FLOAT); + SetShaderValue(shader, offsetLoc, offset, UNIFORM_VEC2); + // Create a RenderTexture2D to be used for render to texture RenderTexture2D target = LoadRenderTexture(screenWidth, screenHeight); + int incrementSpeed = 3; // Multiplier of speed to change c value + bool showControls = true; // Show controls + bool pause = false; // Pause animation + SetTargetFPS(60); // Set the window to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -86,115 +81,86 @@ int main() // Update //---------------------------------------------------------------------------------- - // Get input - //---------------------------------------------------------------------------------- - - // Press 1 - 6 to reset c to a point of interest. - if (IsKeyPressed(KEY_ONE) || IsKeyPressed(KEY_TWO) || IsKeyPressed(KEY_THREE) || IsKeyPressed(KEY_FOUR) || IsKeyPressed(KEY_FIVE) || IsKeyPressed(KEY_SIX)) + // Press [1 - 6] to reset c to a point of interest + if (IsKeyPressed(KEY_ONE) || + IsKeyPressed(KEY_TWO) || + IsKeyPressed(KEY_THREE) || + IsKeyPressed(KEY_FOUR) || + IsKeyPressed(KEY_FIVE) || + IsKeyPressed(KEY_SIX)) { - if (IsKeyPressed(KEY_ONE)) - { - memcpy(c, &POINTS_OF_INTEREST[0], 8); - } - else if (IsKeyPressed(KEY_TWO)) - { - memcpy(c, &POINTS_OF_INTEREST[1], 8); - } - else if (IsKeyPressed(KEY_THREE)) - { - memcpy(c, &POINTS_OF_INTEREST[2], 8); - } - else if (IsKeyPressed(KEY_FOUR)) - { - memcpy(c, &POINTS_OF_INTEREST[3], 8); - } - else if (IsKeyPressed(KEY_FIVE)) - { - memcpy(c, &POINTS_OF_INTEREST[4], 8); - } - else if (IsKeyPressed(KEY_SIX)) - { - memcpy(c, &POINTS_OF_INTEREST[5], 8); - } + if (IsKeyPressed(KEY_ONE)) c[0] = POINTS_OF_INTEREST[0][0], c[1] = POINTS_OF_INTEREST[0][1]; + else if (IsKeyPressed(KEY_TWO)) c[0] = POINTS_OF_INTEREST[1][0], c[1] = POINTS_OF_INTEREST[1][1]; + else if (IsKeyPressed(KEY_THREE)) c[0] = POINTS_OF_INTEREST[2][0], c[1] = POINTS_OF_INTEREST[2][1]; + else if (IsKeyPressed(KEY_FOUR)) c[0] = POINTS_OF_INTEREST[3][0], c[1] = POINTS_OF_INTEREST[3][1]; + else if (IsKeyPressed(KEY_FIVE)) c[0] = POINTS_OF_INTEREST[4][0], c[1] = POINTS_OF_INTEREST[4][1]; + else if (IsKeyPressed(KEY_SIX)) c[0] = POINTS_OF_INTEREST[5][0], c[1] = POINTS_OF_INTEREST[5][1]; + SetShaderValue(shader, cLoc, c, UNIFORM_VEC2); - rendered = false; // c value has changed, so render the set again. } - // Press "r" to stop changing c - if (IsKeyPressed(KEY_R)) + if (IsKeyPressed(KEY_P)) pause = !pause; // Pause animation (c change) + if (IsKeyPressed(KEY_F1)) showControls = !showControls; // Toggle whether or not to show controls + + if (!pause) { - incrementSpeed = 0; - } + if (IsKeyDown(KEY_RIGHT)) incrementSpeed++; + else if (IsKeyDown(KEY_LEFT)) incrementSpeed--; - // Toggle whether or not to show controls - if (IsKeyPressed(KEY_H)) - { - showControls = !showControls; - } - - // Scroll to change c increment speed. - int mouseMv = GetMouseWheelMove(); // Get the amount the mouse has moved this frame - if (mouseMv != 0) - { - if (IsKeyDown(KEY_LEFT_SHIFT)) + // Use mouse wheel to change zoom + zoom -= (float)GetMouseWheelMove()/10.f; + SetShaderValue(shader, zoomLoc, &zoom, UNIFORM_FLOAT); + + // Use mouse button to change offset + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) { - incrementSpeed += mouseMv * 10; - } - else - { - incrementSpeed += mouseMv; - } - rendered = false; - } + // TODO: Logic is not correct, the idea is getting zoom focus to pointed area + Vector2 mousePos = GetMousePosition(); - if (incrementSpeed != 0) - { - float amount = GetFrameTime() * incrementSpeed * AUTO_SPEED; + offset[0] = mousePos.x -(float)screenWidth; + offset[1] = mousePos.y -(float)screenHeight; + + SetShaderValue(shader, offsetLoc, offset, UNIFORM_VEC2); + } + + // Increment c value with time + float amount = GetFrameTime()*incrementSpeed*0.0005f; c[0] += amount; c[1] += amount; - // Update the c value in the shader. SetShaderValue(shader, cLoc, c, UNIFORM_VEC2); - rendered = false; } - //---------------------------------------------------------------------------------- // Draw //---------------------------------------------------------------------------------- BeginDrawing(); - ClearBackground(BLACK); // Clear the screen of the previous frame. + ClearBackground(BLACK); // Clear the screen of the previous frame. - // If the c value has changed, redraw the julia set using the shader, onto the render texture. - if (!rendered) - { - BeginTextureMode(target); // Enable drawing to texture + // Using a render texture to draw Julia set + BeginTextureMode(target); // Enable drawing to texture + ClearBackground(BLACK); // Clear the render texture - ClearBackground(BLACK); // Clear the last frame drawn on the texture. + // Draw a rectangle in shader mode + // NOTE: This acts as a canvas for the shader to draw on + BeginShaderMode(shader); + DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), BLACK); + EndShaderMode(); + EndTextureMode(); - // Draw a rectangle in shader mode. This acts as a canvas for the shader to draw on. - BeginShaderMode(shader); - DrawRectangle(0, 0, screenWidth, screenHeight, BLACK); - EndShaderMode(); - - EndTextureMode(); - - rendered = true; // The set is now rendered, so do not compute it again until it next changes. - } - - // Draw the saved texture (rendered julia set). - DrawTextureRec(target.texture, (Rectangle){ 0, 0, target.texture.width, target.texture.height }, (Vector2){ 0, 0 }, WHITE); + // Draw the saved texture (rendered julia set) + DrawTextureRec(target.texture, (Rectangle){ 0, 0, target.texture.width, -target.texture.height }, Vector2Zero(), WHITE); - // Print information. - DrawText( FormatText("cx: %f\ncy: %f\nspeed: %d", c[0], c[1], incrementSpeed), 10, 10, 20, RAYWHITE ); + // Draw information + //DrawText( FormatText("cx: %f\ncy: %f\nspeed: %d", c[0], c[1], incrementSpeed), 10, 10, 10, RAYWHITE); if (showControls) { - DrawText("Press keys 1 - 6 to change point of interest.", 10, screenHeight - 88, 20, RAYWHITE); - DrawText("Use the scroll wheel to auto increment the c value. Hold shift while scrolling to increase speed by 10.", 10, screenHeight - 66, 20, RAYWHITE); - DrawText("Press 'r' to reset speed.", 10, screenHeight - 44, 20, RAYWHITE); - DrawText("Press 'h' to hide these controls.", 10, screenHeight - 22, 20, RAYWHITE); + DrawText("Press keys [1 - 6] to change point of interest", 10, GetScreenHeight() - 60, 10, RAYWHITE); + DrawText("Press KEY_LEFT | KEY_RIGHT to change speed", 10, GetScreenHeight() - 45, 10, RAYWHITE); + DrawText("Press KEY_P to pause movement animation", 10, GetScreenHeight() - 30, 10, RAYWHITE); + DrawText("Press KEY_F1 to toggle these controls", 10, GetScreenHeight() - 15, 10, RAYWHITE); } EndDrawing(); diff --git a/examples/shaders/shaders_palette_switch.c b/examples/shaders/shaders_palette_switch.c index a2fa0b278..fa0bafaf8 100644 --- a/examples/shaders/shaders_palette_switch.c +++ b/examples/shaders/shaders_palette_switch.c @@ -12,7 +12,9 @@ * This example has been created using raylib 2.3 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2019 Ramon Santamaria (@raysan5) +* Example contributed by Marco Lizza (@MarcoLizza) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2019 Marco Lizza (@MarcoLizza) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/shaders/shaders_texture_drawing.c b/examples/shaders/shaders_texture_drawing.c index f57582734..3a5400980 100644 --- a/examples/shaders/shaders_texture_drawing.c +++ b/examples/shaders/shaders_texture_drawing.c @@ -7,6 +7,8 @@ * This example has been created using raylib 2.0 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * +* Example contributed by Michał Ciesielski and reviewed by Ramon Santamaria (@raysan5) +* * Copyright (c) 2019 Michał Ciesielski and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/shaders/shaders_texture_waves.c b/examples/shaders/shaders_texture_waves.c index 03c62debd..bc677c788 100644 --- a/examples/shaders/shaders_texture_waves.c +++ b/examples/shaders/shaders_texture_waves.c @@ -12,7 +12,9 @@ * This example has been created using raylib 2.5 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2019 Anata (creator) and Ramon Santamaria (review) (@raysan5) +* Example contributed by Anata (@anatagawa) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2019 Anata (@anatagawa) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/shapes/shapes_colors_palette.c b/examples/shapes/shapes_colors_palette.c index dcab862e2..d6ac30a9f 100644 --- a/examples/shapes/shapes_colors_palette.c +++ b/examples/shapes/shapes_colors_palette.c @@ -1,26 +1,53 @@ /******************************************************************************************* * -* raylib [shapes] example - Draw raylib custom color palette +* raylib [shapes] example - Colors palette * -* This example has been created using raylib 1.0 (www.raylib.com) +* This example has been created using raylib 2.5 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2014 Ramon Santamaria (@raysan5) +* Copyright (c) 2014-2019 Ramon Santamaria (@raysan5) * ********************************************************************************************/ #include "raylib.h" +#define MAX_COLORS_COUNT 21 // Number of colors available + int main() { // Initialization //-------------------------------------------------------------------------------------- - int screenWidth = 800; - int screenHeight = 450; + const int screenWidth = 800; + const int screenHeight = 450; - InitWindow(screenWidth, screenHeight, "raylib [shapes] example - raylib color palette"); - - SetTargetFPS(60); + InitWindow(screenWidth, screenHeight, "raylib [shapes] example - colors palette"); + + Color colors[MAX_COLORS_COUNT] = { + DARKGRAY, MAROON, ORANGE, DARKGREEN, DARKBLUE, DARKPURPLE, DARKBROWN, + GRAY, RED, GOLD, LIME, BLUE, VIOLET, BROWN, LIGHTGRAY, PINK, YELLOW, + GREEN, SKYBLUE, PURPLE, BEIGE }; + + const char *colorNames[MAX_COLORS_COUNT] = { + "DARKGRAY", "MAROON", "ORANGE", "DARKGREEN", "DARKBLUE", "DARKPURPLE", + "DARKBROWN", "GRAY", "RED", "GOLD", "LIME", "BLUE", "VIOLET", "BROWN", + "LIGHTGRAY", "PINK", "YELLOW", "GREEN", "SKYBLUE", "PURPLE", "BEIGE" }; + + Rectangle colorsRecs[MAX_COLORS_COUNT] = { 0 }; // Rectangles array + + // Fills colorsRecs data (for every rectangle) + for (int i = 0; i < MAX_COLORS_COUNT; i++) + { + colorsRecs[i].x = 20 + 100*(i%7) + 10*(i%7); + colorsRecs[i].y = 80 + 100*(i/7) + 10*(i/7); + colorsRecs[i].width = 100; + colorsRecs[i].height = 100; + } + + int colorState[MAX_COLORS_COUNT] = { 0 }; // Color state: 0-DEFAULT, 1-MOUSE_HOVER + + Vector2 mousePoint; + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop @@ -28,7 +55,13 @@ int main() { // Update //---------------------------------------------------------------------------------- - // TODO: Update your variables here + mousePoint = GetMousePosition(); + + for (int i = 0; i < MAX_COLORS_COUNT; i++) + { + if (CheckCollisionPointRec(mousePoint, colorsRecs[i])) colorState[i] = 1; + else colorState[i] = 0; + } //---------------------------------------------------------------------------------- // Draw @@ -36,53 +69,22 @@ int main() BeginDrawing(); ClearBackground(RAYWHITE); + + DrawText("raylib colors palette", 28, 42, 20, BLACK); + DrawText("press SPACE to see all colors", GetScreenWidth() - 180, GetScreenHeight() - 40, 10, GRAY); - DrawText("raylib color palette", 28, 42, 20, BLACK); - - DrawRectangle(26, 80, 100, 100, DARKGRAY); - DrawRectangle(26, 188, 100, 100, GRAY); - DrawRectangle(26, 296, 100, 100, LIGHTGRAY); - DrawRectangle(134, 80, 100, 100, MAROON); - DrawRectangle(134, 188, 100, 100, RED); - DrawRectangle(134, 296, 100, 100, PINK); - DrawRectangle(242, 80, 100, 100, ORANGE); - DrawRectangle(242, 188, 100, 100, GOLD); - DrawRectangle(242, 296, 100, 100, YELLOW); - DrawRectangle(350, 80, 100, 100, DARKGREEN); - DrawRectangle(350, 188, 100, 100, LIME); - DrawRectangle(350, 296, 100, 100, GREEN); - DrawRectangle(458, 80, 100, 100, DARKBLUE); - DrawRectangle(458, 188, 100, 100, BLUE); - DrawRectangle(458, 296, 100, 100, SKYBLUE); - DrawRectangle(566, 80, 100, 100, DARKPURPLE); - DrawRectangle(566, 188, 100, 100, VIOLET); - DrawRectangle(566, 296, 100, 100, PURPLE); - DrawRectangle(674, 80, 100, 100, DARKBROWN); - DrawRectangle(674, 188, 100, 100, BROWN); - DrawRectangle(674, 296, 100, 100, BEIGE); - - - DrawText("DARKGRAY", 65, 166, 10, BLACK); - DrawText("GRAY", 93, 274, 10, BLACK); - DrawText("LIGHTGRAY", 61, 382, 10, BLACK); - DrawText("MAROON", 186, 166, 10, BLACK); - DrawText("RED", 208, 274, 10, BLACK); - DrawText("PINK", 204, 382, 10, BLACK); - DrawText("ORANGE", 295, 166, 10, BLACK); - DrawText("GOLD", 310, 274, 10, BLACK); - DrawText("YELLOW", 300, 382, 10, BLACK); - DrawText("DARKGREEN", 382, 166, 10, BLACK); - DrawText("LIME", 420, 274, 10, BLACK); - DrawText("GREEN", 410, 382, 10, BLACK); - DrawText("DARKBLUE", 498, 166, 10, BLACK); - DrawText("BLUE", 526, 274, 10, BLACK); - DrawText("SKYBLUE", 505, 382, 10, BLACK); - DrawText("DARKPURPLE", 592, 166, 10, BLACK); - DrawText("VIOLET", 621, 274, 10, BLACK); - DrawText("PURPLE", 620, 382, 10, BLACK); - DrawText("DARKBROWN", 705, 166, 10, BLACK); - DrawText("BROWN", 733, 274, 10, BLACK); - DrawText("BEIGE", 737, 382, 10, BLACK); + for (int i = 0; i < MAX_COLORS_COUNT; i++) // Draw all rectangles + { + DrawRectangleRec(colorsRecs[i], Fade(colors[i], colorState[i]? 0.6f : 1.0f)); + + if (IsKeyDown(KEY_SPACE) || colorState[i]) + { + DrawRectangle(colorsRecs[i].x, colorsRecs[i].y + colorsRecs[i].height - 26, colorsRecs[i].width, 20, BLACK); + DrawRectangleLinesEx(colorsRecs[i], 6, Fade(BLACK, 0.3f)); + DrawText(colorNames[i], colorsRecs[i].x + colorsRecs[i].width - MeasureText(colorNames[i], 10) - 12, + colorsRecs[i].y + colorsRecs[i].height - 20, 10, colors[i]); + } + } EndDrawing(); //---------------------------------------------------------------------------------- @@ -90,7 +92,7 @@ int main() // De-Initialization //-------------------------------------------------------------------------------------- - CloseWindow(); // Close window and OpenGL context + CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; diff --git a/examples/shapes/shapes_colors_palette.png b/examples/shapes/shapes_colors_palette.png index 4073b6701fb84756d2eddf8954474a0ce9639481..b68e497e4b0495a069a47a9b78d38bdf3bed5ae7 100644 GIT binary patch literal 18089 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYU_8XZ#=yWJp1k%11A|+Er;B4qMO^ZqUteF> zw*?wVF)dcaL6mSXF1r{Y$J=;OKmselSk-zUgFVG$ZExFw42~Wwgh5Z4gPZU{?2*GaR-HNW5+6QQL;o4Z9$2*oe~&ASYbL;l7@>10Ntx2pM&P3K?c!;p^+`7Z*rkE!!I}3M?q%=sDNWqqY)H z*~@S@-C@Jq?FXJk-{4`{`Ks`2!hti&CWjlnWfi{*SQk6JE;ul?>4oUOmY@#>-0Cyx zFCLyAVAb-{Iov(Vrgz#*%(^GUDWQZd#bj+Cmf8ed!(7m1Vaws?*r@#A$hnXU+DAHM zFRER$UGmO!;k3U?W;yGYPm=b3a!zHzZTB~4n0(~d9_qaG#ebE(+vzKq-q2Aruwpiv zCFYJCeu$7XVR<3O)cj9m&BclL7S5Dju{FFc(zr^9Tz1hUA&cq>@_#%gcYp^UhtgAm?eud z1w?ZgFu4c(?_ctvt+%JYPlmrYLcVwX#Y+WfCYi9bg@Y5zvKN@43^AQ?S1ZHm0`Ban zw~i9NlQAP6>hme>U^i(=L3ClZJr+cB^z5)zSe%)S;RaYXcmN5tuQ;0o7j#+NtQ8h_ z=HfJB3$xKIHkf%Bs@mcqo_&SKv*4By?pDdD6F^CNaD+m{irmSYH-FCf!n;V|#_n?c zz;!bhq?kzMH*2tPy_>6i%Jg^E4)@2o0<8_fr^6S;9F|>e3YOfbx6dtR&(3W<$8INd zZNF>kvQy2=u+ronTOfzdZu{vP*DYqe?m2c_fvb^OeSN@H)5XRLi%(W#q$X%GYsgbH zxWy>xn}aiNES8;c(FA9)Ztw?^>_hPt7Wk8WL!RORC;izfDk^S^r?x46cyyF|){MN9 zss>W|COnOg@7rBCQX=1cF=KHmN6tMDHeP;&h?pYAlGXi)pnqJvx#Bs z#Nb?$dl?c;-}m2N)cNw!p_;`X-3|*>{QM>yd#D^#zDrW%$UzWJqfT%h90_(bB1R(u z-1;3&j-Z-lG!#Zd0oETJO$)@Og%WPYW9#Gh|69H+_s*R=i!YjYI59}A&whbw4ufOH1_4U!m-=&zPUv`@k-79SWL5LaKku{!40DPU zBq!J?TF#I(xa|0<^J2TMf#%ir)4GQ(n_1T${Bn1fK!=2xC{CzRhaF#KuH=snIQ+)BoZCa!?z=Hh;DhA# z{SQCsvg3=s2sPOV0ohKQPFt^x7!=uG&C@Ygr_r3 zm(da0@KRZ=>BCFq@V-P50a2zGyft6?Shw*po=J#0(d#DtQL$m|W`@hY>tyV1dm0ws zIHJ6d&C1Mj#_^9QA9BkSoprh1p2KdpbKo~``@0j(*q90Zg2F4t^znN6IOMXu{dsLl0`jDxWchiZO9n+#3Lj<(l zGmbT1lH@5V=lLip_+%3A^&r&=Qb|uw%>C$~pLnvAd)*|dyL%p5C^x++ui-6EddhJ& zM&b13Rf`#-kF~y=)|fN7=L8>zq4%NKK&Gzb8P~fW4Lbfuva~2 z2!AYp&9Xt2{Yf9kE;+Ah3B6@b0md?h-W$NyI8Q&m{Ym$nH+DT%GB56_r*VpHljKXO zeevmu*%x(%x4w?%%`(RA)$Po-dYzGat+{Q?dxIO#98Xj8$>F~APdKYwj4fI{rG!(g zuSs~XaO1k32{vZQCodj0;Cdm%^uuiF zDyNdU1Dw((33F~SD7H{%tC@Y;@t>NC{j5L@F2(?7x%+Qe6f1*tmv5_Fe6gQ{G2*aX z_zZzb$CvfX*d95;x%P~zx-HLbNr5jnnTo!p9I)a!@B|6{GNs9qaH-h zbA5AZ?L|M1e-$ca``HYQrEcUny>FSYYfW~h5bQsF~CzP`Tx|B8>vojZ4U7AJgY zVKAucEIO01hj(3wwN$?IW)aEW?H4Pg*ZzMY&b0VvuF3x1XWI`>zu!@M5j4bk#Tq(j zgwbOrIBnE;k?%x?6!vK?(3n#lWMps^zL7ytcl?MM9w#jLWw=L7OlU{w)V_(!*E&#~JAJdDAzM=w@LAA{JxhkX0NwF)yv z$iRjV4(qeHr8~Fk~F>{KhQklZCq{zkG1jkfJT(C5j^`LPPjU_oxmuTb$iORX=YNj z%^ECeXJ@%i$-b5$(F-0xnjrnWqv-6unRga{H0y9Wp!rujaNWaomn3_)JBl#H-(Dvm zp3fQW_Bhwz=xrwXMKP08trEfGP(IeN4pXv&oaVZL#;*>{x%zv>t68AgohNt)sRw?_ zHDTd&-&e0*Exzb=SYSuxXEk4+@~46lz2;JF2j1z+XC&?Ff19!8q7lnBnPn4S{;F9l z=zdyY$B$04WveTCj!Ek}KRCxXYsNao6ie{XmGt|*%STE~SvxOQEKcOOQ}v-q@1Zql z=)Y%>XE6L_3|;d0s1rcbK%=2B8VcZ=@P!!DXj&Le3!`ZPK4(6fBS1kxg;0>#U-$Rd z{8{%NJ$okStKO`^((uuHO19hM+yd3x7b~P^9X*k;r}xl;aQ&qGP1G`WqHKL$}+1KDf~Ub)_lfET)Nl(R?7in z-{LiF-m&&49ahPBoX@ZcG-vrY|5%>fVohddMav0NC3kOpNeDKV>JQ;+to+5p<0)>) z%iMX`#qraRD+ix!wB($9bMZv?I*yRKBkQ)$o!`i)!oKKYXo7Hi=R@OslX)B39Cn|z zYdfXvCsAZjD8M_JWu@~oemSMUN$oV4|L@j zoUoa(^Tj8FosB)qFY<9rb&`)xXG}BMS+rQPBEgwq@8gC$9}iq#d0<)o7GbBqJ6zr? zD3mLGIQg)M)6919Tmh@+jyZGrzW8wzsk1)WbMYKotrF+n$&IUp9oJ-UD2;N{w%z2+ z5Ph6!Z*s%x;HDhSb>~<%S*$yEA>)gnIMWR)W`ns;P96Nh-`2;v@nu2@r&w>%nHN4s zGXhPdn7;5fUOacmz_;*(vFwgC7dK->7mDGWzyZ_UMiU&(teBmeFSP6KZYp&u&^^o) z>AUVuhTY;?jt5a$teYfb^Ge#16M|K8z9nxFHuCXib2`0o!d_b|WvAIL4R((mU-GbR zJuAIdWTg<(i_I#FPp@7vf5Qc9<`bLcw!G4K5Y=Tm;bz(vkPYtle>dI{beu1FaH|dX zZ62#>jSG+mSQG z0(TCDd^Y*J?S^|U%k1-gIpxQkuxFDVFS{ryptUqHDP28bu7Fdui(9%iTlhn!*DVU? zyB6#gn11I)4rlHoq3fC93b#EbHtXJYx^BE{PWQ1&f!k?CGbA*tZ7-Zk2Tp7TkS?tM(Yve7h7& zr)T`r{5T$8UmyQJ*f?Y7&YhBO2On@UCj1e4I^$x6bj->!lY4DxnnqIji$9u0{lBQs z;`aG=MxFH8{AT_Ag0B}{RE=1?vK%zdjnX#m98a|S-0lSMG+vmx_@fz%vqIeJQt*I?OV!N&W48_Xzzc*2eQy=C zocjO84|o?#w}4kRS&=`?L3l_8G}n-cEg?X}en1v{t-|R{(Bdk*BQ11s!iIp`%U)hy z-tTr_fvfS%8J|TloAr}EW$fWyBv24F(R)hvw|9@^z#|{$^5Q#-c)w@ey;vdbqWHn| zi&5Y@&UriX!DAn5&Xy~kGQBM9{y5h__0E}}M~>e9^X<#UKV}_H3LA^mLSv0VBLEZ( zvC(CeQRmC1lgEywnM7quFuC{1EbM$~#}x)%PIKea0|{TB@86_)&7#^4T+1~vy4#v> z@+d=+soL)1krGSq`QXtG8>@Y-YRhh~01b->znf^irPI7x`0K?#ZifXdDxRs0F34e8 ztVo@;Q{ds4fnB~e>V!d3=Z!|hXheW3-O)uDpvLKFD2#>z@yn71azPGw(vzl3{|OGZ zFiv~;V5zXWpFu=KL_!6t3ZF2`N#)NIMGrr@aJFG)x3~NWo}@EJ#g0wck#3?KWY6;N zx!j>FjmIh0Y$=u!@-E8R3@a5?%%$>YD1P{^&dh9Vy~@Ie$0eEDctTaqFNds;ox!Kq zT&y@E%;e9r!TVH9Lc)TnGAD9Uq8-02=^eVrfEn#+wk{(Y9rlJ&}U z{2be63TL@+tUV)p_D!=gOTpP03wHCF8H0M*iUvu}4cF$f#~5ob_UudGNSM7;f)}#& z^r0XVv+ZF=4UtHgW;b4q-&Tx(M;Pps{>CW$VJeb_9`(A3UYNNZxw$z9X zlI$s#L20HJ&MqloYrgf2_xqoo?4QDl^^Y&R_sx7!<(BTE;a~Z}d+h{kz8_CM+~m2; zZrmMHoH28~TM0W$tvs9M>CGEl`Sgl6>fS$;x}3GqR(El)`m1(^UqU)gW)EJqD9kpt zVs5e**;uME!CH2)Y@g!1%NM`bDU`chu;%$;CD39ezId)ch10=nh6k>`bePAe=qi80 z$Sd97ZF<7QY1>cczBv3P@wT>8-^|6be6OaTyfMx1;E@w^k2>5JH!D?F>1^KQm(b z+YTgfHYOS~H|>kz+_|ye=Ci}0=#nG_w~%;WhI$({3SLb}g|wMWggjc#!!9w_A! zTUg@lA#Yb1b9$x6MdqUWFV=8WF6G|nz4F7{g4R6abxXr;ypftKx^PX{fzn%|Cqir+n%$+lh~IdW?08G)BQyJiMi%MkGkh=HifMIih6~0&DA{thrE!!W0x~Hc)kiq?CmHp z;l+$6=z=cLHo$ZTH(|u=1loBGpkYVQLhI4}l%VrAMnhpV6c`DfdjiT-1HZ|cAv0&H Wu-xbWpBNYz7(8A5T-G@yGywo&0|NtNage(c!@6@aFBupZ zSkfJR9T^xl_H+M9WMyDrW(e>Jab;j&U?|n`vDYt=6EwOh^ctGIEGZjy`9lnWPGxa?Pc(`9Pdv@zt@K>-c?-i?Y_##g&U$Qi#uP= zlw;W0wSwo&tH;4Eb)AhJIR*j~dD)aU9dvLplju0X#w>Ui2*9P88>~r<+C<%e+7TzMMbo`SkC0 z@9q@U{(tc4-s|1d%WdYxmbuiODys-v99n&Su{nN4>)gASPZi#ds;v6|gB#C39eFx; zdpdhg$DbK*Kg9HlZ7zGXsorw`ecOn+@%Mi3C_er6Z*%he)56os@6D6lp!g|y+u>r{ zsN1z4%yvV!z=g3Q%*PS?UBbnYo6bb_%Km8XHG=@s|DwNo)Eob z^YQC)_0^lL#4GzUDt5V_zc}r_6tm#X4_7!oJt=DHRpW7~%Lb(*Weo~bR}Rz9%X%F)c*S{?eO&{e?G(2=lAzBhH&#NVGUsuYB=SVVM@7!3g&A@D=nj%!-~XQOv_@;9BSW)AUZ{dBOf?ydf`)6$zAo_)Wo|M=Y9 zXAD=TH}>>zsF^dp@Oj*DSKuobR(XANqu?@ZXv6JRTO!lq^?!>aYn zGuz+ml@>)>xPSfY@a*B~r{9vAvcyl=*laJDv*4G}gvuWmjsESBSrBzW;>1hSbrEs$ zCw|K7g?X=iyhn9H)cMp6JOQ@yU>P~4l~apDDixMr|N89hQI@O5jdSAm?-*CZ|_5vRr2gcJL0mc*KO{6ZQj>Ap9ReO(7pZ2 zvpo{&_IxP?d#`+pIc{`H;=RoLm8J7USBRPXY3k8>_PVfG?i}~3H~SsWdC!eqcW(CM zKdJi_l-pOYmOQbMVb%QqO;;q>A3r<0)qn2;@g?UfV$Gg^eVWwtN`1dV>9OpbO?U2C z>&Nf}{QUuvw9T8hKH~Vj-SQj#*57^BzsFGGlf?)xv#nWy6|%uf56`tg0H{qy0>Si)jL^kapn;F`Xf@4_urMNPcDCB${sXl z`Tx9`=F?|0hpgvXGVS19=IabsCpYrsMeWeJGy62d)$5HSJ%4?Lww{??9WjeGb);#oflkySUixNzZYEafo$d=IX%?lY`9 z|G$QLh28(BybFH)ISi_?h!Z^L^$8WAS)|`2K{CHv5^HNKPuag{}egF3`IqnQ|HFL;$woeB?eyRN`b^6Yu zrqTv2&Xl^le~t3bmd5=lYdmwfNOD0{s={Xn(HP!7IeDfk<2NU ztJzF5+iyD@JIWF&#Zg~sk$>@=;mrbh5%6(G_BQUJGU~DY|E+zas88caWoiYr2BFWIkWY9GOCq6?Odk z6_Wo{_6ptm#vPPy9=;~|{rX4y9sTszvFWUc`_oZcC3zyaguO_l&}zdu1-;0aa{+r_ z2xdPii0R$G(fV86VFxyM$>T=m>?@@HNvC{R_h0<=D+|Z3s~ozl;+SSeGl#6NK4LX* z)v=FzKou)TY|P*N5!01V$}H%T-}qyug>DR_5WgUOV)}xrM1}oqSG}2ja)sz~rSPws z&hklgMU%rm{#7ay@|&|78@Du^a$pLO^f<_~y$PMgu!@!K5|b7)r$ed&tMMH!2umpl zXRkL=_{9Hxpw31esQi8nD!;FT3iW#zLtW5xA|XYcmxdUH?j zvn?~I z^BwnVe8t+>)9uZByztJ<`W2fTo;|FxbU*lv;c7qg&L}ynm7q??tD6qb9$x1@&bi8B zLgj*%sP|=DA>46N9H;L-tf|}06JW{`^xSyD#%iXk@3kisb6*c%zBKGyAZz2Cxa)?0 z_H#Vh!xNxek*Y9#`HG$8`>S{J1nm7Lm~Cdn|G272i!;SQe9;a&GnS(7Iib?UD|aU< zG;h2UH&-v8d1f_p$lm^l$8WawM?8PZ@ucF2RQ}KGiX*EwpT1V<`1Mr$gq@c>-pcG= zap}KD{d@frJ6W=J=scGf4e|f${_9Vz#j*ME+|zD%bFO+K-jb>kn0|fs@uLh^?_W~B zrZ%A}cH24bRnr_^8D_uP(EF-f!ej4>hgp*Sk?H}gjWWD@Y$sI3=F5pQhwOjv&}B7G ze*Up{PYX6zgPZkR8|Uo%tMPbi5Iv+W5wC>c6HM?vOx*`>a=k z_bb@5UY*?dhbJUc;XV^t!#FNW2J0{>k>j>MRp-zD&z{WpYQKcb`&!WWxTmY1%Q~lo FCIH*4^1T26 diff --git a/examples/shapes/shapes_draw_circle_sector.c b/examples/shapes/shapes_draw_circle_sector.c index a88a59d56..597b85a73 100644 --- a/examples/shapes/shapes_draw_circle_sector.c +++ b/examples/shapes/shapes_draw_circle_sector.c @@ -5,7 +5,9 @@ * This example has been created using raylib 2.5 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2019 Vlad Adrian (@Demizdor) and Ramon Santamaria (@raysan5) +* Example contributed by Vlad Adrian (@demizdor) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2018 Vlad Adrian (@demizdor) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/shapes/shapes_draw_rectangle_rounded.c b/examples/shapes/shapes_draw_rectangle_rounded.c index 35fe63fb8..e36e2731b 100644 --- a/examples/shapes/shapes_draw_rectangle_rounded.c +++ b/examples/shapes/shapes_draw_rectangle_rounded.c @@ -5,7 +5,9 @@ * This example has been created using raylib 2.5 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2019 Vlad Adrian (@Demizdor) and Ramon Santamaria (@raysan5) +* Example contributed by Vlad Adrian (@demizdor) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2018 Vlad Adrian (@demizdor) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/shapes/shapes_draw_ring.c b/examples/shapes/shapes_draw_ring.c index d56b9c2eb..44a3ec5f3 100644 --- a/examples/shapes/shapes_draw_ring.c +++ b/examples/shapes/shapes_draw_ring.c @@ -5,7 +5,9 @@ * This example has been created using raylib 2.5 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2019 Vlad Adrian (@Demizdor) and Ramon Santamaria (@raysan5) +* Example contributed by Vlad Adrian (@demizdor) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2018 Vlad Adrian (@demizdor) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/shapes/shapes_rectangle_scaling_mouse.c b/examples/shapes/shapes_rectangle_scaling.c similarity index 95% rename from examples/shapes/shapes_rectangle_scaling_mouse.c rename to examples/shapes/shapes_rectangle_scaling.c index d8c521cab..036a1dd4f 100644 --- a/examples/shapes/shapes_rectangle_scaling_mouse.c +++ b/examples/shapes/shapes_rectangle_scaling.c @@ -5,7 +5,9 @@ * This example has been created using raylib 2.5 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2019 Demioz and Ramon Santamaria (@raysan5) +* Example contributed by Vlad Adrian (@demizdor) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2018 Vlad Adrian (@demizdor) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/shapes/shapes_rectangle_scaling_mouse.png b/examples/shapes/shapes_rectangle_scaling.png similarity index 100% rename from examples/shapes/shapes_rectangle_scaling_mouse.png rename to examples/shapes/shapes_rectangle_scaling.png diff --git a/examples/text/text_bmfont_ttf.c b/examples/text/text_bmfont_ttf.c index f71f5ddb1..ca26b2cf3 100644 --- a/examples/text/text_bmfont_ttf.c +++ b/examples/text/text_bmfont_ttf.c @@ -20,17 +20,20 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [text] example - bmfont and ttf sprite fonts loading"); - const char msgBm[64] = "THIS IS AN AngelCode SPRITE FONT"; - const char msgTtf[64] = "THIS SPRITE FONT has been GENERATED from a TTF"; + // Define characters to draw + // NOTE: raylib supports UTF-8 encoding, following list is actually codified as UTF8 internally + const char msg[256] = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHI\nJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmn\nopqrstuvwxyz{|}~¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓ\nÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷\nøùúûüýþÿ"; // NOTE: Textures/Fonts MUST be loaded after Window initialization (OpenGL context is required) - Font fontBm = LoadFont("resources/bmfont.fnt"); // BMFont (AngelCode) - Font fontTtf = LoadFont("resources/pixantiqua.ttf"); // TTF font - - Vector2 fontPosition; - - fontPosition.x = screenWidth/2 - MeasureTextEx(fontBm, msgBm, fontBm.baseSize, 0).x/2; - fontPosition.y = screenHeight/2 - fontBm.baseSize/2 - 80; + + // BMFont (AngelCode) : Font data and image atlas have been generated using external program + Font fontBm = LoadFont("resources/pixantiqua.fnt"); + + // TTF font : Font data and atlas are generated directly from TTF + // NOTE: We define a font base size of 32 pixels tall and up-to 250 characters + Font fontTtf = LoadFontEx("resources/pixantiqua.ttf", 32, 0, 250); + + bool useTtf = false; SetTargetFPS(60); //-------------------------------------------------------------------------------------- @@ -40,7 +43,8 @@ int main() { // Update //---------------------------------------------------------------------------------- - // TODO: Update variables here... + if (IsKeyDown(KEY_SPACE)) useTtf = true; + else useTtf = false; //---------------------------------------------------------------------------------- // Draw @@ -48,9 +52,19 @@ int main() BeginDrawing(); ClearBackground(RAYWHITE); + + DrawText("Press SPACE to use TTF generated font", 20, 20, 20, LIGHTGRAY); - DrawTextEx(fontBm, msgBm, fontPosition, fontBm.baseSize, 0, MAROON); - DrawTextEx(fontTtf, msgTtf, (Vector2){ 75.0f, 240.0f }, fontTtf.baseSize*0.8f, 2, LIME); + if (!useTtf) + { + DrawTextEx(fontBm, msg, (Vector2){ 20.0f, 100.0f }, fontBm.baseSize, 2, MAROON); + DrawText("Using BMFont (Angelcode) imported", 20, GetScreenHeight() - 30, 20, GRAY); + } + else + { + DrawTextEx(fontTtf, msg, (Vector2){ 20.0f, 100.0f }, fontTtf.baseSize, 2, LIME); + DrawText("Using TTF font generated", 20, GetScreenHeight() - 30, 20, GRAY); + } EndDrawing(); //---------------------------------------------------------------------------------- diff --git a/examples/text/text_bmfont_ttf.png b/examples/text/text_bmfont_ttf.png index 8305d36b820c76dcc96ef284178a39754e7ea5eb..a99027ad50c40c1c6b294e715c50af36755c4943 100644 GIT binary patch literal 20086 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 KKbLh*2~7Y7hhA;~ delta 6843 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 A2LJ#7 diff --git a/examples/text/text_bmfont_unordered.c b/examples/text/text_bmfont_unordered.c deleted file mode 100644 index a51476198..000000000 --- a/examples/text/text_bmfont_unordered.c +++ /dev/null @@ -1,65 +0,0 @@ -/******************************************************************************************* -* -* raylib [text] example - BMFont unordered chars loading and drawing -* -* This example has been created using raylib 1.4 (www.raylib.com) -* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) -* -* Copyright (c) 2016 Ramon Santamaria (@raysan5) -* -********************************************************************************************/ - -#include "raylib.h" - -int main() -{ - // Initialization - //-------------------------------------------------------------------------------------- - int screenWidth = 800; - int screenHeight = 450; - - InitWindow(screenWidth, screenHeight, "raylib [text] example - bmfont unordered loading and drawing"); - - // NOTE: Using chars outside the [32..127] limits! - // NOTE: If a character is not found in the font, it just renders a space - const char msg[256] = "ASCII extended characters:\n¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆ\nÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæ\nçèéêëìíîïðñòóôõö÷øùúûüýþÿ"; - - // NOTE: Loaded font has an unordered list of characters (chars in the range 32..255) - Font font = LoadFont("resources/pixantiqua.fnt"); // BMFont (AngelCode) - - SetTargetFPS(60); - //-------------------------------------------------------------------------------------- - - // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key - { - // Update - //---------------------------------------------------------------------------------- - // TODO: Update variables here... - //---------------------------------------------------------------------------------- - - // Draw - //---------------------------------------------------------------------------------- - BeginDrawing(); - - ClearBackground(RAYWHITE); - - DrawText("Font name: PixAntiqua", 40, 50, 20, GRAY); - DrawText(FormatText("Font base size: %i", font.baseSize), 40, 80, 20, GRAY); - DrawText(FormatText("Font chars number: %i", font.charsCount), 40, 110, 20, GRAY); - - DrawTextEx(font, msg, (Vector2){ 40, 180 }, font.baseSize, 0, MAROON); - - EndDrawing(); - //---------------------------------------------------------------------------------- - } - - // De-Initialization - //-------------------------------------------------------------------------------------- - UnloadFont(font); // AngelCode Font unloading - - CloseWindow(); // Close window and OpenGL context - //-------------------------------------------------------------------------------------- - - return 0; -} \ No newline at end of file diff --git a/examples/text/text_bmfont_unordered.png b/examples/text/text_bmfont_unordered.png deleted file mode 100644 index c676756756e51ab2b8c7e9181334123fa31cf495..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18713 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 O6dF%gKbLh*2~7ZUb&&7? diff --git a/examples/textures/textures_image_npatch.c b/examples/textures/textures_npatch_drawing.c similarity index 72% rename from examples/textures/textures_image_npatch.c rename to examples/textures/textures_npatch_drawing.c index 357b8a98c..0514efe7f 100644 --- a/examples/textures/textures_image_npatch.c +++ b/examples/textures/textures_npatch_drawing.c @@ -7,7 +7,9 @@ * This example has been created using raylib 2.0 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2016 Ramon Santamaria (@raysan5) +* Example contributed by Jorge A. Gomes (@overdev) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2018 Jorge A. Gomes (@overdev) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ @@ -24,22 +26,25 @@ int main() // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) Texture2D nPatchTexture = LoadTexture("resources/ninepatch_button.png"); - Vector2 mousePosition; - Vector2 origin = {0.0f, 0.0f}; + + Vector2 mousePosition = { 0 }; + Vector2 origin = { 0.0f, 0.0f }; - // The location and size of the n-patches. - Rectangle dstRec1 = {480.0f, 160.0f, 32.0f, 32.0f}; - Rectangle dstRec2 = {160.0f, 160.0f, 32.0f, 32.0f}; - Rectangle dstRecH = {160.0f, 93.0f, 32.0f, 32.0f}; // this rec's height is ignored - Rectangle dstRecV = {92.0f, 160.0f, 32.0f, 32.0f}; // this rec's width is ignored + // Position and size of the n-patches + Rectangle dstRec1 = { 480.0f, 160.0f, 32.0f, 32.0f }; + Rectangle dstRec2 = { 160.0f, 160.0f, 32.0f, 32.0f }; + Rectangle dstRecH = { 160.0f, 93.0f, 32.0f, 32.0f }; + Rectangle dstRecV = { 92.0f, 160.0f, 32.0f, 32.0f }; // A 9-patch (NPT_9PATCH) changes its sizes in both axis - NPatchInfo ninePatchInfo1 = {(Rectangle){0.0f, 0.0f, 64.0f, 64.0f}, 12, 40, 12, 12, NPT_9PATCH }; - NPatchInfo ninePatchInfo2 = {(Rectangle){0.0f, 128.0f, 64.0f, 64.0f}, 16, 16, 16, 16, NPT_9PATCH }; + NPatchInfo ninePatchInfo1 = { (Rectangle){ 0.0f, 0.0f, 64.0f, 64.0f }, 12, 40, 12, 12, NPT_9PATCH }; + NPatchInfo ninePatchInfo2 = { (Rectangle){ 0.0f, 128.0f, 64.0f, 64.0f }, 16, 16, 16, 16, NPT_9PATCH }; + // A horizontal 3-patch (NPT_3PATCH_HORIZONTAL) changes its sizes along the x axis only - NPatchInfo h3PatchInfo = {(Rectangle){0.0f, 64.0f, 64.0f, 64.0f}, 8, 8, 8, 8, NPT_3PATCH_HORIZONTAL }; + NPatchInfo h3PatchInfo = { (Rectangle){ 0.0f, 64.0f, 64.0f, 64.0f }, 8, 8, 8, 8, NPT_3PATCH_HORIZONTAL }; + // A vertical 3-patch (NPT_3PATCH_VERTICAL) changes its sizes along the y axis only - NPatchInfo v3PatchInfo = {(Rectangle){0.0f, 192.0f, 64.0f, 64.0f}, 6, 6, 6, 6, NPT_3PATCH_VERTICAL }; + NPatchInfo v3PatchInfo = { (Rectangle){ 0.0f, 192.0f, 64.0f, 64.0f }, 6, 6, 6, 6, NPT_3PATCH_VERTICAL }; SetTargetFPS(60); //--------------------------------------------------------------------------------------- @@ -50,7 +55,8 @@ int main() // Update //---------------------------------------------------------------------------------- mousePosition = GetMousePosition(); - // resize the n-patches based on mouse position. + + // Resize the n-patches based on mouse position dstRec1.width = mousePosition.x - dstRec1.x; dstRec1.height = mousePosition.y - dstRec1.y; dstRec2.width = mousePosition.x - dstRec2.x; @@ -58,7 +64,7 @@ int main() dstRecH.width = mousePosition.x - dstRecH.x; dstRecV.height = mousePosition.y - dstRecV.y; - // set a minimum width and/or height + // Set a minimum width and/or height if (dstRec1.width < 1.0f) dstRec1.width = 1.0f; if (dstRec1.width > 300.0f) dstRec1.width = 300.0f; if (dstRec1.height < 1.0f) dstRec1.height = 1.0f; @@ -82,16 +88,11 @@ int main() DrawTextureNPatch(nPatchTexture, v3PatchInfo, dstRecV, origin, 0.0f, WHITE); // Draw the source texture - DrawRectangleLines( 5, 88, 74, 266, BLUE); + DrawRectangleLines(5, 88, 74, 266, BLUE); DrawTexture(nPatchTexture, 10, 93, WHITE); DrawText("TEXTURE", 15, 360, 10, DARKGRAY); - DrawRectangle( 10, 10, 250, 73, Fade(SKYBLUE, 0.5)); - DrawRectangleLines( 10, 10, 250, 73, BLUE); - - DrawText("9-Patch and 3-Patch example", 20, 20, 10, BLACK); - DrawText(" Move the mouse to stretch or", 40, 40, 10, DARKGRAY); - DrawText(" shrink the n-patches.", 40, 60, 10, DARKGRAY); + DrawText("Move the mouse to stretch or shrink the n-patches", 10, 20, 20, DARKGRAY); EndDrawing(); //---------------------------------------------------------------------------------- diff --git a/examples/textures/textures_npatch_drawing.png b/examples/textures/textures_npatch_drawing.png new file mode 100644 index 0000000000000000000000000000000000000000..21df9caabacd6ba560272c973cbb111e98373477 GIT binary patch literal 26858 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 literal 0 HcmV?d00001