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(); } }