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