Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public static JsonObject generate(JsonArray animationRaw) {
List<Map.Entry<Double, JsonObject>> scale = new ArrayList<>();

JsonArray keyframes = animator.getJsonArray("keyframes");
if (keyframes == null) continue;

for (int k = 0; k < keyframes.size(); k++) {
JsonObject keyframe = keyframes.getJsonObject(k);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
import java.util.*;

public class GeoGenerator {
private static List<JsonObject> parseRecursive(JsonObject obj, Map<String, JsonObject> cubeMap, Map<String, JsonObject> locators, Map<String, JsonObject> nullObjects, String parent) {
private static List<JsonObject> parseRecursive(JsonObject obj, Map<String, JsonObject> cubeMap, Map<String, JsonObject> locators, Map<String, JsonObject> nullObjects, Map<String, String> groupUuidToName, String parent) {
List<JsonObject> res = new ArrayList<>();
float scale = 0.25f;

String name = getOutlinerName(obj);
String name = getOutlinerName(obj, groupUuidToName);
JsonArray pivot = obj.getJsonArray("origin");
if (pivot == null) {
pivot = Json.createArrayBuilder().add(0).add(0).add(0).build();
Expand Down Expand Up @@ -40,7 +40,7 @@ private static List<JsonObject> parseRecursive(JsonObject obj, Map<String, JsonO

for (JsonValue child : children) {
if (child.getValueType() == JsonValue.ValueType.OBJECT) {
res.addAll(parseRecursive(child.asJsonObject(), cubeMap, locators, nullObjects, name));
res.addAll(parseRecursive(child.asJsonObject(), cubeMap, locators, nullObjects, groupUuidToName, name));
} else if (child.getValueType() == JsonValue.ValueType.STRING) {
JsonObject cube = cubeMap.get(child.toString());
if (cube == null) continue;
Expand All @@ -64,17 +64,47 @@ private static List<JsonObject> parseRecursive(JsonObject obj, Map<String, JsonO
return res;
}

private static String getOutlinerName(JsonObject obj) {
private static String getOutlinerName(JsonObject obj, Map<String, String> groupUuidToName) {
JsonString name = obj.getJsonString("name");
if (name != null) return name.getString();

JsonString uuid = obj.getJsonString("uuid");
if (uuid != null) return uuid.getString();
if (uuid != null) {
String id = uuid.getString();
String mapped = groupUuidToName.get(id);
if (mapped != null) return mapped;
return id;
}

return "bone_" + Integer.toUnsignedString(obj.hashCode());
}

public static JsonArray generate(JsonArray elements, JsonArray outliner, Map<String, TextureGenerator.TextureData> textures) {
/** Maps Blockbench group UUID strings to human-readable bone names when outliner nodes omit {@code name}. */
static Map<String, String> collectGroupUuidToName(JsonArray groups) {
Map<String, String> map = new HashMap<>();
if (groups == null) return map;
for (JsonValue v : groups) {
if (v.getValueType() != JsonValue.ValueType.OBJECT) continue;
collectGroupUuidToNameRecursive(v.asJsonObject(), map);
}
return map;
}

private static void collectGroupUuidToNameRecursive(JsonObject group, Map<String, String> out) {
JsonString uuid = group.getJsonString("uuid");
JsonString name = group.getJsonString("name");
if (uuid != null && name != null) {
out.putIfAbsent(uuid.getString(), name.getString());
}
JsonArray children = group.getJsonArray("children");
if (children == null) return;
for (JsonValue c : children) {
if (c.getValueType() != JsonValue.ValueType.OBJECT) continue;
collectGroupUuidToNameRecursive(c.asJsonObject(), out);
}
}

public static JsonArray generate(JsonArray elements, JsonArray outliner, Map<String, TextureGenerator.TextureData> textures, Map<String, String> groupUuidToName) {
Map<String, JsonObject> blocks = new HashMap<>();
Map<String, JsonObject> locators = new HashMap<>();
Map<String, JsonObject> nullObjects = new HashMap<>();
Expand All @@ -100,7 +130,7 @@ public static JsonArray generate(JsonArray elements, JsonArray outliner, Map<Str
for (var outline : outliner) {
if (outline instanceof JsonObject) {
JsonObject el = outline.asJsonObject();
bonesList.addAll(parseRecursive(el, blocks, locators, nullObjects, null));
bonesList.addAll(parseRecursive(el, blocks, locators, nullObjects, groupUuidToName, null));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ public static BBEntityModel generate(PackBuilder.Model modelObj) {
}

Map<String, TextureGenerator.TextureData> textures = TextureGenerator.generate(model.getJsonArray("textures"), mcmetas, width, height);
JsonArray bones = GeoGenerator.generate(model.getJsonArray("elements"), model.getJsonArray("outliner"), textures);
var groupUuidToName = GeoGenerator.collectGroupUuidToName(model.getJsonArray("groups"));
JsonArray bones = GeoGenerator.generate(model.getJsonArray("elements"), model.getJsonArray("outliner"), textures, groupUuidToName);

JsonObject description = Json.createObjectBuilder()
.add("identifier", "geometry.unknown")
Expand Down