Esempio n. 1
0
        public bool DrawBegin(Vector2 position, Windows.UI.Input.PointerPoint pointerPoint, out List <Vector2Int> _coveredTiles, out TileRect _tileRect)
        {
            _coveredTiles = null;
            _tileRect     = new TileRect();
            if (CurrentLayout == null || currentBrush == null)
            {
                return(false);
            }
            //PaintingTexture.CopyTo(PaintingTextureBackup);
            UpdateBrushPropertyButDontUpload();
            UpdateBrushData(position, pointerPoint);
            brushData.FillPointerData();
            brushDataBuffer.UpdateResource(brushData);
            CurrentLayout.saved = false;
            List <Vector2Int> tilesCovered = GetPaintingTiles(position, position, out TileRect coveredRect);

            if (tilesCovered.Count != 0)
            {
                ComputeBrush(currentBrush.cBegin, tilesCovered);
                _coveredTiles = tilesCovered;
                _tileRect     = coveredRect;
            }
            drawPrevPos = position;
            return(true);
        }
Esempio n. 2
0
        //private TiledTexture(DeviceResources deviceResources, int _tilesCount)
        //{
        //    this.deviceResources = deviceResources;
        //    cd16 = (_tilesCount + 15) / 16;
        //    tilesCount = _tilesCount;
        //}

        public TiledTexture(DeviceResources deviceResources, byte[] data, byte[] offsetsData)
        {
            this.deviceResources = deviceResources;
            tilesCount           = offsetsData.Length / 8;
            TilesList            = new List <Vector2Int>(tilesCount);
            if (tilesCount == 0)
            {
                return;
            }
            for (int i = 0; i < tilesCount; i++)
            {
                Vector2Int vector2 = new Vector2Int()
                {
                    x = System.BitConverter.ToInt32(offsetsData, i * 8),
                    y = System.BitConverter.ToInt32(offsetsData, i * 8 + 4)
                };
                TilesList.Add(vector2);
            }
            BlocksData        = new ComputeBuffer(deviceResources, tilesCount, 1024, data);
            BlocksOffsetsData = new ComputeBuffer(deviceResources, tilesCount, 8, offsetsData);
            tileRect          = new TileRect(TilesList);
            TilesStatus       = new TileIndexCollection(tileRect);
            for (int i = 0; i < TilesList.Count; i++)
            {
                TilesStatus.Add(TilesList[i], i);
            }
        }
Esempio n. 3
0
        public TiledTexture(TiledTexture tiledTexture, List <Vector2Int> tiles)
        {
            deviceResources = tiledTexture.deviceResources;
            tilesCount      = tiles.Count;
            TilesList       = new List <Vector2Int>(tiles);
            List <int> indexs = new List <int>();

            if (tilesCount == 0)
            {
                return;
            }
            //for (int i = 0; i < tilesCount; i++)
            //{
            //    TilesStatus.Add(TilesList[i], i);
            //}

            for (int i = 0; i < tilesCount; i++)
            {
                //if (tiledTexture.TilesStatus.TryGetValue(tiles[i], out int tIndex))
                //{
                //    indexs.Add(tIndex);
                //}
                //else
                //{
                //    indexs.Add(magicNumber);
                //}
                int tIndex = tiledTexture.TilesStatus[tiles[i]];
                if (tIndex != -1)
                {
                    indexs.Add(tIndex);
                }
                else
                {
                    indexs.Add(magicNumber);
                }
            }
            BlocksOffsetsData = new ComputeBuffer(deviceResources, tilesCount, 8, tiles.ToArray());
            BlocksData        = new ComputeBuffer(deviceResources, tilesCount, 1024);
            if (tiledTexture.BlocksData != null)
            {
                ComputeBuffer indicates = new ComputeBuffer(deviceResources, tilesCount, 4, indexs.ToArray());
                TTPartCopy.SetBuffer(tiledTexture.BlocksData, 0);
                TTPartCopy.SetBuffer(indicates, 1);
                TTPartCopy.SetUAVBuffer(BlocksData, 0);

                TTPartCopy.Dispatch(1, 1, tilesCount);
                indicates.Dispose();
            }
            tileRect    = new TileRect(TilesList);
            TilesStatus = new TileIndexCollection(tileRect);
            for (int i = 0; i < TilesList.Count; i++)
            {
                TilesStatus.Add(TilesList[i], i);
            }
        }
Esempio n. 4
0
 public TileIndexCollection(TileIndexCollection collection)
 {
     rect     = collection.rect;
     stride   = collection.stride;
     capacity = collection.capacity;
     _texture = new int[capacity];
     for (int i = 0; i < capacity; i++)
     {
         _texture[i] = collection._texture[i];
     }
 }
