From f8285711afc20c8468771caf370f555a1696b626 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Thu, 9 Nov 2023 09:57:02 +0100 Subject: [PATCH] generic skeletal head animator --- .../rendering/entities/model/animal/AnimalModel.kt | 8 +++++++- .../HeadAnimator.kt} | 12 ++++++------ .../gui/rendering/entities/model/human/HumanModel.kt | 4 ++-- .../rendering/skeletal/instance/TransformInstance.kt | 4 ++++ 4 files changed, 19 insertions(+), 9 deletions(-) rename src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/{human/animator/HumanHeadAnimator.kt => animator/HeadAnimator.kt} (84%) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/animal/AnimalModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/animal/AnimalModel.kt index 732967592..b2bf58e0d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/animal/AnimalModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/animal/AnimalModel.kt @@ -14,9 +14,15 @@ package de.bixilon.minosoft.gui.rendering.entities.model.animal import de.bixilon.minosoft.gui.rendering.entities.feature.SkeletalFeature +import de.bixilon.minosoft.gui.rendering.entities.model.animator.HeadAnimator import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel class AnimalModel>(renderer: R, model: BakedSkeletalModel) : SkeletalFeature(renderer, model) { - // TODO: animate head + val head = instance.transform["head"]?.let { HeadAnimator(renderer, it) } + + override fun updatePosition() { + super.updatePosition() + head?.update() + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/human/animator/HumanHeadAnimator.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/animator/HeadAnimator.kt similarity index 84% rename from src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/human/animator/HumanHeadAnimator.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/animator/HeadAnimator.kt index 5cb819766..d0995b142 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/human/animator/HumanHeadAnimator.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/animator/HeadAnimator.kt @@ -11,28 +11,28 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.entities.model.human.animator +package de.bixilon.minosoft.gui.rendering.entities.model.animator import de.bixilon.kotlinglm.func.rad import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.minosoft.gui.rendering.entities.easteregg.EntityEasterEggs.isFlipped -import de.bixilon.minosoft.gui.rendering.entities.model.human.HumanModel +import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.skeletal.instance.TransformInstance import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.rotateRadAssign import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY -class HumanHeadAnimator( - val model: HumanModel<*>, +class HeadAnimator( + val renderer: EntityRenderer<*>, val transform: TransformInstance, ) { private var rotation = Vec3.EMPTY fun update() { - val info = model.renderer.info + val info = renderer.info val pitch = info.rotation.pitch this.rotation.x = pitch.rad - if (model.renderer.entity.isFlipped()) { + if (renderer.entity.isFlipped()) { this.rotation.x = -this.rotation.x // TODO: not 100% correct } transform.value diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/human/HumanModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/human/HumanModel.kt index 9c86c5ba0..7c55c7e00 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/human/HumanModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/human/HumanModel.kt @@ -14,15 +14,15 @@ package de.bixilon.minosoft.gui.rendering.entities.model.human import de.bixilon.minosoft.gui.rendering.entities.feature.SkeletalFeature +import de.bixilon.minosoft.gui.rendering.entities.model.animator.HeadAnimator import de.bixilon.minosoft.gui.rendering.entities.model.human.animator.ArmAnimator -import de.bixilon.minosoft.gui.rendering.entities.model.human.animator.HumanHeadAnimator import de.bixilon.minosoft.gui.rendering.entities.model.human.animator.LegAnimator import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.entities.util.EntitySpeed import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel abstract class HumanModel>(renderer: R, model: BakedSkeletalModel) : SkeletalFeature(renderer, model) { - val head = instance.transform.children["head"]?.let { HumanHeadAnimator(this, it) } + val head = instance.transform.children["head"]?.let { HeadAnimator(renderer, it) } val leg = LegAnimator(this, instance.transform.children["left_leg"]!!, instance.transform.children["right_leg"]!!) val arm = ArmAnimator(this, instance.transform.children["left_arm"]!!, instance.transform.children["right_arm"]!!) 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 1dd1d05d5..01ba98ef7 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 @@ -46,4 +46,8 @@ class TransformInstance( child.pack(buffer, temp, temp) } } + + operator fun get(name: String): TransformInstance? { + return this.children[name] + } }