[level.c] Optimization: only draw on-screen tiles

This commit is contained in:
KikooDX 2020-09-22 13:42:27 +02:00
parent 62cdb1ec7f
commit ee3e46cdf5
1 changed files with 15 additions and 2 deletions

View File

@ -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