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.

106 lines
3.1 KiB

// KlakSpout - Spout realtime video sharing plugin for Unity
// https://github.com/keijiro/KlakSpout
using UnityEngine;
namespace Klak.Spout
{
/// Spout sender class
[AddComponentMenu("Klak/Spout/Spout Sender")]
[RequireComponent(typeof(Camera))]
[ExecuteInEditMode]
public class SpoutSender : MonoBehaviour
{
#region Editable properties
[SerializeField] bool _clearAlpha = true;
public bool clearAlpha {
get { return _clearAlpha; }
set { _clearAlpha = value; }
}
#endregion
#region Private members
System.IntPtr _sender;
Texture2D _sharedTexture;
Material _fixupMaterial;
#endregion
#region MonoBehaviour functions
void OnEnable()
{
var camera = GetComponent<Camera>();
_sender = PluginEntry.CreateSender(name, camera.pixelWidth, camera.pixelHeight);
}
void OnDisable()
{
if (_sender != System.IntPtr.Zero)
{
PluginEntry.DestroySharedObject(_sender);
_sender = System.IntPtr.Zero;
}
if (_sharedTexture != null)
{
if (Application.isPlaying)
Destroy(_sharedTexture);
else
DestroyImmediate(_sharedTexture);
_sharedTexture = null;
}
}
void Update()
{
PluginEntry.Poll();
}
void OnRenderImage(RenderTexture source, RenderTexture destination)
{
// Lazy initialization for the shared texture.
if (_sharedTexture == null)
{
var ptr = PluginEntry.GetTexturePointer(_sender);
if (ptr != System.IntPtr.Zero)
{
_sharedTexture = Texture2D.CreateExternalTexture(
PluginEntry.GetTextureWidth(_sender),
PluginEntry.GetTextureHeight(_sender),
TextureFormat.ARGB32, false, false, ptr
);
}
}
// Update the shared texture.
if (_sharedTexture != null)
{
// Lazy initialization for the fix-up shader.
if (_fixupMaterial == null)
_fixupMaterial = new Material(Shader.Find("Hidden/Spout/Fixup"));
// Parameters for the fix-up shader.
_fixupMaterial.SetFloat("_ClearAlpha", _clearAlpha ? 1 : 0);
// Apply the fix-up shader.
var tempRT = RenderTexture.GetTemporary(_sharedTexture.width, _sharedTexture.height);
Graphics.Blit(source, tempRT, _fixupMaterial, 0);
// Copy the result to the shared texture.
Graphics.CopyTexture(tempRT, _sharedTexture);
// Release temporaries.
RenderTexture.ReleaseTemporary(tempRT);
}
// Just transfer the source to the destination.
Graphics.Blit(source, destination);
}
#endregion
}
}