// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using UnityEngine;
using UnityEngine.Events;
namespace Microsoft.MixedReality.Toolkit.UI.BoundsControl
{
///
/// Configuration base class for any handle type deriving from
///
public abstract class HandlesBaseConfiguration : ScriptableObject
{
[SerializeField]
[Tooltip("Material applied to handles when they are not in a grabbed state")]
private Material handleMaterial;
///
/// Material applied to handles when they are not in a grabbed state
///
public Material HandleMaterial
{
get { return handleMaterial; }
set
{
if (handleMaterial != value)
{
handleMaterial = value;
TrySetDefaultMaterial();
handlesChanged.Invoke(HandlesChangedEventType.Material);
}
}
}
[SerializeField]
[Tooltip("Material applied to handles while they are a grabbed")]
private Material handleGrabbedMaterial;
///
/// Material applied to handles while they are a grabbed
///
public Material HandleGrabbedMaterial
{
get { return handleGrabbedMaterial; }
set
{
if (handleGrabbedMaterial != value)
{
handleGrabbedMaterial = value;
TrySetDefaultMaterial();
handlesChanged.Invoke(HandlesChangedEventType.MaterialGrabbed);
}
}
}
[SerializeField]
[Tooltip("Prefab used to display this type of bounds control handle. If not set, default shape will be used (scale default: boxes, rotation default: spheres)")]
GameObject handlePrefab = null;
///
/// Prefab used to display this type of bounds control handle. If not set, default shape will be used (scale default: boxes, rotation default: spheres)
///
public GameObject HandlePrefab
{
get { return handlePrefab; }
set
{
if (handlePrefab != value)
{
handlePrefab = value;
handlesChanged.Invoke(HandlesChangedEventType.Prefab);
}
}
}
[SerializeField]
[Tooltip("Size of the handle collidable")]
private float handleSize = 0.016f; // 1.6cm default handle size
///
/// Size of the handle collidable
///
public float HandleSize
{
get { return handleSize; }
set
{
if (handleSize != value)
{
handleSize = value;
handlesChanged.Invoke(HandlesChangedEventType.ColliderSize);
}
}
}
[SerializeField]
[Tooltip("Additional padding to apply to the handle collider to make handle easier to hit")]
private Vector3 colliderPadding = new Vector3(0.016f, 0.016f, 0.016f);
///
/// Additional padding to apply to the handle collider to make handle easier to hit
///
public Vector3 ColliderPadding
{
get { return colliderPadding; }
set
{
if (colliderPadding != value)
{
colliderPadding = value;
handlesChanged.Invoke(HandlesChangedEventType.ColliderPadding);
}
}
}
[SerializeField]
[Tooltip("Check to draw a tether point from the handles to the hand when manipulating.")]
private bool drawTetherWhenManipulating = true;
///
/// Check to draw a tether point from the handles to the hand when manipulating.
///
public bool DrawTetherWhenManipulating
{
get => drawTetherWhenManipulating;
set
{
if (value != drawTetherWhenManipulating)
{
drawTetherWhenManipulating = value;
handlesChanged.Invoke(HandlesChangedEventType.ManipulationTether);
}
}
}
[SerializeField]
[Tooltip("Add a Collider here if you do not want the handle colliders to interact with another object's collider.")]
private Collider handlesIgnoreCollider = null;
///
/// Add a Collider here if you do not want the handle colliders to interact with another object's collider.
///
public Collider HandlesIgnoreCollider
{
get => handlesIgnoreCollider;
set
{
if (value != handlesIgnoreCollider)
{
handlesChanged.Invoke(HandlesChangedEventType.IgnoreColliderRemove);
handlesIgnoreCollider = value;
handlesChanged.Invoke(HandlesChangedEventType.IgnoreColliderAdd);
}
}
}
internal enum HandlesChangedEventType
{
Material,
MaterialGrabbed,
Prefab,
ColliderSize,
ColliderPadding,
ManipulationTether,
IgnoreColliderRemove,
IgnoreColliderAdd,
Visibility
}
internal class HandlesChangedEvent : UnityEvent { }
internal HandlesChangedEvent handlesChanged = new HandlesChangedEvent();
private void Awake()
{
TrySetDefaultMaterial();
}
internal protected void TrySetDefaultMaterial()
{
if (handleMaterial == null)
{
handleMaterial = VisualUtils.CreateDefaultMaterial();
}
if (handleGrabbedMaterial == null && handleGrabbedMaterial != handleMaterial)
{
handleGrabbedMaterial = VisualUtils.CreateDefaultMaterial();
}
}
}
}