Esempio n. 1
0
            public D2dSplitGroup CreateSplitGroup(bool feather, bool allowExpand)
            {
                if (feather == true)
                {
                    //D2dFloodfill.Feather(this);
                }

                var group = D2dSplitGroup.GetSplitGroup();

                for (var j = Pixels.Count - 1; j >= 0; j--)
                {
                    var pixel = Pixels[j];

                    group.AddPixel(pixel.X, pixel.Y);
                }

                // Feather will automatically add a transparent border
                if (allowExpand == true && feather == false)
                {
                    group.Rect.MinX -= 1;
                    group.Rect.MaxX += 1;
                    group.Rect.MinY -= 1;
                    group.Rect.MaxY += 1;
                }

                return(group);
            }
        public static void Fracture(D2dDestructible destructible, int count, float irregularity)
        {
            if (destructible != null && count > 0)
            {
                D2dSplitGroup.ClearAll();
                {
                    var width    = destructible.AlphaWidth;
                    var height   = destructible.AlphaHeight;
                    var mainQuad = new D2dQuad();

                    quadCount  = 1;
                    pointCount = 0;
                    xMin       = 0;
                    xMax       = width - 1;
                    yMin       = 0;
                    yMax       = height - 1;

                    mainQuad.BL = new D2dVector2(xMin, yMin);
                    mainQuad.BR = new D2dVector2(xMax, yMin);
                    mainQuad.TL = new D2dVector2(xMin, yMax);
                    mainQuad.TR = new D2dVector2(xMax, yMax);
                    mainQuad.Calculate();

                    if (quads.Count > 0)
                    {
                        quads[0] = mainQuad;
                    }
                    else
                    {
                        quads.Add(mainQuad);
                    }

                    for (var i = 0; i < count; i++)
                    {
                        SplitLargest();
                    }

                    if (irregularity > 0.0f)
                    {
                        FindPoints();
                        ShiftPoints(irregularity);
                    }

                    for (var i = 0; i < quadCount; i++)
                    {
                        var quad  = quads[i];
                        var group = D2dSplitGroup.GetSplitGroup();

                        group.AddTriangle(quad.BL, quad.BR, quad.TL);
                        group.AddTriangle(quad.TR, quad.TL, quad.BR);
                    }

                    destructible.SplitWhole(D2dSplitGroup.SplitGroups);
                }
                D2dSplitGroup.ClearAll();
            }
        }
Esempio n. 3
0
        public static void DespawnTempSplitGroups(D2dSplitGroup borderGroup = null)
        {
            if (borderGroup != null)
            {
                D2dPool <D2dSplitGroup> .Despawn(borderGroup, g => g.Clear());
            }

            if (TempSplitGroups.Count > 0)
            {
                for (var i = TempSplitGroups.Count - 1; i >= 0; i--)
                {
                    D2dPool <D2dSplitGroup> .Despawn(TempSplitGroups[i], g => g.Clear());
                }

                TempSplitGroups.Clear();
            }
        }
            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);
                        }
                    }
                }
            }
Esempio n. 5
0
            public void Submit(D2dSplitGroup splitGroup, int feather, int alphaWidth, int alphaHeight)
            {
                var minX = MinX - feather; if (minX < 0)
                {
                    minX = 0;
                }
                var minY = MinY - feather; if (minY < 0)
                {
                    minY = 0;
                }
                var maxX = MaxX + feather; if (maxX > alphaWidth)
                {
                    maxX = alphaWidth;
                }
                var maxY = MaxY + feather; if (maxY > alphaHeight)

                {
                    maxY = alphaHeight;
                }

                for (var i = 0; i < maxX; i++)
                {
                    if (i == pixels.Count)
                    {
                        pixels.Add(new D2dFloodfillPixel());
                    }
                }

                for (var y = minY; y < maxY; y++)
                {
                    var featheredRow = featheredRows[y];

                    for (var i = minX; i < maxX; i++)
                    {
                        var pixel = pixels[i];

                        pixel.Island   = null;
                        pixel.Distance = feather + 1;
                    }

                    for (var i = featheredRow.Lines.Count - 1; i >= 0; i--)
                    {
                        var featheredLine = featheredRow.Lines[i];

                        for (var x = featheredLine.MinX - feather; x < featheredLine.MaxX + feather; x++)
                        {
                            if (x >= minX && x < maxX)
                            {
                                var pixel    = pixels[x];
                                var distance = GetDistance(x, y, featheredLine);

                                if (distance < pixel.Distance)
                                {
                                    pixel.Island   = featheredLine.Island;
                                    pixel.Distance = distance;
                                }
                            }
                        }
                    }

                    for (var x = minX; x < maxX; x++)
                    {
                        if (pixels[x].Island == this)
                        {
                            splitGroup.AddPixel(x, y);
                        }
                    }
                }
            }