Editor/Services/ArchFixtureGuard.cs
using System;
using System.Collections.Generic;
using Sandbox;
namespace Sunless.Architecture;
// Edge barrier for wall-hung fixtures; delegates to the barrier engine.
public static class ArchFixtureGuard {
// Bays are edge-by-edge so stations land on straight stretches, not across corners.
public static ArchBarrierSpec Spec( ArchKit kit, float height, IReadOnlyList<Vector3> path, BarrierGround ground, BarrierStyle style = BarrierStyle.Picket ) {
var spec = new ArchBarrierSpec {
Style = style,
Top = PicketTop.Flat,
Ground = ground,
Height = MathF.Max( 12f, height ),
PanelLength = ArchGuardStyles.Bay( style, kit ),
PostSize = MathF.Max( 1f, kit.NewelSize ),
PanelThickness = kit.SolidGuardThickness,
Rails = 2
};
for ( var edge = 0; edge + 1 < (path?.Count ?? 0); edge++ ) {
var division = ArchDivide.AtMost( (path[edge + 1] - path[edge]).Length, spec.PanelLength );
for ( var bay = 0; bay < division.Count; bay++ ) {
spec.Bays.Add( new ArchBarrierBay { Span = division.Step } );
}
}
return spec;
}
// One resolve for the generator and the ghost: the posts drawn are the posts built.
public static ArchBarrierShape Resolve( IReadOnlyList<Vector3> path, ArchBarrierSpec spec ) {
if ( path is not { Count: >= 2 } ) {
return new ArchBarrierShape();
}
return ArchBarrierShape.Resolve( ArchCurve.Polyline( path ), spec );
}
public static void Build( ArchMesh canvas, IReadOnlyList<Vector3> path, ArchKit kit, float height, BarrierGround ground, ArchBarrierBrushes brushes,
BarrierStyle style = BarrierStyle.Picket ) {
var spec = Spec( kit, height, path, ground, style );
ArchBarrierGen.Build( canvas, Resolve( path, spec ), spec, kit, brushes );
}
public static void Ghost( IReadOnlyList<Vector3> path, ArchKit kit, float height, BarrierGround ground, BarrierStyle style = BarrierStyle.Picket ) {
var spec = Spec( kit, height, path, ground, style );
ArchGhost.Barrier( Resolve( path, spec ), spec );
}
}