Skip to content

Commit 144bdaa

Browse files
committed
Merge remote-tracking branch 'origin/1.19.2' into 1.19.4
2 parents 830eb19 + 444f5ad commit 144bdaa

File tree

6 files changed

+183
-99
lines changed

6 files changed

+183
-99
lines changed

common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/edge_chunk_not_saved/ChunkManagerMixin.java

Lines changed: 0 additions & 33 deletions
This file was deleted.

common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java

Lines changed: 12 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -2,55 +2,34 @@
22

33
import com.mojang.blaze3d.vertex.PoseStack;
44
import com.mojang.blaze3d.vertex.VertexConsumer;
5-
import net.minecraft.client.color.item.ItemColors;
65
import net.minecraft.client.renderer.MultiBufferSource;
7-
import net.minecraft.client.renderer.block.model.BakedQuad;
86
import net.minecraft.client.renderer.block.model.ItemTransform;
97
import net.minecraft.client.renderer.entity.ItemRenderer;
108
import net.minecraft.client.resources.model.BakedModel;
119
import net.minecraft.client.resources.model.SimpleBakedModel;
12-
import net.minecraft.core.Direction;
1310
import net.minecraft.util.RandomSource;
1411
import net.minecraft.world.item.ItemDisplayContext;
1512
import net.minecraft.world.item.BlockItem;
1613
import net.minecraft.world.item.ItemStack;
1714
import org.embeddedt.modernfix.render.FastItemRenderType;
1815
import org.embeddedt.modernfix.render.RenderState;
19-
import org.spongepowered.asm.mixin.Final;
16+
import org.embeddedt.modernfix.render.SimpleItemModelView;
2017
import org.spongepowered.asm.mixin.Mixin;
21-
import org.spongepowered.asm.mixin.Shadow;
2218
import org.spongepowered.asm.mixin.injection.At;
2319
import org.spongepowered.asm.mixin.injection.Inject;
20+
import org.spongepowered.asm.mixin.injection.ModifyVariable;
2421
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
2522

