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();