skeletal: fix transforms, block rotation

This commit is contained in:
Bixilon 2022-03-05 01:51:37 +01:00
parent eadb536838
commit c551eae628
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
8 changed files with 31 additions and 15 deletions

View File

@ -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

View File

@ -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)
}

View File

@ -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<Mat4> = 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) {

View File

@ -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)) {

View File

@ -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<E : StorageBlockEntity>(
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) {

View File

@ -25,7 +25,7 @@ class VisibleMeshes(val cameraPosition: Vec3 = Vec3.EMPTY) {
val blockEntities: MutableList<BlockEntityRenderer<*>> = 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) {

View File

@ -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"
}
]

View File

@ -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"