From f587c6e9001eadea1838bd45ee4066ebad7080a0 Mon Sep 17 00:00:00 2001 From: zimzaza4 <3625282098@qq.com> Date: Sun, 13 Oct 2024 11:16:44 +0800 Subject: [PATCH 1/8] huh --- pom.xml | 19 +++++++++++ .../GeneratorMain.java | 33 +++++++++++++++---- .../generator/Entity.java | 26 ++++++++------- .../generator/Material.java | 17 ++++++++++ .../generator/RenderController.java | 4 ++- .../generator/Texture.java | 4 +-- .../generator/TextureConfig.java | 33 +++++++++++++++++++ 7 files changed, 115 insertions(+), 21 deletions(-) create mode 100644 src/main/java/re/imc/geysermodelenginepackgenerator/generator/Material.java create mode 100644 src/main/java/re/imc/geysermodelenginepackgenerator/generator/TextureConfig.java diff --git a/pom.xml b/pom.xml index dcd0771..b5a01fe 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,10 @@ true + + jitpack.io + https://jitpack.io + @@ -62,5 +66,20 @@ system ${project.basedir}/libs/geyserutils-geyser-1.0-SNAPSHOT.jar + + me.rochblondiaux + blockbenchmodelreader + 1.2 + + + com.github.GeyserMC.PackConverter + bedrock-pack-schema + 3d8150474d + + + com.github.GeyserMC.PackConverter + pack-schema-api + 3d8150474d + \ No newline at end of file diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java index 881a388..8b3518c 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java @@ -14,13 +14,15 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; public class GeneratorMain { public static final Map entityMap = new HashMap<>(); - public static final Map animationMap = new HashMap<>(); - public static final Map geometryMap = new HashMap<>(); - public static final Map textureMap = new HashMap<>(); + public static final Map animationMap = new HashMap<>(); + public static final Map geometryMap = new HashMap<>(); + public static final Map> textureMap = new HashMap<>(); public static final Gson GSON = new GsonBuilder().setPrettyPrinting() .create(); @@ -40,13 +42,23 @@ public class GeneratorMain { String modelId = folder.getName().toLowerCase(); Entity entity = new Entity(modelId); + TextureConfig textureConfig = new TextureConfig(); boolean canAdd = false; for (File e : folder.listFiles()) { if (e.isDirectory()) { generateFromFolder(currentPath + folder.getName() + "/", e); } if (e.getName().endsWith(".png")) { - textureMap.put(modelId, new Texture(modelId, currentPath, e.toPath())); + String textureName = e.getName().replace(".png", ""); + Set bindingBones = new HashSet<>(); + bindingBones.add("*"); + if (!textureConfig.getBingingBones().containsKey(textureName)) { + bindingBones = textureConfig.getBingingBones().get(textureName); + } + textureMap.computeIfAbsent(modelId, s -> new HashMap<>()).put(textureName, new Texture(modelId, currentPath, bindingBones, e.toPath())); + if (!textureConfig.getBingingBones().isEmpty()) { + textureConfig.getBingingBones().put(textureName, Set.of("*")); + } } if (e.getName().endsWith(".json")) { try { @@ -136,6 +148,15 @@ public class GeneratorMain { materialsFolder.mkdirs(); File materialFile = new File(materialsFolder, "entity.material"); + + if (!materialFile.exists()) { + try { + Files.writeString(materialFile.toPath(), + Material.TEMPLATE, StandardCharsets.UTF_8); + } catch (IOException e) { + e.printStackTrace(); + } + } for (Map.Entry entry : animationMap.entrySet()) { Entity entity = entityMap.get(entry.getKey()); @@ -179,7 +200,7 @@ public class GeneratorMain { } } - for (Map.Entry entry : textureMap.entrySet()) { + for (Map.Entry> entry : textureMap.entrySet()) { Path path = texturesFolder.toPath().resolve(entry.getValue().getPath() + entry.getKey() + ".png"); path.toFile().getParentFile().mkdirs(); @@ -213,7 +234,7 @@ public class GeneratorMain { String id = entity.getModelId(); if (!geometryMap.containsKey(id)) continue; - RenderController controller = new RenderController(id, geometryMap.get(id).getBones()); + RenderController controller = new RenderController(id, geometryMap.get(id).getBones(), entity); entity.setRenderController(controller); Path renderPath = new File(renderControllersFolder, "controller.render." + id + ".json").toPath(); if (renderPath.toFile().exists()) { diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java index d195564..0ed2c85 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java @@ -11,6 +11,7 @@ import me.zimzaza4.geyserutils.geyser.GeyserUtils; import re.imc.geysermodelenginepackgenerator.GeneratorMain; import java.util.HashSet; +import java.util.Map; import java.util.Properties; import java.util.Set; @@ -26,13 +27,12 @@ public class Entity { "description": { "identifier": "modelengine:%entity_id%", "materials": { - "default": "%material%" + "default": "%material%", + "anim": "entity_alphatest_anim_change_color" }, "textures": { - "default": "%texture%" }, "geometry": { - "default": "%geometry%" }, "animations": { "look_at_target": "%look_at_target%" @@ -54,19 +54,13 @@ public class Entity { String modelId; JsonObject json; boolean hasHeadAnimation = false; - @Setter - @Getter Animation animation; - - @Setter - @Getter Geometry geometry; - - @Setter - @Getter RenderController renderController; - String path; + Map textureMap; + TextureConfig textureConfig; + Properties config = new Properties(); @@ -87,6 +81,14 @@ public class Entity { JsonObject description = json.get("minecraft:client_entity").getAsJsonObject().get("description").getAsJsonObject(); JsonObject jsonAnimations = description.get("animations").getAsJsonObject(); + JsonObject jsonTextures = description.get("textures").getAsJsonObject(); + JsonObject jsonGeometry = description.get("geometry").getAsJsonObject(); + + for (String name : textureMap.keySet()) { + jsonTextures.addProperty(name,"textures/entity/" + path + modelId + "/" + name); + jsonGeometry.addProperty(name, "geometry.modelengine_" + modelId); + } + JsonArray animate = description.get("scripts").getAsJsonObject().get("animate").getAsJsonArray(); if (animation != null) { diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Material.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Material.java new file mode 100644 index 0000000..2150879 --- /dev/null +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Material.java @@ -0,0 +1,17 @@ +package re.imc.geysermodelenginepackgenerator.generator; + +public class Material { + public static final String TEMPLATE = """ + { + "materials":{ + "version":"1.0.0", + "entity_alphatest_anim_change_color:entity_alphatest_change_color":{ + "+defines":[ + "USE_UV_ANIM" + ] + } + } + } + """; + +} diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java index 0f7ecab..275c0ec 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java @@ -11,10 +11,12 @@ public class RenderController { public static final Set NEED_REMOVE_WHEN_SORT = Set.of("pbody_", "plarm_", "prarm_", "plleg_", "prleg_", "phead_", "p_"); String modelId; Set bones; + Entity entity; - public RenderController(String modelId, Set bones) { + public RenderController(String modelId, Set bones, Entity entity) { this.modelId = modelId; this.bones = bones; + this.entity = entity; } // look, I'm fine with your other code and stuff, but I ain't using templates for JSON lmao diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java index c0bd870..2715e5e 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java @@ -5,6 +5,7 @@ import lombok.Getter; import lombok.Setter; import java.nio.file.Path; +import java.util.Set; @Getter @Setter @@ -12,8 +13,7 @@ import java.nio.file.Path; public class Texture { String modelId; - String path; + Set bindingBones; Path originalPath; - } diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/TextureConfig.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/TextureConfig.java new file mode 100644 index 0000000..39d752f --- /dev/null +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/TextureConfig.java @@ -0,0 +1,33 @@ +package re.imc.geysermodelenginepackgenerator.generator; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class TextureConfig { + + @SerializedName("binding_bones") + Map> bingingBones = new HashMap<>(); + @SerializedName("anim_textures") + Map animTextures = new HashMap<>(); + + @NoArgsConstructor + @AllArgsConstructor + @Getter + @Setter + public static class AnimTextureOptions { + boolean animUv; + float fps; + int frames; + } +} From 73caf2ec76cce5231536c75764fe4d8ca99edd24 Mon Sep 17 00:00:00 2001 From: zimzaza4 <3625282098@qq.com> Date: Sun, 13 Oct 2024 14:05:52 +0800 Subject: [PATCH 2/8] OOOOK --- .../GeneratorMain.java | 47 ++++-- .../generator/Bone.java | 23 +++ .../generator/Entity.java | 17 +-- .../generator/Geometry.java | 24 +++- .../generator/RenderController.java | 136 ++++++++++++------ .../generator/Texture.java | 1 + 6 files changed, 179 insertions(+), 69 deletions(-) create mode 100644 src/main/java/re/imc/geysermodelenginepackgenerator/generator/Bone.java diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java index 8b3518c..9cc0512 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java @@ -43,6 +43,14 @@ public class GeneratorMain { Entity entity = new Entity(modelId); TextureConfig textureConfig = new TextureConfig(); + File textureConfigFile = new File(folder, "texture_config.json"); + if (textureConfigFile.exists()) { + try { + textureConfig = GSON.fromJson(Files.readString(textureConfigFile.toPath()), TextureConfig.class); + } catch (IOException e) { + e.printStackTrace(); + } + } boolean canAdd = false; for (File e : folder.listFiles()) { if (e.isDirectory()) { @@ -52,13 +60,16 @@ public class GeneratorMain { String textureName = e.getName().replace(".png", ""); Set bindingBones = new HashSet<>(); bindingBones.add("*"); - if (!textureConfig.getBingingBones().containsKey(textureName)) { + if (textureConfig.getBingingBones().containsKey(textureName)) { bindingBones = textureConfig.getBingingBones().get(textureName); } - textureMap.computeIfAbsent(modelId, s -> new HashMap<>()).put(textureName, new Texture(modelId, currentPath, bindingBones, e.toPath())); - if (!textureConfig.getBingingBones().isEmpty()) { + Map map = textureMap.computeIfAbsent(modelId, s -> new HashMap<>()); + map.put(textureName, new Texture(modelId, currentPath, bindingBones, e.toPath())); + entity.setTextureMap(map); + if (textureConfig.getBingingBones().isEmpty()) { textureConfig.getBingingBones().put(textureName, Set.of("*")); } + } if (e.getName().endsWith(".json")) { try { @@ -101,6 +112,13 @@ public class GeneratorMain { } catch (IOException ex) { ex.printStackTrace(); } + try { + Files.writeString(textureConfigFile.toPath(), GSON.toJson(textureConfig)); + } catch (IOException ex) { + ex.printStackTrace(); + } + + entity.setTextureConfig(textureConfig); entity.setPath(currentPath); entityMap.put(modelId, entity); } @@ -200,17 +218,20 @@ public class GeneratorMain { } } - for (Map.Entry> entry : textureMap.entrySet()) { - Path path = texturesFolder.toPath().resolve(entry.getValue().getPath() + entry.getKey() + ".png"); - path.toFile().getParentFile().mkdirs(); + for (Map.Entry> textures : textureMap.entrySet()) { - if (path.toFile().exists()) { - continue; - } - try { - Files.copy(entry.getValue().getOriginalPath(), path, StandardCopyOption.REPLACE_EXISTING); - } catch (IOException e) { - e.printStackTrace(); + for (Map.Entry entry : textures.getValue().entrySet()) { + Path path = texturesFolder.toPath().resolve(entry.getValue().getPath() + textures.getKey() + "/" + entry.getKey() + ".png"); + path.toFile().getParentFile().mkdirs(); + + if (path.toFile().exists()) { + continue; + } + try { + Files.copy(entry.getValue().getOriginalPath(), path, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + e.printStackTrace(); + } } } diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Bone.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Bone.java new file mode 100644 index 0000000..c31535d --- /dev/null +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Bone.java @@ -0,0 +1,23 @@ +package re.imc.geysermodelenginepackgenerator.generator; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class Bone { + String name; + String parent; + Set children = new HashSet<>(); + Set allChildren = new HashSet<>(); +} diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java index 0ed2c85..50f9e0e 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java @@ -10,10 +10,7 @@ import lombok.Setter; import me.zimzaza4.geyserutils.geyser.GeyserUtils; import re.imc.geysermodelenginepackgenerator.GeneratorMain; -import java.util.HashSet; -import java.util.Map; -import java.util.Properties; -import java.util.Set; +import java.util.*; @Getter @Setter @@ -33,6 +30,7 @@ public class Entity { "textures": { }, "geometry": { + "default": "%geometry%" }, "animations": { "look_at_target": "%look_at_target%" @@ -43,7 +41,6 @@ public class Entity { ] }, "render_controllers": [ - "%render_controller%" ] } } @@ -58,7 +55,7 @@ public class Entity { Geometry geometry; RenderController renderController; String path; - Map textureMap; + Map textureMap = new HashMap<>(); TextureConfig textureConfig; @@ -76,17 +73,17 @@ public class Entity { .replace("%geometry%", "geometry.modelengine_" + modelId) .replace("%texture%", "textures/entity/" + path + modelId) .replace("%look_at_target%", Boolean.parseBoolean(config.getProperty("head-rotation", "true".toLowerCase())) ? "animation." + modelId + ".look_at_target" : "animation.none") - .replace("%material%", config.getProperty("material", "entity_alphatest_change_color")) - .replace("%render_controller%", config.getProperty("render_controller", "controller.render.default"))).getAsJsonObject(); + .replace("%material%", config.getProperty("material", "entity_alphatest_change_color"))).getAsJsonObject(); JsonObject description = json.get("minecraft:client_entity").getAsJsonObject().get("description").getAsJsonObject(); JsonObject jsonAnimations = description.get("animations").getAsJsonObject(); JsonObject jsonTextures = description.get("textures").getAsJsonObject(); - JsonObject jsonGeometry = description.get("geometry").getAsJsonObject(); + JsonArray jsonRenderControllers = description.get("render_controllers").getAsJsonArray(); + for (String name : textureMap.keySet()) { jsonTextures.addProperty(name,"textures/entity/" + path + modelId + "/" + name); - jsonGeometry.addProperty(name, "geometry.modelengine_" + modelId); + jsonRenderControllers.add("controller.render." + modelId + "_" + name); } JsonArray animate = description.get("scripts").getAsJsonObject().get("animate").getAsJsonArray(); diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java index b00bcf3..c8c6bd5 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java @@ -5,6 +5,8 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.geysermc.geyser.api.extension.ExtensionLogger; +import re.imc.geysermodelenginepackgenerator.ExtensionMain; import java.util.*; @@ -17,7 +19,7 @@ public class Geometry { String modelId; JsonObject json; - Set bones = new HashSet<>(); + Map bones = new HashMap<>(); String path; public void load(String json) { @@ -41,6 +43,7 @@ public class Geometry { if (element.isJsonObject()) { String name = element.getAsJsonObject().get("name").getAsString().toLowerCase(Locale.ROOT); + String parent = element.getAsJsonObject().has("parent") ? element.getAsJsonObject().get("parent").getAsString() : null; element.getAsJsonObject().remove("name"); element.getAsJsonObject().addProperty("name", name); @@ -51,10 +54,27 @@ public class Geometry { name.startsWith("b_") || name.startsWith("ob_")) { iterator.remove(); - } else bones.add(name); + } else bones.put(name, new Bone(name, parent, new HashSet<>(), new HashSet<>())); + } + + for (Bone bone : bones.values()) { + if (bone.parent != null) { + Bone parent = bones.get(bone.parent); + if (parent != null) { + parent.children.add(bone); + addAllChildren(parent, bone); + } + } } } setId("geometry.modelengine_" + modelId); } + public void addAllChildren(Bone p, Bone c) { + p.allChildren.add(c); + Bone parent = bones.get(p.parent); + if (parent != null) { + addAllChildren(parent, c); + } + } } diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java index 275c0ec..235e145 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java @@ -2,18 +2,22 @@ package re.imc.geysermodelenginepackgenerator.generator; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.google.gson.internal.bind.TypeAdapters; import re.imc.geysermodelenginepackgenerator.GeneratorMain; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; import java.util.*; public class RenderController { - public static final Set NEED_REMOVE_WHEN_SORT = Set.of("pbody_", "plarm_", "prarm_", "plleg_", "prleg_", "phead_", "p_"); + public static final Set NEED_REMOVE_WHEN_SORT = Set.of("pbody_", "plarm_", "prarm_", "plleg_", "prleg_", "phead_", "p_", "uv_"); String modelId; - Set bones; + Map bones; Entity entity; - public RenderController(String modelId, Set bones, Entity entity) { + public RenderController(String modelId, Map bones, Entity entity) { this.modelId = modelId; this.bones = bones; this.entity = entity; @@ -27,53 +31,97 @@ public class RenderController { JsonObject renderControllers = new JsonObject(); root.add("render_controllers", renderControllers); - JsonObject controller = new JsonObject(); - renderControllers.add("controller.render." + modelId, controller); + Set processedBones = new HashSet<>(); + for (String key : entity.textureMap.keySet()) { - controller.addProperty("geometry", "Geometry.default"); + Texture texture = entity.textureMap.get(key); + Set uvBonesId = entity.getTextureConfig().bingingBones.get(key); + TextureConfig.AnimTextureOptions anim = entity.getTextureConfig().getAnimTextures().get(key); - JsonArray materials = new JsonArray(); - JsonObject materialItem = new JsonObject(); - materialItem.addProperty("*", "Material.default"); - materials.add(materialItem); - controller.add("materials", materials); + JsonObject controller = new JsonObject(); - JsonArray textures = new JsonArray(); - textures.add("Texture.default"); - controller.add("textures", textures); - Entity entity = GeneratorMain.entityMap - .get(modelId); - // boolean enable = Boolean.parseBoolean(entity.getConfig().getProperty("enable-part-visibility", "true")); + renderControllers.add("controller.render." + modelId + "_" + key, controller); - // if (enable) { - JsonArray partVisibility = new JsonArray(); - JsonObject visibilityDefault = new JsonObject(); - visibilityDefault.addProperty("*", true); - partVisibility.add(visibilityDefault); - int i = 0; - List sorted = new ArrayList<>(bones); - Map originalId = new HashMap<>(); - ListIterator iterator = sorted.listIterator(); - while (iterator.hasNext()) { - String s = iterator.next(); - String o = s; - for (String r : NEED_REMOVE_WHEN_SORT) { - s = s.replace(r, ""); + controller.addProperty("geometry", "Geometry.default"); + + JsonArray materials = new JsonArray(); + JsonObject materialItem = new JsonObject(); + if (anim != null) { + materialItem.addProperty("*", "Material.anim"); + JsonObject uvAnim = new JsonObject(); + controller.add("uv_anim", uvAnim); + JsonArray offset = new JsonArray(); + offset.add(0.0); + offset.add("math.mod(math.floor(q.life_time * " + anim.fps + ")," + anim.frames + ") / " + anim.frames); + uvAnim.add("offset", offset); + JsonArray scale = new JsonArray(); + scale.add(1.0); + scale.add("1 / " + anim.frames); + uvAnim.add("scale", scale); + } else { + materialItem.addProperty("*", "Material.default"); } - iterator.set(s); - originalId.put(s, o); + materials.add(materialItem); + controller.add("materials", materials); + + JsonArray textures = new JsonArray(); + textures.add("Texture." + key); + controller.add("textures", textures); + + // if (enable) { + JsonArray partVisibility = new JsonArray(); + JsonObject visibilityDefault = new JsonObject(); + visibilityDefault.addProperty("*", false); + partVisibility.add(visibilityDefault); + int i = 0; + List sorted = new ArrayList<>(bones.keySet()); + Map originalId = new HashMap<>(); + ListIterator iterator = sorted.listIterator(); + while (iterator.hasNext()) { + String s = iterator.next(); + String o = s; + for (String r : NEED_REMOVE_WHEN_SORT) { + s = s.replace(r, ""); + } + iterator.set(s); + originalId.put(s, o); + } + Collections.sort(sorted); + + Set uvAllBones = new HashSet<>(); + for (String uvBone : uvBonesId) { + if (uvBone.equals("*")) { + uvAllBones.addAll(bones.keySet()); + } + if (!bones.containsKey(uvBone)) { + continue; + } + for (Bone child : bones.get(uvBone).allChildren) { + uvAllBones.add(child.getName()); + } + uvAllBones.add(uvBone); + } + + + for (String boneName : sorted) { + boneName = originalId.get(boneName); + JsonObject visibilityItem = new JsonObject(); + int n = (int) Math.pow(2, (i % 24)); + Bone bone = bones.get(boneName); + + if (!processedBones.contains(bone) && (uvAllBones.contains(boneName) || uvBonesId.contains("*"))) { + visibilityItem.addProperty(boneName, "math.mod(math.floor(query.property('modelengine:bone" + i / 24 + "') / " + n + "), 2) == 1"); + partVisibility.add(visibilityItem); + if (!uvBonesId.contains("*")) { + processedBones.add(bone); + } + } + i++; + } + controller.add("part_visibility", partVisibility); + //} } - Collections.sort(sorted); - for (String bone : sorted) { - bone = originalId.get(bone); - JsonObject visibilityItem = new JsonObject(); - int n = (int) Math.pow(2, (i % 24)); - visibilityItem.addProperty(bone, "math.mod(math.floor(query.property('modelengine:bone" + i / 24 + "') / " + n + "), 2) == 1"); - partVisibility.add(visibilityItem); - i++; - } - controller.add("part_visibility", partVisibility); - //} + return root.toString(); } diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java index 2715e5e..7784b6d 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java @@ -16,4 +16,5 @@ public class Texture { String path; Set bindingBones; Path originalPath; + } From 42d92dd809eae2c5744b15e2125172b9116253f8 Mon Sep 17 00:00:00 2001 From: zimzaza4 <3625282098@qq.com> Date: Sun, 13 Oct 2024 18:15:37 +0800 Subject: [PATCH 3/8] new materials --- .../GeneratorMain.java | 60 ++++++++++--------- .../generator/AnimationController.java | 2 +- .../generator/Entity.java | 10 ++-- .../generator/Material.java | 22 +++++++ .../{TextureConfig.java => ModelConfig.java} | 9 ++- .../generator/RenderController.java | 22 +++---- 6 files changed, 77 insertions(+), 48 deletions(-) rename src/main/java/re/imc/geysermodelenginepackgenerator/generator/{TextureConfig.java => ModelConfig.java} (71%) diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java index 9cc0512..224a5b0 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java @@ -13,10 +13,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; public class GeneratorMain { public static final Map entityMap = new HashMap<>(); @@ -42,11 +39,12 @@ public class GeneratorMain { String modelId = folder.getName().toLowerCase(); Entity entity = new Entity(modelId); - TextureConfig textureConfig = new TextureConfig(); - File textureConfigFile = new File(folder, "texture_config.json"); + ModelConfig modelConfig = new ModelConfig(); + boolean shouldOverrideConfig = false; + File textureConfigFile = new File(folder, "config.json"); if (textureConfigFile.exists()) { try { - textureConfig = GSON.fromJson(Files.readString(textureConfigFile.toPath()), TextureConfig.class); + modelConfig = GSON.fromJson(Files.readString(textureConfigFile.toPath()), ModelConfig.class); } catch (IOException e) { e.printStackTrace(); } @@ -60,14 +58,15 @@ public class GeneratorMain { String textureName = e.getName().replace(".png", ""); Set bindingBones = new HashSet<>(); bindingBones.add("*"); - if (textureConfig.getBingingBones().containsKey(textureName)) { - bindingBones = textureConfig.getBingingBones().get(textureName); + if (modelConfig.getBingingBones().containsKey(textureName)) { + bindingBones = modelConfig.getBingingBones().get(textureName); } Map map = textureMap.computeIfAbsent(modelId, s -> new HashMap<>()); map.put(textureName, new Texture(modelId, currentPath, bindingBones, e.toPath())); entity.setTextureMap(map); - if (textureConfig.getBingingBones().isEmpty()) { - textureConfig.getBingingBones().put(textureName, Set.of("*")); + if (modelConfig.getBingingBones().isEmpty()) { + modelConfig.getBingingBones().put(textureName, Set.of("*")); + shouldOverrideConfig = true; } } @@ -99,26 +98,30 @@ public class GeneratorMain { } } if (canAdd) { - File config = new File(folder, "config.properties"); + // old config + File oldConfig = new File(folder, "config.properties"); + Properties old = new Properties(); try { - if (config.exists()) { - entity.getConfig().load(new FileReader(config)); - } else { - entity.getConfig().setProperty("head-rotation", "true"); - entity.getConfig().setProperty("material", "entity_alphatest_change_color"); - entity.getConfig().setProperty("blend-transition", "true"); - entity.getConfig().store(new FileWriter(config), ""); + if (oldConfig.exists()) { + old.load(new FileReader(oldConfig)); + modelConfig.setMaterial(old.getProperty("material", "entity_alphatest_change_color")); + modelConfig.setEnableBlendTransition(Boolean.parseBoolean(old.getProperty("blend-transition", "true"))); + modelConfig.setEnableHeadRotation(Boolean.parseBoolean(old.getProperty("head-rotation", "true"))); + shouldOverrideConfig = true; + oldConfig.delete(); } - } catch (IOException ex) { - ex.printStackTrace(); - } - try { - Files.writeString(textureConfigFile.toPath(), GSON.toJson(textureConfig)); - } catch (IOException ex) { - ex.printStackTrace(); - } - entity.setTextureConfig(textureConfig); + } catch (IOException ex) { + ex.printStackTrace(); + } + if (shouldOverrideConfig) { + try { + Files.writeString(textureConfigFile.toPath(), GSON.toJson(modelConfig)); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + entity.setModelConfig(modelConfig); entity.setPath(currentPath); entityMap.put(modelId, entity); } @@ -237,7 +240,6 @@ public class GeneratorMain { for (Map.Entry entry : entityMap.entrySet()) { Entity entity = entry.getValue(); - entity.getConfig().setProperty("render_controller", "controller.render." + entry.getKey()); entity.modify(); Path entityPath = entityFolder.toPath().resolve(entity.getPath() + entry.getKey() + ".entity.json"); diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/AnimationController.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/AnimationController.java index b307016..8daff0e 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/AnimationController.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/AnimationController.java @@ -57,7 +57,7 @@ public class AnimationController { animationControllers.add("controller.animation." + animation.modelId + "." + id, controller); i++; if (entity != null) { - boolean blend = Boolean.parseBoolean(entity.getConfig().getProperty("blend-transition", "true")); + boolean blend = entity.getModelConfig().isEnableBlendTransition(); if (!blend) { for (Map.Entry states : controller.get("states").getAsJsonObject().entrySet()) { states.getValue().getAsJsonObject().remove("blend_transition"); diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java index 50f9e0e..27408a9 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java @@ -8,7 +8,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import me.zimzaza4.geyserutils.geyser.GeyserUtils; -import re.imc.geysermodelenginepackgenerator.GeneratorMain; import java.util.*; @@ -25,7 +24,7 @@ public class Entity { "identifier": "modelengine:%entity_id%", "materials": { "default": "%material%", - "anim": "entity_alphatest_anim_change_color" + "anim": "entity_alphatest_anim_change_color_one_sided" }, "textures": { }, @@ -56,10 +55,9 @@ public class Entity { RenderController renderController; String path; Map textureMap = new HashMap<>(); - TextureConfig textureConfig; + ModelConfig modelConfig; - Properties config = new Properties(); @@ -72,8 +70,8 @@ public class Entity { json = new JsonParser().parse(TEMPLATE.replace("%entity_id%", modelId) .replace("%geometry%", "geometry.modelengine_" + modelId) .replace("%texture%", "textures/entity/" + path + modelId) - .replace("%look_at_target%", Boolean.parseBoolean(config.getProperty("head-rotation", "true".toLowerCase())) ? "animation." + modelId + ".look_at_target" : "animation.none") - .replace("%material%", config.getProperty("material", "entity_alphatest_change_color"))).getAsJsonObject(); + .replace("%look_at_target%", modelConfig.isEnableHeadRotation() ? "animation." + modelId + ".look_at_target" : "animation.none") + .replace("%material%", modelConfig.getMaterial())).getAsJsonObject(); JsonObject description = json.get("minecraft:client_entity").getAsJsonObject().get("description").getAsJsonObject(); JsonObject jsonAnimations = description.get("animations").getAsJsonObject(); diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Material.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Material.java index 2150879..04df3ba 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Material.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Material.java @@ -9,6 +9,28 @@ public class Material { "+defines":[ "USE_UV_ANIM" ] + }, + "entity_change_color_one_sided:entity": { + "+defines": [ + "USE_OVERLAY", + "USE_COLOR_MASK" + ] + }, + "entity_alphatest_change_color_one_sided:entity_change_color_one_sided": { + "+defines": [ "ALPHA_TEST" ], + "+samplerStates": [ + { + "samplerIndex": 1, + "textureWrap": "Repeat" + } + ], + "msaaSupport": "Both" + }, + + "entity_alphatest_anim_change_color_one_sided:entity_alphatest_change_color_one_sided":{ + "+defines":[ + "USE_UV_ANIM" + ] } } } diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/TextureConfig.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/ModelConfig.java similarity index 71% rename from src/main/java/re/imc/geysermodelenginepackgenerator/generator/TextureConfig.java rename to src/main/java/re/imc/geysermodelenginepackgenerator/generator/ModelConfig.java index 39d752f..36ae504 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/TextureConfig.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/ModelConfig.java @@ -14,8 +14,14 @@ import java.util.Set; @NoArgsConstructor @Getter @Setter -public class TextureConfig { +public class ModelConfig { + @SerializedName("head_rotation") + boolean enableHeadRotation = true; + @SerializedName("material") + String material = "entity_alphatest_change_color_one_sided"; + @SerializedName("blend_transition") + boolean enableBlendTransition = true; @SerializedName("binding_bones") Map> bingingBones = new HashMap<>(); @SerializedName("anim_textures") @@ -26,7 +32,6 @@ public class TextureConfig { @Getter @Setter public static class AnimTextureOptions { - boolean animUv; float fps; int frames; } diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java index 235e145..cfe97ae 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java @@ -2,17 +2,12 @@ package re.imc.geysermodelenginepackgenerator.generator; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.google.gson.internal.bind.TypeAdapters; -import re.imc.geysermodelenginepackgenerator.GeneratorMain; -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.IOException; import java.util.*; public class RenderController { - public static final Set NEED_REMOVE_WHEN_SORT = Set.of("pbody_", "plarm_", "prarm_", "plleg_", "prleg_", "phead_", "p_", "uv_"); + public static final Set NEED_REMOVE_WHEN_SORT = Set.of("pbody_", "plarm_", "prarm_", "plleg_", "prleg_", "phead_", "p_"); String modelId; Map bones; Entity entity; @@ -35,8 +30,8 @@ public class RenderController { for (String key : entity.textureMap.keySet()) { Texture texture = entity.textureMap.get(key); - Set uvBonesId = entity.getTextureConfig().bingingBones.get(key); - TextureConfig.AnimTextureOptions anim = entity.getTextureConfig().getAnimTextures().get(key); + Set uvBonesId = entity.getModelConfig().bingingBones.get(key); + ModelConfig.AnimTextureOptions anim = entity.getModelConfig().getAnimTextures().get(key); JsonObject controller = new JsonObject(); @@ -106,17 +101,24 @@ public class RenderController { for (String boneName : sorted) { boneName = originalId.get(boneName); JsonObject visibilityItem = new JsonObject(); - int n = (int) Math.pow(2, (i % 24)); Bone bone = bones.get(boneName); if (!processedBones.contains(bone) && (uvAllBones.contains(boneName) || uvBonesId.contains("*"))) { + int index = i; + if (boneName.startsWith("uv_")) { + index = sorted.indexOf(bone.parent); + } + int n = (int) Math.pow(2, (index % 24)); + visibilityItem.addProperty(boneName, "math.mod(math.floor(query.property('modelengine:bone" + i / 24 + "') / " + n + "), 2) == 1"); partVisibility.add(visibilityItem); if (!uvBonesId.contains("*")) { processedBones.add(bone); } } - i++; + if (!boneName.startsWith("uv_")) { + i++; + } } controller.add("part_visibility", partVisibility); //} From 68223acd38317d5fb964941796fa6e0352acc9e3 Mon Sep 17 00:00:00 2001 From: zimzaza4 <3625282098@qq.com> Date: Sun, 20 Oct 2024 18:56:05 +0800 Subject: [PATCH 4/8] per texture material --- .../geysermodelenginepackgenerator/generator/Entity.java | 5 +++++ .../generator/ModelConfig.java | 6 ++++++ .../generator/RenderController.java | 5 ++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java index 27408a9..76ca3af 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java @@ -76,8 +76,13 @@ public class Entity { JsonObject description = json.get("minecraft:client_entity").getAsJsonObject().get("description").getAsJsonObject(); JsonObject jsonAnimations = description.get("animations").getAsJsonObject(); JsonObject jsonTextures = description.get("textures").getAsJsonObject(); + JsonObject jsonMaterials = description.get("materials").getAsJsonObject(); + JsonArray jsonRenderControllers = description.get("render_controllers").getAsJsonArray(); + Map materials = getModelConfig().getTextureMaterials(); + materials.forEach(jsonMaterials::addProperty); + for (String name : textureMap.keySet()) { jsonTextures.addProperty(name,"textures/entity/" + path + modelId + "/" + name); diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/ModelConfig.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/ModelConfig.java index 36ae504..d2f0419 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/ModelConfig.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/ModelConfig.java @@ -26,6 +26,12 @@ public class ModelConfig { Map> bingingBones = new HashMap<>(); @SerializedName("anim_textures") Map animTextures = new HashMap<>(); + @SerializedName("texture_materials") + Map textureMaterials = new HashMap<>(); + + public Map getTextureMaterials() { + return textureMaterials != null ? textureMaterials : Map.of(); + } @NoArgsConstructor @AllArgsConstructor diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java index cfe97ae..c36e639 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java @@ -40,8 +40,11 @@ public class RenderController { controller.addProperty("geometry", "Geometry.default"); JsonArray materials = new JsonArray(); + String material = entity.getModelConfig().getTextureMaterials().get(key); JsonObject materialItem = new JsonObject(); - if (anim != null) { + if (material != null) { + materialItem.addProperty("*", "Material." + material); + } else if (anim != null) { materialItem.addProperty("*", "Material.anim"); JsonObject uvAnim = new JsonObject(); controller.add("uv_anim", uvAnim); From 64f4a3c6b046ef8b4f90f9eb680d918f401152b2 Mon Sep 17 00:00:00 2001 From: zimzaza4 <3625282098@qq.com> Date: Sun, 27 Oct 2024 10:44:11 +0800 Subject: [PATCH 5/8] per texture uv --- .../GeneratorMain.java | 34 ++++++++++++++- .../generator/Entity.java | 25 ++++++++--- .../generator/Geometry.java | 12 +++++- .../generator/ModelConfig.java | 8 ++++ .../generator/RenderController.java | 41 ++++++++++++++----- .../generator/Texture.java | 1 + 6 files changed, 103 insertions(+), 18 deletions(-) diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java index 224a5b0..9f11a7c 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java @@ -5,9 +5,9 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonParser; import re.imc.geysermodelenginepackgenerator.generator.*; +import javax.imageio.ImageIO; import java.io.File; import java.io.FileReader; -import java.io.FileWriter; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -210,12 +210,42 @@ public class GeneratorMain { entry.getValue().modify(); Path path = modelsFolder.toPath().resolve(entry.getValue().getPath() + entry.getKey() + ".geo.json"); path.toFile().getParentFile().mkdirs(); + String id = entry.getValue().getGeometryId(); + + Entity entity = entityMap.get(entry.getKey()); + if (entity != null) { + ModelConfig modelConfig = entity.getModelConfig(); + if (!modelConfig.getPerTextureUvSize().isEmpty()) { + for (Map.Entry textureEntry : entity.getTextureMap().entrySet()) { + String name = textureEntry.getKey(); + + Integer[] size = modelConfig.getPerTextureUvSize().getOrDefault(name, new Integer[]{16, 16}); + String suffix = size[0] + "_" + size[1]; + + path = modelsFolder.toPath().resolve(entry.getValue().getPath() + entry.getKey() + "_" + suffix + ".geo.json"); + + entry.getValue().setId(id + "_" + suffix); + + if (path.toFile().exists()) { + continue; + } + + try { + Files.writeString(path, GSON.toJson(entry.getValue().getJson()), StandardCharsets.UTF_8); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } if (path.toFile().exists()) { continue; } + try { - Files.writeString(path, entry.getValue().getJson().toString(), StandardCharsets.UTF_8); + Files.writeString(path, GSON.toJson(entry.getValue().getJson()), StandardCharsets.UTF_8); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java index 76ca3af..050b45a 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java @@ -29,7 +29,7 @@ public class Entity { "textures": { }, "geometry": { - "default": "%geometry%" + }, "animations": { "look_at_target": "%look_at_target%" @@ -68,7 +68,7 @@ public class Entity { public void modify() { json = new JsonParser().parse(TEMPLATE.replace("%entity_id%", modelId) - .replace("%geometry%", "geometry.modelengine_" + modelId) + .replace("%geometry%", "geometry.meg_" + modelId) .replace("%texture%", "textures/entity/" + path + modelId) .replace("%look_at_target%", modelConfig.isEnableHeadRotation() ? "animation." + modelId + ".look_at_target" : "animation.none") .replace("%material%", modelConfig.getMaterial())).getAsJsonObject(); @@ -76,6 +76,7 @@ public class Entity { JsonObject description = json.get("minecraft:client_entity").getAsJsonObject().get("description").getAsJsonObject(); JsonObject jsonAnimations = description.get("animations").getAsJsonObject(); JsonObject jsonTextures = description.get("textures").getAsJsonObject(); + JsonObject jsonGeometry = description.get("geometry").getAsJsonObject(); JsonObject jsonMaterials = description.get("materials").getAsJsonObject(); JsonArray jsonRenderControllers = description.get("render_controllers").getAsJsonArray(); @@ -83,10 +84,22 @@ public class Entity { Map materials = getModelConfig().getTextureMaterials(); materials.forEach(jsonMaterials::addProperty); + if (modelConfig.getPerTextureUvSize().isEmpty()) { + jsonGeometry.addProperty("default", "geometry.meg_" + modelId); + jsonTextures.addProperty("default", "textures/entity/" + path + modelId + "/" + textureMap.keySet().stream().findFirst().orElse("def")); + } for (String name : textureMap.keySet()) { - jsonTextures.addProperty(name,"textures/entity/" + path + modelId + "/" + name); + if (modelConfig.getPerTextureUvSize().containsKey(name)) { + Integer[] size = modelConfig.getPerTextureUvSize().getOrDefault(name, new Integer[]{16, 16}); + String suffix = size[0] + "_" + size[1]; + + jsonGeometry.addProperty("t_" + suffix, "geometry.meg_" + modelId + "_" + suffix); + jsonTextures.addProperty(name, "textures/entity/" + path + modelId + "/" + name); + + } jsonRenderControllers.add("controller.render." + modelId + "_" + name); + } JsonArray animate = description.get("scripts").getAsJsonObject().get("animate").getAsJsonArray(); @@ -108,8 +121,10 @@ public class Entity { if (geometry == null) { return; } - for (int i = 0; i < Math.ceil(geometry.getBones().size() / 24f); i++) { - GeyserUtils.addProperty(id, "modelengine:bone" + i, Integer.class); + if (!modelConfig.isDisablePartVisibility()) { + for (int i = 0; i < Math.ceil(geometry.getBones().size() / 24f); i++) { + GeyserUtils.addProperty(id, "modelengine:bone" + i, Integer.class); + } } if (animation != null) { diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java index c8c6bd5..049ce53 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java @@ -18,6 +18,7 @@ public class Geometry { String modelId; + String geometryId; JsonObject json; Map bones = new HashMap<>(); @@ -26,9 +27,18 @@ public class Geometry { this.json = new JsonParser().parse(json).getAsJsonObject(); } public void setId(String id) { + geometryId = id; getInternal().get("description").getAsJsonObject().addProperty("identifier", id); } + public void setTextureWidth(int w) { + getInternal().get("description").getAsJsonObject().addProperty("texture_width", w); + } + + public void setTextureHeight(int h) { + getInternal().get("description").getAsJsonObject().addProperty("texture_height", h); + } + public JsonObject getInternal() { return json.get("minecraft:geometry").getAsJsonArray().get(0) .getAsJsonObject(); @@ -67,7 +77,7 @@ public class Geometry { } } } - setId("geometry.modelengine_" + modelId); + setId("geometry.meg_" + modelId); } public void addAllChildren(Bone p, Bone c) { diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/ModelConfig.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/ModelConfig.java index d2f0419..fd4dace 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/ModelConfig.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/ModelConfig.java @@ -28,11 +28,19 @@ public class ModelConfig { Map animTextures = new HashMap<>(); @SerializedName("texture_materials") Map textureMaterials = new HashMap<>(); + @SerializedName("per_texture_uv_size") + Map perTextureUvSize; + @SerializedName("disable_part_visibility") + boolean disablePartVisibility; public Map getTextureMaterials() { return textureMaterials != null ? textureMaterials : Map.of(); } + public Map getPerTextureUvSize() { + return perTextureUvSize != null ? perTextureUvSize : Map.of(); + } + @NoArgsConstructor @AllArgsConstructor @Getter diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java index c36e639..0a1565f 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java @@ -27,9 +27,10 @@ public class RenderController { root.add("render_controllers", renderControllers); Set processedBones = new HashSet<>(); + boolean singleTexture = entity.textureMap.size() == 1; for (String key : entity.textureMap.keySet()) { - Texture texture = entity.textureMap.get(key); + // Texture texture = entity.textureMap.get(key); Set uvBonesId = entity.getModelConfig().bingingBones.get(key); ModelConfig.AnimTextureOptions anim = entity.getModelConfig().getAnimTextures().get(key); @@ -37,10 +38,17 @@ public class RenderController { renderControllers.add("controller.render." + modelId + "_" + key, controller); - controller.addProperty("geometry", "Geometry.default"); - + if (!entity.getModelConfig().getPerTextureUvSize().isEmpty()) { + Integer[] size = entity.getModelConfig().getPerTextureUvSize().getOrDefault(key, new Integer[]{16, 16}); + String suffix = "t_" + size[0] + "_" + size[1]; + controller.addProperty("geometry", "Geometry." + suffix); + } else { + controller.addProperty("geometry", "Geometry.default"); + } JsonArray materials = new JsonArray(); String material = entity.getModelConfig().getTextureMaterials().get(key); + + JsonObject materialItem = new JsonObject(); if (material != null) { materialItem.addProperty("*", "Material." + material); @@ -63,7 +71,11 @@ public class RenderController { controller.add("materials", materials); JsonArray textures = new JsonArray(); - textures.add("Texture." + key); + if (singleTexture) { + textures.add("Texture.default"); + } else { + textures.add("Texture." + key); + } controller.add("textures", textures); // if (enable) { @@ -94,9 +106,6 @@ public class RenderController { if (!bones.containsKey(uvBone)) { continue; } - for (Bone child : bones.get(uvBone).allChildren) { - uvAllBones.add(child.getName()); - } uvAllBones.add(uvBone); } @@ -105,15 +114,27 @@ public class RenderController { boneName = originalId.get(boneName); JsonObject visibilityItem = new JsonObject(); Bone bone = bones.get(boneName); + boolean uvParent = false; + for (Bone child : bone.children) { + if (child.getName().startsWith("uv_")) { + if (uvAllBones.contains(child.getName())) { + uvParent = true; + } + } + } - if (!processedBones.contains(bone) && (uvAllBones.contains(boneName) || uvBonesId.contains("*"))) { + if (!processedBones.contains(bone) && (uvParent || uvAllBones.contains(boneName) || uvBonesId.contains("*"))) { int index = i; if (boneName.startsWith("uv_")) { index = sorted.indexOf(bone.parent); } - int n = (int) Math.pow(2, (index % 24)); - visibilityItem.addProperty(boneName, "math.mod(math.floor(query.property('modelengine:bone" + i / 24 + "') / " + n + "), 2) == 1"); + int n = (int) Math.pow(2, (index % 24)); + if (entity.modelConfig.isDisablePartVisibility()) { + visibilityItem.addProperty(boneName, true); + } else { + visibilityItem.addProperty(boneName, "math.mod(math.floor(query.property('modelengine:bone" + index / 24 + "') / " + n + "), 2) == 1"); + } partVisibility.add(visibilityItem); if (!uvBonesId.contains("*")) { processedBones.add(bone); diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java index 7784b6d..8b8ed75 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; +import java.awt.image.BufferedImage; import java.nio.file.Path; import java.util.Set; From 05422934cc391a5633f29fbcf08fd5f2141eef79 Mon Sep 17 00:00:00 2001 From: zimzaza4 <3625282098@qq.com> Date: Sun, 27 Oct 2024 12:33:34 +0800 Subject: [PATCH 6/8] fix per texture uv --- .../re/imc/geysermodelenginepackgenerator/GeneratorMain.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java index 9f11a7c..3ab4e8f 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java @@ -221,7 +221,8 @@ public class GeneratorMain { Integer[] size = modelConfig.getPerTextureUvSize().getOrDefault(name, new Integer[]{16, 16}); String suffix = size[0] + "_" + size[1]; - + entry.getValue().setTextureWidth(size[0]); + entry.getValue().setTextureHeight(size[1]); path = modelsFolder.toPath().resolve(entry.getValue().getPath() + entry.getKey() + "_" + suffix + ".geo.json"); entry.getValue().setId(id + "_" + suffix); From a7174151219fb1af5f2c373afa5e39240a5a56ba Mon Sep 17 00:00:00 2001 From: zimzaza4 <3625282098@qq.com> Date: Sun, 27 Oct 2024 15:17:24 +0800 Subject: [PATCH 7/8] fix case --- .../geysermodelenginepackgenerator/generator/Geometry.java | 2 +- .../generator/RenderController.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java index 049ce53..c7fd0a0 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java @@ -53,7 +53,7 @@ public class Geometry { if (element.isJsonObject()) { String name = element.getAsJsonObject().get("name").getAsString().toLowerCase(Locale.ROOT); - String parent = element.getAsJsonObject().has("parent") ? element.getAsJsonObject().get("parent").getAsString() : null; + String parent = element.getAsJsonObject().has("parent") ? element.getAsJsonObject().get("parent").getAsString().toLowerCase() : null; element.getAsJsonObject().remove("name"); element.getAsJsonObject().addProperty("name", name); diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java index 0a1565f..61fec7e 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java @@ -27,7 +27,7 @@ public class RenderController { root.add("render_controllers", renderControllers); Set processedBones = new HashSet<>(); - boolean singleTexture = entity.textureMap.size() == 1; + boolean singleTexture = entity.textureMap.size() == 1 && entity.modelConfig.getPerTextureUvSize().isEmpty(); for (String key : entity.textureMap.keySet()) { // Texture texture = entity.textureMap.get(key); @@ -103,10 +103,10 @@ public class RenderController { if (uvBone.equals("*")) { uvAllBones.addAll(bones.keySet()); } - if (!bones.containsKey(uvBone)) { + if (!bones.containsKey(uvBone.toLowerCase())) { continue; } - uvAllBones.add(uvBone); + uvAllBones.add(uvBone.toLowerCase()); } From a5679f5d7938a6b26d1f76ccaea1602c04b6d5a1 Mon Sep 17 00:00:00 2001 From: zimzaza4 <3625282098@qq.com> Date: Sun, 27 Oct 2024 18:01:26 +0800 Subject: [PATCH 8/8] fix texture --- .../generator/RenderController.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java index 61fec7e..8077b78 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java @@ -32,6 +32,15 @@ public class RenderController { // Texture texture = entity.textureMap.get(key); Set uvBonesId = entity.getModelConfig().bingingBones.get(key); + + if (uvBonesId == null) { + if (!singleTexture) { + continue; + } else { + uvBonesId = new HashSet<>(); + uvBonesId.add("*"); + } + } ModelConfig.AnimTextureOptions anim = entity.getModelConfig().getAnimTextures().get(key); JsonObject controller = new JsonObject();