void Start() { if (substrate == null) { substrate = new shatterMesh(GetComponent <MeshFilter>().mesh, new Vector3(0, 0, 0), true, substrateTemplate); } }
public void shatter(List <shatterMesh> cells) { shatterMesh newSub = null; foreach (shatterMesh c in cells) { int otherOrigTris = c.triangles.Count; substrate.intersect(c); foreach (shatterTriangle t in substrate.triangles) { if (!t.isConsumed && !t.culled) { shatterMesh fgf_res = floodGenerateFragment(t, c, otherOrigTris); if (fgf_res != null) { newSub = fgf_res; } } } //FOR DEBUG ONLY /*foreach (shatterTriangle t in c.triangles){ * if (!t.isConsumed && !t.culled){ * DEBUGcut(t); * } * }*/ } Destroy(gameObject); }
public void cut(shatterMesh other, int stopCheck = -1) { activeCuts.Clear(); if (stopCheck < 0) { stopCheck = other.triangles.Count; } for (int i = 0; i < stopCheck; i++) { int startStepTris = triangles.Count; for (int j = 0; j < startStepTris; j++) { if (!triangles[j].culled) { cutTri(triangles[j], other.triangles[i]); } } } for (int i = 0; i < triangles.Count; i++) { triangles[i].populateAdjacent(); } foreach (shatterVert v in activeCuts) { if (v.excludeEdges.Count != 2) { Debug.Log(v.excludeEdges.Count); Debug.Log(v.pos); } } }
private void preparePatern(Vector3 offset) { foreach (Transform child in shatterPrefab.transform) { shatterMesh newCell = new shatterMesh(child.GetComponent <MeshFilter>().sharedMesh, offset + child.transform.position, false); cells.Add(newCell); } }
//externality checks public void cullExternal(shatterMesh other, int stopCheck) { populateExternal(other, stopCheck); foreach (shatterTriangle t in triangles) { if (t.external) { //if (!t.culled && other.raycastExternalCheck(t,stopCheck)){ t.cull(); } } }
private shatterMesh floodGenerateFragment(shatterTriangle first, shatterMesh other, int otherOrigTris) { List <shatterTriangle> newSubstrateTris = new List <shatterTriangle>(); List <shatterTriangle> newCutTris = new List <shatterTriangle>(); Queue <shatterTriangle> flood = new Queue <shatterTriangle>(); flood.Enqueue(first); first.isConsumed = true; bool substrateExternType = first.external; while (flood.Count != 0) { shatterTriangle currentTri = flood.Dequeue(); foreach (shatterTriangle a in currentTri.adjacent) { if (!a.isConsumed && !a.culled) { if (!a.isSubstrate || (a.external == substrateExternType)) { //when leaving cut mesh go into the substrate type you started at (otherwise shouldn't matter) flood.Enqueue(a); a.isConsumed = true; } } } if (currentTri.isSubstrate) { newSubstrateTris.Add(currentTri); } else { newCutTris.Add(currentTri); } } foreach (shatterTriangle ct in newCutTris) { ct.isConsumed = false; } shatterMesh newshatter = generateFragment(newSubstrateTris, newCutTris, substrateExternType); Debug.Log(new Vector2(newSubstrateTris.Count, newCutTris.Count)); Debug.Log(substrateExternType); if (substrateExternType) { return(null); } return(newshatter); }
public void intersect(shatterMesh other) { int thisOrigTris = triangles.Count; int otherOrigTris = other.triangles.Count; cut(other); populateExternal(other, other.triangles.Count); Debug.Log("other cuting"); other.cut(this, thisOrigTris); other.cullExternal(this, thisOrigTris); for (int i = thisOrigTris; i < triangles.Count; i++) { triangles[i].populateAdjacentTunneled(); } }
private void populateExternal(shatterMesh other, int stopCheck) { foreach (shatterTriangle t in triangles) { if (!t.culled && !t.isConsumed) { t.external = other.raycastExternalCheck(t, stopCheck); externalFlood(t); Debug.Log("tanavast"); } } foreach (shatterTriangle t in triangles) { t.isConsumed = false; } }