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); } } } } }
protected override void OnPointerReleased(PointerReleasedEventArgs e) { if (_isDrawing || _isSelecting) { PointerPoint pp = e.GetCurrentPoint(this); switch (pp.Properties.PointerUpdateKind) { case PointerUpdateKind.LeftButtonReleased: { _isDrawing = false; e.Handled = true; break; } case PointerUpdateKind.RightButtonReleased: { _isSelecting = false; int startX = _selection.X; int startY = _selection.Y; int width = _selection.Width; int height = _selection.Height; bool changed = false; for (int y = 0; y < Overworld.Block_NumTilesY; y++) { Blockset.Block.Tile[] arrY = Clipboard[y]; for (int x = 0; x < Overworld.Block_NumTilesX; x++) { Blockset.Block.Tile t = arrY[x]; if (x < width && y < height) { Blockset.Block.Tile got = SubLayerModel.GetTile(_block, _eLayerNum, _subLayerNum, startX + x, startY + y); if (got != null) { if (!got.Equals(t)) { changed = true; got.CopyTo(t); } continue; } } if (t.TilesetTile != null) { changed = true; } t.TilesetTile = null; } } if (changed) { ClipboardChanged?.Invoke(this, EventArgs.Empty); } InvalidateVisual(); e.Handled = true; break; } } } }
private void SetTiles(int startX, int startY) { bool changed = false; void Set(List <Blockset.Block.Tile>[] dict, Blockset.Block.Tile st) { List <Blockset.Block.Tile> subLayers = dict[_eLayerNum]; if (subLayers.Count <= _subLayerNum) { changed = true; var t = new Blockset.Block.Tile(); st.CopyTo(t); subLayers.Add(t); } else { Blockset.Block.Tile t = subLayers[_subLayerNum]; if (!st.Equals(t)) { changed = true; st.CopyTo(t); } } } for (int y = 0; y < Overworld.Block_NumTilesY; y++) { int curY = startY + y; if (curY < Overworld.Block_NumTilesY) { Blockset.Block.Tile[] arrY = Clipboard[y]; for (int x = 0; x < Overworld.Block_NumTilesX; x++) { int curX = startX + x; if (curX < Overworld.Block_NumTilesX) { Blockset.Block.Tile st = arrY[x]; if (st.TilesetTile != null) { Set(_block.Tiles[curY][curX], st); } } } } } if (changed) { _block.Parent.FireChanged(_block); UpdateBitmap(); } }
public TileLayerImage(double scale) { _scale = scale; Clipboard = new Blockset.Block.Tile[Overworld.Block_NumTilesY][]; for (int y = 0; y < Overworld.Block_NumTilesY; y++) { var arrY = new Blockset.Block.Tile[Overworld.Block_NumTilesX]; for (int x = 0; x < Overworld.Block_NumTilesX; x++) { arrY[x] = new Blockset.Block.Tile(); } Clipboard[y] = arrY; } _selection = new Selection(Overworld.Block_NumTilesX, Overworld.Block_NumTilesY); _selection.Changed += OnSelectionChanged; _bitmap = new WriteableBitmap(new PixelSize(Overworld.Block_NumPixelsX, Overworld.Block_NumPixelsY), new Vector(96, 96), PixelFormat.Bgra8888); _bitmapSize = new Size(Overworld.Block_NumPixelsX, Overworld.Block_NumPixelsY); }
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); } } } }