#if UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_5 #define UNITY_FEATURE_UGUI #endif using System.Collections.Generic; using UnityEngine.Serialization; #if UNITY_FEATURE_UGUI using UnityEngine; using UnityEngine.UI; //----------------------------------------------------------------------------- // Copyright 2015-2016 RenderHeads Ltd. All rights reserverd. //----------------------------------------------------------------------------- namespace RenderHeads.Media.AVProVideo { [AddComponentMenu("AVPro Video/Display uGUI")] public class DisplayUGUI : UnityEngine.UI.MaskableGraphic { [SerializeField] public MediaPlayer _mediaPlayer; [SerializeField] public Rect m_UVRect = new Rect(0f, 0f, 1f, 1f); [SerializeField] public bool _setNativeSize = false; [SerializeField] public bool _keepAspectRatio = true; [SerializeField] public bool _noDefaultDisplay = true; [SerializeField] public Texture _defaultTexture; private int _lastWidth; private int _lastHeight; private Texture _lastTexture; /// /// Returns the texture used to draw this Graphic. /// public override Texture mainTexture { get { Texture result = Texture2D.whiteTexture; if (HasValidTexture()) { result = _mediaPlayer.TextureProducer.GetTexture(); } else { if (_noDefaultDisplay) { result = null; } else if (_defaultTexture != null) { result = _defaultTexture; } } return result; } } public bool HasValidTexture() { return (_mediaPlayer != null && _mediaPlayer.TextureProducer != null && _mediaPlayer.TextureProducer.GetTexture() != null); } void Update() { if (_setNativeSize) { SetNativeSize(); } if (_lastTexture != mainTexture) { _lastTexture = mainTexture; SetVerticesDirty(); } if (HasValidTexture()) { if (mainTexture != null) { if (mainTexture.width != _lastWidth || mainTexture.height != _lastHeight) { _lastWidth = mainTexture.width; _lastHeight = mainTexture.height; SetVerticesDirty(); } } } SetMaterialDirty(); } /// /// Texture to be used. /// public MediaPlayer CurrentMediaPlayer { get { return _mediaPlayer; } set { if (_mediaPlayer != value) { _mediaPlayer = value; //SetVerticesDirty(); SetMaterialDirty(); } } } /// /// UV rectangle used by the texture. /// public Rect uvRect { get { return m_UVRect; } set { if (m_UVRect == value) { return; } m_UVRect = value; SetVerticesDirty(); } } /// /// Adjust the scale of the Graphic to make it pixel-perfect. /// [ContextMenu("Set Native Size")] public override void SetNativeSize() { Texture tex = mainTexture; if (tex != null) { int w = Mathf.RoundToInt(tex.width * uvRect.width); int h = Mathf.RoundToInt(tex.height * uvRect.height); rectTransform.anchorMax = rectTransform.anchorMin; rectTransform.sizeDelta = new Vector2(w, h); } } /// /// Update all renderer data. /// // OnFillVBO deprecated by 5.2 // OnPopulateMesh(Mesh mesh) deprecated by 5.2 patch 1 #if UNITY_5 && !UNITY_5_0 && !UNITY_5_1 && !UNITY_5_2_0 /* protected override void OnPopulateMesh(Mesh mesh) { List verts = new List(); _OnFillVBO( verts ); var quad = new UIVertex[4]; for (int i = 0; i < vbo.Count; i += 4) { vbo.CopyTo(i, quad, 0, 4); vh.AddUIVertexQuad(quad); } vh.FillMesh( toFill ); }*/ #if !UNITY_5_2_1 protected override void OnPopulateMesh(VertexHelper vh) { vh.Clear(); List aVerts = new List(); _OnFillVBO( aVerts ); List aIndicies = new List( new int[]{ 0, 1, 2, 2, 3, 0 } ); vh.AddUIVertexStream( aVerts, aIndicies ); } #endif [System.Obsolete("This method is not called from Unity 5.2 and above")] #endif protected override void OnFillVBO(List vbo) { _OnFillVBO(vbo); } private void _OnFillVBO(List vbo) { bool flipY = false; if (HasValidTexture()) { flipY = _mediaPlayer.TextureProducer.RequiresVerticalFlip(); } Vector4 v = GetDrawingDimensions(_keepAspectRatio); vbo.Clear(); var vert = UIVertex.simpleVert; vert.position = new Vector2(v.x, v.y); vert.uv0 = new Vector2(m_UVRect.xMin, m_UVRect.yMin); if (flipY) { vert.uv0 = new Vector2(m_UVRect.xMin, 1.0f - m_UVRect.yMin); } vert.color = color; vbo.Add(vert); vert.position = new Vector2(v.x, v.w); vert.uv0 = new Vector2(m_UVRect.xMin, m_UVRect.yMax); if (flipY) { vert.uv0 = new Vector2(m_UVRect.xMin, 1.0f - m_UVRect.yMax); } vert.color = color; vbo.Add(vert); vert.position = new Vector2(v.z, v.w); vert.uv0 = new Vector2(m_UVRect.xMax, m_UVRect.yMax); if (flipY) { vert.uv0 = new Vector2(m_UVRect.xMax, 1.0f - m_UVRect.yMax); } vert.color = color; vbo.Add(vert); vert.position = new Vector2(v.z, v.y); vert.uv0 = new Vector2(m_UVRect.xMax, m_UVRect.yMin); if (flipY) { vert.uv0 = new Vector2(m_UVRect.xMax, 1.0f - m_UVRect.yMin); } vert.color = color; vbo.Add(vert); } //Added this method from Image.cs to do the keep aspect ratio private Vector4 GetDrawingDimensions(bool shouldPreserveAspect) { Vector4 returnSize = Vector4.zero; if (mainTexture != null) { var padding = Vector4.zero; var textureSize = new Vector2(mainTexture.width, mainTexture.height); Rect r = GetPixelAdjustedRect(); // Debug.Log(string.Format("r:{2}, textureSize:{0}, padding:{1}", textureSize, padding, r)); int spriteW = Mathf.RoundToInt( textureSize.x ); int spriteH = Mathf.RoundToInt( textureSize.y ); var size = new Vector4( padding.x / spriteW, padding.y / spriteH, (spriteW - padding.z) / spriteW, (spriteH - padding.w) / spriteH ); if (shouldPreserveAspect && textureSize.sqrMagnitude > 0.0f) { var spriteRatio = textureSize.x / textureSize.y; var rectRatio = r.width / r.height; if (spriteRatio > rectRatio) { var oldHeight = r.height; r.height = r.width * (1.0f / spriteRatio); r.y += (oldHeight - r.height) * rectTransform.pivot.y; } else { var oldWidth = r.width; r.width = r.height * spriteRatio; r.x += (oldWidth - r.width) * rectTransform.pivot.x; } } returnSize = new Vector4( r.x + r.width * size.x, r.y + r.height * size.y, r.x + r.width * size.z, r.y + r.height * size.w ); } return returnSize; } } } #endif