9using System.Reflection;
16 [CustomEditor(typeof(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;
23 private SerializedProperty _selectedGroup;
25 private GenericMenu _addGroupMenu;
26 private SerializedProperty _groupProperty;
37 _selectedGroup = serializedObject.FindProperty(
"_selectedGroup");
41 var allRenderingMethods = allTypes.Query().
42 Where(t => !t.IsAbstract &&
46 _addGroupMenu =
new GenericMenu();
47 foreach (var renderingMethod
in allRenderingMethods) {
51 serializedObject.ApplyModifiedProperties();
52 Undo.RecordObject(_renderer,
"Created group");
53 EditorUtility.SetDirty(_renderer);
54 _renderer.editor.CreateGroup(renderingMethod);
55 serializedObject.Update();
56 updateGroupProperty();
65 updateGroupProperty();
69 bool anyVertexLit =
false;
70 foreach (var camera
in FindObjectsOfType<Camera>()) {
71 if (camera.actualRenderingPath == RenderingPath.VertexLit) {
78 EditorGUILayout.HelpBox(
"The vertex lit rendering path is not supported.", MessageType.Error);
83 if (_groupProperty !=
null) {
86 GUILayout.BeginVertical(EditorStyles.helpBox);
90 GUILayout.EndVertical();
92 EditorGUILayout.HelpBox(
"To get started, create a new rendering group!", MessageType.Info);
95 serializedObject.ApplyModifiedProperties();
99 private void drawToolbar() {
100 EditorGUILayout.BeginHorizontal();
102 using (
new EditorGUI.DisabledGroupScope(EditorApplication.isPlaying)) {
103 var prevColor = GUI.color;
104 if (GUILayout.Button(
"New Group", EditorStyles.toolbarDropDown)) {
105 _addGroupMenu.ShowAsContext();
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();
116 updateGroupProperty();
119 GUI.color = prevColor;
122 GUILayout.FlexibleSpace();
123 Rect r = GUILayoutUtility.GetLastRect();
124 GUI.Label(r,
"", EditorStyles.toolbarButton);
126 EditorGUILayout.EndHorizontal();
129 private void drawGroupHeader() {
130 EditorGUILayout.BeginHorizontal();
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;
137 GUI.color = BUTTON_COLOR;
140 var group = _renderer.
groups[i];
141 if (GUILayout.Button(group.name, EditorStyles.toolbarButton)) {
142 _selectedGroup.intValue = i;
144 updateGroupProperty();
148 GUI.color = prevColor;
149 GUILayout.FlexibleSpace();
150 Rect rect = GUILayoutUtility.GetLastRect();
151 GUI.Label(rect,
"", EditorStyles.toolbarButton);
153 EditorGUILayout.EndHorizontal();
156 private void updateGroupProperty() {
157 var groupArray = serializedObject.FindProperty(
"_groups");
158 if (groupArray.arraySize == 0) {
159 _groupProperty =
null;
163 int selectedGroupIndex = _selectedGroup.intValue;
164 if (selectedGroupIndex < 0 || selectedGroupIndex >= groupArray.arraySize) {
165 _selectedGroup.intValue = 0;
166 selectedGroupIndex = 0;
169 _groupProperty = groupArray.GetArrayElementAtIndex(selectedGroupIndex);
172 private bool HasFrameBounds() {
173 _renderer.editor.RebuildEditorPickingMeshes();
175 return _renderer.
groups.Query().
176 SelectMany(g => g.graphics.Query()).
177 Select(e => e.editor.pickingMesh).
181 private Bounds OnGetFrameBounds() {
182 _renderer.editor.RebuildEditorPickingMeshes();
184 return _renderer.
groups.Query().
185 SelectMany(g => g.graphics.Query()).
186 Select(e => e.editor.pickingMesh).
188 Select(m => m.bounds).
void drawScriptField(bool disable=true)
override void OnInspectorGUI()
List< LeapGraphicGroup > groups
Returns a list of all graphic groups contained withinin this renderer. This getter returns a regular ...
static string GetTagName(Type type)
void DoGuiLayout(SerializedProperty groupProperty)
A utility struct for ease of use when you want to wrap a piece of code in a Profiler....