diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt index 8815b2e6f..1850be2e9 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt @@ -26,10 +26,8 @@ import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions 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.buffer.vertex.PrimitiveTypes import de.bixilon.minosoft.gui.rendering.system.base.phases.CustomDrawable import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture -import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh import de.bixilon.minosoft.gui.rendering.util.mesh.SimpleTextureMesh import de.bixilon.minosoft.modding.event.events.TimeChangeEvent import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker @@ -49,7 +47,7 @@ class SkyRenderer( private val skyboxShader = renderSystem.createShader(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "sky/skybox")) private val skySunShader = renderSystem.createShader(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "sky/sun")) private val skyboxMesh = SkyboxMesh(renderWindow) - private var skySunMesh = SimpleTextureMesh(renderWindow, PrimitiveTypes.TRIANGLE) + private var skySunMesh = SimpleTextureMesh(renderWindow) private lateinit var sunTexture: AbstractTexture private var sunMatrixUpToDate: Boolean = true var baseColor = RenderConstants.DEFAULT_SKY_COLOR @@ -98,8 +96,8 @@ class SkyRenderer( setSunMatrix(renderWindow.inputHandler.camera.projectionMatrix * renderWindow.inputHandler.camera.viewMatrix.toMat3().toMat4()) skySunMesh.unload() - skySunMesh = SimpleTextureMesh(renderWindow, PrimitiveTypes.TRIANGLE) - Mesh.addQuad( + skySunMesh = SimpleTextureMesh(renderWindow) + skySunMesh.addQuad( start = Vec3(-0.15f, 1.0f, -0.15f), end = Vec3(+0.15f, 1.0f, +0.15f), vertexConsumer = { position, uv -> 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 16f54bd55..d53aeb99f 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 @@ -2,14 +2,16 @@ package de.bixilon.minosoft.gui.rendering.system.base.phases import de.bixilon.minosoft.gui.rendering.Renderer import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions +import de.bixilon.minosoft.gui.rendering.system.base.RenderingCapabilities interface TranslucentDrawable : Renderer { val skipTranslucent: Boolean get() = false fun setupTranslucent() { - renderSystem.reset(depthMask = false, blending = true) // ToDo: This is just a translucent workaround - renderSystem.setBlendFunc(BlendingFunctions.SOURCE_ALPHA, BlendingFunctions.ONE_MINUS_SOURCE_ALPHA, BlendingFunctions.ONE, BlendingFunctions.ONE_MINUS_SOURCE_ALPHA) + renderSystem.reset(blending = true) // ToDo: This is just a translucent workaround + renderSystem.enable(RenderingCapabilities.BLENDING) + renderSystem.setBlendFunc(BlendingFunctions.SOURCE_ALPHA, BlendingFunctions.ONE_MINUS_SOURCE_ALPHA, BlendingFunctions.ONE, BlendingFunctions.ZERO) } fun drawTranslucent() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/vertex/FloatOpenGLVertexBuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/vertex/FloatOpenGLVertexBuffer.kt index c14759310..bb97d7197 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/vertex/FloatOpenGLVertexBuffer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/vertex/FloatOpenGLVertexBuffer.kt @@ -14,7 +14,7 @@ import org.lwjgl.opengl.GL20.glEnableVertexAttribArray import org.lwjgl.opengl.GL20.glVertexAttribPointer import java.nio.FloatBuffer -class FloatOpenGLVertexBuffer(override val structure: MeshStruct, data: FloatBuffer, override val primitiveType: PrimitiveTypes = PrimitiveTypes.TRIANGLE) : FloatOpenGLBuffer(data), FloatVertexBuffer { +class FloatOpenGLVertexBuffer(override val structure: MeshStruct, data: FloatBuffer, override val primitiveType: PrimitiveTypes) : FloatOpenGLBuffer(data), FloatVertexBuffer { override var vertices = -1 private set private var vao = -1 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt index 0dcb64658..2a329046a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt @@ -63,6 +63,26 @@ abstract class Mesh( } } + + fun addQuad(start: Vec3, end: Vec3, uvStart: Vec2 = Vec2(0.0f, 0.0f), uvEnd: Vec2 = Vec2(1.0f, 1.0f), vertexConsumer: (position: Vec3, uv: Vec2) -> Unit) { + val positions = arrayOf( + start, + Vec3(start.x, start.y, end.z), + end, + Vec3(end.x, end.y, start.z), + ) + val texturePositions = arrayOf( + Vec2(uvEnd.x, uvStart.y), + uvStart, + Vec2(uvStart.x, uvEnd.y), + uvEnd, + ) + + for ((vertexIndex, textureIndex) in order) { + vertexConsumer.invoke(positions[vertexIndex], texturePositions[textureIndex]) + } + } + enum class MeshStates { PREPARING, LOADED, @@ -84,25 +104,5 @@ abstract class Mesh( 2 to 3, 1 to 0, ) - - - fun addQuad(start: Vec3, end: Vec3, uvStart: Vec2 = Vec2(0.0f, 0.0f), uvEnd: Vec2 = Vec2(1.0f, 1.0f), vertexConsumer: (position: Vec3, uv: Vec2) -> Unit) { - val positions = arrayOf( - start, - Vec3(start.x, start.y, end.z), - end, - Vec3(end.x, end.y, start.z), - ) - val texturePositions = arrayOf( - Vec2(uvEnd.x, uvStart.y), - uvStart, - Vec2(uvStart.x, uvEnd.y), - uvEnd, - ) - - for ((vertexIndex, textureIndex) in TRIANGLE_TO_QUAD_ORDER) { - vertexConsumer.invoke(positions[vertexIndex], texturePositions[textureIndex]) - } - } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/SimpleTextureMesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/SimpleTextureMesh.kt index cf3f5012b..29fb5c6a3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/SimpleTextureMesh.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/SimpleTextureMesh.kt @@ -21,7 +21,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTex import glm_.vec2.Vec2 import glm_.vec3.Vec3 -open class SimpleTextureMesh(renderWindow: RenderWindow, primitiveType: PrimitiveTypes) : Mesh(renderWindow, SimpleTextureMeshStruct, primitiveType, initialCacheSize = 2 * 3 * SimpleTextureMeshStruct.FLOATS_PER_VERTEX) { +open class SimpleTextureMesh(renderWindow: RenderWindow, primitiveType: PrimitiveTypes = renderWindow.renderSystem.preferredPrimitiveType) : Mesh(renderWindow, SimpleTextureMeshStruct, primitiveType, initialCacheSize = 2 * 3 * SimpleTextureMeshStruct.FLOATS_PER_VERTEX) { fun addVertex(position: Vec3, texture: AbstractTexture, uv: Vec2, tintColor: RGBColor) { data.addAll( @@ -32,6 +32,7 @@ open class SimpleTextureMesh(renderWindow: RenderWindow, primitiveType: Primitiv uv.x, uv.y, Float.fromBits(texture.renderData?.shaderTextureId ?: RenderConstants.DEBUG_TEXTURE_ID), + Float.fromBits(tintColor.rgba) )) } @@ -40,6 +41,7 @@ open class SimpleTextureMesh(renderWindow: RenderWindow, primitiveType: Primitiv val position: Vec3, val uv: Vec2, val indexLayerAnimation: Int, + val tint: RGBColor, ) { companion object : MeshStruct(SimpleTextureMeshStruct::class) }