SW 중심대학 OSS GIT 서버 박건태, 이승준, 고기완, 이준호 새로운 배포
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

126 lines
4.1 KiB

#if ARGPS_USE_VUFORIA
using Logger = ARLocation.Utils.Logger;
using System;
using Vuforia;
namespace ARLocation.Session
{
public class VuforiaSessionManager : IARSessionManager
{
private PositionalDeviceTracker positionalDeviceTracker;
private string sessionInfoString;
private bool trackingStarted;
private Action trackingStartedCallback;
private Action onAfterReset;
private Action trackingRestoredCallback;
private TrackableBehaviour.Status currentStatus = TrackableBehaviour.Status.NO_POSE;
private Action trackingLostCallback;
public bool DebugMode { get; set; }
public VuforiaSessionManager()
{
positionalDeviceTracker = TrackerManager.Instance.GetTracker<PositionalDeviceTracker>();
if (positionalDeviceTracker == null)
{
sessionInfoString = "NO POSITIONAL TRACKER";
}
VuforiaARController.Instance.RegisterVuforiaStartedCallback(OnVuforiaStarted);
VuforiaARController.Instance.RegisterOnPauseCallback(OnVuforiaPaused);
DeviceTrackerARController.Instance.RegisterTrackerStartedCallback(OnTrackerStarted);
DeviceTrackerARController.Instance.RegisterDevicePoseStatusChangedCallback(OnDevicePoseStatusChanged);
}
private void OnDevicePoseStatusChanged(TrackableBehaviour.Status arg1, TrackableBehaviour.StatusInfo arg2)
{
sessionInfoString = $"OnDevicePoseStatusChanged: {arg1} - {arg2}";
Logger.LogFromMethod("VuforiaSessionManager", "OnDevicePoseStatusChanged", sessionInfoString, DebugMode);
if (arg1 != TrackableBehaviour.Status.NO_POSE)
{
if (!trackingStarted)
{
trackingStarted = true;
Logger.LogFromMethod("VuforiaSessionManager", "OnDevicePoseStatusChanged", "Tracking Started!.", DebugMode);
trackingStartedCallback?.Invoke();
}
else if (currentStatus == TrackableBehaviour.Status.NO_POSE)
{
Logger.LogFromMethod("VuforiaSessionManager", "OnDevicePoseStatusChanged", "Tracking Restored!", DebugMode);
trackingRestoredCallback?.Invoke();
}
if (onAfterReset != null)
{
Logger.LogFromMethod("VuforiaSessionManager", "OnDevicePoseStatusChanged", "Emitting 'OnAfterReset' event.", DebugMode);
onAfterReset.Invoke();
onAfterReset = null;
}
}
else if (currentStatus != TrackableBehaviour.Status.NO_POSE)
{
Logger.LogFromMethod("VuforiaSessionManager", "OnDevicePoseStatusChanged", "Tracking Lost!", DebugMode);
trackingLostCallback?.Invoke();
}
currentStatus = arg1;
}
private void OnTrackerStarted()
{
sessionInfoString = $"OnTrackerStarted";
}
private void OnVuforiaPaused(bool obj)
{
sessionInfoString = $"OnVuforiaPaused";
}
private void OnVuforiaStarted()
{
sessionInfoString = $"OnVuforiaStarted";
}
public void Reset(Action callback)
{
positionalDeviceTracker?.Reset();
onAfterReset += callback;
}
public string GetSessionInfoString()
{
return sessionInfoString;
}
public string GetProviderString()
{
return "Vuforia (" + VuforiaUnity.GetVuforiaLibraryVersion() + ")";
}
public void OnARTrackingStarted(Action callback)
{
if (trackingStarted)
{
callback?.Invoke();
return;
}
trackingStartedCallback += callback;
}
public void OnARTrackingRestored(Action callback)
{
trackingRestoredCallback += callback;
}
public void OnARTrackingLost(Action callback)
{
trackingLostCallback += callback;
}
}
}
#endif