mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-10 16:01:50 -04:00
improve render phases, fix block outline rendering
This commit is contained in:
parent
84feeefd9e
commit
980492bc1b
@ -40,6 +40,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.IntegratedBufferTypes
|
|||||||
import de.bixilon.minosoft.gui.rendering.system.base.PolygonModes
|
import de.bixilon.minosoft.gui.rendering.system.base.PolygonModes
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
|
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.phases.RenderPhases
|
import de.bixilon.minosoft.gui.rendering.system.base.phases.RenderPhases
|
||||||
|
import de.bixilon.minosoft.gui.rendering.system.base.phases.SkipAll
|
||||||
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
|
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
|
||||||
import de.bixilon.minosoft.gui.rendering.system.window.BaseWindow
|
import de.bixilon.minosoft.gui.rendering.system.window.BaseWindow
|
||||||
import de.bixilon.minosoft.gui.rendering.system.window.GLFWWindow
|
import de.bixilon.minosoft.gui.rendering.system.window.GLFWWindow
|
||||||
@ -314,10 +315,16 @@ class RenderWindow(
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (renderer in rendererList) {
|
for (renderer in rendererList) {
|
||||||
|
if (renderer is SkipAll && renderer.skipAll) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
for (phase in RenderPhases.VALUES) {
|
for (phase in RenderPhases.VALUES) {
|
||||||
if (!phase.type.java.isAssignableFrom(renderer::class.java)) {
|
if (!phase.type.java.isAssignableFrom(renderer::class.java)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if (phase.invokeSkip(renderer)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
phase.invokeSetup(renderer)
|
phase.invokeSetup(renderer)
|
||||||
phase.invokeDraw(renderer)
|
phase.invokeDraw(renderer)
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ import de.bixilon.minosoft.gui.rendering.RendererBuilder
|
|||||||
import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions
|
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
|
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
|
||||||
|
import de.bixilon.minosoft.gui.rendering.system.base.phases.OtherDrawable
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.getWorldOffset
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.getWorldOffset
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mesh.LineMesh
|
import de.bixilon.minosoft.gui.rendering.util.mesh.LineMesh
|
||||||
@ -34,23 +35,27 @@ import glm_.vec3.Vec3i
|
|||||||
class BlockOutlineRenderer(
|
class BlockOutlineRenderer(
|
||||||
val connection: PlayConnection,
|
val connection: PlayConnection,
|
||||||
override val renderWindow: RenderWindow,
|
override val renderWindow: RenderWindow,
|
||||||
) : Renderer {
|
) : Renderer, OtherDrawable {
|
||||||
override val renderSystem: RenderSystem = renderWindow.renderSystem
|
override val renderSystem: RenderSystem = renderWindow.renderSystem
|
||||||
private var currentOutlinePosition: Vec3i? = null
|
private var currentOutlinePosition: Vec3i? = null
|
||||||
private var currentOutlineBlockState: BlockState? = null
|
private var currentOutlineBlockState: BlockState? = null
|
||||||
|
|
||||||
private var currentMesh: LineMesh? = null
|
private var currentMesh: LineMesh? = null
|
||||||
|
override val skipOther: Boolean
|
||||||
|
get() = currentMesh == null
|
||||||
|
|
||||||
|
|
||||||
private fun drawMesh() {
|
override fun drawOther() {
|
||||||
val currentMesh = currentMesh ?: return
|
val currentMesh = currentMesh ?: return
|
||||||
|
currentMesh.draw()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setupOther() {
|
||||||
renderWindow.renderSystem.reset(faceCulling = false)
|
renderWindow.renderSystem.reset(faceCulling = false)
|
||||||
if (Minosoft.config.config.game.other.blockOutline.disableZBuffer) {
|
if (Minosoft.config.config.game.other.blockOutline.disableZBuffer) {
|
||||||
renderWindow.renderSystem.depth = DepthFunctions.ALWAYS
|
renderWindow.renderSystem.depth = DepthFunctions.ALWAYS
|
||||||
}
|
}
|
||||||
renderWindow.shaderManager.genericColorShader.use()
|
renderWindow.shaderManager.genericColorShader.use()
|
||||||
currentMesh.draw()
|
|
||||||
draw()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun unload() {
|
private fun unload() {
|
||||||
@ -61,8 +66,7 @@ class BlockOutlineRenderer(
|
|||||||
this.currentOutlineBlockState = null
|
this.currentOutlineBlockState = null
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated("TODO")
|
override fun prepareDraw() {
|
||||||
private fun draw() {
|
|
||||||
val raycastHit = renderWindow.inputHandler.camera.target.nullCast<BlockRaycastHit>()
|
val raycastHit = renderWindow.inputHandler.camera.target.nullCast<BlockRaycastHit>()
|
||||||
|
|
||||||
var currentMesh = currentMesh
|
var currentMesh = currentMesh
|
||||||
@ -85,7 +89,6 @@ class BlockOutlineRenderer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (raycastHit.blockPosition == currentOutlinePosition && raycastHit.blockState == currentOutlineBlockState) {
|
if (raycastHit.blockPosition == currentOutlinePosition && raycastHit.blockState == currentOutlineBlockState) {
|
||||||
drawMesh()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,7 +110,6 @@ class BlockOutlineRenderer(
|
|||||||
this.currentOutlinePosition = raycastHit.blockPosition
|
this.currentOutlinePosition = raycastHit.blockPosition
|
||||||
this.currentOutlineBlockState = raycastHit.blockState
|
this.currentOutlineBlockState = raycastHit.blockState
|
||||||
this.currentMesh = currentMesh
|
this.currentMesh = currentMesh
|
||||||
drawMesh()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -72,6 +72,9 @@ class HUDRenderer(
|
|||||||
|
|
||||||
val atlasManager = HUDAtlasManager(this)
|
val atlasManager = HUDAtlasManager(this)
|
||||||
|
|
||||||
|
override val skipOther: Boolean
|
||||||
|
get() = !enabled
|
||||||
|
|
||||||
fun registerElement(hudBuilder: HUDBuilder<*>) {
|
fun registerElement(hudBuilder: HUDBuilder<*>) {
|
||||||
val hudElement = hudBuilder.build(this)
|
val hudElement = hudBuilder.build(this)
|
||||||
hudElements[hudBuilder.RESOURCE_LOCATION] = hudElement
|
hudElements[hudBuilder.RESOURCE_LOCATION] = hudElement
|
||||||
@ -141,12 +144,13 @@ class HUDRenderer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setupOther() = Unit
|
private fun setup() {
|
||||||
|
renderWindow.renderSystem.reset()
|
||||||
|
renderWindow.renderSystem.clear(IntegratedBufferTypes.DEPTH_BUFFER)
|
||||||
|
shader.use()
|
||||||
|
}
|
||||||
|
|
||||||
override fun drawOther() {
|
override fun drawOther() {
|
||||||
if (!enabled) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (this::mesh.isInitialized) {
|
if (this::mesh.isInitialized) {
|
||||||
mesh.unload()
|
mesh.unload()
|
||||||
}
|
}
|
||||||
@ -171,9 +175,7 @@ class HUDRenderer(
|
|||||||
lastTickTime = time
|
lastTickTime = time
|
||||||
}
|
}
|
||||||
|
|
||||||
renderWindow.renderSystem.reset()
|
|
||||||
renderWindow.renderSystem.clear(IntegratedBufferTypes.DEPTH_BUFFER)
|
renderWindow.renderSystem.clear(IntegratedBufferTypes.DEPTH_BUFFER)
|
||||||
|
|
||||||
var z = 0
|
var z = 0
|
||||||
for (element in hudElements) {
|
for (element in hudElements) {
|
||||||
if (!element.enabled) {
|
if (!element.enabled) {
|
||||||
@ -187,12 +189,8 @@ class HUDRenderer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setup()
|
||||||
renderWindow.renderSystem.reset()
|
|
||||||
renderWindow.renderSystem.clear(IntegratedBufferTypes.DEPTH_BUFFER)
|
|
||||||
|
|
||||||
mesh.load()
|
mesh.load()
|
||||||
shader.use()
|
|
||||||
mesh.draw()
|
mesh.draw()
|
||||||
|
|
||||||
if (matrixChange) {
|
if (matrixChange) {
|
||||||
|
@ -50,6 +50,7 @@ interface RenderSystem {
|
|||||||
this.depth = depth
|
this.depth = depth
|
||||||
this.depthMask = depthMask
|
this.depthMask = depthMask
|
||||||
this.clearColor = clearColor
|
this.clearColor = clearColor
|
||||||
|
shader = null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun enable(capability: RenderingCapabilities)
|
fun enable(capability: RenderingCapabilities)
|
||||||
|
@ -3,6 +3,8 @@ package de.bixilon.minosoft.gui.rendering.system.base.phases
|
|||||||
import de.bixilon.minosoft.gui.rendering.Renderer
|
import de.bixilon.minosoft.gui.rendering.Renderer
|
||||||
|
|
||||||
interface CustomDrawable : Renderer {
|
interface CustomDrawable : Renderer {
|
||||||
|
val skipCustom: Boolean
|
||||||
|
get() = false
|
||||||
|
|
||||||
fun drawCustom()
|
fun drawCustom()
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,8 @@ package de.bixilon.minosoft.gui.rendering.system.base.phases
|
|||||||
import de.bixilon.minosoft.gui.rendering.Renderer
|
import de.bixilon.minosoft.gui.rendering.Renderer
|
||||||
|
|
||||||
interface OpaqueDrawable : Renderer {
|
interface OpaqueDrawable : Renderer {
|
||||||
|
val skipOpaque: Boolean
|
||||||
|
get() = false
|
||||||
|
|
||||||
fun setupOpaque() {
|
fun setupOpaque() {
|
||||||
renderSystem.reset(blending = false)
|
renderSystem.reset(blending = false)
|
||||||
|
@ -3,6 +3,8 @@ package de.bixilon.minosoft.gui.rendering.system.base.phases
|
|||||||
import de.bixilon.minosoft.gui.rendering.Renderer
|
import de.bixilon.minosoft.gui.rendering.Renderer
|
||||||
|
|
||||||
interface OtherDrawable : Renderer {
|
interface OtherDrawable : Renderer {
|
||||||
|
val skipOther: Boolean
|
||||||
|
get() = false
|
||||||
|
|
||||||
fun setupOther() {
|
fun setupOther() {
|
||||||
renderSystem.reset()
|
renderSystem.reset()
|
||||||
|
@ -19,10 +19,15 @@ import kotlin.reflect.KClass
|
|||||||
|
|
||||||
class RenderPhases<T : Renderer>(
|
class RenderPhases<T : Renderer>(
|
||||||
val type: KClass<T>,
|
val type: KClass<T>,
|
||||||
|
val skip: (T) -> Boolean,
|
||||||
val setup: (T) -> Unit,
|
val setup: (T) -> Unit,
|
||||||
val draw: (T) -> Unit,
|
val draw: (T) -> Unit,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
fun invokeSkip(renderer: Renderer): Boolean {
|
||||||
|
return skip.invoke(renderer.unsafeCast())
|
||||||
|
}
|
||||||
|
|
||||||
fun invokeSetup(renderer: Renderer) {
|
fun invokeSetup(renderer: Renderer) {
|
||||||
setup.invoke(renderer.unsafeCast())
|
setup.invoke(renderer.unsafeCast())
|
||||||
}
|
}
|
||||||
@ -32,11 +37,11 @@ class RenderPhases<T : Renderer>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val OTHER = RenderPhases(OtherDrawable::class, { it.setupOther() }, { it.drawOther() })
|
val OTHER = RenderPhases(OtherDrawable::class, { it.skipOther }, { it.setupOther() }, { it.drawOther() })
|
||||||
val CUSTOM = RenderPhases(CustomDrawable::class, { }, { it.drawCustom() })
|
val CUSTOM = RenderPhases(CustomDrawable::class, { it.skipCustom }, { }, { it.drawCustom() })
|
||||||
val OPAQUE = RenderPhases(OpaqueDrawable::class, { it.setupOpaque() }, { it.drawOpaque() })
|
val OPAQUE = RenderPhases(OpaqueDrawable::class, { it.skipOpaque }, { it.setupOpaque() }, { it.drawOpaque() })
|
||||||
val TRANSPARENT = RenderPhases(TransparentDrawable::class, { it.setupTransparent() }, { it.drawTransparent() })
|
val TRANSPARENT = RenderPhases(TransparentDrawable::class, { it.skipTransparent }, { it.setupTransparent() }, { it.drawTransparent() })
|
||||||
val TRANSLUCENT = RenderPhases(TranslucentDrawable::class, { it.setupTranslucent() }, { it.drawTranslucent() })
|
val TRANSLUCENT = RenderPhases(TranslucentDrawable::class, { it.skipTranslucent }, { it.setupTranslucent() }, { it.drawTranslucent() })
|
||||||
|
|
||||||
|
|
||||||
val VALUES = arrayOf(OTHER, CUSTOM, OPAQUE, TRANSPARENT, TRANSLUCENT)
|
val VALUES = arrayOf(OTHER, CUSTOM, OPAQUE, TRANSPARENT, TRANSLUCENT)
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
package de.bixilon.minosoft.gui.rendering.system.base.phases
|
||||||
|
|
||||||
|
interface SkipAll {
|
||||||
|
val skipAll: Boolean
|
||||||
|
}
|
@ -4,6 +4,8 @@ import de.bixilon.minosoft.gui.rendering.Renderer
|
|||||||
import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions
|
import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions
|
||||||
|
|
||||||
interface TranslucentDrawable : Renderer {
|
interface TranslucentDrawable : Renderer {
|
||||||
|
val skipTranslucent: Boolean
|
||||||
|
get() = false
|
||||||
|
|
||||||
fun setupTranslucent() {
|
fun setupTranslucent() {
|
||||||
renderSystem.reset(depthMask = false) // ToDo: This is just a translucent workaround
|
renderSystem.reset(depthMask = false) // ToDo: This is just a translucent workaround
|
||||||
|
@ -3,6 +3,8 @@ package de.bixilon.minosoft.gui.rendering.system.base.phases
|
|||||||
import de.bixilon.minosoft.gui.rendering.Renderer
|
import de.bixilon.minosoft.gui.rendering.Renderer
|
||||||
|
|
||||||
interface TransparentDrawable : Renderer {
|
interface TransparentDrawable : Renderer {
|
||||||
|
val skipTransparent: Boolean
|
||||||
|
get() = false
|
||||||
|
|
||||||
fun setupTransparent() {
|
fun setupTransparent() {
|
||||||
renderSystem.reset(blending = false)
|
renderSystem.reset(blending = false)
|
||||||
|
@ -57,7 +57,11 @@ class OpenGLRenderSystem(
|
|||||||
if (value === field) {
|
if (value === field) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
value ?: error("Shader is null!")
|
if (value == null) {
|
||||||
|
glUseProgram(0)
|
||||||
|
field = value
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
check(value is OpenGLShader) { "Can not use non OpenGL shader in OpenGL render system!" }
|
check(value is OpenGLShader) { "Can not use non OpenGL shader in OpenGL render system!" }
|
||||||
check(value.loaded) { "Shader not loaded!" }
|
check(value.loaded) { "Shader not loaded!" }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user