|  | #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
 |