package net.minecraft.client.renderer.block.model; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.mojang.math.Quadrant; import java.lang.reflect.Type; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.Direction; import net.minecraft.util.GsonHelper; import org.jetbrains.annotations.Nullable; @Environment(EnvType.CLIENT) public record BlockElementFace(@Nullable Direction cullForDirection, int tintIndex, String texture, @Nullable BlockElementFace.UVs uvs, Quadrant rotation) { public static final int NO_TINT = -1; public static float getU(BlockElementFace.UVs uvs, Quadrant rotation, int vertexIndex) { return uvs.getVertexU(rotation.rotateVertexIndex(vertexIndex)) / 16.0F; } public static float getV(BlockElementFace.UVs uvs, Quadrant rotation, int vertexIndex) { return uvs.getVertexV(rotation.rotateVertexIndex(vertexIndex)) / 16.0F; } @Environment(EnvType.CLIENT) protected static class Deserializer implements JsonDeserializer { private static final int DEFAULT_TINT_INDEX = -1; private static final int DEFAULT_ROTATION = 0; public BlockElementFace deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { JsonObject jsonObject = json.getAsJsonObject(); Direction direction = getCullFacing(jsonObject); int i = getTintIndex(jsonObject); String string = getTexture(jsonObject); BlockElementFace.UVs uVs = getUVs(jsonObject); Quadrant quadrant = getRotation(jsonObject); return new BlockElementFace(direction, i, string, uVs, quadrant); } private static int getTintIndex(JsonObject json) { return GsonHelper.getAsInt(json, "tintindex", -1); } private static String getTexture(JsonObject json) { return GsonHelper.getAsString(json, "texture"); } @Nullable private static Direction getCullFacing(JsonObject json) { String string = GsonHelper.getAsString(json, "cullface", ""); return Direction.byName(string); } private static Quadrant getRotation(JsonObject json) { int i = GsonHelper.getAsInt(json, "rotation", 0); return Quadrant.parseJson(i); } @Nullable private static BlockElementFace.UVs getUVs(JsonObject json) { if (!json.has("uv")) { return null; } else { JsonArray jsonArray = GsonHelper.getAsJsonArray(json, "uv"); if (jsonArray.size() != 4) { throw new JsonParseException("Expected 4 uv values, found: " + jsonArray.size()); } else { float f = GsonHelper.convertToFloat(jsonArray.get(0), "minU"); float g = GsonHelper.convertToFloat(jsonArray.get(1), "minV"); float h = GsonHelper.convertToFloat(jsonArray.get(2), "maxU"); float i = GsonHelper.convertToFloat(jsonArray.get(3), "maxV"); return new BlockElementFace.UVs(f, g, h, i); } } } } @Environment(EnvType.CLIENT) public record UVs(float minU, float minV, float maxU, float maxV) { public float getVertexU(int vertexIndex) { return vertexIndex != 0 && vertexIndex != 1 ? this.maxU : this.minU; } public float getVertexV(int vertexIndex) { return vertexIndex != 0 && vertexIndex != 3 ? this.maxV : this.minV; } } }