From 84ae9ae2d03520f5edddacdf0472374c45a32098 Mon Sep 17 00:00:00 2001 From: Ocelot Date: Wed, 8 Jan 2025 13:59:34 -0700 Subject: [PATCH] Added render time uniform --- .../render/post/stage/BlitPostStage.java | 6 +- .../shader/program/MutableUniformAccess.java | 33 --- .../shader/program/TextureUniformAccess.java | 12 +- .../VeilShaderDefinitionResourceRenderer.java | 190 ------------------ .../client/PipelineShaderInstanceMixin.java | 5 + 5 files changed, 10 insertions(+), 236 deletions(-) delete mode 100644 common/src/main/java/foundry/veil/impl/resource/renderer/VeilShaderDefinitionResourceRenderer.java diff --git a/common/src/main/java/foundry/veil/api/client/render/post/stage/BlitPostStage.java b/common/src/main/java/foundry/veil/api/client/render/post/stage/BlitPostStage.java index 72fca2b7..6c5b498a 100644 --- a/common/src/main/java/foundry/veil/api/client/render/post/stage/BlitPostStage.java +++ b/common/src/main/java/foundry/veil/api/client/render/post/stage/BlitPostStage.java @@ -1,5 +1,7 @@ package foundry.veil.api.client.render.post.stage; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -10,6 +12,7 @@ import foundry.veil.api.client.render.framebuffer.VeilFramebuffers; import foundry.veil.api.client.render.post.PostPipeline; import foundry.veil.api.client.render.shader.program.ShaderProgram; +import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; import org.joml.*; @@ -66,10 +69,9 @@ public void apply(Context context) { } shader.bind(); - shader.applyRenderSystem(); - shader.addRenderSystemTextures(); context.applySamplers(shader); this.setupFramebuffer(context, shader); + shader.toShaderInstance().setDefaultUniforms(VertexFormat.Mode.TRIANGLE_STRIP, RenderSystem.getModelViewMatrix(), RenderSystem.getProjectionMatrix(), Minecraft.getInstance().getWindow()); shader.applyShaderSamplers(context, 0); VeilRenderSystem.drawScreenQuad(); context.clearSamplers(shader); diff --git a/common/src/main/java/foundry/veil/api/client/render/shader/program/MutableUniformAccess.java b/common/src/main/java/foundry/veil/api/client/render/shader/program/MutableUniformAccess.java index 73503c54..7bc8eb99 100644 --- a/common/src/main/java/foundry/veil/api/client/render/shader/program/MutableUniformAccess.java +++ b/common/src/main/java/foundry/veil/api/client/render/shader/program/MutableUniformAccess.java @@ -1,10 +1,5 @@ package foundry.veil.api.client.render.shader.program; -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; -import foundry.veil.api.client.render.VeilRenderSystem; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.Direction; import org.joml.*; @@ -19,34 +14,6 @@ public interface MutableUniformAccess extends UniformAccess { Direction[] DIRECTIONS = Direction.values(); - /** - * Sets default uniforms based on what {@link RenderSystem} provides. - */ - default void applyRenderSystem() { - this.setMatrix("ModelViewMat", RenderSystem.getModelViewMatrix()); - this.setMatrix("ProjMat", RenderSystem.getProjectionMatrix()); - this.setVector("ColorModulator", RenderSystem.getShaderColor()); - this.setFloat("GlintAlpha", RenderSystem.getShaderGlintAlpha()); - this.setFloat("FogStart", RenderSystem.getShaderFogStart()); - this.setFloat("FogEnd", RenderSystem.getShaderFogEnd()); - this.setVector("FogColor", RenderSystem.getShaderFogColor()); - this.setInt("FogShape", RenderSystem.getShaderFogShape().getIndex()); - this.setMatrix("TextureMatrix", RenderSystem.getTextureMatrix()); - this.setFloat("GameTime", RenderSystem.getShaderGameTime()); - Window window = Minecraft.getInstance().getWindow(); - this.setVector("ScreenSize", window.getWidth(), window.getHeight()); - this.setVector("Light0_Direction", VeilRenderSystem.getLight0Direction()); - this.setVector("Light1_Direction", VeilRenderSystem.getLight1Direction()); - - // TODO move to uniform block - ClientLevel level = Minecraft.getInstance().level; - if (level != null) { - for (int i = 0; i < DIRECTIONS.length; i++) { - this.setFloat("VeilBlockFaceBrightness[" + i + "]", level.getShade(DIRECTIONS[i], true)); - } - } - } - /** * Sets the binding to use for the specified uniform block. * diff --git a/common/src/main/java/foundry/veil/api/client/render/shader/program/TextureUniformAccess.java b/common/src/main/java/foundry/veil/api/client/render/shader/program/TextureUniformAccess.java index a0b63e4a..6088db65 100644 --- a/common/src/main/java/foundry/veil/api/client/render/shader/program/TextureUniformAccess.java +++ b/common/src/main/java/foundry/veil/api/client/render/shader/program/TextureUniformAccess.java @@ -1,6 +1,5 @@ package foundry.veil.api.client.render.shader.program; -import com.mojang.blaze3d.systems.RenderSystem; import foundry.veil.api.client.render.framebuffer.AdvancedFbo; import foundry.veil.api.client.render.framebuffer.AdvancedFboTextureAttachment; import foundry.veil.api.client.render.shader.texture.ShaderTextureSource; @@ -14,15 +13,6 @@ */ public interface TextureUniformAccess { - /** - * Applies the {@link RenderSystem} textures to Sampler0-Sampler11. - */ - default void addRenderSystemTextures() { - for (int i = 0; i < 12; ++i) { - this.addSampler("Sampler" + i, RenderSystem.getShaderTexture(i)); - } - } - /** * Sets DiffuseSampler0-DiffuseSamplerMax * to the color buffers in the specified framebuffer. @@ -97,7 +87,7 @@ default void applyShaderSamplers(int samplerStart) { /** * Loads the samplers set by {@link #addSampler(CharSequence, int)} into the shader. * - * @param context The context for setting built-in shader samplers or null to ignore normal samplers + * @param context The context for setting built-in shader samplers or null to ignore normal samplers * @param samplerStart The sampler to start binding to */ void applyShaderSamplers(@Nullable ShaderTextureSource.Context context, int samplerStart); diff --git a/common/src/main/java/foundry/veil/impl/resource/renderer/VeilShaderDefinitionResourceRenderer.java b/common/src/main/java/foundry/veil/impl/resource/renderer/VeilShaderDefinitionResourceRenderer.java deleted file mode 100644 index ead7cba8..00000000 --- a/common/src/main/java/foundry/veil/impl/resource/renderer/VeilShaderDefinitionResourceRenderer.java +++ /dev/null @@ -1,190 +0,0 @@ -package foundry.veil.impl.resource.renderer; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; -import foundry.veil.Veil; -import foundry.veil.api.client.imgui.VeilImGuiUtil; -import foundry.veil.api.client.render.CameraMatrices; -import foundry.veil.api.client.render.shader.program.ShaderProgram; -import imgui.ImGui; -import imgui.flag.ImGuiWindowFlags; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.ApiStatus; -import org.joml.Matrix3f; -import org.joml.Matrix4f; -import org.joml.Matrix4fStack; -import org.joml.Vector3f; - -import java.util.Objects; - -@ApiStatus.Internal -public class VeilShaderDefinitionResourceRenderer { - - private static final CameraMatrices CAMERA_MATRICES = new CameraMatrices(); - private static final Matrix4f TRANSFORM_MAT = new Matrix4f(); - private static final Matrix3f NORMAL_MAT = new Matrix3f(); - private static final Vector3f POSITION = new Vector3f(); - private static final Vector3f NORMAL = new Vector3f(); - - private static final ResourceLocation DIRT_TEXTURE = ResourceLocation.withDefaultNamespace("textures/block/dirt.png"); - private static final ResourceLocation WHITE_TEXTURE = Veil.veilPath("textures/special/blank.png"); - - private static ResourceLocation last = null; - private static boolean valid = false; - - static { - CAMERA_MATRICES.getProjectionMatrix().identity(); - CAMERA_MATRICES.getInverseProjectionMatrix().identity(); - - CAMERA_MATRICES.getViewMatrix().identity(); - CAMERA_MATRICES.getInverseViewMatrix().identity(); - CAMERA_MATRICES.getInverseViewRotMatrix().identity(); - - CAMERA_MATRICES.setNearPlane(0.0F); - CAMERA_MATRICES.setFarPlane(1.0F); - CAMERA_MATRICES.getCameraPosition().set(0); - } - - public static void render(ShaderProgram shader, float width, float height) { - VertexFormat format = Objects.requireNonNull(shader.getFormat()); - if (!shader.getName().equals(last)) { - last = shader.getName(); - valid = true; - } - - if (!valid) { - return; - } - - float[] VERTICES = new float[]{ - // Back - -0.5F, -0.5F, -0.5F, - -0.5F, 0.5F, -0.5F, - 0.5F, 0.5F, -0.5F, - 0.5F, -0.5F, -0.5F, - - // Front - 0.5F, -0.5F, 0.5F, - 0.5F, 0.5F, 0.5F, - -0.5F, 0.5F, 0.5F, - -0.5F, -0.5F, 0.5F, - - // Left - -0.5F, -0.5F, 0.5F, - -0.5F, 0.5F, 0.5F, - -0.5F, 0.5F, -0.5F, - -0.5F, -0.5F, -0.5F, - - // Right - 0.5F, -0.5F, -0.5F, - 0.5F, 0.5F, -0.5F, - 0.5F, 0.5F, 0.5F, - 0.5F, -0.5F, 0.5F, - - // Top - -0.5F, 0.5F, -0.5F, - -0.5F, 0.5F, 0.5F, - 0.5F, 0.5F, 0.5F, - 0.5F, 0.5F, -0.5F, - }; - - float[] UVS = { - 0, 0, - 0, 1, - 1, 1, - 1, 0, - }; - - float[] NORMALS = new float[]{ - 0.0F, 0.0F, -1.0F, - 0.0F, 0.0F, 1.0F, - -1.0F, 0.0F, 0.0F, - 1.0F, 0.0F, 0.0F, - 0.0F, 1.0F, 0.0F - }; - - double time = ImGui.getTime(); - float yaw = (float) Math.toRadians(time * 45.0); - float pitch = (float) Math.toRadians(30.0); - - Matrix4f transform = TRANSFORM_MAT.setPerspective((float) Math.toRadians(90.0), width / height, 0.3f, 1000.0f).translate(0, 0, -1).rotateX(pitch).rotateY(yaw); - Matrix3f normalMat = transform.normal(NORMAL_MAT); - - Tesselator tesselator = Tesselator.getInstance(); - MeshData data; - try { - BufferBuilder builder = tesselator.begin(VertexFormat.Mode.QUADS, format); - for (int i = 0; i < VERTICES.length / 3; i++) { - for (VertexFormatElement element : format.getElements()) { - if (element == VertexFormatElement.POSITION) { - transform.transformPosition(VERTICES[i * 3], VERTICES[i * 3 + 1], VERTICES[i * 3 + 2], POSITION); - builder.addVertex(POSITION.x, POSITION.y, POSITION.z); - } else if (element == VertexFormatElement.COLOR) { - builder.setColor(0xFFFFFFFF); - } else if (element == VertexFormatElement.UV0) { - builder.setUv(UVS[(i % 4) * 2], UVS[(i % 4) * 2 + 1]); - } else if (element == VertexFormatElement.UV1) { - builder.setOverlay(OverlayTexture.NO_OVERLAY); - } else if (element == VertexFormatElement.UV2) { - builder.setLight(LightTexture.FULL_BRIGHT); - } else if (element == VertexFormatElement.NORMAL) { - normalMat.transform(NORMALS[i / 4], NORMALS[i / 4 + 1], NORMALS[i / 4 + 2], NORMAL); - builder.setNormal(NORMAL.x, NORMAL.y, NORMAL.z); - } - } - } - - data = builder.build(); - } catch (Exception e) { - valid = false; - tesselator.clear(); - e.printStackTrace(); - return; - } - - if (data == null) { - return; - } - - OverlayTexture overlayTexture = Minecraft.getInstance().gameRenderer.overlayTexture(); - RenderSystem.setShaderTexture(0, DIRT_TEXTURE); - overlayTexture.setupOverlayColor(); - RenderSystem.setShaderTexture(2, WHITE_TEXTURE); - int texture = VeilImGuiUtil.renderArea((int) width, (int) height, fbo -> { - Matrix4fStack stack = RenderSystem.getModelViewStack(); - - stack.pushMatrix(); - stack.identity(); - RenderSystem.applyModelViewMatrix(); - RenderSystem.backupProjectionMatrix(); - RenderSystem.setProjectionMatrix(new Matrix4f(), VertexSorting.ORTHOGRAPHIC_Z); - -// CAMERA_MATRICES.bind(); - shader.bind(); - shader.applyRenderSystem(); - shader.addRenderSystemTextures(); - shader.applyShaderSamplers(0); - shader.setMatrix("NormalMat", NORMAL_MAT); - - BufferUploader.draw(data); - - ShaderProgram.unbind(); -// VeilRenderSystem.renderer().getCameraMatrices().bind(); - - stack.popMatrix(); - RenderSystem.restoreProjectionMatrix(); - RenderSystem.applyModelViewMatrix(); - }); - RenderSystem.setShaderTexture(1, 0); - overlayTexture.teardownOverlayColor(); - RenderSystem.setShaderTexture(2, 0); - - if (ImGui.beginChild("3D View", width + 2, height + 2, false, ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoBackground)) { - ImGui.image(texture, width, height, 0, 1, 1, 0, 1.0F, 1.0F, 1.0F, 1.0F, 1.0F, 1.0F, 1.0F, 0.1F); - } - ImGui.endChild(); - } -} diff --git a/common/src/main/java/foundry/veil/mixin/pipeline/client/PipelineShaderInstanceMixin.java b/common/src/main/java/foundry/veil/mixin/pipeline/client/PipelineShaderInstanceMixin.java index 32e397de..f4b80d4a 100644 --- a/common/src/main/java/foundry/veil/mixin/pipeline/client/PipelineShaderInstanceMixin.java +++ b/common/src/main/java/foundry/veil/mixin/pipeline/client/PipelineShaderInstanceMixin.java @@ -30,6 +30,11 @@ public abstract class PipelineShaderInstanceMixin { @Inject(method = "setDefaultUniforms", at = @At("TAIL")) public void setDefaultUniforms(VertexFormat.Mode mode, Matrix4f projectionMatrix, Matrix4f frustrumMatrix, Window window, CallbackInfo ci) { + Uniform renderTime = this.getUniform("VeilRenderTime"); + if (renderTime != null) { + renderTime.set((System.currentTimeMillis() % 3_600_000) / 1000.0F); + } + Uniform iModelViewMat = this.getUniform("NormalMat"); if (iModelViewMat != null) { iModelViewMat.set(projectionMatrix.normal(new Matrix3f()));