Editor/Decompiler/Lumps/DisplacementInfoLump.cs
namespace BspImport.Decompiler.Lumps;
public class DisplacementInfoLump : BaseLump
{
public DisplacementInfoLump( ImportContext context, byte[] data, int version = 0 ) : base( context, data, version ) { }
protected override void Parse( BinaryReader reader )
{
var infoLength = 176;
var infoCount = reader.GetLength() / infoLength;
var infos = new DisplacementInfo[infoCount];
for ( int i = 0; i < infoCount; i++ )
{
var rInfo = reader.Split( infoLength );
var startPosition = rInfo.ReadVector3();
var firstVertex = rInfo.ReadInt32();
var firstTri = rInfo.ReadInt32();
var power = rInfo.ReadInt32();
var minTess = rInfo.ReadInt32();
var smoothingAngle = rInfo.ReadSingle();
rInfo.Skip<int>(); // contents
var mapFace = rInfo.ReadUInt16();
rInfo.Skip<int>(); // lightmapAlphaStart
rInfo.Skip<int>(); // lightmapSamplePositionStart
var info = new DisplacementInfo( startPosition, firstVertex, firstTri, power, minTess, smoothingAngle, mapFace );
infos[i] = info;
}
Context.Geometry.SetDisplacementInfos( infos );
}
}
public struct DisplacementInfo
{
public Vector3 StartPosition;
public int FirstVertex;
public int FirstTri;
public int Power;
public int MinTess;
public float SmoothingAngle;
public ushort MapFace;
public DisplacementInfo( Vector3 startPosition, int firstVertex, int firstTri, int power, int minTess, float smoothingAngle, ushort mapFace )
{
StartPosition = startPosition;
FirstVertex = firstVertex;
FirstTri = firstTri;
Power = power;
MinTess = minTess;
SmoothingAngle = smoothingAngle;
MapFace = mapFace;
}
public int Side => (1 << Power) + 1;
public int VertCount => Side * Side;
}