diff options
author | Bad Diode <bd@badd10de.dev> | 2023-04-23 15:48:59 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-04-23 15:48:59 +0200 |
commit | ff6e784e7c5ebe223666c6c631305397ad358289 (patch) | |
tree | 0f87823d48366a6beb8d36d7eea5dc33663d7abd /src/renderer_m0.c | |
parent | deb9c48fbd3dc5854de4ae3a04dc999029c10ae0 (diff) | |
download | stepper-ff6e784e7c5ebe223666c6c631305397ad358289.tar.gz stepper-ff6e784e7c5ebe223666c6c631305397ad358289.zip |
Start decoupling of rendering from update passes
Diffstat (limited to 'src/renderer_m0.c')
-rw-r--r-- | src/renderer_m0.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/renderer_m0.c b/src/renderer_m0.c index 8bd4263..00874ea 100644 --- a/src/renderer_m0.c +++ b/src/renderer_m0.c | |||
@@ -615,6 +615,84 @@ draw_icn(size_t x, size_t y, u8 *sprite, u8 clr, u8 flip_x, u8 flip_y) { | |||
615 | dirty_tiles[tile_y] |= dirty; | 615 | dirty_tiles[tile_y] |= dirty; |
616 | } | 616 | } |
617 | 617 | ||
618 | IWRAM_CODE | ||
619 | void | ||
620 | draw_tile(size_t x, size_t y, Tile *tile, u8 clr) { | ||
621 | BOUNDCHECK_SCREEN(x, y); | ||
622 | size_t tile_x0 = x / 8; | ||
623 | size_t tile_x1 = (x + 7) / 8; | ||
624 | size_t tile_y = y / 8; | ||
625 | size_t start_col = x % 8; | ||
626 | size_t start_row = y % 8; | ||
627 | size_t shift_left = start_col * 4; | ||
628 | size_t shift_right = (8 - start_col) * 4; | ||
629 | u32 dirty = (1 << tile_x0) | (1 << tile_x1); | ||
630 | u32 *dst = &backbuf[start_row + (tile_x0 + tile_y * 32) * 8]; | ||
631 | // BOUNDCHECK_SCREEN(x, y); | ||
632 | |||
633 | // // Find row position for the given x/y coordinates. | ||
634 | // size_t tile_x = x / 8; | ||
635 | // size_t tile_y = y / 8; | ||
636 | // size_t start_col = x % 8; | ||
637 | // size_t start_row = y % 8; | ||
638 | |||
639 | // // Get a pointer to the backbuffer and the tile row. | ||
640 | // size_t pos = start_row + (tile_x + tile_y * 32) * 8; | ||
641 | // u32 *backbuffer = &BACKBUF[pos]; | ||
642 | u32 *row = tile; | ||
643 | u32 row_mask_left = 0xFFFFFFFF << shift_left; | ||
644 | u32 row_mask_right = 0xFFFFFFFF >> shift_right; | ||
645 | |||
646 | // Draw the tiles. There are 4 possible cases: | ||
647 | // 1. The tile is exactly at the tile boundary. | ||
648 | // 2. The tile spans 2 tiles horizontally. | ||
649 | // 3. The tile spans 2 tiles vertically. | ||
650 | // 4. The tile spans 4 tiles. | ||
651 | if (start_col == 0 && start_row == 0) { | ||
652 | for (size_t i = 0; i < (8 - start_row); i++, dst++) { | ||
653 | BOUNDCHECK_SCREEN(x, y + i); | ||
654 | dst[0] = (dst[0] & ~row_mask_left) | row[i] * clr; | ||
655 | } | ||
656 | dirty_tiles[tile_y] |= 1 << tile_x0; | ||
657 | } else if (start_row == 0) { | ||
658 | for (size_t i = 0; i < 8; i++, dst++) { | ||
659 | BOUNDCHECK_SCREEN(x, y + i); | ||
660 | dst[0] = (dst[0] & ~row_mask_left) | (row[i] * clr << shift_left); | ||
661 | dst[8] = (dst[8] & ~row_mask_right) | (row[i] * clr >> shift_right); | ||
662 | } | ||
663 | dirty_tiles[tile_y] |= 1 << tile_x0; | ||
664 | dirty_tiles[tile_y] |= 1 << (tile_x0 + 1); | ||
665 | } else if (start_col == 0) { | ||
666 | for (size_t i = 0; i < (8 - start_row); i++, dst++) { | ||
667 | BOUNDCHECK_SCREEN(x, y + i); | ||
668 | dst[0] = (dst[0] & ~row_mask_left) | row[i] * clr; | ||
669 | } | ||
670 | dst += 8 * 31; | ||
671 | for (size_t i = (8 - start_row); i < 8; i++, dst++) { | ||
672 | BOUNDCHECK_SCREEN(x, y + i); | ||
673 | dst[0] = (dst[0] & ~row_mask_left) | row[i] * clr; | ||
674 | } | ||
675 | dirty_tiles[tile_y] |= 1 << tile_x0; | ||
676 | dirty_tiles[tile_y + 1] |= 1 << tile_x0; | ||
677 | } else { | ||
678 | for (size_t i = 0; i < (8 - start_row); i++, dst++) { | ||
679 | BOUNDCHECK_SCREEN(x, y + i); | ||
680 | dst[0] = (dst[0] & ~row_mask_left) | (row[i] * clr << shift_left); | ||
681 | dst[8] = (dst[8] & ~row_mask_right) | (row[i] * clr >> shift_right); | ||
682 | } | ||
683 | dst += 8 * 31; | ||
684 | for (size_t i = (8 - start_row); i < 8; i++, dst++) { | ||
685 | BOUNDCHECK_SCREEN(x, y + i); | ||
686 | dst[0] = (dst[0] & ~row_mask_left) | (row[i] * clr << shift_left); | ||
687 | dst[8] = (dst[8] & ~row_mask_right) | (row[i] * clr >> shift_right); | ||
688 | } | ||
689 | dirty_tiles[tile_y] |= 1 << tile_x0; | ||
690 | dirty_tiles[tile_y] |= 1 << (tile_x0 + 1); | ||
691 | dirty_tiles[tile_y + 1] |= 1 << tile_x0; | ||
692 | dirty_tiles[tile_y + 1] |= 1 << (tile_x0 + 1); | ||
693 | } | ||
694 | } | ||
695 | |||
618 | // | 696 | // |
619 | // Flipping buffers/copying memory. | 697 | // Flipping buffers/copying memory. |
620 | // | 698 | // |