From c8131ea95846f76fb196a78ce9c9b09aeb15736c Mon Sep 17 00:00:00 2001 From: jussi Date: Sat, 25 Jan 2025 17:36:29 +0200 Subject: Atlas texture repeat example. --- README.md | 1 - changelog | 1 + examples/resources/shaders/glsl330/atlas_repeat.fs | 28 +++++++++++++++++ examples/resources/shaders/glsl330/base.vs | 6 +++- examples/texture_atlas_repeat/main.lua | 35 ++++++++++++++++++++++ 5 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 examples/resources/shaders/glsl330/atlas_repeat.fs create mode 100644 examples/texture_atlas_repeat/main.lua diff --git a/README.md b/README.md index 0d70415..e7a5bc5 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,6 @@ List of some MISSING features that are planned to be included. For specific func ## Roadmap * v0.9 - * Move to raylib 5.5. ## Usage diff --git a/changelog b/changelog index 2e23fe8..7202e6a 100644 --- a/changelog +++ b/changelog @@ -35,6 +35,7 @@ DETAILED CHANGES: - ADDED: BUFFER_UNSIGNED_LONG and BUFFER_LONG. - FIXED: Bitwise functions now use 64 bit integers. - CHANGE: SetBufferData takes table of values. + - ADDED: Texture atlas repeat example. ------------------------------------------------------------------------ Release: ReiLua version 0.8.0 Using Raylib 5.0 and Forked Raygui 4.0 diff --git a/examples/resources/shaders/glsl330/atlas_repeat.fs b/examples/resources/shaders/glsl330/atlas_repeat.fs new file mode 100644 index 0000000..90547f0 --- /dev/null +++ b/examples/resources/shaders/glsl330/atlas_repeat.fs @@ -0,0 +1,28 @@ +#version 330 + +// Input vertex attributes (from vertex shader) +in vec3 fragPosition; +in vec2 fragTexCoord; +in vec4 fragColor; + +// Input uniform values +uniform sampler2D texture0; + +uniform vec2 atlasSize; +uniform vec2 tileTexSize; + +// Output fragment color +out vec4 finalColor; + +vec2 texTileSize = tileTexSize / atlasSize; +vec2 atlasTileSize = atlasSize / tileTexSize; + +void main() { + vec2 tileTexCoord = fract( vec2( fragPosition.x, fragPosition.y ) / tileTexSize ); + // Get tile texture corner. + vec2 texOffset = floor( fragTexCoord / texTileSize ) * texTileSize; + vec2 fragCoord = tileTexCoord / atlasTileSize + texOffset; + vec4 texelColor = texture( texture0, fragCoord ); + + finalColor = texelColor * fragColor; +} diff --git a/examples/resources/shaders/glsl330/base.vs b/examples/resources/shaders/glsl330/base.vs index c6e94f6..b29bed8 100644 --- a/examples/resources/shaders/glsl330/base.vs +++ b/examples/resources/shaders/glsl330/base.vs @@ -10,16 +10,20 @@ in vec4 vertexColor; uniform mat4 mvp; // Output vertex attributes (to fragment shader) +out vec3 fragPosition; out vec2 fragTexCoord; +out vec3 fragNormal; out vec4 fragColor; // NOTE: Add here your custom variables void main() { // Send vertex attributes to fragment shader + fragPosition = vertexPosition; fragTexCoord = vertexTexCoord; + fragNormal = vertexNormal; fragColor = vertexColor; // Calculate final vertex position gl_Position = mvp * vec4( vertexPosition, 1.0 ); -} \ No newline at end of file +} diff --git a/examples/texture_atlas_repeat/main.lua b/examples/texture_atlas_repeat/main.lua new file mode 100644 index 0000000..6056e71 --- /dev/null +++ b/examples/texture_atlas_repeat/main.lua @@ -0,0 +1,35 @@ +local atlas = nil +local shader = nil + +local GLSL_VERSION = "330" -- PLATFORM_DESKTOP + +function RL.init() + RL.SetWindowTitle( "Texture atlas repeat shader" ) + RL.SetWindowState( RL.FLAG_VSYNC_HINT ) + + local path = RL.GetBasePath().."../resources/" + local shaderPath = path.."/shaders/glsl"..GLSL_VERSION.."/" + + shader = RL.LoadShader( shaderPath.."base.vs", shaderPath.."atlas_repeat.fs" ) + atlas = RL.LoadTexture( path.."images/tiles.png" ) + + local loc = RL.GetShaderLocation( shader, "atlasSize" ) + RL.SetShaderValue( shader, loc, RL.GetTextureSize( atlas ), RL.SHADER_UNIFORM_VEC2 ) + loc = RL.GetShaderLocation( shader, "tileTexSize" ) + RL.SetShaderValue( shader, loc, { 32, 32 }, RL.SHADER_UNIFORM_VEC2 ) + -- Set texture for DrawTriangle. + RL.SetShapesTexture( atlas, { 32 * 4, 0, 32, 32 } ) +end + +function RL.update( delta ) +end + +function RL.draw() + RL.ClearBackground( RL.RAYWHITE ) + + RL.BeginShaderMode( shader ) + RL.DrawTexturePro( atlas, { 0, 0, 32, 32 }, { 0, 0, 64, 64 }, { 0.0 }, 0.0, RL.WHITE ) + RL.DrawTexturePro( atlas, { 32, 0, 32, 32 }, { 0, 64, 128, 64 }, { 0.0 }, 0.0, RL.WHITE ) + RL.DrawTriangle( { 32, 200 }, { 128, 400 }, { 320, 240 }, RL.WHITE ) + RL.EndShaderMode() +end -- cgit v1.2.3