Skip to content

Commit d873880

Browse files
committed
feat: allow i/o textures to be defined via json
remove "render data" system in favour of BlockStates also fix rendering of i/o config in hand
1 parent 0a5a40c commit d873880

25 files changed

+235
-134
lines changed

build.gradle.kts

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ val wthit = project.property("wthit.version").toString()
4444
plugins {
4545
java
4646
`maven-publish`
47-
id("fabric-loom") version("1.7-SNAPSHOT")
47+
id("fabric-loom") version("1.8-SNAPSHOT")
4848
id("org.cadixdev.licenser") version("0.6.1")
4949
id("org.ajoberstar.grgit") version("5.2.2")
50-
id("dev.galacticraft.mojarn") version("0.5.0+13")
50+
id("dev.galacticraft.mojarn") version("0.5.1+14")
5151
}
5252

5353
group = "dev.galacticraft"

gradle.properties

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ mod.version=0.7.0
77

88
# Minecraft and Fabric Loader
99
minecraft.version=1.21.1
10-
loader.version=0.16.5
10+
loader.version=0.16.7
1111
yarn.build=3
1212

1313
# Mod Dependencies
1414
badpackets.version=0.8.1
1515
energy.version=4.1.0
16-
fabric.version=0.105.0+1.21.1
16+
fabric.version=0.107.0+1.21.1
1717

1818
# Optional Mod Dependencies
1919
cloth.config.version=15.0.140

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

+4-11
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424

