@ -66,27 +66,34 @@ public class BrushModel
private void GroupSurfaces ( QNode node , QSurface [ ] surfaces , Dictionary < ( IntPtr , int , QSurfaceFlags ) , List < QSurface > > surfaceGroups )
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 ) ;
}
}
}
}
}