mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-15 10:25:06 -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.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 {
|
||||||
|
@ -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() }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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() }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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.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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user