From 5e041ffbf0312242ee93c65220a5f193c23a6cc6 Mon Sep 17 00:00:00 2001 From: DaniTheSkunk <> Date: Sat, 7 Jan 2023 13:22:22 +0000 Subject: [PATCH] tilemap rendering --- examples/gsa_simple.c | 3 +++ include/gsa.h | 11 ++++++++++- include/types.h | 3 +++ meson.build | 1 + src/gsa.c | 30 ++++++++++++++++++++++++++++-- src/types.c | 9 +++++++++ 6 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 src/types.c diff --git a/examples/gsa_simple.c b/examples/gsa_simple.c index a8b6c7d..9d6bb38 100644 --- a/examples/gsa_simple.c +++ b/examples/gsa_simple.c @@ -8,9 +8,12 @@ void init() { sprites[1].tile = 3; sprites[1].x = 10; sprites[1].y = 100; + + maps[0].tiles[20][1] = 2; } void tick() { sprites[0].x += 1; sprites[1].x += 2; + maps[0].scrollx += 1; } diff --git a/include/gsa.h b/include/gsa.h index 6a03cd9..abfa16c 100644 --- a/include/gsa.h +++ b/include/gsa.h @@ -25,15 +25,24 @@ #include "vec2i.h" #include "window.h" +#define MAX_SPRITES 256 +#define TILEMAP_MAX_SIZE 1024 +#define MAX_TILEMAPS 4 + struct gsa_sprite { u16 tile; i32 x, y; }; -#define MAX_SPRITES 256 +struct gsa_map { + u16 tiles[TILEMAP_MAX_SIZE][TILEMAP_MAX_SIZE]; + i32 w, h; + i32 scrollx, scrolly; +}; extern struct gsa_sprite sprites[MAX_SPRITES]; extern struct sw_image8 *_gfx; +extern struct gsa_map maps[MAX_TILEMAPS]; int gsa_main(int argc, char *argv[]); diff --git a/include/types.h b/include/types.h index 487df85..f8e3fab 100644 --- a/include/types.h +++ b/include/types.h @@ -16,4 +16,7 @@ typedef i8 bool; #define true 1 #define false 0 +i32 i32_max(i32 v1, i32 v2); +i32 i32_min(i32 v1, i32 v2); + #endif /* GUARD_649E63003BEAE79ECA2B813C4E131C9A */ diff --git a/meson.build b/meson.build index 250da70..190d9e1 100644 --- a/meson.build +++ b/meson.build @@ -48,6 +48,7 @@ skunk_sources = [ 'src/image8.c', 'src/shader.c', 'src/skunkworks.c', + 'src/types.c', 'src/vec2i.c', 'src/window.c' ] diff --git a/src/gsa.c b/src/gsa.c index 15fdf5e..c10a70e 100644 --- a/src/gsa.c +++ b/src/gsa.c @@ -3,12 +3,14 @@ #include "gl.h" #include "image8.h" #include "shader.h" +#include "types.h" #include #include #define GSA_NOMAIN #include "gsa.h" struct gsa_sprite sprites[256]; +struct gsa_map maps[MAX_TILEMAPS]; struct sw_image8 *_gfx; struct sw_window *_win; @@ -159,12 +161,36 @@ static void update_palette_gl() { } void _gsa_tick() { - i32 i; + i32 i, x, y, startx, starty, endx, endy; tick(); next_render_vert = 0; - /* glBegin(GL_TRIANGLES); */ + + for(i = 0; i < MAX_TILEMAPS; ++i) { + startx = maps[i].scrollx / 16; + starty = maps[i].scrolly / 16; + endx = i32_min(TILEMAP_MAX_SIZE, startx + 20); + endy = i32_min(TILEMAP_MAX_SIZE, starty + 12); + startx = i32_max(0, startx); + starty = i32_max(0, starty); + + for(x = startx; x <= endx; ++x) { + for(y = starty; y <= endy; ++y) { + u16 tile = maps[i].tiles[x][y]; + if(tile) { + rect( + x * 16 - maps[i].scrollx, + y * 16 - maps[i].scrolly, + 16, + 16, + tile + ); + } + } + } + } + for(i = 0; i < MAX_SPRITES; ++i) { if(sprites[i].tile > 0) { rect(sprites[i].x, sprites[i].y, 16, 16, sprites[i].tile); diff --git a/src/types.c b/src/types.c new file mode 100644 index 0000000..93c4a1c --- /dev/null +++ b/src/types.c @@ -0,0 +1,9 @@ +#include "types.h" + +i32 i32_max(i32 v1, i32 v2) { + return v1 > v2 ? v1 : v2; +} + +i32 i32_min(i32 v1, i32 v2) { + return v1 < v2 ? v1 : v2; +}