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 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..71180460 --- /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).getPoseStack(); + 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(); +} 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