mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-14 09:56:37 -04:00
skeletal model loading
This commit is contained in:
parent
03d80673d4
commit
bf08ac0f19
@ -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,
|
||||
)
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,5 +17,4 @@ import de.bixilon.kotlinglm.vec2.Vec2i
|
||||
|
||||
data class SkeletalTexture(
|
||||
val resolution: Vec2i,
|
||||
val load: Boolean = true,
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user