From cd694c50fff4e3117adc7689df48e8fff1b0dcf5 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Wed, 18 Oct 2023 11:51:28 +0200 Subject: [PATCH] skeletal: move loop to individual keyframes --- .../resources/model/skeletal/dummy.smodel | 2 +- .../baked/animation/keyframe/KeyframeAnimation.kt | 15 ++++++++++++++- .../baked/animation/keyframe/KeyframeAnimator.kt | 11 ++++++++--- .../skeletal/instance/AnimationManager.kt | 3 ++- .../skeletal/instance/SkeletalInstance.kt | 2 +- .../animations/animators/SkeletalAnimator.kt | 3 +-- .../animators/keyframes/SkeletalKeyframe.kt | 2 ++ .../animators/keyframes/types/RotateKeyframe.kt | 2 ++ .../animators/keyframes/types/ScaleKeyframe.kt | 2 ++ .../animators/keyframes/types/TintKeyframe.kt | 2 ++ .../keyframes/types/TranslateKeyframe.kt | 2 ++ .../models/block/entities/single_chest.smodel | 4 ++-- 12 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/integration-test/resources/model/skeletal/dummy.smodel b/src/integration-test/resources/model/skeletal/dummy.smodel index aa449529f..d5ff9d9aa 100644 --- a/src/integration-test/resources/model/skeletal/dummy.smodel +++ b/src/integration-test/resources/model/skeletal/dummy.smodel @@ -70,10 +70,10 @@ "open": [ { "transform": "head", - "loop": "hold", "keyframes": [ { "type": "rotate", + "loop": "hold", "interpolation": "sine", "data": { "0.0": [0, 0, 0], diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/animation/keyframe/KeyframeAnimation.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/animation/keyframe/KeyframeAnimation.kt index 4ad6d48fd..7f03e87bd 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/animation/keyframe/KeyframeAnimation.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/animation/keyframe/KeyframeAnimation.kt @@ -18,8 +18,21 @@ import de.bixilon.minosoft.gui.rendering.skeletal.baked.animation.AbstractAnimat class KeyframeAnimation( val animators: Array, ) : AbstractAnimation { + private var time = 0.0f + override fun draw(delta: Float): Boolean { - TODO("Not yet implemented") + time += delta + var stop = true + + for (animator in this.animators) { + if (!animator.draw(this.time)) { + stop = false + } + } + if (stop) return true + + + return false } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/animation/keyframe/KeyframeAnimator.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/animation/keyframe/KeyframeAnimator.kt index c73154aaf..0731a00c3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/animation/keyframe/KeyframeAnimator.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/animation/keyframe/KeyframeAnimator.kt @@ -14,10 +14,15 @@ package de.bixilon.minosoft.gui.rendering.skeletal.baked.animation.keyframe import de.bixilon.minosoft.gui.rendering.skeletal.instance.TransformInstance -import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.AnimationLoops class KeyframeAnimator( val transform: TransformInstance, - val loop: AnimationLoops, val keyframes: Array, -) +) { + + fun draw(time: Float): Boolean { + + + return false + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/AnimationManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/AnimationManager.kt index a5c26f7bf..38f8921ce 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/AnimationManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/AnimationManager.kt @@ -40,7 +40,8 @@ class AnimationManager(val instance: SkeletalInstance) { fun draw() { val nanos = nanos() - val delta = nanos - lastDraw + val delta = if (lastDraw < 0) 0L else nanos - lastDraw + this.lastDraw = nanos draw(delta / 1000.0f) } 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 a75d65e92..d0d14d36f 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 @@ -60,7 +60,7 @@ class SkeletalInstance( fun update(position: Vec3i, direction: Directions) { val position = Vec3(position - context.camera.offset.offset) - position.x -= 0.5f; position.z -= 0.5f // models origin is the center of block origin + position.x += 0.5f; position.z += 0.5f // models origin is the center of block origin update(position, direction.rotation) } } 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 360be11b7..42e7f9937 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 @@ -22,7 +22,6 @@ import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.key data class SkeletalAnimator( val transform: String, - val loop: AnimationLoops, val keyframes: List, ) { private val split = transform.split(".", "/").toTypedArray() @@ -46,6 +45,6 @@ data class SkeletalAnimator( instances[index] = keyframe.instance() } - return KeyframeAnimator(transform, loop, instances.cast()) + return KeyframeAnimator(transform, instances.cast()) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/SkeletalKeyframe.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/SkeletalKeyframe.kt index 5a9d250ce..d523b4def 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/SkeletalKeyframe.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/SkeletalKeyframe.kt @@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.ke import com.fasterxml.jackson.annotation.JsonSubTypes import com.fasterxml.jackson.annotation.JsonTypeInfo import de.bixilon.minosoft.gui.rendering.skeletal.baked.animation.keyframe.KeyframeInstance +import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.AnimationLoops import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.keyframes.types.RotateKeyframe import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.keyframes.types.ScaleKeyframe import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.keyframes.types.TintKeyframe @@ -31,6 +32,7 @@ import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.key interface SkeletalKeyframe { val type: String + val loop: AnimationLoops fun instance(): KeyframeInstance } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/RotateKeyframe.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/RotateKeyframe.kt index 171e2f2b0..79e351ed7 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/RotateKeyframe.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/RotateKeyframe.kt @@ -15,12 +15,14 @@ package de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.ke import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.minosoft.gui.rendering.skeletal.baked.animation.keyframe.KeyframeInstance +import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.AnimationLoops import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.keyframes.KeyframeInterpolation import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.keyframes.SkeletalKeyframe import java.util.* data class RotateKeyframe( val interpolation: KeyframeInterpolation = KeyframeInterpolation.NONE, + override val loop: AnimationLoops, val data: TreeMap, ) : SkeletalKeyframe { override val type get() = TYPE diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/ScaleKeyframe.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/ScaleKeyframe.kt index 7b03b17ac..9430389e7 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/ScaleKeyframe.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/ScaleKeyframe.kt @@ -15,12 +15,14 @@ package de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.ke import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.minosoft.gui.rendering.skeletal.baked.animation.keyframe.KeyframeInstance +import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.AnimationLoops import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.keyframes.KeyframeInterpolation import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.keyframes.SkeletalKeyframe import java.util.* data class ScaleKeyframe( val interpolation: KeyframeInterpolation = KeyframeInterpolation.NONE, + override val loop: AnimationLoops, val data: TreeMap, ) : SkeletalKeyframe { override val type get() = TYPE diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/TintKeyframe.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/TintKeyframe.kt index 8bdea87d3..c04792a62 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/TintKeyframe.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/TintKeyframe.kt @@ -15,12 +15,14 @@ package de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.ke import de.bixilon.minosoft.data.text.formatting.color.RGBColor import de.bixilon.minosoft.gui.rendering.skeletal.baked.animation.keyframe.KeyframeInstance +import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.AnimationLoops import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.keyframes.KeyframeInterpolation import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.keyframes.SkeletalKeyframe import java.util.* data class TintKeyframe( val interpolation: KeyframeInterpolation = KeyframeInterpolation.NONE, + override val loop: AnimationLoops, val channel: ColorChannel = ColorChannel.RGB, val data: TreeMap, ) : SkeletalKeyframe { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/TranslateKeyframe.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/TranslateKeyframe.kt index 67020a98a..b7a6d3734 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/TranslateKeyframe.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/animations/animators/keyframes/types/TranslateKeyframe.kt @@ -15,12 +15,14 @@ package de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.ke import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.minosoft.gui.rendering.skeletal.baked.animation.keyframe.KeyframeInstance +import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.AnimationLoops import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.keyframes.KeyframeInterpolation import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.animators.keyframes.SkeletalKeyframe import java.util.* data class TranslateKeyframe( val interpolation: KeyframeInterpolation = KeyframeInterpolation.NONE, + override val loop: AnimationLoops, val data: TreeMap, ) : SkeletalKeyframe { override val type get() = TYPE diff --git a/src/main/resources/assets/minecraft/models/block/entities/single_chest.smodel b/src/main/resources/assets/minecraft/models/block/entities/single_chest.smodel index 2ddffc8de..1c14d5779 100644 --- a/src/main/resources/assets/minecraft/models/block/entities/single_chest.smodel +++ b/src/main/resources/assets/minecraft/models/block/entities/single_chest.smodel @@ -59,11 +59,11 @@ "open": [ { "transform": "lid", - "loop": "hold", "length": 0.3, "keyframes": [ { "type": "rotate", + "loop": "hold", "interpolation": "sine", "data": { "0.0": [0, 0, 0], @@ -76,11 +76,11 @@ "close": [ { "transform": "lid", - "loop": "hold", "length": 0.5, "keyframes": [ { "type": "rotate", + "loop": "hold", "interpolation": "sine", "data": { "0.0": [-90, 0, 0],