protected override void DoFracture() { var mainQuad = new D2D_Quad(); mainQuad.BL = new D2D_Point(0, 0); mainQuad.BR = new D2D_Point(width - 1, 0); mainQuad.TL = new D2D_Point(0, height - 1); mainQuad.TR = new D2D_Point(width - 1, height - 1); quads.Clear(); quads.Add(mainQuad); for (var i = 0; i < Count; i++) { SplitLargest(); } for (var i = 0; i < quads.Count; i++) { var quad = quads[i]; var group = D2D_SplitBuilder.CreateGroup(); group.AddTriangle(quad.BL, quad.BR, quad.TL); group.AddTriangle(quad.TR, quad.TL, quad.BR); } }
public void UpdateSplit() { if (destructible == null) { destructible = GetComponent <D2D_Destructible>(); } BeginSplitting(); { // Find which pixels are solid for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { cells.Add(alphaTex.GetPixel(x, y).a >= Threshold); } } // Go through all pixels for (var i = 0; i < total; i++) { // First pixel of unclaimed island? if (cells[i] == true) { splitGroup = D2D_SplitBuilder.CreateGroup(); BeginFloodFill(i, i % width, i / width); } } } EndSplitting(); }
private void EndSplitting() { // If there's only one island then skip, else every modification will waste CPU if (D2D_SplitBuilder.Groups.Count != 1) { D2D_SplitBuilder.DiscardTinyBits(MinPixels); D2D_SplitBuilder.EndSplitting(SplitOrder, false); } BusySplitting = false; }
public void Fracture() { if (destructible == null) { destructible = GetComponent <D2D_Destructible>(); } alphaTex = destructible.AlphaTex; width = alphaTex.width; height = alphaTex.height; total = width * height; D2D_SplitBuilder.BeginSplitting(destructible); { DoFracture(); } D2D_SplitBuilder.EndSplitting(D2D_SplitOrder.Default, Blur); }
private void BeginSplitting() { BusySplitting = true; alphaTex = destructible.AlphaTex; width = alphaTex.width; height = alphaTex.height; total = width * height; // Clear cells and set capacity cells.Clear(); if (cells.Capacity < total) { cells.Capacity = total; } D2D_SplitBuilder.BeginSplitting(destructible); }