From 4d71e9b44fd043472eb523207765fd882578a2e0 Mon Sep 17 00:00:00 2001 From: Vlad Adrian Date: Sun, 28 Jun 2020 00:59:14 +0300 Subject: [PATCH] Added new function `DrawTextureTiled()` (#1291) * Implemented DrawTextureTiled() * Example added --- examples/textures/resources/pat.png | Bin 0 -> 7387 bytes examples/textures/textures_draw_tiled.c | 148 ++++++++++++++++++++++++ src/raylib.h | 1 + src/textures.c | 74 ++++++++++++ 4 files changed, 223 insertions(+) create mode 100644 examples/textures/resources/pat.png create mode 100644 examples/textures/textures_draw_tiled.c diff --git a/examples/textures/resources/pat.png b/examples/textures/resources/pat.png new file mode 100644 index 0000000000000000000000000000000000000000..58b3c372c7dbfaf53bca771a9dc32e83d37dbd0d GIT binary patch literal 7387 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 REEzQ7@9FC2vd$@?2>{x8b%6i? literal 0 HcmV?d00001 diff --git a/examples/textures/textures_draw_tiled.c b/examples/textures/textures_draw_tiled.c new file mode 100644 index 000000000..0e1bebdce --- /dev/null +++ b/examples/textures/textures_draw_tiled.c @@ -0,0 +1,148 @@ +/******************************************************************************************* +* +* raylib [textures] example - Draw part of the texture tiled +* +* This example has been created using raylib 3.0 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2020 Vlad Adrian (@demizdor) and Ramon Santamaria (@raysan5) +* +********************************************************************************************/ +#include "raylib.h" + +#define SIZEOF(A) (sizeof(A)/sizeof(A[0])) +#define OPT_WIDTH 220 // max width for the options container +#define MARGIN_SIZE 8 // size for the margins +#define COLOR_SIZE 16 // size of the color select buttons + +int main(int argc, char **argv) +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + SetConfigFlags(FLAG_WINDOW_RESIZABLE); // Make the window resizable + InitWindow(screenWidth, screenHeight, "raylib [textures] example - Draw part of a texture tiled"); + + // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) + Texture ptex = LoadTexture("resources/pat.png"); + SetTextureFilter(ptex, FILTER_TRILINEAR); // Makes the texture smoother when upscaled + + // Coordinates for all patterns inside the texture + const Rectangle patRec[] = { (Rectangle){3,3,66,66}, (Rectangle){75,3,100,100}, + (Rectangle){3,75,66,66}, (Rectangle){7,156,50,50}, (Rectangle){85,106,90,45}, (Rectangle){75,154,100,60} }; + + // Setup colors + const Color colors[] = { BLACK, MAROON, ORANGE, BLUE, PURPLE, BEIGE, LIME, RED, DARKGRAY, SKYBLUE}; + enum {MAX_COLORS = SIZEOF(colors)}; + Rectangle colorRec[MAX_COLORS] = { 0 }; + + // Calculate rectangle for each color + for(int i=0, x=0, y=0; i 10.0f) scale = 10.0f; + else if( scale <= 0.0f) scale = 0.25f; + + // Change rotation + if(IsKeyPressed(KEY_LEFT)) rotation -= 25.0f; + if(IsKeyPressed(KEY_RIGHT)) rotation += 25.0f; + + // Reset + if(IsKeyPressed(KEY_SPACE)) { rotation = 0.0f; scale = 1.0f; } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + ClearBackground(RAYWHITE); + + // Draw the tiled area + DrawTextureTiled(ptex, patRec[activePat], (Rectangle){OPT_WIDTH+MARGIN_SIZE, MARGIN_SIZE, screenWidth - OPT_WIDTH - 2*MARGIN_SIZE, screenHeight - 2*MARGIN_SIZE}, + (Vector2){0.0f, 0.0f}, rotation, scale, colors[activeCol]); + + // Draw options + DrawRectangle(MARGIN_SIZE, MARGIN_SIZE, OPT_WIDTH - MARGIN_SIZE, screenHeight-2*MARGIN_SIZE, ColorAlpha(LIGHTGRAY, 0.5f)); + + DrawText("Select Pattern", 2+MARGIN_SIZE, 30+MARGIN_SIZE, 10, BLACK); + DrawTexture(ptex, 2+MARGIN_SIZE, 40+MARGIN_SIZE, BLACK); + DrawRectangle(2+MARGIN_SIZE + patRec[activePat].x, 40+MARGIN_SIZE+patRec[activePat].y,patRec[activePat].width, patRec[activePat].height, ColorAlpha(DARKBLUE, 0.3f)); + + DrawText("Select Color", 2+MARGIN_SIZE, 10+256+MARGIN_SIZE, 10, BLACK); + for(int i=0; i