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