#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 guis = new List(); 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