Tanoda
LeapGraphicRendererEditor.cs
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright (C) Ultraleap, Inc. 2011-2020. *
3 * *
4 * Use subject to the terms of the Apache License 2.0 available at *
5 * http://www.apache.org/licenses/LICENSE-2.0, or another agreement *
6 * between Ultraleap and you, your company or other organization. *
7 ******************************************************************************/
8
9using System.Reflection;
10using UnityEngine;
11using UnityEditor;
12using Leap.Unity.Query;
13
15
16 [CustomEditor(typeof(LeapGraphicRenderer))]
17 public class LeapGraphicRendererEditor : CustomEditorBase<LeapGraphicRenderer> {
18 private const int BUTTON_WIDTH = 60;
19 private static Color BUTTON_COLOR = Color.white * 0.95f;
20 private static Color BUTTON_HIGHLIGHTED_COLOR = Color.white * 0.6f;
21
22 private LeapGraphicRenderer _renderer;
23 private SerializedProperty _selectedGroup;
24
25 private GenericMenu _addGroupMenu;
26 private SerializedProperty _groupProperty;
27 private LeapGuiGroupEditor _groupEditor;
28
29 protected override void OnEnable() {
30 base.OnEnable();
31
32 if (target == null) {
33 return;
34 }
35
36 _renderer = target as LeapGraphicRenderer;
37 _selectedGroup = serializedObject.FindProperty("_selectedGroup");
38
39 var allTypes = Assembly.GetAssembly(typeof(LeapGraphicRenderer)).GetTypes();
40
41 var allRenderingMethods = allTypes.Query().
42 Where(t => !t.IsAbstract &&
43 !t.IsGenericType &&
44 t.IsSubclassOf(typeof(LeapRenderingMethod)));
45
46 _addGroupMenu = new GenericMenu();
47 foreach (var renderingMethod in allRenderingMethods) {
48 _addGroupMenu.AddItem(new GUIContent(LeapGraphicTagAttribute.GetTagName(renderingMethod)),
49 false,
50 () => {
51 serializedObject.ApplyModifiedProperties();
52 Undo.RecordObject(_renderer, "Created group");
53 EditorUtility.SetDirty(_renderer);
54 _renderer.editor.CreateGroup(renderingMethod);
55 serializedObject.Update();
56 updateGroupProperty();
57 });
58 }
59
60 _groupEditor = new LeapGuiGroupEditor(target, serializedObject);
61 }
62
63 public override void OnInspectorGUI() {
64 using (new ProfilerSample("Draw Graphic Renderer Editor")) {
65 updateGroupProperty();
66
68
69 bool anyVertexLit = false;
70 foreach (var camera in FindObjectsOfType<Camera>()) {
71 if (camera.actualRenderingPath == RenderingPath.VertexLit) {
72 anyVertexLit = true;
73 break;
74 }
75 }
76
77 if (anyVertexLit) {
78 EditorGUILayout.HelpBox("The vertex lit rendering path is not supported.", MessageType.Error);
79 }
80
81 drawToolbar();
82
83 if (_groupProperty != null) {
84 drawGroupHeader();
85
86 GUILayout.BeginVertical(EditorStyles.helpBox);
87
88 _groupEditor.DoGuiLayout(_groupProperty);
89
90 GUILayout.EndVertical();
91 } else {
92 EditorGUILayout.HelpBox("To get started, create a new rendering group!", MessageType.Info);
93 }
94
95 serializedObject.ApplyModifiedProperties();
96 }
97 }
98
99 private void drawToolbar() {
100 EditorGUILayout.BeginHorizontal();
101
102 using (new EditorGUI.DisabledGroupScope(EditorApplication.isPlaying)) {
103 var prevColor = GUI.color;
104 if (GUILayout.Button("New Group", EditorStyles.toolbarDropDown)) {
105 _addGroupMenu.ShowAsContext();
106 }
107
108 if (_groupProperty != null) {
109 if (GUILayout.Button("Delete Group", EditorStyles.toolbarButton)) {
110 serializedObject.ApplyModifiedProperties();
111 Undo.RecordObject(_renderer, "Deleted group");
112 EditorUtility.SetDirty(_renderer);
113 _renderer.editor.DestroySelectedGroup();
114 serializedObject.Update();
115 _groupEditor.Invalidate();
116 updateGroupProperty();
117 }
118 }
119 GUI.color = prevColor;
120 }
121
122 GUILayout.FlexibleSpace();
123 Rect r = GUILayoutUtility.GetLastRect();
124 GUI.Label(r, "", EditorStyles.toolbarButton);
125
126 EditorGUILayout.EndHorizontal();
127 }
128
129 private void drawGroupHeader() {
130 EditorGUILayout.BeginHorizontal();
131
132 var prevColor = GUI.color;
133 for (int i = 0; i < _renderer.groups.Count; i++) {
134 if (i == _selectedGroup.intValue) {
135 GUI.color = BUTTON_HIGHLIGHTED_COLOR;
136 } else {
137 GUI.color = BUTTON_COLOR;
138 }
139
140 var group = _renderer.groups[i];
141 if (GUILayout.Button(group.name, EditorStyles.toolbarButton)) {
142 _selectedGroup.intValue = i;
143 _groupEditor.Invalidate();
144 updateGroupProperty();
145 }
146 }
147
148 GUI.color = prevColor;
149 GUILayout.FlexibleSpace();
150 Rect rect = GUILayoutUtility.GetLastRect();
151 GUI.Label(rect, "", EditorStyles.toolbarButton);
152
153 EditorGUILayout.EndHorizontal();
154 }
155
156 private void updateGroupProperty() {
157 var groupArray = serializedObject.FindProperty("_groups");
158 if (groupArray.arraySize == 0) {
159 _groupProperty = null;
160 return;
161 }
162
163 int selectedGroupIndex = _selectedGroup.intValue;
164 if (selectedGroupIndex < 0 || selectedGroupIndex >= groupArray.arraySize) {
165 _selectedGroup.intValue = 0;
166 selectedGroupIndex = 0;
167 }
168
169 _groupProperty = groupArray.GetArrayElementAtIndex(selectedGroupIndex);
170 }
171
172 private bool HasFrameBounds() {
173 _renderer.editor.RebuildEditorPickingMeshes();
174
175 return _renderer.groups.Query().
176 SelectMany(g => g.graphics.Query()).
177 Select(e => e.editor.pickingMesh).
178 Any(m => m != null);
179 }
180
181 private Bounds OnGetFrameBounds() {
182 _renderer.editor.RebuildEditorPickingMeshes();
183
184 return _renderer.groups.Query().
185 SelectMany(g => g.graphics.Query()).
186 Select(e => e.editor.pickingMesh).
187 ValidUnityObjs().
188 Select(m => m.bounds).
189 Fold((a, b) => {
190 a.Encapsulate(b);
191 return a;
192 });
193 }
194 }
195}
UnityEngine.Color Color
Definition: TestScript.cs:32
List< LeapGraphicGroup > groups
Returns a list of all graphic groups contained withinin this renderer. This getter returns a regular ...
void DoGuiLayout(SerializedProperty groupProperty)
A utility struct for ease of use when you want to wrap a piece of code in a Profiler....