diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt index e1f5c3ea7..f6ce73ae3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt @@ -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) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/block/outline/BlockOutlineRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/block/outline/BlockOutlineRenderer.kt index a38f281b2..255b7d8d4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/block/outline/BlockOutlineRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/block/outline/BlockOutlineRenderer.kt @@ -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() 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() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt index ae7fd2564..1bfd841fa 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt @@ -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) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt index 0cbecd78c..b2973b54a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt @@ -50,6 +50,7 @@ interface RenderSystem { this.depth = depth this.depthMask = depthMask this.clearColor = clearColor + shader = null } fun enable(capability: RenderingCapabilities) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/CustomDrawable.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/CustomDrawable.kt index 14fa1100d..72c7f239a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/CustomDrawable.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/CustomDrawable.kt @@ -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() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/OpaqueDrawable.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/OpaqueDrawable.kt index 1d287eaf2..62677d006 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/OpaqueDrawable.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/OpaqueDrawable.kt @@ -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) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/OtherDrawable.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/OtherDrawable.kt index 8e274f64b..54abec9ff 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/OtherDrawable.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/OtherDrawable.kt @@ -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() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/RenderPhases.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/RenderPhases.kt index 4ebb99b77..c2ec38ea6 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/RenderPhases.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/RenderPhases.kt @@ -19,10 +19,15 @@ import kotlin.reflect.KClass class RenderPhases( val type: KClass, + 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( } 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) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/SkipAll.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/SkipAll.kt new file mode 100644 index 000000000..763e028f5 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/SkipAll.kt @@ -0,0 +1,5 @@ +package de.bixilon.minosoft.gui.rendering.system.base.phases + +interface SkipAll { + val skipAll: Boolean +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TranslucentDrawable.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TranslucentDrawable.kt index d87dcf7cf..732957126 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TranslucentDrawable.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TranslucentDrawable.kt @@ -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 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TransparentDrawable.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TransparentDrawable.kt index dfc4c8df4..588dbf812 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TransparentDrawable.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TransparentDrawable.kt @@ -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) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/OpenGLRenderSystem.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/OpenGLRenderSystem.kt index a0201a447..25f19ac77 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/OpenGLRenderSystem.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/OpenGLRenderSystem.kt @@ -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!" }