//========= Copyright 2016-2023, HTC Corporation. All rights reserved. =========== using HTC.UnityPlugin.Utility; using HTC.UnityPlugin.VRModuleManagement; using UnityEngine; namespace HTC.UnityPlugin.Vive { public interface INewPoseListener { void BeforeNewPoses(); void OnNewPoses(); void AfterNewPoses(); } /// /// To manage all NewPoseListeners /// public partial class VivePose : SingletonBehaviour { private static IndexedSet s_listeners = new IndexedSet(); [SerializeField] private bool m_dontDestroyOnLoad = false; static VivePose() { SetDefaultInitGameObjectGetter(VRModule.GetInstanceGameObject); } protected override void OnSingletonBehaviourInitialized() { if (m_dontDestroyOnLoad && transform.parent == null) { DontDestroyOnLoad(gameObject); } VRModule.onNewPoses += OnDeviceStateUpdated; } protected override void OnDestroy() { if (IsInstance) { VRModule.onNewPoses -= OnDeviceStateUpdated; } base.OnDestroy(); } public static bool AddNewPosesListener(INewPoseListener listener) { Initialize(); return s_listeners.AddUnique(listener); } public static bool RemoveNewPosesListener(INewPoseListener listener) { return s_listeners.Remove(listener); } private void OnDeviceStateUpdated() { var tempListeners = ListPool.Get(); tempListeners.AddRange(s_listeners); for (int i = tempListeners.Count - 1; i >= 0; --i) { tempListeners[i].BeforeNewPoses(); } for (int i = tempListeners.Count - 1; i >= 0; --i) { tempListeners[i].OnNewPoses(); } for (int i = tempListeners.Count - 1; i >= 0; --i) { tempListeners[i].AfterNewPoses(); } ListPool.Release(tempListeners); } } }