mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 10:55:01 -04:00
skeletal feature: update position and rotation
This commit is contained in:
parent
1a2244c2d7
commit
e208c479f6
@ -47,6 +47,7 @@ class RenderLoop(
|
||||
it == RenderingStates.PAUSED
|
||||
}
|
||||
}
|
||||
context.profile.performance::slowRendering.observe(this) { this.slowRendering = it }
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user