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
class DummyTextureManager(val context: RenderContext) : TextureManager() {
override val dynamicTextures: DynamicTextureArray = DummyDynamicTextureArray()
override val dynamicTextures: DynamicTextureArray = DummyDynamicTextureArray(context)
override val staticTextures: StaticTextureArray = DummyStaticTextureArray(context.system)
}

View File

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

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.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()
}
}

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.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<LocalPlayerEntity>(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
}
}

View File

@ -29,9 +29,8 @@ import de.bixilon.minosoft.gui.rendering.system.base.texture.skin.PlayerSkin
import java.util.*
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 registered = false
override fun update(millis: Long) {
@ -40,14 +39,18 @@ open class PlayerRenderer<E : PlayerEntity>(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<E : PlayerEntity>(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
}

View File

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

View File

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

View File

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

View File

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