cache score features

This commit is contained in:
Moritz Zwerger 2023-11-06 16:09:04 +01:00
parent 92b37112cf
commit 05a75b9bad
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
9 changed files with 64 additions and 12 deletions

View File

@ -55,6 +55,7 @@ class EntitiesRenderer(
}
override fun prepareDrawAsync() {
this.features.update()
val millis = millis()
this.visibility.reset()
renderers.iterate {

View File

@ -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.feature.hitbox.HitboxManager
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.util.Initializable
@ -25,6 +26,7 @@ class EntityRenderFeatures(renderer: EntitiesRenderer) : Initializable {
val hitbox = HitboxManager(renderer).register()
val player = PlayerRegister(renderer).register()
val text = BillboardTextRegister(renderer).register()
val score = ScoreRegister(renderer).register()
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) {
this.features += register
}

View File

@ -15,4 +15,7 @@ package de.bixilon.minosoft.gui.rendering.entities.feature.register
import de.bixilon.minosoft.util.Initializable
interface FeatureRegister : Initializable
interface FeatureRegister : Initializable {
fun update() = Unit
}

View File

@ -32,6 +32,7 @@ import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
open class BillboardTextFeature(
renderer: EntityRenderer<*>,
text: ChatComponent?,
offset: Float = DEFAULT_OFFSET,
) : EntityRenderFeature(renderer) {
override val priority: Int get() = 10000
private var mesh: BillboardTextMesh? = null
@ -48,6 +49,12 @@ open class BillboardTextFeature(
field = value
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) {
if (!super.enabled) return unload()
@ -76,7 +83,7 @@ open class BillboardTextFeature(
val width = this.info?.size?.x ?: return
val mat = renderer.renderer.context.camera.view.view.rotation
val matrix = Mat4()
.translateYAssign(renderer.entity.dimensions.y + EYE_OFFSET)
.translateYAssign(renderer.entity.dimensions.y + offset)
.rotateYassign((EntityRotation.HALF_CIRCLE_DEGREE - mat.yaw).rad)
.rotateXassign((180.0f - mat.pitch).rad)
.translateXAssign(width / -2.0f * BillboardTextMesh.SCALE).translateYAssign(-PROPERTIES.lineHeight * BillboardTextMesh.SCALE)
@ -120,7 +127,7 @@ open class BillboardTextFeature(
companion object {
val PROPERTIES = TextRenderProperties(allowNewLine = false)
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
}
}

View File

@ -11,7 +11,7 @@
* 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.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.player.local.LocalPlayerEntity
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
class EntityNameFeature(renderer: EntityRenderer<*>) : BillboardTextFeature(renderer, null) {

View File

@ -11,17 +11,19 @@
* 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.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.ChatComponent
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
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) {
updateScore()
@ -49,8 +51,8 @@ class EntityScoreboardFeature(renderer: PlayerRenderer<*>) : BillboardTextFeatur
}
private fun getScore(): ChatComponent? {
val objective = renderer.renderer.connection.scoreboard.positions[ScoreboardPositions.BELOW_NAME] ?: return null
val score = objective.scores[renderer.entity.unsafeCast<PlayerEntity>().additional.name] ?: return null
val objective = manager.belowName ?: return null
val score = objective.scores[renderer.entity.unsafeCast<PlayerEntity>().additional.name] ?: return null // TODO: cache
val text = BaseComponent()
text += TextComponent(score.value)
text += " "

View File

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

View File

@ -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.FeatureManager
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.rotateRadAssign
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign

View File

@ -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.entities.EntitiesRenderer
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.renderer.living.LivingEntityRenderer
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
private var refresh = true
val scoreboard = EntityScoreboardFeature(this).register()
val score = EntityScoreFeature(this).register()
init {
entity.additional::properties.observe(this) { refresh = true }