diff --git a/renderer.c b/renderer.c index 7b85de2..ae749db 100644 --- a/renderer.c +++ b/renderer.c @@ -125,11 +125,6 @@ void renderer_handle() drmHandleEvent(drm_fd, &ev); } -void renderer_clear() -{ - memset(fbs[back].buf, 0, fbs[back].size); -} - void renderer_swap() { const int err = drmModePageFlip( @@ -141,6 +136,29 @@ void renderer_swap() back = (back + 1) & 1; } +void renderer_clear() +{ + memset(fbs[back].buf, 0, fbs[back].size); +} + +void renderer_clear_rect(vec2_t centre, vec2_t size) +{ + const vec2_t tl_world = { centre.x - size.x / 2, centre.y + size.y / 2 }; + const vec2_t br_world = { centre.x + size.x / 2, centre.y - size.y / 2 }; + const vec3_t tl = mat3_mul_vec3(view, vec2_extend(tl_world)); + const vec3_t br = mat3_mul_vec3(view, vec2_extend(br_world)); + + const unsigned width = (unsigned)roundf(br.x / br.z - tl.x / tl.z); + const unsigned x1 = (unsigned)roundf(tl.x / tl.z); + const unsigned y1 = (unsigned)roundf(tl.y / tl.z); + const unsigned y2 = (unsigned)roundf(br.y / br.z); + + for (unsigned y = y1; y < y2; ++y) { + uint32_t *row = fbs[back].buf + y * (fbs[back].pitch / 4) + x1; + memset(row, 0, width * sizeof(uint32_t)); + } +} + void renderer_draw( const vec2_t *vs, unsigned count, mat3_t model, bool connect) { diff --git a/renderer.h b/renderer.h index 967bea9..758bbb5 100644 --- a/renderer.h +++ b/renderer.h @@ -16,9 +16,11 @@ renderer_params_t renderer_init(); void renderer_cleanup(); void renderer_handle(); -void renderer_clear(); void renderer_swap(); +void renderer_clear(); +void renderer_clear_rect(vec2_t centre, vec2_t size); + void renderer_draw( const vec2_t *vs, unsigned count, mat3_t model, bool connect);