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.

202 lines
4.9 KiB

/*
* Spout4Unity
* Copyright © 2014-2015 Benjamin Kuperberg
* Copyright © 2015 Stefan Schlupek
* All rights reserved
*/
using UnityEngine;
using System.Collections;
using System;
namespace Spout{
[Serializable]
[ExecuteInEditMode]
public class SpoutReceiver : MonoBehaviour {
[SerializeField]
private string _sharingName;
private Texture2D _texture;
// leave false in this version!
//private bool debugConsole = false;
private bool _receiverIsReady;
//If you have want to prevent the Console warnings about not existing Senders just turn on the StartupDelay and specify the frame delay
private bool _startupDelay = true;
//how many frames of delay
private int _startupFramesDelay = 0;
private int _startUpFrameCount;
private string _tempName;
// Use this for initialization
void Awake () {
// Debug.Log("SpoutReceiver.Awake");
//if(debugConsole) Spout2.instance.initDebugConsole();
}
void Start()
{
}
void OnEnable(){
//Debug.Log("SpoutReceiver.OnEnable");
//Add the listener immediately to get the events when Unity starts and the Spout plugin initialize.
//Otherwise the external Spout Senders have to start afterwards to trigger the native plugin events
Spout.instance.addListener(TexShared,TexStopped);
#if UNITY_EDITOR
if(!Application.isPlaying){
UnityEditor.EditorApplication.update -= _Update;
UnityEditor.EditorApplication.update += _Update;
}
#endif
_receiverIsReady = false;
_startUpFrameCount = 0;
if(!_startupDelay)_ForceTextureUpdate();
}
void OnDisable(){
//Debug.Log("SpoutReceiver.OnDisable");
#if UNITY_EDITOR
UnityEditor.EditorApplication.update -= _Update;
#endif
_receiverIsReady = false;
_startUpFrameCount = 0;
Spout.removeListener(TexShared,TexStopped);
texture = null;
GC.Collect();
}
void OnDestroy(){
//Debug.Log("SpoutReceiver.OnDestroy");
}
void Update(){
_Update();
}
// Update is called once per frame
void _Update () {
//if(texture == null)_createNullTexture();
if(!_startupDelay)return;
if(!_receiverIsReady){
_startUpFrameCount++;
if( _startUpFrameCount < _startupFramesDelay)return;
_ForceTextureUpdate();
}
}
private void _ForceTextureUpdate(){
//Debug.Log("SpoutReceiver._ForceTextureUpdate");
//Little hack to force an update of the Texture
_tempName = _sharingName;
sharingName = Spout.fakeName;
sharingName = _tempName;
_receiverIsReady = true;
}
public void TexShared(TextureInfo texInfo)
{
//Debug.Log("SpoutReceiver.texShared");
if(sharingName == "" || sharingName == texInfo.name || sharingName == "Any")
{
//Debug.Log("SpoutReceiver.texShared:"+texInfo.name);
texture = texInfo.getTexture();
}
}
public void TexStopped(TextureInfo texInfo)
{
//Debug.Log("SpoutReceiver.texStopped:"+texInfo.name);
if(texInfo.name == _sharingName)
{
//Debug.Log("SpoutReceiver.texStopped:"+texInfo.name);
texture = Spout.nullTexture;
}
else if(sharingName == "Any" && Spout.instance.activeSenders.Count > 0)
{
texture = Spout.instance.activeSenders[Spout.instance.activeSenders.Count-1].getTexture();
}
}
public Texture2D texture
{
get { return _texture; }
set {
_texture = value;
if(_texture == null) _texture = Spout.nullTexture;
#if false
try { GetComponent<Renderer>().sharedMaterial.mainTexture = _texture; } catch { }
try { GetComponent<UnityEngine.UI.RawImage>().texture = _texture; } catch { }
#else
if(GetComponent<Renderer>() != null)
{
GetComponent<Renderer>().sharedMaterial.mainTexture = _texture;
}
if (GetComponent<UnityEngine.UI.RawImage>() != null)
{
GetComponent<UnityEngine.UI.RawImage>().texture = _texture;
}
#endif
}
}
[SerializeField]
public string sharingName
{
get { return _sharingName; }
set {
if(_sharingName == value && sharingName != "Any") return;
_sharingName = value;
//Debug.Log("sharingName:"+_sharingName);
if(sharingName == "Any")
{
if(Spout.instance.activeSenders != null && Spout.instance.activeSenders.Count > 0)
{
texture = Spout.instance.activeSenders[Spout.instance.activeSenders.Count-1].getTexture();
}
}else
{
//Debug.Log ("Set sharing name :"+sharingName);
TextureInfo texInfo = Spout.instance.getTextureInfo(sharingName);
if(texInfo != null) {
texture = texInfo.getTexture ();
}
else
{
if(sharingName != Spout.fakeName)Debug.LogWarning ("Sender "+sharingName+" does not exist");
texture = Spout.nullTexture;
/*
texture = new Texture2D(32,32);
//new Texture2D(32,32,TextureFormat.RGBA32,true,true);
texture.hideFlags = HideFlags.HideAndDontSave;
*/
}
}
}
}
}
}