From 2da0531fca1db5b878d08c6358a4ba29e030b6d8 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Wed, 15 Nov 2023 15:53:06 +0100 Subject: [PATCH] meshed enttity feature --- .../entities/feature/block/BlockFeature.kt | 28 ++-------- .../entities/feature/hitbox/HitboxFeature.kt | 29 +++------- .../entities/feature/item/ItemFeature.kt | 29 ++-------- .../feature/properties/MeshedFeature.kt | 53 +++++++++++++++++++ .../feature/text/BillboardTextFeature.kt | 21 ++------ 5 files changed, 73 insertions(+), 87 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/properties/MeshedFeature.kt diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/block/BlockFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/block/BlockFeature.kt index 4ce514a39..1c1709f83 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/block/BlockFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/block/BlockFeature.kt @@ -16,26 +16,19 @@ package de.bixilon.minosoft.gui.rendering.entities.feature.block import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.minosoft.data.registries.blocks.state.BlockState -import de.bixilon.minosoft.gui.rendering.entities.feature.EntityRenderFeature +import de.bixilon.minosoft.gui.rendering.entities.feature.properties.MeshedFeature import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.entities.visibility.EntityLayer import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.reset import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateXAssign import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateZAssign -import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh open class BlockFeature( renderer: EntityRenderer<*>, state: BlockState?, var scale: Vec3 = DEFAULT_SCALE, -) : EntityRenderFeature(renderer) { - private var mesh: BlockMesh? = null +) : MeshedFeature(renderer) { private var matrix = Mat4() - override var enabled: Boolean - get() = super.enabled && mesh != null - set(value) { - super.enabled = value - } var state: BlockState? = state set(value) { if (field == value) return @@ -77,25 +70,12 @@ open class BlockFeature( this.matrix = renderer.matrix * matrix } - override fun draw() { - val mesh = this.mesh ?: return - if (mesh.state != Mesh.MeshStates.LOADED) mesh.load() + override fun draw(mesh: BlockMesh) { renderer.renderer.context.system.reset(faceCulling = false) val shader = renderer.renderer.features.block.shader - draw(mesh, shader) - } - - protected open fun draw(mesh: BlockMesh, shader: BlockShader) { - shader.use() shader.matrix = matrix shader.tint = renderer.light.value - mesh.draw() - } - - override fun unload() { - val mesh = this.mesh ?: return - this.mesh = null - renderer.renderer.queue += { mesh.unload() } + super.draw(mesh) } companion object { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/hitbox/HitboxFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/hitbox/HitboxFeature.kt index f0e0fdc22..a0467a30a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/hitbox/HitboxFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/hitbox/HitboxFeature.kt @@ -20,18 +20,16 @@ import de.bixilon.minosoft.data.entities.EntityRotation import de.bixilon.minosoft.data.registries.shapes.aabb.AABB import de.bixilon.minosoft.data.text.formatting.color.ChatColors import de.bixilon.minosoft.data.text.formatting.color.ColorUtil -import de.bixilon.minosoft.gui.rendering.entities.feature.EntityRenderFeature +import de.bixilon.minosoft.gui.rendering.entities.feature.properties.MeshedFeature import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions import de.bixilon.minosoft.gui.rendering.util.mesh.LineMesh -import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition -class HitboxFeature(renderer: EntityRenderer<*>) : EntityRenderFeature(renderer) { +class HitboxFeature(renderer: EntityRenderer<*>) : MeshedFeature(renderer) { private val manager = renderer.renderer.features.hitbox - private var mesh: LineMesh? = null private var aabb = AABB.EMPTY private var eyePosition = Vec3.EMPTY @@ -40,11 +38,6 @@ class HitboxFeature(renderer: EntityRenderer<*>) : EntityRenderFeature(renderer) private var color = Interpolator(renderer.entity.hitboxColor ?: ChatColors.WHITE, ColorUtil::interpolateRGB) private var velocity = Interpolator(Vec3.EMPTY, Vec3Util::interpolateLinear) - - override fun reset() { - unload() - } - override fun update(millis: Long, delta: Float) { if (!manager.enabled) return unload() if (!enabled) return unload() @@ -57,7 +50,8 @@ class HitboxFeature(renderer: EntityRenderer<*>) : EntityRenderFeature(renderer) if (this.mesh != null && !update) return - updateMesh() + unload() + createMesh() } @@ -97,8 +91,7 @@ class HitboxFeature(renderer: EntityRenderer<*>) : EntityRenderFeature(renderer) return !this.color.identical || !this.velocity.identical } - private fun updateMesh() { - unload() + private fun createMesh() { val mesh = LineMesh(renderer.renderer.context) val color = color.value @@ -120,10 +113,8 @@ class HitboxFeature(renderer: EntityRenderer<*>) : EntityRenderFeature(renderer) } - override fun draw() { + override fun draw(mesh: LineMesh) { // TODO: update position with shader uniform - val mesh = this.mesh ?: return - if (mesh.state != Mesh.MeshStates.LOADED) mesh.load() val system = renderer.renderer.context.system if (manager.profile.showThroughWalls) { system.reset(depth = DepthFunctions.ALWAYS) @@ -131,12 +122,6 @@ class HitboxFeature(renderer: EntityRenderer<*>) : EntityRenderFeature(renderer) system.reset() } manager.shader.use() - mesh.draw() - } - - override fun unload() { - val mesh = this.mesh ?: return - this.mesh = null - renderer.renderer.queue += { mesh.unload() } + super.draw(mesh) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/item/ItemFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/item/ItemFeature.kt index be8047ed2..8ff5a6f2b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/item/ItemFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/item/ItemFeature.kt @@ -15,9 +15,8 @@ package de.bixilon.minosoft.gui.rendering.entities.feature.item import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.minosoft.data.container.stack.ItemStack -import de.bixilon.minosoft.gui.rendering.entities.feature.EntityRenderFeature import de.bixilon.minosoft.gui.rendering.entities.feature.block.BlockMesh -import de.bixilon.minosoft.gui.rendering.entities.feature.block.BlockShader +import de.bixilon.minosoft.gui.rendering.entities.feature.properties.MeshedFeature import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.entities.visibility.EntityLayer import de.bixilon.minosoft.gui.rendering.models.item.ItemRenderUtil.getModel @@ -25,20 +24,13 @@ import de.bixilon.minosoft.gui.rendering.models.raw.display.DisplayPositions import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.reset import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateXAssign import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateZAssign -import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh open class ItemFeature( renderer: EntityRenderer<*>, stack: ItemStack?, val display: DisplayPositions, -) : EntityRenderFeature(renderer) { - private var mesh: BlockMesh? = null +) : MeshedFeature(renderer) { private var matrix = Mat4() - override var enabled: Boolean - get() = super.enabled && mesh != null - set(value) { - super.enabled = value - } var stack: ItemStack? = stack set(value) { if (field == value) return @@ -80,24 +72,11 @@ open class ItemFeature( this.matrix = renderer.matrix * matrix } - override fun draw() { - val mesh = this.mesh ?: return - if (mesh.state != Mesh.MeshStates.LOADED) mesh.load() + override fun draw(mesh: BlockMesh) { renderer.renderer.context.system.reset(faceCulling = false) val shader = renderer.renderer.features.block.shader - draw(mesh, shader) - } - - protected open fun draw(mesh: BlockMesh, shader: BlockShader) { - shader.use() shader.matrix = matrix shader.tint = renderer.light.value - mesh.draw() - } - - override fun unload() { - val mesh = this.mesh ?: return - this.mesh = null - renderer.renderer.queue += { mesh.unload() } + super.draw(mesh) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/properties/MeshedFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/properties/MeshedFeature.kt new file mode 100644 index 000000000..ab00a5794 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/properties/MeshedFeature.kt @@ -0,0 +1,53 @@ +/* + * 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.properties + +import de.bixilon.minosoft.gui.rendering.entities.feature.EntityRenderFeature +import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer +import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh + +abstract class MeshedFeature( + renderer: EntityRenderer<*>, +) : EntityRenderFeature(renderer) { + protected open var mesh: M? = null + override var enabled: Boolean + get() = super.enabled && mesh != null + set(value) { + super.enabled = value + } + + override fun update(millis: Long, delta: Float) { + if (!super.enabled) return unload() + } + + override fun reset() { + unload() + } + + override fun draw() { + val mesh = this.mesh ?: return + if (mesh.state != Mesh.MeshStates.LOADED) mesh.load() + draw(mesh) + } + + protected open fun draw(mesh: M) { + mesh.draw() + } + + override fun unload() { + val mesh = this.mesh ?: return + this.mesh = null + renderer.renderer.queue += { mesh.unload() } + } +} 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 9adb206ac..fe028fe71 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 @@ -18,7 +18,7 @@ import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.minosoft.data.entities.EntityRotation import de.bixilon.minosoft.data.text.ChatComponent -import de.bixilon.minosoft.gui.rendering.entities.feature.EntityRenderFeature +import de.bixilon.minosoft.gui.rendering.entities.feature.properties.MeshedFeature import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.entities.visibility.EntityLayer import de.bixilon.minosoft.gui.rendering.font.renderer.component.ChatComponentRenderer @@ -30,22 +30,15 @@ import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.reset import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateXAssign import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign -import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh open class BillboardTextFeature( renderer: EntityRenderer<*>, text: ChatComponent?, offset: Float = DEFAULT_OFFSET, -) : EntityRenderFeature(renderer) { +) : MeshedFeature(renderer) { override val priority: Int get() = 10000 - private var mesh: BillboardTextMesh? = null private var info: TextRenderInfo? = null private var matrix = Mat4() - override var enabled: Boolean - get() = super.enabled && mesh != null - set(value) { - super.enabled = value - } var text: ChatComponent? = text set(value) { if (field == value) return @@ -97,9 +90,7 @@ open class BillboardTextFeature( this.matrix = renderer.matrix * matrix } - override fun draw() { - val mesh = this.mesh ?: return - if (mesh.state != Mesh.MeshStates.LOADED) mesh.load() + override fun draw(mesh: BillboardTextMesh) { renderer.renderer.context.system.reset( blending = true, sourceRGB = BlendingFunctions.SOURCE_ALPHA, @@ -113,7 +104,7 @@ open class BillboardTextFeature( shader.use() shader.matrix = matrix shader.tint = renderer.light.value - mesh.draw() + super.draw(mesh) } override fun updateVisibility(occluded: Boolean) { @@ -121,10 +112,8 @@ open class BillboardTextFeature( } override fun unload() { - val mesh = this.mesh ?: return - this.mesh = null this.info = null - renderer.renderer.queue += { mesh.unload() } + super.unload() } companion object {