mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-12 17:07:55 -04:00
cache score features
This commit is contained in:
parent
92b37112cf
commit
05a75b9bad
@ -55,6 +55,7 @@ class EntitiesRenderer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun prepareDrawAsync() {
|
override fun prepareDrawAsync() {
|
||||||
|
this.features.update()
|
||||||
val millis = millis()
|
val millis = millis()
|
||||||
this.visibility.reset()
|
this.visibility.reset()
|
||||||
renderers.iterate {
|
renderers.iterate {
|
||||||
|
@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.entities.feature.register
|
|||||||
import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer
|
import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.feature.hitbox.HitboxManager
|
import de.bixilon.minosoft.gui.rendering.entities.feature.hitbox.HitboxManager
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.feature.text.BillboardTextRegister
|
import de.bixilon.minosoft.gui.rendering.entities.feature.text.BillboardTextRegister
|
||||||
|
import de.bixilon.minosoft.gui.rendering.entities.feature.text.score.ScoreRegister
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.renderer.living.player.PlayerRegister
|
import de.bixilon.minosoft.gui.rendering.entities.renderer.living.player.PlayerRegister
|
||||||
import de.bixilon.minosoft.util.Initializable
|
import de.bixilon.minosoft.util.Initializable
|
||||||
|
|
||||||
@ -25,6 +26,7 @@ class EntityRenderFeatures(renderer: EntitiesRenderer) : Initializable {
|
|||||||
val hitbox = HitboxManager(renderer).register()
|
val hitbox = HitboxManager(renderer).register()
|
||||||
val player = PlayerRegister(renderer).register()
|
val player = PlayerRegister(renderer).register()
|
||||||
val text = BillboardTextRegister(renderer).register()
|
val text = BillboardTextRegister(renderer).register()
|
||||||
|
val score = ScoreRegister(renderer).register()
|
||||||
|
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
@ -39,6 +41,12 @@ class EntityRenderFeatures(renderer: EntitiesRenderer) : Initializable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun update() {
|
||||||
|
for (feature in features) {
|
||||||
|
feature.update()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
operator fun plusAssign(register: FeatureRegister) {
|
operator fun plusAssign(register: FeatureRegister) {
|
||||||
this.features += register
|
this.features += register
|
||||||
}
|
}
|
||||||
|
@ -15,4 +15,7 @@ package de.bixilon.minosoft.gui.rendering.entities.feature.register
|
|||||||
|
|
||||||
import de.bixilon.minosoft.util.Initializable
|
import de.bixilon.minosoft.util.Initializable
|
||||||
|
|
||||||
interface FeatureRegister : Initializable
|
interface FeatureRegister : Initializable {
|
||||||
|
|
||||||
|
fun update() = Unit
|
||||||
|
}
|
||||||
|
@ -32,6 +32,7 @@ import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
|
|||||||
open class BillboardTextFeature(
|
open class BillboardTextFeature(
|
||||||
renderer: EntityRenderer<*>,
|
renderer: EntityRenderer<*>,
|
||||||
text: ChatComponent?,
|
text: ChatComponent?,
|
||||||
|
offset: Float = DEFAULT_OFFSET,
|
||||||
) : EntityRenderFeature(renderer) {
|
) : EntityRenderFeature(renderer) {
|
||||||
override val priority: Int get() = 10000
|
override val priority: Int get() = 10000
|
||||||
private var mesh: BillboardTextMesh? = null
|
private var mesh: BillboardTextMesh? = null
|
||||||
@ -48,6 +49,12 @@ open class BillboardTextFeature(
|
|||||||
field = value
|
field = value
|
||||||
unload()
|
unload()
|
||||||
}
|
}
|
||||||
|
var offset: Float = offset
|
||||||
|
set(value) {
|
||||||
|
if (field == value) return
|
||||||
|
field = value
|
||||||
|
unload() // TODO: just update matrix
|
||||||
|
}
|
||||||
|
|
||||||
override fun update(millis: Long, delta: Float) {
|
override fun update(millis: Long, delta: Float) {
|
||||||
if (!super.enabled) return unload()
|
if (!super.enabled) return unload()
|
||||||
@ -76,7 +83,7 @@ open class BillboardTextFeature(
|
|||||||
val width = this.info?.size?.x ?: return
|
val width = this.info?.size?.x ?: return
|
||||||
val mat = renderer.renderer.context.camera.view.view.rotation
|
val mat = renderer.renderer.context.camera.view.view.rotation
|
||||||
val matrix = Mat4()
|
val matrix = Mat4()
|
||||||
.translateYAssign(renderer.entity.dimensions.y + EYE_OFFSET)
|
.translateYAssign(renderer.entity.dimensions.y + offset)
|
||||||
.rotateYassign((EntityRotation.HALF_CIRCLE_DEGREE - mat.yaw).rad)
|
.rotateYassign((EntityRotation.HALF_CIRCLE_DEGREE - mat.yaw).rad)
|
||||||
.rotateXassign((180.0f - mat.pitch).rad)
|
.rotateXassign((180.0f - mat.pitch).rad)
|
||||||
.translateXAssign(width / -2.0f * BillboardTextMesh.SCALE).translateYAssign(-PROPERTIES.lineHeight * BillboardTextMesh.SCALE)
|
.translateXAssign(width / -2.0f * BillboardTextMesh.SCALE).translateYAssign(-PROPERTIES.lineHeight * BillboardTextMesh.SCALE)
|
||||||
@ -120,7 +127,7 @@ open class BillboardTextFeature(
|
|||||||
companion object {
|
companion object {
|
||||||
val PROPERTIES = TextRenderProperties(allowNewLine = false)
|
val PROPERTIES = TextRenderProperties(allowNewLine = false)
|
||||||
val MAX_SIZE = Vec2(150.0f, PROPERTIES.lineHeight)
|
val MAX_SIZE = Vec2(150.0f, PROPERTIES.lineHeight)
|
||||||
const val EYE_OFFSET = 0.4f
|
const val DEFAULT_OFFSET = 0.4f
|
||||||
const val RENDER_DISTANCE = 48
|
const val RENDER_DISTANCE = 48
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.bixilon.minosoft.gui.rendering.entities.feature.text
|
package de.bixilon.minosoft.gui.rendering.entities.feature.text.name
|
||||||
|
|
||||||
import de.bixilon.kutil.cast.CastUtil.nullCast
|
import de.bixilon.kutil.cast.CastUtil.nullCast
|
||||||
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||||
@ -22,6 +22,7 @@ import de.bixilon.minosoft.data.entities.entities.LivingEntity
|
|||||||
import de.bixilon.minosoft.data.entities.entities.Mob
|
import de.bixilon.minosoft.data.entities.entities.Mob
|
||||||
import de.bixilon.minosoft.data.entities.entities.player.local.LocalPlayerEntity
|
import de.bixilon.minosoft.data.entities.entities.player.local.LocalPlayerEntity
|
||||||
import de.bixilon.minosoft.data.text.ChatComponent
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
|
import de.bixilon.minosoft.gui.rendering.entities.feature.text.BillboardTextFeature
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer
|
import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer
|
||||||
|
|
||||||
class EntityNameFeature(renderer: EntityRenderer<*>) : BillboardTextFeature(renderer, null) {
|
class EntityNameFeature(renderer: EntityRenderer<*>) : BillboardTextFeature(renderer, null) {
|
@ -11,17 +11,19 @@
|
|||||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.bixilon.minosoft.gui.rendering.entities.feature.text
|
package de.bixilon.minosoft.gui.rendering.entities.feature.text.name
|
||||||
|
|
||||||
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||||
import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity
|
import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity
|
||||||
import de.bixilon.minosoft.data.scoreboard.ScoreboardPositions
|
|
||||||
import de.bixilon.minosoft.data.text.BaseComponent
|
import de.bixilon.minosoft.data.text.BaseComponent
|
||||||
import de.bixilon.minosoft.data.text.ChatComponent
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
import de.bixilon.minosoft.data.text.TextComponent
|
import de.bixilon.minosoft.data.text.TextComponent
|
||||||
|
import de.bixilon.minosoft.gui.rendering.entities.feature.text.BillboardTextFeature
|
||||||
|
import de.bixilon.minosoft.gui.rendering.entities.feature.text.BillboardTextMesh
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.renderer.living.player.PlayerRenderer
|
import de.bixilon.minosoft.gui.rendering.entities.renderer.living.player.PlayerRenderer
|
||||||
|
|
||||||
class EntityScoreboardFeature(renderer: PlayerRenderer<*>) : BillboardTextFeature(renderer, null) {
|
class EntityScoreFeature(renderer: PlayerRenderer<*>) : BillboardTextFeature(renderer, null) {
|
||||||
|
private val manager = renderer.renderer.features.score
|
||||||
|
|
||||||
override fun update(millis: Long, delta: Float) {
|
override fun update(millis: Long, delta: Float) {
|
||||||
updateScore()
|
updateScore()
|
||||||
@ -49,8 +51,8 @@ class EntityScoreboardFeature(renderer: PlayerRenderer<*>) : BillboardTextFeatur
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getScore(): ChatComponent? {
|
private fun getScore(): ChatComponent? {
|
||||||
val objective = renderer.renderer.connection.scoreboard.positions[ScoreboardPositions.BELOW_NAME] ?: return null
|
val objective = manager.belowName ?: return null
|
||||||
val score = objective.scores[renderer.entity.unsafeCast<PlayerEntity>().additional.name] ?: return null
|
val score = objective.scores[renderer.entity.unsafeCast<PlayerEntity>().additional.name] ?: return null // TODO: cache
|
||||||
val text = BaseComponent()
|
val text = BaseComponent()
|
||||||
text += TextComponent(score.value)
|
text += TextComponent(score.value)
|
||||||
text += " "
|
text += " "
|
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.entities.feature.text.score
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.scoreboard.ScoreboardObjective
|
||||||
|
import de.bixilon.minosoft.data.scoreboard.ScoreboardPositions
|
||||||
|
import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer
|
||||||
|
import de.bixilon.minosoft.gui.rendering.entities.feature.register.FeatureRegister
|
||||||
|
|
||||||
|
class ScoreRegister(val renderer: EntitiesRenderer) : FeatureRegister {
|
||||||
|
var belowName: ScoreboardObjective? = renderer.connection.scoreboard.positions[ScoreboardPositions.BELOW_NAME]
|
||||||
|
private set
|
||||||
|
|
||||||
|
|
||||||
|
override fun update() {
|
||||||
|
belowName = renderer.connection.scoreboard.positions[ScoreboardPositions.BELOW_NAME]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -25,7 +25,7 @@ import de.bixilon.minosoft.gui.rendering.entities.easteregg.EntityEasterEggs.isF
|
|||||||
import de.bixilon.minosoft.gui.rendering.entities.feature.EntityRenderFeature
|
import de.bixilon.minosoft.gui.rendering.entities.feature.EntityRenderFeature
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.feature.FeatureManager
|
import de.bixilon.minosoft.gui.rendering.entities.feature.FeatureManager
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.feature.hitbox.HitboxFeature
|
import de.bixilon.minosoft.gui.rendering.entities.feature.hitbox.HitboxFeature
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.feature.text.EntityNameFeature
|
import de.bixilon.minosoft.gui.rendering.entities.feature.text.name.EntityNameFeature
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.reset
|
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.reset
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.rotateRadAssign
|
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.rotateRadAssign
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign
|
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign
|
||||||
|
@ -22,7 +22,7 @@ import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft
|
|||||||
import de.bixilon.minosoft.gui.rendering.RenderContext
|
import de.bixilon.minosoft.gui.rendering.RenderContext
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer
|
import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.factory.RegisteredEntityModelFactory
|
import de.bixilon.minosoft.gui.rendering.entities.factory.RegisteredEntityModelFactory
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.feature.text.EntityScoreboardFeature
|
import de.bixilon.minosoft.gui.rendering.entities.feature.text.name.EntityScoreFeature
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.model.human.PlayerModel
|
import de.bixilon.minosoft.gui.rendering.entities.model.human.PlayerModel
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.renderer.living.LivingEntityRenderer
|
import de.bixilon.minosoft.gui.rendering.entities.renderer.living.LivingEntityRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.models.loader.ModelLoader
|
import de.bixilon.minosoft.gui.rendering.models.loader.ModelLoader
|
||||||
@ -39,7 +39,7 @@ open class PlayerRenderer<E : PlayerEntity>(renderer: EntitiesRenderer, entity:
|
|||||||
var skin: DynamicTexture? = null
|
var skin: DynamicTexture? = null
|
||||||
private var refresh = true
|
private var refresh = true
|
||||||
|
|
||||||
val scoreboard = EntityScoreboardFeature(this).register()
|
val score = EntityScoreFeature(this).register()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
entity.additional::properties.observe(this) { refresh = true }
|
entity.additional::properties.observe(this) { refresh = true }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user