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 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.kutil.latch.AbstractLatch
import de.bixilon.minosoft.assets.util.InputStreamUtil.readJson
import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.identified.ResourceLocation
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel 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 import de.bixilon.minosoft.gui.rendering.system.base.texture.shader.ShaderTexture
class SkeletalLoader(private val loader: ModelLoader) { class SkeletalLoader(private val loader: ModelLoader) {
private val registered: SynchronizedMap<ResourceLocation, RegisteredModel> = synchronizedMapOf()
private val baked: MutableMap<ResourceLocation, BakedSkeletalModel> = HashMap()
fun load(latch: AbstractLatch?) { 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?) { 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() { fun cleanup() {
this.registered.clear()
} }
operator fun get(name: ResourceLocation): BakedSkeletalModel? { operator fun get(name: ResourceLocation): BakedSkeletalModel? {
TODO() return this.baked[name]
} }
fun register(name: ResourceLocation, template: ResourceLocation = name, override: Map<ResourceLocation, ShaderTexture>) { 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() val loadedTextures: MutableMap<ResourceLocation, SkeletalTextureInstance> = mutableMapOf()
fun load(context: RenderContext) { fun load(context: RenderContext, skip: Set<ResourceLocation>) {
for ((name, properties) in this.textures) { for ((name, properties) in this.textures) {
if (!properties.load) continue if (name in skip) continue
context.textures.staticTextures.createTexture(name.texture()) 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( data class SkeletalTexture(
val resolution: Vec2i, val resolution: Vec2i,
val load: Boolean = true,
) )