summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tiled.c81
-rw-r--r--src/tiledfile.c80
-rw-r--r--src/tiledfile.h3
3 files changed, 164 insertions, 0 deletions
diff --git a/src/tiled.c b/src/tiled.c
new file mode 100644
index 0000000..2cb1cb0
--- /dev/null
+++ b/src/tiled.c
@@ -0,0 +1,81 @@
+#include <raylib.h>
+#include <stdio.h>
+
+#include "tiledfile.h"
+
+#define SCREEN_W 1280
+#define SCREEN_H 720
+
+const int atlasSize[2] = {2, 2};
+
+int main() {
+ InitWindow(SCREEN_W, SCREEN_H, "tiled");
+
+ Shader shader = LoadShader(0, "tiled.glsl");
+
+ Texture2D tilemap = loadTileMap("map.tiles");
+
+ Texture atlas = LoadTexture("atlas.png");
+ RenderTexture2D target = LoadRenderTexture(SCREEN_W, SCREEN_H);
+
+ float resolution[2] = {SCREEN_W, SCREEN_H};
+ float offset[2] = {0, 0};
+ float zoom = 16.0f;
+ int mapSize[2] = {tilemap.width, tilemap.height};
+
+
+ int resolutionLoc = GetShaderLocation(shader, "resolution");
+ int locationLoc = GetShaderLocation(shader, "offset");
+ int zoomLoc = GetShaderLocation(shader, "zoom");
+
+ int atlasSizeLoc = GetShaderLocation(shader, "atlasSize");
+ int mapSizeLoc = GetShaderLocation(shader, "mapSize");
+
+ int textureLoc = GetShaderLocation(shader, "texture1");
+ int tilemapLoc = GetShaderLocation(shader, "texture2");
+
+ 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);
+ SetShaderValue(shader, mapSizeLoc, &tilemap.width, SHADER_UNIFORM_IVEC2);
+
+ BeginDrawing();
+
+ ClearBackground(LIGHTGRAY);
+
+ BeginTextureMode(target);
+ DrawRectangle(0, 0, SCREEN_W, SCREEN_H, BLACK);
+ EndTextureMode();
+
+ BeginShaderMode(shader);
+ SetShaderValueTexture(shader, textureLoc, atlas);
+ SetShaderValueTexture(shader, tilemapLoc, tilemap);
+
+ // draw the base image to texture0
+ DrawTexture(target.texture, 0, 0, WHITE);
+ EndShaderMode();
+
+ DrawText(TextFormat("FPS: %d", GetFPS()), 12, 12, 24, DARKGRAY);
+
+ EndDrawing();
+ }
+
+ UnloadShader(shader);
+ UnloadRenderTexture(target);
+ UnloadTexture(atlas);
+
+ CloseWindow();
+
+ return 0;
+}
diff --git a/src/tiledfile.c b/src/tiledfile.c
new file mode 100644
index 0000000..c1ba42e
--- /dev/null
+++ b/src/tiledfile.c
@@ -0,0 +1,80 @@
+#include <raylib.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+const int i = 1;
+#define is_bigendian() ( (*(char*)&i) == 0 )
+
+Texture2D processTilemapTexture(int * tilelayout, int width, int height) {
+ Color *pixels = (Color*) malloc(width * height * sizeof(Color));
+
+ for (int y = 0; y < height; y++) {
+ for (int x = 0; x < width; x++) {
+ int tile = tilelayout[y*width + x];
+ pixels[y*width + x] = (Color){
+ (int) tile, 0, 0, 0
+ };
+ }
+ }
+
+ Image checkedIm = {
+ .data = pixels,
+ .width = width,
+ .height = height,
+ .format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8,
+ .mipmaps = 1
+ };
+
+ Texture2D checked = LoadTextureFromImage(checkedIm);
+ UnloadImage(checkedIm);
+
+ return checked;
+}
+
+//! read a big endian bytes from file
+int readb(char *out, size_t noBytes, FILE *file) {
+ if (!fread(out, (size_t)1, (size_t) noBytes, file))
+ return 1;
+
+ if (is_bigendian())
+ return 0;
+
+ int tmp;
+ // reverse byte order
+ for(int i = 0; i < noBytes/2; i++) {
+ tmp = out[i];
+ out[i] = out[noBytes-i-1];
+ out[noBytes-i-1] = tmp;
+ }
+
+ return 0;
+}
+
+
+Texture2D loadTileMap(char *filename) {
+ int width, height, tilebytes;
+ int *tilelayout;
+
+ FILE *file;
+
+ file = fopen(filename, "rb");
+ // skip header
+ fseek(file, 10, SEEK_CUR);
+ // 4 bytes for int width
+ readb((char *)&width, 4, file);
+ // 4 bytes for int height
+ readb((char *)&height, 4, file);
+ // 1 byte saying how big each tile is
+ readb((char *)&tilebytes, 4, file);
+ printf("tilebytes: %d\n", tilebytes);
+
+ tilelayout = malloc(width*height*tilebytes);
+ int tile;
+ for (int y = 0; y < height; y++) {
+ for (int x = 0; x < width; x++) {
+ readb((char *)&tile, tilebytes, file);
+ tilelayout[y*width + x] = tile;
+ }
+ }
+ return processTilemapTexture(tilelayout, width, height);
+}
diff --git a/src/tiledfile.h b/src/tiledfile.h
new file mode 100644
index 0000000..cf2980b
--- /dev/null
+++ b/src/tiledfile.h
@@ -0,0 +1,3 @@
+#include <raylib.h>
+
+Texture2D loadTileMap(char *filename);