2525
import com.google.common.base.Preconditions;
2626
import com.mojang.serialization.Codec;
27-
import dev.galacticraft.machinelib.client.api.model.sprite.MachineTextureBase;
2827
import dev.galacticraft.machinelib.client.api.model.sprite.SingleTextureProvider;
2928
import dev.galacticraft.machinelib.client.api.model.sprite.TextureProvider;
3029
import dev.galacticraft.machinelib.client.impl.model.MachineBakedModel;
@@ -37,7 +36,8 @@
3736
* A registry for {@link MachineBakedModel} sprite providers.
3837
*/
3938
public final class MachineModelRegistry {
40-
public static final String MARKER = "machinelib:generate";
39+
public static final String MARKER = "machinelib:type";
40+
public static final String BASE_TYPE = "base";
4141

4242
/**
4343
* Registers a sprite provider for a block.
@@ -52,19 +52,12 @@ public static void register(@NotNull ResourceLocation id, @NotNull Codec<? exten
5252
MachineModelRegistryImpl.FACTORIES.put(id, codec);
5353
}
5454

55-
public static void registerBase(@NotNull ResourceLocation id, @NotNull MachineTextureBase bundle) {
56-
Preconditions.checkNotNull(id);
57-
Preconditions.checkNotNull(bundle);
58-
59-
MachineModelRegistryImpl.TEXTURE_BASES.put(id, bundle);
60-
}
61-
6255
/**
6356
* {@return the registered provider, or null if none is registered}
6457
*
6558
* @param providerId the provider id to get the provider for
6659
*/
67-
public static @Nullable Codec<? extends TextureProvider<?>> getProviderFactory(@NotNull ResourceLocation providerId) {
60+
public static @Nullable Codec<? extends TextureProvider<?>> getProviderFactory(@Nullable ResourceLocation providerId) {
6861
return MachineModelRegistryImpl.FACTORIES.get(providerId);
6962
}
7063

@@ -73,7 +66,7 @@ public static void registerBase(@NotNull ResourceLocation id, @NotNull MachineTe
7366
*
7467
* @param providerId the provider id to get the provider for
7568
*/
76-
public static @NotNull Codec<? extends TextureProvider<?>> getProviderFactoryOrDefault(@NotNull ResourceLocation providerId) {
69+
public static @NotNull Codec<? extends TextureProvider<?>> getProviderFactoryOrDefault(@Nullable ResourceLocation providerId) {
7770
return MachineModelRegistryImpl.FACTORIES.getOrDefault(providerId, SingleTextureProvider.CODEC);
7871
}
7972
}

src/main/java/dev/galacticraft/machinelib/client/api/model/sprite/AxisSpriteProvider.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424

2525
import com.mojang.serialization.Codec;
2626
import com.mojang.serialization.codecs.RecordCodecBuilder;
27-
import dev.galacticraft.machinelib.api.machine.MachineRenderData;
2827
import dev.galacticraft.machinelib.api.util.BlockFace;
2928
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
3029
import net.minecraft.client.resources.model.Material;
30+
import net.minecraft.world.level.block.state.BlockState;
3131
import org.jetbrains.annotations.NotNull;
3232
import org.jetbrains.annotations.Nullable;
3333

@@ -48,7 +48,7 @@ public Bound bind(Function<Material, TextureAtlasSprite> atlas) {
4848

4949
public record Bound(TextureAtlasSprite front, TextureAtlasSprite base, TextureAtlasSprite side) implements BoundTextureProvider {
5050
@Override
51-
public TextureAtlasSprite getSprite(@Nullable MachineRenderData renderData, @NotNull BlockFace face) {
51+
public TextureAtlasSprite getSprite(@Nullable BlockState state, @NotNull BlockFace face) {
5252
if (face == BlockFace.FRONT) return this.front;
5353
if (face.side()) return this.side;
5454
return this.base;

src/main/java/dev/galacticraft/machinelib/client/api/model/sprite/FrontSidedSpriteProvider.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424

2525
import com.mojang.serialization.Codec;
2626
import com.mojang.serialization.codecs.RecordCodecBuilder;
27-
import dev.galacticraft.machinelib.api.machine.MachineRenderData;
2827
import dev.galacticraft.machinelib.api.util.BlockFace;
2928
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
3029
import net.minecraft.client.resources.model.Material;
30+
import net.minecraft.world.level.block.state.BlockState;
3131
import org.jetbrains.annotations.NotNull;
3232
import org.jetbrains.annotations.Nullable;
3333

@@ -47,7 +47,7 @@ public Bound bind(Function<Material, TextureAtlasSprite> atlas) {
4747

4848
public record Bound(TextureAtlasSprite front, TextureAtlasSprite base, TextureAtlasSprite side) implements TextureProvider.BoundTextureProvider {
4949
@Override
50-
public TextureAtlasSprite getSprite(@Nullable MachineRenderData renderData, @NotNull BlockFace face) {
50+
public TextureAtlasSprite getSprite(@Nullable BlockState state, @NotNull BlockFace face) {
5151
if (face == BlockFace.FRONT) return this.front;
5252
if (face.side()) return this.side;
5353
return this.base;

src/main/java/dev/galacticraft/machinelib/client/api/model/sprite/MachineTextureBase.java

+35-2
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,29 @@
2222

2323
package dev.galacticraft.machinelib.client.api.model.sprite;
2424

25+
import com.mojang.serialization.Codec;
26+
import com.mojang.serialization.codecs.RecordCodecBuilder;
2527
import net.minecraft.client.renderer.texture.TextureAtlas;
2628
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
27-
import net.minecraft.client.resources.model.Material;
29+
import net.minecraft.client.resources.model.*;
2830
import net.minecraft.resources.ResourceLocation;
31+
import org.jetbrains.annotations.Nullable;
2932

33+
import java.util.Collection;
34+
import java.util.Collections;
3035
import java.util.function.Function;
3136

3237
public record MachineTextureBase(Material machineEnergyIn, Material machineEnergyOut, Material machineEnergyBoth,
3338
Material machineItemIn, Material machineItemOut, Material machineItemBoth,
3439
Material machineFluidIn, Material machineFluidOut, Material machineFluidBoth,
3540
Material machineAnyIn, Material machineAnyOut, Material machineAnyBoth
36-
) {
41+
) implements UnbakedModel {
42+
public static final Codec<MachineTextureBase> CODEC = RecordCodecBuilder.create(instance -> instance.group(
43+
TypedResourceSprites.CODEC.fieldOf("energy").forGetter(b -> new TypedResourceSprites(b.machineEnergyIn, b.machineEnergyOut, b.machineEnergyBoth)),
44+
TypedResourceSprites.CODEC.fieldOf("item").forGetter(b -> new TypedResourceSprites(b.machineItemIn, b.machineItemOut, b.machineItemBoth)),
45+
TypedResourceSprites.CODEC.fieldOf("fluid").forGetter(b -> new TypedResourceSprites(b.machineFluidIn, b.machineFluidOut, b.machineFluidBoth)),
46+
TypedResourceSprites.CODEC.fieldOf("any").forGetter(b -> new TypedResourceSprites(b.machineAnyIn, b.machineAnyOut, b.machineAnyBoth))
47+
).apply(instance, (e, i, f ,a) -> new MachineTextureBase(e.input, e.output, e.both, i.input, i.output, i.both, f.input, f.output, f.both, a.input, a.output, a.both)));
3748

3849
public static MachineTextureBase prefixed(String id, String prefix) {
3950
return new MachineTextureBase(
@@ -53,6 +64,20 @@ public Bound bind(Function<Material, TextureAtlasSprite> atlas) {
5364
);
5465
}
5566

67+
@Override
68+
public Collection<ResourceLocation> getDependencies() {
69+
return Collections.emptyList();
70+
}
71+
72+
@Override
73+
public void resolveParents(Function<ResourceLocation, UnbakedModel> modelLoader) {
74+
}
75+
76+
@Override
77+
public @Nullable BakedModel bake(ModelBaker modelBaker, Function<Material, TextureAtlasSprite> textureGetter, ModelState rotationContainer) {
78+
return null;
79+
}
80+
5681
public record Bound(TextureAtlasSprite machineEnergyIn, TextureAtlasSprite machineEnergyOut, TextureAtlasSprite machineEnergyBoth,
5782
TextureAtlasSprite machineItemIn, TextureAtlasSprite machineItemOut, TextureAtlasSprite machineItemBoth,
5883
TextureAtlasSprite machineFluidIn, TextureAtlasSprite machineFluidOut, TextureAtlasSprite machineFluidBoth,
@@ -63,4 +88,12 @@ public record Bound(TextureAtlasSprite machineEnergyIn, TextureAtlasSprite machi
6388
private static Material mat(String namespace, String location) {
6489
return new Material(TextureAtlas.LOCATION_BLOCKS, ResourceLocation.fromNamespaceAndPath(namespace, location));
6590
}
91+
92+
private record TypedResourceSprites(Material input, Material output, Material both) {
93+
private static final Codec<TypedResourceSprites> CODEC = RecordCodecBuilder.create(instance -> instance.group(
94+
TextureProvider.MATERIAL_CODEC.fieldOf("input").forGetter(TypedResourceSprites::input),
95+
TextureProvider.MATERIAL_CODEC.fieldOf("output").forGetter(TypedResourceSprites::output),
96+
TextureProvider.MATERIAL_CODEC.fieldOf("both").forGetter(TypedResourceSprites::both)
97+
).apply(instance, TypedResourceSprites::new));
98+
}
6699
}

src/main/java/dev/galacticraft/machinelib/client/api/model/sprite/SimpleTextureProvider.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424

2525
import com.mojang.serialization.Codec;
2626
import com.mojang.serialization.codecs.RecordCodecBuilder;
27-
import dev.galacticraft.machinelib.api.machine.MachineRenderData;
2827
import dev.galacticraft.machinelib.api.util.BlockFace;
2928
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
3029
import net.minecraft.client.resources.model.Material;
30+
import net.minecraft.world.level.block.state.BlockState;
3131
import org.jetbrains.annotations.NotNull;
3232
import org.jetbrains.annotations.Nullable;
3333

@@ -47,7 +47,7 @@ public Bound bind(Function<Material, TextureAtlasSprite> atlas) {
4747
public record Bound(TextureAtlasSprite base, TextureAtlasSprite front) implements BoundTextureProvider {
4848

4949
@Override
50-
public TextureAtlasSprite getSprite(@Nullable MachineRenderData renderData, @NotNull BlockFace face) {
50+
public TextureAtlasSprite getSprite(@Nullable BlockState state, @NotNull BlockFace face) {
5151
if (face == BlockFace.FRONT) return this.front;
5252
return this.base;
5353
}

src/main/java/dev/galacticraft/machinelib/client/api/model/sprite/SingleTextureProvider.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@
2323
package dev.galacticraft.machinelib.client.api.model.sprite;
2424

2525
import com.mojang.serialization.Codec;
26-
import dev.galacticraft.machinelib.api.machine.MachineRenderData;
2726
import dev.galacticraft.machinelib.api.util.BlockFace;
2827
import net.minecraft.client.renderer.texture.TextureAtlas;
2928
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
3029
import net.minecraft.client.resources.model.Material;
3130
import net.minecraft.resources.ResourceLocation;
31+
import net.minecraft.world.level.block.state.BlockState;
3232
import org.jetbrains.annotations.NotNull;
3333
import org.jetbrains.annotations.Nullable;
3434

@@ -47,7 +47,7 @@ public Bound bind(Function<Material, TextureAtlasSprite> atlas) {
4747

4848
public record Bound(TextureAtlasSprite texture) implements BoundTextureProvider {
4949
@Override
50-
public TextureAtlasSprite getSprite(@Nullable MachineRenderData renderData, @NotNull BlockFace face) {
50+
public TextureAtlasSprite getSprite(@Nullable BlockState state, @NotNull BlockFace face) {
5151
return this.texture;
5252
}
5353

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
import com.mojang.serialization.Codec;
2626
import com.mojang.serialization.DataResult;
2727
import com.mojang.serialization.codecs.RecordCodecBuilder;
28-
import dev.galacticraft.machinelib.api.machine.MachineRenderData;
2928
import dev.galacticraft.machinelib.api.util.BlockFace;
3029
import net.minecraft.client.renderer.texture.TextureAtlas;
3130
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
3231
import net.minecraft.client.resources.model.Material;
3332
import net.minecraft.resources.ResourceLocation;
33+
import net.minecraft.world.level.block.state.BlockState;
3434
import org.jetbrains.annotations.NotNull;
3535
import org.jetbrains.annotations.Nullable;
3636

@@ -48,7 +48,7 @@ public interface TextureProvider<B extends TextureProvider.BoundTextureProvider>
4848
B bind(Function<Material, TextureAtlasSprite> atlas);
4949

5050
interface BoundTextureProvider {
51-
TextureAtlasSprite getSprite(@Nullable MachineRenderData renderData, @NotNull BlockFace face);
51+
TextureAtlasSprite getSprite(@Nullable BlockState state, @NotNull BlockFace face);
5252

5353
TextureAtlasSprite getParticle();
5454
}

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

+24-13
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
import com.mojang.blaze3d.systems.RenderSystem;
2828
import com.mojang.blaze3d.vertex.PoseStack;
2929
import dev.galacticraft.machinelib.api.block.entity.MachineBlockEntity;
30-
import dev.galacticraft.machinelib.api.machine.MachineRenderData;
3130
import dev.galacticraft.machinelib.api.machine.configuration.AccessLevel;
31+
import dev.galacticraft.machinelib.api.machine.configuration.IOConfig;
3232
import dev.galacticraft.machinelib.api.machine.configuration.IOFace;
3333
import dev.galacticraft.machinelib.api.machine.configuration.RedstoneMode;
3434
import dev.galacticraft.machinelib.api.menu.MachineMenu;
@@ -70,6 +70,7 @@
7070
import net.minecraft.world.item.ItemStack;
7171
import net.minecraft.world.item.Items;
7272
import net.minecraft.world.level.block.entity.SkullBlockEntity;
73+
import net.minecraft.world.level.block.state.BlockState;
7374
import org.jetbrains.annotations.ApiStatus;
7475
import org.jetbrains.annotations.NotNull;
7576
import org.jetbrains.annotations.Nullable;
@@ -191,8 +192,8 @@ public class MachineScreen<Machine extends MachineBlockEntity, Menu extends Mach
191192
* The height of the capacitor.
192193
*/
193194
protected int capacitorHeight = 48;
194-
protected @NotNull MachineRenderData renderData;
195195
private @Nullable MachineBakedModel model;
196+
private BlockState previousState;
196197

197198
/**
198199
* Creates a new screen from the given screen handler.
@@ -205,7 +206,6 @@ protected MachineScreen(@NotNull Menu menu, @NotNull Component title, @NotNull R
205206
super(menu, menu.playerInventory, title);
206207

207208
this.texture = texture;
208-
this.renderData = menu.configuration;
209209

210210
UUID owner = this.menu.security.getOwner() == null ? this.menu.player.getUUID() : this.menu.security.getOwner();
211211
this.owner = SkullBlockEntity.fetchGameProfile(owner).thenApply(o -> o.orElse(new GameProfile(owner, "???")));
@@ -233,10 +233,22 @@ protected void init() {
233233
this.titleLabelX = (this.imageWidth - this.font.width(this.title)) / 2;
234234

235235
if (this.minecraft.getModelManager().getBlockModelShaper().getBlockModel(this.menu.be.getBlockState()) instanceof MachineBakedModel model) {
236+
this.previousState = this.menu.be.getBlockState();
236237
this.model = model;
237238
}
238239
}
239240

241+
@Override
242+
protected void containerTick() {
243+
super.containerTick();
244+
if (!this.menu.be.getBlockState().equals(this.previousState)) {
245+
this.previousState = this.menu.be.getBlockState();
246+
if (this.minecraft.getModelManager().getBlockModelShaper().getBlockModel(this.menu.be.getBlockState()) instanceof MachineBakedModel model) {
247+
this.model = model;
248+
}
249+
}
250+
}
251+
240252
/**
241253
* Appends additional information to the capacitor's tooltip.
242254
*
@@ -303,12 +315,12 @@ protected void drawConfigurationPanels(@NotNull GuiGraphics graphics, int mouseX
303315
.setStyle(Constant.Text.GRAY_STYLE), PANEL_TITLE_X, PANEL_TITLE_Y, 0xFFFFFFFF);
304316

305317
RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS);
306-
this.drawMachineFace(graphics, TOP_FACE_X, TOP_FACE_Y, this.renderData, BlockFace.TOP);
307-
this.drawMachineFace(graphics, LEFT_FACE_X, LEFT_FACE_Y, this.renderData, BlockFace.LEFT);
308-
this.drawMachineFace(graphics, FRONT_FACE_X, FRONT_FACE_Y, this.renderData, BlockFace.FRONT);
309-
this.drawMachineFace(graphics, RIGHT_FACE_X, RIGHT_FACE_Y, this.renderData, BlockFace.RIGHT);
310-
this.drawMachineFace(graphics, BACK_FACE_X, BACK_FACE_Y, this.renderData, BlockFace.BACK);
311-
this.drawMachineFace(graphics, BOTTOM_FACE_X, BOTTOM_FACE_Y, this.renderData, BlockFace.BOTTOM);
318+
this.drawMachineFace(graphics, TOP_FACE_X, TOP_FACE_Y, this.menu.configuration, BlockFace.TOP);
319+
this.drawMachineFace(graphics, LEFT_FACE_X, LEFT_FACE_Y, this.menu.configuration, BlockFace.LEFT);
320+
this.drawMachineFace(graphics, FRONT_FACE_X, FRONT_FACE_Y, this.menu.configuration, BlockFace.FRONT);
321+
this.drawMachineFace(graphics, RIGHT_FACE_X, RIGHT_FACE_Y, this.menu.configuration, BlockFace.RIGHT);
322+
this.drawMachineFace(graphics, BACK_FACE_X, BACK_FACE_Y, this.menu.configuration, BlockFace.BACK);
323+
this.drawMachineFace(graphics, BOTTOM_FACE_X, BOTTOM_FACE_Y, this.menu.configuration, BlockFace.BOTTOM);
312324
poseStack.popPose();
313325
}
314326
if (Tab.STATS.isOpen()) {
@@ -366,13 +378,12 @@ protected void drawTitle(@NotNull GuiGraphics graphics) {
366378
* @param graphics the gui graphics
367379
* @param x the x position to draw at
368380
* @param y the y position to draw at
369-
* @param data the machine's extra render data
381+
* @param ioConfig the machine's extra render data
370382
* @param face the face to draw
371383
*/
372-
private void drawMachineFace(@NotNull GuiGraphics graphics, int x, int y, @NotNull MachineRenderData data, @NotNull BlockFace face) {
373-
IOFace machineFace = menu.configuration.get(face);
384+
private void drawMachineFace(@NotNull GuiGraphics graphics, int x, int y, @NotNull IOConfig ioConfig, @NotNull BlockFace face) {
374385
if (this.model != null) {
375-
graphics.blit(x, y, 0, MACHINE_FACE_SIZE, MACHINE_FACE_SIZE, model.getSprite(face, data, machineFace.getType(), machineFace.getFlow()));
386+
graphics.blit(x, y, 0, MACHINE_FACE_SIZE, MACHINE_FACE_SIZE, this.model.getSprite(this.menu.be.getBlockState(), face, ioConfig));
376387
}
377388
}
378389

0 commit comments

Comments
 (0)