From 2c5735183f46160696fd6f590a618fb2657828d5 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Tue, 3 Jan 2023 20:21:35 -0800 Subject: [PATCH 1/7] The beginnings --- src/main/java/net/coderbot/iris/Iris.java | 15 +++---- .../iris/pipeline/PipelineManager.java | 9 ++-- .../coderbot/iris/shaderpack/DimensionId.java | 10 +++-- .../net/coderbot/iris/shaderpack/IdMap.java | 42 +++++++++++++++++++ .../coderbot/iris/shaderpack/ShaderPack.java | 42 +++++++------------ .../shaderpack/materialmap/NamespacedId.java | 6 ++- 6 files changed, 79 insertions(+), 45 deletions(-) diff --git a/src/main/java/net/coderbot/iris/Iris.java b/src/main/java/net/coderbot/iris/Iris.java index a49968e57a..c17e7c8ef5 100644 --- a/src/main/java/net/coderbot/iris/Iris.java +++ b/src/main/java/net/coderbot/iris/Iris.java @@ -17,6 +17,7 @@ import net.coderbot.iris.shaderpack.ProgramSet; import net.coderbot.iris.shaderpack.ShaderPack; import net.coderbot.iris.shaderpack.discovery.ShaderpackDirectoryManager; +import net.coderbot.iris.shaderpack.materialmap.NamespacedId; import net.coderbot.iris.shaderpack.option.OptionSet; import net.coderbot.iris.shaderpack.option.Profile; import net.coderbot.iris.shaderpack.option.values.MutableOptionValues; @@ -619,19 +620,13 @@ private static void destroyEverything() { } } - public static DimensionId lastDimension = null; + public static NamespacedId lastDimension = null; - public static DimensionId getCurrentDimension() { + public static NamespacedId getCurrentDimension() { ClientLevel level = Minecraft.getInstance().level; if (level != null) { - if (level.dimensionType().effectsLocation().equals(DimensionType.END_EFFECTS) || level.dimension().equals(net.minecraft.world.level.Level.END)) { - return DimensionId.END; - } else if (level.dimensionType().effectsLocation().equals(DimensionType.NETHER_EFFECTS) || level.dimension().equals(net.minecraft.world.level.Level.NETHER)) { - return DimensionId.NETHER; - } else { - return DimensionId.OVERWORLD; - } + return new NamespacedId(level.dimension().location().getNamespace(), level.dimension().location().getPath()); } else { // This prevents us from reloading the shaderpack unless we need to. Otherwise, if the player is in the // nether and quits the game, we might end up reloading the shaders on exit and on entry to the level @@ -640,7 +635,7 @@ public static DimensionId getCurrentDimension() { } } - private static WorldRenderingPipeline createPipeline(DimensionId dimensionId) { + private static WorldRenderingPipeline createPipeline(NamespacedId dimensionId) { if (currentPack == null) { // Completely disables shader-based rendering return new FixedFunctionWorldRenderingPipeline(); diff --git a/src/main/java/net/coderbot/iris/pipeline/PipelineManager.java b/src/main/java/net/coderbot/iris/pipeline/PipelineManager.java index 91e4efa74a..5deec8b654 100644 --- a/src/main/java/net/coderbot/iris/pipeline/PipelineManager.java +++ b/src/main/java/net/coderbot/iris/pipeline/PipelineManager.java @@ -4,6 +4,7 @@ import net.coderbot.iris.Iris; import net.coderbot.iris.block_rendering.BlockRenderingSettings; import net.coderbot.iris.shaderpack.DimensionId; +import net.coderbot.iris.shaderpack.materialmap.NamespacedId; import net.coderbot.iris.uniforms.SystemTimeUniforms; import net.minecraft.client.Minecraft; import org.jetbrains.annotations.Nullable; @@ -16,16 +17,16 @@ public class PipelineManager { private static PipelineManager instance; - private final Function pipelineFactory; - private final Map pipelinesPerDimension = new HashMap<>(); + private final Function pipelineFactory; + private final Map pipelinesPerDimension = new HashMap<>(); private WorldRenderingPipeline pipeline = new FixedFunctionWorldRenderingPipeline(); private int versionCounterForSodiumShaderReload = 0; - public PipelineManager(Function pipelineFactory) { + public PipelineManager(Function pipelineFactory) { this.pipelineFactory = pipelineFactory; } - public WorldRenderingPipeline preparePipeline(DimensionId currentDimension) { + public WorldRenderingPipeline preparePipeline(NamespacedId currentDimension) { if (!pipelinesPerDimension.containsKey(currentDimension)) { SystemTimeUniforms.COUNTER.reset(); SystemTimeUniforms.TIMER.reset(); diff --git a/src/main/java/net/coderbot/iris/shaderpack/DimensionId.java b/src/main/java/net/coderbot/iris/shaderpack/DimensionId.java index 8254ca8106..fe17145777 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/DimensionId.java +++ b/src/main/java/net/coderbot/iris/shaderpack/DimensionId.java @@ -1,7 +1,9 @@ package net.coderbot.iris.shaderpack; -public enum DimensionId { - OVERWORLD, - NETHER, - END +import net.coderbot.iris.shaderpack.materialmap.NamespacedId; + +public class DimensionId { + public static NamespacedId OVERWORLD = new NamespacedId("minecraft", "overworld"); + public static NamespacedId NETHER = new NamespacedId("minecraft", "the_nether"); + public static NamespacedId END = new NamespacedId("minecraft", "the_end"); } diff --git a/src/main/java/net/coderbot/iris/shaderpack/IdMap.java b/src/main/java/net/coderbot/iris/shaderpack/IdMap.java index 836c0aba12..ef14a5ade7 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/IdMap.java +++ b/src/main/java/net/coderbot/iris/shaderpack/IdMap.java @@ -7,6 +7,7 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntMaps; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.coderbot.iris.Iris; import net.coderbot.iris.shaderpack.materialmap.BlockEntry; import net.coderbot.iris.shaderpack.materialmap.BlockRenderType; @@ -53,6 +54,8 @@ public class IdMap { */ private Map blockRenderTypeMap; + private Map dimensionMap; + IdMap(Path shaderPath, ShaderPackOptions shaderPackOptions, Iterable environmentDefines) { itemIdMap = loadProperties(shaderPath, "item.properties", shaderPackOptions, environmentDefines) .map(IdMap::parseItemIdMap).orElse(Object2IntMaps.emptyMap()); @@ -65,6 +68,18 @@ public class IdMap { blockRenderTypeMap = parseRenderTypeMap(blockProperties, "layer.", "block.properties"); }); + loadProperties(shaderPath, "dimension.properties", shaderPackOptions, environmentDefines).ifPresent(dimensionProperties -> { + dimensionMap = parseDimensionMap(dimensionProperties, "dimension.", "dimension.properties"); + }); + + if (dimensionMap == null) { + dimensionMap = new Object2ObjectArrayMap<>(); + + if (Files.exists(shaderPath.resolve("world0"))) dimensionMap.putIfAbsent(DimensionId.OVERWORLD, "world0"); + if (Files.exists(shaderPath.resolve("world-1"))) dimensionMap.putIfAbsent(DimensionId.NETHER, "world-1"); + if (Files.exists(shaderPath.resolve("world1"))) dimensionMap.putIfAbsent(DimensionId.END, "world1"); + } + // TODO: Properly override block render layers if (blockPropertiesMap == null) { @@ -253,6 +268,29 @@ private static Map parseRenderTypeMap(Properties return overrides; } + + private static Map parseDimensionMap(Properties properties, String keyPrefix, String fileName) { + Map overrides = new Object2ObjectArrayMap<>(); + + properties.forEach((keyObject, valueObject) -> { + String key = (String) keyObject; + String value = (String) valueObject; + + if (!key.startsWith(keyPrefix)) { + // Not a valid line, ignore it + return; + } + + key = key.substring(keyPrefix.length()); + + for (String part : value.split("\\s+")) { + overrides.put(new NamespacedId(part), key); + } + }); + + return overrides; + } + public Int2ObjectMap> getBlockProperties() { return blockPropertiesMap; } @@ -269,6 +307,10 @@ public Map getBlockRenderTypeMap() { return blockRenderTypeMap; } + public Map getDimensionMap() { + return dimensionMap; + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java index 9275762b05..bfa784c633 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java +++ b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java @@ -16,6 +16,7 @@ import net.coderbot.iris.shaderpack.include.IncludeGraph; import net.coderbot.iris.shaderpack.include.IncludeProcessor; import net.coderbot.iris.shaderpack.include.ShaderPackSourceNames; +import net.coderbot.iris.shaderpack.materialmap.NamespacedId; import net.coderbot.iris.shaderpack.option.ProfileSet; import net.coderbot.iris.shaderpack.option.ShaderPackOptions; import net.coderbot.iris.shaderpack.option.menu.OptionMenuContainer; @@ -55,10 +56,7 @@ public class ShaderPack { private static final Gson GSON = new Gson(); private final ProgramSet base; - @Nullable - private final ProgramSet overworld; - private final ProgramSet nether; - private final ProgramSet end; + private final Map overrides; private final IdMap idMap; private final LanguageMap languageMap; @@ -70,6 +68,8 @@ public class ShaderPack { private final ProfileSet.ProfileResult profile; private final String profileInfo; + private final Function sourceProvider; + private final ShaderProperties shaderProperties; public ShaderPack(Path root, Iterable environmentDefines) throws IOException, IllegalStateException { this(root, Collections.emptyMap(), environmentDefines); @@ -123,7 +123,7 @@ public ShaderPack(Path root, Map changedConfigs, Iterable finalEnvironmentDefines = environmentDefines; - ShaderProperties shaderProperties = loadProperties(root, "shaders.properties") + this.shaderProperties = loadProperties(root, "shaders.properties") .map(source -> new ShaderProperties(source, shaderPackOptions, finalEnvironmentDefines)) .orElseGet(ShaderProperties::empty); @@ -181,7 +181,7 @@ public ShaderPack(Path root, Map changedConfigs, Iterable finalEnvironmentDefines1 = environmentDefines; - Function sourceProvider = (path) -> { + this.sourceProvider = (path) -> { String pathString = path.getPathString(); // Removes the first "/" in the path if present, and the file // extension in order to represent the path as its program name @@ -219,12 +219,7 @@ public ShaderPack(Path root, Map changedConfigs, Iterable(); this.idMap = new IdMap(root, shaderPackOptions, environmentDefines); @@ -384,22 +379,17 @@ private static String readProperties(Path shaderPath, String name) { } } - public ProgramSet getProgramSet(DimensionId dimension) { + public ProgramSet getProgramSet(NamespacedId dimension) { ProgramSet overrides; - switch (dimension) { - case OVERWORLD: - overrides = overworld; - break; - case NETHER: - overrides = nether; - break; - case END: - overrides = end; - break; - default: - throw new IllegalArgumentException("Unknown dimension " + dimension); - } + overrides = this.overrides.computeIfAbsent(dimension, dim -> { + if (idMap.getDimensionMap().containsKey(dimension)) { + String map = idMap.getDimensionMap().get(dimension); + return new ProgramSet(AbsolutePackPath.fromAbsolutePath("/" + map), sourceProvider, shaderProperties, this); + } else { + return null; + } + }); // NB: If a dimension overrides directory is present, none of the files from the parent directory are "merged" // into the override. Rather, we act as if the overrides directory contains a completely different set of diff --git a/src/main/java/net/coderbot/iris/shaderpack/materialmap/NamespacedId.java b/src/main/java/net/coderbot/iris/shaderpack/materialmap/NamespacedId.java index 30540d2aff..6a4cb3ce13 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/materialmap/NamespacedId.java +++ b/src/main/java/net/coderbot/iris/shaderpack/materialmap/NamespacedId.java @@ -48,7 +48,11 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(namespace, name); + final int prime = 31; + int result = 1; + result = prime * result + ((namespace == null) ? 0 : namespace.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; } @Override From acca75eb6d02a73653c41d9ad08c81311cc716db Mon Sep 17 00:00:00 2001 From: IMS212 Date: Tue, 3 Jan 2023 20:52:51 -0800 Subject: [PATCH 2/7] It works! --- .../net/coderbot/iris/shaderpack/IdMap.java | 18 ---- .../coderbot/iris/shaderpack/ShaderPack.java | 101 ++++++++++++++++-- 2 files changed, 93 insertions(+), 26 deletions(-) diff --git a/src/main/java/net/coderbot/iris/shaderpack/IdMap.java b/src/main/java/net/coderbot/iris/shaderpack/IdMap.java index ef14a5ade7..f84347057f 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/IdMap.java +++ b/src/main/java/net/coderbot/iris/shaderpack/IdMap.java @@ -54,8 +54,6 @@ public class IdMap { */ private Map blockRenderTypeMap; - private Map dimensionMap; - IdMap(Path shaderPath, ShaderPackOptions shaderPackOptions, Iterable environmentDefines) { itemIdMap = loadProperties(shaderPath, "item.properties", shaderPackOptions, environmentDefines) .map(IdMap::parseItemIdMap).orElse(Object2IntMaps.emptyMap()); @@ -68,18 +66,6 @@ public class IdMap { blockRenderTypeMap = parseRenderTypeMap(blockProperties, "layer.", "block.properties"); }); - loadProperties(shaderPath, "dimension.properties", shaderPackOptions, environmentDefines).ifPresent(dimensionProperties -> { - dimensionMap = parseDimensionMap(dimensionProperties, "dimension.", "dimension.properties"); - }); - - if (dimensionMap == null) { - dimensionMap = new Object2ObjectArrayMap<>(); - - if (Files.exists(shaderPath.resolve("world0"))) dimensionMap.putIfAbsent(DimensionId.OVERWORLD, "world0"); - if (Files.exists(shaderPath.resolve("world-1"))) dimensionMap.putIfAbsent(DimensionId.NETHER, "world-1"); - if (Files.exists(shaderPath.resolve("world1"))) dimensionMap.putIfAbsent(DimensionId.END, "world1"); - } - // TODO: Properly override block render layers if (blockPropertiesMap == null) { @@ -307,10 +293,6 @@ public Map getBlockRenderTypeMap() { return blockRenderTypeMap; } - public Map getDimensionMap() { - return dimensionMap; - } - @Override public boolean equals(Object o) { if (this == o) { diff --git a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java index bfa784c633..b00f5e8110 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java +++ b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java @@ -5,6 +5,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.stream.JsonReader; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.coderbot.iris.Iris; @@ -23,6 +24,7 @@ import net.coderbot.iris.shaderpack.option.values.MutableOptionValues; import net.coderbot.iris.shaderpack.option.values.OptionValues; import net.coderbot.iris.shaderpack.preprocessor.JcppProcessor; +import net.coderbot.iris.shaderpack.preprocessor.PropertiesPreprocessor; import net.coderbot.iris.shaderpack.texture.CustomTextureData; import net.coderbot.iris.shaderpack.texture.TextureFilteringData; import net.coderbot.iris.shaderpack.texture.TextureStage; @@ -36,6 +38,7 @@ import net.coderbot.iris.uniforms.custom.CustomUniforms; import java.io.IOException; import java.io.InputStreamReader; +import java.io.StringReader; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.NoSuchFileException; @@ -48,6 +51,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Properties; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -70,6 +74,8 @@ public class ShaderPack { private final String profileInfo; private final Function sourceProvider; private final ShaderProperties shaderProperties; + private List dimensionIds; + private Map dimensionMap; public ShaderPack(Path root, Iterable environmentDefines) throws IOException, IllegalStateException { this(root, Collections.emptyMap(), environmentDefines); @@ -96,14 +102,23 @@ public ShaderPack(Path root, Map changedConfigs, Iterable { + dimensionIds = parseDimensionIds(dimensionProperties, "dimension."); + dimensionMap = parseDimensionMap(dimensionProperties, "dimension.", "dimension.properties"); + }); + + if (dimensionMap == null) { + dimensionMap = new Object2ObjectArrayMap<>(); - boolean hasNether = ShaderPackSourceNames.findPresentSources(starts, root, - AbsolutePackPath.fromAbsolutePath("/world-1"), potentialFileNames); + if (Files.exists(root.resolve("world0"))) dimensionMap.putIfAbsent(DimensionId.OVERWORLD, "world0"); + if (Files.exists(root.resolve("world-1"))) dimensionMap.putIfAbsent(DimensionId.NETHER, "world-1"); + if (Files.exists(root.resolve("world1"))) dimensionMap.putIfAbsent(DimensionId.END, "world1"); + } - boolean hasEnd = ShaderPackSourceNames.findPresentSources(starts, root, - AbsolutePackPath.fromAbsolutePath("/world1"), potentialFileNames); + for (String id : dimensionIds) { + ShaderPackSourceNames.findPresentSources(starts, root, AbsolutePackPath.fromAbsolutePath("/" + id), + potentialFileNames); + } // Read all files and included files recursively IncludeGraph graph = new IncludeGraph(root, starts.build()); @@ -257,6 +272,76 @@ public ShaderPack(Path root, Map changedConfigs, Iterable loadProperties(Path shaderPath, String name, + Iterable environmentDefines) { + String fileContents = readProperties(shaderPath, name); + if (fileContents == null) { + return Optional.empty(); + } + + String processed = PropertiesPreprocessor.preprocessSource(fileContents, environmentDefines); + + StringReader propertiesReader = new StringReader(processed); + + // Note: ordering of properties is significant + // See https://github.com/IrisShaders/Iris/issues/1327 and the relevant putIfAbsent calls in + // BlockMaterialMapping + Properties properties = new OrderBackedProperties(); + try { + properties.load(propertiesReader); + } catch (IOException e) { + Iris.logger.error("Error loading " + name + " at " + shaderPath, e); + + return Optional.empty(); + } + + return Optional.of(properties); + } + + private List parseDimensionIds(Properties dimensionProperties, String keyPrefix) { + List names = new ArrayList<>(); + + dimensionProperties.forEach((keyObject, value) -> { + String key = (String) keyObject; + if (!key.startsWith(keyPrefix)) { + // Not a valid line, ignore it + return; + } + + key = key.substring(keyPrefix.length()); + + names.add(key); + }); + + return names; + } + + private static Map parseDimensionMap(Properties properties, String keyPrefix, String fileName) { + Map overrides = new Object2ObjectArrayMap<>(); + + properties.forEach((keyObject, valueObject) -> { + String key = (String) keyObject; + String value = (String) valueObject; + + if (!key.startsWith(keyPrefix)) { + // Not a valid line, ignore it + return; + } + + key = key.substring(keyPrefix.length()); + + for (String part : value.split("\\s+")) { + overrides.put(new NamespacedId(part), key); + } + }); + + return overrides; + } + private String getCurrentProfileName() { return profile.current.map(p -> p.name).orElse("Custom"); } @@ -383,8 +468,8 @@ public ProgramSet getProgramSet(NamespacedId dimension) { ProgramSet overrides; overrides = this.overrides.computeIfAbsent(dimension, dim -> { - if (idMap.getDimensionMap().containsKey(dimension)) { - String map = idMap.getDimensionMap().get(dimension); + if (dimensionMap.containsKey(dimension)) { + String map = dimensionMap.get(dimension); return new ProgramSet(AbsolutePackPath.fromAbsolutePath("/" + map), sourceProvider, shaderProperties, this); } else { return null; From f607d668455ca520db6d146ab005097d4c1a5e3b Mon Sep 17 00:00:00 2001 From: IMS212 Date: Wed, 4 Jan 2023 07:44:36 -0800 Subject: [PATCH 3/7] More changes --- .../coderbot/iris/shaderpack/ShaderPack.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java index b00f5e8110..9574d861af 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java +++ b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java @@ -102,17 +102,28 @@ public ShaderPack(Path root, Map changedConfigs, Iterable { dimensionIds = parseDimensionIds(dimensionProperties, "dimension."); dimensionMap = parseDimensionMap(dimensionProperties, "dimension.", "dimension.properties"); }); if (dimensionMap == null) { + dimensionIds = new ArrayList<>(); dimensionMap = new Object2ObjectArrayMap<>(); - if (Files.exists(root.resolve("world0"))) dimensionMap.putIfAbsent(DimensionId.OVERWORLD, "world0"); - if (Files.exists(root.resolve("world-1"))) dimensionMap.putIfAbsent(DimensionId.NETHER, "world-1"); - if (Files.exists(root.resolve("world1"))) dimensionMap.putIfAbsent(DimensionId.END, "world1"); + if (Files.exists(root.resolve("world0"))) { + dimensionIds.add("world0"); + dimensionMap.putIfAbsent(DimensionId.OVERWORLD, "world0"); + } + if (Files.exists(root.resolve("world-1"))) { + dimensionIds.add("world-1"); + dimensionMap.putIfAbsent(DimensionId.NETHER, "world-1"); + } + if (Files.exists(root.resolve("world1"))) { + dimensionIds.add("world1"); + dimensionMap.putIfAbsent(DimensionId.END, "world1"); + } } for (String id : dimensionIds) { From d45227cb40adfd4299845ac6c9a708a80bf4f19e Mon Sep 17 00:00:00 2001 From: IMS212 Date: Wed, 4 Jan 2023 08:07:44 -0800 Subject: [PATCH 4/7] More resilent and faster handling --- .../coderbot/iris/shaderpack/ProgramSet.java | 2 +- .../iris/shaderpack/ProgramSetInterface.java | 8 ++++ .../coderbot/iris/shaderpack/ShaderPack.java | 42 +++++++++++-------- 3 files changed, 34 insertions(+), 18 deletions(-) create mode 100644 src/main/java/net/coderbot/iris/shaderpack/ProgramSetInterface.java diff --git a/src/main/java/net/coderbot/iris/shaderpack/ProgramSet.java b/src/main/java/net/coderbot/iris/shaderpack/ProgramSet.java index 700667da53..f30b841a89 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/ProgramSet.java +++ b/src/main/java/net/coderbot/iris/shaderpack/ProgramSet.java @@ -15,7 +15,7 @@ import java.util.Optional; import java.util.function.Function; -public class ProgramSet { +public class ProgramSet implements ProgramSetInterface { private final PackDirectives packDirectives; private final ProgramSource shadow; diff --git a/src/main/java/net/coderbot/iris/shaderpack/ProgramSetInterface.java b/src/main/java/net/coderbot/iris/shaderpack/ProgramSetInterface.java new file mode 100644 index 0000000000..0a83774ec5 --- /dev/null +++ b/src/main/java/net/coderbot/iris/shaderpack/ProgramSetInterface.java @@ -0,0 +1,8 @@ +package net.coderbot.iris.shaderpack; + +public interface ProgramSetInterface { + class Empty implements ProgramSetInterface { + + public static final ProgramSetInterface INSTANCE = new Empty(); + } +} diff --git a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java index 9574d861af..442140f878 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java +++ b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java @@ -60,7 +60,7 @@ public class ShaderPack { private static final Gson GSON = new Gson(); private final ProgramSet base; - private final Map overrides; + private final Map overrides; private final IdMap idMap; private final LanguageMap languageMap; @@ -102,33 +102,36 @@ public ShaderPack(Path root, Map changedConfigs, Iterable(); + // This cannot be done in IDMap, as we do not have the include graph, and subsequently the shader settings. - loadProperties(root, "dimension.properties", environmentDefines).ifPresent(dimensionProperties -> { - dimensionIds = parseDimensionIds(dimensionProperties, "dimension."); + List dimensionIdCreator = loadProperties(root, "dimension.properties", environmentDefines).map(dimensionProperties -> { dimensionMap = parseDimensionMap(dimensionProperties, "dimension.", "dimension.properties"); - }); + return parseDimensionIds(dimensionProperties, "dimension."); + }).orElse(new ArrayList<>()); if (dimensionMap == null) { - dimensionIds = new ArrayList<>(); dimensionMap = new Object2ObjectArrayMap<>(); if (Files.exists(root.resolve("world0"))) { - dimensionIds.add("world0"); + dimensionIdCreator.add("world0"); dimensionMap.putIfAbsent(DimensionId.OVERWORLD, "world0"); } if (Files.exists(root.resolve("world-1"))) { - dimensionIds.add("world-1"); + dimensionIdCreator.add("world-1"); dimensionMap.putIfAbsent(DimensionId.NETHER, "world-1"); } if (Files.exists(root.resolve("world1"))) { - dimensionIds.add("world1"); + dimensionIdCreator.add("world1"); dimensionMap.putIfAbsent(DimensionId.END, "world1"); } } - for (String id : dimensionIds) { - ShaderPackSourceNames.findPresentSources(starts, root, AbsolutePackPath.fromAbsolutePath("/" + id), - potentialFileNames); + for (String id : dimensionIdCreator) { + if (ShaderPackSourceNames.findPresentSources(starts, root, AbsolutePackPath.fromAbsolutePath("/" + id), + potentialFileNames)) { + dimensionIds.add(id); + } } // Read all files and included files recursively @@ -476,14 +479,19 @@ private static String readProperties(Path shaderPath, String name) { } public ProgramSet getProgramSet(NamespacedId dimension) { - ProgramSet overrides; + ProgramSetInterface overrides; overrides = this.overrides.computeIfAbsent(dimension, dim -> { if (dimensionMap.containsKey(dimension)) { - String map = dimensionMap.get(dimension); - return new ProgramSet(AbsolutePackPath.fromAbsolutePath("/" + map), sourceProvider, shaderProperties, this); + String name = dimensionMap.get(dimension); + if (dimensionIds.contains(name)) { + return new ProgramSet(AbsolutePackPath.fromAbsolutePath("/" + name), sourceProvider, shaderProperties, this); + } else { + Iris.logger.error("Attempted to load dimension folder " + name + " for dimension " + dimension + ", but it does not exist!"); + return ProgramSetInterface.Empty.INSTANCE; + } } else { - return null; + return ProgramSetInterface.Empty.INSTANCE; } }); @@ -495,8 +503,8 @@ public ProgramSet getProgramSet(NamespacedId dimension) { // impossible to "un-define" the composite pass. It also removes a lot of complexity related to "merging" // program sets. At the same time, this might be desired behavior by shader pack authors. It could make // sense to bring it back as a configurable option, and have a more maintainable set of code backing it. - if (overrides != null) { - return overrides; + if (overrides instanceof ProgramSet) { + return (ProgramSet) overrides; } else { return base; } From 045be648cbb0b44816b4919f7c9c5f2267b80080 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Wed, 4 Jan 2023 09:42:16 -0800 Subject: [PATCH 5/7] iris:base --- src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java index 442140f878..2b5e8f14cf 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java +++ b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java @@ -246,7 +246,7 @@ public ShaderPack(Path root, Map changedConfigs, Iterable(); From 893c16af60121cb1998df52bd936d11e6ef4c144 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Sun, 9 Jul 2023 11:17:33 -0700 Subject: [PATCH 6/7] We're almost there --- src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java index a97ead1c7c..148f4ced88 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java +++ b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java @@ -283,7 +283,7 @@ public ShaderPack(Path root, Map changedConfigs, Iterable(); @@ -388,6 +388,9 @@ private static Map parseDimensionMap(Properties properties key = key.substring(keyPrefix.length()); for (String part : value.split("\\s+")) { + if (part.equals("*")) { + overrides.put(new NamespacedId("*", "*"), key); + } overrides.put(new NamespacedId(part), key); } }); From e18e37c91c8baef1395b6ccae7350db560caab6e Mon Sep 17 00:00:00 2001 From: IMS212 Date: Mon, 10 Jul 2023 14:15:04 -0700 Subject: [PATCH 7/7] More changes --- src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java index 148f4ced88..08c1d8c728 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java +++ b/src/main/java/net/coderbot/iris/shaderpack/ShaderPack.java @@ -112,13 +112,16 @@ public ShaderPack(Path root, Map changedConfigs, Iterable(); + final boolean[] hasDimensionIds = {false}; // Thanks Java + // This cannot be done in IDMap, as we do not have the include graph, and subsequently the shader settings. List dimensionIdCreator = loadProperties(root, "dimension.properties", environmentDefines).map(dimensionProperties -> { + hasDimensionIds[0] = dimensionProperties.size() > 0; dimensionMap = parseDimensionMap(dimensionProperties, "dimension.", "dimension.properties"); return parseDimensionIds(dimensionProperties, "dimension."); }).orElse(new ArrayList<>()); - if (dimensionMap == null) { + if (!hasDimensionIds[0]) { dimensionMap = new Object2ObjectArrayMap<>(); if (Files.exists(root.resolve("world0"))) {