meshed enttity feature

This commit is contained in:
Moritz Zwerger 2023-11-15 15:53:06 +01:00
parent a4d173cd8a
commit 2da0531fca
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
5 changed files with 73 additions and 87 deletions

View File

@ -16,26 +16,19 @@ package de.bixilon.minosoft.gui.rendering.entities.feature.block
import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.mat4x4.Mat4
import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.minosoft.data.registries.blocks.state.BlockState 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.renderer.EntityRenderer
import de.bixilon.minosoft.gui.rendering.entities.visibility.EntityLayer 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.reset
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateXAssign 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.mat.mat4.Mat4Util.translateZAssign
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
open class BlockFeature( open class BlockFeature(
renderer: EntityRenderer<*>, renderer: EntityRenderer<*>,
state: BlockState?, state: BlockState?,
var scale: Vec3 = DEFAULT_SCALE, var scale: Vec3 = DEFAULT_SCALE,
) : EntityRenderFeature(renderer) { ) : MeshedFeature<BlockMesh>(renderer) {
private var mesh: BlockMesh? = null
private var matrix = Mat4() private var matrix = Mat4()
override var enabled: Boolean
get() = super.enabled && mesh != null
set(value) {
super.enabled = value
}
var state: BlockState? = state var state: BlockState? = state
set(value) { set(value) {
if (field == value) return if (field == value) return
@ -77,25 +70,12 @@ open class BlockFeature(
this.matrix = renderer.matrix * matrix this.matrix = renderer.matrix * matrix
} }
override fun draw() { override fun draw(mesh: BlockMesh) {
val mesh = this.mesh ?: return
if (mesh.state != Mesh.MeshStates.LOADED) mesh.load()
renderer.renderer.context.system.reset(faceCulling = false) renderer.renderer.context.system.reset(faceCulling = false)
val shader = renderer.renderer.features.block.shader val shader = renderer.renderer.features.block.shader
draw(mesh, shader)
}
protected open fun draw(mesh: BlockMesh, shader: BlockShader) {
shader.use()
shader.matrix = matrix shader.matrix = matrix
shader.tint = renderer.light.value shader.tint = renderer.light.value
mesh.draw() super.draw(mesh)
}
override fun unload() {
val mesh = this.mesh ?: return
this.mesh = null
renderer.renderer.queue += { mesh.unload() }
} }
companion object { companion object {

View File

@ -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.registries.shapes.aabb.AABB
import de.bixilon.minosoft.data.text.formatting.color.ChatColors import de.bixilon.minosoft.data.text.formatting.color.ChatColors
import de.bixilon.minosoft.data.text.formatting.color.ColorUtil 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.entities.renderer.EntityRenderer
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions 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.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
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
class HitboxFeature(renderer: EntityRenderer<*>) : EntityRenderFeature(renderer) { class HitboxFeature(renderer: EntityRenderer<*>) : MeshedFeature<LineMesh>(renderer) {
private val manager = renderer.renderer.features.hitbox private val manager = renderer.renderer.features.hitbox
private var mesh: LineMesh? = null
private var aabb = AABB.EMPTY private var aabb = AABB.EMPTY
private var eyePosition = Vec3.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 color = Interpolator(renderer.entity.hitboxColor ?: ChatColors.WHITE, ColorUtil::interpolateRGB)
private var velocity = Interpolator(Vec3.EMPTY, Vec3Util::interpolateLinear) private var velocity = Interpolator(Vec3.EMPTY, Vec3Util::interpolateLinear)
override fun reset() {
unload()
}
override fun update(millis: Long, delta: Float) { override fun update(millis: Long, delta: Float) {
if (!manager.enabled) return unload() if (!manager.enabled) return unload()
if (!enabled) return unload() if (!enabled) return unload()
@ -57,7 +50,8 @@ class HitboxFeature(renderer: EntityRenderer<*>) : EntityRenderFeature(renderer)
if (this.mesh != null && !update) return 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 return !this.color.identical || !this.velocity.identical
} }
private fun updateMesh() { private fun createMesh() {
unload()
val mesh = LineMesh(renderer.renderer.context) val mesh = LineMesh(renderer.renderer.context)
val color = color.value 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 // 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 val system = renderer.renderer.context.system
if (manager.profile.showThroughWalls) { if (manager.profile.showThroughWalls) {
system.reset(depth = DepthFunctions.ALWAYS) system.reset(depth = DepthFunctions.ALWAYS)
@ -131,12 +122,6 @@ class HitboxFeature(renderer: EntityRenderer<*>) : EntityRenderFeature(renderer)
system.reset() system.reset()
} }
manager.shader.use() manager.shader.use()
mesh.draw() super.draw(mesh)
}
override fun unload() {
val mesh = this.mesh ?: return
this.mesh = null
renderer.renderer.queue += { mesh.unload() }
} }
} }

View File

@ -15,9 +15,8 @@ package de.bixilon.minosoft.gui.rendering.entities.feature.item
import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.mat4x4.Mat4
import de.bixilon.minosoft.data.container.stack.ItemStack 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.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.renderer.EntityRenderer
import de.bixilon.minosoft.gui.rendering.entities.visibility.EntityLayer import de.bixilon.minosoft.gui.rendering.entities.visibility.EntityLayer
import de.bixilon.minosoft.gui.rendering.models.item.ItemRenderUtil.getModel 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.reset
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateXAssign 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.mat.mat4.Mat4Util.translateZAssign
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
open class ItemFeature( open class ItemFeature(
renderer: EntityRenderer<*>, renderer: EntityRenderer<*>,
stack: ItemStack?, stack: ItemStack?,
val display: DisplayPositions, val display: DisplayPositions,
) : EntityRenderFeature(renderer) { ) : MeshedFeature<BlockMesh>(renderer) {
private var mesh: BlockMesh? = null
private var matrix = Mat4() private var matrix = Mat4()
override var enabled: Boolean
get() = super.enabled && mesh != null
set(value) {
super.enabled = value
}
var stack: ItemStack? = stack var stack: ItemStack? = stack
set(value) { set(value) {
if (field == value) return if (field == value) return
@ -80,24 +72,11 @@ open class ItemFeature(
this.matrix = renderer.matrix * matrix this.matrix = renderer.matrix * matrix
} }
override fun draw() { override fun draw(mesh: BlockMesh) {
val mesh = this.mesh ?: return
if (mesh.state != Mesh.MeshStates.LOADED) mesh.load()
renderer.renderer.context.system.reset(faceCulling = false) renderer.renderer.context.system.reset(faceCulling = false)
val shader = renderer.renderer.features.block.shader val shader = renderer.renderer.features.block.shader
draw(mesh, shader)
}
protected open fun draw(mesh: BlockMesh, shader: BlockShader) {
shader.use()
shader.matrix = matrix shader.matrix = matrix
shader.tint = renderer.light.value shader.tint = renderer.light.value
mesh.draw() super.draw(mesh)
}
override fun unload() {
val mesh = this.mesh ?: return
this.mesh = null
renderer.renderer.queue += { mesh.unload() }
} }
} }

View File

@ -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 <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.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<M : Mesh>(
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() }
}
}

View File

@ -18,7 +18,7 @@ import de.bixilon.kotlinglm.mat4x4.Mat4
import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.kotlinglm.vec2.Vec2
import de.bixilon.minosoft.data.entities.EntityRotation import de.bixilon.minosoft.data.entities.EntityRotation
import de.bixilon.minosoft.data.text.ChatComponent 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.renderer.EntityRenderer
import de.bixilon.minosoft.gui.rendering.entities.visibility.EntityLayer import de.bixilon.minosoft.gui.rendering.entities.visibility.EntityLayer
import de.bixilon.minosoft.gui.rendering.font.renderer.component.ChatComponentRenderer 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.reset
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateXAssign 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.mat.mat4.Mat4Util.translateYAssign
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
open class BillboardTextFeature( open class BillboardTextFeature(
renderer: EntityRenderer<*>, renderer: EntityRenderer<*>,
text: ChatComponent?, text: ChatComponent?,
offset: Float = DEFAULT_OFFSET, offset: Float = DEFAULT_OFFSET,
) : EntityRenderFeature(renderer) { ) : MeshedFeature<BillboardTextMesh>(renderer) {
override val priority: Int get() = 10000 override val priority: Int get() = 10000
private var mesh: BillboardTextMesh? = null
private var info: TextRenderInfo? = null private var info: TextRenderInfo? = null
private var matrix = Mat4() private var matrix = Mat4()
override var enabled: Boolean
get() = super.enabled && mesh != null
set(value) {
super.enabled = value
}
var text: ChatComponent? = text var text: ChatComponent? = text
set(value) { set(value) {
if (field == value) return if (field == value) return
@ -97,9 +90,7 @@ open class BillboardTextFeature(
this.matrix = renderer.matrix * matrix this.matrix = renderer.matrix * matrix
} }
override fun draw() { override fun draw(mesh: BillboardTextMesh) {
val mesh = this.mesh ?: return
if (mesh.state != Mesh.MeshStates.LOADED) mesh.load()
renderer.renderer.context.system.reset( renderer.renderer.context.system.reset(
blending = true, blending = true,
sourceRGB = BlendingFunctions.SOURCE_ALPHA, sourceRGB = BlendingFunctions.SOURCE_ALPHA,
@ -113,7 +104,7 @@ open class BillboardTextFeature(
shader.use() shader.use()
shader.matrix = matrix shader.matrix = matrix
shader.tint = renderer.light.value shader.tint = renderer.light.value
mesh.draw() super.draw(mesh)
} }
override fun updateVisibility(occluded: Boolean) { override fun updateVisibility(occluded: Boolean) {
@ -121,10 +112,8 @@ open class BillboardTextFeature(
} }
override fun unload() { override fun unload() {
val mesh = this.mesh ?: return
this.mesh = null
this.info = null this.info = null
renderer.renderer.queue += { mesh.unload() } super.unload()
} }
companion object { companion object {