From 2c668763a1d6e645dcfaa713b924de26260542d0 Mon Sep 17 00:00:00 2001
From: 3gg <3gg@shellblade.net>
Date: Fri, 14 Jul 2023 09:25:55 -0700
Subject: Fix checkerboard demo.

---
 gfx-iso/src/isogfx.c | 71 +++++++++++++++++++++++++++++++++-------------------
 1 file changed, 45 insertions(+), 26 deletions(-)

(limited to 'gfx-iso/src')

diff --git a/gfx-iso/src/isogfx.c b/gfx-iso/src/isogfx.c
index 6d2350f..3ed0fde 100644
--- a/gfx-iso/src/isogfx.c
+++ b/gfx-iso/src/isogfx.c
@@ -192,6 +192,15 @@ static inline Pixel* screen_xy_mut(IsoGfx* iso, int x, int y) {
   return (Pixel*)screen_xy_const_ref(iso, x, y);
 }
 
+static int calc_num_tile_blocks(
+    int base_tile_width, int base_tile_height, int tile_width,
+    int tile_height) {
+  const int base_tile_size = base_tile_width * base_tile_height;
+  const int tile_size      = tile_width * tile_height;
+  const int num_blocks     = tile_size / base_tile_size;
+  return num_blocks;
+}
+
 // -----------------------------------------------------------------------------
 // Renderer, world and tile management.
 // -----------------------------------------------------------------------------
@@ -276,8 +285,10 @@ bool isogfx_make_world(IsoGfx* iso, const WorldDesc* desc) {
   if (!(iso->world = calloc(world_size, sizeof(Tile)))) {
     goto cleanup;
   }
-  // TODO: This needs tiles and pixels now.
-  if (!mempool_make_dyn(&iso->tiles, tile_pool_size, tile_size_bytes)) {
+  if (!mempool_make_dyn(&iso->tiles, world_size, sizeof(TileData))) {
+    goto cleanup;
+  }
+  if (!mem_make_dyn(&iso->pixels, tile_pool_size, tile_size_bytes)) {
     goto cleanup;
   }
 
@@ -285,7 +296,6 @@ bool isogfx_make_world(IsoGfx* iso, const WorldDesc* desc) {
 
 cleanup:
   destroy_world(iso);
-  mempool_del(&iso->tiles);
   return false;
 }
 
@@ -449,8 +459,15 @@ Tile isogfx_make_tile(IsoGfx* iso, const TileDesc* desc) {
   TileData* tile = mempool_alloc(&iso->tiles);
   assert(tile); // TODO: Make this a hard assert.
 
-  tile->width  = desc->width;
-  tile->height = desc->height;
+  const int num_blocks = calc_num_tile_blocks(
+      iso->tile_width, iso->tile_height, desc->width, desc->height);
+
+  Pixel* pixels = mem_alloc(&iso->pixels, num_blocks);
+  assert(pixels); // TODO: Make this a hard assert.
+
+  tile->width         = desc->width;
+  tile->height        = desc->height;
+  tile->pixels_handle = mem_get_chunk_handle(&iso->pixels, pixels);
 
   switch (desc->type) {
   case TileFromColour:
@@ -540,26 +557,6 @@ static void draw(IsoGfx* iso) {
   }
 }
 
-void isogfx_pick_tile(
-    const IsoGfx* iso, double xcart, double ycart, int* xiso, int* yiso) {
-  assert(iso);
-  assert(xiso);
-  assert(yiso);
-
-  const vec2 xy_iso = cart2iso(
-      (vec2){.x = xcart, .y = ycart}, iso->tile_width, iso->tile_height,
-      iso->screen_width);
-
-  if ((0 <= xy_iso.x) && (xy_iso.x < iso->world_width) && (0 <= xy_iso.y) &&
-      (xy_iso.y < iso->world_height)) {
-    *xiso = (int)xy_iso.x;
-    *yiso = (int)xy_iso.y;
-  } else {
-    *xiso = -1;
-    *yiso = -1;
-  }
-}
-
 void isogfx_render(IsoGfx* iso) {
   assert(iso);
   draw(iso);
@@ -572,7 +569,9 @@ void isogfx_draw_tile(IsoGfx* iso, int x, int y, Tile tile) {
   assert(x < iso->world_width);
   assert(y < iso->world_height);
 
-  const ivec2 o  = {(iso->screen_width / 2) - (iso->tile_width / 2), 0};
+  // const ivec2 o  = {(iso->screen_width / 2) - (iso->tile_width / 2), 0};
+  const ivec2 o = {
+      (iso->screen_width / 2) - (iso->tile_width / 2), iso->tile_height};
   const ivec2 vx = {.x = iso->tile_width / 2, .y = iso->tile_height / 2};
   const ivec2 vy = {.x = -iso->tile_width / 2, .y = iso->tile_height / 2};
   const ivec2 so =
@@ -606,3 +605,23 @@ const Pixel* isogfx_get_screen_buffer(const IsoGfx* iso) {
   assert(iso);
   return iso->screen;
 }
+
+void isogfx_pick_tile(
+    const IsoGfx* iso, double xcart, double ycart, int* xiso, int* yiso) {
+  assert(iso);
+  assert(xiso);
+  assert(yiso);
+
+  const vec2 xy_iso = cart2iso(
+      (vec2){.x = xcart, .y = ycart}, iso->tile_width, iso->tile_height,
+      iso->screen_width);
+
+  if ((0 <= xy_iso.x) && (xy_iso.x < iso->world_width) && (0 <= xy_iso.y) &&
+      (xy_iso.y < iso->world_height)) {
+    *xiso = (int)xy_iso.x;
+    *yiso = (int)xy_iso.y;
+  } else {
+    *xiso = -1;
+    *yiso = -1;
+  }
+}
-- 
cgit v1.2.3