cleanup SkeletalModel baking

This commit is contained in:
Moritz Zwerger 2023-10-17 13:53:51 +02:00
parent a0a52f57b4
commit db786d932d
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
3 changed files with 26 additions and 11 deletions

View File

@ -17,6 +17,7 @@ import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
import de.bixilon.minosoft.gui.rendering.RenderContext
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalMesh
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalVertexConsumer
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalTransform
import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.SkeletalAnimation
@ -47,9 +48,7 @@ data class SkeletalModel(
}
}
fun bake(context: RenderContext, override: Map<ResourceLocation, ShaderTexture>): BakedSkeletalModel {
val mesh = SkeletalMesh(context, 1000)
private fun buildTextures(override: Map<ResourceLocation, ShaderTexture>): Map<ResourceLocation, SkeletalTextureInstance> {
val textures: MutableMap<ResourceLocation, SkeletalTextureInstance> = this.loadedTextures.toMutableMap()
for ((name, texture) in override) {
@ -62,6 +61,10 @@ data class SkeletalModel(
}
}
return textures
}
private fun buildTransforms(): Pair<BakedSkeletalTransform, Int> {
val transforms: MutableMap<String, BakedSkeletalTransform> = mutableMapOf()
val transformId = AtomicInteger(1)
@ -70,10 +73,22 @@ data class SkeletalModel(
}
val baseTransform = BakedSkeletalTransform(0, Vec3.EMPTY, transforms)
for ((name, element) in elements) {
element.bake(mesh, textures, baseTransform)
}
return Pair(baseTransform, transformId.get())
}
return BakedSkeletalModel(mesh, baseTransform, transformId.get(), animations)
private fun buildElements(consumer: SkeletalVertexConsumer, textures: Map<ResourceLocation, SkeletalTextureInstance>, transform: BakedSkeletalTransform) {
for ((name, element) in elements) {
element.bake(consumer, textures, transform)
}
}
fun bake(context: RenderContext, override: Map<ResourceLocation, ShaderTexture>): BakedSkeletalModel {
val mesh = SkeletalMesh(context, 1000)
val textures = buildTextures(override)
val (transform, count) = buildTransforms()
buildElements(mesh, textures, transform)
return BakedSkeletalModel(mesh, transform, count, animations)
}
}

View File

@ -31,7 +31,7 @@ data class SkeletalAnimator(
if (split.size == 1 && split[0] == "base") return transform
for (name in split) {
transform = transform.children[name] ?: throw IllegalStateException("Animation is referencing unknown transform!")
transform = transform.children[name] ?: throw IllegalStateException("Animation is referencing unknown transform: $name")
}
return transform
}

View File

@ -16,7 +16,7 @@ package de.bixilon.minosoft.gui.rendering.skeletal.model.elements
import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.minosoft.data.direction.Directions
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalMesh
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalVertexConsumer
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalTransform
import de.bixilon.minosoft.gui.rendering.skeletal.baked.SkeletalBakeContext
import de.bixilon.minosoft.gui.rendering.skeletal.model.textures.SkeletalTextureInstance
@ -36,10 +36,10 @@ data class SkeletalElement(
val children: Map<String, SkeletalElement> = emptyMap(),
) {
fun bake(mesh: SkeletalMesh, textures: Map<ResourceLocation, SkeletalTextureInstance>, transform: BakedSkeletalTransform) {
fun bake(consumer: SkeletalVertexConsumer, textures: Map<ResourceLocation, SkeletalTextureInstance>, transform: BakedSkeletalTransform) {
if (!enabled) return
val context = SkeletalBakeContext(transform = transform, textures = textures, consumer = mesh)
val context = SkeletalBakeContext(transform = transform, textures = textures, consumer = consumer)
return bake(context)
}