From 80d08dbf3a8e0341962c23dc4737b9af289ef7de Mon Sep 17 00:00:00 2001 From: gigaherz Date: Thu, 29 Jul 2021 17:17:05 +0200 Subject: [PATCH] Introduce RegisterShadersEvent to register shaders with the proper timing (runs every client resource reload). Fix ShaderInstance to allow resourcelocations with namespaces as input. Fix shader parsing to respect resource domains. Fix ForgeRenderTypes to use the right shader in each situation. Add custom forge shader for unlit translucent entity rendering, equivalent to the vanilla entity translucent shader. --- .../client/renderer/GameRenderer.java.patch | 8 ++ .../client/renderer/ShaderInstance.java.patch | 31 ++++++ .../client/ForgeHooksClient.java | 28 +++++- .../client/ForgeRenderTypes.java | 99 ++++++++++++------- .../client/event/RegisterShadersEvent.java | 51 ++++++++++ .../rendertype_entity_unlit_translucent.fsh | 30 ++++++ .../rendertype_entity_unlit_translucent.json | 30 ++++++ .../rendertype_entity_unlit_translucent.vsh | 32 ++++++ src/main/resources/forge.exc | 1 + 9 files changed, 273 insertions(+), 37 deletions(-) create mode 100644 patches/minecraft/net/minecraft/client/renderer/ShaderInstance.java.patch create mode 100644 src/main/java/net/minecraftforge/client/event/RegisterShadersEvent.java create mode 100644 src/main/resources/assets/forge/shaders/core/rendertype_entity_unlit_translucent.fsh create mode 100644 src/main/resources/assets/forge/shaders/core/rendertype_entity_unlit_translucent.json create mode 100644 src/main/resources/assets/forge/shaders/core/rendertype_entity_unlit_translucent.vsh diff --git a/patches/minecraft/net/minecraft/client/renderer/GameRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/GameRenderer.java.patch index 747752c69d..779bfaca8d 100644 --- a/patches/minecraft/net/minecraft/client/renderer/GameRenderer.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/GameRenderer.java.patch @@ -9,6 +9,14 @@ } } +@@ -541,6 +_,7 @@ + list1.add(Pair.of(new ShaderInstance(p_172768_, "rendertype_crumbling", DefaultVertexFormat.f_85811_), (p_172733_) -> { + f_172607_ = p_172733_; + })); ++ net.minecraftforge.fml.ModLoader.get().postEvent(new net.minecraftforge.client.event.RegisterShadersEvent(p_172768_, list1)); + } catch (IOException ioexception) { + list1.forEach((p_172772_) -> { + p_172772_.getFirst().close(); @@ -703,7 +_,7 @@ d0 *= (double)Mth.m_14179_(this.f_109059_.f_91066_.f_92070_, 1.0F, 0.85714287F); } diff --git a/patches/minecraft/net/minecraft/client/renderer/ShaderInstance.java.patch b/patches/minecraft/net/minecraft/client/renderer/ShaderInstance.java.patch new file mode 100644 index 0000000000..efbb139bfd --- /dev/null +++ b/patches/minecraft/net/minecraft/client/renderer/ShaderInstance.java.patch @@ -0,0 +1,31 @@ +--- a/net/minecraft/client/renderer/ShaderInstance.java ++++ b/net/minecraft/client/renderer/ShaderInstance.java +@@ -91,10 +_,14 @@ + @Nullable + public final Uniform f_173320_; + ++ @Deprecated // FORGE: Use the ResourceLocation variant below + public ShaderInstance(ResourceProvider p_173336_, String p_173337_, VertexFormat p_173338_) throws IOException { +- this.f_173300_ = p_173337_; ++ this(p_173336_, new ResourceLocation(p_173337_), p_173338_); ++ } ++ public ShaderInstance(ResourceProvider p_173336_, ResourceLocation shaderLocation, VertexFormat p_173338_) throws IOException { ++ this.f_173300_ = shaderLocation.m_135827_().equals("minecraft") ? shaderLocation.m_135815_() : shaderLocation.toString(); + this.f_173307_ = p_173338_; +- ResourceLocation resourcelocation = new ResourceLocation("shaders/core/" + p_173337_ + ".json"); ++ ResourceLocation resourcelocation = new ResourceLocation(shaderLocation.m_135827_(), "shaders/core/" + shaderLocation.m_135815_() + ".json"); + Resource resource = null; + + try { +@@ -202,8 +_,9 @@ + Program program1 = p_173342_.m_85570_().get(p_173343_); + Program program; + if (program1 == null) { +- String s = "shaders/core/" + p_173343_ + p_173342_.m_85569_(); +- ResourceLocation resourcelocation = new ResourceLocation(s); ++ ResourceLocation loc = new ResourceLocation(p_173343_); ++ String s = "shaders/core/" + loc.m_135815_() + p_173342_.m_85569_(); ++ ResourceLocation resourcelocation = new ResourceLocation(loc.m_135827_(), s); + Resource resource = p_173341_.m_142591_(resourcelocation); + final String s1 = FileUtil.m_179922_(s); + diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index 9652e4d094..ed90e65742 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -21,8 +21,7 @@ package net.minecraftforge.client; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.*; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.builders.LayerDefinition; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -52,8 +51,6 @@ import net.minecraft.client.resources.model.Material; import net.minecraft.client.renderer.texture.TextureAtlas; import com.mojang.blaze3d.platform.NativeImage; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import com.mojang.blaze3d.vertex.VertexFormat; -import com.mojang.blaze3d.vertex.VertexFormatElement; import com.mojang.blaze3d.vertex.VertexFormatElement.Usage; import net.minecraft.client.resources.language.I18n; import net.minecraft.client.KeyMapping; @@ -87,6 +84,7 @@ import net.minecraft.world.level.GameType; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.levelgen.WorldGenSettings; +import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.*; import net.minecraftforge.client.event.sound.PlaySoundEvent; import net.minecraftforge.client.model.ModelLoader; @@ -96,8 +94,10 @@ import net.minecraftforge.common.ForgeMod; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.model.TransformationHelper; import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModLoader; import net.minecraftforge.fml.VersionChecker; +import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fmlclient.registry.ClientRegistry; import net.minecraftforge.fml.StartupMessageManager; import net.minecraftforge.registries.ForgeRegistries; @@ -113,6 +113,7 @@ import org.lwjgl.opengl.GL13; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.File; +import java.io.IOException; import java.lang.reflect.Field; import java.nio.Buffer; import java.nio.ByteBuffer; @@ -859,4 +860,23 @@ public class ForgeHooksClient layerDefinitions.forEach((k, v) -> builder.put(k, v.get())); } + @Mod.EventBusSubscriber(value = Dist.CLIENT, modid="forge", bus= Mod.EventBusSubscriber.Bus.MOD) + public static class ClientEvents + { + @Nullable + private static ShaderInstance rendertypeEntityTranslucentUnlitShader; + + public static ShaderInstance getEntityTranslucentUnlitShader() + { + return Objects.requireNonNull(rendertypeEntityTranslucentUnlitShader, "Attempted to call getEntityTranslucentUnlitShader before shaders have finished loading."); + } + + @SubscribeEvent + public static void registerShaders(RegisterShadersEvent event) throws IOException + { + event.registerShader(new ShaderInstance(event.getResourceManager(), new ResourceLocation("forge","rendertype_entity_unlit_translucent"), DefaultVertexFormat.NEW_ENTITY), (p_172645_) -> { + rendertypeEntityTranslucentUnlitShader = p_172645_; + }); + } + } } diff --git a/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java b/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java index ee8f0206de..1ca82d2240 100644 --- a/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java +++ b/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java @@ -20,18 +20,31 @@ package net.minecraftforge.client; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.datafixers.util.Pair; +import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderStateShard.TextureStateShard; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.client.renderer.texture.TextureAtlas; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraftforge.client.event.RegisterShadersEvent; import net.minecraftforge.common.util.NonNullLazy; import net.minecraftforge.common.util.NonNullSupplier; +import net.minecraftforge.eventbus.api.SubscribeEvent; import org.lwjgl.opengl.GL11; + +import javax.annotation.Nullable; +import java.io.IOException; +import java.util.List; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Supplier; @SuppressWarnings("deprecation") @@ -52,7 +65,7 @@ public enum ForgeRenderTypes */ public static RenderType getItemLayeredSolid(ResourceLocation textureLocation) { - return Internal.layeredItemSolid(textureLocation); + return Internal.LAYERED_ITEM_SOLID.apply(textureLocation); } /** @@ -60,7 +73,7 @@ public enum ForgeRenderTypes */ public static RenderType getItemLayeredCutout(ResourceLocation textureLocation) { - return Internal.layeredItemCutout(textureLocation); + return Internal.LAYERED_ITEM_CUTOUT.apply(textureLocation); } /** @@ -68,7 +81,7 @@ public enum ForgeRenderTypes */ public static RenderType getItemLayeredCutoutMipped(ResourceLocation textureLocation) { - return Internal.layeredItemCutoutMipped(textureLocation); + return Internal.LAYERED_ITEM_CUTOUT_MIPPED.apply(textureLocation); } /** @@ -76,7 +89,7 @@ public enum ForgeRenderTypes */ public static RenderType getItemLayeredTranslucent(ResourceLocation textureLocation) { - return Internal.layeredItemTranslucent(textureLocation); + return Internal.LAYERED_ITEM_TRANSLUCENT.apply(textureLocation); } /** @@ -84,7 +97,7 @@ public enum ForgeRenderTypes */ public static RenderType getUnsortedTranslucent(ResourceLocation textureLocation) { - return Internal.unsortedTranslucent(textureLocation); + return Internal.UNSORTED_TRANSLUCENT.apply(textureLocation); } /** @@ -93,7 +106,7 @@ public enum ForgeRenderTypes */ public static RenderType getUnlitTranslucent(ResourceLocation textureLocation) { - return getUnlitTranslucent(textureLocation, true); + return Internal.UNLIT_TRANSLUCENT_SORTED.apply(textureLocation); } /** @@ -103,31 +116,31 @@ public enum ForgeRenderTypes */ public static RenderType getUnlitTranslucent(ResourceLocation textureLocation, boolean sortingEnabled) { - return Internal.unlitTranslucent(textureLocation, sortingEnabled); + return (sortingEnabled ? Internal.UNLIT_TRANSLUCENT_SORTED : Internal.UNLIT_TRANSLUCENT_UNSORTED).apply(textureLocation); } /** - * @return Same as {@link RenderType#getEntityCutout(ResourceLocation)}, but with mipmapping enabled. + * @return Same as {@link RenderType#entityCutout(ResourceLocation)}, but with mipmapping enabled. */ public static RenderType getEntityCutoutMipped(ResourceLocation textureLocation) { - return Internal.layeredItemCutoutMipped(textureLocation); + return Internal.LAYERED_ITEM_CUTOUT_MIPPED.apply(textureLocation); } /** - * @return Replacement of {@link RenderType#getText(ResourceLocation)}, but with optional linear texture filtering. + * @return Replacement of {@link RenderType#text(ResourceLocation)}, but with optional linear texture filtering. */ public static RenderType getText(ResourceLocation locationIn) { - return Internal.getText(locationIn); + return Internal.TEXT.apply(locationIn); } /** - * @return Replacement of {@link RenderType#getTextSeeThrough(ResourceLocation)}, but with optional linear texture filtering. + * @return Replacement of {@link RenderType#textSeeThrough(ResourceLocation)}, but with optional linear texture filtering. */ public static RenderType getTextSeeThrough(ResourceLocation locationIn) { - return Internal.getTextSeeThrough(locationIn); + return Internal.TEXT_SEETHROUGH.apply(locationIn); } // ---------------------------------------- @@ -147,22 +160,25 @@ public enum ForgeRenderTypes return renderTypeSupplier.get(); } + private static class Internal extends RenderType { + private static final ShaderStateShard RENDERTYPE_ENTITY_TRANSLUCENT_UNLIT_SHADER = new ShaderStateShard(ForgeHooksClient.ClientEvents::getEntityTranslucentUnlitShader); + private Internal(String name, VertexFormat fmt, VertexFormat.Mode glMode, int size, boolean doCrumbling, boolean depthSorting, Runnable onEnable, Runnable onDisable) { super(name, fmt, glMode, size, doCrumbling, depthSorting, onEnable, onDisable); throw new IllegalStateException("This class must not be instantiated"); } - public static RenderType unsortedTranslucent(ResourceLocation textureLocation) + public static Function UNSORTED_TRANSLUCENT = Util.memoize(Internal::unsortedTranslucent); + private static RenderType unsortedTranslucent(ResourceLocation textureLocation) { final boolean sortingEnabled = false; CompositeState renderState = CompositeState.builder() + .setShaderState(RenderType.RENDERTYPE_ENTITY_TRANSLUCENT_SHADER) .setTextureState(new TextureStateShard(textureLocation, false, false)) .setTransparencyState(TRANSLUCENT_TRANSPARENCY) -// .setDiffuseLightingState(DIFFUSE_LIGHTING) //TODO -// .setAlphaState(DEFAULT_ALPHA) //TODO .setCullState(NO_CULL) .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) @@ -170,12 +186,26 @@ public enum ForgeRenderTypes return create("forge_entity_unsorted_translucent", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, sortingEnabled, renderState); } - public static RenderType unlitTranslucent(ResourceLocation textureLocation, boolean sortingEnabled) + private static final BiFunction ENTITY_TRANSLUCENT = Util.memoize((p_173227_, p_173228_) -> { + RenderType.CompositeState rendertype$compositestate = RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_SHADER) + .setTextureState(new RenderStateShard.TextureStateShard(p_173227_, false, false)) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setCullState(NO_CULL) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(p_173228_); + return create("entity_translucent", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, true, rendertype$compositestate); + }); + + public static Function UNLIT_TRANSLUCENT_SORTED = Util.memoize(tex -> Internal.unlitTranslucent(tex, true)); + public static Function UNLIT_TRANSLUCENT_UNSORTED = Util.memoize(tex -> Internal.unlitTranslucent(tex, false)); + private static RenderType unlitTranslucent(ResourceLocation textureLocation, boolean sortingEnabled) { CompositeState renderState = CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_UNLIT_SHADER) .setTextureState(new TextureStateShard(textureLocation, false, false)) .setTransparencyState(TRANSLUCENT_TRANSPARENCY) -// .setAlphaState(DEFAULT_ALPHA) //TODO .setCullState(NO_CULL) .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) @@ -183,67 +213,70 @@ public enum ForgeRenderTypes return create("forge_entity_unlit_translucent", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, sortingEnabled, renderState); } - public static RenderType layeredItemSolid(ResourceLocation locationIn) { + public static Function LAYERED_ITEM_SOLID = Util.memoize(Internal::layeredItemSolid); + private static RenderType layeredItemSolid(ResourceLocation locationIn) { RenderType.CompositeState rendertype$state = RenderType.CompositeState.builder() + .setShaderState(RenderType.RENDERTYPE_ENTITY_SOLID_SHADER) .setTextureState(new RenderStateShard.TextureStateShard(locationIn, false, false)) .setTransparencyState(NO_TRANSPARENCY) -// .setDiffuseLightingState(DIFFUSE_LIGHTING) //TODO .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) .createCompositeState(true); return create("forge_item_entity_solid", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, false, rendertype$state); } - public static RenderType layeredItemCutout(ResourceLocation locationIn) { + public static Function LAYERED_ITEM_CUTOUT = Util.memoize(Internal::layeredItemCutout); + private static RenderType layeredItemCutout(ResourceLocation locationIn) { RenderType.CompositeState rendertype$state = RenderType.CompositeState.builder() + .setShaderState(RenderType.RENDERTYPE_ENTITY_CUTOUT_SHADER) .setTextureState(new RenderStateShard.TextureStateShard(locationIn, false, false)) .setTransparencyState(NO_TRANSPARENCY) -// .setDiffuseLightingState(DIFFUSE_LIGHTING) //TODO -// .setAlphaState(DEFAULT_ALPHA) //TODO .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) .createCompositeState(true); return create("forge_item_entity_cutout", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, false, rendertype$state); } - public static RenderType layeredItemCutoutMipped(ResourceLocation locationIn) { + public static Function LAYERED_ITEM_CUTOUT_MIPPED = Util.memoize(Internal::layeredItemCutoutMipped); + private static RenderType layeredItemCutoutMipped(ResourceLocation locationIn) { RenderType.CompositeState rendertype$state = RenderType.CompositeState.builder() + .setShaderState(RenderType.RENDERTYPE_ENTITY_SMOOTH_CUTOUT_SHADER) .setTextureState(new RenderStateShard.TextureStateShard(locationIn, false, true)) .setTransparencyState(NO_TRANSPARENCY) -// .setDiffuseLightingState(DIFFUSE_LIGHTING) //TODO -// .setAlphaState(DEFAULT_ALPHA) //TODO .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) .createCompositeState(true); return create("forge_item_entity_cutout_mipped", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, false, rendertype$state); } - public static RenderType layeredItemTranslucent(ResourceLocation locationIn) { + public static Function LAYERED_ITEM_TRANSLUCENT = Util.memoize(Internal::layeredItemTranslucent); + private static RenderType layeredItemTranslucent(ResourceLocation locationIn) { RenderType.CompositeState rendertype$state = RenderType.CompositeState.builder() + .setShaderState(RenderType.RENDERTYPE_ENTITY_TRANSLUCENT_SHADER) .setTextureState(new RenderStateShard.TextureStateShard(locationIn, false, false)) .setTransparencyState(TRANSLUCENT_TRANSPARENCY) -// .setDiffuseLightingState(DIFFUSE_LIGHTING) //TODO -// .setAlphaState(DEFAULT_ALPHA) //TODO .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) .createCompositeState(true); return create("forge_item_entity_translucent_cull", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, true, rendertype$state); } - public static RenderType getText(ResourceLocation locationIn) { + public static Function TEXT = Util.memoize(Internal::getText); + private static RenderType getText(ResourceLocation locationIn) { RenderType.CompositeState rendertype$state = RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_TEXT_SHADER) .setTextureState(new CustomizableTextureState(locationIn, () -> ForgeRenderTypes.enableTextTextureLinearFiltering, () -> false)) -// .setAlphaState(DEFAULT_ALPHA) //TODO .setTransparencyState(TRANSLUCENT_TRANSPARENCY) .setLightmapState(LIGHTMAP) .createCompositeState(false); return create("forge_text", DefaultVertexFormat.POSITION_COLOR_TEX_LIGHTMAP, VertexFormat.Mode.QUADS, 256, false, true, rendertype$state); } - public static RenderType getTextSeeThrough(ResourceLocation locationIn) { + public static Function TEXT_SEETHROUGH = Util.memoize(Internal::getTextSeeThrough); + private static RenderType getTextSeeThrough(ResourceLocation locationIn) { RenderType.CompositeState rendertype$state = RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_TEXT_SHADER) .setTextureState(new CustomizableTextureState(locationIn, () -> ForgeRenderTypes.enableTextTextureLinearFiltering, () -> false)) -// .setAlphaState(DEFAULT_ALPHA) //TODO .setTransparencyState(TRANSLUCENT_TRANSPARENCY) .setLightmapState(LIGHTMAP) .setDepthTestState(NO_DEPTH_TEST) diff --git a/src/main/java/net/minecraftforge/client/event/RegisterShadersEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterShadersEvent.java new file mode 100644 index 0000000000..b9e7b1f94c --- /dev/null +++ b/src/main/java/net/minecraftforge/client/event/RegisterShadersEvent.java @@ -0,0 +1,51 @@ +/* + * Minecraft Forge + * Copyright (c) 2016-2021. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package net.minecraftforge.client.event; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.event.IModBusEvent; + +import java.util.List; +import java.util.function.Consumer; + +public class RegisterShadersEvent extends Event implements IModBusEvent +{ + private final ResourceManager resourceManager; + private final List>> shaderList; + + public RegisterShadersEvent(ResourceManager resourceManager, List>> shaderList) + { + this.resourceManager = resourceManager; + this.shaderList = shaderList; + } + + public ResourceManager getResourceManager() + { + return resourceManager; + } + + public void registerShader(ShaderInstance shaderInstance, Consumer onLoaded) + { + shaderList.add(Pair.of(shaderInstance, onLoaded)); + } +} diff --git a/src/main/resources/assets/forge/shaders/core/rendertype_entity_unlit_translucent.fsh b/src/main/resources/assets/forge/shaders/core/rendertype_entity_unlit_translucent.fsh new file mode 100644 index 0000000000..9f35ffb944 --- /dev/null +++ b/src/main/resources/assets/forge/shaders/core/rendertype_entity_unlit_translucent.fsh @@ -0,0 +1,30 @@ +#version 150 + +#moj_import + +uniform sampler2D Sampler0; + +uniform vec4 ColorModulator; +uniform float FogStart; +uniform float FogEnd; +uniform vec4 FogColor; + +in float vertexDistance; +in vec4 vertexColor; +in vec4 lightMapColor; +in vec4 overlayColor; +in vec2 texCoord0; +in vec4 normal; + +out vec4 fragColor; + +void main() { + vec4 color = texture(Sampler0, texCoord0); + if (color.a < 0.1) { + discard; + } + color *= vertexColor * ColorModulator; + color.rgb = mix(overlayColor.rgb, color.rgb, overlayColor.a); + color *= lightMapColor; + fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); +} diff --git a/src/main/resources/assets/forge/shaders/core/rendertype_entity_unlit_translucent.json b/src/main/resources/assets/forge/shaders/core/rendertype_entity_unlit_translucent.json new file mode 100644 index 0000000000..687ca93abc --- /dev/null +++ b/src/main/resources/assets/forge/shaders/core/rendertype_entity_unlit_translucent.json @@ -0,0 +1,30 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "forge:rendertype_entity_unlit_translucent", + "fragment": "forge:rendertype_entity_unlit_translucent", + "attributes": [ + "Position", + "Color", + "UV0", + "UV1", + "UV2", + "Normal" + ], + "samplers": [ + { "name": "Sampler0" }, + { "name": "Sampler1" }, + { "name": "Sampler2" } + ], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, + { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] } + ] +} diff --git a/src/main/resources/assets/forge/shaders/core/rendertype_entity_unlit_translucent.vsh b/src/main/resources/assets/forge/shaders/core/rendertype_entity_unlit_translucent.vsh new file mode 100644 index 0000000000..6ce597e235 --- /dev/null +++ b/src/main/resources/assets/forge/shaders/core/rendertype_entity_unlit_translucent.vsh @@ -0,0 +1,32 @@ +#version 150 + +in vec3 Position; +in vec4 Color; +in vec2 UV0; +in ivec2 UV1; +in ivec2 UV2; +in vec3 Normal; + +uniform sampler2D Sampler1; +uniform sampler2D Sampler2; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +out float vertexDistance; +out vec4 vertexColor; +out vec4 lightMapColor; +out vec4 overlayColor; +out vec2 texCoord0; +out vec4 normal; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + + vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz); + vertexColor = Color; + lightMapColor = texelFetch(Sampler2, UV2 / 16, 0); + overlayColor = texelFetch(Sampler1, UV1, 0); + texCoord0 = UV0; + normal = ProjMat * ModelViewMat * vec4(Normal, 0.0); +} diff --git a/src/main/resources/forge.exc b/src/main/resources/forge.exc index 525ea1ddf4..9e3d3282ca 100644 --- a/src/main/resources/forge.exc +++ b/src/main/resources/forge.exc @@ -2,6 +2,7 @@ net/minecraft/client/gui/screens/MenuScreens.getScreenFactory(Lnet/minecraft/wor net/minecraft/client/gui/screens/Screen.renderToolTip(Lcom/mojang/blaze3d/vertex/PoseStack;Ljava/util/List;IILnet/minecraft/client/gui/Font;)V=|p_96618_,p_96619_,p_96620_,p_96621_,font net/minecraft/client/renderer/FogRenderer.setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZF)V=|p_109025_,p_109026_,p_109027_,p_109028_,partialTicks net/minecraft/client/renderer/ScreenEffectRenderer.getOverlayBlock(Lnet/minecraft/world/entity/player/Player;)Lorg/apache/commons/lang3/tuple/Pair;=|p_110717_ +net/minecraft/client/renderer/ShaderInstance.(Lnet/minecraft/server/packs/resources/ResourceProvider;Lnet/minecraft/resources/ResourceLocation;Lcom/mojang/blaze3d/vertex/VertexFormat;)V=|p_173336_,shaderLocation,p_173338_ net/minecraft/client/renderer/block/BlockModelShaper.getTexture(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;=|p_110883_,level,pos net/minecraft/client/renderer/block/model/BlockModel.bakeVanilla(Lnet/minecraft/client/resources/model/ModelBakery;Lnet/minecraft/client/renderer/block/model/BlockModel;Ljava/util/function/Function;Lnet/minecraft/client/resources/model/ModelState;Lnet/minecraft/resources/ResourceLocation;Z)Lnet/minecraft/client/resources/model/BakedModel;=|p_111450_,p_111451_,p_111452_,p_111453_,p_111454_,p_111455_ net/minecraft/client/renderer/chunk/ChunkRenderDispatcher$RenderChunk$ChunkCompileTask.(Lnet/minecraft/client/renderer/chunk/ChunkRenderDispatcher$RenderChunk;Lnet/minecraft/world/level/ChunkPos;D)V=|p_112851_,pos,p_112852_