summaryrefslogtreecommitdiff
path: root/src/gfx2d.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gfx2d.c')
-rw-r--r--src/gfx2d.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/gfx2d.c b/src/gfx2d.c
index 8d78c2b..e79dd3e 100644
--- a/src/gfx2d.c
+++ b/src/gfx2d.c
@@ -79,6 +79,10 @@ static inline ivec2 ivec2_add(ivec2 a, ivec2 b) {
79 return (ivec2){.x = a.x + b.x, .y = a.y + b.y}; 79 return (ivec2){.x = a.x + b.x, .y = a.y + b.y};
80} 80}
81 81
82static inline ivec2 ivec2_mul(ivec2 a, ivec2 b) {
83 return (ivec2){.x = a.x * b.x, .y = a.y * b.y};
84}
85
82static inline ivec2 ivec2_scale(ivec2 a, int s) { 86static inline ivec2 ivec2_scale(ivec2 a, int s) {
83 return (ivec2){.x = a.x * s, .y = a.y * s}; 87 return (ivec2){.x = a.x * s, .y = a.y * s};
84} 88}
@@ -91,12 +95,14 @@ static inline vec2 vec2_add(vec2 a, vec2 b) {
91 95
92static inline vec2 ivec2_to_vec2(ivec2 a) { return (vec2){a.x, a.y}; } 96static inline vec2 ivec2_to_vec2(ivec2 a) { return (vec2){a.x, a.y}; }
93 97
94/// Map map coordinates to screen coordinates, both Cartesian. 98/// Map ortho coordinates to screen coordinates.
95static ivec2 map2screen( 99///
100/// Camera coordinates are in pixels. Map coordinates are in tiles.
101static ivec2 ortho2screen(
96 ivec2 camera, int tile_width, int tile_height, int map_x, int map_y) { 102 ivec2 camera, int tile_width, int tile_height, int map_x, int map_y) {
97 return ivec2_add( 103 return ivec2_add(
98 ivec2_neg(camera), 104 ivec2_neg(camera),
99 (ivec2){.x = map_x * tile_width, .y = map_y * tile_height}); 105 ivec2_mul((ivec2){map_x, map_y}, (ivec2){tile_width, tile_height}));
100} 106}
101 107
102// Not actually used because we pre-compute the two axis vectors instead. 108// Not actually used because we pre-compute the two axis vectors instead.
@@ -603,7 +609,7 @@ static void draw_tile_ortho(Gfx2d* gfx, Tile tile, int x, int y) {
603 const Ts_Tile* pTile = ts_tileset_get_tile(gfx->tileset, tile); 609 const Ts_Tile* pTile = ts_tileset_get_tile(gfx->tileset, tile);
604 const Pixel* pixels = ts_tileset_get_tile_pixels(gfx->tileset, tile); 610 const Pixel* pixels = ts_tileset_get_tile_pixels(gfx->tileset, tile);
605 611
606 const ivec2 screen_origin = map2screen( 612 const ivec2 screen_origin = ortho2screen(
607 gfx->camera, gfx->map->base_tile_width, gfx->map->base_tile_height, x, y); 613 gfx->camera, gfx->map->base_tile_width, gfx->map->base_tile_height, x, y);
608 614
609 draw_rect( 615 draw_rect(
@@ -645,12 +651,16 @@ static void draw_map_ortho(Gfx2d* gfx) {
645 assert(gfx); 651 assert(gfx);
646 assert(gfx->map); 652 assert(gfx->map);
647 653
648 // TODO: Same TODOs as in draw_map_iso(). 654 // TODO: Handle multiple layers.
649
650 const Tm_Layer* layer = tm_map_get_layer(gfx->map, 0); 655 const Tm_Layer* layer = tm_map_get_layer(gfx->map, 0);
651 656
652 for (int wy = 0; wy < gfx->map->world_height; ++wy) { 657 // TODO: This currently renders with tile granularity. Do so instead in terms
653 for (int wx = 0; wx < gfx->map->world_width; ++wx) { 658 // of pixels for more accurate camera panning. The camera coordinates are
659 // already given in pixels.
660 for (int wy = gfx->camera.y / gfx->map->base_tile_height;
661 wy < gfx->map->world_height; ++wy) {
662 for (int wx = gfx->camera.x / gfx->map->base_tile_width;
663 wx < gfx->map->world_width; ++wx) {
654 const Tile tile = tm_layer_get_tile(gfx->map, layer, wx, wy); 664 const Tile tile = tm_layer_get_tile(gfx->map, layer, wx, wy);
655 draw_tile_ortho(gfx, tile, wx, wy); 665 draw_tile_ortho(gfx, tile, wx, wy);
656 } 666 }
@@ -711,7 +721,7 @@ static void draw_sprite_ortho(
711 // Apply an offset similarly to how we offset tiles. The sprite is offset by 721 // Apply an offset similarly to how we offset tiles. The sprite is offset by
712 // -base_tile_width/2 along the x-axis to align the sprite with the leftmost 722 // -base_tile_width/2 along the x-axis to align the sprite with the leftmost
713 // edge of the tile it is on. 723 // edge of the tile it is on.
714 const ivec2 screen_origin = map2screen( 724 const ivec2 screen_origin = ortho2screen(
715 gfx->camera, gfx->map->base_tile_width, gfx->map->base_tile_height, 725 gfx->camera, gfx->map->base_tile_width, gfx->map->base_tile_height,
716 sprite->position.x, sprite->position.y); 726 sprite->position.x, sprite->position.y);
717 727