#if UNITY_5_4_OR_NEWER || (UNITY_5 && !UNITY_5_0)
#define UNITY_HELPATTRIB
#endif
using UnityEngine;
//-----------------------------------------------------------------------------
// Copyright 2015-2018 RenderHeads Ltd. All rights reserverd.
//-----------------------------------------------------------------------------
namespace RenderHeads.Media.AVProVideo
{
///
/// This script is needed to send the camera position to the stereo shader so that
/// it can determine which eye it is rendering. In the future this script won't
/// be needed once we have support for single-pass stereo rendering.
///
[AddComponentMenu("AVPro Video/Update Stereo Material", 400)]
#if UNITY_HELPATTRIB
[HelpURL("http://renderheads.com/product/avpro-video/")]
#endif
public class UpdateStereoMaterial : MonoBehaviour
{
[Header("Stereo camera")]
public Camera _camera;
[Header("Rendering elements")]
public MeshRenderer _renderer;
public UnityEngine.UI.Graphic _uGuiComponent;
public Material _material;
[SerializeField]
private StereoEye _forceEyeMode;
private static int _cameraPositionId;
private static int _viewMatrixId;
private StereoEye _setForceEyeMode = StereoEye.Both;
public StereoEye ForceEyeMode { get { return _forceEyeMode; } set { _forceEyeMode = value; } }
void Awake()
{
if (_cameraPositionId == 0)
{
_cameraPositionId = Shader.PropertyToID("_cameraPosition");
}
if (_viewMatrixId == 0)
{
_viewMatrixId = Shader.PropertyToID("_ViewMatrix");
}
if (_camera == null)
{
Debug.LogWarning("[AVProVideo] No camera set for UpdateStereoMaterial component. If you are rendering in stereo then it is recommended to set this.");
}
}
private void SetupMaterial(Material m, Camera camera)
{
m.SetVector(_cameraPositionId, camera.transform.position);
m.SetMatrix(_viewMatrixId, camera.worldToCameraMatrix.transpose);
if (_forceEyeMode != _setForceEyeMode)
{
Helper.SetupStereoEyeModeMaterial(m, _forceEyeMode);
_setForceEyeMode = _forceEyeMode;
}
}
// We do a LateUpdate() to allow for any changes in the camera position that may have happened in Update()
private void LateUpdate()
{
Camera camera = _camera;
if (camera == null)
{
camera = Camera.main;
}
if (_renderer == null && _material == null)
{
_renderer = this.gameObject.GetComponent();
}
if (camera != null)
{
if (_renderer != null)
{
SetupMaterial(_renderer.material, camera);
}
if (_material != null)
{
SetupMaterial(_material, camera);
}
if (_uGuiComponent != null)
{
SetupMaterial(_uGuiComponent.material, camera);
}
}
}
}
}