public static List<GameObject> GenerateTriangularPieces(GameObject source, int extraPoints = 0, int subshatterSteps = 0, Material mat = null)
{
List<GameObject> pieces = new List<GameObject>();
if (mat == null)
{
mat = createFragmentMaterial(source);
}
//get transform information
Vector3 origScale = source.transform.localScale;
source.transform.localScale = Vector3.one;
Quaternion origRotation = source.transform.localRotation;
source.transform.localRotation = Quaternion.identity;
//get rigidbody information
Vector2 origVelocity = source.GetComponent<Rigidbody2D>().velocity;
//get collider information
PolygonCollider2D sourcePolyCollider = source.GetComponent<PolygonCollider2D>();
BoxCollider2D sourceBoxCollider = source.GetComponent<BoxCollider2D>();
List<Vector2> points = new List<Vector2>();
List<Vector2> borderPoints = new List<Vector2>();
//add points from the present collider
if (sourcePolyCollider != null)
{
points = getPoints(sourcePolyCollider);
borderPoints = getPoints(sourcePolyCollider);
}
else if (sourceBoxCollider != null)
{
points = getPoints(sourceBoxCollider);
borderPoints = getPoints(sourceBoxCollider);
}
//create a bounding rectangle based on the polygon points
Rect rect = getRect(source);
//if the target polygon is a triangle, generate a point in the middle to allow for fracture
if (points.Count == 3)
{
points.Add((points[0] + points[1] + points[2]) / 3);
}
for (int i = 0; i < extraPoints; i++)
{
points.Add(new Vector2(Random.Range(rect.width / -2, rect.width / 2), Random.Range(rect.height / -2 + rect.center.y, rect.height / 2 + rect.center.y)));
}
Voronoi voronoi = new Delaunay.Voronoi(points, null, rect);
List<List<Vector2>> clippedTriangles = new List<List<Vector2>>();
foreach (Triangle tri in voronoi.Triangles())
{
clippedTriangles = ClipperHelper.clip(borderPoints, tri);
foreach (List<Vector2> triangle in clippedTriangles)
{
pieces.Add(generateTriangularPiece(source, triangle, origVelocity, origScale, origRotation, mat));
}
}
List<GameObject> morePieces = new List<GameObject>();
if (subshatterSteps > 0)
{
subshatterSteps--;
foreach (GameObject piece in pieces)
{
morePieces.AddRange(SpriteExploder.GenerateTriangularPieces(piece, extraPoints, subshatterSteps, mat));
GameObject.DestroyImmediate(piece);
}
}
else
{
morePieces = pieces;
}
//reset transform information
source.transform.localScale = origScale;
source.transform.localRotation = origRotation;
Resources.UnloadUnusedAssets();
return morePieces;
}