From d55d4665e476dd53bbad2ee8b1527530c5e6ca36 Mon Sep 17 00:00:00 2001 From: Bai Yuxuan Date: Tue, 17 Dec 2024 23:19:15 +0800 Subject: [PATCH] Try to update to 1.21.1 - Migrate Block Model part to version 1.21.1 --- README.md | 5 +- .../main/java/dev/onyxstudios/foml/FOML.java | 6 +- .../onyxstudios/foml/obj/FOMLMaterial.java | 415 +++++++++++++++++- .../onyxstudios/foml/obj/ItemOBJLoader.java | 94 ---- .../dev/onyxstudios/foml/obj/MtlReader.java | 8 +- .../dev/onyxstudios/foml/obj/OBJLoader.java | 46 +- .../foml/obj/baked/OBJUnbakedModel.java | 37 +- 7 files changed, 463 insertions(+), 148 deletions(-) delete mode 100644 foml-mod/src/main/java/dev/onyxstudios/foml/obj/ItemOBJLoader.java diff --git a/README.md b/README.md index e1619b7..c6dee9f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # FOML - Fabric OBJ Model Loader +Fabric OBJ Model Loader + +## Only OBJ model supported for **BLOCK** has updated to 1.21.1 +(2024.12.17) # Adding the API to your project diff --git a/foml-mod/src/main/java/dev/onyxstudios/foml/FOML.java b/foml-mod/src/main/java/dev/onyxstudios/foml/FOML.java index 2a7011a..e0ce137 100644 --- a/foml-mod/src/main/java/dev/onyxstudios/foml/FOML.java +++ b/foml-mod/src/main/java/dev/onyxstudios/foml/FOML.java @@ -1,9 +1,8 @@ package dev.onyxstudios.foml; -import dev.onyxstudios.foml.obj.ItemOBJLoader; import dev.onyxstudios.foml.obj.OBJLoader; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.model.ModelLoadingRegistry; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -13,7 +12,6 @@ public class FOML implements ClientModInitializer { @Override public void onInitializeClient() { - ModelLoadingRegistry.INSTANCE.registerResourceProvider(OBJLoader.INSTANCE); - ModelLoadingRegistry.INSTANCE.registerVariantProvider(ItemOBJLoader.INSTANCE); + ModelLoadingPlugin.register(OBJLoader.INSTANCE); } } diff --git a/foml-mod/src/main/java/dev/onyxstudios/foml/obj/FOMLMaterial.java b/foml-mod/src/main/java/dev/onyxstudios/foml/obj/FOMLMaterial.java index f783781..0a4e799 100644 --- a/foml-mod/src/main/java/dev/onyxstudios/foml/obj/FOMLMaterial.java +++ b/foml-mod/src/main/java/dev/onyxstudios/foml/obj/FOMLMaterial.java @@ -2,6 +2,9 @@ import de.javagl.obj.FloatTuple; import de.javagl.obj.Mtl; +import de.javagl.obj.TextureOptions; + +import java.util.List; public class FOMLMaterial implements Mtl { private final Mtl material; @@ -17,12 +20,76 @@ public String getName() { return material.getName(); } + @Override + public Integer getIllum() { + return 0; + } + + @Override + public void setIllum(Integer illum) { + + } + + @Override + public Float getNi() { + return 0f; + } + + @Override + public void setNi(Float ni) { + + } + + @Override + public FloatTuple getTf() { + return null; + } + + @Override + public void setTf(Float r, Float g, Float b) { + + } + + @Override + public Float getSharpness() { + return 0f; + } + + @Override + public void setSharpness(Float sharpness) { + + } + @Override public FloatTuple getKa() { return material.getKa(); } @Override + public void setKa(Float r, Float g, Float b) { + + } + + @Override + public String getMapKa() { + return ""; + } + + @Override + public void setMapKa(String mapKa) { + + } + + @Override + public TextureOptions getMapKaOptions() { + return null; + } + + @Override + public void setMapKaOptions(TextureOptions options) { + + } + public void setKa(float ka0, float ka1, float ka2) { material.setKa(ka0, ka1, ka2); } @@ -33,6 +100,31 @@ public FloatTuple getKs() { } @Override + public void setKs(Float r, Float g, Float b) { + + } + + @Override + public String getMapKs() { + return ""; + } + + @Override + public void setMapKs(String mapKs) { + + } + + @Override + public TextureOptions getMapKsOptions() { + return null; + } + + @Override + public void setMapKsOptions(TextureOptions options) { + + } + + public void setKs(float ks0, float ks1, float ks2) { material.setKs(ks0, ks1, ks2); } @@ -43,6 +135,11 @@ public FloatTuple getKd() { } @Override + public void setKd(Float r, Float g, Float b) { + + } + + public void setKd(float kd0, float kd1, float kd2) { material.setKd(kd0, kd1, kd2); } @@ -58,21 +155,335 @@ public void setMapKd(String mapKd) { } @Override - public float getNs() { + public TextureOptions getMapKdOptions() { + return null; + } + + @Override + public void setMapKdOptions(TextureOptions options) { + + } + + @Override + public Float getNs() { return material.getNs(); } @Override + public void setNs(Float ns) { + + } + + @Override + public String getMapNs() { + return ""; + } + + @Override + public void setMapNs(String mapNs) { + + } + + @Override + public TextureOptions getMapNsOptions() { + return null; + } + + @Override + public void setMapNsOptions(TextureOptions options) { + + } + public void setNs(float ns) { material.setNs(ns); } @Override - public float getD() { + public Float getD() { return material.getD(); } @Override + public void setD(Float d) { + + } + + @Override + public Boolean isHalo() { + return null; + } + + @Override + public void setHalo(Boolean halo) { + + } + + @Override + public String getMapD() { + return ""; + } + + @Override + public void setMapD(String mapD) { + + } + + @Override + public TextureOptions getMapDOptions() { + return null; + } + + @Override + public void setMapDOptions(TextureOptions options) { + + } + + @Override + public String getBump() { + return ""; + } + + @Override + public void setBump(String bump) { + + } + + @Override + public TextureOptions getBumpOptions() { + return null; + } + + @Override + public void setBumpOptions(TextureOptions options) { + + } + + @Override + public String getDisp() { + return ""; + } + + @Override + public void setDisp(String disp) { + + } + + @Override + public TextureOptions getDispOptions() { + return null; + } + + @Override + public void setDispOptions(TextureOptions options) { + + } + + @Override + public String getDecal() { + return ""; + } + + @Override + public void setDecal(String decal) { + + } + + @Override + public TextureOptions getDecalOptions() { + return null; + } + + @Override + public void setDecalOptions(TextureOptions options) { + + } + + @Override + public List getReflOptions() { + return List.of(); + } + + @Override + public Float getPr() { + return 0f; + } + + @Override + public void setPr(Float pr) { + + } + + @Override + public String getMapPr() { + return ""; + } + + @Override + public void setMapPr(String mapPr) { + + } + + @Override + public TextureOptions getMapPrOptions() { + return null; + } + + @Override + public void setMapPrOptions(TextureOptions options) { + + } + + @Override + public Float getPm() { + return 0f; + } + + @Override + public void setPm(Float pm) { + + } + + @Override + public String getMapPm() { + return ""; + } + + @Override + public void setMapPm(String mapPm) { + + } + + @Override + public TextureOptions getMapPmOptions() { + return null; + } + + @Override + public void setMapPmOptions(TextureOptions options) { + + } + + @Override + public Float getPs() { + return 0f; + } + + @Override + public void setPs(Float ps) { + + } + + @Override + public String getMapPs() { + return ""; + } + + @Override + public void setMapPs(String mapPs) { + + } + + @Override + public TextureOptions getMapPsOptions() { + return null; + } + + @Override + public void setMapPsOptions(TextureOptions options) { + + } + + @Override + public Float getPc() { + return 0f; + } + + @Override + public void setPc(Float pc) { + + } + + @Override + public Float getPcr() { + return 0f; + } + + @Override + public void setPcr(Float pcr) { + + } + + @Override + public FloatTuple getKe() { + return null; + } + + @Override + public void setKe(Float r, Float g, Float b) { + + } + + @Override + public String getMapKe() { + return ""; + } + + @Override + public void setMapKe(String mapKe) { + + } + + @Override + public TextureOptions getMapKeOptions() { + return null; + } + + @Override + public void setMapKeOptions(TextureOptions options) { + + } + + @Override + public Float getAniso() { + return 0f; + } + + @Override + public void setAniso(Float aniso) { + + } + + @Override + public Float getAnisor() { + return 0f; + } + + @Override + public void setAnisor(Float anisor) { + + } + + @Override + public String getNorm() { + return ""; + } + + @Override + public void setNorm(String norm) { + + } + + @Override + public TextureOptions getNormOptions() { + return null; + } + + @Override + public void setNormOptions(TextureOptions options) { + + } + + public void setD(float d) { material.setD(d); } diff --git a/foml-mod/src/main/java/dev/onyxstudios/foml/obj/ItemOBJLoader.java b/foml-mod/src/main/java/dev/onyxstudios/foml/obj/ItemOBJLoader.java deleted file mode 100644 index 188e98b..0000000 --- a/foml-mod/src/main/java/dev/onyxstudios/foml/obj/ItemOBJLoader.java +++ /dev/null @@ -1,94 +0,0 @@ -package dev.onyxstudios.foml.obj; - -import com.google.gson.*; -import dev.onyxstudios.foml.FOML; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.model.ModelProviderContext; -import net.fabricmc.fabric.api.client.model.ModelVariantProvider; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.model.UnbakedModel; -import net.minecraft.client.render.model.json.ModelTransformation; -import net.minecraft.client.render.model.json.Transformation; -import net.minecraft.client.util.ModelIdentifier; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.JsonHelper; - -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.function.Function; - -/*** - * ItemOBJLoader - * Child class of the OBJ loader that loads basic item OBJ models with JSON model transformations. - * - * Created by jard at 2:27 AM on September 22, 2019. - ***/ -public class ItemOBJLoader implements ModelVariantProvider, Function { - public static ItemOBJLoader INSTANCE = new ItemOBJLoader(); - public static final Gson GSON = (new GsonBuilder()) - .registerTypeAdapter (ModelTransformation.class, new ItemOBJLoader.ModelTransformDeserializer()) - .registerTypeAdapter (Transformation.class, new ItemOBJLoader.TransformDeserializer()) - .create (); - private static final OBJLoader OBJ_LOADER = OBJLoader.INSTANCE; - - @Override - public UnbakedModel loadModelVariant(ModelIdentifier modelId, ModelProviderContext context) { - if(modelId.getVariant().equals("inventory")) { - ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager(); - - Identifier modelPath = new Identifier (modelId.getNamespace (), - "models/item/" + modelId.getPath () + ".json"); - - if (resourceManager.containsResource(modelPath)) { - try (Reader reader = new InputStreamReader(resourceManager.getResource(modelPath).getInputStream())) { - JsonObject rawModel = JsonHelper.deserialize(reader); - - JsonElement parent = rawModel.get("parent"); - if (parent instanceof JsonPrimitive && ((JsonPrimitive) parent).isString()) { - String objPath = parent.getAsString(); - if (!objPath.endsWith(".obj")) - throw new IllegalStateException("Parent of JsonOBJ model must be a .obj file."); - - Identifier parentPath = new Identifier(objPath); - - ModelTransformation transformation = null; - if (rawModel.has("display")) { - JsonObject rawTransform = JsonHelper.getObject(rawModel, "display"); - transformation = GSON.fromJson(rawTransform, ModelTransformation.class); - } - - return OBJ_LOADER.loadModelResource(parentPath, - context, transformation); - } - } catch (Exception e) { - // Silently ignore general IllegalStateExceptions, as all vanilla models in a registered namespace would - // otherwise spew the console with this error. - if (!(e instanceof IllegalStateException)) { - FOML.LOGGER.error("Unable to load OBJ Model, Source: " + modelId.toString(), e); - } - } - } - } - return null; - } - - @Environment(EnvType.CLIENT) - public static class ModelTransformDeserializer extends ModelTransformation.Deserializer { - protected ModelTransformDeserializer () { - super (); - } - } - @Environment(EnvType.CLIENT) - public static class TransformDeserializer extends Transformation.Deserializer { - protected TransformDeserializer () { - super (); - } - } - - @Override - public ModelVariantProvider apply(ResourceManager manager) { - return this; - } -} diff --git a/foml-mod/src/main/java/dev/onyxstudios/foml/obj/MtlReader.java b/foml-mod/src/main/java/dev/onyxstudios/foml/obj/MtlReader.java index 61aca33..215159a 100644 --- a/foml-mod/src/main/java/dev/onyxstudios/foml/obj/MtlReader.java +++ b/foml-mod/src/main/java/dev/onyxstudios/foml/obj/MtlReader.java @@ -51,10 +51,10 @@ public class MtlReader * @throws IOException If an IO error occurs */ public static List read(InputStream inputStream) - throws IOException + throws IOException { BufferedReader reader = new BufferedReader( - new InputStreamReader(inputStream)); + new InputStreamReader(inputStream)); return readImpl(reader); } @@ -68,7 +68,7 @@ public static List read(InputStream inputStream) * @throws IOException If an IO error occurs */ public static List read(Reader reader) - throws IOException + throws IOException { if (reader instanceof BufferedReader) { @@ -87,7 +87,7 @@ public static List read(Reader reader) * @throws IOException If an IO error occurs */ private static List readImpl(BufferedReader reader) - throws IOException + throws IOException { List mtlList = new ArrayList<>(); diff --git a/foml-mod/src/main/java/dev/onyxstudios/foml/obj/OBJLoader.java b/foml-mod/src/main/java/dev/onyxstudios/foml/obj/OBJLoader.java index 2a6a917..cd7db62 100644 --- a/foml-mod/src/main/java/dev/onyxstudios/foml/obj/OBJLoader.java +++ b/foml-mod/src/main/java/dev/onyxstudios/foml/obj/OBJLoader.java @@ -5,14 +5,15 @@ import de.javagl.obj.ObjUtils; import dev.onyxstudios.foml.FOML; import dev.onyxstudios.foml.obj.baked.OBJUnbakedModel; -import net.fabricmc.fabric.api.client.model.ModelProviderContext; -import net.fabricmc.fabric.api.client.model.ModelResourceProvider; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelResolver; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.model.UnbakedModel; import net.minecraft.client.render.model.json.ModelTransformation; import net.minecraft.resource.Resource; import net.minecraft.resource.ResourceManager; import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.io.InputStreamReader; @@ -20,14 +21,14 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.function.Function; +import java.util.Objects; -public class OBJLoader implements ModelResourceProvider, Function { +public class OBJLoader implements ModelLoadingPlugin, ModelResolver { public static final OBJLoader INSTANCE = new OBJLoader(); - private OBJLoader() { - } + private OBJLoader() {} + public OBJUnbakedModel loadModel(Reader reader, String modid, ResourceManager manager, ModelTransformation transform) { OBJUnbakedModel model; @@ -47,15 +48,15 @@ public Map loadMTL(ResourceManager manager, String modid, Map mtls = new LinkedHashMap<>(); for (String name : mtlNames) { - Identifier resourceId = new Identifier(modid, "models/" + name); + Identifier resourceId = Identifier.of(modid, "models/" + name); // Use 1.0.0 MTL path as a fallback - if (!manager.containsResource(resourceId)) { - resourceId = new Identifier(modid, "models/block/" + name); + if (manager.getResource(resourceId).isEmpty()) { + resourceId = Identifier.of(modid, "models/block/" + name); } // Continue with normal resource loading code - if(manager.containsResource(resourceId)) { - Resource resource = manager.getResource(resourceId); + if(manager.getResource(resourceId).isPresent()) { + Resource resource = manager.getResource(resourceId).get(); MtlReader.read(resource.getInputStream()).forEach(mtl -> { mtls.put(mtl.getName(), mtl); @@ -69,27 +70,20 @@ public Map loadMTL(ResourceManager manager, String modid, } @Override - public UnbakedModel loadModelResource(Identifier identifier, ModelProviderContext modelProviderContext) { - return loadModelResource (identifier, modelProviderContext, ModelTransformation.NONE); + public void onInitializeModelLoader(ModelLoadingPlugin.Context context) { + context.resolveModel().register(this); } - protected UnbakedModel loadModelResource(Identifier identifier, ModelProviderContext modelProviderContext, - ModelTransformation transform) { - if(identifier.getPath().endsWith(".obj")) { + @Override + public @Nullable UnbakedModel resolveModel(ModelResolver.Context context) { + if(Objects.equals(context.id(), Identifier.ofVanilla("block/torch"))) { ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager(); - - try (Reader reader = new InputStreamReader(resourceManager.getResource(new Identifier(identifier.getNamespace(), "models/" + identifier.getPath())).getInputStream())) { - return loadModel(reader, identifier.getNamespace(), resourceManager, transform); + try (Reader reader = new InputStreamReader(resourceManager.getResource(Identifier.of(context.id().getNamespace(), "models/" + context.id().getPath())).get().getInputStream())) { + return loadModel(reader, context.id().getNamespace(), resourceManager, null); } catch (IOException e) { - FOML.LOGGER.error("Unable to load OBJ Model, Source: " + identifier.toString(), e); + FOML.LOGGER.error("Unable to load OBJ Model, Source: " + context.id().toString(), e); } } - return null; } - - @Override - public ModelResourceProvider apply(ResourceManager manager) { - return this; - } } diff --git a/foml-mod/src/main/java/dev/onyxstudios/foml/obj/baked/OBJUnbakedModel.java b/foml-mod/src/main/java/dev/onyxstudios/foml/obj/baked/OBJUnbakedModel.java index 02e5e60..895958c 100644 --- a/foml-mod/src/main/java/dev/onyxstudios/foml/obj/baked/OBJUnbakedModel.java +++ b/foml-mod/src/main/java/dev/onyxstudios/foml/obj/baked/OBJUnbakedModel.java @@ -6,25 +6,27 @@ import de.javagl.obj.Obj; import de.javagl.obj.ObjSplitting; import dev.onyxstudios.foml.obj.FOMLMaterial; +import dev.onyxstudios.foml.obj.MtlReader; import net.fabricmc.fabric.api.renderer.v1.Renderer; import net.fabricmc.fabric.api.renderer.v1.RendererAccess; import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.ModelBakeSettings; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.render.model.UnbakedModel; +import net.minecraft.client.render.model.*; import net.minecraft.client.render.model.json.ModelTransformation; import net.minecraft.client.texture.Sprite; import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.client.util.SpriteIdentifier; -import net.minecraft.client.util.math.AffineTransformation; -import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.AffineTransformation; import net.minecraft.util.Identifier; import net.minecraft.util.math.Direction; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3f; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; import java.util.*; import java.util.function.Function; @@ -44,7 +46,7 @@ public OBJUnbakedModel(Obj obj, Map mtls, ModelTransformat Mtl mtl = this.findMtlForName("sprite"); this.sprite = mtls.size() > 0 - ? new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier((mtl == null ? mtls.values().iterator().next() : mtl).getMapKd())) + ? new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, Identifier.of((mtl == null ? mtls.values().iterator().next() : mtl).getMapKd())) : DEFAULT_SPRITE; } @@ -58,15 +60,12 @@ public Collection getModelDependencies() { } @Override - public Collection getTextureDependencies(Function unbakedModelGetter, Set> unresolvedTextureReferences) { - List sprites = new ArrayList<>(); - mtls.values().forEach(mtl -> sprites.add(new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier(mtl.getMapKd())))); + public void setParents(Function function) { - return sprites; } @Override - public BakedModel bake(ModelLoader loader, Function textureGetter, ModelBakeSettings bakeSettings, Identifier modelId) { + public BakedModel bake(Baker baker, Function textureGetter, ModelBakeSettings bakeSettings) { Renderer renderer = RendererAccess.INSTANCE.getRenderer(); Mesh mesh = null; @@ -95,7 +94,7 @@ public BakedModel bake(ModelLoader loader, Function te } } - mtlSprite = getMtlSprite(textureGetter, new Identifier(mtl.getMapKd())); + mtlSprite = getMtlSprite(textureGetter, Identifier.of(mtl.getMapKd())); } for (int i = 0; i < matGroupObj.getNumFaces(); i++) { @@ -119,9 +118,13 @@ public BakedModel bake(ModelLoader loader, Function te emitter.spriteColor(0, color, color, color, color); emitter.material(RendererAccess.INSTANCE.getRenderer().materialFinder().find()); - emitter.colorIndex(mtl.getTintIndex()); + try { + emitter.colorIndex(MtlReader.read(new InputStreamReader((new FileInputStream("/Users/baicaibear/Documents/小程序们/Lantern-in-Storm/src/main/resources/assets/minecraft/block/mtl/torch.mtl")))).getFirst().getTintIndex()); + } catch (IOException e) { + throw new RuntimeException(e); + } emitter.nominalFace(emitter.lightFace()); - emitter.spriteBake(0, mtlSprite, MutableQuadView.BAKE_NORMALIZED | (bakeSettings.isShaded() ? MutableQuadView.BAKE_LOCK_UV : 0)); + emitter.spriteBake(0, mtlSprite, MutableQuadView.BAKE_NORMALIZED | (bakeSettings.isUvLocked() ? MutableQuadView.BAKE_LOCK_UV : 0)); emitter.emit(); } @@ -141,11 +144,11 @@ private void addVertex(int faceIndex, int vertIndex, Vector3f vertex, FloatTuple if (bakeSettings.getRotation() != AffineTransformation.identity() && !degenerate) { vertex.add(-0.5F, -0.5F, -0.5F); - vertex.rotate(bakeSettings.getRotation().getRotation2()); + vertex.rotate(bakeSettings.getRotation().getRightRotation()); vertex.add(0.5f, 0.5f, 0.5f); } - emitter.pos (vertIndex, vertex.getX(), vertex.getY(), vertex.getZ()); + emitter.pos (vertIndex, vertex.x, vertex.y, vertex.z); emitter.normal(vertIndex, normal.getX(), normal.getY(), normal.getZ()); if(obj.getNumTexCoords() > 0) {