From 65e62441a8bc034394890cf7e01f2dc787aa32e7 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Mon, 13 Nov 2023 15:18:19 +0100 Subject: [PATCH] entity renderer: invisible feature Normal entity render features are now hidden when the entity is invisible --- .../text/name/EntityScoreFeatureTest.kt | 1 + .../entities/feature/FeatureManager.kt | 2 ++ .../feature/properties/InvisibleFeature.kt | 31 +++++++++++++++++++ .../feature/text/name/EntityNameFeature.kt | 4 ++- .../{name => score}/EntityScoreFeature.kt | 6 ++-- .../entities/renderer/EntityRenderer.kt | 2 ++ .../renderer/living/player/PlayerRenderer.kt | 2 +- .../entities/visibility/VisibilityManager.kt | 3 +- 8 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/properties/InvisibleFeature.kt rename src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/{name => score}/EntityScoreFeature.kt (94%) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityScoreFeatureTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityScoreFeatureTest.kt index d72ab18b7..0e2004429 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityScoreFeatureTest.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityScoreFeatureTest.kt @@ -26,6 +26,7 @@ import de.bixilon.minosoft.gui.rendering.entities.EntityRendererTestUtil.create import de.bixilon.minosoft.gui.rendering.entities.feature.text.BillbaordTextTestUtil.assertEmpty import de.bixilon.minosoft.gui.rendering.entities.feature.text.BillbaordTextTestUtil.assertText import de.bixilon.minosoft.gui.rendering.entities.feature.text.BillboardTextFeature +import de.bixilon.minosoft.gui.rendering.entities.feature.text.score.EntityScoreFeature import de.bixilon.minosoft.gui.rendering.entities.renderer.living.player.PlayerRenderer import org.testng.Assert.assertEquals import org.testng.annotations.Test diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/FeatureManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/FeatureManager.kt index 322d4993e..4fedd61d9 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/FeatureManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/FeatureManager.kt @@ -13,6 +13,7 @@ package de.bixilon.minosoft.gui.rendering.entities.feature +import de.bixilon.minosoft.gui.rendering.entities.feature.properties.InvisibleFeature.Companion.isInvisible import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer class FeatureManager(val renderer: EntityRenderer<*>) : Iterable { @@ -31,6 +32,7 @@ class FeatureManager(val renderer: EntityRenderer<*>) : Iterable. + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.rendering.entities.feature.properties + +import de.bixilon.minosoft.gui.rendering.entities.feature.EntityRenderFeature + +interface InvisibleFeature { + val renderInvisible: Boolean + + + companion object { + + fun EntityRenderFeature.isInvisible(): Boolean { + if (!renderer.isInvisible) return false + if (renderer !is InvisibleFeature) return true + if (!renderer.renderInvisible) return true + return false + } + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityNameFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityNameFeature.kt index 7a08c51a6..73e2bfac8 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityNameFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityNameFeature.kt @@ -27,11 +27,13 @@ import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity import de.bixilon.minosoft.data.entities.entities.player.local.LocalPlayerEntity import de.bixilon.minosoft.data.scoreboard.NameTagVisibilities import de.bixilon.minosoft.data.text.ChatComponent +import de.bixilon.minosoft.gui.rendering.entities.feature.properties.InvisibleFeature 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) { +class EntityNameFeature(renderer: EntityRenderer<*>) : BillboardTextFeature(renderer, null), InvisibleFeature { private var delta = 0.0f + override val renderInvisible get() = true init { renderer.entity.data.observe(Entity.CUSTOM_NAME_DATA) { delta = 0.0f } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityScoreFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/score/EntityScoreFeature.kt similarity index 94% rename from src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityScoreFeature.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/score/EntityScoreFeature.kt index 6dcb5f9f1..8c1f5060a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/name/EntityScoreFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/score/EntityScoreFeature.kt @@ -11,20 +11,22 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.entities.feature.text.name +package de.bixilon.minosoft.gui.rendering.entities.feature.text.score import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity 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.properties.InvisibleFeature 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 EntityScoreFeature(renderer: PlayerRenderer<*>) : BillboardTextFeature(renderer, null) { +class EntityScoreFeature(renderer: PlayerRenderer<*>) : BillboardTextFeature(renderer, null), InvisibleFeature { private var delta = 0.0f private val manager = renderer.renderer.features.score + override val renderInvisible get() = true override fun update(millis: Long, delta: Float) { 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 afea29fc2..9f7504786 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 @@ -38,6 +38,7 @@ abstract class EntityRenderer( val features = FeatureManager(this) val info = entity.renderInfo var distance: Double = 0.0 + var isInvisible: Boolean = false val hitbox = HitboxFeature(this).register() val name = EntityNameFeature(this).register() @@ -71,6 +72,7 @@ abstract class EntityRenderer( } open fun update(millis: Long, delta: Float) { + this.isInvisible = entity.isInvisible(renderer.connection.camera.entity) updateLight(delta) updateRenderInfo(millis) updateMatrix(delta) 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 d14a46142..d29605ca5 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.name.EntityScoreFeature +import de.bixilon.minosoft.gui.rendering.entities.feature.text.score.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 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/visibility/VisibilityManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/visibility/VisibilityManager.kt index c1d77d528..54f3d13c8 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/visibility/VisibilityManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/visibility/VisibilityManager.kt @@ -18,6 +18,7 @@ import de.bixilon.kutil.observer.DataObserver.Companion.observe import de.bixilon.minosoft.data.world.view.ViewDistanceChangeEvent import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer import de.bixilon.minosoft.gui.rendering.entities.feature.EntityRenderFeature +import de.bixilon.minosoft.gui.rendering.entities.feature.properties.InvisibleFeature.Companion.isInvisible import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.events.VisibilityGraphChangeEvent import de.bixilon.minosoft.modding.event.listener.CallbackEventListener.Companion.listen @@ -81,7 +82,7 @@ class VisibilityManager(val renderer: EntitiesRenderer) { lock.lock() size++ for (feature in renderer.features) { - if (!feature.enabled || !feature.visible) continue + if (!feature.enabled || !feature.visible || feature.isInvisible()) continue feature.collect(this) } lock.unlock()