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); }
//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); } }
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); } }
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]; } }
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; } }
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); } }
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); }
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); } }
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); }
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); }
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(); } } }