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