mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-14 01:48:04 -04:00
meshed enttity feature
This commit is contained in:
parent
a4d173cd8a
commit
2da0531fca
@ -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 {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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() }
|
||||
}
|
||||
}
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user