summaryrefslogtreecommitdiff
path: root/tiled.c
diff options
context:
space:
mode:
authordavidovski <david@davidovski.xyz>2023-04-23 03:13:02 +0100
committerdavidovski <david@davidovski.xyz>2023-04-23 03:13:02 +0100
commitbb3034a4cb0f793e31608ebee4eff2ef8c1f8379 (patch)
tree5f5bddfc45bf75a0be004cdf6de1a05e7cb351dd /tiled.c
Pass tilemap to shader
Diffstat (limited to 'tiled.c')
-rw-r--r--tiled.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/tiled.c b/tiled.c
new file mode 100644
index 0000000..f3e34f2
--- /dev/null
+++ b/tiled.c
@@ -0,0 +1,90 @@
+#include <raylib.h>
+
+#define SCREEN_W 1280
+#define SCREEN_H 720
+
+#define MAP_W 4
+#define MAP_H 4
+
+const int tilemap[MAP_H][MAP_W] = {
+ {0, 0, 0, 0},
+ {0, 0, 3, 3},
+ {3, 3, 1, 1},
+ {1, 1, 2, 2}
+};
+
+
+int main() {
+ InitWindow(SCREEN_W, SCREEN_H, "tiled");
+
+ Shader shader = LoadShader(0, "tiled.glsl");
+
+ RenderTexture2D target = LoadRenderTexture(SCREEN_W, SCREEN_H);
+
+ float resolution[2] = {SCREEN_W, SCREEN_H};
+ float offset[2] = {0, 0};
+ float zoom = 1.0f;
+ Texture atlas = LoadTexture("tiles.png");
+ // size of the tile atlas grid in tiles
+ int atlasSize[2] = {2, 2};
+
+ int resolutionLoc = GetShaderLocation(shader, "resolution");
+ int locationLoc = GetShaderLocation(shader, "offset");
+ int zoomLoc = GetShaderLocation(shader, "zoom");
+ int atlasSizeLoc = GetShaderLocation(shader, "atlasSize");
+
+ int tilemapLoc[MAP_W][MAP_H]= {};
+ 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));
+ }
+ }
+
+
+ int textureLoc = GetShaderLocation(shader, "texture1");
+
+ while (!WindowShouldClose()) {
+ if (IsKeyDown(KEY_UP)) offset[1] += zoom * 0.01f;
+ if (IsKeyDown(KEY_DOWN)) offset[1] -= zoom * 0.01f;
+ if (IsKeyDown(KEY_RIGHT)) offset[0] -= zoom * 0.01f;
+ if (IsKeyDown(KEY_LEFT)) offset[0] += zoom * 0.01f;
+
+ if (IsKeyDown(KEY_W)) zoom -= zoom * 0.01f;
+ if (IsKeyDown(KEY_S)) zoom += zoom * 0.01f;
+
+ SetShaderValue(shader, resolutionLoc, resolution, SHADER_UNIFORM_VEC2);
+ SetShaderValue(shader, locationLoc, &offset, SHADER_UNIFORM_VEC2);
+ SetShaderValue(shader, zoomLoc, &zoom, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shader, atlasSizeLoc, &atlasSize, SHADER_UNIFORM_IVEC2);
+ for (int x = 0; x < MAP_W; x++) {
+ for (int y = 0; y < MAP_H; y++) {
+ SetShaderValue(shader, tilemapLoc[y][x], &tilemap[y][x], SHADER_UNIFORM_INT);
+ }
+ }
+
+ BeginDrawing();
+
+ ClearBackground(LIGHTGRAY);
+
+ BeginTextureMode(target);
+ DrawRectangle(0, 0, SCREEN_W, SCREEN_H, BLACK);
+ EndTextureMode();
+
+ BeginShaderMode(shader);
+ SetShaderValueTexture(shader, textureLoc, atlas);
+
+ // draw the base image to texture0
+ DrawTexture(target.texture, 0, 0, WHITE);
+ EndShaderMode();
+
+ EndDrawing();
+ }
+
+ UnloadShader(shader);
+ UnloadRenderTexture(target);
+ UnloadTexture(atlas);
+
+ CloseWindow();
+
+ return 0;
+}