// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using Microsoft.MixedReality.Toolkit.Utilities;
using UnityEngine;
namespace Microsoft.MixedReality.Toolkit.UI
{
///
/// Add to any Object to spawn ToolTips on tap or on focus, according to preference
/// Applies its follow settings to the spawned ToolTip's ToolTipConnector component
///
[AddComponentMenu("Scripts/MRTK/SDK/ToolTipSpawner")]
public class ToolTipSpawner : PrefabSpawner
{
private enum SettingsMode
{
UseDefaults = 0,
Override
}
[Header("ToolTip Override Settings")]
[Tooltip("Prefab's settings will be used unless this is set to Override")]
[SerializeField]
private SettingsMode settingsMode = SettingsMode.UseDefaults;
[SerializeField]
private bool showBackground = true;
[SerializeField]
private bool showOutline = false;
[SerializeField]
private bool showConnector = true;
[SerializeField]
private ConnectorFollowType followType = ConnectorFollowType.AnchorOnly;
[SerializeField]
private ConnectorPivotMode pivotMode = ConnectorPivotMode.Manual;
[SerializeField]
private ConnectorPivotDirection pivotDirection = ConnectorPivotDirection.North;
[SerializeField]
private ConnectorOrientType pivotDirectionOrient = ConnectorOrientType.OrientToObject;
[SerializeField]
private Vector3 manualPivotDirection = Vector3.up;
[SerializeField]
private Vector3 manualPivotLocalPosition = Vector3.up;
[SerializeField]
[Range(0f, 2f)]
private float pivotDistance = 0.25f;
[SerializeField]
private string toolTipText = "New Tooltip";
[SerializeField]
private Transform anchor = null;
protected override void SpawnableActivated(GameObject spawnable)
{
var toolTip = spawnable.GetComponent();
toolTip.ToolTipText = toolTipText;
var connector = toolTip.GetComponent();
connector.Target = (anchor != null) ? anchor.gameObject : gameObject;
switch (settingsMode)
{
case SettingsMode.UseDefaults:
break;
case SettingsMode.Override:
toolTip.ShowBackground = showBackground;
toolTip.ShowHighlight = showOutline;
toolTip.ShowConnector = showConnector;
connector.PivotDirection = pivotDirection;
connector.PivotDistance = pivotDistance;
connector.PivotDirectionOrient = pivotDirectionOrient;
connector.ManualPivotLocalPosition = manualPivotLocalPosition;
connector.ManualPivotDirection = manualPivotDirection;
connector.ConnectorFollowingType = followType;
connector.PivotMode = pivotMode;
if (connector.PivotMode == ConnectorPivotMode.Manual)
{
toolTip.PivotPosition = transform.TransformPoint(manualPivotLocalPosition);
}
break;
}
}
#if UNITY_EDITOR
private void OnDrawGizmos()
{
if (Application.isPlaying) { return; }
if (prefab == null) { return; }
if (gameObject == UnityEditor.Selection.activeGameObject)
{
Gizmos.color = Color.cyan;
Transform relativeTo = null;
ConnectorFollowType followType = this.followType;
ConnectorOrientType pivotDirectionOrient = this.pivotDirectionOrient;
ConnectorPivotDirection pivotDirection = this.pivotDirection;
ConnectorPivotMode pivotMode = this.pivotMode;
Vector3 manualPivotDirection = this.manualPivotDirection;
Vector3 manualPivotLocalPosition = this.manualPivotLocalPosition;
float pivotDistance = this.pivotDistance;
switch (settingsMode)
{
case SettingsMode.UseDefaults:
ToolTipConnector connector = prefab.GetComponent();
followType = connector.ConnectorFollowingType;
pivotDirectionOrient = connector.PivotDirectionOrient;
pivotDirection = connector.PivotDirection;
pivotMode = connector.PivotMode;
manualPivotDirection = connector.ManualPivotDirection;
manualPivotLocalPosition = connector.ManualPivotLocalPosition;
pivotDistance = connector.PivotDistance;
break;
}
switch (pivotDirectionOrient)
{
case ConnectorOrientType.OrientToCamera:
relativeTo = CameraCache.Main.transform;
break;
case ConnectorOrientType.OrientToObject:
relativeTo = (anchor != null) ? anchor.transform : transform;
break;
}
Vector3 targetPosition = (anchor != null) ? anchor.transform.position : transform.position;
switch (followType)
{
case ConnectorFollowType.AnchorOnly:
Gizmos.DrawLine(targetPosition, transform.TransformPoint(manualPivotLocalPosition));
Gizmos.DrawWireCube(transform.TransformPoint(manualPivotLocalPosition), Vector3.one * 0.05f);
break;
case ConnectorFollowType.Position:
case ConnectorFollowType.PositionAndXYRotation:
case ConnectorFollowType.PositionAndYRotation:
if (pivotMode == ConnectorPivotMode.Automatic)
{
Vector3 toolTipPosition = targetPosition + ToolTipConnector.GetDirectionFromPivotDirection(
pivotDirection,
manualPivotDirection,
relativeTo) * pivotDistance;
Gizmos.DrawLine(targetPosition, toolTipPosition);
Gizmos.DrawWireCube(toolTipPosition, Vector3.one * 0.05f);
}
else
{
Vector3 toolTipPosition = transform.TransformPoint(manualPivotLocalPosition);
Gizmos.DrawLine(targetPosition, toolTipPosition);
Gizmos.DrawWireCube(toolTipPosition, Vector3.one * 0.05f);
}
break;
}
}
}
#endif // UNITY_EDITOR
}
}