Skip to content

Commit ac436db

Browse files
committed
Add support to dynamic resources for item overrides
1 parent e65f8fb commit ac436db

File tree

3 files changed

+109
-0
lines changed

3 files changed

+109
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources;
2+
3+
import net.minecraft.client.renderer.block.model.ItemOverride;
4+
import net.minecraft.client.renderer.block.model.ItemOverrides;
5+
import net.minecraft.client.resources.model.BakedModel;
6+
import org.embeddedt.modernfix.dynamicresources.ItemOverrideBakedModel;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.ModifyArg;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
12+
13+
import java.util.function.Function;
14+
15+
@Mixin(ItemOverrides.class)
16+
public class ItemOverridesMixin {
17+
@ModifyArg(method = "*", at = @At(value = "INVOKE", target = "Ljava/util/stream/Stream;map(Ljava/util/function/Function;)Ljava/util/stream/Stream;"), index = 0)
18+
private Function<ItemOverride, BakedModel> itemToBaked(Function<ItemOverride, BakedModel> original) {
19+
return override -> ItemOverrideBakedModel.of(override.getModel());
20+
}
21+
22+
@Inject(method = "resolve", at = @At("RETURN"), cancellable = true)
23+
private void getRealModel(CallbackInfoReturnable<BakedModel> cir) {
24+
BakedModel original = cir.getReturnValue();
25+
if(original instanceof ItemOverrideBakedModel) {
26+
ItemOverrideBakedModel override = (ItemOverrideBakedModel)original;
27+
cir.setReturnValue(override.getRealModel());
28+
}
29+
}
30+
}

common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.stream.Collectors;
2323

2424
public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedModel> {
25+
public static DynamicBakedModelProvider currentInstance = null;
2526
private final ModelBakery bakery;
2627
private final Map<Triple<ResourceLocation, Transformation, Boolean>, BakedModel> bakedCache;
2728
private final Map<ResourceLocation, BakedModel> permanentOverrides;
@@ -72,6 +73,7 @@ public DynamicBakedModelProvider(ModelBakery bakery, Map<Triple<ResourceLocation
7273
this.bakery = bakery;
7374
this.bakedCache = cache;
7475
this.permanentOverrides = Collections.synchronizedMap(new Object2ObjectOpenHashMap<>());
76+
currentInstance = this;
7577
}
7678

7779
public void setMissingModel(BakedModel model) {
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package org.embeddedt.modernfix.dynamicresources;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import net.minecraft.client.renderer.block.model.BakedQuad;
5+
import net.minecraft.client.renderer.block.model.ItemOverrides;
6+
import net.minecraft.client.renderer.block.model.ItemTransforms;
7+
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
8+
import net.minecraft.client.resources.model.BakedModel;
9+
import net.minecraft.core.Direction;
10+
import net.minecraft.resources.ResourceLocation;
11+
import net.minecraft.world.level.block.state.BlockState;
12+
import org.jetbrains.annotations.Nullable;
13+
14+
import java.util.List;
15+
import java.util.Map;
16+
import java.util.Random;
17+
import java.util.concurrent.ConcurrentHashMap;
18+
19+
/**
20+
* Delegate model that stores the location of an actual baked model, for use in ItemOverrides.
21+
*/
22+
public class ItemOverrideBakedModel implements BakedModel {
23+
private static final Map<ResourceLocation, ItemOverrideBakedModel> OVERRIDE_MODELS = new ConcurrentHashMap<>();
24+
public final ResourceLocation realLocation;
25+
26+
private ItemOverrideBakedModel(ResourceLocation realLocation) {
27+
this.realLocation = realLocation;
28+
}
29+
30+
public static ItemOverrideBakedModel of(ResourceLocation realLocation) {
31+
return OVERRIDE_MODELS.computeIfAbsent(realLocation, ItemOverrideBakedModel::new);
32+
}
33+
34+
public BakedModel getRealModel() {
35+
return DynamicBakedModelProvider.currentInstance.get(realLocation);
36+
}
37+
38+
@Override
39+
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction direction, Random random) {
40+
return ImmutableList.of();
41+
}
42+
43+
@Override
44+
public boolean useAmbientOcclusion() {
45+
return false;
46+
}
47+
48+
@Override
49+
public boolean isGui3d() {
50+
return false;
51+
}
52+
53+
@Override
54+
public boolean usesBlockLight() {
55+
return false;
56+
}
57+
58+
@Override
59+
public boolean isCustomRenderer() {
60+
return false;
61+
}
62+
63+
@Override
64+
public TextureAtlasSprite getParticleIcon() {
65+
return null;
66+
}
67+
68+
@Override
69+
public ItemTransforms getTransforms() {
70+
return ItemTransforms.NO_TRANSFORMS;
71+
}
72+
73+
@Override
74+
public ItemOverrides getOverrides() {
75+
return null;
76+
}
77+
}

0 commit comments

Comments
 (0)