diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/shader/AbstractMinosoftShader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/AbstractMinosoftShader.kt
new file mode 100644
index 000000000..82a590f88
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/AbstractMinosoftShader.kt
@@ -0,0 +1,23 @@
+/*
+ * Minosoft
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with this program. If not, see .
+ *
+ * This software is not affiliated with Mojang AB, the original developer of Minecraft.
+ */
+
+package de.bixilon.minosoft.gui.rendering.shader
+
+import de.bixilon.minosoft.gui.rendering.shader.uniform.ShaderUniform
+import de.bixilon.minosoft.gui.rendering.system.base.shader.Shader
+
+interface AbstractMinosoftShader {
+ val native: Shader
+
+ fun uniform(name: String, default: T, type: ShaderSetter = Shader::set): ShaderUniform
+}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/shader/MinosoftShader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/MinosoftShader.kt
index 7d04536d7..b53380235 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/shader/MinosoftShader.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/MinosoftShader.kt
@@ -14,12 +14,9 @@
package de.bixilon.minosoft.gui.rendering.shader
import de.bixilon.minosoft.gui.rendering.shader.uniform.ShaderUniform
-import de.bixilon.minosoft.gui.rendering.system.base.shader.Shader
-import kotlin.reflect.KFunction3
-abstract class MinosoftShader {
+abstract class MinosoftShader : AbstractMinosoftShader {
private val uniforms: MutableMap> = mutableMapOf()
- abstract val native: Shader
fun load() {
native.load()
@@ -35,8 +32,15 @@ abstract class MinosoftShader {
native.use()
}
+ fun reload() {
+ native.reload()
+ for (uniform in uniforms.values) {
+ uniform.forceUpload()
+ }
+ }
- fun uniform(name: String, default: T, type: KFunction3 = Shader::set): ShaderUniform {
+
+ override fun uniform(name: String, default: T, type: ShaderSetter): ShaderUniform {
val uniform = ShaderUniform(native, default, name, type)
val previous = uniforms.put(name, uniform)
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/shader/ShaderSetter.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/ShaderSetter.kt
new file mode 100644
index 000000000..45b7c660b
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/ShaderSetter.kt
@@ -0,0 +1,18 @@
+/*
+ * Minosoft
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with this program. If not, see .
+ *
+ * This software is not affiliated with Mojang AB, the original developer of Minecraft.
+ */
+
+package de.bixilon.minosoft.gui.rendering.shader
+
+import de.bixilon.minosoft.gui.rendering.system.base.shader.Shader
+
+typealias ShaderSetter = (shader: Shader, name: String, value: T) -> Unit
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/shader/TextureShader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/TextureShader.kt
new file mode 100644
index 000000000..2e90a7cb4
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/TextureShader.kt
@@ -0,0 +1,30 @@
+/*
+ * Minosoft
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with this program. If not, see .
+ *
+ * This software is not affiliated with Mojang AB, the original developer of Minecraft.
+ */
+
+package de.bixilon.minosoft.gui.rendering.shader
+
+import de.bixilon.minosoft.gui.rendering.shader.uniform.ShaderUniform
+import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureManager
+
+interface TextureShader : AbstractMinosoftShader {
+ val textures: TextureManager
+
+ fun textureManager(textureManager: TextureManager, animated: Boolean): ShaderUniform {
+ return uniform("uTextures", textureManager) { native, name, value: TextureManager ->
+ value.use(native, name)
+ if (animated) {
+ textureManager.staticTextures.animator.use(native)
+ }
+ }
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/shader/uniform/ShaderUniform.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/uniform/ShaderUniform.kt
index 5148bd62b..4f3886871 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/shader/uniform/ShaderUniform.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/uniform/ShaderUniform.kt
@@ -13,16 +13,16 @@
package de.bixilon.minosoft.gui.rendering.shader.uniform
+import de.bixilon.minosoft.gui.rendering.shader.ShaderSetter
import de.bixilon.minosoft.gui.rendering.system.base.shader.Shader
import kotlin.properties.ReadWriteProperty
-import kotlin.reflect.KFunction3
import kotlin.reflect.KProperty
class ShaderUniform(
private val native: Shader,
default: T,
private val name: String,
- private val setter: KFunction3,
+ private val setter: ShaderSetter,
) : ReadWriteProperty {
private var value = default
private var upload: Boolean = true
@@ -31,6 +31,10 @@ class ShaderUniform(
if (!upload) {
return
}
+ forceUpload()
+ }
+
+ fun forceUpload() {
native.use()
setter(native, name, value)
upload = false
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/planet/PlanetRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/planet/PlanetRenderer.kt
index d43e0d833..e67399119 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/planet/PlanetRenderer.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/planet/PlanetRenderer.kt
@@ -70,7 +70,6 @@ abstract class PlanetRenderer(
override fun postInit() {
prepareMesh()
shader.postLoad()
- sky.renderWindow.textureManager.staticTextures.use(shader)
sky::matrix.observe(this) { calculateMatrix(it) }
}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/planet/PlanetShader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/planet/PlanetShader.kt
index d78ad3f4d..fdac7eff2 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/planet/PlanetShader.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/planet/PlanetShader.kt
@@ -16,11 +16,15 @@ package de.bixilon.minosoft.gui.rendering.sky.planet
import de.bixilon.kotlinglm.mat4x4.Mat4
import de.bixilon.kotlinglm.vec4.Vec4
import de.bixilon.minosoft.gui.rendering.shader.MinosoftShader
+import de.bixilon.minosoft.gui.rendering.shader.TextureShader
import de.bixilon.minosoft.gui.rendering.system.base.shader.Shader
+import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureManager
class PlanetShader(
override val native: Shader,
-) : MinosoftShader() {
+) : MinosoftShader(), TextureShader {
var matrix: Mat4 by uniform("uMatrix", Mat4())
var tintColor: Vec4 by uniform("uTintColor", Vec4())
+ override val textures: TextureManager by textureManager(native.renderWindow.textureManager, false)
+
}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/TextureManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/TextureManager.kt
index 1556df90a..e5efbae1d 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/TextureManager.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/TextureManager.kt
@@ -23,6 +23,8 @@ import de.bixilon.minosoft.data.entities.entities.player.properties.textures.Pla
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.gui.atlas.TextureLikeTexture
+import de.bixilon.minosoft.gui.rendering.system.base.shader.Shader
+import de.bixilon.minosoft.gui.rendering.system.base.shader.ShaderUniforms
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTexture
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureArray
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
@@ -102,4 +104,9 @@ abstract class TextureManager {
}
return alexTexture
}
+
+ fun use(shader: Shader, name: String = ShaderUniforms.TEXTURES) {
+ staticTextures.use(shader, name)
+ dynamicTextures.use(shader, name)
+ }
}