skeletal model loading

This commit is contained in:
Moritz Zwerger 2023-10-15 18:18:32 +02:00
parent 03d80673d4
commit bf08ac0f19
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
3 changed files with 33 additions and 6 deletions

View File

@ -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<ResourceLocation, RegisteredModel> = synchronizedMapOf()
private val baked: MutableMap<ResourceLocation, BakedSkeletalModel> = HashMap()
fun load(latch: AbstractLatch?) {
val templates: MutableMap<ResourceLocation, SkeletalModel> = 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<ResourceLocation, ShaderTexture>) {
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<ResourceLocation, ShaderTexture>,
var model: SkeletalModel? = null,
)
}

View File

@ -32,10 +32,12 @@ data class SkeletalModel(
) {
val loadedTextures: MutableMap<ResourceLocation, SkeletalTextureInstance> = mutableMapOf()
fun load(context: RenderContext) {
fun load(context: RenderContext, skip: Set<ResourceLocation>) {
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)
}
}

View File

@ -17,5 +17,4 @@ import de.bixilon.kotlinglm.vec2.Vec2i
data class SkeletalTexture(
val resolution: Vec2i,
val load: Boolean = true,
)