internal static unsafe void UpdateBitmap(WriteableBitmap bitmap, Blockset.Block block, byte eLayerNum, byte subLayerNum) { using (ILockedFramebuffer l = bitmap.Lock()) { uint *bmpAddress = (uint *)l.Address.ToPointer(); for (int y = 0; y < Overworld.Block_NumTilesY; y++) { int py = y * Overworld.Tile_NumPixelsY; for (int x = 0; x < Overworld.Block_NumTilesX; x++) { int px = x * Overworld.Tile_NumPixelsX; Blockset.Block.Tile t = GetTile(block, eLayerNum, subLayerNum, x, y); if (t != null) { RenderUtils.TransparencyGrid(bmpAddress, Overworld.Block_NumPixelsX, Overworld.Block_NumPixelsY, px, py, Overworld.Tile_NumPixelsX / 2, Overworld.Tile_NumPixelsY / 2, Overworld.Block_NumTilesX, Overworld.Block_NumTilesY); t.Draw(bmpAddress, Overworld.Block_NumPixelsX, Overworld.Block_NumPixelsY, px, py); } else { RenderUtils.ClearUnchecked(bmpAddress, Overworld.Block_NumPixelsX, px, py, Overworld.Tile_NumPixelsX, Overworld.Tile_NumPixelsY); } } } } }
internal SubLayerModel(Blockset.Block block, byte eLayerNum, byte subLayerNum) { _block = block; _eLayerNum = eLayerNum; _subLayerNum = subLayerNum; Text = $"Sub-Layer {_subLayerNum:X2}"; Bitmap = new WriteableBitmap(new PixelSize(Overworld.Block_NumPixelsX, Overworld.Block_NumPixelsY), new Vector(96, 96), PixelFormat.Bgra8888); UpdateBitmap(); }
internal static Blockset.Block.Tile GetTile(Blockset.Block block, byte eLayerNum, byte subLayerNum, int x, int y) { List <Blockset.Block.Tile> layers = block.Tiles[y][x][eLayerNum]; return(layers.Count <= subLayerNum ? null : layers[subLayerNum]); }
internal void SetBlock(Blockset.Block block) { _block = block; UpdateBitmap(); }
public static unsafe void Render(uint *bmpAddress, int bmpWidth, int bmpHeight) { // Gather variables we need to draw everything at the right coordinates CameraObj camera = Camera; Position cameraPos = camera.Pos; int cameraPixelX = (cameraPos.X * Overworld.Block_NumPixelsX) - (bmpWidth / 2) + (Overworld.Block_NumPixelsX / 2) + camera._progressX + CameraOfsX; int cameraPixelY = (cameraPos.Y * Overworld.Block_NumPixelsY) - (bmpHeight / 2) + (Overworld.Block_NumPixelsY / 2) + camera._progressY + CameraOfsY; Map cameraMap = camera.Map; List <Obj> objs = cameraMap.Objs; int numObjs = objs.Count; int xpBX = cameraPixelX % Overworld.Block_NumPixelsX; int ypBY = cameraPixelY % Overworld.Block_NumPixelsY; int startBlockX = (cameraPixelX / Overworld.Block_NumPixelsX) - (xpBX >= 0 ? 0 : 1); int startBlockY = (cameraPixelY / Overworld.Block_NumPixelsY) - (ypBY >= 0 ? 0 : 1); int numBlocksX = (bmpWidth / Overworld.Block_NumPixelsX) + (bmpWidth % Overworld.Block_NumPixelsX == 0 ? 0 : 1); int numBlocksY = (bmpHeight / Overworld.Block_NumPixelsY) + (bmpHeight % Overworld.Block_NumPixelsY == 0 ? 0 : 1); int endBlockX = startBlockX + numBlocksX + (xpBX == 0 ? 0 : 1); int endBlockY = startBlockY + numBlocksY + (ypBY == 0 ? 0 : 1); int startPixelX = xpBX >= 0 ? -xpBX : -xpBX - Overworld.Block_NumPixelsX; int startPixelY = ypBY >= 0 ? -ypBY : -ypBY - Overworld.Block_NumPixelsY; // Loop each elevation for (byte e = 0; e < Overworld.NumElevations; e++) { // Draw blocks int curPixelX = startPixelX; int curPixelY = startPixelY; for (int blockY = startBlockY; blockY < endBlockY; blockY++) { for (int blockX = startBlockX; blockX < endBlockX; blockX++) { Map.Layout.Block block = cameraMap.GetBlock_CrossMap(blockX, blockY, out _); if (block != null) { Blockset.Block b = block.BlocksetBlock; void Draw(Blockset.Block.Tile[] subLayers, int tx, int ty) { int numSubLayers = subLayers.Length; for (int t = 0; t < numSubLayers; t++) { Blockset.Block.Tile tile = subLayers[t]; Tileset.Tile ttile = tile.TilesetTile; RenderUtils.DrawBitmap(bmpAddress, bmpWidth, bmpHeight, tx, ty, ttile.AnimBitmap ?? ttile.Bitmap, Overworld.Tile_NumPixelsX, Overworld.Tile_NumPixelsY, xFlip: tile.XFlip, yFlip: tile.YFlip); } } for (int by = 0; by < Overworld.Block_NumTilesY; by++) { Blockset.Block.Tile[][][] arrY = b.Tiles[by]; int ty = curPixelY + (by * Overworld.Tile_NumPixelsY); for (int bx = 0; bx < Overworld.Block_NumTilesX; bx++) { Draw(arrY[bx][e], curPixelX + (bx * Overworld.Tile_NumPixelsX), ty); } } } curPixelX += Overworld.Block_NumPixelsX; } curPixelX = startPixelX; curPixelY += Overworld.Block_NumPixelsY; } // Draw VisualObjs // TODO: They will overlap each other regardless of y coordinate because of the order of the list // TODO: Objs from other maps for (int i = 0; i < numObjs; i++) { Obj o = objs[i]; if (o.Pos.Elevation == e && o is VisualObj v) { v.Draw(bmpAddress, bmpWidth, bmpHeight, startBlockX, startBlockY, startPixelX, startPixelY); } } } }