From 5df695cbbbe05d8b908068c87a1662c31c3978e3 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 4 Mar 2023 22:14:35 -0500 Subject: [PATCH 01/15] Add YUNG's Better Strongholds compat --- .../modernfix/structure/logic/EnderEyeItemLogic.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/embeddedt/modernfix/structure/logic/EnderEyeItemLogic.java b/src/main/java/org/embeddedt/modernfix/structure/logic/EnderEyeItemLogic.java index d60fce6f..97c38111 100644 --- a/src/main/java/org/embeddedt/modernfix/structure/logic/EnderEyeItemLogic.java +++ b/src/main/java/org/embeddedt/modernfix/structure/logic/EnderEyeItemLogic.java @@ -2,6 +2,7 @@ package org.embeddedt.modernfix.structure.logic; import com.google.common.collect.ImmutableSet; import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.stats.Stats; @@ -9,6 +10,8 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.EyeOfEnder; import net.minecraft.world.item.EnderEyeItem; import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.registries.ForgeRegistries; import org.embeddedt.modernfix.mixin.perf.async_locator.EyeOfEnderAccess; import org.embeddedt.modernfix.structure.AsyncLocator; @@ -16,9 +19,14 @@ public class EnderEyeItemLogic { private EnderEyeItemLogic() {} public static void locateAsync(ServerLevel level, Player player, EyeOfEnder eyeOfEnder, EnderEyeItem enderEyeItem) { + StructureFeature targetFeature; + if(ModList.get().isLoaded("betterstrongholds")) + targetFeature = ForgeRegistries.STRUCTURE_FEATURES.getValue(new ResourceLocation("betterstrongholds", "stronghold")); + else + targetFeature = StructureFeature.STRONGHOLD; AsyncLocator.locateChunkGen( level, - ImmutableSet.of(StructureFeature.STRONGHOLD), + ImmutableSet.of(targetFeature), player.blockPosition(), 100, false From 7a2b57221e99ba5bb632830a456687a053cae4c2 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:12:04 -0500 Subject: [PATCH 02/15] Return to baking models on the main thread Mods... as usual. --- .../perf/faster_baking/ModelManagerMixin.java | 43 ++----------------- 1 file changed, 3 insertions(+), 40 deletions(-) diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/faster_baking/ModelManagerMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/faster_baking/ModelManagerMixin.java index 1a2283fc..3e485c35 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/faster_baking/ModelManagerMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/faster_baking/ModelManagerMixin.java @@ -31,47 +31,10 @@ import java.util.Map; @Mixin(ModelManager.class) public class ModelManagerMixin { - @Shadow @Nullable private AtlasSet atlases; - @Shadow private Map bakedRegistry; - - @Shadow private Object2IntMap modelGroups; - - @Shadow @Final private TextureManager textureManager; - - @Shadow private BakedModel missingModel; - - @Shadow @Final private BlockModelShaper blockModelShaper; - - @Inject(method = "prepare(Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)Lnet/minecraft/client/resources/model/ModelBakery;", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;endTick()V"), locals = LocalCapture.CAPTURE_FAILHARD) - private void fireModelBakeEvent(ResourceManager pResourceManager, ProfilerFiller pProfiler, CallbackInfoReturnable cir, ModelLoader pObject) { - pProfiler.push("modelevent"); - if (this.atlases != null) { - Minecraft.getInstance().executeBlocking(() -> { - this.atlases.close(); - }); - } - this.atlases = ((IExtendedModelBakery)(Object)pObject).getUnfinishedAtlasSet(); - this.bakedRegistry = pObject.getBakedTopLevelModels(); - this.modelGroups = pObject.getModelGroups(); - this.missingModel = this.bakedRegistry.get(ModelBakery.MISSING_MODEL_LOCATION); - net.minecraftforge.client.ForgeHooksClient.onModelBake((ModelManager)(Object)this, this.bakedRegistry, pObject); - pProfiler.popPush("cache"); - this.blockModelShaper.rebuildCache(); - pProfiler.pop(); - } - - /** - * @author embeddedt - * @reason most of the code is moved to prepare() - */ - @Overwrite - protected void apply(ModelBakery pObject, ResourceManager pResourceManager, ProfilerFiller pProfiler) { - pProfiler.startTick(); - pProfiler.push("upload"); - this.atlases = pObject.uploadTextures(this.textureManager, pProfiler); - pProfiler.pop(); + @Inject(method = "apply(Lnet/minecraft/client/resources/model/ModelBakery;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V", + at = @At(value = "RETURN")) + private void allowBake(ModelBakery pObject, ResourceManager pResourceManager, ProfilerFiller pProfiler, CallbackInfo ci) { LazyBakedModel.allowBakeForFlags = true; - pProfiler.endTick(); } } From cb23ee5a54ffa5d0e611f1c89bd1d90dd1c9a1f7 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 6 Mar 2023 13:06:15 -0500 Subject: [PATCH 03/15] Add debug tool for weird crashes, off by default --- .../core/config/ModernFixEarlyConfig.java | 1 + .../direct_stack_trace/CrashReportMixin.java | 22 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 1 + 3 files changed, 24 insertions(+) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/feature/direct_stack_trace/CrashReportMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 43baf26b..c6895807 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -20,6 +20,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("feature.branding", true); this.addMixinRule("feature.measure_time", true); this.addMixinRule("feature.reduce_loading_screen_freezes", false); + this.addMixinRule("feature.direct_stack_trace", false); this.addMixinRule("perf.fast_registry_validation", true); this.addMixinRule("perf.use_integrated_resources", true); this.addMixinRule("perf.remove_biome_temperature_cache", true); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/feature/direct_stack_trace/CrashReportMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/feature/direct_stack_trace/CrashReportMixin.java new file mode 100644 index 00000000..2457a5b8 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/feature/direct_stack_trace/CrashReportMixin.java @@ -0,0 +1,22 @@ +package org.embeddedt.modernfix.mixin.feature.direct_stack_trace; + +import net.minecraft.CrashReport; +import net.minecraft.CrashReportCategory; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(CrashReport.class) +public class CrashReportMixin { + @Shadow @Final private Throwable exception; + + @Inject(method = "addCategory(Ljava/lang/String;I)Lnet/minecraft/CrashReportCategory;", at = @At(value = "INVOKE", target = "Ljava/io/PrintStream;println(Ljava/lang/String;)V")) + private void dumpStacktrace(String s, int i, CallbackInfoReturnable cir) { + new Exception("ModernFix crash stacktrace").printStackTrace(); + if(this.exception != null) + this.exception.printStackTrace(); + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index d42fa2d3..63666d7b 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -44,6 +44,7 @@ "feature.measure_time.SimpleReloadableResourceManagerMixin", "feature.measure_time.ProfiledReloadInstanceMixin", "feature.branding.BrandingControlMixin", + "feature.direct_stack_trace.CrashReportMixin", "perf.kubejs.TagIngredientJSMixin", "perf.kubejs.TagWrapperMixin", "perf.kubejs.RecipeEventJSMixin", From 50b11b0e1f96f7219f2ac061c65c859b61fafea2 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 6 Mar 2023 13:06:55 -0500 Subject: [PATCH 04/15] Turn off faster texture stitching by default, has random bugs --- .../embeddedt/modernfix/core/config/ModernFixEarlyConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index c6895807..90744504 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -53,7 +53,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("perf.cache_model_materials", true); this.addMixinRule("perf.datapack_reload_exceptions", true); this.addMixinRule("perf.async_locator", true); - this.addMixinRule("perf.faster_texture_stitching", true); + this.addMixinRule("perf.faster_texture_stitching", false); this.addMixinRule("perf.kubejs", true); this.addMixinRule("perf.faster_singleplayer_load", false); /* Keep this off if JEI isn't installed to prevent breaking vanilla gameplay */ From 519e9d40f89b9c2f7b9503b3787517f0edc28acf Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 7 Mar 2023 09:38:54 -0500 Subject: [PATCH 05/15] Turn off two features when incompatible mods are present Fixes BetterEnd crash Fixes #35 --- .../embeddedt/modernfix/core/config/ModernFixEarlyConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 90744504..97881fa5 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -65,8 +65,9 @@ public class ModernFixEarlyConfig { /* Mod compat */ disableIfModPresent("mixin.perf.thread_priorities", "smoothboot"); disableIfModPresent("mixin.perf.async_jei", "modernui"); - disableIfModPresent("mixin.perf.compress_biome_container", "chocolate"); + disableIfModPresent("mixin.perf.compress_biome_container", "chocolate", "betterendforge"); disableIfModPresent("mixin.bugfix.mc218112", "performant"); + disableIfModPresent("mixin.perf.faster_baking", "touhou_little_maid"); } private void disableIfModPresent(String configName, String... ids) { From eed3a80fc1f259e836545e9644682f4d252f436e Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 9 Mar 2023 10:15:29 -0500 Subject: [PATCH 06/15] Add support for using REI for creative search --- build.gradle | 2 + gradle.properties | 3 +- .../core/config/ModernFixEarlyConfig.java | 4 +- .../blast_search_trees/MinecraftMixin.java | 4 ++ .../searchtree/REIBackedSearchTree.java | 48 +++++++++++++++++++ 5 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java diff --git a/build.gradle b/build.gradle index e51ee094..54fc0576 100644 --- a/build.gradle +++ b/build.gradle @@ -62,6 +62,7 @@ repositories { maven { // CTM url "https://maven.tterrag.com/" } + maven { url "https://maven.shedaniel.me" } } dependencies { @@ -92,6 +93,7 @@ dependencies { modRuntimeOnly("curse.maven:jei-238222:4352925") modCompileOnly("curse.maven:jeresources-240630:3831559") + modCompileOnly "me.shedaniel:RoughlyEnoughItems-forge:${rei_version}" } tasks.withType(JavaCompile) { diff --git a/gradle.properties b/gradle.properties index f0e71827..65e3c416 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,4 +13,5 @@ forge_version=1.18.2-40.2.1 lazydfu_version=3544496 parchment_version=2022.11.06 refined_storage_version=4392829 -jei_version=10.2.1.283 \ No newline at end of file +jei_version=10.2.1.283 +rei_version=8.3.590 \ No newline at end of file diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 086b277b..5cd84e82 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -46,9 +46,9 @@ public class ModernFixEarlyConfig { this.addMixinRule("perf.faster_texture_stitching", false); /* off by default in 1.18 because it doesn't work as well */ this.addMixinRule("perf.faster_singleplayer_load", false); - /* Keep this off if JEI isn't installed to prevent breaking vanilla gameplay */ + /* Keep this off if JEI/REI isn't installed to prevent breaking vanilla gameplay */ Optional jeiMod = FMLLoader.getLoadingModList().getMods().stream().filter(mod -> mod.getModId().equals("jei")).findFirst(); - this.addMixinRule("perf.blast_search_trees", jeiMod.isPresent() && jeiMod.get().getVersion().getMajorVersion() >= 10); + this.addMixinRule("perf.blast_search_trees", (jeiMod.isPresent() && jeiMod.get().getVersion().getMajorVersion() >= 10) || FMLLoader.getLoadingModList().getModFileById("roughlyenoughitems") != null); this.addMixinRule("safety", true); this.addMixinRule("launch.transformer_cache", false); this.addMixinRule("launch.class_search_cache", true); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/MinecraftMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/MinecraftMixin.java index cc051e63..a59840aa 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/MinecraftMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/MinecraftMixin.java @@ -7,6 +7,7 @@ import net.minecraftforge.fml.ModList; import net.minecraftforge.forgespi.language.IModFileInfo; import org.embeddedt.modernfix.searchtree.DummySearchTree; import org.embeddedt.modernfix.searchtree.JEIBackedSearchTree; +import org.embeddedt.modernfix.searchtree.REIBackedSearchTree; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -27,6 +28,9 @@ public class MinecraftMixin { if(jeiContainer.isPresent() && jeiContainer.get().getModInfo().getVersion().getMajorVersion() >= 10) { this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new JEIBackedSearchTree(false)); this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new JEIBackedSearchTree(true)); + } else if(ModList.get().isLoaded("roughlyenoughitems")) { + this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new REIBackedSearchTree(false)); + this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new REIBackedSearchTree(true)); } else { this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new DummySearchTree<>()); this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new DummySearchTree<>()); diff --git a/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java b/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java new file mode 100644 index 00000000..73c7c054 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java @@ -0,0 +1,48 @@ +package org.embeddedt.modernfix.searchtree; + +import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; +import me.shedaniel.rei.impl.client.search.AsyncSearchManager; +import net.minecraft.world.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class REIBackedSearchTree extends DummySearchTree { + private final AsyncSearchManager searchManager = new AsyncSearchManager(EntryRegistry.getInstance()::getPreFilteredList, () -> { + return stack -> true; + }, EntryStack::normalize); + + private final boolean filteringByTag; + private String lastSearchText = ""; + private final List listCache = new ArrayList<>(); + + public REIBackedSearchTree(boolean filteringByTag) { + this.filteringByTag = filteringByTag; + } + @Override + public List search(String pSearchText) { + if(true) { + return this.searchREI(pSearchText); + } else { + /* Use the default, dummy implementation */ + return super.search(pSearchText); + } + } + + private List searchREI(String pSearchText) { + if(!pSearchText.equals(lastSearchText)) { + listCache.clear(); + this.searchManager.updateFilter(pSearchText); + List> stacks = this.searchManager.getNow(); + for(EntryStack stack : stacks) { + if(stack.getType() == VanillaEntryTypes.ITEM) { + listCache.add(stack.cheatsAs().getValue()); + } + } + lastSearchText = pSearchText; + } + return listCache; + } +} From 6a7ca1e518ca829ff02efa2fc5585c7f0e92e1c8 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 10 Mar 2023 20:14:11 -0500 Subject: [PATCH 07/15] Remove unnecessary Files.exists call in ModFileResourcePack.getResource() --- .../resourcepacks/ModFileResourcePackMixin.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/resourcepacks/ModFileResourcePackMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/resourcepacks/ModFileResourcePackMixin.java index f4e7d0e9..15d99e15 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/resourcepacks/ModFileResourcePackMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/resourcepacks/ModFileResourcePackMixin.java @@ -3,6 +3,7 @@ package org.embeddedt.modernfix.mixin.perf.resourcepacks; import com.google.common.base.Joiner; import net.minecraft.server.packs.PackType; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.ResourcePackFileNotFoundException; import net.minecraftforge.fml.loading.moddiscovery.ModFile; import net.minecraftforge.fml.packs.ModFileResourcePack; import org.embeddedt.modernfix.util.FileUtil; @@ -14,11 +15,11 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import java.io.IOException; -import java.nio.file.FileSystem; -import java.nio.file.Files; -import java.nio.file.Path; +import java.io.InputStream; +import java.nio.file.*; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -97,6 +98,15 @@ public abstract class ModFileResourcePackMixin { cir.setReturnValue(this.containedPaths.contains(FileUtil.normalize(path))); } + @Inject(method = "getResource(Ljava/lang/String;)Ljava/io/InputStream;", at = @At(value = "INVOKE", target = "Ljava/nio/file/Files;exists(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) + private void fasterGetResource(String resourcePath, CallbackInfoReturnable cir, Path path) throws IOException { + try { + cir.setReturnValue(Files.newInputStream(path, StandardOpenOption.READ)); + } catch(NoSuchFileException e) { + throw new ResourcePackFileNotFoundException(this.modFile.getFilePath().toFile(), resourcePath); + } + } + /** * @author embeddedt * @reason Use cached listing of mod resources From c481ae0f26037b6abb8a97d5fd6ab556ac493496 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 10 Mar 2023 20:14:29 -0500 Subject: [PATCH 08/15] Make some mods compileOnly --- build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index a3395261..079ccc8c 100644 --- a/build.gradle +++ b/build.gradle @@ -86,14 +86,14 @@ dependencies { modRuntimeOnly "curse.maven:lazydfu-460819:${lazydfu_version}" modCompileOnly("mezz.jei:jei-${minecraft_version}:${jei_version}") - modRuntimeOnly("mezz.jei:jei-${minecraft_version}:${jei_version}") + //modRuntimeOnly("mezz.jei:jei-${minecraft_version}:${jei_version}") modCompileOnly("curse.maven:refinedstorage-243076:${refined_storage_version}") - modImplementation("dev.latvian.mods:kubejs-forge:${kubejs_version}") - modImplementation("curse.maven:jeresources-240630:3545538") - modImplementation("curse.maven:jepb-437558:3172880") - modImplementation("curse.maven:babel-436964:3196072") + modCompileOnly("dev.latvian.mods:kubejs-forge:${kubejs_version}") + modCompileOnly("curse.maven:jeresources-240630:3545538") + modCompileOnly("curse.maven:jepb-437558:3172880") + modCompileOnly("curse.maven:babel-436964:3196072") modCompileOnly("curse.maven:twforest-227639:3575220") } From 14e266288a1ff1603c2e44d67f7a381e8c4bbfd3 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 11 Mar 2023 09:38:06 -0500 Subject: [PATCH 09/15] Cache BlockModelShaper.statePropertiesToString --- .../BlockModelShaperMixin.java | 26 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 1 + 2 files changed, 27 insertions(+) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/perf/parallelize_model_loading/BlockModelShaperMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/parallelize_model_loading/BlockModelShaperMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/parallelize_model_loading/BlockModelShaperMixin.java new file mode 100644 index 00000000..9da0fed8 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/parallelize_model_loading/BlockModelShaperMixin.java @@ -0,0 +1,26 @@ +package org.embeddedt.modernfix.mixin.perf.parallelize_model_loading; + +import com.google.common.collect.Interner; +import com.google.common.collect.Interners; +import net.minecraft.client.renderer.block.BlockModelShaper; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Mixin(BlockModelShaper.class) +public class BlockModelShaperMixin { + private static Map stateToPropertiesCache = new ConcurrentHashMap<>(); + + @Redirect(method = "stateToModelLocation(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/client/resources/model/ModelResourceLocation;", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/block/BlockModelShaper;statePropertiesToString(Ljava/util/Map;)Ljava/lang/String;")) + private static String getCachedProperty(Map, Comparable> values, ResourceLocation location, BlockState state) { + /* We intentionally don't use the values parameter inside the lambda to avoid an allocation */ + return stateToPropertiesCache.computeIfAbsent(state, s -> BlockModelShaper.statePropertiesToString(s.getValues())); + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 63666d7b..34c4569b 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -65,6 +65,7 @@ "bugfix.concurrency.RenderTypeMixin", "bugfix.concurrency.MinecraftMixin", "bugfix.concurrency.StaticTagHelperMixin", + "perf.parallelize_model_loading.BlockModelShaperMixin", "perf.parallelize_model_loading.ModelBakeryMixin", "perf.parallelize_model_loading.OBJLoaderMixin", "perf.parallelize_model_loading.multipart.MultipartMixin", From 94bc711008ab64de84f8833a9d7d8bcacf352524 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 11 Mar 2023 09:38:13 -0500 Subject: [PATCH 10/15] Rewrite atlas size calculation logic and re-enable fast texture stitching --- .../core/config/ModernFixEarlyConfig.java | 2 +- .../modernfix/textures/StbStitcher.java | 31 +++++++++++++------ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 97881fa5..760db6ae 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -53,7 +53,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("perf.cache_model_materials", true); this.addMixinRule("perf.datapack_reload_exceptions", true); this.addMixinRule("perf.async_locator", true); - this.addMixinRule("perf.faster_texture_stitching", false); + this.addMixinRule("perf.faster_texture_stitching", true); this.addMixinRule("perf.kubejs", true); this.addMixinRule("perf.faster_singleplayer_load", false); /* Keep this off if JEI isn't installed to prevent breaking vanilla gameplay */ diff --git a/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java b/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java index d2fbb230..7f872371 100644 --- a/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java +++ b/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java @@ -135,7 +135,8 @@ public class StbStitcher { // Initialize the rectangles that we'll be using in the calculation // While that's happening, sum up the area needed to fit all of the images - int sqSize = 0; + int totalArea = 0; + int longestWidth = 0, longestHeight = 0; for (int j = 0; j < holderSize; ++j) { Stitcher.Holder holder = holders[j]; @@ -147,17 +148,29 @@ public class StbStitcher { setWrapper(rect, j, width, height, 0, 0, false); - sqSize += (width * height); + totalArea += (width * height); + longestWidth = Math.max(longestWidth, width); + longestHeight = Math.max(longestHeight, height); } - int size = Mth.smallestEncompassingPowerOfTwo((int) Math.sqrt(sqSize)); - int width = size * 2; // needed to fix weirdness in 1.16 - int height = size; + longestWidth = Mth.smallestEncompassingPowerOfTwo(longestWidth); + longestHeight = Mth.smallestEncompassingPowerOfTwo(longestHeight); + + /* + * The atlas needs to be at least this wide and tall to accomodate oddly shaped sprites. If this is + * not enough, keep doubling the smaller of the two values until its big enough. + */ + while((longestWidth*longestHeight) < totalArea) { + if(longestWidth <= longestHeight) + longestWidth *= 2; + else + longestHeight *= 2; + } // Internal node structure needed for STB - try (STBRPNode.Buffer nodes = STBRPNode.malloc(width + 10)) { + try (STBRPNode.Buffer nodes = STBRPNode.malloc(longestWidth + 10)) { // Initialize the rect packer - STBRectPack.stbrp_init_target(ctx, width, height, nodes); + STBRectPack.stbrp_init_target(ctx, longestWidth, longestHeight, nodes); // Perform rectangle packing STBRectPack.stbrp_pack_rects(ctx, rectBuf); @@ -172,11 +185,11 @@ public class StbStitcher { } // Initialize the sprite now with the position and size that we've calculated so far - infoList.add(new LoadableSpriteInfo(holder.spriteInfo, width, height, getX(rect), getY(rect))); + infoList.add(new LoadableSpriteInfo(holder.spriteInfo, longestWidth, longestHeight, getX(rect), getY(rect))); //holder.spriteInfo.initSprite(size, size, rect.x(), rect.y(), false); } - return Pair.of(Pair.of(width, height), infoList); + return Pair.of(Pair.of(longestWidth, longestHeight), infoList); } } } From 1b5df63eae9bf2f82ae555dd81c385d4269d1095 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 11 Mar 2023 11:13:07 -0500 Subject: [PATCH 11/15] Add debug log when stitcher fails --- .../java/org/embeddedt/modernfix/textures/StbStitcher.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java b/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java index 7f872371..2aaa3ac1 100644 --- a/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java +++ b/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java @@ -6,6 +6,7 @@ import net.minecraft.client.renderer.texture.Stitcher; import net.minecraft.client.renderer.texture.StitcherException; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.Mth; +import org.embeddedt.modernfix.ModernFix; import org.lwjgl.stb.STBRPContext; import org.lwjgl.stb.STBRPNode; import org.lwjgl.stb.STBRPRect; @@ -180,6 +181,10 @@ public class StbStitcher { // Ensure that everything is properly packed! if (!rect.was_packed()) { + ModernFix.LOGGER.error("Stitcher ran out of space with target atlas size " + longestWidth + "x" + longestHeight + ":"); + for(Stitcher.Holder h : holders) { + ModernFix.LOGGER.error(" - " + h.spriteInfo.name() + ", " + h.spriteInfo.width() + "x" + h.spriteInfo.height()); + } throw new StitcherException(holder.spriteInfo, Stream.of(holders).map(arg -> arg.spriteInfo).collect(ImmutableList.toImmutableList())); } From 9eabaac35a29338631ac56f18eb9c7c3af16de18 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 11 Mar 2023 11:29:30 -0500 Subject: [PATCH 12/15] Add system to retry larger atlas sizes --- .../modernfix/textures/StbStitcher.java | 59 ++++++++++++------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java b/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java index 2aaa3ac1..d5958c08 100644 --- a/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java +++ b/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java @@ -158,8 +158,8 @@ public class StbStitcher { longestHeight = Mth.smallestEncompassingPowerOfTwo(longestHeight); /* - * The atlas needs to be at least this wide and tall to accomodate oddly shaped sprites. If this is - * not enough, keep doubling the smaller of the two values until its big enough. + * The atlas needs to be at least this wide and tall to accommodate oddly shaped sprites. If this is + * not enough, keep doubling the smaller of the two values until it's big enough. */ while((longestWidth*longestHeight) < totalArea) { if(longestWidth <= longestHeight) @@ -168,33 +168,52 @@ public class StbStitcher { longestHeight *= 2; } - // Internal node structure needed for STB - try (STBRPNode.Buffer nodes = STBRPNode.malloc(longestWidth + 10)) { - // Initialize the rect packer - STBRectPack.stbrp_init_target(ctx, longestWidth, longestHeight, nodes); + /* + * Sometimes our guess is off and we actually need a bigger atlas. We will try up to 4 times to double + * the atlas size, if that fails then give up. + */ + int numTries = 0; + while(true) { + numTries++; + // Internal node structure needed for STB + try (STBRPNode.Buffer nodes = STBRPNode.malloc(longestWidth + 10)) { + // Initialize the rect packer + STBRectPack.stbrp_init_target(ctx, longestWidth, longestHeight, nodes); - // Perform rectangle packing - STBRectPack.stbrp_pack_rects(ctx, rectBuf); + // Perform rectangle packing + STBRectPack.stbrp_pack_rects(ctx, rectBuf); - for (STBRPRect rect : rectBuf) { - Stitcher.Holder holder = holders[rect.id()]; + for (STBRPRect rect : rectBuf) { + Stitcher.Holder holder = holders[rect.id()]; - // Ensure that everything is properly packed! - if (!rect.was_packed()) { + // Ensure that everything is properly packed! + if (!rect.was_packed()) { + throw new StitcherException(holder.spriteInfo, + Stream.of(holders).map(arg -> arg.spriteInfo).collect(ImmutableList.toImmutableList())); + } + + // Initialize the sprite now with the position and size that we've calculated so far + infoList.add(new LoadableSpriteInfo(holder.spriteInfo, longestWidth, longestHeight, getX(rect), getY(rect))); + //holder.spriteInfo.initSprite(size, size, rect.x(), rect.y(), false); + } + + return Pair.of(Pair.of(longestWidth, longestHeight), infoList); + } catch (StitcherException e) { + if(numTries >= 4) { + // If we get here, we weren't able to stitch. Throw an error. ModernFix.LOGGER.error("Stitcher ran out of space with target atlas size " + longestWidth + "x" + longestHeight + ":"); for(Stitcher.Holder h : holders) { ModernFix.LOGGER.error(" - " + h.spriteInfo.name() + ", " + h.spriteInfo.width() + "x" + h.spriteInfo.height()); } - throw new StitcherException(holder.spriteInfo, - Stream.of(holders).map(arg -> arg.spriteInfo).collect(ImmutableList.toImmutableList())); + throw e; + } else { + // double the atlas size and try again + if(longestWidth <= longestHeight) + longestWidth *= 2; + else + longestHeight *= 2; } - - // Initialize the sprite now with the position and size that we've calculated so far - infoList.add(new LoadableSpriteInfo(holder.spriteInfo, longestWidth, longestHeight, getX(rect), getY(rect))); - //holder.spriteInfo.initSprite(size, size, rect.x(), rect.y(), false); } - - return Pair.of(Pair.of(longestWidth, longestHeight), infoList); } } } From 4d8537ee4f01ec76ec15f63fb38b8251c7696a71 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 11 Mar 2023 11:50:32 -0500 Subject: [PATCH 13/15] Tweak event used to detect main menu appearing, should fix game load not being measured --- src/main/java/org/embeddedt/modernfix/ModernFixClient.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/embeddedt/modernfix/ModernFixClient.java b/src/main/java/org/embeddedt/modernfix/ModernFixClient.java index f0bd2dfc..29673d5d 100644 --- a/src/main/java/org/embeddedt/modernfix/ModernFixClient.java +++ b/src/main/java/org/embeddedt/modernfix/ModernFixClient.java @@ -9,6 +9,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.world.entity.Entity; import net.minecraftforge.client.event.GuiOpenEvent; +import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; @@ -53,7 +54,7 @@ public class ModernFixClient { } @SubscribeEvent(priority = EventPriority.LOWEST) - public void onMultiplayerConnect(GuiOpenEvent event) { + public void onMultiplayerConnect(GuiScreenEvent.InitGuiEvent.Pre event) { if(event.getGui() instanceof ConnectScreen && !event.isCanceled()) { worldLoadStartTime = System.nanoTime(); } else if (event.getGui() instanceof TitleScreen && gameStartTimeSeconds < 0) { From 3380c3c70ef30e41fffced20e30daa7a2df63b0a Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 11 Mar 2023 12:13:28 -0500 Subject: [PATCH 14/15] Bump 1.18 to release status --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 54fc0576..3dcb5ff4 100644 --- a/build.gradle +++ b/build.gradle @@ -159,7 +159,7 @@ curseforge { id = "790626" changelog = '[Changelog is not currently available]' changelogType = "markdown" - releaseType = "beta" + releaseType = "release" addGameVersion "Forge" addGameVersion minecraft_version mainArtifact remapJar From a9605a6888b0176c7c6d0ec4bba1965c955824a3 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 11 Mar 2023 20:12:01 -0500 Subject: [PATCH 15/15] Make REI search tree higher priority than JEI one Fixes issues with REI compat plugin --- .../mixin/perf/blast_search_trees/MinecraftMixin.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/MinecraftMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/MinecraftMixin.java index a59840aa..e75b9892 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/MinecraftMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/MinecraftMixin.java @@ -25,12 +25,12 @@ public class MinecraftMixin { private void replaceSearchTrees(CallbackInfo ci) { ci.cancel(); Optional jeiContainer = ModList.get().getModContainerById("jei"); - if(jeiContainer.isPresent() && jeiContainer.get().getModInfo().getVersion().getMajorVersion() >= 10) { - this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new JEIBackedSearchTree(false)); - this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new JEIBackedSearchTree(true)); - } else if(ModList.get().isLoaded("roughlyenoughitems")) { + if(ModList.get().isLoaded("roughlyenoughitems")) { this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new REIBackedSearchTree(false)); this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new REIBackedSearchTree(true)); + } else if(jeiContainer.isPresent() && jeiContainer.get().getModInfo().getVersion().getMajorVersion() >= 10) { + this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new JEIBackedSearchTree(false)); + this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new JEIBackedSearchTree(true)); } else { this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new DummySearchTree<>()); this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new DummySearchTree<>());