Create global settings for font fallback

This commit is contained in:
ExMatics HydrogenC
2023-12-02 17:48:51 +08:00
parent 95f5e31e48
commit 29eb3954c5
10 changed files with 122 additions and 64 deletions

View File

@@ -264,7 +264,7 @@ void SplashScreen::OnDraw()
layout.HorizontalAlignment = TextAlignment::Near; layout.HorizontalAlignment = TextAlignment::Near;
layout.VerticalAlignment = TextAlignment::Near; layout.VerticalAlignment = TextAlignment::Near;
layout.Scale = Math::Min((width - 20 * s) / titleLength.X, 1.0f); layout.Scale = Math::Min((width - 20 * s) / titleLength.X, 1.0f);
Render2D::DrawText(_titleFont, GetTitle(), Color::White, layout); Render2D::DrawTextInternal(_titleFont, GetTitle(), Color::White, layout);
// Subtitle // Subtitle
String subtitle(_quote); String subtitle(_quote);
@@ -279,14 +279,14 @@ void SplashScreen::OnDraw()
layout.Scale = 1.0f; layout.Scale = 1.0f;
layout.HorizontalAlignment = TextAlignment::Far; layout.HorizontalAlignment = TextAlignment::Far;
layout.VerticalAlignment = TextAlignment::Far; layout.VerticalAlignment = TextAlignment::Far;
Render2D::DrawText(_subtitleFont, subtitle, Color::FromRGB(0x8C8C8C), layout); Render2D::DrawTextInternal(_subtitleFont, subtitle, Color::FromRGB(0x8C8C8C), layout);
// Additional info // Additional info
const float infoMargin = 6 * s; const float infoMargin = 6 * s;
layout.Bounds = Rectangle(infoMargin, lightBarHeight + infoMargin, width - (2 * infoMargin), height - lightBarHeight - (2 * infoMargin)); layout.Bounds = Rectangle(infoMargin, lightBarHeight + infoMargin, width - (2 * infoMargin), height - lightBarHeight - (2 * infoMargin));
layout.HorizontalAlignment = TextAlignment::Near; layout.HorizontalAlignment = TextAlignment::Near;
layout.VerticalAlignment = TextAlignment::Center; layout.VerticalAlignment = TextAlignment::Center;
Render2D::DrawText(_subtitleFont, _infoText, Color::FromRGB(0xFFFFFF) * 0.9f, layout); Render2D::DrawTextInternal(_subtitleFont, _infoText, Color::FromRGB(0xFFFFFF) * 0.9f, layout);
} }
bool SplashScreen::HasLoadedFonts() const bool SplashScreen::HasLoadedFonts() const

View File

@@ -119,7 +119,7 @@ namespace FlaxEditor.Content.Settings
/// <summary> /// <summary>
/// The custom settings to use with a game. Can be specified by the user to define game-specific options and be used by the external plugins (used as key-value pair). /// The custom settings to use with a game. Can be specified by the user to define game-specific options and be used by the external plugins (used as key-value pair).
/// </summary> /// </summary>
[EditorOrder(1100), EditorDisplay("Other Settings"), Tooltip("The custom settings to use with a game. Can be specified by the user to define game-specific options and be used by the external plugins (used as key-value pair).")] [EditorOrder(1500), EditorDisplay("Other Settings"), Tooltip("The custom settings to use with a game. Can be specified by the user to define game-specific options and be used by the external plugins (used as key-value pair).")]
public Dictionary<string, JsonAsset> CustomSettings; public Dictionary<string, JsonAsset> CustomSettings;
#if FLAX_EDITOR || PLATFORM_WINDOWS #if FLAX_EDITOR || PLATFORM_WINDOWS

View File

@@ -7,6 +7,8 @@
#include "Engine/Core/Types/String.h" #include "Engine/Core/Types/String.h"
#include "Engine/Core/Collections/Dictionary.h" #include "Engine/Core/Collections/Dictionary.h"
class FontFallbackList;
/// <summary> /// <summary>
/// The main game engine configuration service. Loads and applies game configuration. /// The main game engine configuration service. Loads and applies game configuration.
/// </summary> /// </summary>
@@ -33,6 +35,15 @@ public:
API_FIELD(Attributes="EditorOrder(15), EditorDisplay(\"General\")") API_FIELD(Attributes="EditorOrder(15), EditorDisplay(\"General\")")
String CopyrightNotice; String CopyrightNotice;
/// <summary>
/// The copyright note used for content signing (eg. source code header).
/// </summary>
API_FIELD(Attributes = "EditorOrder(1200), EditorDisplay(\"Other Settings\")")
bool EnableFontFallback;
API_FIELD(Attributes = "EditorOrder(1205), EditorDisplay(\"Other Settings\")")
FontFallbackList* FontFallbacks;
/// <summary> /// <summary>
/// The default application icon. /// The default application icon.
/// </summary> /// </summary>

View File

@@ -57,7 +57,7 @@
#undef CreateWindow #undef CreateWindow
#undef CreateProcess #undef CreateProcess
#undef SetWindowText #undef SetWindowText
#undef DrawText #undef DrawTextInternal
#undef CreateFont #undef CreateFont
#undef IsMinimized #undef IsMinimized
#undef IsMaximized #undef IsMaximized

