// local function that draws label and guide lines, and returns true if a handle has been dragged static bool IsHandleDragged (int handleMinId, int handleMaxId, Vector3 labelPos, string text, Vector3 lineStart, Vector3 lineEnd) { bool handleIsDragged; bool handleIsDraggedOrHovered; if (handleMinId == handleMaxId) { handleIsDragged = GUIUtility.hotControl == handleMinId; handleIsDraggedOrHovered = handleIsDragged || HandleUtility.nearestControl == handleMinId; } else { handleIsDragged = handleMinId < GUIUtility.hotControl && GUIUtility.hotControl < handleMaxId; handleIsDraggedOrHovered = handleIsDragged || (handleMinId < HandleUtility.nearestControl && HandleUtility.nearestControl < handleMaxId); } if (handleIsDraggedOrHovered) { CinemachineSceneToolHelpers.DrawLabel(labelPos, text); } Handles.color = handleIsDraggedOrHovered ? Handles.selectedColor : CinemachineSceneToolHelpers.HelperLineDefaultColor; Handles.DrawLine(lineStart, lineEnd, CinemachineSceneToolHelpers.LineThickness); return(handleIsDragged); }
void DrawSceneTools() { var framingTransposer = Target; if (framingTransposer == null || !framingTransposer.IsValid) { return; } if (CinemachineSceneToolUtility.IsToolActive(typeof(TrackedObjectOffsetTool))) { CinemachineSceneToolHelpers.TrackedObjectOffsetTool(framingTransposer, new SerializedObject(framingTransposer).FindProperty(() => framingTransposer.m_TrackedObjectOffset)); } else if (CinemachineSceneToolUtility.IsToolActive(typeof(FollowOffsetTool))) { var originalColor = Handles.color; var camPos = framingTransposer.VcamState.RawPosition; var targetForward = framingTransposer.VirtualCamera.State.FinalOrientation * Vector3.forward; EditorGUI.BeginChangeCheck(); Handles.color = CinemachineSceneToolHelpers.HelperLineDefaultColor; var cdHandleId = GUIUtility.GetControlID(FocusType.Passive); var newHandlePosition = Handles.Slider(cdHandleId, camPos, targetForward, CinemachineSceneToolHelpers.CubeHandleCapSize(camPos), Handles.CubeHandleCap, 0.5f); if (EditorGUI.EndChangeCheck()) { // Modify via SerializedProperty for OnValidate to get called automatically, and scene repainting too var so = new SerializedObject(framingTransposer); var prop = so.FindProperty(() => framingTransposer.m_CameraDistance); prop.floatValue -= CinemachineSceneToolHelpers.SliderHandleDelta(newHandlePosition, camPos, targetForward); so.ApplyModifiedProperties(); } var cameraDistanceHandleIsDragged = GUIUtility.hotControl == cdHandleId; var cameraDistanceHandleIsUsedOrHovered = cameraDistanceHandleIsDragged || HandleUtility.nearestControl == cdHandleId; if (cameraDistanceHandleIsUsedOrHovered) { CinemachineSceneToolHelpers.DrawLabel(camPos, "Camera Distance (" + framingTransposer.m_CameraDistance.ToString("F1") + ")"); } Handles.color = cameraDistanceHandleIsUsedOrHovered ? Handles.selectedColor : CinemachineSceneToolHelpers.HelperLineDefaultColor; Handles.DrawLine(camPos, framingTransposer.FollowTarget.position + framingTransposer.m_TrackedObjectOffset); CinemachineSceneToolHelpers.SoloOnDrag(cameraDistanceHandleIsDragged, framingTransposer.VirtualCamera, cdHandleId); Handles.color = originalColor; } }