diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/SkeletalModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/SkeletalModel.kt index bc36933de..8f0e8aca4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/SkeletalModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/SkeletalModel.kt @@ -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): BakedSkeletalModel { - val mesh = SkeletalMesh(context, 1000) - + private fun buildTextures(override: Map): Map { val textures: MutableMap = this.loadedTextures.toMutableMap() for ((name, texture) in override) { @@ -62,6 +61,10 @@ data class SkeletalModel( } } + return textures + } + + private fun buildTransforms(): Pair { val transforms: MutableMap = 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, transform: BakedSkeletalTransform) { + for ((name, element) in elements) { + element.bake(consumer, textures, transform) + } + } + + fun bake(context: RenderContext, override: Map): BakedSkeletalModel { + val mesh = SkeletalMesh(context, 1000) + + val textures = buildTextures(override) + val (transform, count) = buildTransforms() + buildElements(mesh, textures, transform) + + return BakedSkeletalModel(mesh, transform, count, animations) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/SkeletalAnimator.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/SkeletalAnimator.kt index 3ef1b0271..05b30bad2 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/SkeletalAnimator.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/SkeletalAnimator.kt @@ -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 } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalElement.kt index e220d6e93..7bd0ab05c 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalElement.kt @@ -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 = emptyMap(), ) { - fun bake(mesh: SkeletalMesh, textures: Map, transform: BakedSkeletalTransform) { + fun bake(consumer: SkeletalVertexConsumer, textures: Map, 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) }