From c551eae628e295e275ecb6c35fe7ee32662cf47e Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 5 Mar 2022 01:51:37 +0100 Subject: [PATCH] skeletal: fix transforms, block rotation --- .../bixilon/minosoft/data/direction/Directions.kt | 15 ++++++++++++++- .../minosoft/gui/rendering/ShaderManager.kt | 1 + .../skeletal/instance/SkeletalInstance.kt | 10 ++++------ .../model/animations/SkeletalAnimation.kt | 5 +++-- .../storage/StorageBlockEntityRenderer.kt | 5 ++++- .../gui/rendering/world/mesh/VisibleMeshes.kt | 2 +- .../models/block/entities/single_chest.bbmodel | 4 ++-- .../rendering/shader/skeletal/skeletal.vsh | 4 ++-- 8 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/direction/Directions.kt b/src/main/java/de/bixilon/minosoft/data/direction/Directions.kt index b09307b5a..588fc0893 100644 --- a/src/main/java/de/bixilon/minosoft/data/direction/Directions.kt +++ b/src/main/java/de/bixilon/minosoft/data/direction/Directions.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -21,6 +21,8 @@ import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.world.ChunkSection import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.get import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition +import glm_.func.rad +import glm_.mat4x4.Mat4 import glm_.vec2.Vec2 import glm_.vec3.Vec3 import glm_.vec3.Vec3d @@ -47,6 +49,17 @@ enum class Directions( val axis: Axes get() = Axes[this] // ToDo val debugColor = ChatColors[ordinal] + val rotatedMatrix: Mat4 by lazy { + when (this) { + DOWN -> Mat4().translateAssign(Vec3(0.5f)).rotateAssign(180.0f.rad, Vec3(1, 0, 0)).translateAssign(Vec3(-0.5f)) + UP -> Mat4().translateAssign(Vec3(0.5f)).rotateAssign((-180.0f).rad, Vec3(1, 0, 0)).translateAssign(Vec3(-0.5f)) // ToDo + NORTH -> Mat4() + SOUTH -> Mat4().translateAssign(Vec3(0.5f)).rotateAssign(180.0f.rad, Vec3(0, 1, 0)).translateAssign(Vec3(-0.5f)) + WEST -> Mat4().translateAssign(Vec3(0.5f)).rotateAssign((-270.0f).rad, Vec3(0, 1, 0)).translateAssign(Vec3(-0.5f)) + EAST -> Mat4().translateAssign(Vec3(0.5f)).rotateAssign((-90.0f).rad, Vec3(0, 1, 0)).translateAssign(Vec3(-0.5f)) + } + } + lateinit var inverted: Directions private set diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/ShaderManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/ShaderManager.kt index b86faa8de..d10b2cbcc 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/ShaderManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/ShaderManager.kt @@ -35,6 +35,7 @@ class ShaderManager( genericColorShader.load() genericTextureShader.loadAnimated() genericTexture2dShader.loadAnimated() + skeletalShader.defines["TRANSFORMS"] = 10 // ToDo: make dynamic skeletalShader.loadAnimated() renderWindow.lightMap.use(skeletalShader) } 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 577f30eeb..f60774ead 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 @@ -28,8 +28,9 @@ class SkeletalInstance( val renderWindow: RenderWindow, blockPosition: Vec3i, val model: BakedSkeletalModel, + transform: Mat4 = Mat4(), ) { - private val blockPosition = blockPosition.toVec3 + private var baseTransform = Mat4().translateAssign(blockPosition.toVec3) * transform private var currentAnimation: SkeletalAnimation? = null private var animationTime = 0.0f private var animationLastFrame = -1L @@ -61,8 +62,6 @@ class SkeletalInstance( } private fun setTransforms(shader: Shader) { - val base = Mat4().translateAssign(blockPosition.toVec3) - val transforms: MutableList = mutableListOf() @@ -77,7 +76,7 @@ class SkeletalInstance( } for (outliner in model.model.outliner) { - calculateTransform(animationTime, base, animation, outliner, transforms) + calculateTransform(animationTime, baseTransform, animation, outliner, transforms) } shader["uSkeletalTransforms"] = transforms @@ -89,9 +88,8 @@ class SkeletalInstance( return } check(outliner is SkeletalOutliner) - val skeletalTransform = animation?.calculateTransform(outliner, animationTime) ?: Mat4() + val skeletalTransform = transform * (animation?.calculateTransform(outliner, animationTime) ?: Mat4()) - skeletalTransform *= transform // ToDo: this translates wrong transforms += skeletalTransform for (child in outliner.children) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/SkeletalAnimation.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/SkeletalAnimation.kt index d687c824d..f2e74bb25 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/SkeletalAnimation.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/SkeletalAnimation.kt @@ -13,6 +13,7 @@ package de.bixilon.minosoft.gui.rendering.skeletal.model.animations +import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel.Companion.fromBlockCoordinates import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animator.SkeletalAnimator import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animator.keyframes.KeyframeChannels import de.bixilon.minosoft.gui.rendering.skeletal.model.outliner.SkeletalOutliner @@ -58,11 +59,11 @@ data class SkeletalAnimation( val rotation = get(KeyframeChannels.ROTATION, outliner.uuid, animationTime) if (rotation != null && rotation != Vec3.EMPTY_INSTANCE) { - transform.translateAssign(outliner.origin) + transform.translateAssign(outliner.origin.fromBlockCoordinates()) transform.rotateAssign(-rotation.x.rad, Vec3(1, 0, 0)) transform.rotateAssign(-rotation.y.rad, Vec3(0, 1, 0)) transform.rotateAssign(-rotation.z.rad, Vec3(0, 0, 1)) - transform.translateAssign(-outliner.origin) + transform.translateAssign(-outliner.origin.fromBlockCoordinates()) } val scale = get(KeyframeChannels.SCALE, outliner.uuid, animationTime) if (scale != null && (scale.x != 1.0f || scale.y != 1.0f || scale.z != 1.0f)) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/storage/StorageBlockEntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/storage/StorageBlockEntityRenderer.kt index 86bb0b063..a18a3515d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/storage/StorageBlockEntityRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/storage/StorageBlockEntityRenderer.kt @@ -13,9 +13,12 @@ package de.bixilon.minosoft.gui.rendering.world.entities.renderer.storage +import de.bixilon.kutil.cast.CastUtil.nullCast +import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.entities.block.container.storage.StorageBlockEntity import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.blocks.BlockState +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance import de.bixilon.minosoft.gui.rendering.world.entities.BlockEntityRenderer @@ -28,7 +31,7 @@ abstract class StorageBlockEntityRenderer( private var instance: SkeletalInstance? = null override fun init(renderWindow: RenderWindow, state: BlockState, blockPosition: Vec3i) { - this.instance = SkeletalInstance(renderWindow, blockPosition, renderWindow.modelLoader.blockModels["minecraft:models/block/entities/single_chest.bbmodel".toResourceLocation()]!!) + this.instance = SkeletalInstance(renderWindow, blockPosition, renderWindow.modelLoader.blockModels["minecraft:models/block/entities/single_chest.bbmodel".toResourceLocation()]!!, (state.properties[BlockProperties.FACING]?.nullCast() ?: Directions.NORTH).rotatedMatrix) } override fun draw(renderWindow: RenderWindow) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/mesh/VisibleMeshes.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/mesh/VisibleMeshes.kt index c81a41953..ca34d259d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/mesh/VisibleMeshes.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/mesh/VisibleMeshes.kt @@ -25,7 +25,7 @@ class VisibleMeshes(val cameraPosition: Vec3 = Vec3.EMPTY) { val blockEntities: MutableList> = mutableListOf() val sizeString: String - get() = "${opaque.size.format()}|${translucent.size.format()}|${transparent.size.format()}" + get() = "${opaque.size.format()}|${translucent.size.format()}|${transparent.size.format()}|${blockEntities.size.format()}" fun addMesh(mesh: WorldMesh) { diff --git a/src/main/resources/assets/minecraft/models/block/entities/single_chest.bbmodel b/src/main/resources/assets/minecraft/models/block/entities/single_chest.bbmodel index 4b912d3fd..cc1351cad 100644 --- a/src/main/resources/assets/minecraft/models/block/entities/single_chest.bbmodel +++ b/src/main/resources/assets/minecraft/models/block/entities/single_chest.bbmodel @@ -145,7 +145,7 @@ "name": "animation.chest.opening", "loop": "hold", "override": false, - "length": 0.5, + "length": 0.3, "animators": { "c9b45550-2e8b-af52-a981-4aedc81fb456": { "name": "lid", @@ -174,7 +174,7 @@ } ], "uuid": "ac945fe7-65b4-1f09-dc05-782860c4aa7c", - "time": 0.5, + "time": 0.3, "interpolation": "catmullrom" } ] diff --git a/src/main/resources/assets/minosoft/rendering/shader/skeletal/skeletal.vsh b/src/main/resources/assets/minosoft/rendering/shader/skeletal/skeletal.vsh index a303a0a44..e06ba20a7 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/skeletal/skeletal.vsh +++ b/src/main/resources/assets/minosoft/rendering/shader/skeletal/skeletal.vsh @@ -21,8 +21,8 @@ layout (location = 3) in uint vinIndexLayerAnimation;// texture index (0xF000000 #include "minosoft:animation/header_vertex" uniform mat4 uViewProjectionMatrix; -uniform mat4 uSkeletalTransforms[10]; -uniform uint uSkeletalTintAndLight[10]; +uniform mat4 uSkeletalTransforms[TRANSFORMS]; +uniform uint uSkeletalTintAndLight[TRANSFORMS]; #include "minosoft:animation/buffer" #include "minosoft:color"