Skip to content

Commit 0343bb6

Browse files
authored
feat: item model overrides (#19)
* feat: implement item model override functionality * feat: allow overrides to be specified for the face textures in the side config panel * refactor: improve the way overrides are specified * refactor: removed unused imports and replaced magenta glazed terracotta texture for testing with something less jarring * refactor: updated TestModModelProvider to test that TextureProvider.Builder works * fix: removed unnecessary block of code
1 parent 35bfd53 commit 0343bb6

File tree

6 files changed

+60
-13
lines changed

6 files changed

+60
-13
lines changed

src/main/java/dev/galacticraft/machinelib/client/api/model/TextureProvider.java

+43-9
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
public record TextureProvider(@Nullable Material front, @Nullable Material back,
4343
@Nullable Material left, @Nullable Material right,
4444
@Nullable Material top, @Nullable Material bottom,
45-
@Nullable Material particle) {
45+
@Nullable Material particle, @Nullable Material topOverride) {
4646
public static final Codec<Material> MATERIAL_CODEC = Codec.withAlternative(
4747
ResourceLocation.CODEC.flatComapMap(tex -> new Material(TextureAtlas.LOCATION_BLOCKS, tex), mat -> mat.atlasLocation().equals(TextureAtlas.LOCATION_BLOCKS) ? DataResult.success(mat.texture()) : DataResult.error(() -> "not block", mat.texture())),
4848
RecordCodecBuilder.create(instance -> instance.group(
@@ -57,15 +57,17 @@ public record TextureProvider(@Nullable Material front, @Nullable Material back,
5757
MATERIAL_CODEC.optionalFieldOf("right").forGetter(t -> Optional.ofNullable(t.right)),
5858
MATERIAL_CODEC.optionalFieldOf("top").forGetter(t -> Optional.ofNullable(t.top)),
5959
MATERIAL_CODEC.optionalFieldOf("bottom").forGetter(t -> Optional.ofNullable(t.bottom)),
60-
MATERIAL_CODEC.optionalFieldOf("particle").forGetter(t -> Optional.ofNullable(t.particle))
61-
).apply(instance, (a, b, c, d, e, f, g) -> new TextureProvider(
60+
MATERIAL_CODEC.optionalFieldOf("particle").forGetter(t -> Optional.ofNullable(t.particle)),
61+
MATERIAL_CODEC.optionalFieldOf("top_item_override").forGetter(t -> Optional.ofNullable(t.topOverride))
62+
).apply(instance, (a, b, c, d, e, f, g, h) -> new TextureProvider(
6263
a.orElse(null),
6364
b.orElse(null),
6465
c.orElse(null),
6566
d.orElse(null),
6667
e.orElse(null),
6768
f.orElse(null),
68-
g.orElse(null)
69+
g.orElse(null),
70+
h.orElse(null)
6971
)));
7072

7173
public BoundTextureProvider bind(Function<Material, TextureAtlasSprite> atlas) {
@@ -76,7 +78,8 @@ public BoundTextureProvider bind(Function<Material, TextureAtlasSprite> atlas) {
7678
this.right != null ? atlas.apply(this.right) : null,
7779
this.top != null ? atlas.apply(this.top) : null,
7880
this.bottom != null ? atlas.apply(this.bottom) : null,
79-
this.particle != null ? atlas.apply(this.particle) : null
81+
this.particle != null ? atlas.apply(this.particle) : null,
82+
this.topOverride != null ? atlas.apply(this.topOverride) : null
8083
);
8184
}
8285

@@ -89,11 +92,11 @@ public static TextureProvider.Builder builder(String modId) {
8992
}
9093

9194
public static TextureProvider none() {
92-
return new TextureProvider(null, null, null, null, null, null, null);
95+
return new TextureProvider(null, null, null, null, null, null, null, null);
9396
}
9497

9598
public static TextureProvider all(Material material) {
96-
return new TextureProvider(material, material, material, material, material, material, material);
99+
return new TextureProvider(material, material, material, material, material, material, material, null);
97100
}
98101

99102
public static TextureProvider all(ResourceLocation material) {
@@ -113,6 +116,7 @@ public static class Builder {
113116
private @Nullable Material top = null;
114117
private @Nullable Material bottom = null;
115118
private @Nullable Material particle = null;
119+
private @Nullable Material topOverride = null;
116120

117121
private Builder(@Nullable String modId) {
118122
this.modId = modId;
@@ -153,6 +157,11 @@ public Builder particle(String texture) {
153157
return this.particle(ResourceLocation.fromNamespaceAndPath(this.modId, texture));
154158
}
155159

160+
public Builder topOverride(String texture) {
161+
Preconditions.checkNotNull(this.modId);
162+
return this.topOverride(ResourceLocation.fromNamespaceAndPath(this.modId, texture));
163+
}
164+
156165
public Builder all(String texture) {
157166
Preconditions.checkNotNull(this.modId);
158167
return this.all(ResourceLocation.fromNamespaceAndPath(this.modId, texture));
@@ -191,6 +200,10 @@ public Builder particle(ResourceLocation texture) {
191200
return this.particle(new Material(TextureAtlas.LOCATION_BLOCKS, texture));
192201
}
193202

203+
public Builder topOverride(ResourceLocation texture) {
204+
return this.topOverride(new Material(TextureAtlas.LOCATION_BLOCKS, texture));
205+
}
206+
194207
public Builder all(ResourceLocation texture) {
195208
return this.all(new Material(TextureAtlas.LOCATION_BLOCKS, texture));
196209
}
@@ -227,6 +240,10 @@ public Builder particle(Block texture) {
227240
return this.particle(TextureMapping.getBlockTexture(texture));
228241
}
229242

243+
public Builder topOverride(Block texture) {
244+
return this.topOverride(TextureMapping.getBlockTexture(texture));
245+
}
246+
230247
public Builder all(Block texture) {
231248
return this.all(TextureMapping.getBlockTexture(texture));
232249
}
@@ -270,6 +287,11 @@ public Builder particle(Material material) {
270287
return this;
271288
}
272289

290+
public Builder topOverride(Material material) {
291+
this.topOverride = material;
292+
return this;
293+
}
294+
273295
public Builder all(Material material) {
274296
this.front = material;
275297
this.back = material;
@@ -290,14 +312,14 @@ public Builder sides(Material material) {
290312
}
291313

292314
public TextureProvider build() {
293-
return new TextureProvider(this.front, this.back, this.left, this.right, this.top, this.bottom, this.particle);
315+
return new TextureProvider(this.front, this.back, this.left, this.right, this.top, this.bottom, this.particle, this.topOverride);
294316
}
295317
}
296318

297319
public record BoundTextureProvider(@Nullable TextureAtlasSprite front, @Nullable TextureAtlasSprite back,
298320
@Nullable TextureAtlasSprite left, @Nullable TextureAtlasSprite right,
299321
@Nullable TextureAtlasSprite top, @Nullable TextureAtlasSprite bottom,
300-
@Nullable TextureAtlasSprite particle) {
322+
@Nullable TextureAtlasSprite particle, @Nullable TextureAtlasSprite topOverride) {
301323
@Nullable
302324
public TextureAtlasSprite getSprite(@NotNull BlockFace face) {
303325
return switch (face) {
@@ -314,5 +336,17 @@ public TextureAtlasSprite getSprite(@NotNull BlockFace face) {
314336
public TextureAtlasSprite getParticle() {
315337
return this.particle;
316338
}
339+
340+
@Nullable
341+
public TextureAtlasSprite getItemOverride(@NotNull BlockFace face) {
342+
return switch (face) {
343+
case FRONT -> null;
344+
case BACK -> null;
345+
case LEFT -> null;
346+
case RIGHT -> null;
347+
case TOP -> this.topOverride;
348+
case BOTTOM -> null;
349+
};
350+
}
317351
}
318352
}

src/main/java/dev/galacticraft/machinelib/client/api/screen/MachineScreen.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ protected void drawTitle(@NotNull GuiGraphics graphics) {
403403
*/
404404
private void drawMachineFace(@NotNull GuiGraphics graphics, int x, int y, @NotNull IOConfig ioConfig, @NotNull BlockFace face) {
405405
if (this.model != null) {
406-
graphics.blit(x, y, 0, MACHINE_FACE_SIZE, MACHINE_FACE_SIZE, this.model.getSprite(this.menu.be.getBlockState(), face, ioConfig));
406+
graphics.blit(x, y, 0, MACHINE_FACE_SIZE, MACHINE_FACE_SIZE, this.model.getItemOverride(this.menu.be.getBlockState(), face, ioConfig));
407407
}
408408
}
409409

src/main/java/dev/galacticraft/machinelib/client/impl/model/MachineBakedModel.java

+5
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,11 @@ public TextureAtlasSprite getSprite(@Nullable BlockState state, @NotNull BlockFa
158158
return sprite == null ? this.base.base() : sprite;
159159
}
160160

161+
public TextureAtlasSprite getItemOverride(@Nullable BlockState state, @NotNull BlockFace face, @Nullable IOConfig config) {
162+
TextureAtlasSprite override = this.provider.getItemOverride(face);
163+
return override != null ? override : this.getSprite(state, face, config);
164+
}
165+
161166
public TextureProvider.BoundTextureProvider getProvider() {
162167
return provider;
163168
}

src/main/java/dev/galacticraft/machinelib/client/impl/model/MachineModelLoadingPlugin.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,21 @@ public class MachineModelLoadingPlugin implements PreparableModelLoadingPlugin<M
5757
DataResult<? extends Pair<TextureProvider, JsonElement>> sprites = TextureProvider.CODEC.decode(JsonOps.INSTANCE, json.get("data"));
5858
JsonElement baseId = json.get("base");
5959
ResourceLocation base = baseId == null ? context.id().withPath(DEFAULT_MACHINE_BASE) : ResourceLocation.parse(baseId.getAsString());
60+
ResourceLocation location = ResourceLocation.fromNamespaceAndPath(context.id().getNamespace(), context.id().getPath().replace("machine/", "item/"));
6061
MachineUnbakedModel model = new MachineUnbakedModel(sprites.getOrThrow().getFirst(), base);
61-
this.pendingItemModels.put(ResourceLocation.fromNamespaceAndPath(context.id().getNamespace(), context.id().getPath().replace("machine/", "item/")), model);
62+
this.pendingItemModels.put(location, model);
63+
if (json.has("item_override")) {
64+
JsonElement itemOverride = json.get("item_override");
65+
UnbakedModel unbaked = context.getOrLoadModel(ResourceLocation.parse(itemOverride.getAsString()));
66+
this.pendingItemModels.put(location, unbaked);
67+
}
6268
return model;
6369
}
6470

6571
MachineTextureBase base = this.data.getBase(context.id());
6672
if (base != null) return base;
6773

68-
return this.pendingItemModels.remove(context.id()); //todo: allow overriding item models
74+
return this.pendingItemModels.remove(context.id());
6975
}
7076

7177
@Override
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"data": {
3-
"front": "minecraft:block/furnace_front"
3+
"front": "minecraft:block/furnace_front",
4+
"top_item_override": "minecraft:block/furnace_top"
45
},
56
"machinelib:type": "machine"
67
}

src/testmod/java/dev/galacticraft/machinelib/testmod/data/TestModModelProvider.java

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public void generateBlockStateModels(BlockModelGenerators gen) {
6767

6868
MachineModelGenerator.createTrivialMachine(gen, TestModBlocks.GENERATOR, TextureProvider.builder()
6969
.front(TextureMapping.getBlockTexture(Blocks.FURNACE, "_front"))
70+
.topOverride(TextureMapping.getBlockTexture(Blocks.FURNACE, "_top"))
7071
.build());
7172
MachineModelGenerator.createTrivialMachine(gen, TestModBlocks.MIXER, TextureProvider.none());
7273
}

0 commit comments

Comments
 (0)