Skip to content

Commit d6e96e1

Browse files
authored
Merge pull request #100 from devedse/copilot/fix-99
Optimize quad culling algorithm from O(N²) to O(N) using spatial partitioning
2 parents ab01557 + 5fe15c4 commit d6e96e1

File tree

8 files changed

+450
-24
lines changed

8 files changed

+450
-24
lines changed

DeveMazeGeneratorCore.Coaster3MF.Tests/DeveMazeGeneratorCore.Coaster3MF.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net9.0</TargetFramework>
4+
<TargetFramework>net8.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<IsPackable>false</IsPackable>

DeveMazeGeneratorCore.Coaster3MF/MazeCoaster3MF.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,21 @@ public void Generate3MFCoaster(int mazeSize, int? seed = null)
6868
var meshData = _geometryGenerator.GenerateMazeGeometry(maze.InnerMap, path);
6969

7070
var nonManifoldEdgeDetector = new NonManifoldEdgeDetector();
71-
var meshAnalyzeResult = nonManifoldEdgeDetector.AnalyzeMesh(meshData);
71+
if (mazeSize < 50)
72+
{
73+
var meshAnalyzeResult = nonManifoldEdgeDetector.AnalyzeMesh(meshData);
74+
Console.WriteLine($"Non-manifold edges detected:{Environment.NewLine}{meshAnalyzeResult.ToString("\t")}");
75+
}
76+
else if (mazeSize < 100)
77+
{
78+
var meshAnalyzeResult = nonManifoldEdgeDetector.AnalyzeMeshOnlyBorderEdges(meshData);
79+
Console.WriteLine($"Border edges: {meshAnalyzeResult.Count}");
80+
}
81+
else
82+
{
83+
Console.WriteLine("Skipping non-manifold edge detection for large maze size.");
84+
}
7285

73-
Console.WriteLine($"Non-manifold edges detected:{Environment.NewLine}{meshAnalyzeResult.ToString("\t")}");
7486

7587
// Generate filename with triangle and vertex counts
7688
var usedSeed = seed ?? 1337;

DeveMazeGeneratorCore.Coaster3MF/MazeGeometryGenerator.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public MeshData GenerateMazeGeometry(InnerMap maze, List<MazePointPos> path, boo
4646
/// <summary>
4747
/// Generates quads representing the maze geometry (ground, walls, path).
4848
/// </summary>
49-
public List<Quad> GenerateMazeQuads(InnerMap maze, List<MazePointPos> path, bool singleCuboidPerPixel = true)
49+
public List<Quad> GenerateMazeQuads(InnerMap maze, List<MazePointPos> path, bool singleCuboidPerPixel = true, bool enableFaceCulling = true)
5050
{
5151
var quads = new List<Quad>();
5252

@@ -63,7 +63,10 @@ public List<Quad> GenerateMazeQuads(InnerMap maze, List<MazePointPos> path, bool
6363
AddMazePath(maze, quads, pathData);
6464

6565
// Cull hidden faces (interior faces between adjacent cubes)
66-
MeshOptimizer.CullHiddenFaces(quads);
66+
if (enableFaceCulling)
67+
{
68+
MeshOptimizer.CullHiddenFaces(quads);
69+
}
6770

6871
// Additional quad optimizations (merging adjacent quads) applied after adding paths
6972
// Even though this algorithm is quite cool, it doesn't work as it causes non-manifold edges

0 commit comments

Comments
 (0)