private ColliderSliceResult TrySliceCollider(Vector3 locPos, Collider collider, Mesh mesh, Plane plane) { IBzSliceAddapter adapter = new BzSliceColliderAddapter(mesh.vertices, collider.gameObject); BzMeshDataDissector meshDissector = new BzMeshDataDissector(mesh, plane, null, adapter, null); ColliderSliceResult result = new ColliderSliceResult(); result.OriginalCollider = collider; result.MeshDissector = meshDissector; result.SliceResult = meshDissector.Slice(); return(result); }
public bool Slice(Plane plane) { if (SectionViewMaterial == null) { throw new InvalidOperationException("SectionViewMaterial == null"); } if (!CheckBounds(plane)) // AABB check for optimisation { return(false); } var colliders = SliceColliders(plane); if (colliders == null) { return(false); } var renderer = GetComponent <MeshRenderer>(); MeshFilter meshFilter = GetComponent <MeshFilter>(); var mesh = meshFilter.sharedMesh; IBzSliceAddapter adapter = new BzSliceMeshFilterAddapter(mesh.vertices, gameObject); BzMeshDataDissector meshDissector = new BzMeshDataDissector(mesh, plane, renderer.sharedMaterials, adapter, null); meshDissector.DefaultSliceMaterial = SectionViewMaterial; if (meshDissector.Slice() != SliceResult.Sliced) { return(false); } // duplicate object var duplicate = Instantiate(this.gameObject, this.gameObject.transform.parent); ReplaceColliders(colliders, duplicate); var duplRenderer = duplicate.GetComponent <MeshRenderer>(); meshDissector.RebuildNegMesh(renderer); meshDissector.RebuildPosMesh(duplRenderer); InvokeEvents(this.gameObject, duplicate); OutObjectsNegative = new GameObject[] { this.gameObject }; OutObjectsPositive = new GameObject[] { duplicate }; return(true); }