66 lines
1.4 KiB
C#
66 lines
1.4 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
using System.Runtime.InteropServices;
|
|
using System;
|
|
|
|
namespace Klak.Spout {
|
|
|
|
// Render event IDs
|
|
// Should match with KlakSpout::EventID (Event.h)
|
|
enum EventID
|
|
{
|
|
UpdateSender,
|
|
UpdateReceiver,
|
|
CloseSender,
|
|
CloseReceiver
|
|
}
|
|
|
|
// Render event attachment data structure
|
|
// Should match with KlakSpout::EventData (Event.h)
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
struct EventData
|
|
{
|
|
public IntPtr instancePointer;
|
|
public IntPtr texturePointer;
|
|
|
|
public EventData(IntPtr instance, IntPtr texture)
|
|
{
|
|
instancePointer = instance;
|
|
texturePointer = texture;
|
|
}
|
|
|
|
public EventData(IntPtr instance)
|
|
{
|
|
instancePointer = instance;
|
|
texturePointer = IntPtr.Zero;
|
|
}
|
|
}
|
|
|
|
class EventKicker : IDisposable
|
|
{
|
|
public EventKicker(EventData data)
|
|
=> _dataMem = GCHandle.Alloc(data, GCHandleType.Pinned);
|
|
|
|
public void Dispose()
|
|
=> MemoryPool.FreeOnEndOfFrame(_dataMem);
|
|
|
|
public void IssuePluginEvent(EventID eventID)
|
|
{
|
|
if (_cmdBuffer == null)
|
|
_cmdBuffer = new CommandBuffer();
|
|
else
|
|
_cmdBuffer.Clear();
|
|
|
|
_cmdBuffer.IssuePluginEventAndData
|
|
(Plugin.GetRenderEventCallback(),
|
|
(int)eventID, _dataMem.AddrOfPinnedObject());
|
|
|
|
Graphics.ExecuteCommandBuffer(_cmdBuffer);
|
|
}
|
|
|
|
static CommandBuffer _cmdBuffer;
|
|
GCHandle _dataMem;
|
|
}
|
|
|
|
} // namespace Klak.Spout
|