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