generic skeletal head animator

This commit is contained in:
Moritz Zwerger 2023-11-09 09:57:02 +01:00
parent d54c5ff57f
commit f8285711af
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
4 changed files with 19 additions and 9 deletions

View File

@ -14,9 +14,15 @@
package de.bixilon.minosoft.gui.rendering.entities.model.animal 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.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.entities.renderer.EntityRenderer
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel
class AnimalModel<R : EntityRenderer<*>>(renderer: R, model: BakedSkeletalModel) : SkeletalFeature(renderer, model) { class AnimalModel<R : EntityRenderer<*>>(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()
}
} }

View File

@ -11,28 +11,28 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft. * 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.func.rad
import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.minosoft.gui.rendering.entities.easteregg.EntityEasterEggs.isFlipped 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.skeletal.instance.TransformInstance
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.rotateRadAssign import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.rotateRadAssign
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY
class HumanHeadAnimator( class HeadAnimator(
val model: HumanModel<*>, val renderer: EntityRenderer<*>,
val transform: TransformInstance, val transform: TransformInstance,
) { ) {
private var rotation = Vec3.EMPTY private var rotation = Vec3.EMPTY
fun update() { fun update() {
val info = model.renderer.info val info = renderer.info
val pitch = info.rotation.pitch val pitch = info.rotation.pitch
this.rotation.x = pitch.rad this.rotation.x = pitch.rad
if (model.renderer.entity.isFlipped()) { if (renderer.entity.isFlipped()) {
this.rotation.x = -this.rotation.x // TODO: not 100% correct this.rotation.x = -this.rotation.x // TODO: not 100% correct
} }
transform.value transform.value

View File

@ -14,15 +14,15 @@
package de.bixilon.minosoft.gui.rendering.entities.model.human 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.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.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.model.human.animator.LegAnimator
import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer
import de.bixilon.minosoft.gui.rendering.entities.util.EntitySpeed import de.bixilon.minosoft.gui.rendering.entities.util.EntitySpeed
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel
abstract class HumanModel<R : EntityRenderer<*>>(renderer: R, model: BakedSkeletalModel) : SkeletalFeature(renderer, model) { abstract class HumanModel<R : EntityRenderer<*>>(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 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"]!!) val arm = ArmAnimator(this, instance.transform.children["left_arm"]!!, instance.transform.children["right_arm"]!!)

View File

@ -46,4 +46,8 @@ class TransformInstance(
child.pack(buffer, temp, temp) child.pack(buffer, temp, temp)
} }
} }
operator fun get(name: String): TransformInstance? {
return this.children[name]
}
} }