mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 21:01:52 +00:00
FontRenderer: Basic Rich Text processing and lazy text building
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user