209 lines
6.3 KiB
C#
209 lines
6.3 KiB
C#
|
namespace Fusion.Addons.InterestManagement.Editor
|
||
|
{
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
using UnityEditor;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Utility class for drawing info in inspectors.
|
||
|
/// </summary>
|
||
|
public static class InterestEditorUtility
|
||
|
{
|
||
|
// PRIVATE MEMBERS
|
||
|
|
||
|
private static bool _providersFoldout = true;
|
||
|
private static bool _interestObjectsFoldout = true;
|
||
|
private static int _interestObjectCount = default;
|
||
|
|
||
|
// PUBLIC METHODS
|
||
|
|
||
|
public static void DrawLine(Color color, float thickness = 1.0f, float padding = 10.0f)
|
||
|
{
|
||
|
Rect controlRect = EditorGUILayout.GetControlRect(GUILayout.Height(padding + thickness));
|
||
|
|
||
|
controlRect.height = thickness;
|
||
|
controlRect.y += padding * 0.5f;
|
||
|
|
||
|
EditorGUI.DrawRect(controlRect, color);
|
||
|
}
|
||
|
|
||
|
public static void DrawInterestButtons(bool addSpace)
|
||
|
{
|
||
|
if (addSpace == true)
|
||
|
{
|
||
|
EditorGUILayout.Space();
|
||
|
}
|
||
|
|
||
|
EditorGUILayout.BeginHorizontal();
|
||
|
{
|
||
|
if (DrawButton($"Draw Player Interest", InterestUtility.DrawPlayerInterest) == true)
|
||
|
{
|
||
|
InterestUtility.DrawPlayerInterest = !InterestUtility.DrawPlayerInterest;
|
||
|
}
|
||
|
|
||
|
if (DrawButton($"Draw Interest Cells", InterestUtility.DrawInterestCells) == true)
|
||
|
{
|
||
|
InterestUtility.DrawInterestCells = !InterestUtility.DrawInterestCells;
|
||
|
|
||
|
if (InterestUtility.DrawInterestCells == false)
|
||
|
{
|
||
|
InterestUtility.DrawSamplePositions = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (DrawButton($"Draw Sample Positions", InterestUtility.DrawSamplePositions) == true)
|
||
|
{
|
||
|
InterestUtility.DrawSamplePositions = !InterestUtility.DrawSamplePositions;
|
||
|
|
||
|
if (InterestUtility.DrawSamplePositions == true)
|
||
|
{
|
||
|
InterestUtility.DrawInterestCells = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
EditorGUILayout.EndHorizontal();
|
||
|
|
||
|
if (InterestUtility.DrawPlayerInterest == true || InterestUtility.DrawInterestCells == true || InterestUtility.DrawSamplePositions == true)
|
||
|
{
|
||
|
EditorGUILayout.Space();
|
||
|
}
|
||
|
|
||
|
if (InterestUtility.DrawPlayerInterest == true)
|
||
|
{
|
||
|
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
|
||
|
{
|
||
|
GUILayout.Label("Player Interest", EditorStyles.boldLabel);
|
||
|
|
||
|
InterestUtility.InterestObjectGizmoColor = EditorGUILayout.ColorField("Gizmo Color", InterestUtility.InterestObjectGizmoColor);
|
||
|
InterestUtility.InterestObjectGizmoSize = EditorGUILayout.Slider("Gizmo Size", InterestUtility.InterestObjectGizmoSize, 0.0f, 4.0f);
|
||
|
}
|
||
|
EditorGUILayout.EndVertical();
|
||
|
}
|
||
|
|
||
|
if (InterestUtility.DrawInterestCells == true || InterestUtility.DrawSamplePositions == true)
|
||
|
{
|
||
|
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
|
||
|
{
|
||
|
GUILayout.Label("Interest Cells", EditorStyles.boldLabel);
|
||
|
|
||
|
EditorGUILayout.BeginHorizontal();
|
||
|
{
|
||
|
DrawCellSizeButton(8);
|
||
|
DrawCellSizeButton(16);
|
||
|
DrawCellSizeButton(24);
|
||
|
DrawCellSizeButton(32);
|
||
|
DrawCellSizeButton(48);
|
||
|
DrawCellSizeButton(64);
|
||
|
}
|
||
|
EditorGUILayout.EndHorizontal();
|
||
|
|
||
|
InterestUtility.InterestCellGizmoColor = EditorGUILayout.ColorField("Gizmo Color", InterestUtility.InterestCellGizmoColor);
|
||
|
InterestUtility.InterestCellGizmoSize = EditorGUILayout.Slider("Gizmo Size", InterestUtility.InterestCellGizmoSize, 0.0f, 1.0f);
|
||
|
}
|
||
|
EditorGUILayout.EndVertical();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void DrawInterestProviders(InterestProviderSet interestProviders, bool addSpace)
|
||
|
{
|
||
|
interestProviders.Sort();
|
||
|
DrawInterestProviders(interestProviders.ReadOnlyValues, addSpace);
|
||
|
}
|
||
|
|
||
|
public static void DrawInterestProviders(List<IInterestProvider> interestProviders, bool addSpace)
|
||
|
{
|
||
|
if (interestProviders.Count <= 0)
|
||
|
return;
|
||
|
|
||
|
if (addSpace == true)
|
||
|
{
|
||
|
EditorGUILayout.Space();
|
||
|
}
|
||
|
|
||
|
_providersFoldout = EditorGUILayout.BeginFoldoutHeaderGroup(_providersFoldout, $"Interest Providers ({interestProviders.Count})");
|
||
|
if (_providersFoldout == true)
|
||
|
{
|
||
|
EditorGUI.BeginDisabledGroup(true);
|
||
|
{
|
||
|
for (int i = 0, count = interestProviders.Count; i < count; ++i)
|
||
|
{
|
||
|
IInterestProvider interestProvider = interestProviders[i];
|
||
|
EditorGUILayout.BeginHorizontal();
|
||
|
GUILayout.Button($"{interestProvider.SortOrder}", GUILayout.Width(40.0f));
|
||
|
GUILayout.Button($"{interestProvider.InterestMode}", GUILayout.Width(80.0f));
|
||
|
EditorGUILayout.ObjectField(interestProvider as Component, typeof(Object), true);
|
||
|
EditorGUILayout.EndHorizontal();
|
||
|
}
|
||
|
}
|
||
|
EditorGUI.EndDisabledGroup();
|
||
|
}
|
||
|
EditorGUILayout.EndFoldoutHeaderGroup();
|
||
|
}
|
||
|
|
||
|
public static void DrawObjectsInPlayerInterest(List<NetworkObject> objectsInPlayerInterest, bool addSpace)
|
||
|
{
|
||
|
if (objectsInPlayerInterest.Count <= 0)
|
||
|
return;
|
||
|
|
||
|
if (addSpace == true)
|
||
|
{
|
||
|
EditorGUILayout.Space();
|
||
|
}
|
||
|
|
||
|
int interestObjectCount = string.IsNullOrEmpty(InterestUtility.InterestObjectFilter) == true ? objectsInPlayerInterest.Count : _interestObjectCount;
|
||
|
|
||
|
_interestObjectCount = objectsInPlayerInterest.Count;
|
||
|
|
||
|
_interestObjectsFoldout = EditorGUILayout.BeginFoldoutHeaderGroup(_interestObjectsFoldout, $"Objects In Player Interest ({interestObjectCount})");
|
||
|
if (_interestObjectsFoldout == true)
|
||
|
{
|
||
|
EditorGUILayout.BeginHorizontal();
|
||
|
InterestUtility.InterestObjectFilter = EditorGUILayout.TextField(InterestUtility.InterestObjectFilter);
|
||
|
EditorGUILayout.EndHorizontal();
|
||
|
|
||
|
EditorGUI.BeginDisabledGroup(true);
|
||
|
{
|
||
|
_interestObjectCount = 0;
|
||
|
|
||
|
foreach (NetworkObject objectInPlayerInterest in objectsInPlayerInterest)
|
||
|
{
|
||
|
if (string.IsNullOrEmpty(InterestUtility.InterestObjectFilter) == false && objectInPlayerInterest.name.Contains(InterestUtility.InterestObjectFilter) == false)
|
||
|
continue;
|
||
|
|
||
|
EditorGUILayout.ObjectField(objectInPlayerInterest, typeof(Object), true);
|
||
|
++_interestObjectCount;
|
||
|
}
|
||
|
}
|
||
|
EditorGUI.EndDisabledGroup();
|
||
|
}
|
||
|
EditorGUILayout.EndFoldoutHeaderGroup();
|
||
|
}
|
||
|
|
||
|
// PRIVATE METHODS
|
||
|
|
||
|
private static bool DrawButton(string label, bool isActive)
|
||
|
{
|
||
|
Color backupBackgroundColor = GUI.backgroundColor;
|
||
|
|
||
|
if (isActive == true)
|
||
|
{
|
||
|
GUI.backgroundColor = Color.green;
|
||
|
}
|
||
|
|
||
|
bool result = GUILayout.Button(label) == true;
|
||
|
|
||
|
GUI.backgroundColor = backupBackgroundColor;
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
private static void DrawCellSizeButton(int cellSize)
|
||
|
{
|
||
|
if (DrawButton($"{cellSize}", Fusion.Simulation.AreaOfInterest.CELL_SIZE == cellSize) == true)
|
||
|
{
|
||
|
Fusion.Simulation.AreaOfInterest.CELL_SIZE = cellSize;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|