public void MakeBoxHull() { var timer = System.Diagnostics.Stopwatch.StartNew(); Debug.Log($"[CraftHull] MakeBoxHull 8 verts to process"); var min = bounds.min - boundsOrigin; var max = bounds.max - boundsOrigin; var rawMesh = new RawMesh(8); rawMesh.AddVertex(min); rawMesh.AddVertex(new Vector3(min.x, min.y, max.z)); rawMesh.AddVertex(new Vector3(min.x, max.y, min.z)); rawMesh.AddVertex(new Vector3(min.x, max.y, max.z)); rawMesh.AddVertex(new Vector3(max.x, min.y, min.z)); rawMesh.AddVertex(new Vector3(max.x, min.y, max.z)); rawMesh.AddVertex(new Vector3(max.x, max.y, min.z)); rawMesh.AddVertex(max); var hull = new Quickhull(rawMesh); var hullFaces = hull.GetHull(); Debug.Log($"[CraftHull] MakeBoxHull {hullFaces.Count} hull faces"); hullMeshes = hullFaces.CreateMesh(); timer.Stop(); Debug.Log($"[CraftHull] MakeBoxHull {timer.ElapsedMilliseconds}ms"); }
public void BuildConvexHull(Vessel craftVessel) { var timer = System.Diagnostics.Stopwatch.StartNew(); var meshFilters = craftVessel.GetComponentsInChildren <MeshFilter> (false); var skinnedMeshRenderers = craftVessel.GetComponentsInChildren <SkinnedMeshRenderer> (false); int numVerts = 0; for (int i = 0; i < meshFilters.Length; i++) { if (!IsActive(meshFilters[i])) { continue; } numVerts += meshFilters[i].sharedMesh.vertices.Length; } for (int i = 0; i < skinnedMeshRenderers.Length; i++) { if (!skinnedMeshRenderers[i].enabled) { continue; } numVerts += skinnedMeshRenderers[i].sharedMesh.vertices.Length; } Debug.Log($"[CraftHull] BuildConvexHull {numVerts} verts to process"); var rawMesh = new RawMesh(numVerts); var rootXform = craftVessel.parts[0].localRoot.transform.worldToLocalMatrix; for (int i = 0; i < meshFilters.Length; i++) { var mf = meshFilters[i]; if (!IsActive(mf)) { continue; } var xform = rootXform * mf.transform.localToWorldMatrix; rawMesh.AppendMesh(mf.sharedMesh, xform); } var m = new Mesh(); for (int i = 0; i < skinnedMeshRenderers.Length; i++) { var smr = skinnedMeshRenderers[i]; if (!smr.enabled) { continue; } var xform = rootXform * smr.transform.localToWorldMatrix; BakeMesh(smr, m); rawMesh.AppendMesh(m, xform); } UnityEngine.Object.Destroy(m); var hull = new Quickhull(rawMesh); var hullFaces = hull.GetHull(); hullError = hull.error; Debug.Log($"[CraftHull] BuildConvexHull hullError:{hullError}"); Debug.Log($"[CraftHull] BuildConvexHull {hullFaces.Count} hull faces"); hullMeshes = hullFaces.CreateMesh(); timer.Stop(); Debug.Log($"[CraftHull] BuildConvexHull {timer.ElapsedMilliseconds}ms"); }