diff --git a/Code/2D/Sdf2DMeshWriter.cs b/Code/2D/Sdf2DMeshWriter.cs index 8c82224..558b529 100644 --- a/Code/2D/Sdf2DMeshWriter.cs +++ b/Code/2D/Sdf2DMeshWriter.cs @@ -488,13 +488,17 @@ private void InitPolyMeshBuilder( PolygonMeshBuilder builder, int offset, int co } } - private string PrintEdgeLoops( int offset, int count, out Vector2 pos ) + private record DebugDump( + string Exception, + string EdgeLoops, + EdgeStyle EdgeStyle, + float EdgeWidth, + int EdgeFaces ); + + private DebugDump GenerateDebugDump( int offset, int count ) { var writer = new StringWriter(); - pos = 0f; - var vertexCount = 0; - for ( var i = 0; i < count; ++i ) { var edgeLoop = EdgeLoops[offset + i]; @@ -502,22 +506,13 @@ private string PrintEdgeLoops( int offset, int count, out Vector2 pos ) for ( var j = 0; j < edgeLoop.Count; ++j ) { var vertex = SourceVertices[edgeLoop.FirstIndex + j]; - writer.Write( $"({vertex.x:R}, {vertex.y:R})," ); - - pos += vertex; + writer.Write($"{vertex.x:R},{vertex.y:R};"); } - vertexCount += edgeLoop.Count; - - writer.WriteLine(); - } - - if ( vertexCount > 0 ) - { - pos /= vertexCount; + writer.Write("\n"); } - return writer.ToString(); + return new DebugDump( null, writer.ToString(), EdgeStyle.Sharp, 0, 0 ); } private void WriteRenderMesh( Sdf2DLayer layer ) @@ -550,54 +545,69 @@ private void WriteRenderMesh( Sdf2DLayer layer ) { InitPolyMeshBuilder( polyMeshBuilder, offset, count ); - if ( allSameMaterial ) + try { - polyMeshBuilder.Extrude( (layer.Depth * 0.5f - edgeRadius) / scale ); - } + if ( allSameMaterial ) + { + polyMeshBuilder.Extrude( (layer.Depth * 0.5f - edgeRadius) / scale ); + } - switch ( layer.EdgeStyle ) - { - case EdgeStyle.Sharp: - polyMeshBuilder.Fill(); - break; - - case EdgeStyle.Bevel: - polyMeshBuilder.Bevel( bevelScale, bevelScale ); - polyMeshBuilder.Fill(); - break; - - case EdgeStyle.Round: - polyMeshBuilder.Arc( bevelScale, bevelScale, layer.EdgeFaces ); - polyMeshBuilder.Fill(); - break; - } + switch ( layer.EdgeStyle ) + { + case EdgeStyle.Sharp: + polyMeshBuilder.Fill(); + break; - if ( allSameMaterial ) - { - polyMeshBuilder.Mirror(); + case EdgeStyle.Bevel: + polyMeshBuilder.Bevel( bevelScale, bevelScale ); + polyMeshBuilder.Fill(); + break; - _frontMeshWriter.AddFaces( polyMeshBuilder, - new Vector3( 0f, 0f, layer.Offset ), - new Vector3( scale, scale, scale ), - layer.TexCoordSize ); + case EdgeStyle.Round: + polyMeshBuilder.Arc( bevelScale, bevelScale, layer.EdgeFaces ); + polyMeshBuilder.Fill(); + break; + } - continue; - } + if ( allSameMaterial ) + { + polyMeshBuilder.Mirror(); - if ( layer.FrontFaceMaterial != null ) - { - _frontMeshWriter.AddFaces( polyMeshBuilder, - new Vector3( 0f, 0f, layer.Depth * 0.5f + layer.Offset - edgeRadius ), - new Vector3( scale, scale, scale ), - layer.TexCoordSize ); - } + _frontMeshWriter.AddFaces( polyMeshBuilder, + new Vector3( 0f, 0f, layer.Offset ), + new Vector3( scale, scale, scale ), + layer.TexCoordSize ); + + continue; + } - if ( layer.BackFaceMaterial != null ) + if ( layer.FrontFaceMaterial != null ) + { + _frontMeshWriter.AddFaces( polyMeshBuilder, + new Vector3( 0f, 0f, layer.Depth * 0.5f + layer.Offset - edgeRadius ), + new Vector3( scale, scale, scale ), + layer.TexCoordSize ); + } + + if ( layer.BackFaceMaterial != null ) + { + _backMeshWriter.AddFaces( polyMeshBuilder, + new Vector3( 0f, 0f, layer.Depth * -0.5f + layer.Offset + edgeRadius ), + new Vector3( scale, scale, -scale ), + layer.TexCoordSize ); + } + } + catch ( Exception e ) { - _backMeshWriter.AddFaces( polyMeshBuilder, - new Vector3( 0f, 0f, layer.Depth * -0.5f + layer.Offset + edgeRadius ), - new Vector3( scale, scale, -scale ), - layer.TexCoordSize ); + Log.Error( $"Internal error in PolygonMeshBuilder!\n\n" + + $"Please paste the info below in this thread:\nhttps://github.com/Facepunch/sbox-sdf/issues/17\n\n" + + $"{Json.Serialize( GenerateDebugDump( offset, count ) with + { + Exception = e.ToString(), + EdgeStyle = layer.EdgeStyle, + EdgeWidth = bevelScale, + EdgeFaces = layer.EdgeFaces + } )}" ); } }