FontRenderer: Basic Rich Text processing and lazy text building

This commit is contained in:
Simon Lübeß
2024-03-16 23:35:12 +01:00
parent f9ea705e77
commit 96609a6c31
5 changed files with 148 additions and 45 deletions
@@ -1,11 +1,20 @@
using System;
using static GlitchyEngine.Renderer.Text.FontRenderer;
namespace GlitchyEngine.World.Components;
enum TextRendererFlags
{
IsRichText = 1,
NeedsRebuild = 2
}
struct TextRendererComponent : IDisposableComponent
{
private String _text;
private PreparedText _preparedText;
private bool _isRichText;
private TextRendererFlags _flags;
public StringView Text
{
@@ -19,14 +28,27 @@ struct TextRendererComponent : IDisposableComponent
}
}
public PreparedText PreparedText
{
get => _preparedText;
set mut => SetReference!(_preparedText, value);
}
public bool IsRichText
{
get => _isRichText;
set mut => _isRichText = value;
get => _flags.HasFlag(.IsRichText);
set mut => Enum.SetFlagConditionally(ref _flags, .IsRichText, value);
}
public bool NeedsRebuild
{
get => _flags.HasFlag(.NeedsRebuild);
set mut => Enum.SetFlagConditionally(ref _flags, .NeedsRebuild, value);
}
public void Dispose()
{
delete _text;
_preparedText?.ReleaseRef();
}
}
+24
View File
@@ -10,6 +10,8 @@ using GlitchyEngine.Math;
using GlitchyEngine.Scripting.Classes;
using GlitchyEngine.Serialization;
using GlitchyEngine.World.Components;
using GlitchyEngine.Renderer.Text;
using static GlitchyEngine.Renderer.Text.FontRenderer;
namespace GlitchyEngine.World
{
@@ -55,6 +57,8 @@ namespace GlitchyEngine.World
cameraEntity
};
Font _font ~ _.ReleaseRef();
/// Gets or sets the name of the scene.
public StringView Name
@@ -117,6 +121,8 @@ namespace GlitchyEngine.World
scene.InitPolygonCollider2D(e, collider);
}
});
_font = new Font(@"C:\Windows\Fonts\arial.ttf", 24);
}
public ~this()
@@ -768,6 +774,22 @@ namespace GlitchyEngine.World
}
}
private void BuildTexts()
{
for (let (entity, textRenderer) in _ecsWorld.Enumerate<TextRendererComponent>())
{
if (textRenderer.NeedsRebuild || textRenderer.PreparedText == null)
{
using (PreparedText preparedText = FontRenderer.PrepareText(_font, textRenderer.Text, 24, .Black))
{
textRenderer.PreparedText = preparedText;
}
textRenderer.NeedsRebuild = false;
}
}
}
public void Update(GameTime gameTime, UpdateMode mode)
{
Debug.Profiler.ProfileRendererFunction!();
@@ -807,6 +829,8 @@ namespace GlitchyEngine.World
_destroyQueue.Clear();
}
BuildTexts();
}
/// Creates a new Entity with the given name.
+2 -12
View File
@@ -25,10 +25,6 @@ class SceneRenderer
public RenderTargetGroup CompositeTarget => _compositeTarget;
Font _font ~ _.ReleaseRef();
FontRenderer.PreparedText _smallLinesInfo;
public this()
{
RenderTargetGroupDescription desc = .(100, 100,
@@ -52,8 +48,6 @@ class SceneRenderer
_cameraTarget.[Friend]Identifier = "Camera Target";
_gammaCorrectEffect = Content.LoadAsset("Resources/Shaders/GammaCorrect.hlsl");
_font = new Font(@"C:\Windows\Fonts\arial.ttf", 24);
}
/// Sets the size of the viewport into which the scene will be rendered.
@@ -214,14 +208,10 @@ class SceneRenderer
for (var (entity, transform, text, editorFlags) in Scene._ecsWorld.Enumerate<TransformComponent, TextRendererComponent, EditorFlagsComponent>())
{
if (editorFlags.Flags.HasFlag(.HideInScene))
if (editorFlags.Flags.HasFlag(.HideInScene) || text.PreparedText == null)
continue;
_smallLinesInfo = FontRenderer.PrepareText(_font, text.Text, 24, .Black);
FontRenderer.DrawText(_smallLinesInfo, transform.WorldTransform * Matrix.Scaling(1.0f / 24.0f));
_smallLinesInfo.ReleaseRef();
FontRenderer.DrawText(text.PreparedText, transform.WorldTransform * Matrix.Scaling(1.0f / 24.0f));
}
//FontRenderer.DrawText(_smallLinesInfo, 0, 0);