using System; using UnityEngine; namespace RenderHeads.Media.AVProVideo { [AddComponentMenu("AVPro Video/Apply To Material", 300)] [HelpURL("http://renderheads.com/product/avpro-video/")] public class ApplyToMaterial : MonoBehaviour { private void Awake() { if (ApplyToMaterial._propStereo == 0 || ApplyToMaterial._propAlphaPack == 0) { ApplyToMaterial._propStereo = Shader.PropertyToID("Stereo"); ApplyToMaterial._propAlphaPack = Shader.PropertyToID("AlphaPack"); ApplyToMaterial._propApplyGamma = Shader.PropertyToID("_ApplyGamma"); } if (ApplyToMaterial._propChromaTex == 0) { ApplyToMaterial._propChromaTex = Shader.PropertyToID("_ChromaTex"); } if (ApplyToMaterial._propUseYpCbCr == 0) { ApplyToMaterial._propUseYpCbCr = Shader.PropertyToID("_UseYpCbCr"); } } private void LateUpdate() { bool flag = false; if (this._media != null && this._media.TextureProducer != null) { int num = (!this._media.m_Resample) ? this._media.TextureProducer.GetTextureCount() : 1; for (int i = 0; i < num; i++) { Texture texture = (this._media.FrameResampler != null && this._media.FrameResampler.OutputTexture != null) ? this._media.FrameResampler.OutputTexture[i] : null; Texture texture2 = (!this._media.m_Resample) ? this._media.TextureProducer.GetTexture(i) : texture; if (texture2 != null) { this.ApplyMapping(texture2, this._media.TextureProducer.RequiresVerticalFlip(), i); flag = true; } } } if (!flag) { if (this._material.HasProperty(ApplyToMaterial._propUseYpCbCr)) { this._material.DisableKeyword("USE_YPCBCR"); } this.ApplyMapping(this._defaultTexture, false, 0); } } private void ApplyMapping(Texture texture, bool requiresYFlip, int plane = 0) { if (this._material != null) { if (plane == 0) { if (string.IsNullOrEmpty(this._texturePropertyName)) { this._material.mainTexture = texture; if (texture != null) { if (requiresYFlip) { this._material.mainTextureScale = new Vector2(this._scale.x, -this._scale.y); this._material.mainTextureOffset = Vector2.up + this._offset; } else { this._material.mainTextureScale = this._scale; this._material.mainTextureOffset = this._offset; } } } else { this._material.SetTexture(this._texturePropertyName, texture); if (texture != null) { if (requiresYFlip) { this._material.SetTextureScale(this._texturePropertyName, new Vector2(this._scale.x, -this._scale.y)); this._material.SetTextureOffset(this._texturePropertyName, Vector2.up + this._offset); } else { this._material.SetTextureScale(this._texturePropertyName, this._scale); this._material.SetTextureOffset(this._texturePropertyName, this._offset); } } } } else if (plane == 1) { if (this._material.HasProperty(ApplyToMaterial._propUseYpCbCr)) { this._material.EnableKeyword("USE_YPCBCR"); } if (this._material.HasProperty(ApplyToMaterial._propChromaTex)) { this._material.SetTexture(ApplyToMaterial._propChromaTex, texture); if (texture != null) { if (requiresYFlip) { this._material.SetTextureScale(ApplyToMaterial._propChromaTex, new Vector2(this._scale.x, -this._scale.y)); this._material.SetTextureOffset(ApplyToMaterial._propChromaTex, Vector2.up + this._offset); } else { this._material.SetTextureScale(ApplyToMaterial._propChromaTex, this._scale); this._material.SetTextureOffset(ApplyToMaterial._propChromaTex, this._offset); } } } } if (this._media != null) { if (this._material.HasProperty(ApplyToMaterial._propStereo)) { Helper.SetupStereoMaterial(this._material, this._media.m_StereoPacking, this._media.m_DisplayDebugStereoColorTint); } if (this._material.HasProperty(ApplyToMaterial._propAlphaPack)) { Helper.SetupAlphaPackedMaterial(this._material, this._media.m_AlphaPacking); } if (this._material.HasProperty(ApplyToMaterial._propApplyGamma) && this._media.Info != null) { Helper.SetupGammaMaterial(this._material, this._media.Info.PlayerSupportsLinearColorSpace()); } } } } private void Start() { this.SaveProperties(); this.LateUpdate(); } private void OnEnable() { this.SaveProperties(); this.LateUpdate(); } private void OnDisable() { this.RestoreProperties(); } private void SaveProperties() { if (this._material != null) { if (string.IsNullOrEmpty(this._texturePropertyName)) { this._originalTexture = this._material.mainTexture; this._originalScale = this._material.mainTextureScale; this._originalOffset = this._material.mainTextureOffset; } else { this._originalTexture = this._material.GetTexture(this._texturePropertyName); this._originalScale = this._material.GetTextureScale(this._texturePropertyName); this._originalOffset = this._material.GetTextureOffset(this._texturePropertyName); } } } private void RestoreProperties() { if (this._material != null) { if (string.IsNullOrEmpty(this._texturePropertyName)) { this._material.mainTexture = this._originalTexture; this._material.mainTextureScale = this._originalScale; this._material.mainTextureOffset = this._originalOffset; } else { this._material.SetTexture(this._texturePropertyName, this._originalTexture); this._material.SetTextureScale(this._texturePropertyName, this._originalScale); this._material.SetTextureOffset(this._texturePropertyName, this._originalOffset); } } } public Vector2 _offset = Vector2.zero; public Vector2 _scale = Vector2.one; public Material _material; public string _texturePropertyName; public MediaPlayer _media; public Texture2D _defaultTexture; private Texture _originalTexture; private Vector2 _originalScale = Vector2.one; private Vector2 _originalOffset = Vector2.zero; private static int _propStereo; private static int _propAlphaPack; private static int _propApplyGamma; private const string PropChromaTexName = "_ChromaTex"; private static int _propChromaTex; private const string PropUseYpCbCrName = "_UseYpCbCr"; private static int _propUseYpCbCr; } }