Esempio n. 5
0
 public TileIndexCollection(TileRect rect)
 {
     this.rect = rect;
     stride    = (rect.maxX - rect.minX) / 8 + 1;
     capacity  = stride * ((rect.maxY - rect.minY + 8) / 8);
     _texture  = new int[capacity];
     for (int i = 0; i < capacity; i++)
     {
         _texture[i] = -1;
     }
 }
Esempio n. 6
0
        public TiledTexture(RenderTexture tex)
        {
            deviceResources = tex.GetDeviceResources();
            int width    = tex.GetWidth();
            int height   = tex.GetHeight();
            int x        = (width + 31) / 32;
            int y        = (height + 31) / 32;
            int x2       = (width + 7) / 8;
            int y2       = (height + 7) / 8;
            int tilesmax = x2 * y2;

            int[]         oData   = new int[tilesmax];
            ComputeBuffer tResult = new ComputeBuffer(deviceResources, tilesmax, 4);

            TextureEmptyTest.SetTexture(tex, 0);
            TextureEmptyTest.SetUAVBuffer(tResult, 0);
            TextureEmptyTest.Dispatch(x2, y2, 1);
            tResult.GetData(oData);
            tResult.Dispose();
            TilesList = new List <Vector2Int>();
            for (int i = 0; i < tilesmax; i++)
            {
                if (oData[i] != 0)
                {
                    Vector2Int a = new Vector2Int()
                    {
                        x = (i % x2) * 8, y = (i / x2) * 8
                    };
                    TilesList.Add(a);
                }
            }
            tilesCount = TilesList.Count;
            if (tilesCount == 0)
            {
                return;
            }

            BlocksData = new ComputeBuffer(tex.GetDeviceResources(), tilesCount, 1024);

            BlocksOffsetsData = new ComputeBuffer(tex.GetDeviceResources(), tilesCount, 8, TilesList.ToArray());

            Texture2TT.SetTexture(tex, 0);
            Texture2TT.SetBuffer(BlocksOffsetsData, 1);
            Texture2TT.SetUAVBuffer(BlocksData, 0);
            Texture2TT.Dispatch(1, 1, tilesCount);
            tileRect    = new TileRect(TilesList);
            TilesStatus = new TileIndexCollection(tileRect);
            for (int i = 0; i < TilesList.Count; i++)
            {
                TilesStatus.Add(TilesList[i], i);
            }
        }
Esempio n. 7
0
        public bool HaveIntersections(TileRect other)
        {
            int dMaxX = maxX < other.maxX ? maxX : other.maxX;
            int dMaxY = maxY < other.maxY ? maxY : other.maxY;
            int dMinX = minX > other.minX ? minX : other.minX;
            int dMinY = minY > other.minY ? minY : other.minY;

            if (dMinX > dMaxX || dMinY > dMaxY)
            {
                return(false);
            }
            return(true);
        }
Esempio n. 8
0
        public TiledTexture(RenderTexture tex, List <Vector2Int> tiles)
        {
            deviceResources   = tex.GetDeviceResources();
            tilesCount        = tiles.Count;
            BlocksData        = new ComputeBuffer(deviceResources, tilesCount, 1024);
            BlocksOffsetsData = new ComputeBuffer(deviceResources, tilesCount, 8, tiles.ToArray());
            Texture2TT.SetTexture(tex, 0);
            Texture2TT.SetBuffer(BlocksOffsetsData, 1);
            Texture2TT.SetUAVBuffer(BlocksData, 0);
            Texture2TT.Dispatch(1, 1, tilesCount);

            TilesList   = new List <Vector2Int>(tiles);
            tileRect    = new TileRect(TilesList);
            TilesStatus = new TileIndexCollection(tileRect);
            for (int i = 0; i < TilesList.Count; i++)
            {
                TilesStatus.Add(TilesList[i], i);
            }
        }
Esempio n. 9
0
        public bool Draw(Vector2 position, Windows.UI.Input.PointerPoint pointerPoint, out List <Vector2Int> _coveredTiles, out TileRect _tileRect)
        {
            _coveredTiles = null;
            _tileRect     = new TileRect();
            if (CurrentLayout == null || currentBrush == null)
            {
                return(false);
            }
            UpdateBrushData(position, pointerPoint);
            List <Vector2Int> tilesCovered = GetPaintingTiles(drawPrevPos, position, out TileRect coveredRect);

            if (tilesCovered.Count != 0)
            {
                ComputeBrush(currentBrush.cDoing, tilesCovered);
                _coveredTiles = tilesCovered;
                _tileRect     = coveredRect;
            }
            drawPrevPos = position;
            return(true);
        }
