improve render phases, fix block outline rendering

This commit is contained in:
Bixilon 2021-11-02 12:09:35 +01:00
parent 84feeefd9e
commit 980492bc1b
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
12 changed files with 57 additions and 25 deletions

View File

@ -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.RenderSystem
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.window.BaseWindow
import de.bixilon.minosoft.gui.rendering.system.window.GLFWWindow
@ -314,10 +315,16 @@ class RenderWindow(
}
for (renderer in rendererList) {
if (renderer is SkipAll && renderer.skipAll) {
continue
}
for (phase in RenderPhases.VALUES) {
if (!phase.type.java.isAssignableFrom(renderer::class.java)) {
continue
}
if (phase.invokeSkip(renderer)) {
continue
}
phase.invokeSetup(renderer)
phase.invokeDraw(renderer)
}

View File

@ -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.system.base.DepthFunctions
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.toVec3d
import de.bixilon.minosoft.gui.rendering.util.mesh.LineMesh
@ -34,23 +35,27 @@ import glm_.vec3.Vec3i
class BlockOutlineRenderer(
val connection: PlayConnection,
override val renderWindow: RenderWindow,
) : Renderer {
) : Renderer, OtherDrawable {
override val renderSystem: RenderSystem = renderWindow.renderSystem
private var currentOutlinePosition: Vec3i? = null
private var currentOutlineBlockState: BlockState? = null
private var currentMesh: LineMesh? = null
override val skipOther: Boolean
get() = currentMesh == null
private fun drawMesh() {
override fun drawOther() {
val currentMesh = currentMesh ?: return
currentMesh.draw()
}
override fun setupOther() {
renderWindow.renderSystem.reset(faceCulling = false)
if (Minosoft.config.config.game.other.blockOutline.disableZBuffer) {
renderWindow.renderSystem.depth = DepthFunctions.ALWAYS
}
renderWindow.shaderManager.genericColorShader.use()
currentMesh.draw()
draw()
}
private fun unload() {
@ -61,8 +66,7 @@ class BlockOutlineRenderer(
this.currentOutlineBlockState = null
}
@Deprecated("TODO")
private fun draw() {
override fun prepareDraw() {
val raycastHit = renderWindow.inputHandler.camera.target.nullCast<BlockRaycastHit>()
var currentMesh = currentMesh
@ -85,7 +89,6 @@ class BlockOutlineRenderer(
}
if (raycastHit.blockPosition == currentOutlinePosition && raycastHit.blockState == currentOutlineBlockState) {
drawMesh()
return
}
@ -107,7 +110,6 @@ class BlockOutlineRenderer(
this.currentOutlinePosition = raycastHit.blockPosition
this.currentOutlineBlockState = raycastHit.blockState
this.currentMesh = currentMesh
drawMesh()
}

View File

@ -72,6 +72,9 @@ class HUDRenderer(
val atlasManager = HUDAtlasManager(this)
override val skipOther: Boolean
get() = !enabled
fun registerElement(hudBuilder: HUDBuilder<*>) {
val hudElement = hudBuilder.build(this)
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() {
if (!enabled) {
return
}
if (this::mesh.isInitialized) {
mesh.unload()
}
@ -171,9 +175,7 @@ class HUDRenderer(
lastTickTime = time
}
renderWindow.renderSystem.reset()
renderWindow.renderSystem.clear(IntegratedBufferTypes.DEPTH_BUFFER)
var z = 0
for (element in hudElements) {
if (!element.enabled) {
@ -187,12 +189,8 @@ class HUDRenderer(
}
}
renderWindow.renderSystem.reset()
renderWindow.renderSystem.clear(IntegratedBufferTypes.DEPTH_BUFFER)
setup()
mesh.load()
shader.use()
mesh.draw()
if (matrixChange) {

View File

@ -50,6 +50,7 @@ interface RenderSystem {
this.depth = depth
this.depthMask = depthMask
this.clearColor = clearColor
shader = null
}
fun enable(capability: RenderingCapabilities)

View File

@ -3,6 +3,8 @@ package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.minosoft.gui.rendering.Renderer
interface CustomDrawable : Renderer {
val skipCustom: Boolean
get() = false
fun drawCustom()
}

View File

@ -3,6 +3,8 @@ package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.minosoft.gui.rendering.Renderer
interface OpaqueDrawable : Renderer {
val skipOpaque: Boolean
get() = false
fun setupOpaque() {
renderSystem.reset(blending = false)

View File

@ -3,6 +3,8 @@ package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.minosoft.gui.rendering.Renderer
interface OtherDrawable : Renderer {
val skipOther: Boolean
get() = false
fun setupOther() {
renderSystem.reset()

View File

@ -19,10 +19,15 @@ import kotlin.reflect.KClass
class RenderPhases<T : Renderer>(
val type: KClass<T>,
val skip: (T) -> Boolean,
val setup: (T) -> Unit,
val draw: (T) -> Unit,
) {
fun invokeSkip(renderer: Renderer): Boolean {
return skip.invoke(renderer.unsafeCast())
}
fun invokeSetup(renderer: Renderer) {
setup.invoke(renderer.unsafeCast())
}
@ -32,11 +37,11 @@ class RenderPhases<T : Renderer>(
}
companion object {
val OTHER = RenderPhases(OtherDrawable::class, { it.setupOther() }, { it.drawOther() })
val CUSTOM = RenderPhases(CustomDrawable::class, { }, { it.drawCustom() })
val OPAQUE = RenderPhases(OpaqueDrawable::class, { it.setupOpaque() }, { it.drawOpaque() })
val TRANSPARENT = RenderPhases(TransparentDrawable::class, { it.setupTransparent() }, { it.drawTransparent() })
val TRANSLUCENT = RenderPhases(TranslucentDrawable::class, { it.setupTranslucent() }, { it.drawTranslucent() })
val OTHER = RenderPhases(OtherDrawable::class, { it.skipOther }, { it.setupOther() }, { it.drawOther() })
val CUSTOM = RenderPhases(CustomDrawable::class, { it.skipCustom }, { }, { it.drawCustom() })
val OPAQUE = RenderPhases(OpaqueDrawable::class, { it.skipOpaque }, { it.setupOpaque() }, { it.drawOpaque() })
val TRANSPARENT = RenderPhases(TransparentDrawable::class, { it.skipTransparent }, { it.setupTransparent() }, { it.drawTransparent() })
val TRANSLUCENT = RenderPhases(TranslucentDrawable::class, { it.skipTranslucent }, { it.setupTranslucent() }, { it.drawTranslucent() })
val VALUES = arrayOf(OTHER, CUSTOM, OPAQUE, TRANSPARENT, TRANSLUCENT)

View File

@ -0,0 +1,5 @@
package de.bixilon.minosoft.gui.rendering.system.base.phases
interface SkipAll {
val skipAll: Boolean
}

View File

@ -4,6 +4,8 @@ import de.bixilon.minosoft.gui.rendering.Renderer
import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions
interface TranslucentDrawable : Renderer {
val skipTranslucent: Boolean
get() = false
fun setupTranslucent() {
renderSystem.reset(depthMask = false) // ToDo: This is just a translucent workaround

View File

@ -3,6 +3,8 @@ package de.bixilon.minosoft.gui.rendering.system.base.phases
import de.bixilon.minosoft.gui.rendering.Renderer
interface TransparentDrawable : Renderer {
val skipTransparent: Boolean
get() = false
fun setupTransparent() {
renderSystem.reset(blending = false)

View File

@ -57,7 +57,11 @@ class OpenGLRenderSystem(
if (value === field) {
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.loaded) { "Shader not loaded!" }