Browse Source

Rewrote surface grouping method to be iterative instead of tail-recursive. Fixes potential stack overflow issues when loading particularly large and complex maps.

readme
Nico de Poel 5 years ago
parent
commit
5dc8d2ff78
  1. 37
      Assets/Scripts/Support/BrushModel.cs

37
Assets/Scripts/Support/BrushModel.cs

@ -66,27 +66,34 @@ public class BrushModel
private void GroupSurfaces(QNode node, QSurface[] surfaces, Dictionary<(IntPtr, int, QSurfaceFlags), List<QSurface>> surfaceGroups)
{
if (node.contents < 0) // Leaf node
return;
var nodeQueue = new Queue<QNode>();
nodeQueue.Enqueue(node);
for (int surfIdx = 0; surfIdx < node.numSurfaces; ++surfIdx)
while (nodeQueue.Count > 0)
{
var surface = surfaces[node.firstSurface + surfIdx];
node = nodeQueue.Dequeue();
if (node.contents < 0) // Leaf node
continue;
IntPtr texPtr = surface.TextureInfo.texture;
int lightNum = surface.lightmapTextureNum;
QSurfaceFlags flags = surface.flags;
var key = (texPtr, lightNum, flags);
for (int surfIdx = 0; surfIdx < node.numSurfaces; ++surfIdx)
{
var surface = surfaces[node.firstSurface + surfIdx];
if (!surfaceGroups.ContainsKey(key))
surfaceGroups[key] = new List<QSurface>();
IntPtr texPtr = surface.TextureInfo.texture;
int lightNum = surface.lightmapTextureNum;
QSurfaceFlags flags = surface.flags;
var key = (texPtr, lightNum, flags);
surfaceGroups[key].Add(surface);
}
if (!surfaceGroups.ContainsKey(key))
surfaceGroups[key] = new List<QSurface>();
foreach (var childNode in node.Children)
{
GroupSurfaces(childNode, surfaces, surfaceGroups);
surfaceGroups[key].Add(surface);
}
foreach (var childNode in node.Children)
{
nodeQueue.Enqueue(childNode);
}
}
}

Loading…
Cancel
Save