From 424ef281cb066bc38185175c82e418fe3d51e718 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Sat, 28 Oct 2023 13:56:47 +0200 Subject: [PATCH] dynamic texture fixes, skin fixes, player model fixes --- .../dummy/texture/DummyTextureManager.kt | 2 +- .../entities/model/biped/BipedModel.kt | 4 ++++ .../entities/model/biped/PlayerModel.kt | 10 ++------- .../renderer/player/LocalPlayerRenderer.kt | 9 +++++++- .../renderer/player/PlayerRenderer.kt | 21 +++++++++++-------- .../hud/elements/tab/TabListEntryElement.kt | 2 +- .../system/base/texture/skin/SkinManager.kt | 14 ++++++------- .../skin/vanilla/DefaultSkinProvider.kt | 3 +-- .../dynamic/OpenGLDynamicTextureArray.kt | 3 ++- 9 files changed, 38 insertions(+), 30 deletions(-) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/dummy/texture/DummyTextureManager.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/dummy/texture/DummyTextureManager.kt index 17c106872..a2ddef28c 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/dummy/texture/DummyTextureManager.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/dummy/texture/DummyTextureManager.kt @@ -19,6 +19,6 @@ import de.bixilon.minosoft.gui.rendering.system.base.texture.array.StaticTexture import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureArray class DummyTextureManager(val context: RenderContext) : TextureManager() { - override val dynamicTextures: DynamicTextureArray = DummyDynamicTextureArray() + override val dynamicTextures: DynamicTextureArray = DummyDynamicTextureArray(context) override val staticTextures: StaticTextureArray = DummyStaticTextureArray(context.system) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/biped/BipedModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/biped/BipedModel.kt index 7758ec6de..188c54403 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/biped/BipedModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/biped/BipedModel.kt @@ -26,6 +26,10 @@ abstract class BipedModel(renderer: EntityRenderer<*>, model: BakedSkeletalModel override fun updatePosition() { super.updatePosition() + updateHeadPosition() + } + + private fun updateHeadPosition() { val info = renderer.info val pitch = info.rotation.pitch 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 cebee6424..b0d699d15 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 @@ -16,19 +16,13 @@ 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) { - private var mesh = model.mesh - - fun updateMesh(mesh: SkeletalMesh) { - this.mesh = mesh - } override fun draw() { - manager.context.system.reset(faceCulling = renderer.entity is LocalPlayerEntity) + manager.context.system.reset(faceCulling = renderer.entity is LocalPlayerEntity) // TODO: and !renderSelf shader.use() manager.upload(instance) - mesh.draw() + instance.model.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 a0c9da2bb..1e6b31d1e 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 @@ -16,10 +16,17 @@ package de.bixilon.minosoft.gui.rendering.entities.renderer.player import de.bixilon.kutil.observer.DataObserver.Companion.observe import de.bixilon.minosoft.data.entities.entities.player.local.LocalPlayerEntity import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer +import de.bixilon.minosoft.gui.rendering.entities.model.biped.PlayerModel open class LocalPlayerRenderer(renderer: EntitiesRenderer, entity: LocalPlayerEntity) : PlayerRenderer(renderer, entity) { init { - renderer.context.camera.view::view.observe(this, instant = true) { hitbox.enabled = it.renderSelf; model.enabled = it.renderSelf } + renderer.context.camera.view::view.observe(this, instant = true) { hitbox.enabled = it.renderSelf; model?.enabled = it.renderSelf } + } + + override fun createModel(): PlayerModel? { + val model = super.createModel() + model?.enabled = renderer.context.camera.view.view.renderSelf + return model } } 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 a9b6b9993..2a7f197d6 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,9 +29,8 @@ 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()) + protected var model = createModel()?.register() private var properties: PlayerProperties? = null - private var registered = false override fun update(millis: Long) { @@ -40,14 +39,18 @@ open class PlayerRenderer(renderer: EntitiesRenderer, entity: } private fun updateSkeletalModel() { - if (registered) return + if (this.model != null) return val update = updateProperties() - val model = getModel() - this.registered = true + val model = createModel() ?: return + this.features += model + } - this.features += this.model + protected open fun createModel(): PlayerModel? { + val model = getModel() ?: return null + + return PlayerModel(this, model) } private fun updateProperties(): Boolean { @@ -69,13 +72,13 @@ open class PlayerRenderer(renderer: EntitiesRenderer, entity: } - private fun getModel(): BakedSkeletalModel { - val skin = getSkin() ?: throw IllegalArgumentException("") + private fun getModel(): BakedSkeletalModel? { + val skin = getSkin() ?: return null val name = when (skin.model) { SkinModel.WIDE -> WIDE SkinModel.SLIM -> SLIM } - return renderer.context.models.skeletal[name]!! + return renderer.context.models.skeletal[WIDE] // TODO: implement both models and use accordingly } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListEntryElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListEntryElement.kt index 670ebfa01..65dfdf79b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListEntryElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListEntryElement.kt @@ -79,7 +79,7 @@ class TabListEntryElement( init { background = ColorElement(guiRenderer, size, RGBColor(120, 120, 120, 130)) - DefaultThreadPool += { skinElement.texture = context.textures.skins.getSkin(uuid, item.properties, fetch = guiRenderer.connection.network.encrypted)?.texture } + DefaultThreadPool += { skinElement.texture = context.textures.skins.getSkin(uuid, item.properties, fetch = guiRenderer.connection.network.encrypted, async = false)?.texture } forceSilentApply() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/skin/SkinManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/skin/SkinManager.kt index 9f5fc69f8..2df000849 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/skin/SkinManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/skin/SkinManager.kt @@ -32,7 +32,7 @@ class SkinManager(private val textureManager: TextureManager) { fun initialize(account: Account, assets: AssetsManager) { default = DefaultSkinProvider(this.textureManager.dynamicTextures, assets) default.initialize() - skin = getSkin(account.uuid, account.properties, fetch = true, force = true) + skin = getSkin(account.uuid, account.properties, fetch = true, async = false) } private fun getAccountProperties(uuid: UUID): PlayerProperties? { @@ -49,22 +49,22 @@ class SkinManager(private val textureManager: TextureManager) { return player.additional.properties ?: getAccountProperties(uuid) ?: if (fetch) catchAll { PlayerProperties.fetch(uuid) } else null } - private fun getSkin(uuid: UUID, properties: PlayerProperties?, force: Boolean = false): PlayerSkin? { + private fun getSkin(uuid: UUID, properties: PlayerProperties?, async: Boolean = true): PlayerSkin? { val texture = properties?.textures?.skin ?: return default[uuid] - return PlayerSkin(textureManager.dynamicTextures.pushRaw(uuid, force) { texture.read() }, texture.metadata.model) + return PlayerSkin(textureManager.dynamicTextures.pushRaw(uuid, async) { texture.read() }, texture.metadata.model) } - fun getSkin(player: PlayerEntity, properties: PlayerProperties? = null, fetch: Boolean = true, force: Boolean = false): PlayerSkin? { + fun getSkin(player: PlayerEntity, properties: PlayerProperties? = null, fetch: Boolean = true, async: Boolean = true): PlayerSkin? { if (player is LocalPlayerEntity) { return skin } val uuid = player.uuid ?: return default[player] - return getSkin(uuid, properties ?: getProperties(player, uuid, fetch), force) + return getSkin(uuid, properties ?: getProperties(player, uuid, fetch), async) } - fun getSkin(uuid: UUID?, properties: PlayerProperties? = null, fetch: Boolean = true, force: Boolean = false): PlayerSkin? { + fun getSkin(uuid: UUID?, properties: PlayerProperties? = null, fetch: Boolean = true, async: Boolean = true): PlayerSkin? { if (uuid == null) return default[null] - return getSkin(uuid, properties ?: if (fetch) catchAll { PlayerProperties.fetch(uuid) } else null, force) + return getSkin(uuid, properties ?: if (fetch) catchAll { PlayerProperties.fetch(uuid) } else null, async) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/skin/vanilla/DefaultSkinProvider.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/skin/vanilla/DefaultSkinProvider.kt index 825c73723..a2bc9d8dd 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/skin/vanilla/DefaultSkinProvider.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/skin/vanilla/DefaultSkinProvider.kt @@ -39,7 +39,6 @@ class DefaultSkinProvider( } } - private fun load(skin: DefaultSkin) { var loaded = 0 load(skin.name.skin("slim").texture())?.let { slim[skin.name] = it; loaded++ } @@ -65,7 +64,7 @@ class DefaultSkinProvider( private fun load(path: ResourceLocation): DynamicTexture? { val data = assets.getOrNull(path)?.readTexture() ?: return null - return array.push(path, true) { data } + return array.push(path, false) { data } } private fun ResourceLocation.skin(prefix: String): ResourceLocation { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/dynamic/OpenGLDynamicTextureArray.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/dynamic/OpenGLDynamicTextureArray.kt index 9aec8dbaf..413442aec 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/dynamic/OpenGLDynamicTextureArray.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/dynamic/OpenGLDynamicTextureArray.kt @@ -42,6 +42,7 @@ class OpenGLDynamicTextureArray( glBindTexture(GL_TEXTURE_2D_ARRAY, handle) unsafeUpload(index, texture) + context.textures.staticTextures.activate() // TODO: why? texture.state = DynamicTextureState.LOADED } @@ -70,7 +71,7 @@ class OpenGLDynamicTextureArray( unsafeUse(shader) } - context.textures.staticTextures.activate() + context.textures.staticTextures.activate() // TODO: why? this.handle = textureId }