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.
195 lines
5.6 KiB
195 lines
5.6 KiB
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UC;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace Spout
|
|
{
|
|
public class SceneViewSpoutSender : EditorWindow
|
|
{
|
|
static SceneViewSpoutSender exampleWindow;
|
|
[MenuItem("Window/UC/Scene View Spout Sender")]
|
|
static void Open()
|
|
{
|
|
if (exampleWindow == null)
|
|
{
|
|
exampleWindow = CreateInstance<SceneViewSpoutSender>();
|
|
}
|
|
exampleWindow.Show();
|
|
}
|
|
|
|
public string sharingName = "UnitySceneSender";
|
|
|
|
public Spout.TextureFormat textureFormat = Spout.TextureFormat.DXGI_FORMAT_R8G8B8A8_UNORM;
|
|
[AutoUI]
|
|
public bool yFlip = true;
|
|
|
|
[SerializeField]
|
|
[Header("Automatic")]
|
|
RenderTexture output;
|
|
|
|
private bool senderIsCreated;
|
|
private const int _createAttempts = 5;
|
|
private int _attempts = 0;
|
|
|
|
private bool textureSizeHasChanged = false;
|
|
|
|
[SerializeField]
|
|
private Shader m_Shader;
|
|
public Shader shader
|
|
{
|
|
get
|
|
{
|
|
if (m_Shader == null)
|
|
m_Shader = Shader.Find("Unlit/AlphaPremultiplied");
|
|
|
|
return m_Shader;
|
|
}
|
|
}
|
|
|
|
private Material m_Material;
|
|
public Material material
|
|
{
|
|
get
|
|
{
|
|
if (m_Material == null)
|
|
m_Material = ImageEffectHelper.CheckShaderAndCreateMaterial(shader);
|
|
|
|
return m_Material;
|
|
}
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
SceneView.onSceneGUIDelegate += getTextureFromSceneView;
|
|
}
|
|
|
|
void getTextureFromSceneView(SceneView view)
|
|
{
|
|
RenderTexture s = view.camera.targetTexture;
|
|
|
|
if (s == null)
|
|
return;
|
|
|
|
bool isValid = (output != null) && s.width == output.width && s.height == output.height;
|
|
if (!isValid)
|
|
{
|
|
if (output != null)
|
|
output.Release();
|
|
output = new RenderTexture(s.width, s.height, s.depth, RenderTextureFormat.ARGB32);
|
|
output.Create();
|
|
}
|
|
textureSizeHasChanged = !isValid;
|
|
|
|
material.SetInt("yFlip", yFlip ? 1 : 0);
|
|
GL.sRGBWrite = (QualitySettings.activeColorSpace == ColorSpace.Linear);
|
|
Graphics.Blit(s, output, material);
|
|
GL.sRGBWrite = false;
|
|
}
|
|
|
|
void OnGUI()
|
|
{
|
|
//エスケープを押した時に閉じる
|
|
if (Event.current.keyCode == KeyCode.Escape)
|
|
{
|
|
exampleWindow.Close();
|
|
}
|
|
|
|
//sharingName = EditorGUILayout.TextField(sharingName);
|
|
|
|
if(Application.isPlaying == false)
|
|
EditorGUILayout.HelpBox("Play the scene to enable spout", MessageType.Warning, true);
|
|
|
|
}
|
|
|
|
void OnDisable()
|
|
{
|
|
SceneView.onSceneGUIDelegate -= getTextureFromSceneView;
|
|
|
|
_CloseSender();
|
|
|
|
if (m_Material != null)
|
|
DestroyImmediate(m_Material);
|
|
|
|
m_Material = null;
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
if (Application.isPlaying == false)
|
|
return;
|
|
|
|
if (output == null) return;
|
|
if (textureSizeHasChanged) _CloseSender();
|
|
|
|
if (senderIsCreated)
|
|
Spout.instance.UpdateSender(sharingName, output);
|
|
else
|
|
_CreateSender(output);
|
|
}
|
|
|
|
private void _CreateSender(Texture texture)
|
|
{
|
|
if (texture == null) return;
|
|
if (!Spout.instance.enabled) return;
|
|
|
|
if (!senderIsCreated)
|
|
{
|
|
Debug.Log("Sender is not created, creating one");
|
|
senderIsCreated = Spout.instance.CreateSender(sharingName, texture, (int)textureFormat);
|
|
}
|
|
|
|
_attempts++;
|
|
if (_attempts > _createAttempts)
|
|
Debug.LogWarning(System.String.Format("There are problems with creating the sender {0}. Please check your settings or restart Unity.", sharingName));
|
|
|
|
Spout.instance.OnSenderStopped -= OnSenderStoppedDelegate;
|
|
Spout.instance.OnSenderStopped += OnSenderStoppedDelegate;
|
|
|
|
Spout.instance.OnAllSendersStopped -= OnAllSendersStoppedDelegate;
|
|
Spout.instance.OnAllSendersStopped += OnAllSendersStoppedDelegate;
|
|
|
|
Spout.instance.OnEnabled -= _OnSpoutEnabled;
|
|
Spout.instance.OnEnabled += _OnSpoutEnabled;
|
|
}
|
|
|
|
private void _OnSpoutEnabled()
|
|
{
|
|
//Debug.Log("SpoutSender._OnSpoutEnabled");
|
|
//if (enabled)
|
|
{
|
|
//force a reconnection
|
|
// enabled = !enabled;
|
|
// enabled = !enabled;
|
|
}
|
|
}
|
|
|
|
private void _CloseSender()
|
|
{
|
|
Debug.Log("SpoutSender._CloseSender:" + sharingName);
|
|
if (senderIsCreated) Spout.CloseSender(sharingName);
|
|
_CloseSenderCleanUpData();
|
|
}
|
|
|
|
private void OnSenderStoppedDelegate(object sender, TextureShareEventArgs e)
|
|
{
|
|
//Debug.Log("SpoutSender.OnSenderStoppedDelegate:"+e.sharingName);
|
|
if (e.sharingName == sharingName)
|
|
{
|
|
_CloseSenderCleanUpData();
|
|
}
|
|
}
|
|
|
|
private void OnAllSendersStoppedDelegate()
|
|
{
|
|
_CloseSenderCleanUpData();
|
|
}
|
|
|
|
private void _CloseSenderCleanUpData()
|
|
{
|
|
senderIsCreated = false;
|
|
}
|
|
}
|
|
} |