26-
import java.util.List;
27-
28-
@Mixin(ItemRenderer.class)
23+
@Mixin(value = ItemRenderer.class, priority = 600)
2924
public abstract class ItemRendererMixin {
30-
@Shadow @Final private ItemColors itemColors;
31-
32-
private final RandomSource dummyRandom = RandomSource.createNewThreadLocalInstance();
33-
34-
private static final float[] COLOR_MULTIPLIER = new float[]{1.0F, 1.0F, 1.0F, 1.0F};
35-
3625
private ItemDisplayContext transformType;
26+
private final SimpleItemModelView modelView = new SimpleItemModelView();
3727

3828
@Inject(method = "render", at = @At("HEAD"))
3929
private void markRenderingType(ItemStack itemStack, ItemDisplayContext transformType, boolean leftHand, PoseStack matrixStack, MultiBufferSource buffer, int combinedLight, int combinedOverlay, BakedModel model, CallbackInfo ci) {
4030
this.transformType = transformType;
4131
}
4232

43-
private static final Direction[] ITEM_DIRECTIONS = new Direction[] { Direction.SOUTH };
44-
private static final Direction[] BLOCK_DIRECTIONS = new Direction[] { Direction.UP, Direction.EAST, Direction.NORTH };
45-
46-
private boolean isCorrectDirectionForType(FastItemRenderType type, Direction direction) {
47-
if(type == FastItemRenderType.SIMPLE_ITEM)
48-
return direction == Direction.SOUTH;
49-
else {
50-
return direction == Direction.UP || direction == Direction.EAST || direction == Direction.NORTH;
51-
}
52-
}
53-
5433
/**
5534
* If a model
5635
* - is a vanilla item model (SimpleBakedModel),
@@ -59,8 +38,8 @@ private boolean isCorrectDirectionForType(FastItemRenderType type, Direction dir
5938
* we do not need to go through the process of rendering every quad. Just render the south ones (the ones facing the
6039
* camera).
6140
*/
62-
@Inject(method = "renderModelLists", at = @At("HEAD"), cancellable = true)
63-
private void fasterItemRender(BakedModel model, ItemStack stack, int combinedLight, int combinedOverlay, PoseStack matrixStack, VertexConsumer buffer, CallbackInfo ci) {
41+
@ModifyVariable(method = "renderModelLists", at = @At("HEAD"), index = 1, argsOnly = true)
42+
private BakedModel useSimpleWrappedItemModel(BakedModel model, BakedModel arg, ItemStack stack, int combinedLight, int combinedOverlay, PoseStack matrixStack, VertexConsumer buffer) {
6443
if(!RenderState.IS_RENDERING_LEVEL && !stack.isEmpty() && model.getClass() == SimpleBakedModel.class && transformType == ItemDisplayContext.GUI) {
6544
FastItemRenderType type;
6645
ItemTransform transform = model.getTransforms().gui;
@@ -69,43 +48,17 @@ private void fasterItemRender(BakedModel model, ItemStack stack, int combinedLig
6948
else if(stack.getItem() instanceof BlockItem && isBlockTransforms(transform))
7049
type = FastItemRenderType.SIMPLE_BLOCK;
7150
else
72-
return;
73-
ci.cancel();
74-
PoseStack.Pose pose = matrixStack.last();
75-
int[] combinedLights = new int[] {combinedLight, combinedLight, combinedLight, combinedLight};
76-
Direction[] directions = type == FastItemRenderType.SIMPLE_ITEM ? ITEM_DIRECTIONS : BLOCK_DIRECTIONS;
77-
for(Direction direction : directions) {
78-
List<BakedQuad> culledFaces = model.getQuads(null, direction, dummyRandom);
79-
/* check size to avoid instantiating iterator when the list is empty */
80-
if(culledFaces.size() > 0) {
81-
for(BakedQuad quad : culledFaces) {
82-
render2dItemFace(quad, stack, buffer, pose, combinedLights, combinedOverlay);
83-
}
84-
}
85-
}
86-
List<BakedQuad> unculledFaces = model.getQuads(null, null, dummyRandom);
87-
for(BakedQuad quad : unculledFaces) {
88-
if(isCorrectDirectionForType(type, quad.getDirection()))
89-
render2dItemFace(quad, stack, buffer, pose, combinedLights, combinedOverlay);
90-
}
91-
}
51+
return model;
52+
modelView.setItem(model);
53+
modelView.setType(type);
54+
return modelView;
55+
} else
56+
return model;
9257
}
9358

9459
private boolean isBlockTransforms(ItemTransform transform) {
9560
return transform.rotation.x() == 30f
9661
&& transform.rotation.y() == 225f
9762
&& transform.rotation.z() == 0f;
9863
}
99-
100-
private void render2dItemFace(BakedQuad quad, ItemStack stack, VertexConsumer buffer, PoseStack.Pose pose, int[] combinedLights, int combinedOverlay) {
101-
int i = -1;
102-
if (quad.isTinted()) {
103-
i = this.itemColors.getColor(stack, quad.getTintIndex());
104-
}
105-
106-
float f = (float)(i >> 16 & 255) / 255.0F;
107-
float f1 = (float)(i >> 8 & 255) / 255.0F;
108-
float f2 = (float)(i & 255) / 255.0F;
109-
buffer.putBulkData(pose, quad, COLOR_MULTIPLIER, f, f1, f2, combinedLights, combinedOverlay, true);
110-
}
11164
}

common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ public static String sanitize(String mixinClassName) {
5959
private final Set<String> mixinOptions = new ObjectOpenHashSet<>();
6060
private final Map<String, String> mixinsMissingMods = new Object2ObjectOpenHashMap<>();
6161

62+
public static boolean isFabric = false;
63+
6264
public Map<String, String> getPermanentlyDisabledMixins() {
6365
return mixinsMissingMods;
6466
}
@@ -71,6 +73,8 @@ private void scanForAndBuildMixinOptions() {
7173
if(stream == null)
7274
continue;
7375
try(Reader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) {
76+
if(configFile.contains("fabric"))
77+
isFabric = true;
7478
JsonObject configObject = (JsonObject)new JsonParser().parse(reader);
7579
JsonArray mixinList = configObject.getAsJsonArray("mixins");
7680
String packageName = configObject.get("package").getAsString().replace('.', '/');
@@ -178,15 +182,20 @@ private ModernFixEarlyConfig(File file) {
178182
disableIfModPresent("mixin.perf.thread_priorities", "smoothboot");
179183
disableIfModPresent("mixin.perf.boost_worker_count", "smoothboot");
180184
disableIfModPresent("mixin.perf.async_jei", "modernui");
181-
disableIfModPresent("mixin.perf.compress_biome_container", "chocolate", "betterendforge");
185+
disableIfModPresent("mixin.perf.compress_biome_container", "chocolate", "betterendforge" ,"skyblockbuilder");
182186
disableIfModPresent("mixin.bugfix.mc218112", "performant");
183187
disableIfModPresent("mixin.bugfix.remove_block_chunkloading", "performant");
184188
disableIfModPresent("mixin.bugfix.paper_chunk_patches", "c2me");
189+
// DimThread makes changes to the server chunk manager (understandably), C2ME probably does the same
190+
disableIfModPresent("mixin.bugfix.chunk_deadlock", "c2me", "dimthread");
185191
disableIfModPresent("mixin.perf.reuse_datapacks", "tac");
186192
disableIfModPresent("mixin.launch.class_search_cache", "optifine");
187193
disableIfModPresent("mixin.perf.faster_texture_stitching", "optifine");
188194
disableIfModPresent("mixin.perf.datapack_reload_exceptions", "cyanide");
189195
disableIfModPresent("mixin.perf.faster_texture_loading", "stitch", "optifine", "changed");
196+
if(isFabric) {
197+
disableIfModPresent("mixin.bugfix.packet_leak", "memoryleakfix");
198+
}
190199
}
191200

192201
private void disableIfModPresent(String configName, String... ids) {
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package org.embeddedt.modernfix.render;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
5+
import net.minecraft.client.renderer.block.model.BakedQuad;
6+
import net.minecraft.client.renderer.block.model.ItemOverrides;
7+
import net.minecraft.client.renderer.block.model.ItemTransforms;
8+
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
9+
import net.minecraft.client.resources.model.BakedModel;
10+
import net.minecraft.core.Direction;
11+
import net.minecraft.util.RandomSource;
12+
import net.minecraft.world.level.block.state.BlockState;
13+
import org.jetbrains.annotations.Nullable;
14+
15+
import java.util.List;
16+
17+
/**
18+
* Wrapper class that presents a fake view of item models (only showing the simple front-facing quads), rather
19+
* than every quad.
20+
*/
21+
public class SimpleItemModelView implements BakedModel {
22+
private BakedModel wrappedItem;
23+
private FastItemRenderType type;
24+
25+
public void setItem(BakedModel model) {
26+
this.wrappedItem = model;
27+
}
28+
29+
public void setType(FastItemRenderType type) {
30+
this.type = type;
31+
}
32+
33+
private boolean isCorrectDirectionForType(Direction direction) {
34+
if(type == FastItemRenderType.SIMPLE_ITEM)
35+
return direction == Direction.SOUTH;
36+
else {
37+
return direction == Direction.UP || direction == Direction.EAST || direction == Direction.NORTH;
38+
}
39+
}
40+
41+
private final List<BakedQuad> nullQuadList = new ObjectArrayList<>();
42+
43+
@Override
44+
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand) {
45+
if(side != null) {
46+
return isCorrectDirectionForType(side) ? wrappedItem.getQuads(state, side, rand) : ImmutableList.of();
47+
} else {
48+
nullQuadList.clear();
49+
List<BakedQuad> realList = wrappedItem.getQuads(state, null, rand);
50+
for(int i = 0; i < realList.size(); i++) {
51+
BakedQuad quad = realList.get(i);
52+
if(isCorrectDirectionForType(quad.getDirection())) {
53+
nullQuadList.add(quad);
54+
}
55+
}
56+
return nullQuadList;
57+
}
58+
}
59+
60+
@Override
61+
public boolean useAmbientOcclusion() {
62+
return wrappedItem.useAmbientOcclusion();
63+
}
64+
65+
@Override
66+
public boolean isGui3d() {
67+
return wrappedItem.isGui3d();
68+
}
69+
70+
@Override
71+
public boolean usesBlockLight() {
72+
return wrappedItem.usesBlockLight();
73+
}
74+
75+
@Override
76+
public boolean isCustomRenderer() {
77+
return wrappedItem.isCustomRenderer();
78+
}
79+
80+
@Override
81+
public TextureAtlasSprite getParticleIcon() {
82+
return wrappedItem.getParticleIcon();
83+
}
84+
85+
@Override
86+
public ItemTransforms getTransforms() {
87+
return wrappedItem.getTransforms();
88+
}
89+
90+
@Override
91+
public ItemOverrides getOverrides() {
92+
return wrappedItem.getOverrides();
93+
}
94+
}

common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
package org.embeddedt.modernfix.searchtree;
22

3+
import com.google.common.base.Predicates;
34
import me.shedaniel.rei.api.client.registry.entry.EntryRegistry;
45
import me.shedaniel.rei.api.common.entry.EntryStack;
56
import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes;
67
import me.shedaniel.rei.impl.client.search.AsyncSearchManager;
8+
import me.shedaniel.rei.impl.common.entry.type.EntryRegistryImpl;
9+
import me.shedaniel.rei.impl.common.util.HashedEntryStackWrapper;
710
import net.minecraft.client.searchtree.RefreshableSearchTree;
811
import net.minecraft.world.item.ItemStack;
912
import org.embeddedt.modernfix.ModernFix;
1013
import org.embeddedt.modernfix.platform.ModernFixPlatformHooks;
1114

15+
import java.lang.invoke.MethodHandle;
16+
import java.lang.invoke.MethodHandles;
17+
import java.lang.reflect.Method;
1218
import java.util.ArrayList;
1319
import java.util.Collections;
1420
import java.util.List;
21+
import java.util.function.Supplier;
22+
import java.util.function.UnaryOperator;
1523

1624
public class REIBackedSearchTree extends DummySearchTree<ItemStack> {
17-
private final AsyncSearchManager searchManager = new AsyncSearchManager(EntryRegistry.getInstance()::getPreFilteredList, () -> {
18-
return stack -> true;
19-
}, EntryStack::normalize);
25+
private final AsyncSearchManager searchManager = createSearchManager();
2026

2127
private final boolean filteringByTag;
2228
private String lastSearchText = "";
@@ -39,14 +45,23 @@ private List<ItemStack> searchREI(String pSearchText) {
3945
if(!pSearchText.equals(lastSearchText)) {
4046
listCache.clear();
4147
this.searchManager.updateFilter(pSearchText);
42-
List<EntryStack<?>> stacks;
48+
List stacks;
4349
try {
4450
stacks = this.searchManager.getNow();
4551
} catch(RuntimeException e) {
4652
ModernFix.LOGGER.error("Couldn't search for '" + pSearchText + "'", e);
4753
stacks = Collections.emptyList();
4854
}
49-
for(EntryStack<?> stack : stacks) {
55+
for(Object o : stacks) {
56+
EntryStack<?> stack;
57+
if(o instanceof EntryStack<?>)
58+
stack = (EntryStack<?>)o;
59+
else if(o instanceof HashedEntryStackWrapper) {
60+
stack = ((HashedEntryStackWrapper)o).unwrap();
61+
} else {
62+
ModernFix.LOGGER.error("Don't know how to handle {}", o.getClass().getName());
63+
continue;
64+
}
5065
if(stack.getType() == VanillaEntryTypes.ITEM) {
5166
listCache.add(stack.cheatsAs().getValue());
5267
}
@@ -56,6 +71,50 @@ private List<ItemStack> searchREI(String pSearchText) {
5671
return listCache;
5772
}
5873

74+
@SuppressWarnings({"unchecked", "rawtypes"})
75+
private static AsyncSearchManager createSearchManager() {
76+
Method m, normalizeMethod;
77+
try {
78+
try {
79+
m = EntryRegistryImpl.class.getDeclaredMethod("getPreFilteredComplexList");
80+
m.setAccessible(true);
81+
normalizeMethod = HashedEntryStackWrapper.class.getDeclaredMethod("normalize");
82+
normalizeMethod.setAccessible(true);
83+
} catch(NoSuchMethodException e) {
84+
m = EntryRegistryImpl.class.getDeclaredMethod("getPreFilteredList");
85+
m.setAccessible(true);
86+
normalizeMethod = EntryStack.class.getDeclaredMethod("normalize");
87+
normalizeMethod.setAccessible(true);
88+
}
89+
final MethodHandle getListMethod = MethodHandles.publicLookup().unreflect(m);
90+
final MethodHandle normalize = MethodHandles.publicLookup().unreflect(normalizeMethod);
91+
final EntryRegistryImpl registry = (EntryRegistryImpl)EntryRegistry.getInstance();
92+
Supplier stackListSupplier = () -> {
93+
try {
94+
return (List)getListMethod.invokeExact(registry);
95+
} catch(Throwable e) {
96+
if(e instanceof RuntimeException)
97+
throw (RuntimeException)e;
98+
throw new RuntimeException(e);
99+
}
100+
};
101+
UnaryOperator normalizeOperator = o -> {
102+
try {
103+
return normalize.invoke(o);
104+
} catch(Throwable e) {
105+
if(e instanceof RuntimeException)
106+
throw (RuntimeException)e;
107+
throw new RuntimeException(e);
108+
}
109+
};
110+
return new AsyncSearchManager(stackListSupplier, () -> {
111+
return Predicates.alwaysTrue();
112+
}, normalizeOperator);
113+
} catch(ReflectiveOperationException e) {
114+
throw new RuntimeException(e);
115+
}
116+
}
117+
59118
public static final SearchTreeProviderRegistry.Provider PROVIDER = new SearchTreeProviderRegistry.Provider() {
60119
@Override
61120
public RefreshableSearchTree<ItemStack> getSearchTree(boolean tag) {

0 commit comments

Comments
 (0)