mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-17 03:15:35 -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
|
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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user