mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-19 04:15:14 -04:00
skeletal: fix transforms, block rotation
This commit is contained in:
parent
eadb536838
commit
c551eae628
@ -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
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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)) {
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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"
|
||||
}
|
||||
]
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user