skeletal feature: update position and rotation

This commit is contained in:
Moritz Zwerger 2023-10-26 22:52:23 +02:00
parent 1a2244c2d7
commit e208c479f6
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
3 changed files with 43 additions and 2 deletions

View File

@ -47,6 +47,7 @@ class RenderLoop(
it == RenderingStates.PAUSED
}
}
context.profile.performance::slowRendering.observe(this) { this.slowRendering = it }
}

View File

@ -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
}
}

View File

@ -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<E : PlayerEntity>(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 {