mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-12 08:58:02 -04:00
cache score features
This commit is contained in:
parent
92b37112cf
commit
05a75b9bad
@ -55,6 +55,7 @@ class EntitiesRenderer(
|
||||
}
|
||||
|
||||
override fun prepareDrawAsync() {
|
||||
this.features.update()
|
||||
val millis = millis()
|
||||
this.visibility.reset()
|
||||
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.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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
@ -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 += " "
|
@ -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.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
|
||||
|
@ -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 }
|
||||
|
Loading…
x
Reference in New Issue
Block a user