Editor utility that generates retaining wall geometry for the level editor. It builds retaining wall pieces and wing returns by computing corner vertices for each bay and emitting prisms into an ArchMesh using provided kit and brush parameters.
using System.Collections.Generic;
using Sandbox;
namespace Sunless.Architecture;
// The wall the resolve described, plus the ArchWing returns that bury its ends in the bank.
public static class ArchRetainingGen
{
public static void Build( ArchMesh canvas, ArchRetainingShape shape, ArchKit kit, ArchBarrierBrushes brushes )
{
if ( shape is null || !shape.IsUsable )
{
return;
}
using ( canvas.Part( ArchPieces.Retaining ) )
{
foreach ( var bay in shape.Bays )
{
Bay( canvas, bay, shape, kit, brushes.Plinth );
}
ArchWing.Build( canvas, shape.Returns, shape.Stem, kit, brushes.Plinth );
}
}
// Leans back into the fill: the open face is battered, the buried face stands plumb, and the foot follows
// the grade on the open side rather than one level line under the whole run.
static void Bay( ArchMesh canvas, ArchRetainingBay bay, ArchRetainingShape shape, ArchKit kit, ArchBrush brush )
{
var span = bay.To.At - bay.From.At;
if ( span.Length < 0.05f )
{
return;
}
var embedment = ArchGround.Embedment( kit );
var half = shape.Stem * 0.5f;
var lower = new List<Vector3>
{
Corner( bay.From, -half, bay.From.Grade - embedment ),
Corner( bay.To, -half, bay.To.Grade - embedment ),
Corner( bay.To, half, bay.To.Grade - embedment ),
Corner( bay.From, half, bay.From.Grade - embedment )
};
var upper = new List<Vector3>
{
Corner( bay.From, shape.Lean - half, bay.From.Head ),
Corner( bay.To, shape.Lean - half, bay.To.Head ),
Corner( bay.To, half, bay.To.Head ),
Corner( bay.From, half, bay.From.Head )
};
canvas.Prism( lower, upper, brush, tangent: new Vector3( span.x, span.y, 0f ).Normal );
}
// Offset along the STATION's own fill direction, so two bays quote a shared joint identically and a corner mitres.
static Vector3 Corner( ArchRetainingStation station, float offset, float height )
{
var point = station.At + station.Fill * offset;
return new Vector3( point.x, point.y, height );
}
}