paulxstretch/deps/juce/extras/Build/CMake/UnityPluginGUIScript.cs.in

182 lines
6.3 KiB
C#
Raw Normal View History

#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
using System.Runtime.InteropServices;
public class ${plugin_class_name}GUI : IAudioEffectPluginGUI
{
public override string Name { get { return "${plugin_name}"; } }
public override string Description { get { return "${plugin_description}"; } }
public override string Vendor { get { return "${plugin_vendor}"; } }
//==============================================================================
[DllImport("${plugin_name}")] static extern System.IntPtr getRenderCallback();
[DllImport("${plugin_name}")] static extern void unityInitialiseTexture (int id, System.IntPtr texture, int width, int height);
[DllImport("${plugin_name}")] static extern void unityMouseDown (int id, float x, float y, EventModifiers mods, int button);
[DllImport("${plugin_name}")] static extern void unityMouseDrag (int id, float x, float y, EventModifiers mods, int button);
[DllImport("${plugin_name}")] static extern void unityMouseUp (int id, float x, float y, EventModifiers mods);
[DllImport("${plugin_name}")] static extern void unityKeyEvent (int id, KeyCode code, EventModifiers mods, string name);
[DllImport("${plugin_name}")] static extern void unitySetScreenBounds (int id, float x, float y, float w, float h);
//==============================================================================
private class PluginGUIInstance
{
public PluginGUIInstance (ref IAudioEffectPlugin plugin, int id)
{
instanceID = id;
float[] arr;
plugin.GetFloatBuffer ("Editor", out arr, 1);
hasEditor = (arr[0] > 0.0f);
}
public void repaint (Rect r)
{
Vector2 newScreenPosition = GUIUtility.GUIToScreenPoint (r.position);
if (bounds != r
|| screenPosition != newScreenPosition)
{
screenPosition = newScreenPosition;
bounds = r;
unitySetScreenBounds (instanceID, screenPosition.x, screenPosition.y, bounds.width, bounds.height);
setupTexture();
}
GL.IssuePluginEvent (getRenderCallback(), instanceID);
texture.SetPixels32 (pixels);
texture.Apply();
EditorGUI.DrawPreviewTexture (bounds, texture);
}
public bool handleMouseEvent (EventType eventType)
{
Vector2 mousePos = Event.current.mousePosition;
EventModifiers mods = Event.current.modifiers;
if (! bounds.Contains (mousePos))
return false;
Vector2 relativePos = new Vector2 (mousePos.x - bounds.x, mousePos.y - bounds.y);
if (eventType == EventType.MouseDown)
{
unityMouseDown (instanceID, relativePos.x, relativePos.y, mods, Event.current.button);
GUIUtility.hotControl = GUIUtility.GetControlID (FocusType.Passive);
}
else if (eventType == EventType.MouseUp)
{
unityMouseUp (instanceID, relativePos.x, relativePos.y, mods);
GUIUtility.hotControl = 0;
}
else if (eventType == EventType.MouseDrag)
{
unityMouseDrag (instanceID, relativePos.x, relativePos.y, mods, Event.current.button);
}
Event.current.Use();
return true;
}
public void handleKeyEvent (EventType eventType)
{
if (eventType == EventType.KeyDown)
{
KeyCode code = Event.current.keyCode;
if (code == KeyCode.None)
return;
EventModifiers mods = Event.current.modifiers;
unityKeyEvent (instanceID, code, mods, code.ToString());
}
}
private void setupTexture()
{
if (pixelHandle.IsAllocated)
pixelHandle.Free();
texture = new Texture2D ((int) bounds.width, (int) bounds.height, TextureFormat.ARGB32, false);
pixels = texture.GetPixels32();
pixelHandle = GCHandle.Alloc (pixels, GCHandleType.Pinned);
unityInitialiseTexture (instanceID, pixelHandle.AddrOfPinnedObject(), texture.width, texture.height);
}
public int instanceID = -1;
public bool hasEditor;
private Vector2 screenPosition;
private Rect bounds;
private Texture2D texture;
private Color32[] pixels;
private GCHandle pixelHandle;
}
List<PluginGUIInstance> guis = new List<PluginGUIInstance>();
private PluginGUIInstance getGUIInstanceForPlugin (ref IAudioEffectPlugin plugin)
{
float[] idArray;
plugin.GetFloatBuffer ("ID", out idArray, 1);
int id = (int) idArray[0];
for (int i = 0; i < guis.Count; ++i)
{
if (guis[i].instanceID == id)
return guis[i];
}
PluginGUIInstance newInstance = new PluginGUIInstance (ref plugin, id);
guis.Add (newInstance);
return guis[guis.Count - 1];
}
//==============================================================================
public override bool OnGUI (IAudioEffectPlugin plugin)
{
PluginGUIInstance guiInstance = getGUIInstanceForPlugin (ref plugin);
if (! guiInstance.hasEditor)
return true;
float[] arr;
plugin.GetFloatBuffer ("Size", out arr, 6);
Rect r = GUILayoutUtility.GetRect (arr[0], arr[1],
new GUILayoutOption[] { GUILayout.MinWidth (arr[2]), GUILayout.MinHeight (arr[3]),
GUILayout.MaxWidth (arr[4]), GUILayout.MaxHeight (arr[5]) });
int controlID = GUIUtility.GetControlID (FocusType.Passive);
Event currentEvent = Event.current;
EventType currentEventType = currentEvent.GetTypeForControl (controlID);
if (currentEventType == EventType.Repaint)
guiInstance.repaint (r);
else if (currentEvent.isMouse)
guiInstance.handleMouseEvent (currentEventType);
else if (currentEvent.isKey)
guiInstance.handleKeyEvent (currentEventType);
return false;
}
}
#endif