Example #1
0
        public static void TrySplit(D2dDestructible destructible, int feather)
        {
            if (destructible != null)
            {
                Search(destructible);

                if (islands.Count > 1)
                {
                    var baseRect = new D2dRect(0, alphaWidth, 0, alphaHeight);

                    if (feather > 0)
                    {
                        baseField.Transform(baseRect, alphaWidth, alphaHeight, alphaData);

                        destructible.SplitBegin();

                        for (var i = islands.Count - 1; i >= 0; i--)
                        {
                            var island = islands[i];
                            var sprite = destructible.SplitNext(i == 0);
                            var rect   = new D2dRect(island.MinX, island.MaxX, island.MinY, island.MaxY); rect.Expand(feather); rect.ClampTo(baseRect);

                            D2dHelper.ReserveTempAlphaDataClear(rect.SizeX, rect.SizeY);

                            island.Fill(baseField, baseRect, rect);

                            sprite.SubsetAlphaWith(D2dHelper.tempAlphaData, rect, island.Count);
                        }
                    }
                    else
                    {
                        destructible.SplitBegin();

                        for (var i = islands.Count - 1; i >= 0; i--)
                        {
                            var island = islands[i];
                            var chunk  = destructible.SplitNext(i == 0);
                            var rect   = new D2dRect(island.MinX, island.MaxX, island.MinY, island.MaxY); rect.ClampTo(baseRect);

                            D2dHelper.ReserveTempAlphaDataClear(rect.SizeX, rect.SizeY);

                            island.Fill(rect);

                            chunk.SubsetAlphaWith(D2dHelper.tempAlphaData, rect);
                        }
                    }

                    destructible.SplitEnd();
                }
            }
        }
            public void Submit(D2dDistanceField baseField, D2dSplitGroup splitGroup, D2dRect baseRect, D2dRect rect)
            {
                distanceField.Transform(rect, this);

                for (var y = rect.MinY; y < rect.MaxY; y++)
                {
                    for (var x = rect.MinX; x < rect.MaxX; x++)
                    {
                        var cell     = distanceField.Cells[x - rect.MinX + (y - rect.MinY) * rect.SizeX];
                        var baseCell = baseField.Cells[x - baseRect.MinX + (y - baseRect.MinY) * baseRect.SizeX];

                        if (cell.D == baseCell.D)
                        {
                            splitGroup.AddPixel(x, y);
                        }
                    }
                }
            }
Example #3
0
            public void Fill(D2dDistanceField baseField, D2dRect baseRect, D2dRect rect)
            {
                distanceField.Transform(rect, this);

                for (var y = rect.MinY; y < rect.MaxY; y++)
                {
                    var o = (y - rect.MinY) * rect.SizeX - rect.MinX;
                    var z = y * alphaWidth;

                    for (var x = rect.MinX; x < rect.MaxX; x++)
                    {
                        var cell     = distanceField.Cells[x - rect.MinX + (y - rect.MinY) * rect.SizeX];
                        var baseCell = baseField.Cells[x - baseRect.MinX + (y - baseRect.MinY) * baseRect.SizeX];

                        if (cell.d == baseCell.d)
                        {
                            D2dHelper.tempAlphaData[o + x] = alphaData[z + x];
                        }
                    }
                }
            }
Example #4
0
        public static void TrySplit(D2dDestructible destructible, int feather, int healThreshold)
        {
            if (destructible != null)
            {
                Search(destructible);

                if (islands.Count > 1)
                {
                    var baseRect = new D2dRect(0, alphaWidth, 0, alphaHeight);

                    if (feather > 0)
                    {
                        baseField.Transform(baseRect, alphaWidth, alphaHeight, alphaData);

                        destructible.SplitBegin();

                        for (var i = islands.Count - 1; i >= 0; i--)
                        {
                            var island = islands[i];
                            var piece  = destructible.SplitNext(i == 0);
                            var rect   = default(D2dRect);

                            if (healThreshold >= 0 && island.Count >= healThreshold)
                            {
                                rect = baseRect;
                            }
                            else
                            {
                                rect.MinX = island.MinX;
                                rect.MaxX = island.MaxX;
                                rect.MinY = island.MinY;
                                rect.MaxY = island.MaxY;

                                rect.Expand(feather);

                                rect.ClampTo(baseRect);

                                piece.HealSnapshot = null;
                            }

                            D2dHelper.ReserveTempAlphaDataClear(rect.SizeX, rect.SizeY);

                            island.Fill(baseField, baseRect, rect);

                            piece.SubsetAlphaWith(D2dHelper.tempAlphaData, rect, island.Count);
                        }
                    }
                    else
                    {
                        destructible.SplitBegin();

                        for (var i = islands.Count - 1; i >= 0; i--)
                        {
                            var island = islands[i];
                            var chunk  = destructible.SplitNext(i == 0);
                            var rect   = new D2dRect(island.MinX, island.MaxX, island.MinY, island.MaxY); rect.ClampTo(baseRect);

                            D2dHelper.ReserveTempAlphaDataClear(rect.SizeX, rect.SizeY);

                            island.Fill(rect);

                            chunk.SubsetAlphaWith(D2dHelper.tempAlphaData, rect);
                        }
                    }

                    destructible.SplitEnd(D2dDestructible.SplitMode.Split);
                }
            }
        }