Esempio n. 1
0
 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);
                 }
             }
         }
     }
 }
Esempio n. 2
0
 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();
 }
Esempio n. 3
0
        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]);
        }
Esempio n. 4
0
 internal void SetBlock(Blockset.Block block)
 {
     _block = block;
     UpdateBitmap();
 }
Esempio n. 5
0
        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);
                    }
                }
            }
        }