diff --git a/src/level.c b/src/level.c index 3e910a2..13f910a 100644 --- a/src/level.c +++ b/src/level.c @@ -4,6 +4,8 @@ #include "level.h" #include "camera.h" +#define VEC_PRECISE_HALF_DISP (Vec){DWIDTH * VEC_PRECISION / 2, DHEIGHT * VEC_PRECISION / 2} + void level_step(const Level *level) { } @@ -16,9 +18,20 @@ void level_draw(const Level *level, Camera *camera) void layer_draw(const Level *level, Camera *camera, uint layer_id) { const uint8_t *layer = level->layers[layer_id]; - for (int y = 0; y < level->height; ++y) + Vec display_tl, display_br; + vec_cpy(&display_tl, camera->pos); + vec_cpy(&display_br, display_tl); + vec_sub(&display_tl, VEC_PRECISE_HALF_DISP); + vec_add(&display_br, VEC_PRECISE_HALF_DISP); + vec_div(&display_tl, VEC_PRECISION * TILE_SIZE); + vec_div(&display_br, VEC_PRECISION * TILE_SIZE); + int start_x = (display_tl.x > 0) ? display_tl.x : 0; + int start_y = (display_tl.y > 0) ? display_tl.y : 0; + int end_x = (display_br.x < level->width) ? display_br.x + 1 : level->width; + int end_y = (display_br.y < level->height) ? display_br.y + 1 : level->height; + for (int y = start_y; y < end_y; ++y) { - for (int x = 0; x < level->width; ++x) + for (int x = start_x; x < end_x; ++x) { const uint8_t cell = layer[x + y * level->width]; #ifdef FX9860G