dynamic texture fixes, skin fixes, player model fixes

This commit is contained in:
Moritz Zwerger 2023-10-28 13:56:47 +02:00
parent 4e1e3b3859
commit 424ef281cb
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
9 changed files with 38 additions and 30 deletions

View File

@ -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 import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureArray
class DummyTextureManager(val context: RenderContext) : TextureManager() { class DummyTextureManager(val context: RenderContext) : TextureManager() {
override val dynamicTextures: DynamicTextureArray = DummyDynamicTextureArray() override val dynamicTextures: DynamicTextureArray = DummyDynamicTextureArray(context)
override val staticTextures: StaticTextureArray = DummyStaticTextureArray(context.system) override val staticTextures: StaticTextureArray = DummyStaticTextureArray(context.system)
} }

View File

@ -26,6 +26,10 @@ abstract class BipedModel(renderer: EntityRenderer<*>, model: BakedSkeletalModel
override fun updatePosition() { override fun updatePosition() {
super.updatePosition() super.updatePosition()
updateHeadPosition()
}
private fun updateHeadPosition() {
val info = renderer.info val info = renderer.info
val pitch = info.rotation.pitch val pitch = info.rotation.pitch

View File

@ -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.data.entities.entities.player.local.LocalPlayerEntity
import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer 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.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() { 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() shader.use()
manager.upload(instance) manager.upload(instance)
mesh.draw() instance.model.mesh.draw()
} }
} }

View File

@ -16,10 +16,17 @@ package de.bixilon.minosoft.gui.rendering.entities.renderer.player
import de.bixilon.kutil.observer.DataObserver.Companion.observe import de.bixilon.kutil.observer.DataObserver.Companion.observe
import de.bixilon.minosoft.data.entities.entities.player.local.LocalPlayerEntity 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.EntitiesRenderer
import de.bixilon.minosoft.gui.rendering.entities.model.biped.PlayerModel
open class LocalPlayerRenderer(renderer: EntitiesRenderer, entity: LocalPlayerEntity) : PlayerRenderer<LocalPlayerEntity>(renderer, entity) { open class LocalPlayerRenderer(renderer: EntitiesRenderer, entity: LocalPlayerEntity) : PlayerRenderer<LocalPlayerEntity>(renderer, entity) {
init { 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
} }
} }

View File

@ -29,9 +29,8 @@ import de.bixilon.minosoft.gui.rendering.system.base.texture.skin.PlayerSkin
import java.util.* import java.util.*
open class PlayerRenderer<E : PlayerEntity>(renderer: EntitiesRenderer, entity: E) : EntityRenderer<E>(renderer, entity) { open class PlayerRenderer<E : PlayerEntity>(renderer: EntitiesRenderer, entity: E) : EntityRenderer<E>(renderer, entity) {
protected val model = PlayerModel(this, getModel()) protected var model = createModel()?.register()
private var properties: PlayerProperties? = null private var properties: PlayerProperties? = null
private var registered = false
override fun update(millis: Long) { override fun update(millis: Long) {
@ -40,14 +39,18 @@ open class PlayerRenderer<E : PlayerEntity>(renderer: EntitiesRenderer, entity:
} }
private fun updateSkeletalModel() { private fun updateSkeletalModel() {
if (registered) return if (this.model != null) return
val update = updateProperties() val update = updateProperties()
val model = getModel() val model = createModel() ?: return
this.registered = true
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 { private fun updateProperties(): Boolean {
@ -69,13 +72,13 @@ open class PlayerRenderer<E : PlayerEntity>(renderer: EntitiesRenderer, entity:
} }
private fun getModel(): BakedSkeletalModel { private fun getModel(): BakedSkeletalModel? {
val skin = getSkin() ?: throw IllegalArgumentException("") val skin = getSkin() ?: return null
val name = when (skin.model) { val name = when (skin.model) {
SkinModel.WIDE -> WIDE SkinModel.WIDE -> WIDE
SkinModel.SLIM -> SLIM SkinModel.SLIM -> SLIM
} }
return renderer.context.models.skeletal[name]!! return renderer.context.models.skeletal[WIDE] // TODO: implement both models and use accordingly
} }

View File

@ -79,7 +79,7 @@ class TabListEntryElement(
init { init {
background = ColorElement(guiRenderer, size, RGBColor(120, 120, 120, 130)) 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() forceSilentApply()
} }

View File

@ -32,7 +32,7 @@ class SkinManager(private val textureManager: TextureManager) {
fun initialize(account: Account, assets: AssetsManager) { fun initialize(account: Account, assets: AssetsManager) {
default = DefaultSkinProvider(this.textureManager.dynamicTextures, assets) default = DefaultSkinProvider(this.textureManager.dynamicTextures, assets)
default.initialize() 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? { 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 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] 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) { if (player is LocalPlayerEntity) {
return skin return skin
} }
val uuid = player.uuid ?: return default[player] 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] 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)
} }
} }

View File

@ -39,7 +39,6 @@ class DefaultSkinProvider(
} }
} }
private fun load(skin: DefaultSkin) { private fun load(skin: DefaultSkin) {
var loaded = 0 var loaded = 0
load(skin.name.skin("slim").texture())?.let { slim[skin.name] = it; loaded++ } load(skin.name.skin("slim").texture())?.let { slim[skin.name] = it; loaded++ }
@ -65,7 +64,7 @@ class DefaultSkinProvider(
private fun load(path: ResourceLocation): DynamicTexture? { private fun load(path: ResourceLocation): DynamicTexture? {
val data = assets.getOrNull(path)?.readTexture() ?: return null 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 { private fun ResourceLocation.skin(prefix: String): ResourceLocation {

View File

@ -42,6 +42,7 @@ class OpenGLDynamicTextureArray(
glBindTexture(GL_TEXTURE_2D_ARRAY, handle) glBindTexture(GL_TEXTURE_2D_ARRAY, handle)
unsafeUpload(index, texture) unsafeUpload(index, texture)
context.textures.staticTextures.activate() // TODO: why?
texture.state = DynamicTextureState.LOADED texture.state = DynamicTextureState.LOADED
} }
@ -70,7 +71,7 @@ class OpenGLDynamicTextureArray(
unsafeUse(shader) unsafeUse(shader)
} }
context.textures.staticTextures.activate() context.textures.staticTextures.activate() // TODO: why?
this.handle = textureId this.handle = textureId
} }