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