Skip to content

Commit c7c0360

Browse files
committed
Fixes for TT display errors in cases where meshes had null materials declared/improper material counts. (Ex. Au Ra Male Face #93)
1 parent a0729a7 commit c7c0360

File tree

1 file changed

+28
-5
lines changed
  • xivModdingFramework/Models/FileTypes

1 file changed

+28
-5
lines changed

xivModdingFramework/Models/FileTypes/Mdl.cs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ public async Task<XivMdl> GetMdlData(IItemModel itemModel, XivRace xivRace, XivM
103103
var mdlData = await dat.GetType3Data(offset, _dataFile);
104104

105105
var xivMdl = new XivMdl {MdlPath = mdlPath};
106+
int totalNonNullMaterials = 0;
106107

107108
using (var br = new BinaryReader(new MemoryStream(mdlData.Data)))
108109
{
@@ -209,10 +210,18 @@ public async Task<XivMdl> GetMdlData(IItemModel itemModel, XivRace xivRace, XivM
209210
}
210211

211212
var mat = Encoding.ASCII.GetString(materialName.ToArray()).Replace("\0", "");
212-
213-
mdlPathData.MaterialList.Add(mat);
213+
if(mat.StartsWith("shp_"))
214+
{
215+
// Catch case for situation where there's null values at the end of the materials list.
216+
mdlPathData.ShapeList.Add(mat);
217+
} else
218+
{
219+
totalNonNullMaterials++;
220+
mdlPathData.MaterialList.Add(mat);
221+
}
214222
}
215223

224+
216225
// Shape Paths
217226
for (var i = 0; i < mdlModelData.ShapeCount; i++)
218227
{
@@ -425,12 +434,26 @@ public async Task<XivMdl> GetMdlData(IItemModel itemModel, XivRace xivRace, XivM
425434

426435
lod.MeshDataList[i].MeshInfo = meshDataInfo;
427436

437+
// In the event we have a null material reference, set it to material 0 to be safe.
438+
if(meshDataInfo.MaterialIndex >= totalNonNullMaterials)
439+
{
440+
meshDataInfo.MaterialIndex = 0;
441+
}
442+
428443
var materialString = xivMdl.PathData.MaterialList[meshDataInfo.MaterialIndex];
429-
var typeChar = materialString[4].ToString() + materialString[9].ToString();
444+
// Try block to cover odd cases like Au Ra Male Face #92 where for some reason the
445+
// Last LoD points to using a shp for a material for some reason.
446+
try
447+
{
448+
var typeChar = materialString[4].ToString() + materialString[9].ToString();
430449

431-
if (typeChar.Equals("cb"))
450+
if (typeChar.Equals("cb"))
451+
{
452+
lod.MeshDataList[i].IsBody = true;
453+
}
454+
} catch(Exception e)
432455
{
433-
lod.MeshDataList[i].IsBody = true;
456+
434457
}
435458

436459
meshNum++;

0 commit comments

Comments
 (0)