public static void Find(byte[] alphaData, int alphaWidth, int alphaHeight) { if (D2dHelper.AlphaIsValid(alphaData, alphaWidth, alphaHeight) == false) { throw new System.ArgumentException("Invalid alpha"); } minX = 0; maxX = alphaWidth; minY = 0; maxY = alphaHeight; sizeX = alphaWidth; sizeY = alphaHeight; total = sizeX * sizeY; if (cells == null || cells.Length < total) { cells = new byte[total]; } DespawnTempIslands(); // Find all solid pixels for (var i = 0; i < total; i++) { cells[i] = alphaData[i] > 127 ? CELL_SOLID : CELL_EMPTY; } for (var i = 0; i < total; i++) { if (cells[i] == CELL_SOLID) { currentIsland = SpawnTempIsland(); BeginFloodFill(i, i % sizeX, i / sizeX); } } }
public static Island FindLocal(byte[] alphaData, int alphaWidth, int alphaHeight, D2dRect findRect) { if (D2dHelper.AlphaIsValid(alphaData, alphaWidth, alphaHeight) == false) { Debug.LogError("Alpha data invalid"); return(null); } var oldRect = new D2dRect(0, alphaWidth, 0, alphaHeight); var lapRect = D2dRect.CalculateOverlap(oldRect, findRect); if (lapRect.IsSet == false) { return(null); } minX = lapRect.MinX; maxX = lapRect.MaxX; minY = lapRect.MinY; maxY = lapRect.MaxY; sizeX = lapRect.SizeX; sizeY = lapRect.SizeY; total = sizeX * sizeY; spreadCount = 0; if (cells == null || cells.Length < total) { cells = new byte[total]; } DespawnTempIslands(); // Write solid or empty cells for (var y = minY; y < maxY; y++) { var c = (y - minY) * sizeX - minX; var d = y * alphaWidth; for (var x = minX; x < maxX; x++) { cells[c + x] = alphaData[d + x] > 127 ? CELL_SOLID : CELL_EMPTY; } } var borderIsland = default(Island); // Border coming from left? if (minX > 0) { for (var y = 0; y < sizeY; y++) { var i = y * sizeX; if (cells[i] == CELL_SOLID) { if (borderIsland == null) { borderIsland = currentIsland = SpawnTempIsland(false); } BeginFloodFill(i, i % sizeX, i / sizeX); } } } // Border coming from right? if (maxX < alphaWidth) { for (var y = 0; y < sizeY; y++) { var i = y * sizeX + sizeX - 1; if (cells[i] == CELL_SOLID) { if (borderIsland == null) { borderIsland = currentIsland = SpawnTempIsland(false); } BeginFloodFill(i, i % sizeX, i / sizeX); } } } // Border coming from bottom? if (minY > 0) { for (var x = 0; x < sizeX; x++) { var i = x; if (cells[i] == CELL_SOLID) { if (borderIsland == null) { borderIsland = currentIsland = SpawnTempIsland(false); } BeginFloodFill(i, i % sizeX, i / sizeX); } } } // Border coming from top? if (maxY < alphaHeight) { for (var x = 0; x < sizeX; x++) { var i = x + sizeX * (sizeY - 1); if (cells[i] == CELL_SOLID) { if (borderIsland == null) { borderIsland = currentIsland = SpawnTempIsland(false); } BeginFloodFill(i, i % sizeX, i / sizeX); } } } for (var i = 0; i < total; i++) { if (cells[i] == CELL_SOLID) { currentIsland = SpawnTempIsland(); BeginFloodFill(i, i % sizeX, i / sizeX); } } return(borderIsland); }