Skip to content

Commit 2f5b2c1

Browse files
committed
Re-add support for emissive item models
1 parent 4050d7e commit 2f5b2c1

3 files changed

Lines changed: 72 additions & 0 deletions

File tree

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package me.pepperbell.continuity.client.mixin;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import org.jetbrains.annotations.Nullable;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.Unique;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
import org.spongepowered.asm.mixin.injection.Inject;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12+
13+
import com.llamalad7.mixinextras.sugar.Local;
14+
15+
import me.pepperbell.continuity.client.config.ContinuityConfig;
16+
import me.pepperbell.continuity.client.mixinterface.SpriteExtension;
17+
import me.pepperbell.continuity.client.util.QuadUtil;
18+
import net.minecraft.client.render.item.ItemRenderState;
19+
import net.minecraft.client.render.item.model.BasicItemModel;
20+
import net.minecraft.client.render.item.tint.TintSource;
21+
import net.minecraft.client.render.model.BakedQuad;
22+
import net.minecraft.client.render.model.ModelSettings;
23+
import net.minecraft.client.texture.Sprite;
24+
25+
@Mixin(BasicItemModel.class)
26+
abstract class BasicItemModelMixin {
27+
@Unique
28+
@Nullable
29+
private List<BakedQuad> emissiveQuads;
30+
31+
@Inject(method = "<init>(Ljava/util/List;Ljava/util/List;Lnet/minecraft/client/render/model/ModelSettings;)V", at = @At("RETURN"))
32+
private void onReturnInit(List<TintSource> tints, List<BakedQuad> quads, ModelSettings settings, CallbackInfo ci) {
33+
for (BakedQuad quad : quads) {
34+
Sprite emissiveSprite = ((SpriteExtension) quad.sprite()).continuity$getEmissiveSprite();
35+
if (emissiveSprite != null) {
36+
int[] emissiveVertexData = quad.vertexData().clone();
37+
QuadUtil.interpolate(emissiveVertexData, quad.sprite(), emissiveSprite);
38+
BakedQuad emissiveQuad = new BakedQuad(emissiveVertexData, quad.tintIndex(), quad.face(), emissiveSprite, false, 15);
39+
40+
if (emissiveQuads == null) {
41+
emissiveQuads = new ArrayList<>();
42+
}
43+
emissiveQuads.add(emissiveQuad);
44+
}
45+
}
46+
}
47+
48+
@Inject(method = "update(Lnet/minecraft/client/render/item/ItemRenderState;Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/item/ItemModelManager;Lnet/minecraft/item/ItemDisplayContext;Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/entity/LivingEntity;I)V", at = @At(value = "INVOKE", target = "java/util/List.addAll(Ljava/util/Collection;)Z", remap = false, shift = At.Shift.AFTER))
49+
private void afterAddVanillaQuads(CallbackInfo ci, @Local ItemRenderState.LayerRenderState layerRenderState) {
50+
if (emissiveQuads != null && ContinuityConfig.INSTANCE.emissiveTextures.get()) {
51+
layerRenderState.getQuads().addAll(emissiveQuads);
52+
}
53+
}
54+
}

src/main/java/me/pepperbell/continuity/client/util/QuadUtil.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,23 @@ public static void interpolate(MutableQuadView quad, Sprite oldSprite, Sprite ne
2424
}
2525
}
2626

27+
public static void interpolate(int[] vertexData, Sprite oldSprite, Sprite newSprite) {
28+
float oldMinU = oldSprite.getMinU();
29+
float oldMinV = oldSprite.getMinV();
30+
float newMinU = newSprite.getMinU();
31+
float newMinV = newSprite.getMinV();
32+
float uFactor = (newSprite.getMaxU() - newMinU) / (oldSprite.getMaxU() - oldMinU);
33+
float vFactor = (newSprite.getMaxV() - newMinV) / (oldSprite.getMaxV() - oldMinV);
34+
for (int i = 0; i < 4; i++) {
35+
float u = Float.intBitsToFloat(vertexData[i * 8 + 4]);
36+
float v = Float.intBitsToFloat(vertexData[i * 8 + 5]);
37+
u = newMinU + (u - oldMinU) * uFactor;
38+
v = newMinV + (v - oldMinV) * vFactor;
39+
vertexData[i * 8 + 4] = Float.floatToRawIntBits(u);
40+
vertexData[i * 8 + 5] = Float.floatToRawIntBits(v);
41+
}
42+
}
43+
2744
public static void assignLerpedUvs(MutableQuadView quad, Sprite sprite) {
2845
float delta = sprite.getUvScaleDelta();
2946
float centerU = (sprite.getMinU() + sprite.getMaxU()) * 0.5f;

src/main/resources/continuity.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"client": [
77
"AtlasLoaderMixin",
88
"BakedModelManagerMixin",
9+
"BasicItemModelMixin",
910
"LifecycledResourceManagerImplMixin",
1011
"RenderLayersMixin",
1112
"SpriteLoaderMixin",

0 commit comments

Comments
 (0)