Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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);
        }