From 303f5dc58dd8e8266df3c62fc84d9799db8047b9 Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Tue, 27 Jun 2023 16:12:45 -0700 Subject: Initial renderer. --- gfx-iso/src/isogfx.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) (limited to 'gfx-iso/src/isogfx.c') diff --git a/gfx-iso/src/isogfx.c b/gfx-iso/src/isogfx.c index 27981f9..b38efe7 100644 --- a/gfx-iso/src/isogfx.c +++ b/gfx-iso/src/isogfx.c @@ -52,14 +52,22 @@ static inline ivec2 iso2cart(ivec2 iso, int s, int t, int w) { .x = (iso.x - iso.y) * (s / 2) + (w / 2), .y = (iso.x + iso.y) * (t / 2)}; } +// Method 1. +// static inline vec2 cart2iso(vec2 cart, int s, int t, int w) { +// const double x = cart.x - (double)(w / 2); +// const double xiso = (x * t + cart.y * s) / (double)(s * t); +// return (vec2){ +// .x = (int)(xiso), .y = (int)((2.0 / (double)t) * cart.y - xiso)}; +//} + +// Method 2. static inline vec2 cart2iso(vec2 cart, int s, int t, int w) { const double one_over_s = 1. / (double)s; const double one_over_t = 1. / (double)t; const double x = cart.x - (double)(w / 2); - return (vec2){ - .x = (int)(one_over_s * x + one_over_t * cart.y), - .y = (int)(-one_over_s * x + one_over_t * cart.y)}; + .x = (one_over_s * x + one_over_t * cart.y), + .y = (-one_over_s * x + one_over_t * cart.y)}; } Pixel* tile_xy_mut(const IsoGfx* iso, TileData* tile, int x, int y) { @@ -120,7 +128,7 @@ static inline Pixel* screen_xy_mut(IsoGfx* iso, int x, int y) { return &iso->screen[y * iso->screen_width + x]; } -static void draw_tile(IsoGfx* iso, ivec2 so, Tile tile) { +static void draw_tile(IsoGfx* iso, ivec2 origin, Tile tile) { assert(iso); const TileData* data = mempool_get_block(&iso->tiles, tile); @@ -129,8 +137,8 @@ static void draw_tile(IsoGfx* iso, ivec2 so, Tile tile) { for (int py = 0; py < iso->tile_height; ++py) { for (int px = 0; px < iso->tile_width; ++px) { const Pixel colour = tile_xy(iso, data, px, py); - const int sx = so.x + px; - const int sy = so.y + py; + const int sx = origin.x + px; + const int sy = origin.y + py; if ((sx >= 0) && (sy >= 0) && (sx < iso->screen_width) && (sy < iso->screen_height)) { const uint8_t mask = iso->tile_mask[py * iso->tile_width + px]; @@ -154,8 +162,9 @@ static void draw(IsoGfx* iso) { const ivec2 x = {.x = iso->tile_width / 2, .y = iso->tile_height / 2}; const ivec2 y = {.x = -iso->tile_width / 2, .y = iso->tile_height / 2}; - // TODO: Since the world will generally be larger than the screen, it - // would be best to walk in screen space and fetch the tile. + // TODO: Culling. + // Ex: map the screen corners to tile space to cull. + // Ex: walk in screen space and fetch the tile. // The tile-centric approach might be more cache-friendly, however, since the // screen-centric approach would juggle multiple tiles throughout the scan. for (int ty = 0; ty < iso->world_height; ++ty) { @@ -312,15 +321,13 @@ void isogfx_pick_tile( (vec2){.x = xcart, .y = ycart}, iso->tile_width, iso->tile_height, iso->screen_width); - const int x = (int)xy_iso.x; - const int y = (int)xy_iso.y; - - if ((0 <= x) && (x < iso->world_width) && (0 <= y) && - (y < iso->world_height)) { - *xiso = x; - *yiso = y; + 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