diff options
-rw-r--r-- | tiled.c | 28 | ||||
-rw-r--r-- | tiled.glsl | 41 |
2 files changed, 35 insertions, 34 deletions
@@ -4,17 +4,17 @@ #define SCREEN_W 1280 #define SCREEN_H 720 -#define MAP_W 8 +#define MAP_W 16 #define MAP_H 4 const int tilemap[MAP_H][MAP_W] = { - {0, 0, 0, 0, 0, 0, 3, 3}, - {0, 3, 3, 0, 0, 3, 1, 1}, - {3, 1, 1, 3, 3, 1, 2, 2}, - {1, 2, 2, 1, 1, 2, 4, 4} -}; -const int atlasSize[2] = {2, 2}; + {0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,}, + {0, 3, 3, 0, 0, 3, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0,}, + {3, 1, 1, 3, 3, 1, 2, 2, 2, 1, 3, 3, 3, 0, 0, 3,}, + {1, 2, 2, 1, 1, 2, 4, 4, 4, 2, 1, 1, 1, 3, 3, 1,} +}; +const int atlasSize[2] = {2, 2}; int main() { InitWindow(SCREEN_W, SCREEN_H, "tiled"); @@ -27,20 +27,18 @@ int main() { float offset[2] = {0, 0}; float zoom = 1.0f; Texture atlas = LoadTexture("tiles.png"); - // size of the tile atlas grid in tiles - int resolutionLoc = GetShaderLocation(shader, "resolution"); int locationLoc = GetShaderLocation(shader, "offset"); int zoomLoc = GetShaderLocation(shader, "zoom"); int atlasSizeLoc = GetShaderLocation(shader, "atlasSize"); - int tilemapLoc[MAP_H][MAP_W]= {}; + int tilemapLoc[MAP_H][MAP_W] = {}; for (int x = 0; x < MAP_W; x++) { - for (int y = 0; y < MAP_H; y++) { - tilemapLoc[y][x] = GetShaderLocation(shader, TextFormat("tilemap[%d][%d]", y, x)); + for (int y = 0; y < MAP_H; y++) { + tilemapLoc[y][x] = + GetShaderLocation(shader, TextFormat("tilemap[%d][%d]", y, x)); + } } - } - int textureLoc = GetShaderLocation(shader, "texture1"); @@ -78,6 +76,8 @@ int main() { DrawTexture(target.texture, 0, 0, WHITE); EndShaderMode(); + DrawText(TextFormat("FPS: %d", GetFPS()), 12, 12, 24, DARKGRAY); + EndDrawing(); } @@ -1,4 +1,7 @@ #version 430 + +#define MAP_H 4 +#define MAP_W 16 precision highp float; in vec3 vertexPos; @@ -12,12 +15,19 @@ uniform vec2 resolution; uniform vec2 offset; uniform float zoom; uniform ivec2 atlasSize; -uniform int tilemap[4][8]; +uniform int tilemap[MAP_H][MAP_W]; out vec4 finalColor; const vec4 none = vec4(0.0f, 0.0f, 0.0f, 0.0f); +bool inBounds(vec2 coords, vec2 area) { + return coords.x > area.x + || coords.x < 0 + || coords.y > area.y + || coords.y < 0; +} + ivec2 calcTileOffset(int tileIndex) { tileIndex -= 1; int x = tileIndex % atlasSize.x; @@ -25,18 +35,14 @@ ivec2 calcTileOffset(int tileIndex) { return ivec2(x, y); } -vec4 tile(vec2 coords, int tileIndex, vec2 tileSize) { - - if (tileIndex == 0 - || coords.x > tileSize.x - || coords.x < 0 - || coords.y > tileSize.y - || coords.y < 0) { +vec4 tile(vec2 coords, int tileIndex) { + if ( + tileIndex == 0 + || inBounds(coords, vec2(1, 1))) { return none; } else { ivec2 tileOffset = calcTileOffset(tileIndex); - vec2 texCoords = coords + (tileOffset*tileSize); - texCoords /= tileSize; + vec2 texCoords = coords + (tileOffset); texCoords /= atlasSize; return texture(texture1, texCoords); @@ -45,25 +51,20 @@ vec4 tile(vec2 coords, int tileIndex, vec2 tileSize) { void main() { ivec2 texSize = textureSize(texture1, 1); - vec2 tileSize = texSize / atlasSize; - vec2 uv = fragTexCoord * tileSize; + vec2 uv = fragTexCoord; uv.x *= resolution.x / resolution.y; uv *= zoom; uv -= offset; // get position in tiled world wow - ivec2 tilemapPos = ivec2(floor(uv.x / tileSize.x), floor(uv.y / tileSize.y)); - - if (uv.x < 0 - || uv.y < 0 - || uv.x > 8*tileSize.x - || uv.y > 8*tileSize.y) { + ivec2 tilemapPos = ivec2(floor(uv)); + if (inBounds(uv, vec2(MAP_W, MAP_H))) { finalColor = none; } else { - vec2 position = mod(uv,tileSize); - finalColor = tile(position, tilemap[tilemapPos.y][tilemapPos.x], tileSize); + vec2 position = mod(uv, 1); + finalColor = tile(position, tilemap[tilemapPos.y][tilemapPos.x]); } } |