123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- using UnityEngine;
- using UnityEngine.Serialization;
- //-----------------------------------------------------------------------------
- // Copyright 2015-2022 RenderHeads Ltd. All rights reserved.
- //-----------------------------------------------------------------------------
- namespace RenderHeads.Media.AVProVideo
- {
- /// <summary>
- /// Sets up a mesh to display the video from a MediaPlayer
- /// </summary>
- [AddComponentMenu("AVPro Video/Apply To Mesh", 300)]
- [HelpURL("https://www.renderheads.com/products/avpro-video/")]
- public sealed class ApplyToMesh : ApplyToBase
- {
- // TODO: add specific material / material index to target in the mesh if there are multiple materials
- [Space(8f)]
- [Header("Display")]
- [Tooltip("Default texture to display when the video texture is preparing")]
- [SerializeField] Texture2D _defaultTexture = null;
- public Texture2D DefaultTexture
- {
- get { return _defaultTexture; }
- set { ChangeDefaultTexture(value); }
- }
- [Space(8f)]
- [FormerlySerializedAs("_mesh")]
- [Header("Renderer Target")]
- [SerializeField] Renderer _renderer = null;
- public Renderer MeshRenderer
- {
- get { return _renderer; }
- set { ChangeRenderer(value); }
- }
- [SerializeField] int _materialIndex = -1;
- public int MaterialIndex
- {
- get { return _materialIndex; }
- set { _materialIndex = value; }
- }
- private void ChangeDefaultTexture(Texture2D texture)
- {
- if (_defaultTexture != texture)
- {
- _defaultTexture = texture;
- ForceUpdate();
- }
- }
- private void ChangeRenderer(Renderer renderer)
- {
- if (_renderer != renderer)
- {
- if (_renderer)
- {
- // TODO: Remove from renderer
- }
- _renderer = renderer;
- if (_renderer)
- {
- ForceUpdate();
- }
- }
- }
- [SerializeField] string _texturePropertyName = Helper.UnityBaseTextureName;
- public string TexturePropertyName
- {
- get { return _texturePropertyName; }
- set
- {
- if (_texturePropertyName != value)
- {
- _texturePropertyName = value;
- // TODO: if the property changes, remove it from the perioud SetTexture()
- _propTexture = new LazyShaderProperty(_texturePropertyName);
- _isDirty = true;
- }
- }
- }
- [SerializeField] Vector2 _offset = Vector2.zero;
- public Vector2 Offset
- {
- get { return _offset; }
- set { if (_offset != value) { _offset = value; _isDirty = true; } }
- }
- [SerializeField] Vector2 _scale = Vector2.one;
- public Vector2 Scale
- {
- get { return _scale; }
- set { if (_scale != value) { _scale = value; _isDirty = true; } }
- }
- private Texture _lastTextureApplied;
- private LazyShaderProperty _propTexture;
- // We do a LateUpdate() to allow for any changes in the texture that may have happened in Update()
- private void LateUpdate()
- {
- Apply();
- }
- public override void Apply()
- {
- bool applied = false;
- // Try to apply texture from media
- if (_media != null && _media.TextureProducer != null)
- {
- Texture resamplerTex = _media.FrameResampler == null || _media.FrameResampler.OutputTexture == null ? null : _media.FrameResampler.OutputTexture[0];
- Texture texture = _media.UseResampler ? resamplerTex : _media.TextureProducer.GetTexture(0);
- if (texture != null)
- {
- // Check for changing texture
- if (texture != _lastTextureApplied)
- {
- _isDirty = true;
- }
- if (_isDirty)
- {
- int planeCount = _media.UseResampler ? 1 : _media.TextureProducer.GetTextureCount();
- for (int plane = 0; plane < planeCount; plane++)
- {
- Texture resamplerTexPlane = _media.FrameResampler == null || _media.FrameResampler.OutputTexture == null ? null : _media.FrameResampler.OutputTexture[plane];
- texture = _media.UseResampler ? resamplerTexPlane : _media.TextureProducer.GetTexture(plane);
- if (texture != null)
- {
- ApplyMapping(texture, _media.TextureProducer.RequiresVerticalFlip(), plane, _materialIndex);
- }
- }
- }
- applied = true;
- }
- }
- // If the media didn't apply a texture, then try to apply the default texture
- if (!applied)
- {
- if (_defaultTexture != _lastTextureApplied)
- {
- _isDirty = true;
- }
- if (_isDirty)
- {
- ApplyMapping(_defaultTexture, false, 0, _materialIndex);
- }
- }
- }
- private void ApplyMapping(Texture texture, bool requiresYFlip, int plane, int materialIndex = -1)
- {
- if (_renderer != null)
- {
- _isDirty = false;
- Material[] meshMaterials = _renderer.materials;
- if (meshMaterials != null)
- {
- for (int i = 0; i < meshMaterials.Length; i++)
- {
- if (_materialIndex < 0 || i == _materialIndex)
- {
- Material mat = meshMaterials[i];
- if (mat != null)
- {
- if (plane == 0)
- {
- VideoRender.SetupMaterialForMedia(mat, _media, _propTexture.Id, texture, texture == _defaultTexture);
- _lastTextureApplied = texture;
- #if (!UNITY_EDITOR && UNITY_ANDROID)
- if(texture == _defaultTexture) { mat.EnableKeyword("USING_DEFAULT_TEXTURE"); }
- else { mat.DisableKeyword("USING_DEFAULT_TEXTURE"); }
- #endif
- if (texture != null)
- {
- if (requiresYFlip)
- {
- mat.SetTextureScale(_propTexture.Id, new Vector2(_scale.x, -_scale.y));
- mat.SetTextureOffset(_propTexture.Id, Vector2.up + _offset);
- }
- else
- {
- mat.SetTextureScale(_propTexture.Id, _scale);
- mat.SetTextureOffset(_propTexture.Id, _offset);
- }
- }
- }
- else if (plane == 1)
- {
- if (texture != null)
- {
- if (requiresYFlip)
- {
- mat.SetTextureScale(VideoRender.PropChromaTex.Id, new Vector2(_scale.x, -_scale.y));
- mat.SetTextureOffset(VideoRender.PropChromaTex.Id, Vector2.up + _offset);
- }
- else
- {
- mat.SetTextureScale(VideoRender.PropChromaTex.Id, _scale);
- mat.SetTextureOffset(VideoRender.PropChromaTex.Id, _offset);
- }
- }
- }
- }
- }
- }
- }
- }
- }
- protected override void OnEnable()
- {
- if (_renderer == null)
- {
- _renderer = this.GetComponent<MeshRenderer>();
- if (_renderer == null)
- {
- Debug.LogWarning("[AVProVideo] No MeshRenderer set or found in gameobject");
- }
- }
- _propTexture = new LazyShaderProperty(_texturePropertyName);
- ForceUpdate();
- }
- protected override void OnDisable()
- {
- ApplyMapping(_defaultTexture, false, 0, _materialIndex);
- }
- }
- }
|