244 lines
15 KiB
C#
244 lines
15 KiB
C#
namespace DrawXXL
|
|
{
|
|
using UnityEngine;
|
|
using System;
|
|
|
|
#if UNITY_EDITOR
|
|
using UnityEditor;
|
|
|
|
[CustomEditor(typeof(GridVisualizer))]
|
|
[CanEditMultipleObjects]
|
|
public class GridVisualizerInspector : VisualizerParentInspector
|
|
{
|
|
public override void OnInspectorGUI()
|
|
{
|
|
int indentLevel_before = EditorGUI.indentLevel;
|
|
serializedObject.Update();
|
|
|
|
DrawConsumedLines("grid");
|
|
|
|
SerializedProperty sP_spaceType = serializedObject.FindProperty("spaceType");
|
|
EditorGUILayout.PropertyField(sP_spaceType, new GUIContent("Visualized space"));
|
|
|
|
GUILayout.Space(0.5f * EditorGUIUtility.singleLineHeight);
|
|
|
|
SerializedProperty sP_xGridType = serializedObject.FindProperty("xGridType");
|
|
SerializedProperty sP_yGridType = serializedObject.FindProperty("yGridType");
|
|
SerializedProperty sP_zGridType = serializedObject.FindProperty("zGridType");
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
EditorGUILayout.PropertyField(sP_xGridType, new GUIContent("X"));
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("colorForX"), GUIContent.none);
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
EditorGUILayout.PropertyField(sP_yGridType, new GUIContent("Y"));
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("colorForY"), GUIContent.none);
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
EditorGUILayout.PropertyField(sP_zGridType, new GUIContent("Z"));
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("colorForZ"), GUIContent.none);
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
GUILayout.Space(0.5f * EditorGUIUtility.singleLineHeight);
|
|
|
|
GUIStyle style_forFoldoutLine = new GUIStyle(EditorStyles.foldout);
|
|
style_forFoldoutLine.fontStyle = FontStyle.Bold;
|
|
|
|
GUIStyle style_ofHeadlines = new GUIStyle();
|
|
style_ofHeadlines.fontStyle = FontStyle.Bold;
|
|
|
|
DrawOrdersOfMagnitudeSection(style_forFoldoutLine);
|
|
|
|
GUILayout.Space(0.5f * EditorGUIUtility.singleLineHeight);
|
|
|
|
bool noDimensionIsDisplayed_asPlane = ((sP_xGridType.enumValueIndex != (int)GridVisualizer.XGridType.planes) && (sP_yGridType.enumValueIndex != (int)GridVisualizer.YGridType.planes) && (sP_zGridType.enumValueIndex != (int)GridVisualizer.ZGridType.planes));
|
|
bool planesSection_isDisabled = noDimensionIsDisplayed_asPlane;
|
|
EditorGUI.BeginDisabledGroup(planesSection_isDisabled);
|
|
EditorGUILayout.LabelField(planesSection_isDisabled ? "Planes details (no planes are activated, see above at X, Y and Z)" : "Planes details", style_ofHeadlines);
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel + 1;
|
|
|
|
SerializedProperty sP_coveredGridUnits_rel_forGridPlanes = serializedObject.FindProperty("coveredGridUnits_rel_forGridPlanes");
|
|
sP_coveredGridUnits_rel_forGridPlanes.floatValue = EditorGUILayout.FloatField(new GUIContent("Covered grid units", "This is relative to the biggest drawn order of magnitude." + Environment.NewLine + Environment.NewLine + "The minimum value is 2.5"), sP_coveredGridUnits_rel_forGridPlanes.floatValue);
|
|
sP_coveredGridUnits_rel_forGridPlanes.floatValue = Mathf.Max(sP_coveredGridUnits_rel_forGridPlanes.floatValue, 2.5f);
|
|
|
|
SerializedProperty sP_extentOfEachGridPlane_rel = serializedObject.FindProperty("extentOfEachGridPlane_rel");
|
|
EditorGUILayout.PropertyField(sP_extentOfEachGridPlane_rel, new GUIContent("Size", "This is relative to the smallest drawn order of magnitude." + Environment.NewLine + Environment.NewLine + "The minimum value is 0.1"));
|
|
sP_extentOfEachGridPlane_rel.floatValue = Mathf.Max(sP_extentOfEachGridPlane_rel.floatValue, 0.1f);
|
|
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("drawDensity"), new GUIContent("Density"));
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel - 1;
|
|
EditorGUI.EndDisabledGroup();
|
|
|
|
GUILayout.Space(0.5f * EditorGUIUtility.singleLineHeight);
|
|
|
|
bool noDimensionIsDisplayed_asLine = ((sP_xGridType.enumValueIndex != (int)GridVisualizer.XGridType.linesAlongY) && (sP_xGridType.enumValueIndex != (int)GridVisualizer.XGridType.linesAlongZ) && (sP_yGridType.enumValueIndex != (int)GridVisualizer.YGridType.linesAlongX) && (sP_yGridType.enumValueIndex != (int)GridVisualizer.YGridType.linesAlongZ) && (sP_zGridType.enumValueIndex != (int)GridVisualizer.ZGridType.linesAlongX) && (sP_zGridType.enumValueIndex != (int)GridVisualizer.ZGridType.linesAlongY));
|
|
EditorGUI.BeginDisabledGroup(noDimensionIsDisplayed_asLine);
|
|
EditorGUILayout.LabelField(noDimensionIsDisplayed_asLine ? "Lines details (no lines are activated, see above at X, Y and Z)" : "Lines details", style_ofHeadlines);
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel + 1;
|
|
|
|
SerializedProperty sP_coveredGridUnits_rel = serializedObject.FindProperty("coveredGridUnits_rel");
|
|
EditorGUILayout.PropertyField(sP_coveredGridUnits_rel, new GUIContent("Covered grid units", "This is relative to the biggest drawn order of magnitude." + Environment.NewLine + Environment.NewLine + "The minimum value is 2.5"));
|
|
sP_coveredGridUnits_rel.floatValue = Mathf.Max(sP_coveredGridUnits_rel.floatValue, 2.5f);
|
|
|
|
SerializedProperty sP_lengthOfEachGridLine_rel = serializedObject.FindProperty("lengthOfEachGridLine_rel");
|
|
EditorGUILayout.PropertyField(sP_lengthOfEachGridLine_rel, new GUIContent("Length", "This is relative to the smallest drawn order of magnitude." + Environment.NewLine + Environment.NewLine + "The minimum value is 0.1"));
|
|
sP_lengthOfEachGridLine_rel.floatValue = Mathf.Max(sP_lengthOfEachGridLine_rel.floatValue, 0.1f);
|
|
|
|
DrawLineWidth();
|
|
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel - 1;
|
|
EditorGUI.EndDisabledGroup();
|
|
|
|
GUILayout.Space(0.5f * EditorGUIUtility.singleLineHeight);
|
|
|
|
DrawCoordinateDisplaySection(sP_spaceType);
|
|
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("show_positionAroundWhichToDraw_forGrids"), new GUIContent("Visualize Position"));
|
|
|
|
SerializedProperty sP_show_distanceDisplay_forGrids = serializedObject.FindProperty("show_distanceDisplay_forGrids");
|
|
EditorGUILayout.PropertyField(sP_show_distanceDisplay_forGrids, new GUIContent("Visualize Distance of Position to Grid"));
|
|
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel + 1;
|
|
EditorGUI.BeginDisabledGroup(!sP_show_distanceDisplay_forGrids.boolValue);
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("offsetForDistanceDisplays_inGrids"), new GUIContent("Offset for Distance Display"));
|
|
EditorGUI.EndDisabledGroup();
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel - 1;
|
|
|
|
Draw_DrawPosition3DOffset();
|
|
DrawCheckboxFor_drawOnlyIfSelected("grid");
|
|
DrawCheckboxFor_hiddenByNearerObjects("grid");
|
|
|
|
serializedObject.ApplyModifiedProperties();
|
|
EditorGUI.indentLevel = indentLevel_before;
|
|
}
|
|
|
|
void DrawOrdersOfMagnitudeSection(GUIStyle style_forFoldoutLine)
|
|
{
|
|
SerializedProperty sP_magnitudeOrderSection_isOutfolded = serializedObject.FindProperty("magnitudeOrderSection_isOutfolded");
|
|
sP_magnitudeOrderSection_isOutfolded.boolValue = EditorGUILayout.Foldout(sP_magnitudeOrderSection_isOutfolded.boolValue, "Drawn orders of magnitude", true, style_forFoldoutLine);
|
|
if (sP_magnitudeOrderSection_isOutfolded.boolValue)
|
|
{
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel + 1;
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("draw1000grid"), new GUIContent("1000"));
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("draw100grid"), new GUIContent("100"));
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("draw10grid"), new GUIContent("10"));
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("draw1grid"), new GUIContent("1"));
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("draw0p1grid"), new GUIContent("0.1"));
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("draw0p01grid"), new GUIContent("0.01"));
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("draw0p001grid"), new GUIContent("0.001"));
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel - 1;
|
|
}
|
|
}
|
|
|
|
void DrawLineWidth()
|
|
{
|
|
SerializedProperty sP_lineWidthMode = serializedObject.FindProperty("lineWidthMode");
|
|
SerializedProperty sP_linesWidth_alongVisualizedAxis = serializedObject.FindProperty("linesWidth_alongVisualizedAxis");
|
|
SerializedProperty sP_linesWidth_perpendicularToVisualizedAxis = serializedObject.FindProperty("linesWidth_perpendicularToVisualizedAxis");
|
|
|
|
EditorGUILayout.PropertyField(sP_lineWidthMode, new GUIContent("Line width direction"));
|
|
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel + 1;
|
|
|
|
if (sP_lineWidthMode.enumValueIndex == (int)GridVisualizer.LineWidthMode.growAlongVisualizedAxis)
|
|
{
|
|
EditorGUI.BeginChangeCheck();
|
|
EditorGUILayout.PropertyField(sP_linesWidth_alongVisualizedAxis, new GUIContent("Line width", "This is relative to the concerned order of magnitude."));
|
|
bool hasChanged = EditorGUI.EndChangeCheck();
|
|
|
|
if (hasChanged)
|
|
{
|
|
sP_linesWidth_perpendicularToVisualizedAxis.floatValue = sP_linesWidth_alongVisualizedAxis.floatValue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
EditorGUI.BeginChangeCheck();
|
|
EditorGUILayout.PropertyField(sP_linesWidth_perpendicularToVisualizedAxis, new GUIContent("Line width", "This is relative to the concerned order of magnitude."));
|
|
sP_linesWidth_perpendicularToVisualizedAxis.floatValue = Mathf.Max(sP_linesWidth_perpendicularToVisualizedAxis.floatValue, 0.0f);
|
|
bool hasChanged = EditorGUI.EndChangeCheck();
|
|
|
|
if (hasChanged)
|
|
{
|
|
sP_linesWidth_alongVisualizedAxis.floatValue = sP_linesWidth_perpendicularToVisualizedAxis.floatValue;
|
|
sP_linesWidth_alongVisualizedAxis.floatValue = Mathf.Min(sP_linesWidth_alongVisualizedAxis.floatValue, GridVisualizer.max_linesWidth_alongVisualizedAxis);
|
|
}
|
|
}
|
|
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel - 1;
|
|
}
|
|
|
|
void DrawCoordinateDisplaySection(SerializedProperty sP_spaceType)
|
|
{
|
|
SerializedProperty sP_repeatingCoordsTextVariant = serializedObject.FindProperty("repeatingCoordsTextVariant");
|
|
EditorGUILayout.PropertyField(sP_repeatingCoordsTextVariant, new GUIContent("Coordiantes Display"));
|
|
|
|
switch (sP_repeatingCoordsTextVariant.enumValueIndex)
|
|
{
|
|
case (int)GridVisualizer.RepeatingCoordsTextVariant.repeatAfterDistance:
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel + 1;
|
|
|
|
SerializedProperty sP_distanceBetweenRepeatingCoordsTexts_relToGridDistance = serializedObject.FindProperty("distanceBetweenRepeatingCoordsTexts_relToGridDistance");
|
|
EditorGUILayout.PropertyField(sP_distanceBetweenRepeatingCoordsTexts_relToGridDistance, new GUIContent("Text distance between repeating coordinates", "This is relative to the grid distance." + Environment.NewLine + "The minimum value is 5." + Environment.NewLine + "You may see changes only if the length/extent of the lines/planes is long enough."));
|
|
sP_distanceBetweenRepeatingCoordsTexts_relToGridDistance.floatValue = Mathf.Max(sP_distanceBetweenRepeatingCoordsTexts_relToGridDistance.floatValue, UtilitiesDXXL_Grid.min_distanceBetweenRepeatingCoordsTexts_relToGridDistance);
|
|
DrawSharedFieldsOfNonDisabledCoordinateTextModes( sP_spaceType);
|
|
|
|
GUILayout.Space(0.5f * EditorGUIUtility.singleLineHeight);
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel - 1;
|
|
break;
|
|
case (int)GridVisualizer.RepeatingCoordsTextVariant.displayOnlyOnce:
|
|
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel + 1;
|
|
|
|
DrawSharedFieldsOfNonDisabledCoordinateTextModes( sP_spaceType);
|
|
|
|
GUILayout.Space(0.5f * EditorGUIUtility.singleLineHeight);
|
|
EditorGUI.indentLevel = EditorGUI.indentLevel - 1;
|
|
|
|
break;
|
|
case (int)GridVisualizer.RepeatingCoordsTextVariant.noDisplay:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void DrawSharedFieldsOfNonDisabledCoordinateTextModes(SerializedProperty sP_spaceType)
|
|
{
|
|
GUIContent coordinateTextOffset_GUIContent = new GUIContent("Text Position", "This is relative to the containing order of magnitude.");
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("offsetForCoordinateTextDisplays_inGrids"), coordinateTextOffset_GUIContent);
|
|
|
|
GUIContent textSize_GUIContent = new GUIContent("Text Size", "This is relative to the containing order of magnitude.");
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("sizeScalingForCoordinateTexts_inGrids"), textSize_GUIContent);
|
|
|
|
GUIContent skipXYZAxisIdentifier_GUIContent = new GUIContent("Skip 'X/Y/Z =' prefix", "This can save performance for large grid displays." + Environment.NewLine + Environment.NewLine + "The initial value of created components for this can be defined via 'DrawEngineBasics.skipXYZAxisIdentifier_inCoordinateTextsOnGridAxes'.");
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("skipXYZAxisIdentifier_inCoordinateTextsOnGridAxes"), skipXYZAxisIdentifier_GUIContent);
|
|
|
|
if (GridDisplaysALocalSpace(sP_spaceType))
|
|
{
|
|
GUIContent skipLocalPrefix_GUIContent = new GUIContent("Skip 'local' prefix", "This can save performance for large grid displays." + Environment.NewLine + Environment.NewLine + "The initial value of created components for this can be defined via 'DrawEngineBasics.skipLocalPrefix_inCoordinateTextsOnGridAxes'.");
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("skipLocalPrefix_inCoordinateTextsOnGridAxes"), skipLocalPrefix_GUIContent);
|
|
}
|
|
}
|
|
|
|
bool GridDisplaysALocalSpace(SerializedProperty sP_spaceType)
|
|
{
|
|
switch (sP_spaceType.enumValueIndex)
|
|
{
|
|
case (int)GridVisualizer.SpaceType.global:
|
|
return false;
|
|
case (int)GridVisualizer.SpaceType.localDefinedByParent:
|
|
return true;
|
|
case (int)GridVisualizer.SpaceType.localDefinedByThisGameobject:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
}
|
|
#endif
|
|
}
|