From db7641932d4a0bbd7ff553fa848d510073827ebb Mon Sep 17 00:00:00 2001 From: Pyrofab Date: Sun, 19 May 2019 03:07:35 +0200 Subject: [PATCH 1/3] Start working on some uniform madness --- .../experimental/managed/SamplerUniform.java | 33 +++++++ .../api/experimental/managed/Uniform1f.java | 16 ++++ .../api/experimental/managed/Uniform1i.java | 15 ++++ .../api/experimental/managed/Uniform2f.java | 18 ++++ .../api/experimental/managed/Uniform2i.java | 16 ++++ .../api/experimental/managed/Uniform3f.java | 18 ++++ .../api/experimental/managed/Uniform3i.java | 17 ++++ .../api/experimental/managed/Uniform4f.java | 20 +++++ .../api/experimental/managed/Uniform4i.java | 18 ++++ .../experimental/managed/UniformFinder.java | 88 +++++++++++++++++++ .../api/experimental/managed/UniformMat4.java | 18 ++++ .../api/managed/ManagedShaderEffect.java | 3 +- .../ladysnake/satin/impl/ManagedUniform.java | 5 ++ .../impl/ResettableManagedShaderEffect.java | 51 +++++++++++ 14 files changed, 335 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ladysnake/satin/api/experimental/managed/SamplerUniform.java create mode 100644 src/main/java/ladysnake/satin/api/experimental/managed/Uniform1f.java create mode 100644 src/main/java/ladysnake/satin/api/experimental/managed/Uniform1i.java create mode 100644 src/main/java/ladysnake/satin/api/experimental/managed/Uniform2f.java create mode 100644 src/main/java/ladysnake/satin/api/experimental/managed/Uniform2i.java create mode 100644 src/main/java/ladysnake/satin/api/experimental/managed/Uniform3f.java create mode 100644 src/main/java/ladysnake/satin/api/experimental/managed/Uniform3i.java create mode 100644 src/main/java/ladysnake/satin/api/experimental/managed/Uniform4f.java create mode 100644 src/main/java/ladysnake/satin/api/experimental/managed/Uniform4i.java create mode 100644 src/main/java/ladysnake/satin/api/experimental/managed/UniformFinder.java create mode 100644 src/main/java/ladysnake/satin/api/experimental/managed/UniformMat4.java create mode 100644 src/main/java/ladysnake/satin/impl/ManagedUniform.java diff --git a/src/main/java/ladysnake/satin/api/experimental/managed/SamplerUniform.java b/src/main/java/ladysnake/satin/api/experimental/managed/SamplerUniform.java new file mode 100644 index 0000000..6e08985 --- /dev/null +++ b/src/main/java/ladysnake/satin/api/experimental/managed/SamplerUniform.java @@ -0,0 +1,33 @@ +package ladysnake.satin.api.experimental.managed; + +import net.minecraft.client.gl.GlFramebuffer; +import net.minecraft.client.texture.Texture; +import org.apiguardian.api.API; + +import static org.apiguardian.api.API.Status.EXPERIMENTAL; + +public interface SamplerUniform { + /** + * Sets the value of a sampler uniform declared in json + * + * @param texture a texture object + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + void set(Texture texture); + + /** + * Sets the value of a sampler uniform declared in json + * + * @param textureFbo a framebuffer which main texture will be used + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + void set(GlFramebuffer textureFbo); + + /** + * Sets the value of a sampler uniform declared in json + * + * @param textureName an opengl texture name + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + void set(int textureName); +} diff --git a/src/main/java/ladysnake/satin/api/experimental/managed/Uniform1f.java b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform1f.java new file mode 100644 index 0000000..697e867 --- /dev/null +++ b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform1f.java @@ -0,0 +1,16 @@ +package ladysnake.satin.api.experimental.managed; + +import org.apiguardian.api.API; + +import static org.apiguardian.api.API.Status.EXPERIMENTAL; + +public interface Uniform1f { + + /** + * Sets the value of a uniform + * + * @param value float value + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + void set(float value); +} diff --git a/src/main/java/ladysnake/satin/api/experimental/managed/Uniform1i.java b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform1i.java new file mode 100644 index 0000000..bdd2900 --- /dev/null +++ b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform1i.java @@ -0,0 +1,15 @@ +package ladysnake.satin.api.experimental.managed; + +import org.apiguardian.api.API; + +import static org.apiguardian.api.API.Status.EXPERIMENTAL; + +public interface Uniform1i { + /** + * Sets the value of this uniform + * + * @param value int value + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + void set(int value); +} diff --git a/src/main/java/ladysnake/satin/api/experimental/managed/Uniform2f.java b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform2f.java new file mode 100644 index 0000000..7df0aef --- /dev/null +++ b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform2f.java @@ -0,0 +1,18 @@ +package ladysnake.satin.api.experimental.managed; + +import org.apiguardian.api.API; + +import static org.apiguardian.api.API.Status.EXPERIMENTAL; + +public interface Uniform2f { + + /** + * Sets the value of a uniform declared in json + * + * @param value0 float value + * @param value1 float value + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + void set(float value0, float value1); + +} diff --git a/src/main/java/ladysnake/satin/api/experimental/managed/Uniform2i.java b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform2i.java new file mode 100644 index 0000000..6f54852 --- /dev/null +++ b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform2i.java @@ -0,0 +1,16 @@ +package ladysnake.satin.api.experimental.managed; + +import org.apiguardian.api.API; + +import static org.apiguardian.api.API.Status.EXPERIMENTAL; + +public interface Uniform2i { + /** + * Sets the value of a uniform + * + * @param value0 int value + * @param value1 int value + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + void set(int value0, int value1); +} diff --git a/src/main/java/ladysnake/satin/api/experimental/managed/Uniform3f.java b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform3f.java new file mode 100644 index 0000000..db60c9b --- /dev/null +++ b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform3f.java @@ -0,0 +1,18 @@ +package ladysnake.satin.api.experimental.managed; + +import org.apiguardian.api.API; + +import static org.apiguardian.api.API.Status.EXPERIMENTAL; + +public interface Uniform3f { + + /** + * Sets the value of a uniform declared in json + * + * @param value0 float value + * @param value1 float value + * @param value2 float value + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + void set(float value0, float value1, float value2); +} diff --git a/src/main/java/ladysnake/satin/api/experimental/managed/Uniform3i.java b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform3i.java new file mode 100644 index 0000000..60b4636 --- /dev/null +++ b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform3i.java @@ -0,0 +1,17 @@ +package ladysnake.satin.api.experimental.managed; + +import org.apiguardian.api.API; + +import static org.apiguardian.api.API.Status.EXPERIMENTAL; + +public interface Uniform3i { + /** + * Sets the value of a uniform + * + * @param value0 int value + * @param value1 int value + * @param value2 int value + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + void set(int value0, int value1, int value2); +} diff --git a/src/main/java/ladysnake/satin/api/experimental/managed/Uniform4f.java b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform4f.java new file mode 100644 index 0000000..a4c255a --- /dev/null +++ b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform4f.java @@ -0,0 +1,20 @@ +package ladysnake.satin.api.experimental.managed; + +import org.apiguardian.api.API; + +import static org.apiguardian.api.API.Status.EXPERIMENTAL; + +public interface Uniform4f { + + /** + * Sets the value of a uniform declared in json + * + * @param value0 float value + * @param value1 float value + * @param value2 float value + * @param value3 float value + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + void set(float value0, float value1, float value2, float value3); + +} diff --git a/src/main/java/ladysnake/satin/api/experimental/managed/Uniform4i.java b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform4i.java new file mode 100644 index 0000000..27be6e2 --- /dev/null +++ b/src/main/java/ladysnake/satin/api/experimental/managed/Uniform4i.java @@ -0,0 +1,18 @@ +package ladysnake.satin.api.experimental.managed; + +import org.apiguardian.api.API; + +import static org.apiguardian.api.API.Status.EXPERIMENTAL; + +public interface Uniform4i { + /** + * Sets the value of a uniform declared in json + * + * @param value0 int value + * @param value1 int value + * @param value2 int value + * @param value3 int value + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + void set(int value0, int value1, int value2, int value3); +} diff --git a/src/main/java/ladysnake/satin/api/experimental/managed/UniformFinder.java b/src/main/java/ladysnake/satin/api/experimental/managed/UniformFinder.java new file mode 100644 index 0000000..ec08968 --- /dev/null +++ b/src/main/java/ladysnake/satin/api/experimental/managed/UniformFinder.java @@ -0,0 +1,88 @@ +package ladysnake.satin.api.experimental.managed; + +import org.apiguardian.api.API; + +import static org.apiguardian.api.API.Status.EXPERIMENTAL; + +public interface UniformFinder { + /** + * Sets the value of a uniform declared in json + * + * @param uniformName the name of the uniform field in the shader source file + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + Uniform1i findUniform1i(String uniformName); + + /** + * Sets the value of a uniform declared in json + * + * @param uniformName the name of the uniform field in the shader source file + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + Uniform2i findUniform2i(String uniformName); + + /** + * Sets the value of a uniform declared in json + * + * @param uniformName the name of the uniform field in the shader source file + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + Uniform3i findUniform3i(String uniformName); + + /** + * Sets the value of a uniform declared in json + * + * @param uniformName the name of the uniform field in the shader source file + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + Uniform4i findUniform4i(String uniformName); + + /** + * Sets the value of a uniform declared in json + * + * @param uniformName the name of the uniform field in the shader source file + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + Uniform1f findUniform1f(String uniformName); + + /** + * Sets the value of a uniform declared in json + * + * @param uniformName the name of the uniform field in the shader source file + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + Uniform2f findUniform2f(String uniformName); + + /** + * Sets the value of a uniform declared in json + * + * @param uniformName the name of the uniform field in the shader source file + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + Uniform3f findUniform3f(String uniformName); + + /** + * Sets the value of a uniform declared in json + * + * @param uniformName the name of the uniform field in the shader source file + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + Uniform4f findUniform4f(String uniformName); + + /** + * Sets the value of a uniform declared in json + * + * @param uniformName the name of the uniform field in the shader source file + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + UniformMat4 findUniformMat4(String uniformName); + + /** + * Sets the value of a sampler uniform declared in json + * + * @param samplerName the name of the sampler uniform field in the shader source file and json + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + SamplerUniform findSamplerUniform(String samplerName); + +} diff --git a/src/main/java/ladysnake/satin/api/experimental/managed/UniformMat4.java b/src/main/java/ladysnake/satin/api/experimental/managed/UniformMat4.java new file mode 100644 index 0000000..793090d --- /dev/null +++ b/src/main/java/ladysnake/satin/api/experimental/managed/UniformMat4.java @@ -0,0 +1,18 @@ +package ladysnake.satin.api.experimental.managed; + +import net.minecraft.client.util.math.Matrix4f; +import org.apiguardian.api.API; + +import static org.apiguardian.api.API.Status.EXPERIMENTAL; + +public interface UniformMat4 { + + /** + * Sets the value of a 4x4 matrix uniform + * + * @param value a matrix + */ + @API(status = EXPERIMENTAL, since = "1.3.0") + void set(Matrix4f value); + +} diff --git a/src/main/java/ladysnake/satin/api/managed/ManagedShaderEffect.java b/src/main/java/ladysnake/satin/api/managed/ManagedShaderEffect.java index a522e5b..4570fc0 100644 --- a/src/main/java/ladysnake/satin/api/managed/ManagedShaderEffect.java +++ b/src/main/java/ladysnake/satin/api/managed/ManagedShaderEffect.java @@ -1,5 +1,6 @@ package ladysnake.satin.api.managed; +import ladysnake.satin.api.experimental.managed.UniformFinder; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gl.GlFramebuffer; import net.minecraft.client.gl.ShaderEffect; @@ -26,7 +27,7 @@ * @see ShaderEffectManager * @since 1.0.0 */ -public interface ManagedShaderEffect { +public interface ManagedShaderEffect extends UniformFinder { /** * Returns this object's managed {@link ShaderEffect}, creating and initializing it if it doesn't exist. *

diff --git a/src/main/java/ladysnake/satin/impl/ManagedUniform.java b/src/main/java/ladysnake/satin/impl/ManagedUniform.java new file mode 100644 index 0000000..66fd8ea --- /dev/null +++ b/src/main/java/ladysnake/satin/impl/ManagedUniform.java @@ -0,0 +1,5 @@ +package ladysnake.satin.impl; + +public final class ManagedUniform { + +} diff --git a/src/main/java/ladysnake/satin/impl/ResettableManagedShaderEffect.java b/src/main/java/ladysnake/satin/impl/ResettableManagedShaderEffect.java index 572567a..1e70838 100644 --- a/src/main/java/ladysnake/satin/impl/ResettableManagedShaderEffect.java +++ b/src/main/java/ladysnake/satin/impl/ResettableManagedShaderEffect.java @@ -3,6 +3,7 @@ import com.google.common.base.Preconditions; import com.mojang.blaze3d.platform.GlStateManager; import ladysnake.satin.Satin; +import ladysnake.satin.api.experimental.managed.*; import ladysnake.satin.api.managed.ManagedShaderEffect; import ladysnake.satin.api.managed.ShaderEffectManager; import ladysnake.satin.api.util.ShaderPrograms; @@ -304,6 +305,56 @@ private void setSamplerUniform(String samplerName, Object texture) { } } + @Override + public Uniform1i findUniform1i(String uniformName) { + return null; + } + + @Override + public Uniform2i findUniform2i(String uniformName) { + return null; + } + + @Override + public Uniform3i findUniform3i(String uniformName) { + return null; + } + + @Override + public Uniform4i findUniform4i(String uniformName) { + return null; + } + + @Override + public Uniform1f findUniform1f(String uniformName) { + return null; + } + + @Override + public Uniform2f findUniform2f(String uniformName) { + return null; + } + + @Override + public Uniform3f findUniform3f(String uniformName) { + return null; + } + + @Override + public Uniform4f findUniform4f(String uniformName) { + return null; + } + + @Override + public UniformMat4 findUniformMat4(String uniformName) { + return null; + } + + @Override + public SamplerUniform findSamplerUniform(String samplerName) { + return null; + } + /** * {@inheritDoc} */ From 452c2098a1b439579a8e096ce7da92cda9f5eaa7 Mon Sep 17 00:00:00 2001 From: Pyrofab Date: Sun, 19 May 2019 13:41:51 +0200 Subject: [PATCH 2/3] Do Mojang's job and make uniform upload return early --- .../satin/mixin/client/gl/GlUniformMixin.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/ladysnake/satin/mixin/client/gl/GlUniformMixin.java b/src/main/java/ladysnake/satin/mixin/client/gl/GlUniformMixin.java index 283e907..d4dc9ef 100644 --- a/src/main/java/ladysnake/satin/mixin/client/gl/GlUniformMixin.java +++ b/src/main/java/ladysnake/satin/mixin/client/gl/GlUniformMixin.java @@ -1,16 +1,21 @@ package ladysnake.satin.mixin.client.gl; import net.minecraft.client.gl.GlUniform; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.nio.Buffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; +import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER; + @Mixin(GlUniform.class) public abstract class GlUniformMixin { @Shadow @Final private IntBuffer intData; @@ -20,4 +25,9 @@ private Buffer fixIntUniforms(FloatBuffer floatBuffer) { this.intData.clear(); return floatBuffer; } + + @Inject(method = "upload", at = @At(value = "JUMP", opcode = Opcodes.IFNE, ordinal = 0, shift = AFTER), cancellable = true) + private void fixUploadEarlyReturn(CallbackInfo ci) { + ci.cancel(); + } } From d3c649fb1d2e52fcac1b96b70a5a51892c948a24 Mon Sep 17 00:00:00 2001 From: Pyrofab Date: Sun, 19 May 2019 16:17:31 +0200 Subject: [PATCH 3/3] Implement managed uniforms --- gradle.properties | 2 +- .../experimental/managed/UniformFinder.java | 26 ++-- .../ladysnake/satin/impl/ManagedUniform.java | 134 +++++++++++++++++- .../impl/ResettableManagedShaderEffect.java | 46 ++++-- .../ladysnake/satindepthtest/DepthFx.java | 17 ++- 5 files changed, 187 insertions(+), 38 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6e19900..49ba28a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ loader_version=0.4.6+build.141 fabric_version=0.2.7+build.127 modmenu_version=1.2.1-49 # Mod Properties -mod_version = 1.2.1 +mod_version = 1.3.0 maven_group = io.github.ladysnake archives_base_name = satin diff --git a/src/main/java/ladysnake/satin/api/experimental/managed/UniformFinder.java b/src/main/java/ladysnake/satin/api/experimental/managed/UniformFinder.java index ec08968..30e713f 100644 --- a/src/main/java/ladysnake/satin/api/experimental/managed/UniformFinder.java +++ b/src/main/java/ladysnake/satin/api/experimental/managed/UniformFinder.java @@ -6,7 +6,7 @@ public interface UniformFinder { /** - * Sets the value of a uniform declared in json + * Finds a uniform declared in json * * @param uniformName the name of the uniform field in the shader source file */ @@ -14,7 +14,7 @@ public interface UniformFinder { Uniform1i findUniform1i(String uniformName); /** - * Sets the value of a uniform declared in json + * Finds a uniform declared in json * * @param uniformName the name of the uniform field in the shader source file */ @@ -22,7 +22,7 @@ public interface UniformFinder { Uniform2i findUniform2i(String uniformName); /** - * Sets the value of a uniform declared in json + * Finds a uniform declared in json * * @param uniformName the name of the uniform field in the shader source file */ @@ -30,7 +30,7 @@ public interface UniformFinder { Uniform3i findUniform3i(String uniformName); /** - * Sets the value of a uniform declared in json + * Finds a uniform declared in json * * @param uniformName the name of the uniform field in the shader source file */ @@ -38,7 +38,7 @@ public interface UniformFinder { Uniform4i findUniform4i(String uniformName); /** - * Sets the value of a uniform declared in json + * Finds a uniform declared in json * * @param uniformName the name of the uniform field in the shader source file */ @@ -46,7 +46,7 @@ public interface UniformFinder { Uniform1f findUniform1f(String uniformName); /** - * Sets the value of a uniform declared in json + * Finds a uniform declared in json * * @param uniformName the name of the uniform field in the shader source file */ @@ -54,7 +54,7 @@ public interface UniformFinder { Uniform2f findUniform2f(String uniformName); /** - * Sets the value of a uniform declared in json + * Finds a uniform declared in json * * @param uniformName the name of the uniform field in the shader source file */ @@ -62,7 +62,7 @@ public interface UniformFinder { Uniform3f findUniform3f(String uniformName); /** - * Sets the value of a uniform declared in json + * Finds a uniform declared in json * * @param uniformName the name of the uniform field in the shader source file */ @@ -70,19 +70,11 @@ public interface UniformFinder { Uniform4f findUniform4f(String uniformName); /** - * Sets the value of a uniform declared in json + * Finds a uniform declared in json * * @param uniformName the name of the uniform field in the shader source file */ @API(status = EXPERIMENTAL, since = "1.3.0") UniformMat4 findUniformMat4(String uniformName); - /** - * Sets the value of a sampler uniform declared in json - * - * @param samplerName the name of the sampler uniform field in the shader source file and json - */ - @API(status = EXPERIMENTAL, since = "1.3.0") - SamplerUniform findSamplerUniform(String samplerName); - } diff --git a/src/main/java/ladysnake/satin/impl/ManagedUniform.java b/src/main/java/ladysnake/satin/impl/ManagedUniform.java index 66fd8ea..241131a 100644 --- a/src/main/java/ladysnake/satin/impl/ManagedUniform.java +++ b/src/main/java/ladysnake/satin/impl/ManagedUniform.java @@ -1,5 +1,137 @@ package ladysnake.satin.impl; -public final class ManagedUniform { +import ladysnake.satin.api.experimental.managed.*; +import net.minecraft.client.gl.GlUniform; +import net.minecraft.client.gl.PostProcessShader; +import net.minecraft.client.util.math.Matrix4f; + +import java.util.List; +import java.util.Objects; + +public final class ManagedUniform implements + Uniform1i, Uniform2i, Uniform3i, Uniform4i, + Uniform1f, Uniform2f, Uniform3f, Uniform4f, + UniformMat4 { + + private GlUniform[] targets; + private final String name; + private int i0, i1, i2, i3; + private float f0, f1, f2, f3; + + public ManagedUniform(String name) { + this.name = name; + } + + public int findUniformTargets(List shaders) { + this.targets = shaders.stream() + .map(PostProcessShader::getProgram) + .map(s -> s.getUniformByName(this.name)) + .filter(Objects::nonNull) + .toArray(GlUniform[]::new); + return this.targets.length; + } + + public String getName() { + return name; + } + + @Override + public void set(int value) { + if (i0 != value) { + for (GlUniform target : this.targets) { + target.set(value); + } + i0 = value; + } + } + + @Override + public void set(int value0, int value1) { + if (i0 != value0 || i1 != value1) { + for (GlUniform target : this.targets) { + target.set(value0, value1); + } + i0 = value0; + i1 = value1; + } + } + + @Override + public void set(int value0, int value1, int value2) { + if (i0 != value0 || i1 != value1 || i2 != value2) { + for (GlUniform target : this.targets) { + target.set(value0, value1, value2); + } + i0 = value0; + i1 = value1; + i2 = value2; + } + } + + @Override + public void set(int value0, int value1, int value2, int value3) { + if (i0 != value0 || i1 != value1 || i2 != value2 || i3 != value3) { + for (GlUniform target : this.targets) { + target.set(value0, value1, value2, value3); + } + i0 = value0; + i1 = value1; + i2 = value2; + i3 = value3; + } + } + + @Override + public void set(float value) { + if (f0 != value) { + for (GlUniform target : this.targets) { + target.set(value); + } + f0 = value; + } + } + + @Override + public void set(float value0, float value1) { + if (f0 != value0 || f1 != value1) { + for (GlUniform target : this.targets) { + target.set(value0, value1); + } + f0 = value0; + f1 = value1; + } + } + + @Override + public void set(float value0, float value1, float value2) { + if (f0 != value0 || f1 != value1 || f2 != value2) { + for (GlUniform target : this.targets) { + target.set(value0, value1, value2); + } + f0 = value0; + f1 = value1; + f2 = value2; + } + } + + @Override + public void set(float value0, float value1, float value2, float value3) { + if (f0 != value0 || f1 != value1 || f2 != value2 || f3 != value3) { + for (GlUniform target : this.targets) { + target.set(value0, value1, value2, value3); + } + f0 = value0; + f1 = value1; + f2 = value2; + f3 = value3; + } + } + + @Override + public void set(Matrix4f value) { + for (GlUniform target : this.targets) { + target.set(value); + } + } } diff --git a/src/main/java/ladysnake/satin/impl/ResettableManagedShaderEffect.java b/src/main/java/ladysnake/satin/impl/ResettableManagedShaderEffect.java index 1e70838..1d4f757 100644 --- a/src/main/java/ladysnake/satin/impl/ResettableManagedShaderEffect.java +++ b/src/main/java/ladysnake/satin/impl/ResettableManagedShaderEffect.java @@ -20,6 +20,8 @@ import javax.annotation.CheckForNull; import javax.annotation.Nullable; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import java.util.function.Consumer; import static org.apiguardian.api.API.Status.INTERNAL; @@ -42,6 +44,7 @@ public final class ResettableManagedShaderEffect implements ManagedShaderEffect @CheckForNull private ShaderEffect shaderGroup; private boolean errored; + private final Map managedUniforms = new HashMap<>(); /** * Creates a new shader effect.
@@ -90,9 +93,19 @@ public void initialize() throws IOException { public void setup(int windowWidth, int windowHeight) { Preconditions.checkNotNull(shaderGroup); this.shaderGroup.setupDimensions(windowWidth, windowHeight); + for (ManagedUniform uniform : this.managedUniforms.values()) { + setupUniform(uniform, shaderGroup); + } this.initCallback.accept(this); } + private void setupUniform(ManagedUniform uniform, ShaderEffect shaderEffect) { + int found = uniform.findUniformTargets(((AccessiblePassesShaderEffect) shaderEffect).satin$getPasses()); + if (found == 0) { + Satin.LOGGER.warn("[Satin] No uniform found with name {} in shader {}", uniform.getName(), this.location); + } + } + /** * {@inheritDoc} */ @@ -305,54 +318,59 @@ private void setSamplerUniform(String samplerName, Object texture) { } } + private ManagedUniform manageUniform(String uniformName) { + return this.managedUniforms.computeIfAbsent(uniformName, name -> { + ManagedUniform ret = new ManagedUniform(name); + if (this.shaderGroup != null) { + setupUniform(ret, shaderGroup); + } + return ret; + }); + } + @Override public Uniform1i findUniform1i(String uniformName) { - return null; + return manageUniform(uniformName); } @Override public Uniform2i findUniform2i(String uniformName) { - return null; + return manageUniform(uniformName); } @Override public Uniform3i findUniform3i(String uniformName) { - return null; + return manageUniform(uniformName); } @Override public Uniform4i findUniform4i(String uniformName) { - return null; + return manageUniform(uniformName); } @Override public Uniform1f findUniform1f(String uniformName) { - return null; + return manageUniform(uniformName); } @Override public Uniform2f findUniform2f(String uniformName) { - return null; + return manageUniform(uniformName); } @Override public Uniform3f findUniform3f(String uniformName) { - return null; + return manageUniform(uniformName); } @Override public Uniform4f findUniform4f(String uniformName) { - return null; + return manageUniform(uniformName); } @Override public UniformMat4 findUniformMat4(String uniformName) { - return null; - } - - @Override - public SamplerUniform findSamplerUniform(String samplerName) { - return null; + return manageUniform(uniformName); } /** diff --git a/test_mods/depth/src/main/java/ladysnake/satindepthtest/DepthFx.java b/test_mods/depth/src/main/java/ladysnake/satindepthtest/DepthFx.java index 66dec61..963a754 100644 --- a/test_mods/depth/src/main/java/ladysnake/satindepthtest/DepthFx.java +++ b/test_mods/depth/src/main/java/ladysnake/satindepthtest/DepthFx.java @@ -2,6 +2,9 @@ import ladysnake.satin.api.event.PostWorldRenderCallback; import ladysnake.satin.api.experimental.ReadableDepthFramebuffer; +import ladysnake.satin.api.experimental.managed.Uniform1f; +import ladysnake.satin.api.experimental.managed.Uniform3f; +import ladysnake.satin.api.experimental.managed.UniformMat4; import ladysnake.satin.api.managed.ManagedShaderEffect; import ladysnake.satin.api.managed.ShaderEffectManager; import ladysnake.satin.api.util.GlMatrices; @@ -28,6 +31,10 @@ public class DepthFx implements PostWorldRenderCallback, ClientTickCallback { shader.setSamplerUniform("DepthSampler", ((ReadableDepthFramebuffer)mc.getFramebuffer()).getStillDepthMap()); shader.setUniformValue("ViewPort", 0, 0, mc.window.getFramebufferWidth(), mc.window.getFramebufferHeight()); }); + private final Uniform1f uniformSTime = testShader.findUniform1f("STime"); + private final UniformMat4 uniformInverseTransformMatrix = testShader.findUniformMat4("InverseTransformMatrix"); + private final Uniform3f uniformCameraPosition = testShader.findUniform3f("CameraPosition"); + private final Uniform3f uniformCenter = testShader.findUniform3f("Center"); // fancy shader stuff private Matrix4f projectionMatrix = new Matrix4f(); @@ -51,17 +58,17 @@ public void tick(MinecraftClient minecraftClient) { public void onWorldRendered(Camera camera, float tickDelta, long nanoTime) { MinecraftClient mc = MinecraftClient.getInstance(); if (isWorldNight(mc.player)) { - testShader.setUniformValue("STime", (ticks + tickDelta) / 20f); - testShader.setUniformValue("InverseTransformMatrix", GlMatrices.getInverseTransformMatrix(projectionMatrix)); + uniformSTime.set((ticks + tickDelta) / 20f); + uniformInverseTransformMatrix.set(GlMatrices.getInverseTransformMatrix(projectionMatrix)); Vec3d cameraPos = camera.getPos(); - testShader.setUniformValue("CameraPosition", (float)cameraPos.x, (float)cameraPos.y, (float)cameraPos.z); + uniformCameraPosition.set((float)cameraPos.x, (float)cameraPos.y, (float)cameraPos.z); Entity e = camera.getFocusedEntity(); - testShader.setUniformValue("Center", lerp(e.x, e.prevX, tickDelta), lerp(e.y, e.prevY, tickDelta), lerp(e.z, e.prevZ, tickDelta)); + uniformCenter.set(lerpf(e.x, e.prevX, tickDelta), lerpf(e.y, e.prevY, tickDelta), lerpf(e.z, e.prevZ, tickDelta)); testShader.render(tickDelta); } } - private static float lerp(double n, double prevN, float tickDelta) { + private static float lerpf(double n, double prevN, float tickDelta) { return (float) MathHelper.lerp(tickDelta, prevN, n); } }