From 99409f924fa28d3e9eabcbcd098668258e36766c Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Wed, 4 Oct 2023 00:53:31 +0200 Subject: [PATCH] atlas manager: cache textures --- .../minosoft/assets/TestAssetsManager.kt | 2 +- .../gui/rendering/gui/atlas/RawAtlasElement.kt | 5 +---- .../gui/atlas/textures/AtlasTextureManager.kt | 17 ++++++++++++++++- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/assets/TestAssetsManager.kt b/src/integration-test/kotlin/de/bixilon/minosoft/assets/TestAssetsManager.kt index 405261db9..56ac4d531 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/assets/TestAssetsManager.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/assets/TestAssetsManager.kt @@ -42,7 +42,7 @@ object TestAssetsManager : AssetsManager { fun AssetsManager.box(packFormat: Int = 0): ConnectionAssetsManager { - val manager = ConnectionAssetsManager(AssetsManagerProperties(PackProperties(0))) + val manager = ConnectionAssetsManager(AssetsManagerProperties(PackProperties(packFormat))) manager += this return manager diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/RawAtlasElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/RawAtlasElement.kt index 56599f6cf..7276d8a9f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/RawAtlasElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/RawAtlasElement.kt @@ -20,7 +20,6 @@ import de.bixilon.kutil.primitive.IntUtil.toInt import de.bixilon.minosoft.assets.AssetsManager import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.gui.rendering.gui.atlas.textures.AtlasTextureManager -import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.readTexture import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.toVec2i import it.unimi.dsi.fastutil.ints.Int2ObjectMap import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap @@ -36,9 +35,7 @@ class RawAtlasElement( ) { fun load(textures: AtlasTextureManager): AtlasElement { - val textureData = assets[texture].readTexture() - - val (texture, uvStart, uvEnd) = textures.add(textureData, start, end, resolution) + val (texture, uvStart, uvEnd) = textures.add(texture, assets, start, end, resolution) val size = (end + 1) - start diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/textures/AtlasTextureManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/textures/AtlasTextureManager.kt index b95a444e9..0e7b9064d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/textures/AtlasTextureManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/textures/AtlasTextureManager.kt @@ -15,17 +15,31 @@ package de.bixilon.minosoft.gui.rendering.gui.atlas.textures import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.kotlinglm.vec2.Vec2i +import de.bixilon.minosoft.assets.AssetsManager +import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.system.base.texture.data.TextureData import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.memory.MemoryTexture import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.memory.TextureGenerator +import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.readTexture import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY import java.nio.ByteBuffer class AtlasTextureManager(private val context: RenderContext) { + private val cache: MutableMap = HashMap() private val targets: MutableList = mutableListOf() - fun add(textureData: TextureData, start: Vec2i, end: Vec2i, resolution: Vec2i): AtlasTexture { + private fun getTexture(texture: ResourceLocation, assets: AssetsManager): TextureData { + this.cache[texture]?.let { return it } + + val data = assets[texture].readTexture() + this.cache[texture] = data + + return data + } + + fun add(texture: ResourceLocation, assets: AssetsManager, start: Vec2i, end: Vec2i, resolution: Vec2i): AtlasTexture { + val textureData = getTexture(texture, assets) val scale = textureData.size / resolution val realStart = start * scale @@ -50,6 +64,7 @@ class AtlasTextureManager(private val context: RenderContext) { for (target in targets) { context.textures.staticTextures += target.texture } + this.cache.clear() targets.clear() }