private static void SplitLargest()
        {
            var largestIndex = 0;
            var largestArea  = 0;

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

                if (quad.Area > largestArea)
                {
                    largestIndex = i;
                    largestArea  = quad.Area;
                }
            }

            var first  = new D2dQuad();
            var second = new D2dQuad();

            quads[largestIndex].Split(ref first, ref second);

            quads[largestIndex] = first;

            if (quads.Count > quadCount)
            {
                quads[quadCount] = second;
            }
            else
            {
                quads.Add(second);
            }

            quadCount += 1;
        }
        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();
            }
        }
예제 #3
0
        public void Split(ref D2dQuad first, ref D2dQuad second)
        {
            // Vertical split
            if (Size.X > Size.Y)
            {
                var TS = TL + (TR - TL) / 2;
                var BS = BL + (BR - BL) / 2;

                first.BL = BL;
                first.BR = BS;
                first.TL = TL;
                first.TR = TS;

                second.BL = BS;
                second.BR = BR;
                second.TL = TS;
                second.TR = TR;
            }
            // Horizontal split
            else
            {
                var LS = BL + (TL - BL) / 2;
                var RS = BR + (TR - BR) / 2;

                first.BL = LS;
                first.BR = RS;
                first.TL = TL;
                first.TR = TR;

                second.BL = BL;
                second.BR = BR;
                second.TL = LS;
                second.TR = RS;
            }

            first.Calculate();

            second.Calculate();
        }