From e208c479f627252536f65a774d27bf1310f5408e Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Thu, 26 Oct 2023 22:52:23 +0200 Subject: [PATCH] skeletal feature: update position and rotation --- .../de/bixilon/minosoft/gui/RenderLoop.kt | 1 + .../entities/feature/SkeletalFeature.kt | 41 ++++++++++++++++++- .../renderer/player/PlayerRenderer.kt | 3 +- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/RenderLoop.kt b/src/main/java/de/bixilon/minosoft/gui/RenderLoop.kt index 13ae3386e..ff8123be7 100644 --- a/src/main/java/de/bixilon/minosoft/gui/RenderLoop.kt +++ b/src/main/java/de/bixilon/minosoft/gui/RenderLoop.kt @@ -47,6 +47,7 @@ class RenderLoop( it == RenderingStates.PAUSED } } + context.profile.performance::slowRendering.observe(this) { this.slowRendering = it } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/SkeletalFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/SkeletalFeature.kt index 8674e5740..924b5849b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/SkeletalFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/SkeletalFeature.kt @@ -13,25 +13,64 @@ package de.bixilon.minosoft.gui.rendering.entities.feature +import de.bixilon.kotlinglm.func.rad +import de.bixilon.kotlinglm.vec3.Vec3 +import de.bixilon.kotlinglm.vec3.Vec3d +import de.bixilon.minosoft.data.entities.EntityRotation import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer +import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalShader import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance +import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY -class SkeletalFeature( +open class SkeletalFeature( renderer: EntityRenderer<*>, val instance: SkeletalInstance, ) : EntityRenderFeature(renderer) { private val manager = renderer.renderer.context.skeletal + protected open val shader: SkeletalShader = manager.shader + + protected var position = Vec3d.EMPTY + protected var yaw = 0.0f constructor(renderer: EntityRenderer<*>, model: BakedSkeletalModel) : this(renderer, model.createInstance(renderer.renderer.context)) + + protected open fun updatePosition() { + val renderInfo = renderer.entity.renderInfo + val yaw = renderInfo.rotation.yaw + val position = renderInfo.position + + var changes = 0 + if (this.position != position) { + changes++ + this.position = position + } + if (this.yaw != yaw) { + changes++ + this.yaw = yaw + } + if (changes == 0) return + + val rotation = Vec3(0.0f, (EntityRotation.HALF_CIRCLE_DEGREE - yaw).rad, 0.0f) + instance.update(renderInfo.position, rotation) + } + override fun update(millis: Long, delta: Float) { instance.transform.reset() + updatePosition() instance.animation.draw(delta) } override fun draw() { + manager.context.system.reset(faceCulling = false) + shader.use() manager.upload(instance) instance.model.mesh.draw() } + + override fun reset() { + this.position = Vec3d.EMPTY + this.yaw = 0.0f + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerRenderer.kt index 6e573cbdb..5a5d35ee6 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerRenderer.kt @@ -20,6 +20,7 @@ import de.bixilon.minosoft.data.registries.identified.Identified import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer import de.bixilon.minosoft.gui.rendering.entities.factory.RegisteredEntityModelFactory +import de.bixilon.minosoft.gui.rendering.entities.feature.SkeletalFeature import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.models.loader.ModelLoader import de.bixilon.minosoft.gui.rendering.models.loader.SkeletalLoader.Companion.sModel @@ -46,7 +47,7 @@ open class PlayerRenderer(renderer: EntitiesRenderer, entity: val instance = model?.createInstance(renderer.context) ?: return this.registered = true - // this.features += SkeletalFeature(this, instance) + this.features += SkeletalFeature(this, instance) } private fun updateProperties(): Boolean {