Skip to content

Commit 2b0eeb7

Browse files
committed
more edge case handlings
1 parent bf86445 commit 2b0eeb7

File tree

3 files changed

+88
-54
lines changed

3 files changed

+88
-54
lines changed

DenizenModelsConverter/BBModelReader.cs

Lines changed: 65 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,29 @@ public static BBModel Interpret(string fileContent)
121121
}
122122
if (outliners is not null)
123123
{
124+
BBModel.Outliner rootOutline = null;
124125
Debug("contains outliners");
125-
foreach (JObject jOutliner in outliners)
126+
foreach (JToken jOutliner in outliners)
126127
{
127-
ReadOutliner(result, jOutliner, outlineNames);
128+
if (jOutliner.Type == JTokenType.String)
129+
{
130+
if (rootOutline is null)
131+
{
132+
rootOutline = new()
133+
{
134+
Name = "__root__",
135+
Origin = new DoubleVector(),
136+
Rotation = new DoubleVector(),
137+
UUID = Guid.NewGuid()
138+
};
139+
result.Outlines.Add(rootOutline);
140+
}
141+
AddOutlineChild(result, rootOutline, jOutliner, outlineNames);
142+
}
143+
else
144+
{
145+
ReadOutliner(result, (JObject)jOutliner, outlineNames);
146+
}
128147
}
129148
}
130149
if (animations is not null)
@@ -176,6 +195,48 @@ public static BBModel Interpret(string fileContent)
176195

177196
public static HashSet<double> AcceptableRotations = new() { 0, 22.5, 45, -22.5, -45 };
178197

