TileTopBlockIterator::TileTopBlockIterator(const TilePos& tile, int block_size, int tile_width) : block_size(block_size), is_end(false) { // at first get the chunk, whose row and column is at the top right of the tile mc::ChunkPos topright_chunk = mc::ChunkPos::byRowCol(4 * tile_width * tile.getY(), 2 * tile_width * tile.getX() + 2); // now get the first visible block from this chunk in this tile top = mc::LocalBlockPos(8, 6, mc::CHUNK_HEIGHT * 16 - 1).toGlobalPos(topright_chunk); // and set this as start current = top; // calculate bounds of the tile min_row = top.getRow() + 1; max_row = top.getRow() + (64 * tile_width) + 4; max_col = top.getCol() + 2; min_col = max_col - (32 * tile_width); // calculate position of the first block, relative row/col in this tile are needed int row = current.getRow() - min_row; int col = current.getCol() - min_col; // every column is a 1/2 block and every row is a 1/4 block draw_x = col * block_size / 2; // -1/2 blocksize, because we would see the top side of the blocks in the tile if not draw_y = row * block_size / 4 - block_size / 2; // -16 }
void TopdownTileRenderer::renderTile(const TilePos& tile_pos, RGBAImage& tile) { int texture_size = images->getTextureSize(); tile.setSize(getTileSize(), getTileSize()); for (int x = 0; x < tile_width; x++) { for (int z = 0; z < tile_width; z++) { mc::ChunkPos chunkpos(tile_pos.getX() * tile_width + x, tile_pos.getY() * tile_width + z); current_chunk = world->getChunk(chunkpos); if (current_chunk != nullptr) renderChunk(*current_chunk, tile, texture_size*16*x, texture_size*16*z); } } }