Editor/Decompiler/Lumps/NodeLump.cs
namespace BspImport.Decompiler.Lumps;

public class NodeLump : BaseLump
{
	public NodeLump( ImportContext context, byte[] data, int version = 0 ) : base( context, data, version ) { }

	protected override void Parse( BinaryReader reader )
	{
		var nodeSize = 32;// 32 bytes per node
		var nodeCount = reader.GetLength() / nodeSize;

		var nodes = new MapNode[nodeCount];

		for ( int i = 0; i < nodeCount; i++ )
		{
			var nodeReader = reader.Split( nodeSize );

			int planeIndex = nodeReader.ReadInt32();
			int firstChildIndex = nodeReader.ReadInt32();
			int secondChildIndex = nodeReader.ReadInt32();
			nodeReader.Skip<short>( 3 ); // mins
			nodeReader.Skip<short>( 3 ); // maxs
			ushort firstFaceIndex = nodeReader.ReadUInt16();
			ushort faceCount = nodeReader.ReadUInt16();
			short area = nodeReader.ReadInt16();

			var node = new MapNode( planeIndex, new int[] { firstChildIndex, secondChildIndex }, firstFaceIndex, faceCount, area );
			nodes[i] = node;
		}

		//Log.Info( $"NODES: {nodes.Length}" );
		Context.Nodes = nodes;
	}
}

public struct MapNode
{
	public int PlaneIndex;
	public int[] Children;
	public ushort FirstFaceIndex;
	public ushort FaceCount;
	public short Area;

	public MapNode( int planeIndex, int[] childIndices, ushort firstFaceIndex, ushort faceCount, short area )
	{
		PlaneIndex = planeIndex;
		Children = childIndices;
		FirstFaceIndex = firstFaceIndex;
		FaceCount = faceCount;
		Area = area;
	}
}