diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/SkeletalLoader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/SkeletalLoader.kt index e30e1a2c9..49d9f459d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/SkeletalLoader.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/SkeletalLoader.kt @@ -13,27 +13,53 @@ package de.bixilon.minosoft.gui.rendering.models.loader +import de.bixilon.kutil.collections.CollectionUtil.synchronizedMapOf +import de.bixilon.kutil.collections.map.SynchronizedMap import de.bixilon.kutil.latch.AbstractLatch +import de.bixilon.minosoft.assets.util.InputStreamUtil.readJson import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel +import de.bixilon.minosoft.gui.rendering.skeletal.model.SkeletalModel import de.bixilon.minosoft.gui.rendering.system.base.texture.shader.ShaderTexture class SkeletalLoader(private val loader: ModelLoader) { + private val registered: SynchronizedMap = synchronizedMapOf() + private val baked: MutableMap = HashMap() fun load(latch: AbstractLatch?) { + val templates: MutableMap = HashMap(this.registered.size, 0.1f) + + for ((name, registered) in this.registered) { + val template = templates.getOrPut(registered.template) { loader.context.connection.assetsManager[registered.template].readJson() } + + template.load(loader.context, registered.override.keys) + registered.model = template + } } fun bake(latch: AbstractLatch?) { + for ((name, registered) in this.registered) { + val baked = registered.model!!.bake(loader.context, registered.override) + this.baked[name] = baked + } } fun cleanup() { + this.registered.clear() } operator fun get(name: ResourceLocation): BakedSkeletalModel? { - TODO() + return this.baked[name] } fun register(name: ResourceLocation, template: ResourceLocation = name, override: Map) { - TODO() + val previous = this.registered.put(name, RegisteredModel(template, override)) + if (previous != null) throw IllegalArgumentException("A model with the name $name was already registered!") } + + private data class RegisteredModel( + val template: ResourceLocation, + val override: Map, + var model: SkeletalModel? = null, + ) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/SkeletalModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/SkeletalModel.kt index a14e66931..15d21685d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/SkeletalModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/SkeletalModel.kt @@ -32,10 +32,12 @@ data class SkeletalModel( ) { val loadedTextures: MutableMap = mutableMapOf() - fun load(context: RenderContext) { + fun load(context: RenderContext, skip: Set) { for ((name, properties) in this.textures) { - if (!properties.load) continue - context.textures.staticTextures.createTexture(name.texture()) + if (name in skip) continue + val file = name.texture() + if (file in skip) continue + context.textures.staticTextures.createTexture(file) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/textures/SkeletalTexture.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/textures/SkeletalTexture.kt index 1b2a609cf..b6ed1f01e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/textures/SkeletalTexture.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/textures/SkeletalTexture.kt @@ -17,5 +17,4 @@ import de.bixilon.kotlinglm.vec2.Vec2i data class SkeletalTexture( val resolution: Vec2i, - val load: Boolean = true, )