65 lines
1.6 KiB
C#
65 lines
1.6 KiB
C#
using UnityEngine;
|
|
using System.Runtime.InteropServices;
|
|
using IntPtr = System.IntPtr;
|
|
|
|
namespace Klak.Spout {
|
|
|
|
//
|
|
// Wrapper class for sender instances on the native plugin side
|
|
//
|
|
sealed class Sender : System.IDisposable
|
|
{
|
|
#region Private objects
|
|
|
|
IntPtr _plugin;
|
|
EventKicker _event;
|
|
|
|
#endregion
|
|
|
|
#region Object lifecycle
|
|
|
|
public Sender(string target, Texture texture)
|
|
{
|
|
// Plugin object allocation
|
|
_plugin = Plugin.CreateSender(target, texture.width, texture.height);
|
|
if (_plugin == IntPtr.Zero) return;
|
|
|
|
// Event kicker (heap block for interop communication)
|
|
_event = new EventKicker
|
|
(new EventData(_plugin, texture.GetNativeTexturePtr()));
|
|
|
|
// Initial update event
|
|
_event.IssuePluginEvent(EventID.UpdateSender);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if (_plugin != IntPtr.Zero)
|
|
{
|
|
// Isssue the closer event to destroy the plugin object from the
|
|
// render thread.
|
|
_event.IssuePluginEvent(EventID.CloseSender);
|
|
|
|
// Event kicker (interop memory) deallocation:
|
|
// The close event above will refer to the block from the render
|
|
// thread, so we actually can't free the memory here. To avoid this
|
|
// problem, EventKicker uses MemoryPool to delay the memory
|
|
// deallocation by the end of the frame.
|
|
_event.Dispose();
|
|
|
|
_plugin = IntPtr.Zero;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Frame update method
|
|
|
|
public void Update()
|
|
=> _event?.IssuePluginEvent(EventID.UpdateSender);
|
|
|
|
#endregion
|
|
}
|
|
|
|
} // namespace Klak.Spout
|