From 12d69bec45312ca790263425e73e2e75408994cb Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 4 Feb 2024 20:05:05 -0500 Subject: [PATCH 1/4] Fix https://github.com/MinecraftForge/MinecraftForge/issues/9118 --- .../LivingEntityRendererMixin.java | 30 +++++++++++++++++++ .../PlayerRendererMixin.java | 30 +++++++++++++++++++ .../entity_pose_stack/PoseStackAccessor.java | 15 ++++++++++ 3 files changed, 75 insertions(+) create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PlayerRendererMixin.java create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java new file mode 100644 index 00000000..de7fd35a --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java @@ -0,0 +1,30 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.entity_pose_stack; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraftforge.client.event.RenderLivingEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.IEventBus; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(LivingEntityRenderer.class) +@ClientOnlyMixin +public class LivingEntityRendererMixin { + @Redirect(method = "render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z", ordinal = 0)) + private boolean fireCheckingPoseStack(IEventBus instance, Event event) { + PoseStack stack = ((RenderLivingEvent)event).getMatrixStack(); + int size = ((PoseStackAccessor)stack).getPoseStack().size(); + if (instance.post(event)) { + // Pop the stack if someone pushed it in the event + while (((PoseStackAccessor)stack).getPoseStack().size() > size) { + stack.popPose(); + } + return true; + } else { + return false; + } + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PlayerRendererMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PlayerRendererMixin.java new file mode 100644 index 00000000..c719a95b --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PlayerRendererMixin.java @@ -0,0 +1,30 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.entity_pose_stack; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraftforge.client.event.RenderPlayerEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.IEventBus; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(PlayerRenderer.class) +@ClientOnlyMixin +public class PlayerRendererMixin { + @Redirect(method = "render(Lnet/minecraft/client/player/AbstractClientPlayer;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z", ordinal = 0)) + private boolean fireCheckingPoseStack(IEventBus instance, Event event) { + PoseStack stack = ((RenderPlayerEvent)event).getMatrixStack(); + int size = ((PoseStackAccessor)stack).getPoseStack().size(); + if (instance.post(event)) { + // Pop the stack if someone pushed it in the event + while (((PoseStackAccessor)stack).getPoseStack().size() > size) { + stack.popPose(); + } + return true; + } else { + return false; + } + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java new file mode 100644 index 00000000..a0a8ec30 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java @@ -0,0 +1,15 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.entity_pose_stack; + +import com.mojang.blaze3d.vertex.PoseStack; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Deque; + +@Mixin(PoseStack.class) +@ClientOnlyMixin +public interface PoseStackAccessor { + @Accessor + Deque getPoseStack(); +} From 2120774df50bedf35ca412e06caac332eac944c2 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 4 Feb 2024 20:21:53 -0500 Subject: [PATCH 2/4] Update patch for 1.18 --- .../bugfix/entity_pose_stack/LivingEntityRendererMixin.java | 2 +- .../mixin/bugfix/entity_pose_stack/PlayerRendererMixin.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java index de7fd35a..10109809 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; public class LivingEntityRendererMixin { @Redirect(method = "render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z", ordinal = 0)) private boolean fireCheckingPoseStack(IEventBus instance, Event event) { - PoseStack stack = ((RenderLivingEvent)event).getMatrixStack(); + PoseStack stack = ((RenderLivingEvent)event).getPoseStack(); int size = ((PoseStackAccessor)stack).getPoseStack().size(); if (instance.post(event)) { // Pop the stack if someone pushed it in the event diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PlayerRendererMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PlayerRendererMixin.java index c719a95b..71180460 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PlayerRendererMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PlayerRendererMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; public class PlayerRendererMixin { @Redirect(method = "render(Lnet/minecraft/client/player/AbstractClientPlayer;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z", ordinal = 0)) private boolean fireCheckingPoseStack(IEventBus instance, Event event) { - PoseStack stack = ((RenderPlayerEvent)event).getMatrixStack(); + PoseStack stack = ((RenderPlayerEvent)event).getPoseStack(); int size = ((PoseStackAccessor)stack).getPoseStack().size(); if (instance.post(event)) { // Pop the stack if someone pushed it in the event From e91220cdea6f276309af84a7e0df86feee3a29a5 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 7 Feb 2024 15:28:01 -0500 Subject: [PATCH 3/4] Retrieve missing model when first required --- .../DynamicBakedModelProvider.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java index 304b669d..b602af14 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java @@ -91,11 +91,6 @@ public class DynamicBakedModelProvider implements Map Date: Fri, 23 Feb 2024 16:45:01 -0500 Subject: [PATCH 4/4] Use fastutil maps for holder lookups in Forge registry --- .../perf/forge_registry_alloc/ForgeRegistryMixin.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/forge_registry_alloc/ForgeRegistryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/forge_registry_alloc/ForgeRegistryMixin.java index 920136ae..bf045369 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/forge_registry_alloc/ForgeRegistryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/forge_registry_alloc/ForgeRegistryMixin.java @@ -1,5 +1,6 @@ package org.embeddedt.modernfix.forge.mixin.perf.forge_registry_alloc; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -14,9 +15,11 @@ import java.util.Map; @Mixin(value = ForgeRegistry.class, remap = false) public abstract class ForgeRegistryMixin { - @Shadow @Final private Map> delegatesByName; + // Replace the backing maps with fastutil maps for a bit more speed, since value->holder lookups in particular + // are a bottleneck in many areas (e.g. render type lookup) + @Shadow @Final private Map> delegatesByName = new Object2ObjectOpenHashMap<>(); - @Shadow @Final private Map> delegatesByValue; + @Shadow @Final private Map> delegatesByValue = new Object2ObjectOpenHashMap<>(); /** * @author embeddedt