package net.minecraft.client.renderer; import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.platform.GlStateManager.DestFactor; import com.mojang.blaze3d.platform.GlStateManager.LogicOp; import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; import com.mojang.blaze3d.systems.RenderSystem; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.OptionalDouble; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderStateShard.MultiTextureStateShard.Builder; import net.minecraft.client.renderer.RenderStateShard.MultiTextureStateShard.Entry; import net.minecraft.client.renderer.texture.AbstractTexture; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.TriState; import org.joml.Matrix4f; import org.joml.Matrix4fStack; @Environment(EnvType.CLIENT) public abstract class RenderStateShard { public static final double MAX_ENCHANTMENT_GLINT_SPEED_MILLIS = 8.0; protected final String name; private final Runnable setupState; private final Runnable clearState; protected static final RenderStateShard.TransparencyStateShard NO_TRANSPARENCY = new RenderStateShard.TransparencyStateShard( "no_transparency", () -> RenderSystem.disableBlend(), () -> {} ); protected static final RenderStateShard.TransparencyStateShard ADDITIVE_TRANSPARENCY = new RenderStateShard.TransparencyStateShard( "additive_transparency", () -> { RenderSystem.enableBlend(); RenderSystem.blendFunc(SourceFactor.ONE, DestFactor.ONE); }, () -> { RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } ); protected static final RenderStateShard.TransparencyStateShard LIGHTNING_TRANSPARENCY = new RenderStateShard.TransparencyStateShard( "lightning_transparency", () -> { RenderSystem.enableBlend(); RenderSystem.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE); }, () -> { RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } ); protected static final RenderStateShard.TransparencyStateShard GLINT_TRANSPARENCY = new RenderStateShard.TransparencyStateShard("glint_transparency", () -> { RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(SourceFactor.SRC_COLOR, DestFactor.ONE, SourceFactor.ZERO, DestFactor.ONE); }, () -> { RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); }); protected static final RenderStateShard.TransparencyStateShard CRUMBLING_TRANSPARENCY = new RenderStateShard.TransparencyStateShard( "crumbling_transparency", () -> { RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(SourceFactor.DST_COLOR, DestFactor.SRC_COLOR, SourceFactor.ONE, DestFactor.ZERO); }, () -> { RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } ); protected static final RenderStateShard.TransparencyStateShard OVERLAY_TRANSPARENCY = new RenderStateShard.TransparencyStateShard( "overlay_transparency", () -> { RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(SourceFactor.SRC_ALPHA, DestFactor.ONE, SourceFactor.ONE, DestFactor.ZERO); }, () -> { RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } ); protected static final RenderStateShard.TransparencyStateShard TRANSLUCENT_TRANSPARENCY = new RenderStateShard.TransparencyStateShard( "translucent_transparency", () -> { RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ONE, DestFactor.ONE_MINUS_SRC_ALPHA); }, () -> { RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } ); protected static final RenderStateShard.TransparencyStateShard VIGNETTE_TRANSPARENCY = new RenderStateShard.TransparencyStateShard( "vignette_transparency", () -> { RenderSystem.enableBlend(); RenderSystem.blendFunc(SourceFactor.ZERO, DestFactor.ONE_MINUS_SRC_COLOR); }, () -> { RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } ); protected static final RenderStateShard.TransparencyStateShard CROSSHAIR_TRANSPARENCY = new RenderStateShard.TransparencyStateShard( "crosshair_transparency", () -> { RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(SourceFactor.ONE_MINUS_DST_COLOR, DestFactor.ONE_MINUS_SRC_COLOR, SourceFactor.ONE, DestFactor.ZERO); }, () -> { RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } ); protected static final RenderStateShard.TransparencyStateShard MOJANG_LOGO_TRANSPARENCY = new RenderStateShard.TransparencyStateShard( "mojang_logo_transparency", () -> { RenderSystem.enableBlend(); RenderSystem.blendFunc(770, 1); }, () -> { RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } ); protected static final RenderStateShard.TransparencyStateShard NAUSEA_OVERLAY_TRANSPARENCY = new RenderStateShard.TransparencyStateShard( "nausea_overlay_transparency", () -> { RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(SourceFactor.ONE, DestFactor.ONE, SourceFactor.ONE, DestFactor.ONE); }, () -> { RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } ); protected static final RenderStateShard.ShaderStateShard NO_SHADER = new RenderStateShard.ShaderStateShard(); protected static final RenderStateShard.ShaderStateShard POSITION_COLOR_LIGHTMAP_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.POSITION_COLOR_LIGHTMAP ); protected static final RenderStateShard.ShaderStateShard POSITION_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.POSITION); protected static final RenderStateShard.ShaderStateShard POSITION_TEX_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.POSITION_TEX); protected static final RenderStateShard.ShaderStateShard POSITION_COLOR_TEX_LIGHTMAP_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.POSITION_COLOR_TEX_LIGHTMAP ); protected static final RenderStateShard.ShaderStateShard POSITION_COLOR_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.POSITION_COLOR); protected static final RenderStateShard.ShaderStateShard POSITION_TEXTURE_COLOR_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.POSITION_TEX_COLOR); protected static final RenderStateShard.ShaderStateShard PARTICLE_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.PARTICLE); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_SOLID_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_SOLID); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_CUTOUT_MIPPED_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_CUTOUT_MIPPED ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_CUTOUT_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_CUTOUT); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_TRANSLUCENT_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_TRANSLUCENT ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_TRANSLUCENT_MOVING_BLOCK_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_TRANSLUCENT_MOVING_BLOCK ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ARMOR_CUTOUT_NO_CULL_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ARMOR_CUTOUT_NO_CULL ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ARMOR_TRANSLUCENT_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ARMOR_TRANSLUCENT ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_SOLID_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENTITY_SOLID ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_CUTOUT_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENTITY_CUTOUT ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_CUTOUT_NO_CULL_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENTITY_CUTOUT_NO_CULL ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_CUTOUT_NO_CULL_Z_OFFSET_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENTITY_CUTOUT_NO_CULL_Z_OFFSET ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ITEM_ENTITY_TRANSLUCENT_CULL_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ITEM_ENTITY_TRANSLUCENT_CULL ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_TRANSLUCENT_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENTITY_TRANSLUCENT ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_TRANSLUCENT_EMISSIVE_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENTITY_TRANSLUCENT_EMISSIVE ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_SMOOTH_CUTOUT_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENTITY_SMOOTH_CUTOUT ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_BEACON_BEAM_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_BEACON_BEAM ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_DECAL_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENTITY_DECAL ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_NO_OUTLINE_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENTITY_NO_OUTLINE ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_SHADOW_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENTITY_SHADOW ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_ALPHA_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENTITY_ALPHA ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_EYES_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_EYES); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENERGY_SWIRL_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENERGY_SWIRL ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_LEASH_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_LEASH); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_WATER_MASK_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_WATER_MASK ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_OUTLINE_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_OUTLINE); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ARMOR_ENTITY_GLINT_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ARMOR_ENTITY_GLINT ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_GLINT_TRANSLUCENT_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_GLINT_TRANSLUCENT ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_GLINT_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_GLINT); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_GLINT_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_ENTITY_GLINT ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_CRUMBLING_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_CRUMBLING); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_TEXT_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_TEXT); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_TEXT_BACKGROUND_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_TEXT_BACKGROUND ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_TEXT_INTENSITY_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_TEXT_INTENSITY ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_TEXT_SEE_THROUGH_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_TEXT_SEE_THROUGH ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_TEXT_BACKGROUND_SEE_THROUGH_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_TEXT_BACKGROUND_SEE_THROUGH ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_TEXT_INTENSITY_SEE_THROUGH_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_TEXT_INTENSITY_SEE_THROUGH ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_LIGHTNING_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_LIGHTNING); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_TRIPWIRE_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_TRIPWIRE); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_END_PORTAL_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_END_PORTAL ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_END_GATEWAY_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_END_GATEWAY ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_CLOUDS_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_CLOUDS); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_LINES_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_LINES); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_GUI_SHADER = new RenderStateShard.ShaderStateShard(CoreShaders.RENDERTYPE_GUI); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_GUI_OVERLAY_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_GUI_OVERLAY ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_GUI_TEXT_HIGHLIGHT_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_GUI_TEXT_HIGHLIGHT ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_GUI_GHOST_RECIPE_OVERLAY_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_GUI_GHOST_RECIPE_OVERLAY ); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_BREEZE_WIND_SHADER = new RenderStateShard.ShaderStateShard( CoreShaders.RENDERTYPE_BREEZE_WIND ); protected static final RenderStateShard.TextureStateShard BLOCK_SHEET_MIPPED = new RenderStateShard.TextureStateShard( TextureAtlas.LOCATION_BLOCKS, TriState.FALSE, true ); protected static final RenderStateShard.TextureStateShard BLOCK_SHEET = new RenderStateShard.TextureStateShard( TextureAtlas.LOCATION_BLOCKS, TriState.FALSE, false ); protected static final RenderStateShard.EmptyTextureStateShard NO_TEXTURE = new RenderStateShard.EmptyTextureStateShard(); protected static final RenderStateShard.TexturingStateShard DEFAULT_TEXTURING = new RenderStateShard.TexturingStateShard( "default_texturing", () -> {}, () -> {} ); protected static final RenderStateShard.TexturingStateShard GLINT_TEXTURING = new RenderStateShard.TexturingStateShard( "glint_texturing", () -> setupGlintTexturing(8.0F), () -> RenderSystem.resetTextureMatrix() ); protected static final RenderStateShard.TexturingStateShard ENTITY_GLINT_TEXTURING = new RenderStateShard.TexturingStateShard( "entity_glint_texturing", () -> setupGlintTexturing(0.16F), () -> RenderSystem.resetTextureMatrix() ); protected static final RenderStateShard.LightmapStateShard LIGHTMAP = new RenderStateShard.LightmapStateShard(true); protected static final RenderStateShard.LightmapStateShard NO_LIGHTMAP = new RenderStateShard.LightmapStateShard(false); protected static final RenderStateShard.OverlayStateShard OVERLAY = new RenderStateShard.OverlayStateShard(true); protected static final RenderStateShard.OverlayStateShard NO_OVERLAY = new RenderStateShard.OverlayStateShard(false); protected static final RenderStateShard.CullStateShard CULL = new RenderStateShard.CullStateShard(true); protected static final RenderStateShard.CullStateShard NO_CULL = new RenderStateShard.CullStateShard(false); protected static final RenderStateShard.DepthTestStateShard NO_DEPTH_TEST = new RenderStateShard.DepthTestStateShard("always", 519); protected static final RenderStateShard.DepthTestStateShard EQUAL_DEPTH_TEST = new RenderStateShard.DepthTestStateShard("==", 514); protected static final RenderStateShard.DepthTestStateShard LEQUAL_DEPTH_TEST = new RenderStateShard.DepthTestStateShard("<=", 515); protected static final RenderStateShard.DepthTestStateShard GREATER_DEPTH_TEST = new RenderStateShard.DepthTestStateShard(">", 516); protected static final RenderStateShard.WriteMaskStateShard COLOR_DEPTH_WRITE = new RenderStateShard.WriteMaskStateShard(true, true); protected static final RenderStateShard.WriteMaskStateShard COLOR_WRITE = new RenderStateShard.WriteMaskStateShard(true, false); protected static final RenderStateShard.WriteMaskStateShard DEPTH_WRITE = new RenderStateShard.WriteMaskStateShard(false, true); protected static final RenderStateShard.LayeringStateShard NO_LAYERING = new RenderStateShard.LayeringStateShard("no_layering", () -> {}, () -> {}); protected static final RenderStateShard.LayeringStateShard POLYGON_OFFSET_LAYERING = new RenderStateShard.LayeringStateShard( "polygon_offset_layering", () -> { RenderSystem.polygonOffset(-1.0F, -10.0F); RenderSystem.enablePolygonOffset(); }, () -> { RenderSystem.polygonOffset(0.0F, 0.0F); RenderSystem.disablePolygonOffset(); } ); protected static final RenderStateShard.LayeringStateShard VIEW_OFFSET_Z_LAYERING = new RenderStateShard.LayeringStateShard("view_offset_z_layering", () -> { Matrix4fStack matrix4fStack = RenderSystem.getModelViewStack(); matrix4fStack.pushMatrix(); RenderSystem.getProjectionType().applyLayeringTransform(matrix4fStack, 1.0F); }, () -> { Matrix4fStack matrix4fStack = RenderSystem.getModelViewStack(); matrix4fStack.popMatrix(); }); protected static final RenderStateShard.LayeringStateShard VIEW_OFFSET_Z_LAYERING_FORWARD = new RenderStateShard.LayeringStateShard( "view_offset_z_layering_forward", () -> { Matrix4fStack matrix4fStack = RenderSystem.getModelViewStack(); matrix4fStack.pushMatrix(); RenderSystem.getProjectionType().applyLayeringTransform(matrix4fStack, -1.0F); }, () -> { Matrix4fStack matrix4fStack = RenderSystem.getModelViewStack(); matrix4fStack.popMatrix(); } ); protected static final RenderStateShard.LayeringStateShard WORLD_BORDER_LAYERING = new RenderStateShard.LayeringStateShard("world_border_layering", () -> { RenderSystem.polygonOffset(-3.0F, -3.0F); RenderSystem.enablePolygonOffset(); }, () -> { RenderSystem.polygonOffset(0.0F, 0.0F); RenderSystem.disablePolygonOffset(); }); protected static final RenderStateShard.OutputStateShard MAIN_TARGET = new RenderStateShard.OutputStateShard( "main_target", () -> Minecraft.getInstance().getMainRenderTarget().bindWrite(false), () -> {} ); protected static final RenderStateShard.OutputStateShard OUTLINE_TARGET = new RenderStateShard.OutputStateShard("outline_target", () -> { RenderTarget renderTarget = Minecraft.getInstance().levelRenderer.entityOutlineTarget(); if (renderTarget != null) { renderTarget.bindWrite(false); } else { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }, () -> Minecraft.getInstance().getMainRenderTarget().bindWrite(false)); protected static final RenderStateShard.OutputStateShard TRANSLUCENT_TARGET = new RenderStateShard.OutputStateShard("translucent_target", () -> { RenderTarget renderTarget = Minecraft.getInstance().levelRenderer.getTranslucentTarget(); if (renderTarget != null) { renderTarget.bindWrite(false); } else { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }, () -> Minecraft.getInstance().getMainRenderTarget().bindWrite(false)); protected static final RenderStateShard.OutputStateShard PARTICLES_TARGET = new RenderStateShard.OutputStateShard("particles_target", () -> { RenderTarget renderTarget = Minecraft.getInstance().levelRenderer.getParticlesTarget(); if (renderTarget != null) { renderTarget.bindWrite(false); } else { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }, () -> Minecraft.getInstance().getMainRenderTarget().bindWrite(false)); protected static final RenderStateShard.OutputStateShard WEATHER_TARGET = new RenderStateShard.OutputStateShard("weather_target", () -> { RenderTarget renderTarget = Minecraft.getInstance().levelRenderer.getWeatherTarget(); if (renderTarget != null) { renderTarget.bindWrite(false); } else { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }, () -> Minecraft.getInstance().getMainRenderTarget().bindWrite(false)); protected static final RenderStateShard.OutputStateShard CLOUDS_TARGET = new RenderStateShard.OutputStateShard("clouds_target", () -> { RenderTarget renderTarget = Minecraft.getInstance().levelRenderer.getCloudsTarget(); if (renderTarget != null) { renderTarget.bindWrite(false); } else { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }, () -> Minecraft.getInstance().getMainRenderTarget().bindWrite(false)); protected static final RenderStateShard.OutputStateShard ITEM_ENTITY_TARGET = new RenderStateShard.OutputStateShard("item_entity_target", () -> { RenderTarget renderTarget = Minecraft.getInstance().levelRenderer.getItemEntityTarget(); if (renderTarget != null) { renderTarget.bindWrite(false); } else { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }, () -> Minecraft.getInstance().getMainRenderTarget().bindWrite(false)); protected static final RenderStateShard.LineStateShard DEFAULT_LINE = new RenderStateShard.LineStateShard(OptionalDouble.of(1.0)); protected static final RenderStateShard.ColorLogicStateShard NO_COLOR_LOGIC = new RenderStateShard.ColorLogicStateShard( "no_color_logic", () -> RenderSystem.disableColorLogicOp(), () -> {} ); protected static final RenderStateShard.ColorLogicStateShard OR_REVERSE_COLOR_LOGIC = new RenderStateShard.ColorLogicStateShard("or_reverse", () -> { RenderSystem.enableColorLogicOp(); RenderSystem.logicOp(LogicOp.OR_REVERSE); }, () -> RenderSystem.disableColorLogicOp()); public RenderStateShard(String name, Runnable setupState, Runnable clearState) { this.name = name; this.setupState = setupState; this.clearState = clearState; } public void setupRenderState() { this.setupState.run(); } public void clearRenderState() { this.clearState.run(); } public String toString() { return this.name; } private static void setupGlintTexturing(float scale) { long l = (long)(Util.getMillis() * Minecraft.getInstance().options.glintSpeed().get() * 8.0); float f = (float)(l % 110000L) / 110000.0F; float g = (float)(l % 30000L) / 30000.0F; Matrix4f matrix4f = new Matrix4f().translation(-f, g, 0.0F); matrix4f.rotateZ((float) (Math.PI / 18)).scale(scale); RenderSystem.setTextureMatrix(matrix4f); } @Environment(EnvType.CLIENT) static class BooleanStateShard extends RenderStateShard { private final boolean enabled; public BooleanStateShard(String name, Runnable setupState, Runnable clearState, boolean enabled) { super(name, setupState, clearState); this.enabled = enabled; } @Override public String toString() { return this.name + "[" + this.enabled + "]"; } } @Environment(EnvType.CLIENT) protected static class ColorLogicStateShard extends RenderStateShard { public ColorLogicStateShard(String string, Runnable runnable, Runnable runnable2) { super(string, runnable, runnable2); } } @Environment(EnvType.CLIENT) protected static class CullStateShard extends RenderStateShard.BooleanStateShard { public CullStateShard(boolean useCull) { super("cull", () -> { if (!useCull) { RenderSystem.disableCull(); } }, () -> { if (!useCull) { RenderSystem.enableCull(); } }, useCull); } } @Environment(EnvType.CLIENT) protected static class DepthTestStateShard extends RenderStateShard { private final String functionName; public DepthTestStateShard(String functionName, int depthFunc) { super("depth_test", () -> { if (depthFunc != 519) { RenderSystem.enableDepthTest(); RenderSystem.depthFunc(depthFunc); } }, () -> { if (depthFunc != 519) { RenderSystem.disableDepthTest(); RenderSystem.depthFunc(515); } }); this.functionName = functionName; } @Override public String toString() { return this.name + "[" + this.functionName + "]"; } } @Environment(EnvType.CLIENT) protected static class EmptyTextureStateShard extends RenderStateShard { public EmptyTextureStateShard(Runnable setupState, Runnable clearState) { super("texture", setupState, clearState); } EmptyTextureStateShard() { super("texture", () -> {}, () -> {}); } protected Optional cutoutTexture() { return Optional.empty(); } } @Environment(EnvType.CLIENT) protected static class LayeringStateShard extends RenderStateShard { public LayeringStateShard(String string, Runnable runnable, Runnable runnable2) { super(string, runnable, runnable2); } } @Environment(EnvType.CLIENT) protected static class LightmapStateShard extends RenderStateShard.BooleanStateShard { public LightmapStateShard(boolean useLightmap) { super("lightmap", () -> { if (useLightmap) { Minecraft.getInstance().gameRenderer.lightTexture().turnOnLightLayer(); } }, () -> { if (useLightmap) { Minecraft.getInstance().gameRenderer.lightTexture().turnOffLightLayer(); } }, useLightmap); } } @Environment(EnvType.CLIENT) protected static class LineStateShard extends RenderStateShard { private final OptionalDouble width; public LineStateShard(OptionalDouble width) { super("line_width", () -> { if (!Objects.equals(width, OptionalDouble.of(1.0))) { if (width.isPresent()) { RenderSystem.lineWidth((float)width.getAsDouble()); } else { RenderSystem.lineWidth(Math.max(2.5F, Minecraft.getInstance().getWindow().getWidth() / 1920.0F * 2.5F)); } } }, () -> { if (!Objects.equals(width, OptionalDouble.of(1.0))) { RenderSystem.lineWidth(1.0F); } }); this.width = width; } @Override public String toString() { return this.name + "[" + (this.width.isPresent() ? this.width.getAsDouble() : "window_scale") + "]"; } } @Environment(EnvType.CLIENT) protected static class MultiTextureStateShard extends RenderStateShard.EmptyTextureStateShard { private final Optional cutoutTexture; MultiTextureStateShard(List entries) { super(() -> { for (int i = 0; i < entries.size(); i++) { Entry entry = (Entry)entries.get(i); TextureManager textureManager = Minecraft.getInstance().getTextureManager(); AbstractTexture abstractTexture = textureManager.getTexture(entry.id); abstractTexture.setFilter(entry.blur, entry.mipmap); RenderSystem.setShaderTexture(i, abstractTexture.getId()); } }, () -> {}); this.cutoutTexture = entries.isEmpty() ? Optional.empty() : Optional.of(((Entry)entries.getFirst()).id); } @Override protected Optional cutoutTexture() { return this.cutoutTexture; } public static Builder builder() { return new Builder(); } } @Environment(EnvType.CLIENT) protected static final class OffsetTexturingStateShard extends RenderStateShard.TexturingStateShard { public OffsetTexturingStateShard(float u, float v) { super("offset_texturing", () -> RenderSystem.setTextureMatrix(new Matrix4f().translation(u, v, 0.0F)), () -> RenderSystem.resetTextureMatrix()); } } @Environment(EnvType.CLIENT) protected static class OutputStateShard extends RenderStateShard { public OutputStateShard(String string, Runnable runnable, Runnable runnable2) { super(string, runnable, runnable2); } } @Environment(EnvType.CLIENT) protected static class OverlayStateShard extends RenderStateShard.BooleanStateShard { public OverlayStateShard(boolean useOverlay) { super("overlay", () -> { if (useOverlay) { Minecraft.getInstance().gameRenderer.overlayTexture().setupOverlayColor(); } }, () -> { if (useOverlay) { Minecraft.getInstance().gameRenderer.overlayTexture().teardownOverlayColor(); } }, useOverlay); } } @Environment(EnvType.CLIENT) protected static class ShaderStateShard extends RenderStateShard { private final Optional shader; public ShaderStateShard(ShaderProgram shader) { super("shader", () -> RenderSystem.setShader(shader), () -> {}); this.shader = Optional.of(shader); } public ShaderStateShard() { super("shader", RenderSystem::clearShader, () -> {}); this.shader = Optional.empty(); } @Override public String toString() { return this.name + "[" + this.shader + "]"; } } @Environment(EnvType.CLIENT) protected static class TextureStateShard extends RenderStateShard.EmptyTextureStateShard { private final Optional texture; private final TriState blur; private final boolean mipmap; public TextureStateShard(ResourceLocation texture, TriState blur, boolean mipmap) { super(() -> { TextureManager textureManager = Minecraft.getInstance().getTextureManager(); AbstractTexture abstractTexture = textureManager.getTexture(texture); abstractTexture.setFilter(blur, mipmap); RenderSystem.setShaderTexture(0, abstractTexture.getId()); }, () -> {}); this.texture = Optional.of(texture); this.blur = blur; this.mipmap = mipmap; } @Override public String toString() { return this.name + "[" + this.texture + "(blur=" + this.blur + ", mipmap=" + this.mipmap + ")]"; } @Override protected Optional cutoutTexture() { return this.texture; } } @Environment(EnvType.CLIENT) protected static class TexturingStateShard extends RenderStateShard { public TexturingStateShard(String string, Runnable runnable, Runnable runnable2) { super(string, runnable, runnable2); } } @Environment(EnvType.CLIENT) protected static class TransparencyStateShard extends RenderStateShard { public TransparencyStateShard(String string, Runnable runnable, Runnable runnable2) { super(string, runnable, runnable2); } } @Environment(EnvType.CLIENT) protected static class WriteMaskStateShard extends RenderStateShard { private final boolean writeColor; private final boolean writeDepth; public WriteMaskStateShard(boolean writeColor, boolean writeDepth) { super("write_mask_state", () -> { if (!writeDepth) { RenderSystem.depthMask(writeDepth); } if (!writeColor) { RenderSystem.colorMask(writeColor, writeColor, writeColor, writeColor); } }, () -> { if (!writeDepth) { RenderSystem.depthMask(true); } if (!writeColor) { RenderSystem.colorMask(true, true, true, true); } }); this.writeColor = writeColor; this.writeDepth = writeDepth; } @Override public String toString() { return this.name + "[writeColor=" + this.writeColor + ", writeDepth=" + this.writeDepth + "]"; } } }