198+
public static void AddOutlineChild(BBModel model, BBModel.Outliner outline, JToken child, Dictionary<string, int> names)
199+
{
200+
if (child.Type == JTokenType.String)
201+
{
202+
Guid id = Guid.Parse((string)child);
203+
BBModel.Element element = model.GetElement(id);
204+
if (element is null)
205+
{
206+
if (model.DiscardedIDs.Contains(id))
207+
{
208+
return;
209+
}
210+
throw new Exception($"Cannot find required element {id} for outline {outline.Name}");
211+
}
212+
if (AcceptableRotations.Contains(element.Rotation.X) && AcceptableRotations.Contains(element.Rotation.Y) && AcceptableRotations.Contains(element.Rotation.Z))
213+
{
214+
outline.Children.Add(id);
215+
}
216+
else
217+
{
218+
BBModel.Outliner specialSideOutline = new()
219+
{
220+
Name = $"{outline.Name}_auto_{element.Name}",
221+
Origin = element.Origin,
222+
Rotation = element.Rotation,
223+
UUID = Guid.NewGuid(),
224+
};
225+
element.Rotation = new DoubleVector();
226+
element.Origin = new DoubleVector();
227+
specialSideOutline.Children.Add(element.UUID);
228+
model.Outlines.Add(specialSideOutline);
229+
outline.Paired.Add(specialSideOutline.UUID);
230+
}
231+
}
232+
else
233+
{
234+
BBModel.Outliner subLine = ReadOutliner(model, (JObject)child, names);
235+
outline.Paired.Add(subLine.UUID);
236+
outline.Paired.AddRange(subLine.Paired);
237+
}
238+
}
239+
179240
public static BBModel.Outliner ReadOutliner(BBModel model, JObject jOutliner, Dictionary<string, int> names)
180241
{
181242
string name = (string)jOutliner.GetRequired("name");
@@ -194,47 +255,7 @@ public static BBModel.Outliner ReadOutliner(BBModel model, JObject jOutliner, Di
194255
};
195256
foreach (JToken child in (JArray)jOutliner.GetRequired("children"))
196257
{
197-
if (child.Type == JTokenType.String)
198-
{
199-
Guid id = Guid.Parse((string)child);
200-
BBModel.Element element = model.GetElement(id);
201-
if (element is null)
202-
{
203-
if (model.DiscardedIDs.Contains(id))
204-
{
205-
continue;
206-
}
207-
throw new Exception($"Cannot find required element {id} for outline {outline.Name}");
208-
}
209-
if (AcceptableRotations.Contains(element.Rotation.X) && AcceptableRotations.Contains(element.Rotation.Y) && AcceptableRotations.Contains(element.Rotation.Z))
210-
{
211-
outline.Children.Add(id);
212-
}
213-
else
214-
{
215-
BBModel.Outliner specialSideOutline = new()
216-
{
217-
Name = $"{outline.Name}_auto_{element.Name}",
218-
Origin = outline.Origin + element.Origin,
219-
Rotation = element.Rotation,
220-
UUID = Guid.NewGuid(),
221-
};
222-
// TODO: Is this shift needed?
223-
//element.From -= element.Origin;
224-
//element.To -= element.Origin;
225-
element.Rotation = new DoubleVector();
226-
element.Origin = new DoubleVector();
227-
specialSideOutline.Children.Add(element.UUID);
228-
model.Outlines.Add(specialSideOutline);
229-
outline.Paired.Add(specialSideOutline.UUID);
230-
}
231-
}
232-
else
233-
{
234-
BBModel.Outliner subLine = ReadOutliner(model, (JObject) child, names);
235-
outline.Paired.Add(subLine.UUID);
236-
outline.Paired.AddRange(subLine.Paired);
237-
}
258+
AddOutlineChild(model, outline, child, names);
238259
}
239260
Debug($"Read outliner {outline.Name}");
240261
model.Outlines.Add(outline);
@@ -250,7 +271,7 @@ public static DoubleVector ParseDVecFromObj(JToken jVal)
250271
public static DoubleVector ParseDVecFromArr(JToken jVal)
251272
{
252273
JArray jArr = (JArray)jVal;
253-
return new DoubleVector((int)jArr[0], (int)jArr[1], (int)jArr[2]);
274+
return new DoubleVector((double)jArr[0], (double)jArr[1], (double)jArr[2]);
254275
}
255276

256277
public static BBModel.Element.Face ParseFaceFromJson(JToken jVal)

DenizenModelsConverter/MinecraftModelMaker.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class MinecraftModelMaker
1414
{
1515
public static string CreateModelFor(BBModel model, BBModel.Outliner outline)
1616
{
17-
JObject jout = new(), textures = new(), group = new();
17+
JObject jout = new(), textures = new(), group = new(), display = new(), head = new();
1818
JArray groups = new(), elements = new();
1919
JArray childrenList = new();
2020
foreach (BBModel.Texture texture in model.Textures)
@@ -75,9 +75,12 @@ public static string CreateModelFor(BBModel model, BBModel.Outliner outline)
7575
group.Add("color", 0);
7676
group.Add("children", childrenList);
7777
groups.Add(group);
78+
head.Add("translation", new JArray(8, 2, 8));
79+
display.Add("head", head);
7880
jout.Add("textures", textures);
7981
jout.Add("elements", elements);
8082
jout.Add("groups", groups);
83+
jout.Add("display", display);
8184
return jout.ToString();
8285
}
8386

DenizenModelsConverter/PackMaker.cs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,15 @@ public static void BuildPack(string rawModelPath, BBModel model, string item, st
6060
JObject itemOverride = JObject.Parse(itemFile);
6161
JArray overrides = itemOverride.ContainsKey("overrides") ? (JArray)itemOverride.GetRequired("overrides") : new JArray();
6262
int min = 1000;
63+
Dictionary<string, int> existingCmd = new();
6364
foreach (JObject obj in overrides)
6465
{
66+
string modelName = (string)obj.GetRequired("model");
6567
JObject predicate = obj.GetRequired("predicate") as JObject;
6668
if (predicate.ContainsKey("custom_model_data"))
6769
{
6870
int cmd = (int)predicate.GetRequired("custom_model_data");
71+
existingCmd[modelName] = cmd;
6972
if (cmd >= min)
7073
{
7174
min = cmd + 1;
@@ -76,7 +79,6 @@ public static void BuildPack(string rawModelPath, BBModel model, string item, st
7679
JObject modelSet = new();
7780
foreach (BBModel.Outliner outline in model.Outlines)
7881
{
79-
Debug($"Creating model for {modelPath}/{outline.Name} as {item}[custom_model_data={min}]");
8082
string modelText = MinecraftModelMaker.CreateModelFor(model, outline);
8183
if (modelText is null)
8284
{
@@ -87,20 +89,28 @@ public static void BuildPack(string rawModelPath, BBModel model, string item, st
8789
modelSet.Add(outline.UUID.ToString(), skippedEntry);
8890
continue;
8991
}
92+
string modelName = $"{modelPath}/{outline.Name}";
93+
bool reused = existingCmd.TryGetValue(modelName, out int id);
94+
if (!reused)
95+
{
96+
Debug($"Adding new custom_model_data for {modelName} as {min}");
97+
id = min++;
98+
JObject overrideEntry = new();
99+
overrideEntry.Add("model", $"{modelPath}/{outline.Name}");
100+
JObject predicate = new();
101+
predicate.Add("custom_model_data", id);
102+
overrideEntry.Add("predicate", predicate);
103+
overrides.Add(overrideEntry);
104+
}
105+
Debug($"Creating model for {modelName} as {item}[custom_model_data={id}]");
90106
File.WriteAllText($"{fullModelPath}/{outline.Name}.json", modelText);
91-
JObject overrideEntry = new();
92-
overrideEntry.Add("model", $"{modelPath}/{outline.Name}");
93-
JObject predicate = new();
94-
predicate.Add("custom_model_data", min);
95-
overrideEntry.Add("predicate", predicate);
96-
overrides.Add(overrideEntry);
97107
JObject modelEntry = new();
98108
modelEntry.Add("name", outline.Name);
99-
modelEntry.Add("item", $"{item}[custom_model_data={min}]");
109+
modelEntry.Add("item", $"{item}[custom_model_data={id}]");
100110
modelEntry.Add("origin", outline.Origin.ToDenizenString());
111+
modelEntry.Add("rotation", outline.Rotation.ToDenizenString());
101112
modelEntry.Add("pairs", new JArray(outline.Paired.Select(p => p.ToString()).ToArray()));
102113
modelSet.Add(outline.UUID.ToString(), modelEntry);
103-
min++;
104114
}
105115
Debug("Models done. Outputting new item override...");
106116
itemOverride.Remove("overrides");

0 commit comments

Comments
 (0)