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.data.registries.identified.ResourceLocation
import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.RenderContext
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalMesh 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.BakedSkeletalModel
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalTransform import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalTransform
import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.SkeletalAnimation 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 { private fun buildTextures(override: Map<ResourceLocation, ShaderTexture>): Map<ResourceLocation, SkeletalTextureInstance> {
val mesh = SkeletalMesh(context, 1000)
val textures: MutableMap<ResourceLocation, SkeletalTextureInstance> = this.loadedTextures.toMutableMap() val textures: MutableMap<ResourceLocation, SkeletalTextureInstance> = this.loadedTextures.toMutableMap()
for ((name, texture) in override) { 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 transforms: MutableMap<String, BakedSkeletalTransform> = mutableMapOf()
val transformId = AtomicInteger(1) val transformId = AtomicInteger(1)
@ -70,10 +73,22 @@ data class SkeletalModel(
} }
val baseTransform = BakedSkeletalTransform(0, Vec3.EMPTY, transforms) val baseTransform = BakedSkeletalTransform(0, Vec3.EMPTY, transforms)
for ((name, element) in elements) { return Pair(baseTransform, transformId.get())
element.bake(mesh, textures, baseTransform) }
}
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 if (split.size == 1 && split[0] == "base") return transform
for (name in split) { 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 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.kotlinglm.vec3.Vec3
import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.direction.Directions
import de.bixilon.minosoft.data.registries.identified.ResourceLocation 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.BakedSkeletalTransform
import de.bixilon.minosoft.gui.rendering.skeletal.baked.SkeletalBakeContext import de.bixilon.minosoft.gui.rendering.skeletal.baked.SkeletalBakeContext
import de.bixilon.minosoft.gui.rendering.skeletal.model.textures.SkeletalTextureInstance import de.bixilon.minosoft.gui.rendering.skeletal.model.textures.SkeletalTextureInstance
@ -36,10 +36,10 @@ data class SkeletalElement(
val children: Map<String, SkeletalElement> = emptyMap(), 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 if (!enabled) return
val context = SkeletalBakeContext(transform = transform, textures = textures, consumer = mesh) val context = SkeletalBakeContext(transform = transform, textures = textures, consumer = consumer)
return bake(context) return bake(context)
} }