Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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);
        }