diff --git a/src/OpenApparatus.Core/Geometry/BoundaryWallBuilder.cs b/src/OpenApparatus.Core/Geometry/BoundaryWallBuilder.cs index 9149c46..76abc2c 100644 --- a/src/OpenApparatus.Core/Geometry/BoundaryWallBuilder.cs +++ b/src/OpenApparatus.Core/Geometry/BoundaryWallBuilder.cs @@ -50,7 +50,9 @@ static MeshData EmptyResult() static MeshData BuildClosed(Adjacency adj, float t, float h) { - var slab = SlabFrame.From(adj.SharedSegment, t); + // Extend the slab half a thickness past each end so perpendicular walls + // overlap at corners instead of leaving a t/2 square gap. + var slab = SlabFrame.From(Extend(adj.SharedSegment, t * 0.5f), t); var b = new MeshDataBuilder(); EmitClosedWallFaces(b, slab, h); b.EnsureSubmeshCount(SubmeshIndex.Count); @@ -85,11 +87,16 @@ static void EmitClosedWallFaces(MeshDataBuilder b, SlabFrame slab, float h) static MeshData BuildDoorway(Adjacency adj, float t, float h, Passage.Doorway door) { - var slab = SlabFrame.From(adj.SharedSegment, t); + // Extend the slab half a thickness past each end (see BuildClosed). + float ext = t * 0.5f; + var slab = SlabFrame.From(Extend(adj.SharedSegment, ext), t); const float EPS = 1e-5f; - // Sort openings by offset and validate fit + non-overlap. - var openings = new List(door.Openings); + // Sort openings by offset and validate fit + non-overlap. Offsets shift + // by the extension because the slab now starts ext before the segment. + var openings = new List(door.Openings.Count); + foreach (var op in door.Openings) + openings.Add(op.With(offsetAlongEdge: op.OffsetAlongEdge + ext)); openings.Sort((a, c) => a.OffsetAlongEdge.CompareTo(c.OffsetAlongEdge)); for (int i = 0; i < openings.Count; i++) { @@ -254,6 +261,14 @@ static void EmitBottomStrip(MeshDataBuilder b, SlabFrame slab, float xStart, flo slab.Corner(false, xStart, 0f)); } + /// Lengthens a segment by at each end, keeping + /// its direction — used to overlap walls at corners. + static EdgeSegment Extend(EdgeSegment seg, float d) + { + var dir = seg.Direction; + return new EdgeSegment(seg.Start - dir * d, seg.End + dir * d); + } + // -------------------- Slab frame helper -------------------- /// diff --git a/src/OpenApparatus.IO/OpenApparatus.IO.csproj b/src/OpenApparatus.IO/OpenApparatus.IO.csproj index 4ead8c9..d32c691 100644 --- a/src/OpenApparatus.IO/OpenApparatus.IO.csproj +++ b/src/OpenApparatus.IO/OpenApparatus.IO.csproj @@ -1,10 +1,9 @@ - + net8.0 12 enable