57 lines
2.5 KiB
C#
57 lines
2.5 KiB
C#
using UnityEngine;
|
|
|
|
namespace PathBerserker2d
|
|
{
|
|
internal static class NavGraphDrawer
|
|
{
|
|
public static void Draw(NavGraph graph)
|
|
{
|
|
Matrix4x4 oldMatrix = Gizmos.matrix;
|
|
Gizmos.matrix = Matrix4x4.identity;
|
|
|
|
SharedMaterials.UnlitStripped.SetFloat(SharedMaterials.UnlitStripped_SegmentSizeId, 0.08f);
|
|
SharedMaterials.UnlitStripped.SetFloat(SharedMaterials.UnlitStripped_PauseSizeId, 0.08f * (PathBerserker2dSettings.NavTags.Length - 2));
|
|
|
|
// draw segments
|
|
foreach (var pair in graph.segmentTrees)
|
|
{
|
|
foreach (var cluster in pair.Value.Clusters)
|
|
{
|
|
DrawCluster(cluster, pair.Value.WorldToLocal.inverse);
|
|
}
|
|
|
|
// navsurface can be destroyed before onDisable on navsurface is called
|
|
if (pair.Key != null)
|
|
NavSurfaceDrawer.DrawNavSurface(pair.Key);
|
|
}
|
|
Gizmos.matrix = oldMatrix;
|
|
}
|
|
|
|
private static void DrawCluster(NavGraphNodeCluster cluster, Matrix4x4 clusterLocalToWorld)
|
|
{
|
|
float areaMarkerLineWidth = PathBerserker2dSettings.NavAreaMarkerLineWidth;
|
|
foreach (var mod in cluster.modifiers)
|
|
{
|
|
Vector2 a = cluster.GetPositionAlongSegment(mod.T);
|
|
Vector2 b = cluster.GetPositionAlongSegment(mod.T + mod.Length);
|
|
Vector2 tangent = b - a;
|
|
Quaternion rot = Quaternion.Euler(0, 0, Vector2.SignedAngle(Vector2.right, tangent));
|
|
SharedMaterials.UnlitStripped.SetFloat(SharedMaterials.UnlitStripped_XOffsetId, 0.08f * mod.NavTag);
|
|
SharedMaterials.UnlitStripped.SetColor(SharedMaterials.UnlitStripped_ColorId, PathBerserker2dSettings.GetNavTagColor(mod.NavTag));
|
|
SharedMaterials.UnlitStripped.SetPass(0);
|
|
Graphics.DrawMeshNow(PrimitiveMesh.Quad, clusterLocalToWorld * Matrix4x4.TRS(a, rot, new Vector3(tangent.magnitude, areaMarkerLineWidth)));
|
|
}
|
|
|
|
for (int iNode = 0; iNode < cluster.nodes.Count; iNode++)
|
|
{
|
|
var node = cluster.nodes[iNode];
|
|
var link = node.link;
|
|
|
|
if (link.LinkType > 0)
|
|
NavLinkInstanceDrawer.Draw(link, cluster.owner.LocalToWorld.MultiplyPoint3x4(cluster.GetPositionAlongSegment(node.t)),
|
|
node.LinkTarget.owner.LocalToWorld.MultiplyPoint3x4(node.LinkTarget.GetPositionAlongSegment(node.LinkTargetT)));
|
|
}
|
|
}
|
|
}
|
|
}
|