Пример #1
0
        public static TurnState DoHandle(Bounds bounds)
        {
            var cameraPosition = Camera.current.transform.position;
            var matrix         = Handles.matrix;

            var min = new Vector3(Mathf.Min(bounds.min.x, bounds.max.x), Mathf.Min(bounds.min.y, bounds.max.y), Mathf.Min(bounds.min.z, bounds.max.z));
            var max = new Vector3(Mathf.Max(bounds.min.x, bounds.max.x), Mathf.Max(bounds.min.y, bounds.max.y), Mathf.Max(bounds.min.z, bounds.max.z));

            var center = (max + min) * 0.5f;

            var worldCenter   = matrix.MultiplyPoint(center);
            var iconDirection = (cameraPosition - worldCenter).normalized;

            var dotX = Vector3.Dot(matrix.MultiplyVector(new Vector3(1, 0, 0)), iconDirection);
            var dotZ = Vector3.Dot(matrix.MultiplyVector(new Vector3(0, 0, 1)), iconDirection);
            var dotY = Vector3.Dot(matrix.MultiplyVector(new Vector3(0, 1, 0)), iconDirection);

            if ((dotX > -0.2f) && (dotX < 0.2f))
            {
                dotX = 0;
            }
            if ((dotZ > -0.2f) && (dotZ < 0.2f))
            {
                dotZ = 0;
            }

            var axisY  = (dotY > 0);
            var axis0X = (dotX == 0) ? (dotZ > 0) : (dotZ == 0) ? (dotX > 0) : ((dotX < 0) ^ (dotX < 0) ^ (dotZ > 0));
            var axis0Z = (dotX == 0) ? (dotZ > 0) : (dotZ == 0) ? (dotX < 0) : ((dotZ > 0) ^ (dotX < 0) ^ (dotZ > 0));
            var axis1X = (dotX == 0) ? (dotZ < 0) : (dotZ == 0) ? (dotX > 0) : ((dotX > 0) ^ (dotX < 0) ^ (dotZ > 0));
            var axis1Z = (dotX == 0) ? (dotZ > 0) : (dotZ == 0) ? (dotX > 0) : ((dotZ < 0) ^ (dotX < 0) ^ (dotZ > 0));

            var pLabel0 = new Vector3(axis0X ? min.x : max.x, axisY ? max.y : min.y, axis0Z ? min.z : max.z);
            var pLabel1 = new Vector3(axis1X ? min.x : max.x, axisY ? max.y : min.y, axis1Z ? min.z : max.z);

            var prevColor = Handles.color;

            Handles.color = iconColor;

            var result = TurnState.None;

            // TODO: consider putting both buttons next to each other
            //  - buttons closer to each other, which is nicer when you need to go back and forth (although you could just click 3 times to go back)
            //  - since you'd only have 1 button group, the chance is higher it's outside of the screen.
            //    so a better solution should be found to make sure the button group doesn't overlap the stairs, yet is close to it, and on screen.
            if (SceneHandles.ClickableLabel(pLabel1, (pLabel1 - center).normalized, clockWiseRotation, fontSize: 32, fontStyle: FontStyle.Bold))
            {
                result = TurnState.ClockWise;
            }

            if (SceneHandles.ClickableLabel(pLabel0, (pLabel0 - center).normalized, antiClockWiseRotation, fontSize: 32, fontStyle: FontStyle.Bold))
            {
                result = TurnState.AntiClockWise;
            }

            Handles.color = prevColor;

            return(result);
        }
        static void RenderIntersectionPoint(Vector3 position)
        {
            if (!hoverIntersection.HasValue)
            {
                return;
            }
            var intersectionPoint = hoverIntersection.Value.surfaceIntersection.worldIntersection;
            var normal            = hoverIntersection.Value.surfaceIntersection.worldPlane.normal;

            SceneHandles.RenderBorderedCircle(position, HandleUtility.GetHandleSize(position) * 0.02f);
        }
        private void HandleDrawingMethodNames()
        {
            if (!drawMethodNames.boolValue)
            {
                return;
            }
            // Return if path data does not exist.
            if (Script.Animator.PathData == null)
            {
                return;
            }

            var methodNames = (string[])Utilities.InvokeMethodWithReflection(
                Script,
                "GetMethodNames",
                null);

            var nodePositions =
                (List <Vector3>)Utilities.InvokeMethodWithReflection(
                    Script,
                    "GetNodePositions",
                    new object[] { -1 });

            // Wait until event slots number is synced with path nodes number.
            if (methodNames.Length != nodePositions.Count)
            {
                return;
            }

            var style = Script.Skin.GetStyle("MethodNameLabel");

            SceneHandles.DrawNodeLabels(
                nodePositions,
                methodNames,
                Settings.MethodNameLabelOffsetX,
                Settings.MethodNameLabelOffsetY,
                Settings.DefaultNodeLabelWidth,
                Settings.DefaultNodeLabelHeight,
                style);
        }
