mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-15 10:25:06 -04:00
dynamic texture fixes, skin fixes, player model fixes
This commit is contained in:
parent
4e1e3b3859
commit
424ef281cb
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
|
@ -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()
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user