Exemplo n.º 1
0
        public static void DrawLength(UnityEngine.Vector3 from, UnityEngine.Vector3 to, float forceValue)
        {
            var prevColor = SceneHandles.color;

            SceneHandles.color = SceneHandles.StateColor(SceneHandles.measureColor);
            var invMatrix = SceneHandles.inverseMatrix;

            var camera   = UnityEngine.Camera.current;
            var camPos   = invMatrix.MultiplyPoint(camera.transform.position);
            var camDir   = (SceneHandleUtility.ProjectPointLine(camPos, from, to) - camPos).normalized;
            var delta    = (to - from);
            var length   = delta.magnitude;
            var forward  = delta / length;
            var right    = Vector3.Cross(forward, camDir);
            var fromSize = UnityEditor.HandleUtility.GetHandleSize(from);
            var toSize   = UnityEditor.HandleUtility.GetHandleSize(to);
            var center   = (to + from) * 0.5f;

            SceneHandles.DrawLine(from, to);
            DrawFlatArrow(from, forward, camDir, fromSize * 0.2f);
            DrawFlatArrow(to, -forward, camDir, toSize * 0.2f);
            //	SceneHandles.DrawLine(from - right, from + right);
            //	SceneHandles.DrawLine(to   - right, to   + right);

            DrawUnitLabel(center, right, 2, forceValue);
            SceneHandles.color = prevColor;
        }
Exemplo n.º 2
0
        public static void DrawFlatArrow(UnityEngine.Vector3 center, UnityEngine.Vector3 direction, float handleSize)
        {
            var invMatrix = SceneHandles.inverseMatrix;

            var camera = UnityEngine.Camera.current;
            var camPos = invMatrix.MultiplyPoint(camera.transform.position);
            var camDir = (SceneHandleUtility.ProjectPointLine(camPos, center, center + direction) - camPos).normalized;

            DrawFlatArrow(center, direction, camDir, handleSize);
        }
