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); }
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); }
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; } } }