Пример #4
0
        public static float RotatedEdge2DHandle(int id, float angle, Vector3 origin, float diameter, Vector3 handleDir, Vector3 slideDir1, Vector3 slideDir2, float handleSize = 0.0f, UnitySceneExtensions.SceneHandles.CapFunction capFunction = null, Axes axes = Axes.None)
        {
            var from     = origin;
            var vector   = Quaternion.AngleAxis(angle, handleDir) * Vector3.forward;
            var to       = from + (vector * diameter);
            var position = from + (vector * (diameter * 0.5f));

            var evt = Event.current;

            switch (evt.GetTypeForControl(id))
            {
            case EventType.Layout:
            {
                UnityEditor.HandleUtility.AddControl(id, UnityEditor.HandleUtility.DistanceToLine(from, to) * 0.5f);
                break;
            }

            case EventType.Repaint:
            {
                SceneHandles.SetCursor(id, from, to);

                if (EditorGUIUtility.keyboardControl == id)
                {
                    UnityEditor.Handles.DrawAAPolyLine(3.0f, from, to);
                }
                else
                {
                    UnityEditor.Handles.DrawAAPolyLine(2.5f, from, to);
                }
                break;
            }
            }

            if (handleSize == 0.0f)
            {
                handleSize = UnityEditor.HandleUtility.GetHandleSize(position) * 0.05f;
            }


            if (evt.GetTypeForControl(id) == EventType.MouseDown &&
                GUIUtility.hotControl == 0 &&
                ((UnityEditor.HandleUtility.nearestControl == id && evt.button == 0) ||
                 (GUIUtility.keyboardControl == id && evt.button == 2)))
            {
                rotatedStartAngle  = angle;
                rotatedAngleOffset = 0.0f;
            }

            var newPosition = UnitySceneExtensions.SceneHandles.Slider2D.Do(id, to, position, Vector3.zero, handleDir, slideDir1, slideDir2, handleSize, capFunction, axes);

            if (GUIUtility.hotControl != id)
            {
                return(angle);
            }

            rotatedAngleOffset += Utilities.GeometryMath.SignedAngle(vector, (newPosition - origin).normalized, handleDir);


            // TODO: put somewhere else
            if (!Snapping.RotateSnappingActive)
            {
                return(rotatedStartAngle + rotatedAngleOffset);
            }

            var rotateSnap   = ChiselEditorSettings.RotateSnap;
            var newAngle     = rotatedStartAngle + rotatedAngleOffset;
            var snappedAngle = (int)Mathf.Round(newAngle / rotateSnap) * rotateSnap;

            return(snappedAngle);
        }
Пример #5
0
        public override void OnSceneGUI(SceneView sceneView, Rect dragArea)
        {
            var evt = Event.current;

            switch (evt.type)
            {
            case EventType.KeyDown:
            {
                if (evt.keyCode == ChiselKeyboardDefaults.kCancelKey)
                {
                    if (GUIUtility.hotControl == 0)
                    {
                        evt.Use();
                        break;
                    }
                }
                break;
            }

            case EventType.KeyUp:
            {
                if (evt.keyCode == ChiselKeyboardDefaults.kCancelKey)
                {
                    if (GUIUtility.hotControl == 0)
                    {
                        Selection.activeTransform = null;
                        evt.Use();
                        GUIUtility.ExitGUI();     // avoids a nullreference exception in sceneview
                        break;
                    }
                }
                break;
            }
            }

            var position = Tools.handlePosition;
            var rotation = Tools.handleRotation;

            EditorGUI.BeginChangeCheck();
            var handleIDs = new SceneHandles.PositionHandleIDs();

            SceneHandles.Initialize(ref handleIDs);

            Snapping.FindCustomSnappingPointsRayMethod = FindCustomSnappingRayPoints;
            Snapping.FindCustomSnappingPointsMethod    = FindCustomSnappingPoints;
            Snapping.CustomSnappedEvent = OnCustomSnappedEvent;
            var newPosition = SceneHandles.PositionHandle(ref handleIDs, position, rotation);

            Snapping.FindCustomSnappingPointsRayMethod = null;
            Snapping.FindCustomSnappingPointsMethod    = null;
            Snapping.CustomSnappedEvent = null;
            if (EditorGUI.EndChangeCheck())
            {
                var nodes = ChiselSelectionManager.SelectedNodes;
                if (nodes == null || nodes.Count == 0)
                {
                    return;
                }
                PIvotUtility.MovePivotTo(nodes, newPosition);
            }

            if (Event.current.type == EventType.Repaint)
            {
                var handleSize = UnityEditor.HandleUtility.GetHandleSize(position);
                HandleRendering.DrawCameraAlignedCircle(position, handleSize * 0.1f, Color.white, Color.black);

                if ((handleIDs.combinedState & (ControlState.Focused | ControlState.Active)) != ControlState.None)
                {
                    var prevColor     = Handles.color;
                    var selectedColor = UnityEditor.Handles.selectedColor;
                    selectedColor.a = 0.5f;
                    Handles.color   = selectedColor;

                    //if ((handleIDs.xAxisIndirectState & (ControlState.Focused | ControlState.Active)) != ControlState.None)
                    //    HandleRendering.DrawInfiniteLine(position, Axis.X);
                    //if ((handleIDs.yAxisIndirectState & (ControlState.Focused | ControlState.Active)) != ControlState.None)
                    //    HandleRendering.DrawInfiniteLine(position, Axis.Y);
                    //if ((handleIDs.zAxisIndirectState & (ControlState.Focused | ControlState.Active)) != ControlState.None)
                    //    HandleRendering.DrawInfiniteLine(position, Axis.Z);

                    DrawCustomSnappedEvent();

                    Handles.color = prevColor;
                }
            }
        }