mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 19:05:02 -04:00
shader: vendor defines
This commit is contained in:
parent
b6c1e56c3a
commit
1a249f0fcd
@ -21,6 +21,7 @@ class ShaderManager(
|
||||
val renderWindow: RenderWindow,
|
||||
) {
|
||||
val genericColorShader = Shader(
|
||||
renderWindow = renderWindow,
|
||||
resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "generic/color"),
|
||||
)
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
@ -42,6 +42,7 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow
|
||||
private val hudElements: MutableMap<ResourceLocation, Pair<HUDElementProperties, HUDElement>> = mutableMapOf()
|
||||
private val enabledHUDElement: MutableMap<ResourceLocation, Pair<HUDElementProperties, HUDElement>> = mutableMapOf()
|
||||
private val hudShader = Shader(
|
||||
renderWindow = renderWindow,
|
||||
resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "hud"),
|
||||
)
|
||||
lateinit var hudAtlasElements: Map<ResourceLocation, HUDAtlasElement>
|
||||
|
@ -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)
|
||||
|
@ -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<String, Any> = mapOf(),
|
||||
) {
|
||||
@ -47,9 +51,9 @@ class Shader(
|
||||
fun load(assetsManager: AssetsManager = Minosoft.MINOSOFT_ASSETS_MANAGER): Int {
|
||||
val uniforms: MutableList<String> = 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<String, (renderWindow: RenderWindow) -> 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<String, Any>, uniforms: MutableList<String>): Int? {
|
||||
private fun createShader(assetsManager: AssetsManager = Minosoft.MINOSOFT_ASSETS_MANAGER, renderWindow: RenderWindow, resourceLocation: ResourceLocation, shaderType: Int, defines: Map<String, Any>, uniforms: MutableList<String>): 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
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user