From 61f54dacb985be5a550c3b4684cc9f15bdce49bd Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Fri, 27 Oct 2023 09:42:48 +0200 Subject: [PATCH] dynamic player model --- .../entities/feature/SkeletalFeature.kt | 2 +- .../entities/model/biped/PlayerModel.kt | 17 ++++++++++++++++- .../renderer/player/LocalPlayerRenderer.kt | 2 +- .../renderer/player/PlayerRenderer.kt | 19 ++++++++----------- 4 files changed, 26 insertions(+), 14 deletions(-) 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 f6511e4b1..606a5bab1 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 @@ -27,7 +27,7 @@ open class SkeletalFeature( renderer: EntityRenderer<*>, val instance: SkeletalInstance, ) : EntityRenderFeature(renderer) { - private val manager = renderer.renderer.context.skeletal + protected val manager = renderer.renderer.context.skeletal protected open val shader: SkeletalShader = manager.shader protected var position = Vec3d.EMPTY diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/biped/PlayerModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/biped/PlayerModel.kt index 62df2be6d..cebee6424 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/biped/PlayerModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/biped/PlayerModel.kt @@ -13,7 +13,22 @@ package de.bixilon.minosoft.gui.rendering.entities.model.biped +import de.bixilon.minosoft.data.entities.entities.player.local.LocalPlayerEntity 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.mesh.SkeletalMesh -open class PlayerModel(renderer: EntityRenderer<*>, model: BakedSkeletalModel) : BipedModel(renderer, model) +open class PlayerModel(renderer: EntityRenderer<*>, model: BakedSkeletalModel) : BipedModel(renderer, model) { + private var mesh = model.mesh + + fun updateMesh(mesh: SkeletalMesh) { + this.mesh = mesh + } + + override fun draw() { + manager.context.system.reset(faceCulling = renderer.entity is LocalPlayerEntity) + shader.use() + manager.upload(instance) + mesh.draw() + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/LocalPlayerRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/LocalPlayerRenderer.kt index 01809cfeb..a0c9da2bb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/LocalPlayerRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/LocalPlayerRenderer.kt @@ -20,6 +20,6 @@ import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer open class LocalPlayerRenderer(renderer: EntitiesRenderer, entity: LocalPlayerEntity) : PlayerRenderer(renderer, entity) { init { - renderer.context.camera.view::view.observe(this, instant = true) { hitbox.enabled = it.renderSelf } + renderer.context.camera.view::view.observe(this, instant = true) { hitbox.enabled = it.renderSelf; model.enabled = it.renderSelf } } } 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 1db4f9492..a9b6b9993 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 @@ -29,6 +29,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.texture.skin.PlayerSkin import java.util.* open class PlayerRenderer(renderer: EntitiesRenderer, entity: E) : EntityRenderer(renderer, entity) { + protected val model = PlayerModel(this, getModel()) private var properties: PlayerProperties? = null private var registered = false @@ -42,11 +43,11 @@ open class PlayerRenderer(renderer: EntitiesRenderer, entity: if (registered) return val update = updateProperties() - val model = getModel() ?: return + val model = getModel() this.registered = true - this.features += PlayerModel(this, model) + this.features += this.model } private fun updateProperties(): Boolean { @@ -59,7 +60,8 @@ open class PlayerRenderer(renderer: EntitiesRenderer, entity: } open fun getSkin(): PlayerSkin? { - return renderer.context.textures.skins.default[UUID.randomUUID()] // TODO + val skins = renderer.context.textures.skins + return skins.default[UUID.randomUUID()] // val properties = this.properties?.textures?.skin // if(properties == null){ // return renderer.context.textures.skins.getSkin(entity, properties, ) @@ -67,18 +69,13 @@ open class PlayerRenderer(renderer: EntitiesRenderer, entity: } - open fun getModel(): BakedSkeletalModel? { - val skin = getSkin() ?: return null + private fun getModel(): BakedSkeletalModel { + val skin = getSkin() ?: throw IllegalArgumentException("") val name = when (skin.model) { SkinModel.WIDE -> WIDE SkinModel.SLIM -> SLIM } - return renderer.context.models.skeletal[name] - - - val properties = this.properties - val model = properties?.textures?.skin?.metadata?.model ?: SkinModel.WIDE // TODO: failover according - + return renderer.context.models.skeletal[name]!! }