mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-09 15:29:20 -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.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)
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -50,6 +50,7 @@ interface RenderSystem {
|
||||
this.depth = depth
|
||||
this.depthMask = depthMask
|
||||
this.clearColor = clearColor
|
||||
shader = null
|
||||
}
|
||||
|
||||
fun enable(capability: RenderingCapabilities)
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
interface TranslucentDrawable : Renderer {
|
||||
val skipTranslucent: Boolean
|
||||
get() = false
|
||||
|
||||
fun setupTranslucent() {
|
||||
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
|
||||
|
||||
interface TransparentDrawable : Renderer {
|
||||
val skipTransparent: Boolean
|
||||
get() = false
|
||||
|
||||
fun setupTransparent() {
|
||||
renderSystem.reset(blending = false)
|
||||
|
@ -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!" }
|
||||
|
Loading…
x
Reference in New Issue
Block a user