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.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<BlockMesh>(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 {

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.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<LineMesh>(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)
}
}

View File

@ -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<BlockMesh>(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)
}
}

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.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<BillboardTextMesh>(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 {