// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. using System; using System.Collections.Generic; using HoloToolkit.Unity.InputModule; using UnityEngine; namespace HoloToolkit.Unity { public class SolverHandler : ControllerFinder { public enum TrackedObjectToReferenceEnum { /// <summary> /// Calculates position and orientation from the main camera /// </summary> Head, /// <summary> /// Calculates position and orientation from the left motion controller /// </summary> MotionControllerLeft, /// <summary> /// Calculates position and orientation from the right motion camera /// </summary> MotionControllerRight } [SerializeField] [Tooltip("Tracked object to calculate position and orientation from. If you want to manually override and use a scene object, use the TransformTarget field")] private TrackedObjectToReferenceEnum trackedObjectToReference = TrackedObjectToReferenceEnum.Head; public TrackedObjectToReferenceEnum TrackedObjectToReference { get { return trackedObjectToReference; } set { trackedObjectToReference = value; } } [SerializeField] [Tooltip("Manual override for TrackedObjectToReference if you want to use a scene object. Leave empty if you want to use Head or Motion controllers")] private Transform transformTarget; public Transform TransformTarget { get { return transformTarget; } set { transformTarget = value; } } public Vector3 GoalPosition { get; set; } public Quaternion GoalRotation { get; set; } public Vector3 GoalScale { get; set; } public Vector3Smoothed AltScale { get; set; } public float DeltaTime { get; set; } private float LastUpdateTime { get; set; } private List<Solver> m_Solvers = new List<Solver>(); private void Awake() { m_Solvers.AddRange(GetComponents<Solver>()); GoalScale = Vector3.one; AltScale = new Vector3Smoothed(Vector3.one, 0.1f); DeltaTime = 0.0f; } private void Update() { DeltaTime = Time.realtimeSinceStartup - LastUpdateTime; LastUpdateTime = Time.realtimeSinceStartup; } private void LateUpdate() { for (int i = 0; i < m_Solvers.Count; ++i) { Solver solver = m_Solvers[i]; if (solver.enabled) { solver.SolverUpdate(); } } } [Serializable] public struct Vector3Smoothed { public Vector3 Current { get; set; } public Vector3 Goal { get; set; } public float SmoothTime { get; set; } public Vector3Smoothed(Vector3 value, float smoothingTime) : this() { Current = value; Goal = value; SmoothTime = smoothingTime; } public void Update(float deltaTime) { Current = Vector3.Lerp(Current, Goal, (Math.Abs(SmoothTime) < Mathf.Epsilon) ? 1.0f : deltaTime / SmoothTime); } public void SetGoal(Vector3 newGoal) { Goal = newGoal; } } [Serializable] public struct QuaternionSmoothed { public Quaternion Current { get; set; } public Quaternion Goal { get; set; } public float SmoothTime { get; set; } public QuaternionSmoothed(Quaternion value, float smoothingTime) : this() { Current = value; Goal = value; SmoothTime = smoothingTime; } public void Update(float deltaTime) { Current = Quaternion.Slerp(Current, Goal, (Math.Abs(SmoothTime) < Mathf.Epsilon) ? 1.0f : deltaTime / SmoothTime); } public void SetGoal(Quaternion newGoal) { Goal = newGoal; } } } }