Skip to content

Commit d4f7a9c

Browse files
committed
Merge remote-tracking branch 'origin/1.21.10/dev' into 1.21.11/dev
2 parents c5c94b1 + 102eeac commit d4f7a9c

6 files changed

Lines changed: 136 additions & 12 deletions

File tree

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package me.pepperbell.continuity.client.mixin;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.function.Function;
6+
7+
import org.jetbrains.annotations.Nullable;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.Unique;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
import org.spongepowered.asm.mixin.injection.Inject;
12+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
13+
14+
import com.llamalad7.mixinextras.sugar.Local;
15+
16+
import me.pepperbell.continuity.client.config.ContinuityConfig;
17+
import me.pepperbell.continuity.client.mixinterface.SpriteExtension;
18+
import me.pepperbell.continuity.client.util.QuadUtil;
19+
import net.minecraft.client.item.ItemModelManager;
20+
import net.minecraft.client.render.RenderLayer;
21+
import net.minecraft.client.render.item.ItemRenderState;
22+
import net.minecraft.client.render.item.model.BasicItemModel;
23+
import net.minecraft.client.render.item.tint.TintSource;
24+
import net.minecraft.client.render.model.BakedQuad;
25+
import net.minecraft.client.render.model.ModelSettings;
26+
import net.minecraft.client.texture.Sprite;
27+
import net.minecraft.client.world.ClientWorld;
28+
import net.minecraft.item.ItemDisplayContext;
29+
import net.minecraft.item.ItemStack;
30+
import net.minecraft.util.HeldItemContext;
31+
32+
@Mixin(BasicItemModel.class)
33+
abstract class BasicItemModelMixin {
34+
@Unique
35+
private static final Object EMISSIVE_GEOMETRY_MARKER = new Object();
36+
37+
@Unique
38+
@Nullable
39+
private List<BakedQuad> emissiveQuads;
40+
@Unique
41+
private boolean emissiveAnimated = false;
42+
43+
@Inject(method = "<init>(Ljava/util/List;Ljava/util/List;Lnet/minecraft/client/render/model/ModelSettings;Ljava/util/function/Function;)V", at = @At("RETURN"))
44+
private void onReturnInit(List<TintSource> tints, List<BakedQuad> quads, ModelSettings settings, Function<ItemStack, RenderLayer> renderLayerGetter, CallbackInfo ci) {
45+
QuadUtil.PackedUvContainer output = new QuadUtil.PackedUvContainer();
46+
for (BakedQuad quad : quads) {
47+
Sprite emissiveSprite = ((SpriteExtension) quad.sprite()).continuity$getEmissiveSprite();
48+
if (emissiveSprite != null) {
49+
QuadUtil.interpolate(quad, output, quad.sprite(), emissiveSprite);
50+
BakedQuad emissiveQuad = new BakedQuad(quad.position0(), quad.position1(), quad.position2(), quad.position3(), output.packedUV0, output.packedUV1, output.packedUV2, output.packedUV3, quad.tintIndex(), quad.face(), emissiveSprite, false, 15);
51+
52+
if (emissiveQuads == null) {
53+
emissiveQuads = new ArrayList<>();
54+
}
55+
emissiveQuads.add(emissiveQuad);
56+
57+
if (emissiveSprite.getContents().isAnimated()) {
58+
emissiveAnimated = true;
59+
}
60+
}
61+
}
62+
}
63+
64+
@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/util/HeldItemContext;I)V", at = @At(value = "INVOKE", target = "java/util/List.addAll(Ljava/util/Collection;)Z", remap = false, shift = At.Shift.AFTER))
65+
private void afterAddVanillaQuads(ItemRenderState state, ItemStack stack, ItemModelManager resolver, ItemDisplayContext displayContext, @Nullable ClientWorld world, @Nullable HeldItemContext heldItemContext, int seed, CallbackInfo ci, @Local ItemRenderState.LayerRenderState layerRenderState) {
66+
if (emissiveQuads != null && ContinuityConfig.INSTANCE.emissiveTextures.get()) {
67+
layerRenderState.getQuads().addAll(emissiveQuads);
68+
state.addModelKey(EMISSIVE_GEOMETRY_MARKER);
69+
70+
if (emissiveAnimated) {
71+
state.markAnimated();
72+
}
73+
}
74+
}
75+
}

