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 | 88 ++++---- ...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 | 208 ++++++++---------- 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 | 40 ++-- 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, 292 insertions(+), 434 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 39c0752a..a4962200 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 002a6931..00000000 --- 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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 j%Cfr3@k9nnA^UavuR8X%+^>RhLcF^% -#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"); - - state = STATE_LOADING; - } - break; - case STATE_LOADING: - framesCounter++; - if (atomic_load(&dataLoaded)) + 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 = 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 ea4a375a..8c0843d2 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 f9b54b6d..3ad32b60 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 7eaaf0be..658be084 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 381cd33e..c4dac6d2 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; - - 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; + const int screenWidth = 800; + const int screenHeight = 450; - // 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); - } - SetShaderValue(shader, cLoc, c, UNIFORM_VEC2); - rendered = false; // c value has changed, so render the set again. - } + 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]; - // Press "r" to stop changing c - if (IsKeyPressed(KEY_R)) - { - incrementSpeed = 0; + SetShaderValue(shader, cLoc, c, UNIFORM_VEC2); } - // Toggle whether or not to show controls - if (IsKeyPressed(KEY_H)) + 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) { - showControls = !showControls; - } + if (IsKeyDown(KEY_RIGHT)) incrementSpeed++; + else if (IsKeyDown(KEY_LEFT)) incrementSpeed--; - // 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)) - { - incrementSpeed += mouseMv * 10; - } - else + // 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; + // TODO: Logic is not correct, the idea is getting zoom focus to pointed area + Vector2 mousePos = GetMousePosition(); + + offset[0] = mousePos.x -(float)screenWidth; + offset[1] = mousePos.y -(float)screenHeight; + + SetShaderValue(shader, offsetLoc, offset, UNIFORM_VEC2); } - rendered = false; - } - if (incrementSpeed != 0) - { - float amount = GetFrameTime() * incrementSpeed * AUTO_SPEED; + // 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 - - ClearBackground(BLACK); // Clear the last frame drawn on the texture. - - // 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); + // Using a render texture to draw Julia set + BeginTextureMode(target); // Enable drawing to texture + ClearBackground(BLACK); // Clear the render 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 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 a2fa0b27..fa0bafaf 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 f5758273..3a540098 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 03c62deb..bc677c78 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 dcab862e..d6ac30a9 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 - 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 - InitWindow(screenWidth, screenHeight, "raylib [shapes] example - raylib color palette"); - - SetTargetFPS(60); + 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 zcmeHPdpuNm|DT&N7>rAr8Mm3-YD)%#hKQk2p(GojZCujCh@FT^t#KDK=;BsNO>7FW zRCLj}HgZ{$lA01xJ1$w3O1k~djP}{*wPK&wKF_mHzt?O2Ij@&ea{(iR%ei z2nRpQAshiN;=5|eGx;d=7Z2b)30#_V0I`&n$fY6DzHlI495}|7r`2Z2dr$um=hyZMaL<=HwlxRVsg|Eaf zD6N3jx3{;0>V@l5m$IE6QeBko+pj_Av2V*7__bqL+5DgYB8*~B{rzw{i7Qkt;V+-X zt8?&xPo-kygGce>uSV|j3ou{w?SRuSU?9>u0N-0YhwlYF+-6(;>=O5>cMlR)GyHu! zmD{F6Y+yQR;@_aGc9KWJxJP1z^FGGAjfcq@2{U0R=VYhvBm6_nQ7GncUhPq2iVeeLl zF$ekg{r-7rfX$pq;0lpETAt>t7T}E_Kpb5^rJo*8WTmCEH56H%+N|^ZTVa2A5)qc@ zAvTsG;Y=-0KOKBI0n{2M7wq-S4()Pi=Ei?s`C-6%0hzwR&LLA;wKa~jJ$Qx;zkLRM z(^`8qYf1pv5XB0|NeP+t5mkU$z<+z*jJp!IOfPnLj>U>IquH|(i3lQ-{yMbac_!pg zW#voSg#0N~&y`4{^<}vQ0Yq$Q+(MY_Sia6pvv)z&jsqd6gqRJj9;bX7G|!odFV-%t zrTAQ}xtP{0pdPsN(9EGme~s~OVlR9>V#$>i*$eM3%NYT#;bfUmgY&L;%s8evPRrgI z*7VuTVs_vO_rVw!`mEmuM>B&@oYk!p-cOtTw{tm*xy>FBflD?zs;jF@;T%cCk3Vjb z%gfo(qDR1n5|PY-M>d^};o5P08fPnlUSq4%b!4}r4m%4U_Qo{CIh&xxvhYgerdAS- zH)n1LA@<9R@4e2+2l> zvtNlhiXw|d3lc5-Ru4*S;a{_ba5-@E`7PH!{#X?9;K2h9-y)d|LSJ{N2?SC(kDoMI zmria<1M)c9Ro2Fs382P%Z=Uyv@>0;(8rpc7Cdy`B%~h@bY0C8#L@=(2MuQ~|2Ws$E zH>ZPAeGfrb#|+A})V0N66x`OO+0cERQ}%J*LX{xzRNFDf#!fUMlyjCPH>-Vzv#vU5 zAE~(1f;|!S{yJ(eg3xSAa9tpME1hn_Te7B2zCbgCTU; z4X5yv3<-n0vvMkS-oNg2ph$1^nAkU2xRSA#<6P}0!KU5kvL$}^)D zXPj>cdlH}ILKQtq=JTT(?1r}&D|)*&jM_)atunNEV~Skg=YKxE|AnEnQEXFr3scwj zMf@N&kc*TqHlS!7BWJ+^_fHI^us59#Q~jt}X0uzgig z^B_X`=n1yeMFnsh)r-fXs6WTYlvaYeT*@?T1gnjA_B86$!Y$27IX9lS^vh{5+8ypD z(WPx_GV}VwBGhdAnJx-yYbOWC6ZC4P!g5n~^rBK7ee$I;EXrHzt|qNh*n;XLYm)-~ zMskp^mL#A5p6#OWbW1d2vOeC&G^IkZdk8K2y~$-*YMWyVELG;(q?2TTLT4C+oX%zjf_?Qs5Khb$e4N`tD zosZL=!V}PzQq_TUxJmdXir?er3%6xe)f#X1j{wLGu4*(@^&LeH{~iw-iSP4bCpcLc zTFOm6Fu|rbCV^_%FdI@2V=*~j4%os7VIVuXL#DRbs)8|Ti6)pL4BtWYqvQs57-V=P@;OFn@Syx%H@yt3-xFT`b6X?dmI%4BgV={x z`=Xp(7Dh z=_4yZO7HmvO0frZhceU`noIf)-RL=yV`3#8inC^yBYp?aW{vbjsSZ$ zXnEwI4&EqA*RXDElqqe~Gq6SqFsO-p5XS2Ot|hWjsJClZtf#5tHY?$lt0#Z<>hnIn za`aXye=Xu;l4h)F^4j5 z%baXh*7r1s%ejYe%Zez~30p9K;lqBbmS9BHj^YYcneIge;TyqQ9O0yet1A?Yqrltl26qtR%w?6xby@^x=eW?cP zA|3;=d%;n%P_^ftWr$Btrmh4+3}v%UsEo6}L~d;r$iHtRj%Ku864!%uxK$WPQq z6wD^87;BUNQUg+a4tafAggali2w=4!!QredbL>6Q^ zwYd*C&&`v`+(jQ2uP^H_y9In6cB+sqf-=b7-rjuNa4Nw%Tla zIM|Jx4_refaF5-2cV;+G)ZH1J6Qus%w_K?wvt5RVhdKN;4XEnfFZErVBcCXtSr*tt z?wFA_&F^yhGg=kj1a?uQD065knxo{{imIMWF)un7mDa3oXy4bNke5@24jxXZDp7GeF{Z=CAKkY03z~=Tbf6F&65kb@jl4wDq1#u*l*n+58D$#;O z3%_v=B)0G$vIR7dOi!K2>wWz6sg{cYkOam&cRCylWNu-40-z?yYvKVA6o5lXtpXC- z_E2#_BwzcUQj$u^rm~89|9Ut2E8xfhtzb_|L*5G%EhwlyXw~M;novCk?gI}V*G8VN z&RTIlo@?r|vjpz6c}0uuS&dac)0VHdfPFmCyhDq#2nxlMGO*zfdnTwGEU@YBvdrC6 zNaX7I#`4gV1_!$rleg;zD@Za&?{P96_aof*HKfwg+N}u9?OI1lq={F4}9xqR{ zz0z)zcvELBnnCy;C4UH3Z2wdzIJTwVMDFO5$u?;5jlgai(NB>%wd98qWmcEDi5TeG zLEtUVsS&;))G*V2hTOf1o5c8ahT}g0xgcoJ8^-uO7?;DV7 z{xRn^#L^d)b-;dFR@Tu;n^2k$>9K?o@&|9$O(-U^r7DJ~0NlW0v*KeBvH6KOZ>pC5YXCkfRfUAX-(v>#Zea(;)HUT8^Q^l;ch=IH3w|v@QN~@`78C_QzImOrW5P z4#$xbib&*=H@yPZ6^k#g2_@c73_uJnW>X%xBAJ~>fCa+rao?Sb5Cb9(dvep81q1~# zLHMh$Rz-B`PyF#Y$tc+8`+IwI!(`uKD3MTo7Y&DIl#N=4k4O6 zOb8`DrePp^ZTOAhB&QQ%v}3ttZGwK0;EV_sQ5nm$s!FlgtMZEf9w6i_i+ZXrA>@cA zApRrVsjr}sClNuyfRM0Z{*ewz7!dy&144vu{64xYgP5+{6`d<=q#7)otD)s+Q z!4_~@Pz)}r$=b6&$>XM0R;s*^Sk>DShz)_k~n8&St?1?=N5 zTJ=E-2Li0%0VK4xgHAB07_V!A4b8!izcGM9O|8x@b4EJ&%b8~Ep-K<{toRVbTIN12;^SCzvfYwF`Ql3%qwQf%`{t`2r32)YnyRpYu#O*lEHRCf z^H10?+8pkhdYQXvL4=y%LAG?+T1ZJ3bICe335xkaXTKuiVy;S%1ERD|vwbv92Vl?S z6kJg-Hx*Ubc!HmOOn1JtkLhC0YBm)?Jz9vCpB_E!SAsyT8|)UUZlW;AafYR_5o+Ux z7Z&IpTV*`|ME-5Y&op1M4+1492IVG(ZiMY?>84E%D1v>QN^LK9J~>0uF~J%E1GS#N zfVySs?ryTpwjZnRI}~U5D>h$`>A3LXR?l*bbO6aM(5$olbT~Zj{!{rk@6&?cs^EVZ z=yGJ|3inX9IV@baTj*4pVWj|&itZu1q)k(OcG7asQ^KWT`?TSt*2?mg3QKoZ7(S}s z`lA%n+K|IC7)}CBDK8LJ;Ym9m3fc${6eRP^VrbB))U5^GJczyQ{uiX*TS>NWXMJjh0 zI~?PR#qDs7wHKCQ*8_)x|pVF_Y)pUo!>YxjAxHOF0qX+5nxa=6zPYYFm3fQSC|`#frwNt=v>XC#Pd#vbq5gwK zX2t*tjh>#_dhyp`g};TsK>*P8SD$E6vyPsmC4#J{XK3=j=Fzb~jUQsj?B5t-{!fsj zmT-J$VVE?=+lGc3ZQR<_)P$VKvX4aY_GefnlARY^Ig&S~^^LD6Pc#gj30@Il$qL|T zR&+RNaIMURK?)~Gm?XBFc{4W@rwFE3%2fwyo>^q$T1OsphA%lro%%jO{qprQ^J*LO zoaogDhnEKI-2TKM=yZyReUv$qOJSWejA~RH*>hs7Y(V#UJ*X7 z4wNf5i>^pf>cT*zj4prYr#>)gsc}2a+^<0@(7<@i;8K^FYm1Tx+ErjJO3)X~gn1Kv z5vVR^jM=i5XBwT~^w^G_^0)yVl#c#*hVgm zY4(@b@Rx{J$X=A~4tI8Q7Y%`Yg+gCT4kOCX+^5fkF3}huKt`LL;3a|`MMP`KJf-OO nHY8e*XaN|f{(muH4BAdVqN4Tk(+l7yXh5r1u5~CQQ)B-RV&yQC literal 6591 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\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); - - DrawTextEx(fontBm, msgBm, fontPosition, fontBm.baseSize, 0, MAROON); - DrawTextEx(fontTtf, msgTtf, (Vector2){ 75.0f, 240.0f }, fontTtf.baseSize*0.8f, 2, LIME); + + DrawText("Press SPACE to use TTF generated font", 20, 20, 20, LIGHTGRAY); + + 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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 literal 19542 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 diff --git a/examples/text/text_draw_inside_rectangle.c b/examples/text/text_rectangle_bounds.c similarity index 96% rename from examples/text/text_draw_inside_rectangle.c rename to examples/text/text_rectangle_bounds.c index e60fa5e5..d4cd240a 100644 --- a/examples/text/text_draw_inside_rectangle.c +++ b/examples/text/text_rectangle_bounds.c @@ -5,7 +5,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) 2018 Vlad Adrian (@demizdor) +* Example contributed by Vlad Adrian (@demizdor) and reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2018 Vlad Adrian (@demizdor) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ @@ -37,9 +39,7 @@ int main() const int maxHeight = screenHeight - 160; Vector2 lastMouse = { 0, 0 }; // Stores last mouse coordinates - Color borderColor = MAROON; // Container border color - Font font = GetFontDefault(); // Get default system font SetTargetFPS(60); diff --git a/examples/text/text_draw_inside_rectangle.png b/examples/text/text_rectangle_bounds.png similarity index 100% rename from examples/text/text_draw_inside_rectangle.png rename to examples/text/text_rectangle_bounds.png diff --git a/examples/text/text_unicode.c b/examples/text/text_unicode.c index b6c6db30..6b456a75 100644 --- a/examples/text/text_unicode.c +++ b/examples/text/text_unicode.c @@ -5,6 +5,8 @@ * 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) * +* Example contributed by Vlad Adrian (@demizdor) and reviewed by Ramon Santamaria (@raysan5) +* * Copyright (c) 2019 Vlad Adrian (@demizdor) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/textures/textures_image_npatch.png b/examples/textures/textures_image_npatch.png deleted file mode 100644 index 5258811b42c76e7662a971a547b81c39f4e58a1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18306 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 I1AX?t0CIJZ@Bjb+ 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 357b8a98..0514efe7 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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 z 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 literal 0 HcmV?d00001