public static Volume EditorVolumeControl(TransformVolume transformVolume, float handleSize, Color color) { Vector3 origin, size; Vector3[] controlHandles = new Vector3[6]; var transform = transformVolume.transform; Handles.color = color; for (int i = 0; i < controlHandles.Length; i++) { controlHandles[i] = transformVolume.GetSidePosition(i); } controlHandles[0] = Handles.Slider(controlHandles[0], transform.right, handleSize, Handles.DotCap, 1); controlHandles[1] = Handles.Slider(controlHandles[1], transform.right, handleSize, Handles.DotCap, 1); controlHandles[2] = Handles.Slider(controlHandles[2], transform.up, handleSize, Handles.DotCap, 1); controlHandles[3] = Handles.Slider(controlHandles[3], transform.up, handleSize, Handles.DotCap, 1); controlHandles[4] = Handles.Slider(controlHandles[4], transform.forward, handleSize, Handles.DotCap, 1); controlHandles[5] = Handles.Slider(controlHandles[5], transform.forward, handleSize, Handles.DotCap, 1); origin.x = transform.InverseTransformPoint((controlHandles[0] + controlHandles[1]) * 0.5f).x; origin.y = transform.InverseTransformPoint((controlHandles[2] + controlHandles[3]) * 0.5f).y; origin.z = transform.InverseTransformPoint((controlHandles[4] + controlHandles[5]) * 0.5f).z; size.x = transform.InverseTransformPoint(controlHandles[0]).x - transform.InverseTransformPoint(controlHandles[1]).x; size.y = transform.InverseTransformPoint(controlHandles[2]).y - transform.InverseTransformPoint(controlHandles[3]).y; size.z = transform.InverseTransformPoint(controlHandles[4]).z - transform.InverseTransformPoint(controlHandles[5]).z; return(new Volume(origin, size)); }
private static List <Polygon> CutPolygons(List <Polygon> polygons, TransformVolume volume, float surfaceMaxAngle) { Vector3 up = volume.transform.up; var pols = new List <Polygon>(); for (int i = 0, count = polygons.Count; i < count; i++) { var polygon = polygons[i]; if (!volume.IsInBounds(polygon.Vertices) || !IsAngle(surfaceMaxAngle, up, polygon.Direction)) { continue; } if (!volume.IsOnBorder(polygon.Vertices)) { pols.Add(polygon); continue; } var tocut = new List <Polygon> { polygon }; for (int s = 0; s < 6; s++) { var plane = new Plane(volume.GetSideDirection(s), volume.GetSidePosition(s)); var cutted = new List <Polygon>(); for (int c = 0, cc = tocut.Count; c < cc; c++) { cutted.AddRange(tocut[c].Cut(plane)); } tocut = cutted; } pols.AddRange(tocut); } return(pols); }