Exemplo n.º 3
0
        public static void DrawLengths(Bounds bounds, Axes activeAxes = Axes.XYZ, Axes visibleAxes = Axes.XYZ, Axes selectedAxes = Axes.None)
        {
            // TODO: what if camera is inside of bounds?
            // TODO: what if length is outside of camera, but other option is inside of camera view?
            // TODO: don't make the side lines move around when resizing, be smarter about handlesize
            //			-> maybe limit the projected line to the screen?

            var invMatrix = SceneHandles.inverseMatrix;
            var prevColor = SceneHandles.color;
            var color     = prevColor;
            var color2    = color;

            color2.a *= 0.5f;

            var camera = UnityEngine.Camera.current;
            var camPos = invMatrix.MultiplyPoint(camera.transform.position);

            var lengthX = bounds.size.x;
            var lengthY = bounds.size.y;
            var lengthZ = bounds.size.z;

            var absLengthX = Mathf.Abs(lengthX);
            var absLengthY = Mathf.Abs(lengthY);
            var absLengthZ = Mathf.Abs(lengthZ);

            var delta = (bounds.center - camPos) * 2;
            var dotX  = delta.x < 0 ? -1 : 1;
            var dotY  = delta.y < 0 ? -1 : 1;
            var dotZ  = delta.z < 0 ? -1 : 1;

            var insideX = (delta.x >= -absLengthX && delta.x <= absLengthX);
            var insideY = (delta.y >= -absLengthY && delta.y <= absLengthY);
            var insideZ = (delta.z >= -absLengthZ && delta.z <= absLengthZ);

            bool showX = !(insideY && insideZ);
            bool showY = !(insideX && insideZ);
            bool showZ = !(insideX && insideY);


            Vector3 fromX, toX;
            Vector3 fromY, toY;
            Vector3 fromZ, toZ;

            var min = bounds.min;
            var max = bounds.max;

            // min/max of bounds can potentially be inverted
            min.x = Mathf.Min(min.x, max.x);
            min.y = Mathf.Min(min.y, max.y);
            min.z = Mathf.Min(min.z, max.z);

            fromX = min; toX = fromX + new Vector3(absLengthX, 0, 0);
            fromY = min; toY = fromY + new Vector3(0, absLengthY, 0);
            fromZ = min; toZ = fromZ + new Vector3(0, 0, absLengthZ);

            var signZ = Vector3.one;

            if (showZ)
            {
                bool swapX = (dotX > 0) ^ insideY;
                bool swapY = (dotY < 0) ^ insideY;

                signZ.x = swapX ? 1 : -1; signZ.y = swapY ? 1 : -1;
                var ofsX = swapX ? absLengthX : 0; fromZ.x += ofsX; toZ.x += ofsX;
                var ofsY = swapY ? absLengthY : 0; fromZ.y += ofsY; toZ.y += ofsY;
            }

            var signY = Vector3.one;

            if (showY)
            {
                bool swapX = (dotX > 0) ^ insideZ;
                bool swapZ = (dotZ < 0);

                signY.x = swapX ? 1 : -1; signY.z = swapZ ? 1 : -1;
                var ofsX = swapX ? absLengthX : 0; fromY.x += ofsX; toY.x += ofsX;
                var ofsZ = swapZ ? absLengthZ : 0; fromY.z += ofsZ; toY.z += ofsZ;
            }

            var signX = Vector3.one;

            if (showX)
            {
                bool swapY = (dotY > 0) ^ insideZ;
                bool swapZ = (dotZ < 0);

                signX.y = swapY ? 1 : -1; signX.z = swapZ ? 1 : -1;
                var ofsY = swapY ? absLengthY : 0; fromX.y += ofsY; toX.y += ofsY;
                var ofsZ = swapZ ? absLengthZ : 0; fromX.z += ofsZ; toX.z += ofsZ;
            }

            var lineHandleX = SceneHandleUtility.ProjectPointLine(camPos, fromX, toX);
            var lineHandleY = SceneHandleUtility.ProjectPointLine(camPos, fromY, toY);
            var lineHandleZ = SceneHandleUtility.ProjectPointLine(camPos, fromZ, toZ);
            var lineOfsX    = (UnityEditor.HandleUtility.GetHandleSize(lineHandleX) * 0.25f);
            var lineOfsY    = (UnityEditor.HandleUtility.GetHandleSize(lineHandleY) * 0.25f);
            var lineOfsZ    = (UnityEditor.HandleUtility.GetHandleSize(lineHandleZ) * 0.25f);

            var angleX     = lineHandleX - camPos;
            var angleY     = lineHandleY - camPos;
            var angleZ     = lineHandleZ - camPos;
            var directionX = Mathf.Abs(angleX.y) <= Mathf.Abs(angleX.z);
            var directionY = Mathf.Abs(angleY.x) <= Mathf.Abs(angleY.z);
            var directionZ = Mathf.Abs(angleZ.y) <= Mathf.Abs(angleZ.x);

            var disabled = SceneHandles.disabled;

            const int labelPadding = 2;

            if (showX && ((visibleAxes & Axes.X) == Axes.X))
            {
                var axisDisabled = ((activeAxes & Axes.X) != Axes.X) || disabled;
                var selected     = ((selectedAxes & Axes.X) == Axes.X) && !axisDisabled;

                var offsetY = new Vector3(0, (lineOfsY * signX.y), 0);
                var offsetZ = new Vector3(0, 0, (lineOfsZ * signX.z));

                var offset  = directionX ? offsetY : offsetZ;
                var fromOfs = fromX + offset;
                var toOfs   = toX + offset;

                var camDir   = SceneHandleUtility.ProjectPointLine(camPos, fromOfs, toOfs) - camPos;
                var fromSize = Mathf.Min(absLengthX / 3.0f, UnityEditor.HandleUtility.GetHandleSize(fromOfs) * 0.2f);
                var toSize   = Mathf.Min(absLengthX / 3.0f, UnityEditor.HandleUtility.GetHandleSize(toOfs) * 0.2f);
                var center   = (toOfs + fromOfs) * 0.5f;

                SceneHandles.color = SceneHandles.StateColor(color2, axisDisabled, selected);
                SceneHandles.DrawLine(fromX, fromOfs);
                SceneHandles.DrawLine(toX, toOfs);

                SceneHandles.color = SceneHandles.StateColor(color, axisDisabled, selected);
                SceneHandles.DrawLine(fromOfs, toOfs);
                DrawFlatArrow(fromOfs, Vector3.right, camDir, fromSize);
                DrawFlatArrow(toOfs, -Vector3.right, camDir, toSize);
                DrawUnitLabel(center, offset, labelPadding, lengthX, "X");
            }

            if (showY && ((visibleAxes & Axes.Y) == Axes.Y))
            {
                var axisDisabled = ((activeAxes & Axes.Y) != Axes.Y) || disabled;
                var selected     = ((selectedAxes & Axes.Y) == Axes.Y) && !axisDisabled;

                var offsetX = new Vector3((lineOfsX * signY.x), 0, 0);
                var offsetZ = new Vector3(0, 0, (lineOfsZ * signY.z));

                var offset  = directionY ? offsetX : offsetZ;
                var fromOfs = fromY + offset;
                var toOfs   = toY + offset;

                var camDir   = SceneHandleUtility.ProjectPointLine(camPos, fromOfs, toOfs) - camPos;
                var fromSize = Mathf.Min(absLengthY / 3.0f, UnityEditor.HandleUtility.GetHandleSize(fromOfs) * 0.2f);
                var toSize   = Mathf.Min(absLengthY / 3.0f, UnityEditor.HandleUtility.GetHandleSize(toOfs) * 0.2f);
                var center   = (toOfs + fromOfs) * 0.5f;

                SceneHandles.color = SceneHandles.StateColor(color2, axisDisabled, selected);
                SceneHandles.DrawLine(fromY, fromOfs);
                SceneHandles.DrawLine(toY, toOfs);

                SceneHandles.color = SceneHandles.StateColor(color, axisDisabled, selected);
                SceneHandles.DrawLine(fromOfs, toOfs);
                DrawFlatArrow(fromOfs, Vector3.up, camDir, fromSize);
                DrawFlatArrow(toOfs, -Vector3.up, camDir, toSize);
                DrawUnitLabel(center, offset, labelPadding, lengthY, "Y");
            }

            if (showZ && ((visibleAxes & Axes.Z) == Axes.Z))
            {
                var axisDisabled = ((activeAxes & Axes.Z) != Axes.Z) || disabled;
                var selected     = ((selectedAxes & Axes.Z) == Axes.Z) && !axisDisabled;

                var offsetX = new Vector3((lineOfsX * signZ.x), 0, 0);
                var offsetY = new Vector3(0, (lineOfsY * signZ.y), 0);

                var offset  = directionZ ? offsetY : offsetX;
                var fromOfs = fromZ + offset;
                var toOfs   = toZ + offset;

                var camDir   = SceneHandleUtility.ProjectPointLine(camPos, fromOfs, toOfs) - camPos;
                var fromSize = Mathf.Min(absLengthZ / 3.0f, UnityEditor.HandleUtility.GetHandleSize(fromOfs) * 0.2f);
                var toSize   = Mathf.Min(absLengthZ / 3.0f, UnityEditor.HandleUtility.GetHandleSize(toOfs) * 0.2f);
                var center   = (toOfs + fromOfs) * 0.5f;

                SceneHandles.color = SceneHandles.StateColor(color2, axisDisabled, selected);
                SceneHandles.DrawLine(fromZ, fromOfs);
                SceneHandles.DrawLine(toZ, toOfs);

                SceneHandles.color = SceneHandles.StateColor(color, axisDisabled, selected);
                SceneHandles.DrawLine(fromOfs, toOfs);
                DrawFlatArrow(fromOfs, Vector3.forward, camDir, fromSize);
                DrawFlatArrow(toOfs, -Vector3.forward, camDir, toSize);
                DrawUnitLabel(center, offset, labelPadding, lengthZ, "Z");
            }
            SceneHandles.color = prevColor;
        }