Skip to content

Commit d294b90

Browse files
committed
state leak safety for item renderers
1 parent 3e2eb29 commit d294b90

9 files changed

Lines changed: 93 additions & 8 deletions

File tree

src/main/java/com/falsepattern/falsetweaks/config/RenderingSafetyConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ public class RenderingSafetyConfig {
1515
@Config.LangKey("config.falsetweaks.rendering_safety.tesr")
1616
@Config.DefaultBoolean(true)
1717
public static boolean ENABLE_TESR;
18+
@Config.Comment("Enable safety wrapper for items.")
19+
@Config.LangKey("config.falsetweaks.rendering_safety.item")
20+
@Config.DefaultBoolean(true)
21+
public static boolean ENABLE_ITEM;
1822

1923
static {
2024
ConfigurationManager.selfInit();
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.falsepattern.falsetweaks.mixin.mixins.client.rendersafety;
2+
3+
import com.falsepattern.falsetweaks.config.RenderingSafetyConfig;
4+
import com.falsepattern.falsetweaks.modules.rendersafety.SafetyUtil;
5+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
6+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
7+
import lombok.val;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
11+
import net.minecraft.item.ItemStack;
12+
import net.minecraftforge.client.ForgeHooksClient;
13+
import net.minecraftforge.client.IItemRenderer;
14+
15+
@Mixin(value = ForgeHooksClient.class,
16+
remap = false)
17+
public abstract class ForgeHooksClientMixin {
18+
@WrapOperation(method = {"renderEntityItem", "renderInventoryItem", "renderEquippedItem"},
19+
at = @At(value = "INVOKE",
20+
target = "Lnet/minecraftforge/client/IItemRenderer;renderItem(Lnet/minecraftforge/client/IItemRenderer$ItemRenderType;Lnet/minecraft/item/ItemStack;[Ljava/lang/Object;)V"),
21+
require = 0, // Weak mixin to avoid crashes
22+
expect = 6)
23+
private static void wrapRenderItem(IItemRenderer instance, IItemRenderer.ItemRenderType itemRenderType, ItemStack itemStack, Object[] objects, Operation<Void> original) {
24+
val enable = RenderingSafetyConfig.ENABLE_ITEM;
25+
SafetyUtil.pre(enable);
26+
original.call(instance, itemRenderType, itemStack, objects);
27+
SafetyUtil.post(enable);
28+
}
29+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.falsepattern.falsetweaks.mixin.mixins.client.rendersafety;
2+
3+
import com.falsepattern.falsetweaks.config.RenderingSafetyConfig;
4+
import com.falsepattern.falsetweaks.modules.rendersafety.SafetyUtil;
5+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
6+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
7+
import lombok.val;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
11+
import net.minecraft.client.renderer.ItemRenderer;
12+
import net.minecraft.item.ItemStack;
13+
import net.minecraftforge.client.IItemRenderer;
14+
15+
@Mixin(ItemRenderer.class)
16+
public abstract class ItemRendererMixin {
17+
@WrapOperation(method = "renderItemInFirstPerson",
18+
at = @At(value = "INVOKE",
19+
target = "Lnet/minecraftforge/client/IItemRenderer;renderItem(Lnet/minecraftforge/client/IItemRenderer$ItemRenderType;Lnet/minecraft/item/ItemStack;[Ljava/lang/Object;)V"),
20+
require = 0,
21+
expect = 1)
22+
private void wrapRenderItem(IItemRenderer instance, IItemRenderer.ItemRenderType itemRenderType, ItemStack itemStack, Object[] objects, Operation<Void> original) {
23+
val enable = RenderingSafetyConfig.ENABLE_ITEM;
24+
SafetyUtil.pre(enable);
25+
original.call(instance, itemRenderType, itemStack, objects);
26+
SafetyUtil.post(enable);
27+
}
28+
}

src/main/java/com/falsepattern/falsetweaks/mixin/mixins/client/rendersafety/RenderingRegistryMixin.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.falsepattern.falsetweaks.mixin.mixins.client.rendersafety;
22

33
import com.falsepattern.falsetweaks.config.RenderingSafetyConfig;
4+
import com.falsepattern.falsetweaks.modules.rendersafety.SafetyUtil;
45
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
56
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
67
import lombok.val;
@@ -9,6 +10,7 @@
910
import org.spongepowered.asm.mixin.injection.At;
1011

1112
import net.minecraft.block.Block;
13+
import net.minecraft.client.renderer.OpenGlHelper;
1214
import net.minecraft.client.renderer.RenderBlocks;
1315
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
1416
import cpw.mods.fml.client.registry.RenderingRegistry;
@@ -22,10 +24,8 @@ public abstract class RenderingRegistryMixin {
2224
require = 1)
2325
private void wrapBlock(ISimpleBlockRenderingHandler instance, Block block, int metadata, int modelID, RenderBlocks renderer, Operation<Void> original) {
2426
val enable = RenderingSafetyConfig.ENABLE_BLOCK;
25-
if (enable)
26-
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
27+
SafetyUtil.pre(enable);
2728
original.call(instance, block, metadata, modelID, renderer);
28-
if (enable)
29-
GL11.glPopAttrib();
29+
SafetyUtil.post(enable);
3030
}
3131
}

src/main/java/com/falsepattern/falsetweaks/mixin/mixins/client/rendersafety/TileEntityRendererDispatcherMixin.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.falsepattern.falsetweaks.mixin.mixins.client.rendersafety;
22

33
import com.falsepattern.falsetweaks.config.RenderingSafetyConfig;
4+
import com.falsepattern.falsetweaks.modules.rendersafety.SafetyUtil;
45
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
56
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
67
import lombok.val;
78
import org.lwjgl.opengl.GL11;
89
import org.spongepowered.asm.mixin.Mixin;
910
import org.spongepowered.asm.mixin.injection.At;
1011

12+
import net.minecraft.client.renderer.OpenGlHelper;
1113
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
1214
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
1315
import net.minecraft.tileentity.TileEntity;
@@ -20,10 +22,8 @@ public abstract class TileEntityRendererDispatcherMixin {
2022
require = 1)
2123
private void wrapTESR(TileEntitySpecialRenderer instance, TileEntity entity, double x, double y, double z, float tickDelta, Operation<Void> original) {
2224
val enable = RenderingSafetyConfig.ENABLE_TESR;
23-
if (enable)
24-
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
25+
SafetyUtil.pre(enable);
2526
original.call(instance, entity, x, y, z, tickDelta);
26-
if (enable)
27-
GL11.glPopAttrib();
27+
SafetyUtil.post(enable);
2828
}
2929
}

src/main/java/com/falsepattern/falsetweaks/mixin/plugin/standard/Mixin.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,8 @@ public enum Mixin implements IMixin {
343343
//endregion Debug
344344

345345
//region Render Safety
346+
RenderingSafety_ForgeHooksClientMixin(Side.CLIENT, condition(() -> ModuleConfig.RENDERING_SAFETY), "rendersafety.ForgeHooksClientMixin"),
347+
RenderingSafety_ItemRendererMixin(Side.CLIENT, condition(() -> ModuleConfig.RENDERING_SAFETY), "rendersafety.ItemRendererMixin"),
346348
RenderingSafety_RenderingRegistryMixin(Side.CLIENT, condition(() -> ModuleConfig.RENDERING_SAFETY), "rendersafety.RenderingRegistryMixin"),
347349
RenderingSafety_TileEntityRendererDispatcherMixin(Side.CLIENT, condition(() -> ModuleConfig.RENDERING_SAFETY).and(avoid(TargetedMod.DRAGONAPI)), "rendersafety.TileEntityRendererDispatcherMixin"),
348350
RenderingSafety_DragonAPI_TileEntityRenderEventMixin(Side.CLIENT, condition(() -> ModuleConfig.RENDERING_SAFETY).and(require(TargetedMod.DRAGONAPI)), "rendersafety.dragonapi.TileEntityRenderEventMixin"),
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.falsepattern.falsetweaks.modules.rendersafety;
2+
3+
import org.lwjgl.opengl.GL11;
4+
5+
import net.minecraft.client.renderer.OpenGlHelper;
6+
7+
public class SafetyUtil {
8+
public static void pre(boolean enable) {
9+
if (enable) {
10+
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
11+
}
12+
}
13+
14+
public static void post(boolean enable) {
15+
if (enable) {
16+
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
17+
GL11.glPopAttrib();
18+
}
19+
}
20+
}

src/main/resources/assets/falsetweaks/lang/en_US.lang

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ config.falsetweaks.rendering_safety.category=Rendering Safety
6565
config.falsetweaks.rendering_safety.category.tooltip=OpenGL state leakage fixes for inventory block renderers and tile entities
6666
config.falsetweaks.rendering_safety.block=Enable for inventory blocks
6767
config.falsetweaks.rendering_safety.tesr=Enable for tile entities
68+
config.falsetweaks.rendering_safety.item=Enable for items
6869

6970
gui.triangulator.calibrationdescription.line0=Click the Toggle button until the
7071
gui.triangulator.calibrationdescription.line1=yellow and the blue squares look the same,

src/main/resources/assets/falsetweaks/lang/zh_CN.lang

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ config.falsetweaks.threading.logISBRHErrors=记录 ISimpleBlockRenderingHandler
6666
#TODO config.falsetweaks.rendering_safety.category.tooltip=OpenGL state leakage fixes for inventory block renderers and tile entities
6767
#TODO config.falsetweaks.rendering_safety.block=Enable for inventory blocks
6868
#TODO config.falsetweaks.rendering_safety.tesr=Enable for tile entities
69+
#TODO config.falsetweaks.rendering_safety.item=Enable for items
6970

7071
gui.triangulator.calibrationdescription.line0=点击切换按钮直到
7172
gui.triangulator.calibrationdescription.line1=黄色和蓝色方块看起来一样,

0 commit comments

Comments
 (0)