diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/EntitiesRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/EntitiesRenderer.kt index 132b05226..2a290acc4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/EntitiesRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/EntitiesRenderer.kt @@ -55,6 +55,7 @@ class EntitiesRenderer( } override fun prepareDrawAsync() { + this.features.update() val millis = millis() this.visibility.reset() renderers.iterate { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/register/EntityRenderFeatures.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/register/EntityRenderFeatures.kt index 245e8b0a6..d15d24f3d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/register/EntityRenderFeatures.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/register/EntityRenderFeatures.kt @@ -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 } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/register/FeatureRegister.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/register/FeatureRegister.kt index 9524c8bf9..f786064f3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/register/FeatureRegister.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/register/FeatureRegister.kt @@ -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 +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/BillboardTextFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/BillboardTextFeature.kt index ada7fc7c8..796c21c55 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/BillboardTextFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/BillboardTextFeature.kt @@ -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 } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/EntityNameFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityNameFeature.kt similarity index 95% rename from src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/EntityNameFeature.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityNameFeature.kt index 00684d5f0..9564fbbee 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/EntityNameFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityNameFeature.kt @@ -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) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/EntityScoreboardFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityScoreFeature.kt similarity index 82% rename from src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/EntityScoreboardFeature.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityScoreFeature.kt index e4f3b9a4d..74a348428 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/EntityScoreboardFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityScoreFeature.kt @@ -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().additional.name] ?: return null + val objective = manager.belowName ?: return null + val score = objective.scores[renderer.entity.unsafeCast().additional.name] ?: return null // TODO: cache val text = BaseComponent() text += TextComponent(score.value) text += " " diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/score/ScoreRegister.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/score/ScoreRegister.kt new file mode 100644 index 000000000..f42c11439 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/score/ScoreRegister.kt @@ -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 . + * + * 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] + } + +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/EntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/EntityRenderer.kt index 0ab6560e7..33100aded 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/EntityRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/EntityRenderer.kt @@ -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 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/living/player/PlayerRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/living/player/PlayerRenderer.kt index 9960b00e0..fcbc95e8e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/living/player/PlayerRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/living/player/PlayerRenderer.kt @@ -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(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 }