View File

@@ -2,7 +2,7 @@
#include "FontManager.h" #include "FontManager.h"
#include "Engine/Core/Math/Math.h" #include "Engine/Core/Math/Math.h"
FallbackFonts::FallbackFonts(const Array<FontAsset*>& fonts) FontFallbackList::FontFallbackList(const Array<FontAsset*>& fonts)
: ManagedScriptingObject(SpawnParams(Guid::New(), Font::TypeInitializer)), : ManagedScriptingObject(SpawnParams(Guid::New(), Font::TypeInitializer)),
_fontAssets(fonts) _fontAssets(fonts)
{ {

View File

@@ -12,9 +12,9 @@ class FontAsset;
/// <summary> /// <summary>
/// Defines a list of fonts that can be used as a fallback, ordered by priority. /// Defines a list of fonts that can be used as a fallback, ordered by priority.
/// </summary> /// </summary>
API_CLASS(Sealed, NoSpawn) class FLAXENGINE_API FallbackFonts : public ManagedScriptingObject API_CLASS(Sealed, NoSpawn) class FLAXENGINE_API FontFallbackList : public ManagedScriptingObject
{ {
DECLARE_SCRIPTING_TYPE_NO_SPAWN(FallbackFonts); DECLARE_SCRIPTING_TYPE_NO_SPAWN(FontFallbackList);
private: private:
Array<FontAsset*> _fontAssets; Array<FontAsset*> _fontAssets;
@@ -23,18 +23,18 @@ private:
public: public:
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="FallbackFonts"/> class. /// Initializes a new instance of the <see cref="FontFallbackList"/> class.
/// </summary> /// </summary>
/// <param name="fonts">The fallback font assets.</param> /// <param name="fonts">The fallback font assets.</param>
FallbackFonts(const Array<FontAsset*>& fonts); FontFallbackList(const Array<FontAsset*>& fonts);
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="FallbackFonts"/> class, exposed for C#. /// Initializes a new instance of the <see cref="FontFallbackList"/> class, exposed for C#.
/// </summary> /// </summary>
/// <param name="fonts">The fallback font assets.</param> /// <param name="fonts">The fallback font assets.</param>
/// <returns>The new instance.</returns> /// <returns>The new instance.</returns>
API_FUNCTION() FORCE_INLINE static FallbackFonts* Create(const Array<FontAsset*>& fonts) { API_FUNCTION() FORCE_INLINE static FontFallbackList* Create(const Array<FontAsset*>& fonts) {
return New<FallbackFonts>(fonts); return New<FontFallbackList>(fonts);
} }
/// <summary> /// <summary>

View File

@@ -293,7 +293,7 @@ void Font::ProcessText(const StringView& text, Array<FontLineCache>& outputLines
} }
} }
void Font::ProcessText(FallbackFonts* fallbacks, const StringView& text, Array<BlockedTextLineCache>& outputLines, API_PARAM(Ref) const TextLayoutOptions& layout) void Font::ProcessText(FontFallbackList* fallbacks, const StringView& text, Array<BlockedTextLineCache>& outputLines, API_PARAM(Ref) const TextLayoutOptions& layout)
{ {
const Array<Font*>& fallbackFonts = fallbacks->GetFontList(GetSize()); const Array<Font*>& fallbackFonts = fallbacks->GetFontList(GetSize());
float cursorX = 0; float cursorX = 0;
@@ -569,7 +569,7 @@ Float2 Font::MeasureText(const StringView& text, const TextLayoutOptions& layout
return max; return max;
} }
Float2 Font::MeasureText(FallbackFonts* fallbacks, const StringView& text, const TextLayoutOptions& layout) Float2 Font::MeasureText(FontFallbackList* fallbacks, const StringView& text, const TextLayoutOptions& layout)
{ {
// Check if there is no need to do anything // Check if there is no need to do anything
if (text.IsEmpty()) if (text.IsEmpty())
@@ -664,7 +664,7 @@ int32 Font::HitTestText(const StringView& text, const Float2& location, const Te
return smallestIndex; return smallestIndex;
} }
int32 Font::HitTestText(FallbackFonts* fallbacks, const StringView& text, const Float2& location, const TextLayoutOptions& layout) int32 Font::HitTestText(FontFallbackList* fallbacks, const StringView& text, const Float2& location, const TextLayoutOptions& layout)
{ {
// Check if there is no need to do anything // Check if there is no need to do anything
if (text.Length() <= 0) if (text.Length() <= 0)
@@ -818,7 +818,7 @@ Float2 Font::GetCharPosition(const StringView& text, int32 index, const TextLayo
return rootOffset + Float2(lines.Last().Location.X + lines.Last().Size.X, static_cast<float>((lines.Count() - 1) * baseLinesDistance)); return rootOffset + Float2(lines.Last().Location.X + lines.Last().Size.X, static_cast<float>((lines.Count() - 1) * baseLinesDistance));
} }
Float2 Font::GetCharPosition(FallbackFonts* fallbacks, const StringView& text, int32 index, const TextLayoutOptions& layout) Float2 Font::GetCharPosition(FontFallbackList* fallbacks, const StringView& text, int32 index, const TextLayoutOptions& layout)
{ {
// Check if there is no need to do anything // Check if there is no need to do anything
if (text.IsEmpty()) if (text.IsEmpty())

View File

@@ -10,7 +10,7 @@
#include "TextLayoutOptions.h" #include "TextLayoutOptions.h"
class FontAsset; class FontAsset;
class FallbackFonts; class FontFallbackList;
struct FontTextureAtlasSlot; struct FontTextureAtlasSlot;
struct BlockedTextLineCache; struct BlockedTextLineCache;
@@ -463,7 +463,7 @@ public:
/// <param name="text">The input text.</param> /// <param name="text">The input text.</param>
/// <param name="layout">The layout properties.</param> /// <param name="layout">The layout properties.</param>
/// <param name="outputLines">The output lines list.</param> /// <param name="outputLines">The output lines list.</param>
void ProcessText(FallbackFonts* fallbacks, const StringView& text, Array<BlockedTextLineCache>& outputLines, API_PARAM(Ref) const TextLayoutOptions& layout); void ProcessText(FontFallbackList* fallbacks, const StringView& text, Array<BlockedTextLineCache>& outputLines, API_PARAM(Ref) const TextLayoutOptions& layout);
/// <summary> /// <summary>
/// Processes text to get cached lines for rendering. /// Processes text to get cached lines for rendering.
@@ -471,7 +471,7 @@ public:
/// <param name="text">The input text.</param> /// <param name="text">The input text.</param>
/// <param name="layout">The layout properties.</param> /// <param name="layout">The layout properties.</param>
/// <returns>The output lines list.</returns> /// <returns>The output lines list.</returns>
API_FUNCTION() Array<BlockedTextLineCache> ProcessText(FallbackFonts* fallbacks, const StringView& text, API_PARAM(Ref) const TextLayoutOptions& layout) API_FUNCTION() Array<BlockedTextLineCache> ProcessText(FontFallbackList* fallbacks, const StringView& text, API_PARAM(Ref) const TextLayoutOptions& layout)
{ {
Array<BlockedTextLineCache> lines; Array<BlockedTextLineCache> lines;
ProcessText(fallbacks, text, lines, layout); ProcessText(fallbacks, text, lines, layout);
@@ -485,7 +485,7 @@ public:
/// <param name="textRange">The input text range (substring range of the input text parameter).</param> /// <param name="textRange">The input text range (substring range of the input text parameter).</param>
/// <param name="layout">The layout properties.</param> /// <param name="layout">The layout properties.</param>
/// <returns>The output lines list.</returns> /// <returns>The output lines list.</returns>
API_FUNCTION() Array<BlockedTextLineCache> ProcessText(FallbackFonts* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, API_PARAM(Ref) const TextLayoutOptions& layout) API_FUNCTION() Array<BlockedTextLineCache> ProcessText(FontFallbackList* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, API_PARAM(Ref) const TextLayoutOptions& layout)
{ {
Array<BlockedTextLineCache> lines; Array<BlockedTextLineCache> lines;
ProcessText(fallbacks, textRange.Substring(text), lines, layout); ProcessText(fallbacks, textRange.Substring(text), lines, layout);
@@ -497,7 +497,7 @@ public:
/// </summary> /// </summary>
/// <param name="text">The input text.</param> /// <param name="text">The input text.</param>
/// <returns>The output lines list.</returns> /// <returns>The output lines list.</returns>
API_FUNCTION() FORCE_INLINE Array<BlockedTextLineCache> ProcessText(FallbackFonts* fallbacks, const StringView& text) API_FUNCTION() FORCE_INLINE Array<BlockedTextLineCache> ProcessText(FontFallbackList* fallbacks, const StringView& text)
{ {
return ProcessText(fallbacks, text, TextLayoutOptions()); return ProcessText(fallbacks, text, TextLayoutOptions());
} }
@@ -508,7 +508,7 @@ public:
/// <param name="text">The input text.</param> /// <param name="text">The input text.</param>
/// <param name="textRange">The input text range (substring range of the input text parameter).</param> /// <param name="textRange">The input text range (substring range of the input text parameter).</param>
/// <returns>The output lines list.</returns> /// <returns>The output lines list.</returns>
API_FUNCTION() FORCE_INLINE Array<BlockedTextLineCache> ProcessText(FallbackFonts* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange) API_FUNCTION() FORCE_INLINE Array<BlockedTextLineCache> ProcessText(FontFallbackList* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange)
{ {
return ProcessText(fallbacks, textRange.Substring(text), TextLayoutOptions()); return ProcessText(fallbacks, textRange.Substring(text), TextLayoutOptions());
} }
@@ -560,7 +560,7 @@ public:
/// <param name="text">The input text to test.</param> /// <param name="text">The input text to test.</param>
/// <param name="layout">The layout properties.</param> /// <param name="layout">The layout properties.</param>
/// <returns>The minimum size for that text and fot to render properly.</returns> /// <returns>The minimum size for that text and fot to render properly.</returns>
API_FUNCTION() Float2 MeasureText(FallbackFonts* fallbacks, const StringView& text, API_PARAM(Ref) const TextLayoutOptions& layout); API_FUNCTION() Float2 MeasureText(FontFallbackList* fallbacks, const StringView& text, API_PARAM(Ref) const TextLayoutOptions& layout);
/// <summary> /// <summary>
/// Measures minimum size of the rectangle that will be needed to draw given text. /// Measures minimum size of the rectangle that will be needed to draw given text.
@@ -569,7 +569,7 @@ public:
/// <param name="textRange">The input text range (substring range of the input text parameter).</param> /// <param name="textRange">The input text range (substring range of the input text parameter).</param>
/// <param name="layout">The layout properties.</param> /// <param name="layout">The layout properties.</param>
/// <returns>The minimum size for that text and fot to render properly.</returns> /// <returns>The minimum size for that text and fot to render properly.</returns>
API_FUNCTION() Float2 MeasureText(FallbackFonts* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, API_PARAM(Ref) const TextLayoutOptions& layout) API_FUNCTION() Float2 MeasureText(FontFallbackList* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, API_PARAM(Ref) const TextLayoutOptions& layout)
{ {
return MeasureText(fallbacks, textRange.Substring(text), layout); return MeasureText(fallbacks, textRange.Substring(text), layout);
} }
@@ -579,7 +579,7 @@ public:
/// </summary>. /// </summary>.
/// <param name="text">The input text to test.</param> /// <param name="text">The input text to test.</param>
/// <returns>The minimum size for that text and fot to render properly.</returns> /// <returns>The minimum size for that text and fot to render properly.</returns>
API_FUNCTION() FORCE_INLINE Float2 MeasureText(FallbackFonts* fallbacks, const StringView& text) API_FUNCTION() FORCE_INLINE Float2 MeasureText(FontFallbackList* fallbacks, const StringView& text)
{ {
return MeasureText(fallbacks, text, TextLayoutOptions()); return MeasureText(fallbacks, text, TextLayoutOptions());
} }
@@ -590,7 +590,7 @@ public:
/// <param name="text">The input text to test.</param> /// <param name="text">The input text to test.</param>
/// <param name="textRange">The input text range (substring range of the input text parameter).</param> /// <param name="textRange">The input text range (substring range of the input text parameter).</param>
/// <returns>The minimum size for that text and fot to render properly.</returns> /// <returns>The minimum size for that text and fot to render properly.</returns>
API_FUNCTION() FORCE_INLINE Float2 MeasureText(FallbackFonts* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange) API_FUNCTION() FORCE_INLINE Float2 MeasureText(FontFallbackList* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange)
{ {
return MeasureText(fallbacks, textRange.Substring(text), TextLayoutOptions()); return MeasureText(fallbacks, textRange.Substring(text), TextLayoutOptions());
} }
@@ -647,7 +647,7 @@ public:
/// <param name="location">The input location to test.</param> /// <param name="location">The input location to test.</param>
/// <param name="layout">The text layout properties.</param> /// <param name="layout">The text layout properties.</param>
/// <returns>The selected character position index (can be equal to text length if location is outside of the layout rectangle).</returns> /// <returns>The selected character position index (can be equal to text length if location is outside of the layout rectangle).</returns>
API_FUNCTION() int32 HitTestText(FallbackFonts* fallbacks, const StringView& text, const Float2& location, API_PARAM(Ref) const TextLayoutOptions& layout); API_FUNCTION() int32 HitTestText(FontFallbackList* fallbacks, const StringView& text, const Float2& location, API_PARAM(Ref) const TextLayoutOptions& layout);
/// <summary> /// <summary>
/// Calculates hit character index at given location. /// Calculates hit character index at given location.
@@ -657,7 +657,7 @@ public:
/// <param name="location">The input location to test.</param> /// <param name="location">The input location to test.</param>
/// <param name="layout">The text layout properties.</param> /// <param name="layout">The text layout properties.</param>
/// <returns>The selected character position index (can be equal to text length if location is outside of the layout rectangle).</returns> /// <returns>The selected character position index (can be equal to text length if location is outside of the layout rectangle).</returns>
API_FUNCTION() int32 HitTestText(FallbackFonts* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Float2& location, API_PARAM(Ref) const TextLayoutOptions& layout) API_FUNCTION() int32 HitTestText(FontFallbackList* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Float2& location, API_PARAM(Ref) const TextLayoutOptions& layout)
{ {
return HitTestText(fallbacks, textRange.Substring(text), location, layout); return HitTestText(fallbacks, textRange.Substring(text), location, layout);
} }
@@ -668,7 +668,7 @@ public:
/// <param name="text">The input text to test.</param> /// <param name="text">The input text to test.</param>
/// <param name="location">The input location to test.</param> /// <param name="location">The input location to test.</param>
/// <returns>The selected character position index (can be equal to text length if location is outside of the layout rectangle).</returns> /// <returns>The selected character position index (can be equal to text length if location is outside of the layout rectangle).</returns>
API_FUNCTION() FORCE_INLINE int32 HitTestText(FallbackFonts* fallbacks, const StringView& text, const Float2& location) API_FUNCTION() FORCE_INLINE int32 HitTestText(FontFallbackList* fallbacks, const StringView& text, const Float2& location)
{ {
return HitTestText(fallbacks, text, location, TextLayoutOptions()); return HitTestText(fallbacks, text, location, TextLayoutOptions());
} }
@@ -680,7 +680,7 @@ public:
/// <param name="textRange">The input text range (substring range of the input text parameter).</param> /// <param name="textRange">The input text range (substring range of the input text parameter).</param>
/// <param name="location">The input location to test.</param> /// <param name="location">The input location to test.</param>
/// <returns>The selected character position index (can be equal to text length if location is outside of the layout rectangle).</returns> /// <returns>The selected character position index (can be equal to text length if location is outside of the layout rectangle).</returns>
API_FUNCTION() FORCE_INLINE int32 HitTestText(FallbackFonts* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Float2& location) API_FUNCTION() FORCE_INLINE int32 HitTestText(FontFallbackList* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Float2& location)
{ {
return HitTestText(fallbacks, textRange.Substring(text), location, TextLayoutOptions()); return HitTestText(fallbacks, textRange.Substring(text), location, TextLayoutOptions());
} }
@@ -737,7 +737,7 @@ public:
/// <param name="index">The text position to get coordinates of.</param> /// <param name="index">The text position to get coordinates of.</param>
/// <param name="layout">The text layout properties.</param> /// <param name="layout">The text layout properties.</param>
/// <returns>The character position (upper left corner which can be used for a caret position).</returns> /// <returns>The character position (upper left corner which can be used for a caret position).</returns>
API_FUNCTION() Float2 GetCharPosition(FallbackFonts* fallbacks, const StringView& text, int32 index, API_PARAM(Ref) const TextLayoutOptions& layout); API_FUNCTION() Float2 GetCharPosition(FontFallbackList* fallbacks, const StringView& text, int32 index, API_PARAM(Ref) const TextLayoutOptions& layout);
/// <summary> /// <summary>
/// Calculates character position for given text and character index. /// Calculates character position for given text and character index.
@@ -747,7 +747,7 @@ public:
/// <param name="index">The text position to get coordinates of.</param> /// <param name="index">The text position to get coordinates of.</param>
/// <param name="layout">The text layout properties.</param> /// <param name="layout">The text layout properties.</param>
/// <returns>The character position (upper left corner which can be used for a caret position).</returns> /// <returns>The character position (upper left corner which can be used for a caret position).</returns>
API_FUNCTION() Float2 GetCharPosition(FallbackFonts* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, int32 index, API_PARAM(Ref) const TextLayoutOptions& layout) API_FUNCTION() Float2 GetCharPosition(FontFallbackList* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, int32 index, API_PARAM(Ref) const TextLayoutOptions& layout)
{ {
return GetCharPosition(fallbacks, textRange.Substring(text), index, layout); return GetCharPosition(fallbacks, textRange.Substring(text), index, layout);
} }
@@ -758,7 +758,7 @@ public:
/// <param name="text">The input text to test.</param> /// <param name="text">The input text to test.</param>
/// <param name="index">The text position to get coordinates of.</param> /// <param name="index">The text position to get coordinates of.</param>
/// <returns>The character position (upper left corner which can be used for a caret position).</returns> /// <returns>The character position (upper left corner which can be used for a caret position).</returns>
API_FUNCTION() FORCE_INLINE Float2 GetCharPosition(FallbackFonts* fallbacks, const StringView& text, int32 index) API_FUNCTION() FORCE_INLINE Float2 GetCharPosition(FontFallbackList* fallbacks, const StringView& text, int32 index)
{ {
return GetCharPosition(fallbacks, text, index, TextLayoutOptions()); return GetCharPosition(fallbacks, text, index, TextLayoutOptions());
} }
@@ -770,7 +770,7 @@ public:
/// <param name="textRange">The input text range (substring range of the input text parameter).</param> /// <param name="textRange">The input text range (substring range of the input text parameter).</param>
/// <param name="index">The text position to get coordinates of.</param> /// <param name="index">The text position to get coordinates of.</param>
/// <returns>The character position (upper left corner which can be used for a caret position).</returns> /// <returns>The character position (upper left corner which can be used for a caret position).</returns>
API_FUNCTION() FORCE_INLINE Float2 GetCharPosition(FallbackFonts* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, int32 index) API_FUNCTION() FORCE_INLINE Float2 GetCharPosition(FontFallbackList* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, int32 index)
{ {
return GetCharPosition(fallbacks, textRange.Substring(text), index, TextLayoutOptions()); return GetCharPosition(fallbacks, textRange.Substring(text), index, TextLayoutOptions());
} }

View File

@@ -1144,7 +1144,7 @@ void DrawBatch(int32 startIndex, int32 count)
Context->DrawIndexed(countIb, 0, d.StartIB); Context->DrawIndexed(countIb, 0, d.StartIB);
} }
void Render2D::DrawText(Font* font, const StringView& text, const Color& color, const Float2& location, MaterialBase* customMaterial) void Render2D::DrawTextInternal(Font* font, const StringView& text, const Color& color, const Float2& location, MaterialBase* customMaterial)
{ {
RENDER2D_CHECK_RENDERING_STATE; RENDER2D_CHECK_RENDERING_STATE;
@@ -1252,12 +1252,12 @@ void Render2D::DrawText(Font* font, const StringView& text, const Color& color,
} }
} }
void Render2D::DrawText(Font* font, const StringView& text, const TextRange& textRange, const Color& color, const Float2& location, MaterialBase* customMaterial) void Render2D::DrawTextInternal(Font* font, const StringView& text, const TextRange& textRange, const Color& color, const Float2& location, MaterialBase* customMaterial)
{ {
DrawText(font, textRange.Substring(text), color, location, customMaterial); DrawTextInternal(font, textRange.Substring(text), color, location, customMaterial);
} }
void Render2D::DrawText(Font* font, const StringView& text, const Color& color, const TextLayoutOptions& layout, MaterialBase* customMaterial) void Render2D::DrawTextInternal(Font* font, const StringView& text, const Color& color, const TextLayoutOptions& layout, MaterialBase* customMaterial)
{ {
RENDER2D_CHECK_RENDERING_STATE; RENDER2D_CHECK_RENDERING_STATE;
@@ -1365,12 +1365,12 @@ void Render2D::DrawText(Font* font, const StringView& text, const Color& color,
} }
} }
void Render2D::DrawText(Font* font, const StringView& text, const TextRange& textRange, const Color& color, const TextLayoutOptions& layout, MaterialBase* customMaterial) void Render2D::DrawTextInternal(Font* font, const StringView& text, const TextRange& textRange, const Color& color, const TextLayoutOptions& layout, MaterialBase* customMaterial)
{ {
DrawText(font, textRange.Substring(text), color, layout, customMaterial); DrawTextInternal(font, textRange.Substring(text), color, layout, customMaterial);
} }
void Render2D::DrawText(Font* font, FallbackFonts* fallbacks, const StringView& text, const Color& color, const Float2& location, MaterialBase* customMaterial) void Render2D::DrawTextInternal(Font* font, FontFallbackList* fallbacks, const StringView& text, const Color& color, const Float2& location, MaterialBase* customMaterial)
{ {
RENDER2D_CHECK_RENDERING_STATE; RENDER2D_CHECK_RENDERING_STATE;
@@ -1549,12 +1549,12 @@ void Render2D::DrawText(Font* font, FallbackFonts* fallbacks, const StringView&
} }
} }
void Render2D::DrawText(Font* font, FallbackFonts* fallbacks, const StringView& text, const TextRange& textRange, const Color& color, const Float2& location, MaterialBase* customMaterial) void Render2D::DrawTextInternal(Font* font, FontFallbackList* fallbacks, const StringView& text, const TextRange& textRange, const Color& color, const Float2& location, MaterialBase* customMaterial)
{ {
DrawText(font, fallbacks, textRange.Substring(text), color, location, customMaterial); DrawTextInternal(font, fallbacks, textRange.Substring(text), color, location, customMaterial);
} }
void Render2D::DrawText(Font* font, FallbackFonts* fallbacks, const StringView& text, const Color& color, const TextLayoutOptions& layout, MaterialBase* customMaterial) void Render2D::DrawTextInternal(Font* font, FontFallbackList* fallbacks, const StringView& text, const Color& color, const TextLayoutOptions& layout, MaterialBase* customMaterial)
{ {
RENDER2D_CHECK_RENDERING_STATE; RENDER2D_CHECK_RENDERING_STATE;
@@ -1673,9 +1673,9 @@ void Render2D::DrawText(Font* font, FallbackFonts* fallbacks, const StringView&
} }
} }
void Render2D::DrawText(Font* font, FallbackFonts* fallbacks, const StringView& text, const TextRange& textRange, const Color& color, const TextLayoutOptions& layout, MaterialBase* customMaterial) void Render2D::DrawTextInternal(Font* font, FontFallbackList* fallbacks, const StringView& text, const TextRange& textRange, const Color& color, const TextLayoutOptions& layout, MaterialBase* customMaterial)
{ {
DrawText(font, fallbacks, textRange.Substring(text), color, layout, customMaterial); DrawTextInternal(font, fallbacks, textRange.Substring(text), color, layout, customMaterial);
} }
FORCE_INLINE bool NeedAlphaWithTint(const Color& color) FORCE_INLINE bool NeedAlphaWithTint(const Color& color)

View File

@@ -15,7 +15,7 @@ struct Matrix3x3;
struct Viewport; struct Viewport;
struct TextRange; struct TextRange;
class Font; class Font;
class FallbackFonts; class FontFallbackList;
class GPUPipelineState; class GPUPipelineState;
class GPUTexture; class GPUTexture;
class GPUTextureView; class GPUTextureView;
@@ -54,6 +54,9 @@ API_CLASS(Static) class FLAXENGINE_API Render2D
}; };
public: public:
API_FIELD() static bool EnableFontFallback;
API_FIELD() static FontFallbackList* FallbackFonts;
/// <summary> /// <summary>
/// Checks if interface is during rendering phrase (Draw calls may be performed without failing). /// Checks if interface is during rendering phrase (Draw calls may be performed without failing).
/// </summary> /// </summary>
@@ -175,17 +178,17 @@ public:
public: public:
/// <summary> /// <summary>
/// Draws a text. /// Draws a text, with font fallbacking disabled.
/// </summary> /// </summary>
/// <param name="font">The font to use.</param> /// <param name="font">The font to use.</param>
/// <param name="text">The text to render.</param> /// <param name="text">The text to render.</param>
/// <param name="color">The text color.</param> /// <param name="color">The text color.</param>
/// <param name="location">The text location.</param> /// <param name="location">The text location.</param>
/// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param> /// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param>
API_FUNCTION() static void DrawText(Font* font, const StringView& text, const Color& color, const Float2& location, MaterialBase* customMaterial = nullptr); API_FUNCTION() static void DrawTextInternal(Font* font, const StringView& text, const Color& color, const Float2& location, MaterialBase* customMaterial = nullptr);
/// <summary> /// <summary>
/// Draws a text. /// Draws a text, with font fallbacking disabled.
/// </summary> /// </summary>
/// <param name="font">The font to use.</param> /// <param name="font">The font to use.</param>
/// <param name="text">The text to render.</param> /// <param name="text">The text to render.</param>
@@ -193,20 +196,20 @@ public:
/// <param name="color">The text color.</param> /// <param name="color">The text color.</param>
/// <param name="location">The text location.</param> /// <param name="location">The text location.</param>
/// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param> /// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param>
API_FUNCTION() static void DrawText(Font* font, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Color& color, const Float2& location, MaterialBase* customMaterial = nullptr); API_FUNCTION() static void DrawTextInternal(Font* font, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Color& color, const Float2& location, MaterialBase* customMaterial = nullptr);
/// <summary> /// <summary>
/// Draws a text with formatting. /// Draws a text with formatting, with font fallbacking disabled.
/// </summary> /// </summary>
/// <param name="font">The font to use.</param> /// <param name="font">The font to use.</param>
/// <param name="text">The text to render.</param> /// <param name="text">The text to render.</param>
/// <param name="color">The text color.</param> /// <param name="color">The text color.</param>
/// <param name="layout">The text layout properties.</param> /// <param name="layout">The text layout properties.</param>
/// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param> /// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param>
API_FUNCTION() static void DrawText(Font* font, const StringView& text, const Color& color, API_PARAM(Ref) const TextLayoutOptions& layout, MaterialBase* customMaterial = nullptr); API_FUNCTION() static void DrawTextInternal(Font* font, const StringView& text, const Color& color, API_PARAM(Ref) const TextLayoutOptions& layout, MaterialBase* customMaterial = nullptr);
/// <summary> /// <summary>
/// Draws a text with formatting. /// Draws a text with formatting, with font fallbacking disabled.
/// </summary> /// </summary>
/// <param name="font">The font to use.</param> /// <param name="font">The font to use.</param>
/// <param name="text">The text to render.</param> /// <param name="text">The text to render.</param>
@@ -214,10 +217,10 @@ public:
/// <param name="color">The text color.</param> /// <param name="color">The text color.</param>
/// <param name="layout">The text layout properties.</param> /// <param name="layout">The text layout properties.</param>
/// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param> /// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param>
API_FUNCTION() static void DrawText(Font* font, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Color& color, API_PARAM(Ref) const TextLayoutOptions& layout, MaterialBase* customMaterial = nullptr); API_FUNCTION() static void DrawTextInternal(Font* font, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Color& color, API_PARAM(Ref) const TextLayoutOptions& layout, MaterialBase* customMaterial = nullptr);
/// <summary> /// <summary>
/// Draws a text. /// Draws a text, using custom fallback options.
/// </summary> /// </summary>
/// <param name="fonts">The fonts to use, ordered by priority.</param> /// <param name="fonts">The fonts to use, ordered by priority.</param>
/// <param name="text">The text to render.</param> /// <param name="text">The text to render.</param>
@@ -225,20 +228,20 @@ public:
/// <param name="color">The text color.</param> /// <param name="color">The text color.</param>
/// <param name="location">The text location.</param> /// <param name="location">The text location.</param>
/// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param> /// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param>
API_FUNCTION() static void DrawText(Font* font, FallbackFonts* fallbacks, const StringView& text, const Color& color, const Float2& location, MaterialBase* customMaterial = nullptr); API_FUNCTION() static void DrawTextInternal(Font* font, FontFallbackList* fallbacks, const StringView& text, const Color& color, const Float2& location, MaterialBase* customMaterial = nullptr);
/// <summary> /// <summary>
/// Draws a text with formatting. /// Draws a text with formatting, using custom fallback options.
/// </summary> /// </summary>
/// <param name="fonts">The fonts to use, ordered by priority.</param> /// <param name="fonts">The fonts to use, ordered by priority.</param>
/// <param name="text">The text to render.</param> /// <param name="text">The text to render.</param>
/// <param name="color">The text color.</param> /// <param name="color">The text color.</param>
/// <param name="layout">The text layout properties.</param> /// <param name="layout">The text layout properties.</param>
/// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param> /// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param>
API_FUNCTION() static void DrawText(Font* font, FallbackFonts* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Color& color, const Float2& location, MaterialBase* customMaterial = nullptr); API_FUNCTION() static void DrawTextInternal(Font* font, FontFallbackList* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Color& color, const Float2& location, MaterialBase* customMaterial = nullptr);
/// <summary> /// <summary>
/// Draws a text with formatting. /// Draws a text with formatting, using custom fallback options.
/// </summary> /// </summary>
/// <param name="fonts">The fonts to use, ordered by priority.</param> /// <param name="fonts">The fonts to use, ordered by priority.</param>
/// <param name="text">The text to render.</param> /// <param name="text">The text to render.</param>
@@ -246,10 +249,10 @@ public:
/// <param name="color">The text color.</param> /// <param name="color">The text color.</param>
/// <param name="layout">The text layout properties.</param> /// <param name="layout">The text layout properties.</param>
/// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param> /// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param>
API_FUNCTION() static void DrawText(Font* font, FallbackFonts* fallbacks, const StringView& text, const Color& color, API_PARAM(Ref) const TextLayoutOptions& layout, MaterialBase* customMaterial = nullptr); API_FUNCTION() static void DrawTextInternal(Font* font, FontFallbackList* fallbacks, const StringView& text, const Color& color, API_PARAM(Ref) const TextLayoutOptions& layout, MaterialBase* customMaterial = nullptr);
/// <summary> /// <summary>
/// Draws a text with formatting. /// Draws a text with formatting, using custom fallback options.
/// </summary> /// </summary>
/// <param name="fonts">The fonts to use, ordered by priority.</param> /// <param name="fonts">The fonts to use, ordered by priority.</param>
/// <param name="text">The text to render.</param> /// <param name="text">The text to render.</param>
@@ -257,7 +260,51 @@ public:
/// <param name="color">The text color.</param> /// <param name="color">The text color.</param>
/// <param name="layout">The text layout properties.</param> /// <param name="layout">The text layout properties.</param>
/// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param> /// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param>
API_FUNCTION() static void DrawText(Font* font, FallbackFonts* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Color& color, API_PARAM(Ref) const TextLayoutOptions& layout, MaterialBase* customMaterial = nullptr); API_FUNCTION() static void DrawTextInternal(Font* font, FontFallbackList* fallbacks, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Color& color, API_PARAM(Ref) const TextLayoutOptions& layout, MaterialBase* customMaterial = nullptr);
/// <summary>
/// Draws a text, follows the fallback settings defined in <see cref="Render2D" />.
/// </summary>
/// <param name="font">The font to use.</param>
/// <param name="text">The text to render.</param>
/// <param name="color">The text color.</param>
/// <param name="location">The text location.</param>
/// <param name="customMaterial">The custom material for font characters rendering. It must contain texture parameter named Font used to sample font texture.</param>
API_FUNCTION() FORCE_INLINE static void DrawText(Font* font, const StringView& text, const Color& color, const Float2& location, MaterialBase* customMaterial = nullptr) {
if (EnableFontFallback && FallbackFonts) {
DrawTextInternal(font, FallbackFonts, text, color, location, customMaterial);
}
else {
DrawTextInternal(font, text, color, location, customMaterial);
}
}
API_FUNCTION() FORCE_INLINE static void DrawText(Font* font, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Color& color, const Float2& location, MaterialBase* customMaterial = nullptr) {
if (EnableFontFallback && FallbackFonts) {
DrawTextInternal(font, FallbackFonts, text, textRange, color, location, customMaterial);
}
else {
DrawTextInternal(font, text, textRange, color, location, customMaterial);
}
}
API_FUNCTION() FORCE_INLINE static void DrawText(Font* font, const StringView& text, const Color& color, API_PARAM(Ref) const TextLayoutOptions& layout, MaterialBase* customMaterial = nullptr) {
if (EnableFontFallback && FallbackFonts) {
DrawTextInternal(font, FallbackFonts, text, color, layout, customMaterial);
}
else {
DrawTextInternal(font, text, color, layout, customMaterial);
}
}
API_FUNCTION() FORCE_INLINE static void DrawText(Font* font, const StringView& text, API_PARAM(Ref) const TextRange& textRange, const Color& color, API_PARAM(Ref) const TextLayoutOptions& layout, MaterialBase* customMaterial = nullptr) {
if (EnableFontFallback && FallbackFonts) {
DrawTextInternal(font, FallbackFonts, text, textRange, color, layout, customMaterial);
}
else {
DrawTextInternal(font, text, textRange, color, layout, customMaterial);
}
}
/// <summary> /// <summary>
/// Fills a rectangle area. /// Fills a rectangle area.