Files
sbox-public/engine/Sandbox.Engine/Scene/Components/Mesh/HalfEdgeMesh/HalfEdgeMesh.Serialize.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

92 lines
1.6 KiB
C#

using System.IO;
namespace HalfEdgeMesh;
partial class Mesh
{
public byte[] Serialize()
{
using var ms = new MemoryStream();
using ( var bw = new BinaryWriter( ms ) )
{
Serialize( bw );
}
return ms.ToArray();
}
public void Serialize( BinaryWriter writer )
{
writer.Write( VertexCount );
writer.Write( HalfEdgeCount );
writer.Write( FaceCount );
foreach ( var v in VertexList )
{
writer.Write( v.Edge );
}
foreach ( var he in HalfEdgeList )
{
writer.Write( he.Vertex );
writer.Write( he.OppositeEdge );
writer.Write( he.NextEdge );
writer.Write( he.Face );
}
foreach ( var f in FaceList )
{
writer.Write( f.Edge );
}
}
public void Deserialize( BinaryReader reader )
{
var vertexCount = reader.ReadInt32();
var edgeCount = reader.ReadInt32();
var faceCount = reader.ReadInt32();
for ( int i = 0; i < vertexCount; ++i )
{
var hVertex = AllocateVertex( new Vertex()
{
Edge = reader.ReadInt32(),
} );
if ( this[hVertex].Edge < 0 )
{
FreeVertex( hVertex );
}
}
for ( int i = 0; i < edgeCount; ++i )
{
var hEdge = AllocateHalfEdge( new HalfEdge()
{
Vertex = reader.ReadInt32(),
OppositeEdge = reader.ReadInt32(),
NextEdge = reader.ReadInt32(),
Face = reader.ReadInt32(),
} );
if ( this[hEdge].Vertex < 0 )
{
FreeHalfEdge( hEdge );
}
}
for ( int i = 0; i < faceCount; ++i )
{
var hFace = AllocateFace( new Face()
{
Edge = reader.ReadInt32(),
} );
if ( this[hFace].Edge < 0 )
{
FreeFace( hFace );
}
}
}
}