src/main/java/me/pepperbell/continuity/client/resource/SpriteLoaderLoadContextImpl.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ public class SpriteLoaderLoadContextImpl implements SpriteLoaderLoadContext {
1414
private final CompletableFuture<Map<Identifier, Set<Identifier>>> allExtraIdsFuture;
1515
private final Map<Identifier, CompletableFuture<Set<Identifier>>> extraIdsFutures = new Object2ObjectOpenHashMap<>();
1616
private final SpriteLoaderLoadContext.EmissiveControl blockAtlasEmissiveControl;
17+
private final SpriteLoaderLoadContext.EmissiveControl itemAtlasEmissiveControl;
1718

1819
public SpriteLoaderLoadContextImpl(CompletableFuture<Map<Identifier, Set<Identifier>>> allExtraIdsFuture, CompletableFuture<Boolean> blockAtlasHasEmissivesFuture) {
1920
this.allExtraIdsFuture = allExtraIdsFuture;
2021
blockAtlasEmissiveControl = new EmissiveControlImpl(blockAtlasHasEmissivesFuture);
22+
itemAtlasEmissiveControl = new EmissiveControlImpl();
2123
}
2224

2325
@Override
@@ -30,19 +32,26 @@ public SpriteLoaderLoadContextImpl(CompletableFuture<Map<Identifier, Set<Identif
3032
public SpriteLoaderLoadContext.EmissiveControl getEmissiveControl(Identifier atlasId) {
3133
if (atlasId.equals(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE)) {
3234
return blockAtlasEmissiveControl;
35+
} else if (atlasId.equals(SpriteAtlasTexture.ITEMS_ATLAS_TEXTURE)) {
36+
return itemAtlasEmissiveControl;
3337
}
3438
return null;
3539
}
3640

3741
private static class EmissiveControlImpl implements SpriteLoaderLoadContext.EmissiveControl {
3842
@Nullable
3943
private volatile Map<Identifier, Identifier> emissiveIdMap;
44+
@Nullable
4045
private final CompletableFuture<Boolean> hasEmissivesFuture;
4146

42-
public EmissiveControlImpl(CompletableFuture<Boolean> hasEmissivesFuture) {
47+
public EmissiveControlImpl(@Nullable CompletableFuture<Boolean> hasEmissivesFuture) {
4348
this.hasEmissivesFuture = hasEmissivesFuture;
4449
}
4550

51+
public EmissiveControlImpl() {
52+
this(null);
53+
}
54+
4655
@Override
4756
@Nullable
4857
public Map<Identifier, Identifier> getEmissiveIdMap() {
@@ -52,15 +61,19 @@ public Map<Identifier, Identifier> getEmissiveIdMap() {
5261
@Override
5362
public void setEmissiveIdMap(Map<Identifier, Identifier> emissiveIdMap) {
5463
if (emissiveIdMap.isEmpty()) {
55-
hasEmissivesFuture.complete(false);
64+
if (hasEmissivesFuture != null) {
65+
hasEmissivesFuture.complete(false);
66+
}
5667
} else {
5768
this.emissiveIdMap = emissiveIdMap;
5869
}
5970
}
6071

6172
@Override
6273
public void setHasEmissives(boolean hasEmissives) {
63-
hasEmissivesFuture.complete(hasEmissives);
74+
if (hasEmissivesFuture != null) {
75+
hasEmissivesFuture.complete(hasEmissives);
76+
}
6477
}
6578
}
6679
}

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView;
88
import net.fabricmc.fabric.api.util.TriState;
99
import net.minecraft.client.render.BlockRenderLayer;
10+
import net.minecraft.client.render.model.BakedQuad;
1011
import net.minecraft.client.texture.Sprite;
12+
import net.minecraft.client.util.math.Vector2f;
1113
import net.minecraft.util.math.Direction;
1214

1315
public final class QuadUtil {
@@ -26,6 +28,22 @@ public static void interpolate(MutableQuadView quad, Sprite oldSprite, Sprite ne
2628
}
2729
}
2830

31+
public static void interpolate(BakedQuad quad, PackedUvContainer output, Sprite oldSprite, Sprite newSprite) {
32+
float oldMinU = oldSprite.getMinU();
33+
float oldMinV = oldSprite.getMinV();
34+
float newMinU = newSprite.getMinU();
35+
float newMinV = newSprite.getMinV();
36+
float uFactor = (newSprite.getMaxU() - newMinU) / (oldSprite.getMaxU() - oldMinU);
37+
float vFactor = (newSprite.getMaxV() - newMinV) / (oldSprite.getMaxV() - oldMinV);
38+
for (int i = 0; i < 4; i++) {
39+
long packedUv = quad.getTexcoords(i);
40+
output.packedUV(i, Vector2f.toLong(
41+
newMinU + (Vector2f.getX(packedUv) - oldMinU) * uFactor,
42+
newMinV + (Vector2f.getY(packedUv) - oldMinV) * vFactor
43+
));
44+
}
45+
}
46+
2947
public static void emitOverlayQuad(QuadEmitter emitter, Direction face, Sprite sprite, int color, @Nullable BlockRenderLayer renderLayer, TriState ao) {
3048
emitter.square(face, 0, 0, 1, 1, 0);
3149
emitter.color(color, color, color, color);
@@ -160,4 +178,21 @@ public static int getTextureOrientation(QuadView quad) {
160178
// Add 4 if the UV winding order is clockwise
161179
return (Math.abs(y) >= Math.abs(x) ? (y > 0 ? 0 : 2) : (x > 0 ? 3 : 1)) + (determinant < 0 ? 4 : 0);
162180
}
181+
182+
public static class PackedUvContainer {
183+
public long packedUV0;
184+
public long packedUV1;
185+
public long packedUV2;
186+
public long packedUV3;
187+
188+
public void packedUV(int index, long packedUV) {
189+
switch (index) {
190+
case 0 -> packedUV0 = packedUV;
191+
case 1 -> packedUV1 = packedUV;
192+
case 2 -> packedUV2 = packedUV;
193+
case 3 -> packedUV3 = packedUV;
194+
default -> throw new IndexOutOfBoundsException(index);
195+
}
196+
}
197+
}
163198
}

src/main/resources/assets/continuity/lang/ko_kr.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
22
"options.continuity.title": "Continuity 설정",
3-
"options.continuity.connected_textures": "연결된 텍스쳐",
4-
"options.continuity.connected_textures.tooltip": "블록의 연결된 텍스쳐를 활성화 하거나 비활성화 합니다.",
5-
"options.continuity.emissive_textures": "빛나는 텍스쳐",
6-
"options.continuity.emissive_textures.tooltip": "블록 및 아이템 모델의 빛나는 텍스쳐를 활성화 하거나 비활성화 합니다.",
7-
"options.continuity.custom_block_layers": "블록 레이어",
8-
"options.continuity.custom_block_layers.tooltip": "블록 레이어 사용자화를 활성화 하거나 비활성화 합니다.",
3+
"options.continuity.connected_textures": "연결된 텍스처",
4+
"options.continuity.connected_textures.tooltip": "블록에 대한 연결된 텍스처를 활성화하거나 비활성화합니다.",
5+
"options.continuity.emissive_textures": "빛나는 텍스처",
6+
"options.continuity.emissive_textures.tooltip": "블록 및 아이템 모델에 대한 빛나는 텍스처를 활성화하거나 비활성화합니다.",
7+
"options.continuity.custom_block_layers": "사용자 지정 블록 레이어",
8+
"options.continuity.custom_block_layers.tooltip": "사용자 지정 블록 레이어를 활성화하거나 비활성화합니다.",
99
"resourcePack.continuity.default.name": "기본 Continuity 텍스처",
1010
"resourcePack.continuity.default.description": "유리, 사암, 책장",
1111
"resourcePack.continuity.glass_pane_culling_fix.name": "유리판 컬링 수정",
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{
22
"options.continuity.title": "کونفيݢوراسي Continuity",
33
"options.continuity.connected_textures": "تيکستور برسامبوڠ",
4-
"options.continuity.connected_textures.tooltip": "دايکن اتاو ڽهدايکن تيکستور يڠ دسامبوڠکن اونتوق بلوک.",
4+
"options.continuity.connected_textures.tooltip": "داياکن اتاو ڽهداياکن تيکستور يڠ برسامبوڠ اونتوق بلوک.",
55
"options.continuity.emissive_textures": "تيکستور ايميسيف",
6-
"options.continuity.emissive_textures.tooltip": "دايکن اتاو ڽهدايکن تيکستور ايميسيف اونتوق موديل بلوک دان اءيتم.",
6+
"options.continuity.emissive_textures.tooltip": "داياکن اتاو ڽهدايکن تيکستور ايميسيف اونتوق موديل بلوک دان اٴيتم.",
77
"options.continuity.custom_block_layers": "لاڤيسن بلوک ترسواي",
8-
"options.continuity.custom_block_layers.tooltip": "دايکن اتاو ڽهدايکن لاڤيسن بلوک ترسواي."
8+
"options.continuity.custom_block_layers.tooltip": "داياکن اتاو ڽهداياکن لاڤيسن بلوک ترسواي."
99
}

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
"AtlasManagerMixin",
9+
"BasicItemModelMixin",
910
"BlockRenderLayersMixin",
1011
"LifecycledResourceManagerImplMixin",
1112
"SpriteLoaderMixin",

0 commit comments

Comments
 (0)