Skip to content

Commit 81cbdfb

Browse files
committed
Address reviews
1 parent e8607c0 commit 81cbdfb

File tree

5 files changed

+69
-153
lines changed

5 files changed

+69
-153
lines changed

src/client/java/aztech/modern_industrialization/machines/MachineBlockEntityRenderer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ private BakedQuad getCachedQuad(MachineModelClientData data, Direction d) {
6969
var cachedQuads = quadCache.computeIfAbsent(casing, c -> new Object[36]);
7070

7171
if (cachedQuads[cachedQuadIndex] == null) {
72-
TextureAtlasSprite sprite = model == null ? null : model.getSprite(model.getSprites(casing), d, facing, true);
72+
TextureAtlasSprite sprite = model == null ? null : MachineBakedModel.getSprite(model.getSprites(casing), d, facing, true);
7373
if (sprite != null) {
7474
var vc = new QuadBakingVertexConsumer();
7575
cachedQuads[cachedQuadIndex] = ModelHelper.bakeSprite(vc, d, sprite, -2 * MachineBakedModel.Z_OFFSET);

src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -57,25 +57,22 @@ public class MachineBakedModel implements IDynamicBakedModel {
5757
public static final String CASING_FOLDER = "machine_casing";
5858

5959
public static ModelResourceLocation getCasingModelId(MachineCasing casing) {
60-
return ModelResourceLocation
61-
.standalone(ResourceLocation.fromNamespaceAndPath(casing.key.getNamespace(), CASING_FOLDER + "/" + casing.key.getPath()));
60+
return ModelResourceLocation.standalone(casing.key.withPath(p -> CASING_FOLDER + "/" + p));
6261
}
6362

6463
public static BakedModel getCasingModel(MachineCasing casing) {
6564
return Minecraft.getInstance().getModelManager().getModel(getCasingModelId(casing));
6665
}
6766

6867
private final MachineCasing baseCasing;
69-
private final int[] outputOverlayIndexes;
7068
private final TextureAtlasSprite[] defaultOverlays;
7169
private final Map<ResourceLocation, TextureAtlasSprite[]> tieredOverlays;
7270
private final MachineModelClientData defaultData;
7371

74-
public MachineBakedModel(MachineCasing baseCasing,
75-
int[] outputOverlayIndexes, TextureAtlasSprite[] defaultOverlays,
72+
MachineBakedModel(MachineCasing baseCasing,
73+
TextureAtlasSprite[] defaultOverlays,
7674
Map<ResourceLocation, TextureAtlasSprite[]> tieredOverlays) {
7775
this.baseCasing = baseCasing;
78-
this.outputOverlayIndexes = outputOverlayIndexes;
7976
this.defaultOverlays = defaultOverlays;
8077
this.tieredOverlays = tieredOverlays;
8178
this.defaultData = new MachineModelClientData(baseCasing, Direction.NORTH);
@@ -96,7 +93,7 @@ public TextureAtlasSprite[] getSprites(@Nullable MachineCasing casing) {
9693
* Returns null if nothing should be rendered.
9794
*/
9895
@Nullable
99-
public TextureAtlasSprite getSprite(TextureAtlasSprite[] sprites, Direction side, Direction facingDirection, boolean isActive) {
96+
public static TextureAtlasSprite getSprite(TextureAtlasSprite[] sprites, Direction side, Direction facingDirection, boolean isActive) {
10097
int spriteId;
10198
if (side.getAxis().isHorizontal()) {
10299
spriteId = (facingDirection.get2DDataValue() - side.get2DDataValue() + 4) % 4 * 2;
@@ -124,50 +121,44 @@ public ModelData getModelData(BlockAndTintGetter level, BlockPos pos, BlockState
124121
return getCasingModel(casing).getModelData(level, pos, state, modelData);
125122
}
126123

127-
protected @NotNull List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand,
128-
@NotNull ModelData extraData, @Nullable RenderType renderType,
129-
@NotNull MachineModelClientData data, @NotNull MachineCasing casing,
130-
@NotNull TextureAtlasSprite[] sprites, @NotNull QuadBakingVertexConsumer vertexConsumer) {
124+
@Override
125+
public @NotNull List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand,
126+
@NotNull ModelData extraData, @Nullable RenderType renderType) {
127+
var data = extraData.get(MachineModelClientData.KEY);
128+
if (data == null) {
129+
data = defaultData;
130+
}
131+
132+
MachineCasing casing = Objects.requireNonNullElse(data.casing, baseCasing);
133+
var sprites = getSprites(casing);
134+
131135
List<BakedQuad> quads = new ArrayList<>();
136+
var vc = new QuadBakingVertexConsumer();
132137

133138
if (side != null) {
139+
// Casing
134140
quads.addAll(getCasingModel(casing).getQuads(state, side, rand, extraData, renderType));
135-
141+
// Machine overlays
136142
TextureAtlasSprite sprite = getSprite(sprites, side, data.frontDirection, false);
137143
if (sprite != null) {
138-
quads.add(ModelHelper.bakeSprite(vertexConsumer, side, sprite, -Z_OFFSET));
144+
quads.add(ModelHelper.bakeSprite(vc, side, sprite, -Z_OFFSET));
139145
}
140146
}
141147

148+
// Output overlays
142149
if (data.outputDirection != null && side == data.outputDirection) {
143-
quads.add(ModelHelper.bakeSprite(vertexConsumer, data.outputDirection, sprites[outputOverlayIndexes[0]], -3 * Z_OFFSET));
150+
quads.add(ModelHelper.bakeSprite(vc, data.outputDirection, sprites[24], -3 * Z_OFFSET));
144151
if (data.itemAutoExtract) {
145-
quads.add(ModelHelper.bakeSprite(vertexConsumer, data.outputDirection, sprites[outputOverlayIndexes[1]], -3 * Z_OFFSET));
152+
quads.add(ModelHelper.bakeSprite(vc, data.outputDirection, sprites[25], -3 * Z_OFFSET));
146153
}
147154
if (data.fluidAutoExtract) {
148-
quads.add(ModelHelper.bakeSprite(vertexConsumer, data.outputDirection, sprites[outputOverlayIndexes[2]], -3 * Z_OFFSET));
155+
quads.add(ModelHelper.bakeSprite(vc, data.outputDirection, sprites[26], -3 * Z_OFFSET));
149156
}
150157
}
151158

152159
return quads;
153160
}
154161

155-
@Override
156-
public @NotNull List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand,
157-
@NotNull ModelData extraData, @Nullable RenderType renderType) {
158-
var data = extraData.get(MachineModelClientData.KEY);
159-
if (data == null) {
160-
data = defaultData;
161-
}
162-
163-
MachineCasing casing = Objects.requireNonNullElse(data.casing, baseCasing);
164-
var sprites = getSprites(casing);
165-
166-
var vc = new QuadBakingVertexConsumer();
167-
168-
return getQuads(state, side, rand, extraData, renderType, data, casing, sprites, vc);
169-
}
170-
171162
@Override
172163
public boolean useAmbientOcclusion() {
173164
return true;

src/client/java/aztech/modern_industrialization/machines/models/MachineModelBaker.java

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

src/client/java/aztech/modern_industrialization/machines/models/MachineOverlaysJson.java

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

src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
package aztech.modern_industrialization.machines.models;
2525

2626
import aztech.modern_industrialization.MI;
27+
import com.google.gson.Gson;
28+
import com.google.gson.GsonBuilder;
2729
import com.google.gson.JsonObject;
2830
import java.util.HashMap;
2931
import java.util.Map;
@@ -36,35 +38,33 @@
3638
import net.minecraft.client.resources.model.ModelState;
3739
import net.minecraft.resources.ResourceLocation;
3840
import net.minecraft.util.GsonHelper;
41+
import net.minecraft.world.inventory.InventoryMenu;
3942
import net.neoforged.neoforge.client.model.geometry.IGeometryBakingContext;
4043
import net.neoforged.neoforge.client.model.geometry.IGeometryLoader;
4144
import net.neoforged.neoforge.client.model.geometry.IUnbakedGeometry;
45+
import org.jetbrains.annotations.Nullable;
4246

43-
public class MachineUnbakedModel<O extends MachineOverlaysJson> implements IUnbakedGeometry<MachineUnbakedModel<O>> {
47+
public class MachineUnbakedModel implements IUnbakedGeometry<MachineUnbakedModel> {
4448
public static final ResourceLocation LOADER_ID = MI.id("machine");
45-
public static final IGeometryLoader<MachineUnbakedModel<MachineOverlaysJson>> LOADER = (jsonObject, deserializationContext) -> {
46-
return new MachineUnbakedModel(OverlaysJson.class, MachineBakedModel::new, jsonObject);
49+
public static final IGeometryLoader<MachineUnbakedModel> LOADER = (jsonObject, deserializationContext) -> {
50+
return new MachineUnbakedModel(jsonObject);
4751
};
4852

49-
private final MachineModelBaker modelBaker;
53+
private static final Gson GSON = new GsonBuilder().registerTypeAdapter(ResourceLocation.class, new ResourceLocation.Serializer()).create();
54+
5055
private final MachineCasing baseCasing;
51-
private final int[] outputOverlayIndexes;
5256
private final Material[] defaultOverlays;
5357
private final Map<ResourceLocation, Material[]> tieredOverlays = new HashMap<>();
5458

55-
public MachineUnbakedModel(Class<O> overlayClass, MachineModelBaker modelBaker, JsonObject obj) {
56-
this.modelBaker = modelBaker;
57-
59+
private MachineUnbakedModel(JsonObject obj) {
5860
this.baseCasing = MachineCasings.get(GsonHelper.getAsString(obj, "casing"));
5961

60-
var defaultOverlaysJson = MachineOverlaysJson.parse(overlayClass, GsonHelper.getAsJsonObject(obj, "default_overlays"), null);
61-
this.outputOverlayIndexes = defaultOverlaysJson.getOutputSpriteIndexes();
62+
var defaultOverlaysJson = OverlaysJson.parse(GsonHelper.getAsJsonObject(obj, "default_overlays"), null);
6263
this.defaultOverlays = defaultOverlaysJson.toSpriteIds();
6364

6465
var tieredOverlays = GsonHelper.getAsJsonObject(obj, "tiered_overlays", new JsonObject());
6566
for (var casingTier : tieredOverlays.keySet()) {
66-
var casingOverlaysJson = MachineOverlaysJson.parse(overlayClass, GsonHelper.getAsJsonObject(tieredOverlays, casingTier),
67-
defaultOverlaysJson);
67+
var casingOverlaysJson = OverlaysJson.parse(GsonHelper.getAsJsonObject(tieredOverlays, casingTier), defaultOverlaysJson);
6868
this.tieredOverlays.put(ResourceLocation.parse(casingTier), casingOverlaysJson.toSpriteIds());
6969
}
7070
}
@@ -77,7 +77,7 @@ public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Functio
7777
for (var entry : this.tieredOverlays.entrySet()) {
7878
tieredOverlays.put(entry.getKey(), loadSprites(spriteGetter, entry.getValue()));
7979
}
80-
return modelBaker.bake(baseCasing, outputOverlayIndexes, defaultOverlays, tieredOverlays);
80+
return new MachineBakedModel(baseCasing, defaultOverlays, tieredOverlays);
8181
}
8282

8383
private static TextureAtlasSprite[] loadSprites(Function<Material, TextureAtlasSprite> textureGetter, Material[] ids) {
@@ -90,7 +90,7 @@ private static TextureAtlasSprite[] loadSprites(Function<Material, TextureAtlasS
9090
return sprites;
9191
}
9292

93-
private static class OverlaysJson implements MachineOverlaysJson {
93+
private static class OverlaysJson {
9494
// All fields are nullable.
9595
private ResourceLocation top;
9696
private ResourceLocation top_active;
@@ -126,13 +126,31 @@ private static class OverlaysJson implements MachineOverlaysJson {
126126
private ResourceLocation item_auto;
127127
private ResourceLocation fluid_auto;
128128

129+
private static OverlaysJson parse(JsonObject json, @Nullable OverlaysJson defaultOverlay) {
130+
var overlays = GSON.fromJson(json, OverlaysJson.class);
131+
132+
if (defaultOverlay != null) {
133+
// Copy null fields from the default.
134+
try {
135+
for (var field : OverlaysJson.class.getDeclaredFields()) {
136+
if (field.get(overlays) == null) {
137+
field.set(overlays, field.get(defaultOverlay));
138+
}
139+
}
140+
} catch (IllegalAccessException ex) {
141+
throw new RuntimeException("Failed to copy fields from default overlay", ex);
142+
}
143+
}
144+
145+
return overlays;
146+
}
147+
129148
/**
130149
* Order is as follows:
131150
* Active and inactive: front, left, back, right, top S/W/N/E, bottom S/W/N/E,
132151
* output, item auto, fluid auto
133152
*/
134-
@Override
135-
public Material[] toSpriteIds() {
153+
private Material[] toSpriteIds() {
136154
return new Material[] {
137155
select(front, side),
138156
select(front_active, front, side_active, side),
@@ -164,9 +182,17 @@ public Material[] toSpriteIds() {
164182
};
165183
}
166184

167-
@Override
168-
public int[] getOutputSpriteIndexes() {
169-
return new int[] { 24, 25, 26 };
185+
/**
186+
* Select first non-null id, and convert it to a sprite id.
187+
*/
188+
@Nullable
189+
private static Material select(@Nullable ResourceLocation... candidates) {
190+
for (var id : candidates) {
191+
if (id != null) {
192+
return new Material(InventoryMenu.BLOCK_ATLAS, id);
193+
}
194+
}
195+
return null;
170196
}
171197
}
172198
}

0 commit comments

Comments
 (0)