Files

87 lines
2.4 KiB
C#
Raw Permalink Normal View History

2026-05-13 02:53:42 +03:00
using Common;
2026-05-17 15:40:16 +03:00
namespace BasLib;
2026-05-13 02:53:42 +03:00
public record BasContours(InnerContour[] Inner, OuterContour[] Outer);
public record InnerContour(Vector3[] Points, uint[] Nums1, uint[] Nums2);
public record OuterContour(Vector3[] Points);
public static class BasParser
{
public static BasContours ReadFile(string path)
{
using FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
return ReadFile(fs);
}
public static BasContours ReadFile(Stream fs)
{
var innerContourCount = fs.ReadUInt32LittleEndian();
InnerContour[] innerContours = new InnerContour[innerContourCount];
for (var i = 0; i < innerContourCount; i++)
{
var pointCount = fs.ReadUInt32LittleEndian();
Vector3[] points = new Vector3[pointCount + 1];
for (var j = 0; j < pointCount + 1; j++)
{
var x = fs.ReadFloatLittleEndian();
var y = fs.ReadFloatLittleEndian();
var z = fs.ReadFloatLittleEndian();
points[j] = new Vector3(x, y, z);
}
uint[] nums1 = new uint[pointCount];
// batch 1
for (var j = 0; j < pointCount; j++)
{
var num = fs.ReadUInt32LittleEndian();
nums1[j] = num;
}
uint[] nums2 = new uint[pointCount];
// batch 2
for (var j = 0; j < pointCount; j++)
{
var num = fs.ReadUInt32LittleEndian();
nums2[j] = num;
}
innerContours[i] = new InnerContour(points, nums1, nums2);
}
var outerContourCount = fs.ReadUInt32LittleEndian();
OuterContour[] outerContours = new OuterContour[outerContourCount];
for (var i = 0; i < outerContourCount; i++)
{
var pointCount = fs.ReadUInt32LittleEndian();
Vector3[] points = new Vector3[pointCount + 1];
for (var j = 0; j < pointCount + 1; j++)
{
var x = fs.ReadFloatLittleEndian();
var y = fs.ReadFloatLittleEndian();
var z = fs.ReadFloatLittleEndian();
points[j] = new Vector3(x, y, z);
}
outerContours[i] = new OuterContour(points);
}
BasContours contours = new BasContours(innerContours, outerContours);
return contours;
}
}