diff options
Diffstat (limited to 'gfx-iso')
-rw-r--r-- | gfx-iso/include/isogfx/isogfx.h | 8 | ||||
-rw-r--r-- | gfx-iso/src/isogfx.c | 71 |
2 files changed, 49 insertions, 30 deletions
diff --git a/gfx-iso/include/isogfx/isogfx.h b/gfx-iso/include/isogfx/isogfx.h index 5c44310..6b7ce8e 100644 --- a/gfx-iso/include/isogfx/isogfx.h +++ b/gfx-iso/include/isogfx/isogfx.h | |||
@@ -79,10 +79,6 @@ void isogfx_set_tile(IsoGfx*, int x, int y, Tile); | |||
79 | /// Set the tiles in positions in the range (x0,y0) - (x1,y1). | 79 | /// Set the tiles in positions in the range (x0,y0) - (x1,y1). |
80 | void isogfx_set_tiles(IsoGfx*, int x0, int y0, int x1, int y1, Tile); | 80 | void isogfx_set_tiles(IsoGfx*, int x0, int y0, int x1, int y1, Tile); |
81 | 81 | ||
82 | /// Translate Cartesian to isometric coordinates. | ||
83 | void isogfx_pick_tile( | ||
84 | const IsoGfx*, double xcart, double ycart, int* xiso, int* yiso); | ||
85 | |||
86 | /// Render the world. | 82 | /// Render the world. |
87 | void isogfx_render(IsoGfx*); | 83 | void isogfx_render(IsoGfx*); |
88 | 84 | ||
@@ -100,3 +96,7 @@ bool isogfx_resize(IsoGfx*, int screen_width, int screen_height); | |||
100 | /// | 96 | /// |
101 | /// Call after each call to isogfx_render() to retrieve the render output. | 97 | /// Call after each call to isogfx_render() to retrieve the render output. |
102 | const Pixel* isogfx_get_screen_buffer(const IsoGfx*); | 98 | const Pixel* isogfx_get_screen_buffer(const IsoGfx*); |
99 | |||
100 | /// Translate Cartesian to isometric coordinates. | ||
101 | void isogfx_pick_tile( | ||
102 | const IsoGfx*, double xcart, double ycart, int* xiso, int* yiso); | ||
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) { | |||
192 | return (Pixel*)screen_xy_const_ref(iso, x, y); | 192 | return (Pixel*)screen_xy_const_ref(iso, x, y); |
193 | } | 193 | } |
194 | 194 | ||
195 | static int calc_num_tile_blocks( | ||
196 | int base_tile_width, int base_tile_height, int tile_width, | ||
197 | int tile_height) { | ||
198 | const int base_tile_size = base_tile_width * base_tile_height; | ||
199 | const int tile_size = tile_width * tile_height; | ||
200 | const int num_blocks = tile_size / base_tile_size; | ||
201 | return num_blocks; | ||
202 | } | ||
203 | |||
195 | // ----------------------------------------------------------------------------- | 204 | // ----------------------------------------------------------------------------- |
196 | // Renderer, world and tile management. | 205 | // Renderer, world and tile management. |
197 | // ----------------------------------------------------------------------------- | 206 | // ----------------------------------------------------------------------------- |
@@ -276,8 +285,10 @@ bool isogfx_make_world(IsoGfx* iso, const WorldDesc* desc) { | |||
276 | if (!(iso->world = calloc(world_size, sizeof(Tile)))) { | 285 | if (!(iso->world = calloc(world_size, sizeof(Tile)))) { |
277 | goto cleanup; | 286 | goto cleanup; |
278 | } | 287 | } |
279 | // TODO: This needs tiles and pixels now. | 288 | if (!mempool_make_dyn(&iso->tiles, world_size, sizeof(TileData))) { |
280 | if (!mempool_make_dyn(&iso->tiles, tile_pool_size, tile_size_bytes)) { | 289 | goto cleanup; |
290 | } | ||
291 | if (!mem_make_dyn(&iso->pixels, tile_pool_size, tile_size_bytes)) { | ||
281 | goto cleanup; | 292 | goto cleanup; |
282 | } | 293 | } |
283 | 294 | ||
@@ -285,7 +296,6 @@ bool isogfx_make_world(IsoGfx* iso, const WorldDesc* desc) { | |||
285 | 296 | ||
286 | cleanup: | 297 | cleanup: |
287 | destroy_world(iso); | 298 | destroy_world(iso); |
288 | mempool_del(&iso->tiles); | ||
289 | return false; | 299 | return false; |
290 | } | 300 | } |
291 | 301 | ||
@@ -449,8 +459,15 @@ Tile isogfx_make_tile(IsoGfx* iso, const TileDesc* desc) { | |||
449 | TileData* tile = mempool_alloc(&iso->tiles); | 459 | TileData* tile = mempool_alloc(&iso->tiles); |
450 | assert(tile); // TODO: Make this a hard assert. | 460 | assert(tile); // TODO: Make this a hard assert. |
451 | 461 | ||
452 | tile->width = desc->width; | 462 | const int num_blocks = calc_num_tile_blocks( |
453 | tile->height = desc->height; | 463 | iso->tile_width, iso->tile_height, desc->width, desc->height); |
464 | |||
465 | Pixel* pixels = mem_alloc(&iso->pixels, num_blocks); | ||
466 | assert(pixels); // TODO: Make this a hard assert. | ||
467 | |||
468 | tile->width = desc->width; | ||
469 | tile->height = desc->height; | ||
470 | tile->pixels_handle = mem_get_chunk_handle(&iso->pixels, pixels); | ||
454 | 471 | ||
455 | switch (desc->type) { | 472 | switch (desc->type) { |
456 | case TileFromColour: | 473 | case TileFromColour: |
@@ -540,26 +557,6 @@ static void draw(IsoGfx* iso) { | |||
540 | } | 557 | } |
541 | } | 558 | } |
542 | 559 | ||
543 | void isogfx_pick_tile( | ||
544 | const IsoGfx* iso, double xcart, double ycart, int* xiso, int* yiso) { | ||
545 | assert(iso); | ||
546 | assert(xiso); | ||
547 | assert(yiso); | ||
548 | |||
549 | const vec2 xy_iso = cart2iso( | ||
550 | (vec2){.x = xcart, .y = ycart}, iso->tile_width, iso->tile_height, | ||
551 | iso->screen_width); | ||
552 | |||
553 | if ((0 <= xy_iso.x) && (xy_iso.x < iso->world_width) && (0 <= xy_iso.y) && | ||
554 | (xy_iso.y < iso->world_height)) { | ||
555 | *xiso = (int)xy_iso.x; | ||
556 | *yiso = (int)xy_iso.y; | ||
557 | } else { | ||
558 | *xiso = -1; | ||
559 | *yiso = -1; | ||
560 | } | ||
561 | } | ||
562 | |||
563 | void isogfx_render(IsoGfx* iso) { | 560 | void isogfx_render(IsoGfx* iso) { |
564 | assert(iso); | 561 | assert(iso); |
565 | draw(iso); | 562 | draw(iso); |
@@ -572,7 +569,9 @@ void isogfx_draw_tile(IsoGfx* iso, int x, int y, Tile tile) { | |||
572 | assert(x < iso->world_width); | 569 | assert(x < iso->world_width); |
573 | assert(y < iso->world_height); | 570 | assert(y < iso->world_height); |
574 | 571 | ||
575 | const ivec2 o = {(iso->screen_width / 2) - (iso->tile_width / 2), 0}; | 572 | // const ivec2 o = {(iso->screen_width / 2) - (iso->tile_width / 2), 0}; |
573 | const ivec2 o = { | ||
574 | (iso->screen_width / 2) - (iso->tile_width / 2), iso->tile_height}; | ||
576 | const ivec2 vx = {.x = iso->tile_width / 2, .y = iso->tile_height / 2}; | 575 | const ivec2 vx = {.x = iso->tile_width / 2, .y = iso->tile_height / 2}; |
577 | const ivec2 vy = {.x = -iso->tile_width / 2, .y = iso->tile_height / 2}; | 576 | const ivec2 vy = {.x = -iso->tile_width / 2, .y = iso->tile_height / 2}; |
578 | const ivec2 so = | 577 | const ivec2 so = |
@@ -606,3 +605,23 @@ const Pixel* isogfx_get_screen_buffer(const IsoGfx* iso) { | |||
606 | assert(iso); | 605 | assert(iso); |
607 | return iso->screen; | 606 | return iso->screen; |
608 | } | 607 | } |
608 | |||
609 | void isogfx_pick_tile( | ||
610 | const IsoGfx* iso, double xcart, double ycart, int* xiso, int* yiso) { | ||
611 | assert(iso); | ||
612 | assert(xiso); | ||
613 | assert(yiso); | ||
614 | |||
615 | const vec2 xy_iso = cart2iso( | ||
616 | (vec2){.x = xcart, .y = ycart}, iso->tile_width, iso->tile_height, | ||
617 | iso->screen_width); | ||
618 | |||
619 | if ((0 <= xy_iso.x) && (xy_iso.x < iso->world_width) && (0 <= xy_iso.y) && | ||
620 | (xy_iso.y < iso->world_height)) { | ||
621 | *xiso = (int)xy_iso.x; | ||
622 | *yiso = (int)xy_iso.y; | ||
623 | } else { | ||
624 | *xiso = -1; | ||
625 | *yiso = -1; | ||
626 | } | ||
627 | } | ||