From 6a55f944241b560027f6982001ebb11e1d4221d9 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Mon, 16 Oct 2023 21:04:34 +0200 Subject: [PATCH] skeletal fixes --- .../renderer/storage/DoubleChestRenderer.kt | 7 +++++-- .../renderer/storage/SingleChestRenderer.kt | 6 ++++-- .../storage/StorageBlockEntityRenderer.kt | 2 ++ .../skeletal/baked/BakedSkeletalModel.kt | 8 ++------ .../skeletal/baked/SkeletalBakeContext.kt | 3 ++- .../skeletal/instance/SkeletalInstance.kt | 15 ++++++++++++++- .../skeletal/instance/TransformInstance.kt | 11 ++++++++--- .../skeletal/model/elements/SkeletalFace.kt | 3 ++- 8 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/DoubleChestRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/DoubleChestRenderer.kt index 3ad2348e1..af9141917 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/DoubleChestRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/DoubleChestRenderer.kt @@ -26,7 +26,6 @@ import de.bixilon.minosoft.gui.rendering.models.loader.ModelLoader import de.bixilon.minosoft.gui.rendering.models.loader.SkeletalLoader.Companion.bbModel import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture -import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3 class DoubleChestRenderer( val entity: StorageBlockEntity, @@ -37,10 +36,14 @@ class DoubleChestRenderer( light: Int, ) : StorageBlockEntityRenderer( blockState, - model.createInstance(context, (blockPosition - context.camera.offset.offset).toVec3, (blockState.getFacing()).rotation), + model.createInstance(context), light, ) { + init { + skeletal?.update(blockPosition, blockState.getFacing()) + } + companion object { val DOUBLE_MODEL = minecraft("block/entities/double_chest").bbModel() private val named = arrayOf(minecraft("left"), minecraft("right")) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/SingleChestRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/SingleChestRenderer.kt index 04ed72233..57f88baa1 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/SingleChestRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/SingleChestRenderer.kt @@ -26,7 +26,6 @@ import de.bixilon.minosoft.gui.rendering.models.loader.ModelLoader import de.bixilon.minosoft.gui.rendering.models.loader.SkeletalLoader.Companion.sModel import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture -import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3 class SingleChestRenderer( val entity: StorageBlockEntity, @@ -37,9 +36,12 @@ class SingleChestRenderer( light: Int, ) : StorageBlockEntityRenderer( blockState, - model.createInstance(context, (blockPosition - context.camera.offset.offset).toVec3, blockState.getFacing().rotation), + model.createInstance(context), light, ) { + init { + skeletal?.update(blockPosition, blockState.getFacing()) + } companion object { val SINGLE_MODEL = minecraft("block/entities/single_chest").sModel() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/StorageBlockEntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/StorageBlockEntityRenderer.kt index 9a91fad43..cc38a352d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/StorageBlockEntityRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/StorageBlockEntityRenderer.kt @@ -13,8 +13,10 @@ package de.bixilon.minosoft.gui.rendering.chunk.entities.renderer.storage +import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.entities.block.container.storage.StorageBlockEntity import de.bixilon.minosoft.data.registries.blocks.state.BlockState +import de.bixilon.minosoft.data.world.positions.BlockPosition import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.chunk.entities.BlockEntityRenderer import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/BakedSkeletalModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/BakedSkeletalModel.kt index 3edad62af..5a51b4077 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/BakedSkeletalModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/BakedSkeletalModel.kt @@ -13,7 +13,6 @@ package de.bixilon.minosoft.gui.rendering.skeletal.baked -import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalMesh import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance @@ -40,12 +39,9 @@ data class BakedSkeletalModel( } - fun createInstance(context: RenderContext, position: Vec3, rotation: Vec3): SkeletalInstance { + fun createInstance(context: RenderContext): SkeletalInstance { val transforms = this.transform.instance() - val instance = SkeletalInstance(context, this, transforms) - instance.update(position, rotation) - - return instance + return SkeletalInstance(context, this, transforms) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/SkeletalBakeContext.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/SkeletalBakeContext.kt index 629b1ea71..5711bedcb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/SkeletalBakeContext.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/SkeletalBakeContext.kt @@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.skeletal.baked import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kutil.collections.CollectionUtil.extend import de.bixilon.minosoft.data.registries.identified.ResourceLocation +import de.bixilon.minosoft.gui.rendering.models.block.element.ModelElement.Companion.BLOCK_SIZE import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalVertexConsumer import de.bixilon.minosoft.gui.rendering.skeletal.model.elements.SkeletalElement import de.bixilon.minosoft.gui.rendering.skeletal.model.elements.SkeletalRotation @@ -35,7 +36,7 @@ data class SkeletalBakeContext( ) { fun copy(element: SkeletalElement): SkeletalBakeContext { - val offset = this.offset + (element.offset / 16.0f) + val offset = this.offset + (element.offset / BLOCK_SIZE) val inflate = this.inflate + element.inflate val transparency = this.transparency && element.transparency val texture = element.texture ?: texture diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/SkeletalInstance.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/SkeletalInstance.kt index 3623c8430..e31350406 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/SkeletalInstance.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/SkeletalInstance.kt @@ -15,6 +15,9 @@ package de.bixilon.minosoft.gui.rendering.skeletal.instance import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.vec3.Vec3 +import de.bixilon.kotlinglm.vec3.Vec3d +import de.bixilon.kotlinglm.vec3.Vec3i +import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.shader.Shader import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel @@ -42,9 +45,19 @@ class SkeletalInstance( fun update(position: Vec3, rotation: Vec3) { val matrix = Mat4() - .translateAssign(Vec3(position - context.camera.offset.offset)) + .translateAssign(position) .rotateRadAssign(rotation) transform.value = matrix } + + fun update(position: Vec3d, rotation: Vec3) { + update(Vec3(position - context.camera.offset.offset), rotation) + } + + fun update(position: Vec3i, direction: Directions) { + val position = Vec3(position - context.camera.offset.offset) + position.x -= 0.5f; position.z -= 0.5f + update(position, direction.rotation) + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/TransformInstance.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/TransformInstance.kt index b38e21d93..e1038795f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/TransformInstance.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/TransformInstance.kt @@ -25,12 +25,17 @@ class TransformInstance( var value = Mat4() fun pack(buffer: FloatBuffer) { - pack(buffer, value) + pack(buffer, Mat4()) } private fun pack(buffer: FloatBuffer, parent: Mat4) { - val value = parent * value + val value = value * parent val offset = this.id * Mat4.length - buffer.put(value.array, offset, Mat4.length) + for (index in 0 until Mat4.length) { + buffer.put(offset + index, value.array[index]) + } + for ((name, child) in children) { + child.pack(buffer, value) + } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalFace.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalFace.kt index d6fccf154..00f063645 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalFace.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalFace.kt @@ -18,6 +18,7 @@ import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.minosoft.data.Axes import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.registries.identified.ResourceLocation +import de.bixilon.minosoft.gui.rendering.models.block.element.ModelElement.Companion.BLOCK_SIZE import de.bixilon.minosoft.gui.rendering.models.block.element.face.FaceUV import de.bixilon.minosoft.gui.rendering.models.block.legacy.ModelBakeUtil import de.bixilon.minosoft.gui.rendering.skeletal.baked.SkeletalBakeContext @@ -30,7 +31,7 @@ data class SkeletalFace( ) { fun bake(context: SkeletalBakeContext, direction: Directions, element: SkeletalElement, transform: Int) { - val positions = direction.getPositions(context.offset + element.from - context.inflate, context.offset + element.to + context.inflate) + val positions = direction.getPositions(context.offset + (element.from - context.inflate) / BLOCK_SIZE, context.offset + (element.to + context.inflate) / BLOCK_SIZE) val texture = context.textures[texture ?: context.texture ?: throw IllegalStateException("element has no texture set!")] ?: throw IllegalStateException("Texture not found!")