aboutsummaryrefslogtreecommitdiffstats
path: root/src/renderer_m0.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-04-23 15:48:59 +0200
committerBad Diode <bd@badd10de.dev>2023-04-23 15:48:59 +0200
commitff6e784e7c5ebe223666c6c631305397ad358289 (patch)
tree0f87823d48366a6beb8d36d7eea5dc33663d7abd /src/renderer_m0.c
parentdeb9c48fbd3dc5854de4ae3a04dc999029c10ae0 (diff)
downloadstepper-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.c78
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
618IWRAM_CODE
619void
620draw_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//