Esempio n. 10
0
        public bool DrawEnd(Vector2 position, Windows.UI.Input.PointerPoint pointerPoint, out List <Vector2Int> _coveredTiles, out TileRect _tileRect)
        {
            _coveredTiles = null;
            _tileRect     = new TileRect();
            if (CurrentLayout == null || currentBrush == null)
            {
                return(false);
            }
            UpdateBrushData(position, pointerPoint);
            List <Vector2Int> tilesCovered = GetPaintingTiles(drawPrevPos, position, out TileRect coveredRect);

            if (tilesCovered.Count != 0)
            {
                ComputeBrush(currentBrush.cEnd, tilesCovered);
                _coveredTiles = tilesCovered;
                _tileRect     = coveredRect;
            }
            #region generateUndoData
            List <Vector2Int> paintCoveredTiles = new List <Vector2Int>();
            for (int i = 0; i < _mapForUndoCount; i++)
            {
                if (mapForUndo[i])
                {
                    paintCoveredTiles.Add(new Vector2Int()
                    {
                        x = (i % _mapForUndoStride) * 8, y = (i / _mapForUndoStride) * 8
                    });
                }
            }
            if (paintCoveredTiles.Count != 0)
            {
                UndoManager.AddUndoData(new Undo.CMD_TileReplace(CurrentLayout, new TiledTexture(PaintingTextureBackup, paintCoveredTiles), CanvasCase));
            }
            mapForUndo.SetAll(false);
            #endregion
            drawPrevPos = Vector2.Zero;
            PaintingTexture.CopyTo(PaintingTextureBackup);
            return(true);
        }
Esempio n. 11
0
 public void RenderPart(List <Vector2Int> part, TileRect filterRect)
 {
     if (part == null || part.Count == 0)
     {
         return;
     }
     PrepareRenderData();
     for (int i = 0; i < RenderTarget.Count; i++)
     {
         //清除部分
         int           partCount        = part.Count;
         ComputeShader texturePartClear = TiledTexture.TexturePartClear;
         ComputeBuffer buf = new ComputeBuffer(RenderTarget[0].GetDeviceResources(), partCount, 8, part.ToArray());
         texturePartClear.SetBuffer(buf, 0);
         texturePartClear.SetUAVTexture(RenderTarget[i], 0);
         texturePartClear.Dispatch(1, 1, partCount / 16 + (partCount % 16 > 0 ? 1 : 0));
         buf.Dispose();
     }
     for (int i = ManagedLayout.Count - 1; i >= 0; i--)
     {
         PictureLayout selectedLayout = ManagedLayout[i];
         if (LayoutsHiddenData[i] == true)
         {
             continue;
         }
         if (selectedLayout is StandardLayout standardLayout)
         {
             if (standardLayout.RenderBufferNum >= 0 && standardLayout.RenderBufferNum < RenderTarget.Count)
             {
                 RenderTexture[] refs = new RenderTexture[Core.BlendMode.c_refCount];
                 if (standardLayout.RefBufferNum >= 0 && standardLayout.RefBufferNum < RenderTarget.Count)
                 {
                     refs[0] = RenderTarget[standardLayout.RefBufferNum];
                 }
                 if (standardLayout.RenderBufferNum >= 0 && standardLayout.RenderBufferNum < RenderTarget.Count)
                 {
                     if (standardLayout.activated)
                     {
                         standardLayout.BlendMode?.Blend(PaintingTexture, RenderTarget[standardLayout.RenderBufferNum], part, refs, RenderDataCaches[i]);
                     }
                     else if (standardLayout.tiledTexture != null && standardLayout.tiledTexture.tileRect.HaveIntersections(filterRect))
                     {
                         standardLayout.BlendMode?.Blend(standardLayout.tiledTexture, RenderTarget[standardLayout.RenderBufferNum], part, refs, RenderDataCaches[i]);
                     }
                 }
             }
         }
         else if (selectedLayout is PureLayout pureLayout)
         {
             if (!pureLayout.colorUpdated)
             {
                 pureLayout.UpdateColor();
             }
             RenderTexture[] refs = new RenderTexture[Core.BlendMode.c_refCount];
             if (pureLayout.RefBufferNum >= 0 && pureLayout.RefBufferNum < RenderTarget.Count)
             {
                 refs[0] = RenderTarget[pureLayout.RefBufferNum];
             }
             if (pureLayout.RenderBufferNum >= 0 && pureLayout.RenderBufferNum < RenderTarget.Count)
             {
                 pureLayout.BlendMode?.Blend(RenderTarget[pureLayout.RenderBufferNum], part, refs, pureLayout.colorBuffer, RenderDataCaches[i]);
             }
         }
         else
         {
             throw new System.NotImplementedException();
         }
     }
 }