From dec0a004a5e264c7d6105ea6475637832cf8378e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Sun, 2 Aug 2026 11:51:35 +0200 Subject: [PATCH] Preprocess and delete glyph shape --- GlitchyEngine/src/Renderer/Text/Font.bf | 40 ++++++++----------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/GlitchyEngine/src/Renderer/Text/Font.bf b/GlitchyEngine/src/Renderer/Text/Font.bf index 67def83..00f7c4e 100644 --- a/GlitchyEngine/src/Renderer/Text/Font.bf +++ b/GlitchyEngine/src/Renderer/Text/Font.bf @@ -471,13 +471,11 @@ namespace GlitchyEngine.Renderer.Text void DrawAtlas() { Debug.Profiler.ProfileResourceFunction!(); + + // Pixels per Em + double scale = 64.0; // TODO: Default values from MSDF-Atlas-Gen - // TODO: - // Via tryPack argument: - double scale = 32.0; - - // Via Atlas Packer constructor: msdfgen.Range unitRange = .(0.0, 0.0); msdfgen.Range pxRange = .(-1.0, 1.0); Padding innerUnitPadding = .(0); @@ -599,29 +597,15 @@ namespace GlitchyEngine.Renderer.Text desc.Advance = (float)(advance * _geometryScale); - // No Skia, no ResolveShapeGeometry :/ - //if (preprocessGeometry) - //{ - // Debug.Profiler.ProfileResourceScope!("msdfgen.ResolveShapeGeometry"); - - // msdfgen.ResolveShapeGeometry(shape); - //} - Shape.Normalize(desc.Shape); var bounds = Shape.GetBounds(desc.Shape); // TODO: Save shapes and bounds in desc? - //if (!preprocessGeometry) - { - // TODO! - // Determine if shape is winded incorrectly and reverse it in that case - //double2 outerPoint = .(bounds.Left - (bounds.Right - bounds.Left) - 1.0, bounds.Bottom - (bounds.Top - bounds.Bottom) - 1.0); - //if (msdfgen::SimpleTrueShapeDistanceFinder::oneShotDistance(shape, outerPoint) > 0) { - // for (msdfgen::Contour &contour : shape.contours) - // contour.reverse(); - //} - } + // msdfgen's geometry preprocessing needs Skia, which this build doesn't have, so we do what msdf-atlas-gen + // does in that case: determine if the shape is winded incorrectly and reverse it in that case. + // Reversing the contours doesn't change the bounding box, so bounds stays valid. + Shape.ReverseIfNeeded(desc.Shape, bounds); // TODO: Ohne korrekten _geometryScaler läuft hier garnüscht. double scale = glyphAttributes.Scale * _geometryScale; @@ -992,14 +976,11 @@ namespace GlitchyEngine.Renderer.Text { Debug.Profiler.ProfileResourceFunction!(); - msdfgen.ResolveShapeGeometry(desc.Shape); - - Shape.Normalize(desc.Shape); - + // The shape is already normalized and preprocessed by CalculateGlyphBox and isn't touched inbetween, + // so all that's left to do here is coloring the edges. msdfgen.EdgeColoringSimple(desc.Shape, 3.0); // prepare projection - //SDFTransformation t = SDFTransformation(Projection(32.0, 32.0, 0.125, 0.125), DistanceMapping(msdfgen.Range(0.125))); SDFTransformation t = SDFTransformation(Projection(desc.boxScale, desc.boxScale, desc.boxTranslate.X, desc.boxTranslate.Y), DistanceMapping(desc.boxRange)); int bufferX = desc.Width; @@ -1095,6 +1076,9 @@ namespace GlitchyEngine.Renderer.Text _atlas.SetData((Color*)pixels.Ptr, (.)desc.MapCoord.X, (.)desc.MapCoord.Y, (.)desc.Width, (.)desc.Height, (.)desc.MapCoord.Z); } + // The shape is no longer needed + msdfgen.DestroyShape(desc.Shape); + desc.Shape = null; } } }