天津23维预案
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.
 
 
 
 
 
 

302 lines
6.7 KiB

#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;
/// <summary>
/// Returns the texture used to draw this Graphic.
/// </summary>
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();
}
/// <summary>
/// Texture to be used.
/// </summary>
public MediaPlayer CurrentMediaPlayer
{
get
{
return _mediaPlayer;
}
set
{
if (_mediaPlayer != value)
{
_mediaPlayer = value;
//SetVerticesDirty();
SetMaterialDirty();
}
}
}
/// <summary>
/// UV rectangle used by the texture.
/// </summary>
public Rect uvRect
{
get
{
return m_UVRect;
}
set
{
if (m_UVRect == value)
{
return;
}
m_UVRect = value;
SetVerticesDirty();
}
}
/// <summary>
/// Adjust the scale of the Graphic to make it pixel-perfect.
/// </summary>
[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);
}
}
/// <summary>
/// Update all renderer data.
/// </summary>
// 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<UIVertex> verts = new List<UIVertex>();
_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<UIVertex> aVerts = new List<UIVertex>();
_OnFillVBO( aVerts );
List<int> aIndicies = new List<int>( 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<UIVertex> vbo)
{
_OnFillVBO(vbo);
}
private void _OnFillVBO(List<UIVertex> 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