protected static ColliderSliceResult PrepareSliceCollider(Vector3 locPos, Collider collider, Mesh mesh, Plane plane) { var result = new ColliderSliceResult(); IBzSliceAdapter adapter = new BzSliceColliderAdapter(mesh.vertices, collider.gameObject); BzMeshDataDissector meshDissector = new BzMeshDataDissector(mesh, plane, null, adapter, null); result.SliceResult = SliceResult.Sliced; result.OriginalCollider = collider; result.meshDissector = meshDissector; return(result); }
ColliderSliceResult[] SliceColliders(Plane plane) { var colliders = GetComponentsInChildren <Collider>(); ColliderSliceResult[] results = new ColliderSliceResult[colliders.Length]; bool ColliderExistsNeg = false; bool ColliderExistsPos = false; for (int i = 0; i < colliders.Length; i++) { var collider = colliders[i]; var colliderB = collider as BoxCollider; var colliderS = collider as SphereCollider; var colliderC = collider as CapsuleCollider; var colliderM = collider as MeshCollider; ColliderSliceResult result; if (colliderB != null) { var mesh = Cube.Create(colliderB.size, colliderB.center); result = TrySliceCollider(colliderB.center, colliderB, mesh, plane); } else if (colliderS != null) { var mesh = IcoSphere.Create(colliderS.radius, colliderS.center); result = TrySliceCollider(colliderS.center, colliderS, mesh, plane); } else if (colliderC != null) { var mesh = Capsule.Create(colliderC.radius, colliderC.height, colliderC.direction, colliderC.center); result = TrySliceCollider(colliderC.center, colliderC, mesh, plane); } else if (colliderM != null) { Mesh mesh = Instantiate(colliderM.sharedMesh); result = TrySliceCollider(Vector3.zero, colliderM, mesh, plane); } else { throw new NotSupportedException("Not supported collider type '" + collider.GetType().Name + "'"); } ColliderExistsNeg |= result.SliceResult == SliceResult.Sliced | result.SliceResult == SliceResult.Neg; ColliderExistsPos |= result.SliceResult == SliceResult.Sliced | result.SliceResult == SliceResult.Pos; results[i] = result; } bool sliced = ColliderExistsNeg & ColliderExistsPos; return(sliced ? results : null); }
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); }
protected static ColliderSliceResult PrepareSliceCollider(Collider collider, Mesh mesh, Plane plane) { var result = new ColliderSliceResult(); IBzSliceAdapter adapter = new BzSliceColliderAdapter(mesh.vertices, collider.gameObject); SliceConfigurationDto conf = BzSliceConfiguration.GetDefault(); BzMeshDataDissector meshDissector = new BzMeshDataDissector(mesh, plane, null, adapter, conf); result.SliceResult = SliceResult.Sliced; result.OriginalCollider = collider; result.meshDissector = meshDissector; return(result); }
private static ColliderSliceResult[] SliceColliders(Plane plane, Collider[] colliders) { ColliderSliceResult[] results = new ColliderSliceResult[colliders.Length]; bool ColliderExistsNeg = false; bool ColliderExistsPos = false; for (int i = 0; i < colliders.Length; i++) { var collider = colliders[i]; var colliderB = collider as BoxCollider; var colliderS = collider as SphereCollider; var colliderC = collider as CapsuleCollider; var colliderM = collider as MeshCollider; ColliderSliceResult result; if (colliderB != null) { var mesh = Cube.Create(colliderB.size, colliderB.center); result = PrepareSliceCollider(collider, mesh, plane); } else if (colliderS != null) { var mesh = IcoSphere.Create(colliderS.radius, colliderS.center); result = PrepareSliceCollider(collider, mesh, plane); } else if (colliderC != null) { var mesh = Capsule.Create(colliderC.radius, colliderC.height, colliderC.direction, colliderC.center); result = PrepareSliceCollider(collider, mesh, plane); } else if (colliderM != null) { Mesh mesh = UnityEngine.Object.Instantiate(colliderM.sharedMesh); result = PrepareSliceCollider(collider, mesh, plane); } else { throw new NotSupportedException("Not supported collider type '" + collider.GetType().Name + "'"); } ColliderExistsNeg |= result.SliceResult == SliceResult.Sliced | result.SliceResult == SliceResult.Neg; ColliderExistsPos |= result.SliceResult == SliceResult.Sliced | result.SliceResult == SliceResult.Pos; results[i] = result; } bool sliced = ColliderExistsNeg & ColliderExistsPos; return(sliced ? results : null); }