summaryrefslogtreecommitdiff
path: root/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/Editor/RuleEditors/RuleElevationPenaltyEditor.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/Editor/RuleEditors/RuleElevationPenaltyEditor.cs')
-rw-r--r--Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/Editor/RuleEditors/RuleElevationPenaltyEditor.cs61
1 files changed, 61 insertions, 0 deletions
diff --git a/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/Editor/RuleEditors/RuleElevationPenaltyEditor.cs b/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/Editor/RuleEditors/RuleElevationPenaltyEditor.cs
new file mode 100644
index 0000000..30eac85
--- /dev/null
+++ b/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/Editor/RuleEditors/RuleElevationPenaltyEditor.cs
@@ -0,0 +1,61 @@
+using Pathfinding.Graphs.Grid.Rules;
+using UnityEditor;
+using UnityEngine;
+
+namespace Pathfinding {
+ /// <summary>Editor for the <see cref="RuleElevationPenalty"/> rule</summary>
+ [CustomGridGraphRuleEditor(typeof(RuleElevationPenalty), "Penalty from Elevation")]
+ public class RuleElevationPenaltyEditor : IGridGraphRuleEditor {
+ float lastChangedTime = -10000;
+
+ public void OnInspectorGUI (GridGraph graph, GridGraphRule rule) {
+ var target = rule as RuleElevationPenalty;
+
+ if (target.curve == null || target.curve.length == 0) target.curve = AnimationCurve.Linear(0, 0, 1, 1);
+ target.penaltyScale = EditorGUILayout.FloatField("Penalty Scale", target.penaltyScale);
+ target.penaltyScale = Mathf.Max(target.penaltyScale, 1.0f);
+
+ EditorGUILayout.LabelField("Elevation Range", "");
+ EditorGUI.BeginChangeCheck();
+ EditorGUI.indentLevel++;
+ target.elevationRange.x = EditorGUILayout.FloatField("Min", target.elevationRange.x);
+ target.elevationRange.y = EditorGUILayout.FloatField("Max", target.elevationRange.y);
+ target.elevationRange.x = Mathf.Max(target.elevationRange.x, 0);
+ target.elevationRange.y = Mathf.Max(target.elevationRange.y, target.elevationRange.x + 1.0f);
+ EditorGUI.indentLevel--;
+ if (EditorGUI.EndChangeCheck()) lastChangedTime = Time.realtimeSinceStartup;
+
+ target.curve = EditorGUILayout.CurveField(target.curve, Color.red, new Rect(0, 0, 1, 1));
+
+ EditorGUILayout.HelpBox("Nodes will get a penalty between 0 and " + target.penaltyScale.ToString("0") + " depending on their elevation above the grid graph plane", MessageType.None);
+ }
+
+ protected static readonly Color GizmoColorMax = new Color(222.0f/255, 113.0f/255, 33.0f/255, 0.5f);
+ protected static readonly Color GizmoColorMin = new Color(33.0f/255, 104.0f/255, 222.0f/255, 0.5f);
+
+ public void OnSceneGUI (GridGraph graph, GridGraphRule rule) {
+ var target = rule as RuleElevationPenalty;
+
+ // Draw some helpful gizmos in the scene view for a few seconds whenever the settings change
+ const float FullAlphaTime = 2.0f;
+ const float FadeoutTime = 0.5f;
+ float alpha = Mathf.SmoothStep(1, 0, (Time.realtimeSinceStartup - lastChangedTime - FullAlphaTime)/FadeoutTime);
+
+ if (alpha <= 0) return;
+
+ var currentTransform = graph.transform * Matrix4x4.Scale(new Vector3(graph.width, 1, graph.depth));
+ Handles.matrix = currentTransform.matrix;
+ var zTest = Handles.zTest;
+ Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual;
+ Handles.color = GizmoColorMin * new Color(1.0f, 1.0f, 1.0f, alpha);
+ Handles.DrawAAConvexPolygon(new Vector3[] { new Vector3(0, target.elevationRange.x, 0), new Vector3(1, target.elevationRange.x, 0), new Vector3(1, target.elevationRange.x, 1), new Vector3(0, target.elevationRange.x, 1) });
+ Handles.color = GizmoColorMax * new Color(1.0f, 1.0f, 1.0f, alpha);
+ Handles.DrawAAConvexPolygon(new Vector3[] { new Vector3(0, target.elevationRange.y, 0), new Vector3(1, target.elevationRange.y, 0), new Vector3(1, target.elevationRange.y, 1), new Vector3(0, target.elevationRange.y, 1) });
+ Handles.zTest = zTest;
+ Handles.matrix = Matrix4x4.identity;
+
+ // Repaint the scene view until the alpha goes to zero
+ SceneView.RepaintAll();
+ }
+ }
+}