From 5855cbbe42f85958a3e9bf3c9c73239a7f10ceeb Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 17 Jun 2023 20:22:02 +0200 Subject: [PATCH] don't load fonts twice, load multiple fonts --- .../font/loader/DefaultFontIndices.kt | 5 +- .../gui/rendering/font/loader/FontLoader.kt | 5 +- .../gui/rendering/font/manager/FontManager.kt | 52 +++++++++++++++---- .../rendering/font/types/ReferenceFontType.kt | 6 +-- .../font/types/bitmap/BitmapFontType.kt | 3 +- .../font/types/empty/EmptyFontType.kt | 3 +- .../font/types/factory/FontTypeFactory.kt | 3 +- .../unicode/legacy/LegacyUnicodeFontType.kt | 3 +- .../types/unicode/unihex/UnihexFontType.kt | 3 +- 9 files changed, 61 insertions(+), 22 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/loader/DefaultFontIndices.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/loader/DefaultFontIndices.kt index f167306d1..8074445ed 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/loader/DefaultFontIndices.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/loader/DefaultFontIndices.kt @@ -18,6 +18,9 @@ import de.bixilon.minosoft.util.KUtil.toResourceLocation object DefaultFontIndices { val DEFAULT = "font/default.json".toResourceLocation() val ALT = "font/alt.json".toResourceLocation() - val ILLAGERALT = "font/allageralt.json".toResourceLocation() + val ILLAGERALT = "font/illageralt.json".toResourceLocation() val UNIFORM = "font/uniform.json".toResourceLocation() + + + val ALL = arrayOf(ALT, ILLAGERALT, UNIFORM) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/loader/FontLoader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/loader/FontLoader.kt index cf8cbd127..f166776b8 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/loader/FontLoader.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/loader/FontLoader.kt @@ -19,6 +19,7 @@ import de.bixilon.kutil.latch.AbstractLatch import de.bixilon.minosoft.assets.util.InputStreamUtil.readJsonObject import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderContext +import de.bixilon.minosoft.gui.rendering.font.manager.FontManager import de.bixilon.minosoft.gui.rendering.font.types.FontType import de.bixilon.minosoft.gui.rendering.font.types.factory.FontTypes import de.bixilon.minosoft.gui.rendering.font.types.font.Font @@ -31,7 +32,7 @@ import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast object FontLoader { - fun load(context: RenderContext, fontIndex: ResourceLocation, latch: AbstractLatch?): Font? { + fun load(context: RenderContext, manager: FontManager, fontIndex: ResourceLocation, latch: AbstractLatch?): Font? { val fontIndex = context.connection.assetsManager.getOrNull(fontIndex)?.readJsonObject() ?: return null val providersRaw = fontIndex["providers"].listCast>()!! @@ -46,7 +47,7 @@ object FontLoader { Log.log(LogMessageType.RENDERING_LOADING, LogLevels.WARN) { "Unknown font provider: $type" } return@add } - providers[index] = factory.build(context, provider) + providers[index] = factory.build(context, manager, provider) } } worker.work(latch) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/manager/FontManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/manager/FontManager.kt index 9e5c4b512..a9d3205b7 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/manager/FontManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/manager/FontManager.kt @@ -13,7 +13,9 @@ package de.bixilon.minosoft.gui.rendering.font.manager +import de.bixilon.kutil.cast.CastUtil.unsafeNull import de.bixilon.kutil.latch.AbstractLatch +import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.font.loader.DefaultFontIndices @@ -25,31 +27,59 @@ import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogMessageType -class FontManager( - val default: FontType, -) { +class FontManager(default: FontType? = null) { + private val fonts: MutableMap = mutableMapOf() + var default = default ?: unsafeNull() + init { + if (default != null) { + fonts[DefaultFontIndices.DEFAULT.fontName()] = default + } + } fun postInit(latch: AbstractLatch) { - if (default is PostInitFontType) { - default.postInit(latch) + for (font in fonts.values) { + if (font !is PostInitFontType) continue + font.postInit(latch) } } - operator fun get(font: ResourceLocation?): FontType? = null + operator fun get(name: ResourceLocation?) = fonts[name?.fontName()] + + fun load(index: ResourceLocation, context: RenderContext, latch: AbstractLatch?): FontType? { + val name = index.fontName() + fonts[name]?.let { return it } + + + val font = FontLoader.load(context, this, index, latch) + if (font == null) { + Log.log(LogMessageType.ASSETS, LogLevels.WARN) { "Font $index seems to be empty!" } + return null + } + val type = font.trim() ?: return null + + this.fonts[name] = type + return type + } companion object { + fun create(context: RenderContext, latch: AbstractLatch): FontManager { - val font = FontLoader.load(context, DefaultFontIndices.DEFAULT, latch) + val manager = FontManager() - // TODO: load multiple fonts + val default = manager.load(DefaultFontIndices.DEFAULT, context, latch) ?: EmptyFont + manager::default.forceSet(default) - if (font == null) { - Log.log(LogMessageType.ASSETS, LogLevels.WARN) { "Font ${DefaultFontIndices.DEFAULT} seems to be empty!" } + for (index in DefaultFontIndices.ALL) { + manager.load(index, context, latch) } - return FontManager(font?.trim() ?: EmptyFont) + return manager + } + + private fun ResourceLocation.fontName(): ResourceLocation { + return ResourceLocation(namespace, path.removePrefix("font/").removeSuffix(".json")) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/ReferenceFontType.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/ReferenceFontType.kt index 45662103f..54f06d1c1 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/ReferenceFontType.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/ReferenceFontType.kt @@ -16,15 +16,15 @@ package de.bixilon.minosoft.gui.rendering.font.types import de.bixilon.kutil.json.JsonObject import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft import de.bixilon.minosoft.gui.rendering.RenderContext -import de.bixilon.minosoft.gui.rendering.font.loader.FontLoader +import de.bixilon.minosoft.gui.rendering.font.manager.FontManager import de.bixilon.minosoft.gui.rendering.font.types.factory.FontTypeFactory import de.bixilon.minosoft.util.KUtil.toResourceLocation object ReferenceFontType : FontTypeFactory { override val identifier = minecraft("reference") - override fun build(context: RenderContext, data: JsonObject): FontType? { + override fun build(context: RenderContext, manager: FontManager, data: JsonObject): FontType? { val index = data["id"]?.toResourceLocation()?.prefix("font/")?.suffix(".json") ?: throw IllegalArgumentException("id missing!") - return FontLoader.load(context, index, null)?.trim() + return manager.load(index, context, null) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/bitmap/BitmapFontType.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/bitmap/BitmapFontType.kt index 538a0572a..c488bf249 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/bitmap/BitmapFontType.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/bitmap/BitmapFontType.kt @@ -21,6 +21,7 @@ import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderContext +import de.bixilon.minosoft.gui.rendering.font.manager.FontManager import de.bixilon.minosoft.gui.rendering.font.renderer.code.CodePointRenderer import de.bixilon.minosoft.gui.rendering.font.renderer.properties.FontProperties import de.bixilon.minosoft.gui.rendering.font.types.PostInitFontType @@ -58,7 +59,7 @@ class BitmapFontType( private const val ROW = 16 override val identifier = minecraft("bitmap") - override fun build(context: RenderContext, data: JsonObject): BitmapFontType? { + override fun build(context: RenderContext, manager: FontManager, data: JsonObject): BitmapFontType? { val file = data["file"]?.toString()?.let { it.toResourceLocation().texture() } ?: throw IllegalArgumentException("Missing file!") val height = data["height"]?.toInt() ?: 8 val ascent = data["ascent"]?.toInt() ?: 8 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/empty/EmptyFontType.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/empty/EmptyFontType.kt index 0641e4734..8994d7875 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/empty/EmptyFontType.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/empty/EmptyFontType.kt @@ -20,6 +20,7 @@ import de.bixilon.minosoft.data.registries.identified.AliasedIdentified import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft import de.bixilon.minosoft.data.registries.identified.Namespaces.minosoft import de.bixilon.minosoft.gui.rendering.RenderContext +import de.bixilon.minosoft.gui.rendering.font.manager.FontManager import de.bixilon.minosoft.gui.rendering.font.renderer.code.CodePointRenderer import de.bixilon.minosoft.gui.rendering.font.types.FontType import de.bixilon.minosoft.gui.rendering.font.types.factory.FontTypeFactory @@ -44,7 +45,7 @@ class EmptyFontType( override val identifier = minosoft("empty") override val identifiers = setOf(minecraft("space")) - override fun build(context: RenderContext, data: JsonObject): EmptyFontType? { + override fun build(context: RenderContext, manager: FontManager, data: JsonObject): EmptyFontType? { val chars = load(data) if (chars == null) { Log.log(LogMessageType.ASSETS, LogLevels.WARN) { "Empty font provider: $data!" } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/factory/FontTypeFactory.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/factory/FontTypeFactory.kt index bfac60dc1..4a1759bbc 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/factory/FontTypeFactory.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/factory/FontTypeFactory.kt @@ -16,10 +16,11 @@ package de.bixilon.minosoft.gui.rendering.font.types.factory import de.bixilon.kutil.json.JsonObject import de.bixilon.minosoft.data.registries.identified.Identified import de.bixilon.minosoft.gui.rendering.RenderContext +import de.bixilon.minosoft.gui.rendering.font.manager.FontManager import de.bixilon.minosoft.gui.rendering.font.types.FontType interface FontTypeFactory : Identified { - fun build(context: RenderContext, data: JsonObject): T? + fun build(context: RenderContext, manager: FontManager, data: JsonObject): T? } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/unicode/legacy/LegacyUnicodeFontType.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/unicode/legacy/LegacyUnicodeFontType.kt index 5d25b6c75..47a94f97d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/unicode/legacy/LegacyUnicodeFontType.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/unicode/legacy/LegacyUnicodeFontType.kt @@ -21,6 +21,7 @@ import de.bixilon.minosoft.assets.AssetsManager import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderContext +import de.bixilon.minosoft.gui.rendering.font.manager.FontManager import de.bixilon.minosoft.gui.rendering.font.renderer.properties.FontProperties import de.bixilon.minosoft.gui.rendering.font.types.PostInitFontType import de.bixilon.minosoft.gui.rendering.font.types.factory.FontTypeFactory @@ -55,7 +56,7 @@ class LegacyUnicodeFontType( private const val PIXEL = 1.0f / (CHAR_SIZE * CHAR_ROW) private const val WIDTH_SCALE = FontProperties.CHAR_BASE_HEIGHT / CHAR_SIZE.toFloat() - override fun build(context: RenderContext, data: Map): LegacyUnicodeFontType? { + override fun build(context: RenderContext, manager: FontManager, data: Map): LegacyUnicodeFontType? { val assets = context.connection.assetsManager val template = data["template"]?.toString() ?: throw IllegalArgumentException("template missing!") val sizes = data.loadSizes(assets) ?: return null diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/unicode/unihex/UnihexFontType.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/unicode/unihex/UnihexFontType.kt index 89403d6cb..2976243c3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/unicode/unihex/UnihexFontType.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/types/unicode/unihex/UnihexFontType.kt @@ -17,6 +17,7 @@ import de.bixilon.kutil.json.JsonObject import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderContext +import de.bixilon.minosoft.gui.rendering.font.manager.FontManager import de.bixilon.minosoft.gui.rendering.font.renderer.code.CodePointRenderer import de.bixilon.minosoft.gui.rendering.font.types.FontType import de.bixilon.minosoft.gui.rendering.font.types.factory.FontTypeFactory @@ -40,7 +41,7 @@ class UnihexFontType( companion object : FontTypeFactory { override val identifier = minecraft("unihex") - override fun build(context: RenderContext, data: JsonObject): UnihexFontType? { + override fun build(context: RenderContext, manager: FontManager, data: JsonObject): UnihexFontType? { val hexFile = data["hex_file"]?.toResourceLocation() ?: throw IllegalArgumentException("hex_file missing!") val sizes = data["size_override"]?.listCast()?.let { SizeOverride.deserialize(it) } ?: emptyList()