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 96f3285a6..fba9fd925 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 @@ -41,6 +41,7 @@ interface RenderSystem { depthTest: Boolean = true, blending: Boolean = false, faceCulling: Boolean = true, + polygonOffset: Boolean = false, depthMask: Boolean = true, sourceRGB: BlendingFunctions = BlendingFunctions.ONE, destinationRGB: BlendingFunctions = BlendingFunctions.ONE_MINUS_SOURCE_ALPHA, @@ -48,15 +49,19 @@ interface RenderSystem { destinationAlpha: BlendingFunctions = BlendingFunctions.ZERO, depth: DepthFunctions = DepthFunctions.LESS, clearColor: RGBColor = Colors.TRANSPARENT, + polygonOffsetFactor: Float = 0.0f, + polygonOffsetUnit: Float = 0.0f, ) { setBlendFunction(sourceRGB, destinationRGB, sourceAlpha, destinationAlpha) this[RenderingCapabilities.DEPTH_TEST] = depthTest this[RenderingCapabilities.BLENDING] = blending this[RenderingCapabilities.FACE_CULLING] = faceCulling + this[RenderingCapabilities.POLYGON_OFFSET] = polygonOffset this.depth = depth this.depthMask = depthMask this.clearColor = clearColor shader = null + polygonOffset(polygonOffsetFactor, polygonOffsetUnit) } fun enable(capability: RenderingCapabilities) @@ -110,4 +115,7 @@ interface RenderSystem { fun clear(vararg buffers: IntegratedBufferTypes) fun getErrors(): List + + + fun polygonOffset(factor: Float, unit: Float) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderingCapabilities.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderingCapabilities.kt index 03fc358b7..7e4506242 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderingCapabilities.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderingCapabilities.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 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. * @@ -17,5 +17,6 @@ enum class RenderingCapabilities { DEPTH_TEST, BLENDING, FACE_CULLING, + POLYGON_OFFSET, ; } 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 e1b41b667..eb3fdd290 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 @@ -289,6 +289,16 @@ class OpenGLRenderSystem( return errors } + private var polygonOffsetFactor: Float = 0.0f + private var polygonOffsetUnit: Float = 0.0f + override fun polygonOffset(factor: Float, unit: Float) { + if (this.polygonOffsetFactor != factor || this.polygonOffsetUnit != unit) { + glPolygonOffset(factor, unit) + this.polygonOffsetFactor = factor + this.polygonOffsetUnit = unit + } + } + companion object { private val RenderingCapabilities.gl: Int get() { @@ -296,6 +306,7 @@ class OpenGLRenderSystem( RenderingCapabilities.BLENDING -> GL_BLEND RenderingCapabilities.DEPTH_TEST -> GL_DEPTH_TEST RenderingCapabilities.FACE_CULLING -> GL_CULL_FACE + RenderingCapabilities.POLYGON_OFFSET -> GL_POLYGON_OFFSET_FILL else -> throw IllegalArgumentException("OpenGL does not support capability: $this") } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt index d85a6ab3d..def9bb8b7 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt @@ -46,6 +46,7 @@ import de.bixilon.minosoft.gui.rendering.renderer.Renderer import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder 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.RenderingCapabilities import de.bixilon.minosoft.gui.rendering.system.base.phases.OpaqueDrawable import de.bixilon.minosoft.gui.rendering.system.base.phases.TranslucentDrawable import de.bixilon.minosoft.gui.rendering.system.base.phases.TransparentDrawable @@ -693,6 +694,8 @@ class WorldRenderer( } renderWindow.renderSystem.depth = DepthFunctions.LESS_OR_EQUAL + renderWindow.renderSystem[RenderingCapabilities.POLYGON_OFFSET] = true + renderWindow.renderSystem.polygonOffset(-2.5f, -2.5f) textShader.use() for (mesh in visible.text) { mesh.draw() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/border/WorldBorderRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/border/WorldBorderRenderer.kt index d61121434..5d45407cc 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/border/WorldBorderRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/border/WorldBorderRenderer.kt @@ -57,10 +57,13 @@ class WorldBorderRenderer( renderSystem.reset( blending = true, sourceRGB = BlendingFunctions.SOURCE_ALPHA, - destinationRGB = BlendingFunctions.ONE_MINUS_SOURCE_ALPHA, + destinationRGB = BlendingFunctions.ONE, sourceAlpha = BlendingFunctions.SOURCE_ALPHA, destinationAlpha = BlendingFunctions.DESTINATION_ALPHA, faceCulling = false, + polygonOffset = true, + polygonOffsetFactor = -3.0f, + polygonOffsetUnit = -3.0f, ) shader.use() textureOffset += 0.01f