Editor/Road/ArchRoadPicker.cs
namespace Sunless.Architecture;
public sealed class ArchRoadPicker : IArchPicker {
public ArchKind Kind => ArchKind.Road;
public void Under( ArchPicking picking ) {
if ( picking.Node.Payload is not ArchRoadPart road ) {
return;
}
var curve = road.Curve();
if ( !curve.IsUsable || !curve.Nearest( picking.Point, out var frame, out var gap ) || gap > road.Reach() ) {
return;
}
picking.Hit( ArchHitChannel.Path, gap, true );
var at = frame.Distance;
var crossing = road.Crossings.FirstOrDefault( entry =>
MathF.Abs( entry.Distance - at ) < MathF.Max( 12f, entry.Width ) * 0.5f );
var tunnel = ArchTunnel.Holding( road, at );
var bridge = ArchBridge.Carrying( road, at );
if ( crossing is not null ) {
picking.HitChild( crossing, ArchHitChannel.Span, 0f, true );
} else if ( tunnel is not null ) {
picking.HitChild( tunnel, ArchHitChannel.Span, 0f, true );
} else if ( bridge is not null ) {
picking.HitChild( bridge, ArchHitChannel.Span, 0f, true );
}
}
}