zed-ar-headfree-passthrough/Assets/ZED/SDK/Helpers/Scripts/Utilities/GUIMessage.cs

398 lines
16 KiB
C#

//======= Copyright (c) Stereolabs Corporation, All rights reserved. ===============
using UnityEngine;
using UnityEngine.VR;
/// <summary>
/// Controls the message displayed as the zed is initialized, and if it becomes disconnected.
/// Needs to be pre-attached to the ZED rig to work; not added in programmatically.
/// </summary><remarks>
/// There are separate text elements for the mono view and the stereo view to account for the
/// difference in display resolutions. 'Mono' elements are displayed in a 'Screen Space - Overlay'
/// canvas, and 'Stereo' elements in a 'Screen Space - Camera' canvas.
/// </remarks>
public class GUIMessage : MonoBehaviour
{
/// <summary>
/// Text under the loading sign for the mono rig ("Loading...", "Camera is not detected", etc.)
/// </summary>
private UnityEngine.UI.Text textmono;
/// <summary>
/// Text under the loading sign for stereo rig's left eye ("Loading...", "Camera is not detected", etc.)
/// </summary>
private UnityEngine.UI.Text textleft;
/// <summary>
/// Text under the loading sign for stereo rig's right eye ("Loading...", "Camera is not detected", etc.)
/// </summary>
private UnityEngine.UI.Text textright;
/// <summary>
/// Flag set to true when the ZED is finished initializing.
/// Starts a timer to wait for the ZED's textures to be loaded.
/// </summary>
private bool ready = false;
/// <summary>
/// Warning container for the mono rig. Contains the text, background, and loading graphic.
/// </summary>
private GameObject warningmono;
/// <summary>
/// Warning container for the stereo rig's left eye. Contains the text, background, and loading graphic.
/// </summary>
private GameObject warningleft;
/// <summary>
/// Warning container for the stereo rig's right eye. Contains the text, background, and loading graphic.
/// </summary>
private GameObject warningright;
/// <summary>
/// Timer used to add a 0.5 second delay between the ZED being initialized and the message disappearing.
/// This is done to let the ZED textures to finish being made.
/// </summary>
private float timerWarning = 0.0f;
/// <summary>
/// If true, stops calling most of the logic in Update() which updates the canvas elements.
/// Called once the ZED is ready and all elements have been properly disabled.
/// </summary>
private bool init = false;
/// <summary>
/// Timer used to delay clearing the text by 0.2 seconds once the camera is initialized.
/// </summary>
private float timer;
/// <summary>
/// Reference to the loading spinner animation for the mono rig.
/// </summary>
private GameObject imagemono;
/// <summary>
/// Reference to the loading spinner animation for the stereo rig's left eye.
/// </summary>
private GameObject imageleft;
/// <summary>
/// Reference to the loading spinner animation for the stereo rig's right eye.
/// </summary>
private GameObject imageright;
/// <summary>
/// Opening status given during the ZED's last attempt to initialize.
/// Used to check if an error has gone on for more than one frame before changing text.
/// </summary>
private sl.ERROR_CODE oldInitStatus;
/// <summary>
/// The zed manager.
/// </summary>
private ZEDManager zedManager;
/// <summary>
/// Creates canvas(es) and canvas elements depending on whether the ZED rig is mono (ZED_Rig_Mono)
/// or stereo (ZED_Rig_Stereo).
/// </summary>
private void Awake()
{
zedManager = GetComponent<ZEDManager>();
oldInitStatus = sl.ERROR_CODE.ERROR_CODE_LAST;
if (!zedManager.IsStereoRig) //Without VR, we use a Screen Space - Overlay canvas.
{
//Instantiate the mono warning prefab and set basic settings for it.
warningmono = Instantiate(Resources.Load("PrefabsUI/Warning") as GameObject, transform);
warningmono.SetActive(true);
warningmono.GetComponent<Canvas>().renderMode = RenderMode.ScreenSpaceCamera;
//Set the target camera to whichever mono camera in the rig has the highest depth.
Camera highestdepthzedcam = zedManager.GetLeftCamera();
if (zedManager.GetRightCamera() != null && (highestdepthzedcam == null || zedManager.GetRightCamera().depth > highestdepthzedcam.depth))
{
highestdepthzedcam = zedManager.GetRightCamera();
}
warningmono.GetComponent<Canvas>().worldCamera = highestdepthzedcam;
textmono = warningmono.GetComponentInChildren<UnityEngine.UI.Text>();
textmono.color = Color.white;
if (!sl.ZEDCamera.CheckPlugin())
{
textmono.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.SDK_NOT_INSTALLED);
}
imagemono = warningmono.transform.GetChild(0).GetChild(1).gameObject;
imagemono.transform.parent.gameObject.SetActive(true);
ready = false;
}
else //In VR, we use two Screen Space - Camera canvases, one for each eye.
{
//Instantiate the left warning prefab and set basic settings for it.
warningleft = Instantiate(Resources.Load("PrefabsUI/Warning_VR") as GameObject, zedManager.GetLeftCameraTransform());
warningleft.SetActive(true);
warningleft.GetComponent<Canvas>().worldCamera = zedManager.GetLeftCamera();
warningleft.GetComponent<Canvas>().planeDistance = 1;
textleft = warningleft.GetComponentInChildren<UnityEngine.UI.Text>();
textleft.color = Color.white;
imageleft = warningleft.transform.GetChild(0).GetChild(1).gameObject;
imageleft.transform.parent.gameObject.SetActive(true);
//Instantiate the right warning prefab and set basic settings for it.
warningright = Instantiate(Resources.Load("PrefabsUI/Warning_VR") as GameObject, zedManager.GetRightCameraTransform());
warningright.SetActive(true);
warningright.GetComponent<Canvas>().worldCamera = zedManager.GetRightCamera();
warningright.GetComponent<Canvas>().planeDistance = 1;
textright = warningright.GetComponentInChildren<UnityEngine.UI.Text>();
textright.color = Color.white;
imageright = warningright.transform.GetChild(0).GetChild(1).gameObject;
imageright.transform.parent.gameObject.SetActive(true);
if (!sl.ZEDCamera.CheckPlugin()) //Warn the use there's no SDK installed.
{
textleft.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.SDK_NOT_INSTALLED);
textright.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.SDK_NOT_INSTALLED);
}
ready = false;
}
}
/// <summary>
/// Subscribe to OnZedReady and OnZEDDisconnected events.
/// </summary>
private void OnEnable()
{
zedManager.OnZEDReady += Ready;
zedManager.OnZEDDisconnected += ZEDDisconnected;
}
/// <summary>
/// Unsubscribe from OnZedReady and OnZEDDisconnected events.
/// </summary>
private void OnDisable()
{
zedManager.OnZEDReady -= Ready;
zedManager.OnZEDDisconnected -= ZEDDisconnected;
}
/// <summary>
/// Re-enable canvas elements and change message when ZED is disconnected.
/// GameObjects were disabled before because the ZED had to have finished initializing before.
/// </summary>
void ZEDDisconnected()
{
if (warningmono) //Using the mono rig.
{
warningmono.SetActive(true);
imagemono.SetActive(true);
warningmono.transform.GetChild(0).gameObject.SetActive(true);
textmono.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.ZED_IS_DISCONNECETD);
warningmono.layer = 30;
ready = false;
}
if (warningleft) //Using the stereo rig.
{
warningleft.SetActive(true);
imageleft.SetActive(true);
warningleft.transform.GetChild(0).gameObject.SetActive(true);
textleft.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.ZED_IS_DISCONNECETD);
warningleft.layer = 30;
warningright.SetActive(true);
imageright.SetActive(true);
warningright.transform.GetChild(0).gameObject.SetActive(true);
textright.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.ZED_IS_DISCONNECETD);
warningright.layer = 30;
ready = false;
}
}
/// <summary>
/// If visible, print the loading status of the ZED, including relevant errors.
/// </summary>
void Update()
{
if (!init) //This check will pass until 0.5 seconds after the ZED is done initializing.
{
sl.ERROR_CODE e = zedManager.LastInitStatus;
if (e == sl.ERROR_CODE.SUCCESS) //Last initialization attempt was successful.
{
if (!ready)
{
if (textmono)
{
textmono.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.SDK_MODULE_LOADING);
}
else if (textleft)
{
textleft.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.SDK_MODULE_LOADING);
textright.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.SDK_MODULE_LOADING);
}
}
else
{
timer += Time.deltaTime; //Clear text after a short delay.
if (timer > 0.2f)
{
if (textmono)
{
textmono.text = "";
}
else if (textleft)
{
textleft.text = "";
textright.text = "";
}
}
if (imagemono)
{ //Disable mono rig canvas.
imagemono.gameObject.SetActive(false);
}
else if (imageleft)
{ //Disable stereo rig canvases.
imageleft.gameObject.SetActive(false);
imageright.gameObject.SetActive(false);
}
}
}
else if (e == sl.ERROR_CODE.ERROR_CODE_LAST) //"Loading..."
{
//Initial error code set before an initialization attempt has returned successful or failed.
//In short, it means it's still loading.
if (textmono)
{
textmono.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.CAMERA_LOADING);
}
else if (textleft)
{
textleft.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.CAMERA_LOADING);
textright.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.CAMERA_LOADING);
}
}
else if (e == sl.ERROR_CODE.CAMERA_NOT_DETECTED && oldInitStatus == sl.ERROR_CODE.CAMERA_NOT_DETECTED) //"Camera not detected"
{
if (textmono)
{
textmono.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.UNABLE_TO_OPEN_CAMERA);
}
else if (textleft)
{
textleft.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.UNABLE_TO_OPEN_CAMERA);
textright.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.UNABLE_TO_OPEN_CAMERA);
}
}
else if (e == sl.ERROR_CODE.CAMERA_DETECTION_ISSUE && oldInitStatus == sl.ERROR_CODE.CAMERA_DETECTION_ISSUE) //"Unable to open camera"
{
if (textmono)
{
textmono.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.CAMERA_DETECTION_ISSUE);
}
else if (textleft)
{
textleft.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.CAMERA_DETECTION_ISSUE);
textright.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.CAMERA_DETECTION_ISSUE);
}
}
else if (e == sl.ERROR_CODE.SENSOR_NOT_DETECTED && oldInitStatus == sl.ERROR_CODE.SENSOR_NOT_DETECTED) //"Camera motion sensor not detected"
{
if (textmono)
{
textmono.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.SENSOR_NOT_DETECTED);
}
else if (textleft)
{
textleft.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.SENSOR_NOT_DETECTED);
textright.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.SENSOR_NOT_DETECTED);
}
}
else if (e == sl.ERROR_CODE.LOW_USB_BANDWIDTH && oldInitStatus == sl.ERROR_CODE.LOW_USB_BANDWIDTH)//"Low USB bandwidth"
{
if (textmono)
{
textmono.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.LOW_USB_BANDWIDTH);
}
else if (textleft)
{
textleft.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.LOW_USB_BANDWIDTH);
textright.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.LOW_USB_BANDWIDTH);
}
}
else if (e == sl.ERROR_CODE.INVALID_SVO_FILE && oldInitStatus == sl.ERROR_CODE.INVALID_SVO_FILE)
{
if (textmono)
{
textmono.text = "Invalid SVO File/Path";
}
else if (textleft)
{
textleft.text = "Invalid SVO File/Path";
textright.text = "Invalid SVO File/Path";
}
}
else if (e == oldInitStatus)
{
if (textmono)
{
textmono.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.CAMERA_NOT_INITIALIZED);
}
else if (textleft)
{
textleft.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.CAMERA_NOT_INITIALIZED);
textright.text = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.CAMERA_NOT_INITIALIZED);
}
}
oldInitStatus = e;
}
if (ready) //ZED has finished initializing. Set a timer, then disable texts after it expires.
{
timerWarning += Time.deltaTime;
if (timerWarning > 0.5f)
{
if (warningmono)
{
warningmono.SetActive(false);
}
else if (warningleft)
{
warningleft.SetActive(false);
warningright.SetActive(false);
}
}
init = true; //Prevents logic above the if (ready) check from running each frame.
if (imagemono)
{
imagemono.gameObject.transform.parent.gameObject.SetActive(false);
}
else if (imageleft)
{
imageleft.gameObject.transform.parent.gameObject.SetActive(false);
imageright.gameObject.transform.parent.gameObject.SetActive(false);
}
}
}
/// <summary>
/// Set a flag to run timer and disable text. Called by ZEDManager.OnZEDReady when ZED finishes initializing.
/// </summary>
private void Ready()
{
ready = true;
}
}