From 129703fad18b478d015a520524d46ab4afa2cb79 Mon Sep 17 00:00:00 2001 From: Ray Date: Thu, 11 Apr 2019 16:53:20 +0200 Subject: [PATCH] new example: shaders_texture_drawing --- .../shaders/glsl330/cubes_panning.fs | 61 +++++++++++++++ examples/shaders/shaders_texture_drawing.c | 71 ++++++++++++++++++ examples/shaders/shaders_texture_drawing.png | Bin 0 -> 16865 bytes 3 files changed, 132 insertions(+) create mode 100644 examples/shaders/resources/shaders/glsl330/cubes_panning.fs create mode 100644 examples/shaders/shaders_texture_drawing.c create mode 100644 examples/shaders/shaders_texture_drawing.png diff --git a/examples/shaders/resources/shaders/glsl330/cubes_panning.fs b/examples/shaders/resources/shaders/glsl330/cubes_panning.fs new file mode 100644 index 000000000..c92418a48 --- /dev/null +++ b/examples/shaders/resources/shaders/glsl330/cubes_panning.fs @@ -0,0 +1,61 @@ +#version 330 + +// Input vertex attributes (from vertex shader) +in vec2 fragTexCoord; +in vec4 fragColor; + +// Output fragment color +out vec4 finalColor; + +// Custom variables +#define PI 3.14159265358979323846 +uniform float uTime = 0.0; + +float divisions = 5.0; +float angle = 0.0; + +vec2 VectorRotateTime(vec2 v, float speed) +{ + float time = uTime*speed; + float localTime = fract(time); // The time domain this works on is 1 sec. + + if ((localTime >= 0.0) && (localTime < 0.25)) angle = 0.0; + else if ((localTime >= 0.25) && (localTime < 0.50)) angle = PI/4*sin(2*PI*localTime - PI/2); + else if ((localTime >= 0.50) && (localTime < 0.75)) angle = PI*0.25; + else if ((localTime >= 0.75) && (localTime < 1.00)) angle = PI/4*sin(2*PI*localTime); + + // Rotate vector by angle + v -= 0.5; + v = mat2(cos(angle), -sin(angle), sin(angle), cos(angle))*v; + v += 0.5; + + return v; +} + +float Rectangle(in vec2 st, in float size, in float fill) +{ + float roundSize = 0.5 - size/2.0; + float left = step(roundSize, st.x); + float top = step(roundSize, st.y); + float bottom = step(roundSize, 1.0 - st.y); + float right = step(roundSize, 1.0 - st.x); + + return (left*bottom*right*top)*fill; +} + +void main() +{ + vec2 fragPos = fragTexCoord; + fragPos.xy += uTime/9.0; + + fragPos *= divisions; + vec2 ipos = floor(fragPos); // Get the integer coords + vec2 fpos = fract(fragPos); // Get the fractional coords + + fpos = VectorRotateTime(fpos, 0.2); + + float alpha = Rectangle(fpos, 0.216, 1.0); + vec3 color = vec3(0.3, 0.3, 0.3); + + finalColor = vec4(color, alpha); +} \ No newline at end of file diff --git a/examples/shaders/shaders_texture_drawing.c b/examples/shaders/shaders_texture_drawing.c new file mode 100644 index 000000000..cb8a9c1eb --- /dev/null +++ b/examples/shaders/shaders_texture_drawing.c @@ -0,0 +1,71 @@ +/******************************************************************************************* +* +* raylib [textures] example - Shader texture drawing +* +* This example illustrates how to draw on a blank texture using a shader +* +* 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) 2019 MichaƂ Ciesielski and Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [shaders] example - shader texture drawing"); + + Image imBlank = GenImageColor(1024, 1024, BLANK); + Texture2D texture = LoadTextureFromImage(imBlank); // Load blank texture to fill on shader + UnloadImage(imBlank); + + // NOTE: Using GLSL 330 shader version, on OpenGL ES 2.0 use GLSL 100 shader version + Shader shader = LoadShader(0, "resources/shaders/glsl330/cubes_panning.fs"); + + float time = 0.0f; + int timeLoc = GetShaderLocation(shader, "uTime"); + SetShaderValue(shader, timeLoc, &time, UNIFORM_FLOAT); + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + while (!WindowShouldClose()) + { + // Update + //---------------------------------------------------------------------------------- + time = GetTime(); + SetShaderValue(shader, timeLoc, &time, UNIFORM_FLOAT); + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + BeginShaderMode(shader); // Enable our custom shader for next shapes/textures drawings + DrawTexture(texture, 0, 0, WHITE); // Drawing BLANK texture, all magic happens on shader + EndShaderMode(); // Disable our custom shader, return to default shader + + DrawText("BACKGROUND is PAINTED and ANIMATED on SHADER!", 10, 10, 20, MAROON); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadShader(shader); + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/shaders/shaders_texture_drawing.png b/examples/shaders/shaders_texture_drawing.png new file mode 100644 index 0000000000000000000000000000000000000000..12df6fae39c4154cbcda6987c999606c552cd8a1 GIT binary patch literal 16865 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 b3=I4Cex9f1{>Phvfq}u()z4*}Q$iB}Pgk_E literal 0 HcmV?d00001