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) + } }