diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/ShaderManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/ShaderManager.kt index 3fbc69add..d589735c5 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/ShaderManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/ShaderManager.kt @@ -21,6 +21,7 @@ class ShaderManager( val renderWindow: RenderWindow, ) { val genericColorShader = Shader( + renderWindow = renderWindow, resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "generic/color"), ) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt index d7720abc9..bebf41c8f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt @@ -46,7 +46,6 @@ import de.bixilon.minosoft.util.KUtil.nullCast import de.bixilon.minosoft.util.KUtil.synchronizedMapOf import de.bixilon.minosoft.util.KUtil.synchronizedSetOf import de.bixilon.minosoft.util.KUtil.toSynchronizedMap -import de.bixilon.minosoft.util.MMath import de.bixilon.minosoft.util.collections.SynchronizedMap import de.bixilon.minosoft.util.task.ThreadPoolRunnable import glm_.vec2.Vec2i @@ -176,8 +175,8 @@ class WorldRenderer( override fun postInit() { check(renderWindow.textures.animator.animatedTextures.size < TextureArray.MAX_ANIMATED_TEXTURE) { "Can not have more than ${TextureArray.MAX_ANIMATED_TEXTURE} animated textures!" } chunkShader = Shader( + renderWindow = renderWindow, resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "chunk"), - defines = mapOf("ANIMATED_TEXTURE_COUNT" to MMath.clamp(renderWindow.textures.animator.animatedTextures.size, 1, TextureArray.MAX_ANIMATED_TEXTURE)), ) chunkShader.load() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt index 877f8ee50..8809b5e52 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt @@ -42,6 +42,7 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow private val hudElements: MutableMap> = mutableMapOf() private val enabledHUDElement: MutableMap> = mutableMapOf() private val hudShader = Shader( + renderWindow = renderWindow, resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "hud"), ) lateinit var hudAtlasElements: Map diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt index 8c7b009fe..487cb5722 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt @@ -22,13 +22,11 @@ import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent import de.bixilon.minosoft.gui.rendering.particle.types.Particle import de.bixilon.minosoft.gui.rendering.shader.Shader import de.bixilon.minosoft.gui.rendering.textures.Texture -import de.bixilon.minosoft.gui.rendering.textures.TextureArray import de.bixilon.minosoft.modding.event.CallbackEventInvoker import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.KUtil.synchronizedSetOf import de.bixilon.minosoft.util.KUtil.toSynchronizedSet -import de.bixilon.minosoft.util.MMath import glm_.vec3.Vec3 import org.lwjgl.opengl.GL11.glDepthMask @@ -64,8 +62,8 @@ class ParticleRenderer( override fun postInit() { particleShader = Shader( + renderWindow = renderWindow, resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "particle"), - defines = mapOf("ANIMATED_TEXTURE_COUNT" to MMath.clamp(renderWindow.textures.animator.animatedTextures.size, 1, TextureArray.MAX_ANIMATED_TEXTURE)), ) particleShader.load() renderWindow.textures.use(particleShader) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/shader/Shader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/Shader.kt index 9a3cf977c..8014cc099 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/shader/Shader.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/Shader.kt @@ -18,9 +18,12 @@ import de.bixilon.minosoft.data.assets.AssetsManager import de.bixilon.minosoft.data.commands.CommandStringReader import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.text.RGBColor +import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.Rendering import de.bixilon.minosoft.gui.rendering.exceptions.ShaderLoadingException +import de.bixilon.minosoft.gui.rendering.textures.TextureArray import de.bixilon.minosoft.gui.rendering.util.OpenGLUtil +import de.bixilon.minosoft.util.MMath import glm_.mat4x4.Mat4 import glm_.mat4x4.Mat4d import glm_.vec2.Vec2 @@ -37,6 +40,7 @@ import org.lwjgl.system.MemoryUtil import java.io.FileNotFoundException class Shader( + private val renderWindow: RenderWindow, private val resourceLocation: ResourceLocation, private val defines: Map = mapOf(), ) { @@ -47,9 +51,9 @@ class Shader( fun load(assetsManager: AssetsManager = Minosoft.MINOSOFT_ASSETS_MANAGER): Int { val uniforms: MutableList = mutableListOf() val pathPrefix = "${resourceLocation.namespace}:rendering/shader/${resourceLocation.path}/${resourceLocation.path.replace("/", "_")}" - val vertexShader = createShader(assetsManager, ResourceLocation("$pathPrefix.vsh"), GL_VERTEX_SHADER_ARB, defines, uniforms)!! - val geometryShader = createShader(assetsManager, ResourceLocation("$pathPrefix.gsh"), GL_GEOMETRY_SHADER_ARB, defines, uniforms) - val fragmentShader = createShader(assetsManager, ResourceLocation("$pathPrefix.fsh"), GL_FRAGMENT_SHADER_ARB, defines, uniforms)!! + val vertexShader = createShader(assetsManager, renderWindow, ResourceLocation("$pathPrefix.vsh"), GL_VERTEX_SHADER_ARB, defines, uniforms)!! + val geometryShader = createShader(assetsManager, renderWindow, ResourceLocation("$pathPrefix.gsh"), GL_GEOMETRY_SHADER_ARB, defines, uniforms) + val fragmentShader = createShader(assetsManager, renderWindow, ResourceLocation("$pathPrefix.fsh"), GL_FRAGMENT_SHADER_ARB, defines, uniforms)!! this.uniforms = uniforms.toList() programId = glCreateProgramObjectARB() @@ -160,9 +164,21 @@ class Shader( companion object { + private val DEFAULT_DEFINES: Map Any?> = mapOf( + "__NVIDIA" to { + if (glGetString(GL_VENDOR)?.lowercase()?.contains("nvidia") == true) { + "" + } else { + null + } + }, + "ANIMATED_TEXTURE_COUNT" to { + MMath.clamp(it.textures.animator.animatedTextures.size, 1, TextureArray.MAX_ANIMATED_TEXTURE) + } + ) private var currentShaderInUse: Shader? = null // ToDo: This is not safe todo - private fun createShader(assetsManager: AssetsManager = Minosoft.MINOSOFT_ASSETS_MANAGER, resourceLocation: ResourceLocation, shaderType: Int, defines: Map, uniforms: MutableList): Int? { + private fun createShader(assetsManager: AssetsManager = Minosoft.MINOSOFT_ASSETS_MANAGER, renderWindow: RenderWindow, resourceLocation: ResourceLocation, shaderType: Int, defines: Map, uniforms: MutableList): Int? { val shaderId = glCreateShaderObjectARB(shaderType) if (shaderId.toLong() == MemoryUtil.NULL) { throw ShaderLoadingException() @@ -194,16 +210,25 @@ class Shader( total.append(line) total.append('\n') + + fun pushDefine(name: String, value: Any) { + total.append("#define ") + total.append(name) + total.append(' ') + total.append(value) + total.append('\n') + } + when { line.startsWith("#version") -> { // add all defines total.append('\n') - for ((define, value) in defines) { - total.append("#define ") - total.append(define) - total.append(' ') - total.append(value) - total.append('\n') + for ((name, value) in defines) { + pushDefine(name, value) + } + + for ((name, value) in DEFAULT_DEFINES) { + value(renderWindow)?.let { pushDefine(name, it) } } } line.startsWith("uniform ") -> { // ToDo: Packed in layout 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 962a9a022..22d32813b 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 @@ -41,9 +41,11 @@ class SkyRenderer( val renderWindow: RenderWindow, ) : Renderer { private val skyboxShader = Shader( + renderWindow = renderWindow, resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "sky/skybox"), ) private val skySunShader = Shader( + renderWindow = renderWindow, resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "sky/sun"), ) private val skyboxMesh = SkyboxMesh() diff --git a/src/main/resources/assets/minosoft/rendering/shader/includes/texture.glsl b/src/main/resources/assets/minosoft/rendering/shader/includes/texture.glsl index d5e4a324e..ca3de516d 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/includes/texture.glsl +++ b/src/main/resources/assets/minosoft/rendering/shader/includes/texture.glsl @@ -15,6 +15,9 @@ uniform sampler2DArray uTextures[7]; vec4 getTexture(uint textureId, vec3 textureCoordinates) { // ToDo: This method is just stupid and workarounds a opengl crash with mesa drivers + #ifdef __NVIDIA + return texture(uTextures[textureId], textureCoordinates); + #else switch (textureId) { case 1u: return texture(uTextures[1], textureCoordinates); case 2u: return texture(uTextures[2], textureCoordinates); @@ -24,4 +27,5 @@ vec4 getTexture(uint textureId, vec3 textureCoordinates) { // ToDo: This method case 6u: return texture(uTextures[6], textureCoordinates); } return texture(uTextures[0], textureCoordinates); + #endif }