Skip to content

Commit 032718c

Browse files
committed
Update v3.0.6.3
2 parents 4212989 + d9cfbdb commit 032718c

File tree

14 files changed

+378
-343
lines changed

14 files changed

+378
-343
lines changed

xivModdingFramework/Cache/XivCache.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public static class XivCache
7777
private static GameInfo _gameInfo;
7878
private static DirectoryInfo _dbPath;
7979
private static DirectoryInfo _rootCachePath;
80-
public static readonly Version CacheVersion = new Version("1.0.3.4");
80+
public static readonly Version CacheVersion = new Version("1.0.3.5");
8181
private const string dbFileName = "mod_cache.db";
8282
private const string rootCacheFileName = "item_sets.db";
8383
private const string creationScript = "CreateCacheDB.sql";

xivModdingFramework/Helpers/IOUtil.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,23 @@ public static async Task UnzipFiles(string zipLocation, string destination, IEn
668668
var toUnzip = zip.Entries.Where(x => ReplaceSlashes(x.FileName).ToLower() == taskFile);
669669
foreach (var e in toUnzip)
670670
{
671-
e.Extract(destination, Ionic.Zip.ExtractExistingFileAction.OverwriteSilently);
671+
var pathSafe = IOUtil.MakePathSafe(Path.GetFileName(e.FileName), false);
672+
var def = Path.GetFileName(e.FileName);
673+
var illegal = def != pathSafe;
674+
if (illegal)
675+
{
676+
try
677+
{
678+
e.Extract(destination, Ionic.Zip.ExtractExistingFileAction.OverwriteSilently);
679+
}
680+
catch(Exception ex)
681+
{
682+
Trace.WriteLine(ex);
683+
}
684+
} else
685+
{
686+
e.Extract(destination, Ionic.Zip.ExtractExistingFileAction.OverwriteSilently);
687+
}
672688
}
673689
}
674690
}));

xivModdingFramework/Models/DataContainers/TTModel.cs

Lines changed: 141 additions & 142 deletions
Large diffs are not rendered by default.

xivModdingFramework/Models/DataContainers/VertexData.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public class VertexData
9494
/// The secondary texture coordinates for the mesh in Vector2 format (X, Y)
9595
/// </summary>
9696
public Vector2Collection TextureCoordinates1 { get; set; } = new Vector2Collection();
97+
public Vector2Collection TextureCoordinates2 { get; set; } = new Vector2Collection();
9798

9899
/// <summary>
99100
/// The index data for the mesh

xivModdingFramework/Models/FileTypes/Mdl.cs

Lines changed: 117 additions & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
using SixLabors.ImageSharp.Formats;
6363
using Image = SixLabors.ImageSharp.Image;
6464
using System.Diagnostics.CodeAnalysis;
65+
using HelixToolkit.SharpDX.Core.Animations;
6566

6667
namespace xivModdingFramework.Models.FileTypes
6768
{
@@ -2376,6 +2377,16 @@ public static async Task<byte[]> MakeUncompressedMdlFile(TTModel model, string t
23762377
// but vertex buffers larger than 2^23 will overflow and wrap around in game.
23772378
public const int _MaxVertexBufferSize = 8388608;
23782379

2380+
private static void AddVertexHeader(List<VertexDataStruct> source, VertexDataStruct newData)
2381+
{
2382+
var elem = source.FirstOrDefault(x => x.DataUsage == newData.DataUsage && x.Count == newData.Count);
2383+
if (elem != null)
2384+
{
2385+
elem.DataType = newData.DataType;
2386+
}
2387+
2388+
source.Add(newData);
2389+
}
23792390

23802391
/// <summary>
23812392
/// Creates a new Uncompressed MDL file from the given information.
@@ -2421,9 +2432,15 @@ public static byte[] MakeUncompressedMdlFile(TTModel ttModel, XivMdl ogMdl, Acti
24212432
{
24222433
vertexSize += 8;
24232434
}
2424-
if (usageInfo.UsesUv2)
2435+
if (usageInfo.MaxUv > 1)
24252436
{
2426-
vertexSize += 8;
2437+
if (usageInfo.MaxUv == 2)
2438+
{
2439+
vertexSize += 8;
2440+
} else if(usageInfo.MaxUv >= 3)
2441+
{
2442+
vertexSize += 16;
2443+
}
24272444
}
24282445
if (usageInfo.UsesVColor2)
24292446
{
@@ -2506,181 +2523,115 @@ public static byte[] MakeUncompressedMdlFile(TTModel ttModel, XivMdl ogMdl, Acti
25062523
var ttMeshGroup = ttModel.MeshGroups.Count > meshNum ? ttModel.MeshGroups[meshNum] : null;
25072524

25082525

2509-
List<VertexDataStruct> source;
2510-
if (ogGroup == null)
2526+
// Vertex Header Writing
2527+
List<VertexDataStruct> source = new List<VertexDataStruct>();
2528+
2529+
// Standard elements
2530+
AddVertexHeader(source, new VertexDataStruct()
25112531
{
2512-
// New Group, copy data over.
2513-
source = lod.MeshDataList[0].VertexDataStructList;
2514-
}
2515-
else
2532+
DataBlock = 0,
2533+
DataType = upgradePrecision ? VertexDataType.Float3 : VertexDataType.Half4,
2534+
DataUsage = VertexUsageType.Position,
2535+
});
2536+
2537+
if (ttModel.HasWeights)
25162538
{
2517-
source = ogGroup.VertexDataStructList;
2539+
AddVertexHeader(source, new VertexDataStruct()
2540+
{
2541+
DataBlock = 0,
2542+
DataType = usageInfo.NeedsEightWeights ? VertexDataType.UByte8 : VertexDataType.Ubyte4n,
2543+
DataUsage = VertexUsageType.BoneWeight
2544+
});
2545+
AddVertexHeader(source, new VertexDataStruct()
2546+
{
2547+
DataBlock = 0,
2548+
DataType = usageInfo.NeedsEightWeights ? VertexDataType.UByte8 : VertexDataType.Ubyte4,
2549+
DataUsage = VertexUsageType.BoneIndex
2550+
});
25182551
}
25192552

2520-
// Vertex Header Writing
2521-
var runningOffsets = new List<int>() { 0, 0, 0 };
2522-
source.OrderBy(x => (x.DataBlock * -1000) + x.DataOffset);
2523-
vertexStreamCounts.Add(source.Max(x => x.DataBlock) + 1);
2553+
AddVertexHeader(source, new VertexDataStruct()
2554+
{
2555+
DataBlock = 1,
2556+
DataType = upgradePrecision ? VertexDataType.Float3 : VertexDataType.Half4,
2557+
DataUsage = VertexUsageType.Normal
2558+
});
25242559

2525-
if(upgradePrecision)
2560+
AddVertexHeader(source, new VertexDataStruct()
25262561
{
2527-
// Add precomputed tangent data.
2528-
var tangentCount = source.Count(x => x.DataUsage == VertexUsageType.Tangent);
2529-
var binormalIdx = source.FindIndex(x => x.DataUsage == VertexUsageType.Binormal);
2530-
if(binormalIdx >= 0 && tangentCount <= 0 && false)
2531-
{
2532-
// Goes in after Binormal
2533-
source.Insert(binormalIdx + 1, new VertexDataStruct()
2534-
{
2535-
DataBlock = 1,
2536-
DataOffset = 0, // Offset doesn't matter since we recalculate it anyways.
2537-
DataType = VertexDataType.Ubyte4n,
2538-
DataUsage = VertexUsageType.Tangent
2539-
});
2540-
}
2541-
} else
2562+
DataBlock = 1,
2563+
DataType = VertexDataType.Ubyte4n,
2564+
DataUsage = VertexUsageType.Binormal
2565+
});
2566+
2567+
// Optional/Situational Elements
2568+
if (upgradePrecision)
25422569
{
2543-
source.RemoveAll(x => x.DataUsage == VertexUsageType.Tangent);
2570+
AddVertexHeader(source, new VertexDataStruct()
2571+
{
2572+
DataBlock = 1,
2573+
DataType = VertexDataType.Ubyte4n,
2574+
DataUsage = VertexUsageType.Tangent
2575+
});
25442576
}
25452577

2578+
AddVertexHeader(source, new VertexDataStruct()
2579+
{
2580+
DataBlock = 1,
2581+
DataType = VertexDataType.Ubyte4n,
2582+
DataUsage = VertexUsageType.Color
2583+
});
2584+
25462585
if (usageInfo.UsesVColor2)
25472586
{
2548-
// Add 2nd color channel for faux-wind simulation.
2549-
var colorCounts = source.Count(x => x.DataUsage == VertexUsageType.Color);
2550-
var colorIdx = source.FindIndex(x => x.DataUsage == VertexUsageType.Color);
2551-
if (colorCounts == 1)
2587+
AddVertexHeader(source, new VertexDataStruct()
25522588
{
2553-
source.Insert(colorIdx + 1, new VertexDataStruct()
2554-
{
2555-
DataBlock = 1,
2556-
DataOffset = 0, // Offset doesn't matter since we recalculate it anyways.
2557-
DataType = VertexDataType.Ubyte4n,
2558-
DataUsage = VertexUsageType.Color
2559-
});
2560-
}
2561-
} else
2562-
{
2563-
source.RemoveAll(x => x.DataUsage == VertexUsageType.Color && x.Count == 1);
2589+
DataBlock = 1,
2590+
DataType = VertexDataType.Ubyte4n,
2591+
DataUsage = VertexUsageType.Color,
2592+
Count = 1
2593+
});
25642594
}
25652595

2566-
if (ttModel.HasWeights)
2596+
if (usageInfo.MaxUv == 1)
25672597
{
2568-
// Ensure we have bone vertex structs if we need them.
2569-
var bone = source.FirstOrDefault(x => x.DataUsage == VertexUsageType.BoneWeight);
2570-
if (bone == null)
2598+
AddVertexHeader(source, new VertexDataStruct()
25712599
{
2572-
source.Add(new VertexDataStruct()
2573-
{
2574-
DataBlock = 0,
2575-
DataOffset = 0,
2576-
DataType = VertexDataType.Ubyte4,
2577-
DataUsage = VertexUsageType.BoneWeight
2578-
});
2579-
}
2580-
bone = source.FirstOrDefault(x => x.DataUsage == VertexUsageType.BoneIndex);
2581-
if (bone == null)
2582-
{
2583-
source.Add(new VertexDataStruct()
2584-
{
2585-
DataBlock = 0,
2586-
DataOffset = 0,
2587-
DataType = VertexDataType.Ubyte4,
2588-
DataUsage = VertexUsageType.BoneIndex
2589-
});
2590-
}
2600+
DataBlock = 1,
2601+
DataType = upgradePrecision ? VertexDataType.Float2 : VertexDataType.Half2,
2602+
DataUsage = VertexUsageType.TextureCoordinate,
2603+
});
25912604
} else
25922605
{
2593-
// Remove bone vertex structs if they're not used.
2594-
source.RemoveAll(x => x.DataUsage == VertexUsageType.BoneWeight);
2595-
source.RemoveAll(x => x.DataUsage == VertexUsageType.BoneIndex);
2606+
AddVertexHeader(source, new VertexDataStruct()
2607+
{
2608+
DataBlock = 1,
2609+
DataType = upgradePrecision ? VertexDataType.Float4 : VertexDataType.Half4,
2610+
DataUsage = VertexUsageType.TextureCoordinate,
2611+
});
2612+
}
2613+
2614+
if (usageInfo.MaxUv > 2)
2615+
{
2616+
AddVertexHeader(source, new VertexDataStruct()
2617+
{
2618+
DataBlock = 1,
2619+
DataType = upgradePrecision ? VertexDataType.Float2 : VertexDataType.Half2,
2620+
DataUsage = VertexUsageType.TextureCoordinate,
2621+
Count = 1
2622+
});
25962623
}
25972624

2625+
var runningOffsets = new List<int>() { 0, 0, 0 };
2626+
vertexStreamCounts.Add(source.Max(x => x.DataBlock) + 1);
2627+
25982628
foreach (var vds in source)
25992629
{
26002630
var dataBlock = vds.DataBlock;
26012631
var dataOffset = vds.DataOffset;
26022632
var dataType = vds.DataType;
26032633
var dataUsage = vds.DataUsage;
2604-
2605-
// Model version 5 doesn't allow double color channel information.
2606-
if (vdsDictionary.ContainsKey(dataUsage) && mdlVersion == 5)
2607-
{
2608-
continue;
2609-
}
2610-
2611-
// Perform precision updates if requested, and adjustments for MDL version.
2612-
if (dataUsage == VertexUsageType.Position)
2613-
{
2614-
if (upgradePrecision)
2615-
{
2616-
dataType = VertexDataType.Float3;
2617-
}
2618-
else
2619-
{
2620-
dataType = VertexDataType.Half4;
2621-
}
2622-
}
2623-
2624-
if (dataUsage == VertexUsageType.BoneWeight)
2625-
{
2626-
if (usageInfo.NeedsEightWeights)
2627-
{
2628-
dataType = VertexDataType.UByte8;
2629-
}
2630-
else
2631-
{
2632-
dataType = VertexDataType.Ubyte4n;
2633-
}
2634-
}
2635-
2636-
if (dataUsage == VertexUsageType.BoneIndex)
2637-
{
2638-
if (usageInfo.NeedsEightWeights)
2639-
{
2640-
dataType = VertexDataType.UByte8;
2641-
}
2642-
else
2643-
{
2644-
dataType = VertexDataType.Ubyte4;
2645-
}
2646-
}
2647-
2648-
if (dataUsage == VertexUsageType.Normal)
2649-
{
2650-
if (upgradePrecision)
2651-
{
2652-
dataType = VertexDataType.Float3;
2653-
}
2654-
else
2655-
{
2656-
dataType = VertexDataType.Half4;
2657-
}
2658-
}
2659-
2660-
if (dataUsage == VertexUsageType.TextureCoordinate)
2661-
{
2662-
if (upgradePrecision)
2663-
{
2664-
if (usageInfo.UsesUv2)
2665-
{
2666-
dataType = VertexDataType.Float4;
2667-
}
2668-
else
2669-
{
2670-
dataType = VertexDataType.Float2;
2671-
}
2672-
}
2673-
else
2674-
{
2675-
if (usageInfo.UsesUv2)
2676-
{
2677-
dataType = VertexDataType.Half4;
2678-
} else
2679-
{
2680-
dataType = VertexDataType.Half2;
2681-
}
2682-
}
2683-
}
2634+
var ct = vds.Count;
26842635

26852636
var count = 0;
26862637
if (!vdsDictionary.ContainsKey(dataUsage))
@@ -4106,6 +4057,21 @@ private static int WriteVertex(VertexByteData importData, Dictionary<VertexUsage
41064057
}
41074058
}
41084059
}
4060+
if(vertexInfoList.ContainsKey(VertexUsageType.TextureCoordinate) && vertexInfoList[VertexUsageType.TextureCoordinate].Count > 1)
4061+
{
4062+
var texCoordDataType = vertexInfoList[VertexUsageType.TextureCoordinate][1];
4063+
if (texCoordDataType == VertexDataType.Float2)
4064+
{
4065+
importData.VertexData1.AddRange(BitConverter.GetBytes(v.UV3[0]));
4066+
importData.VertexData1.AddRange(BitConverter.GetBytes(v.UV3[1]));
4067+
4068+
}
4069+
else if (texCoordDataType == VertexDataType.Half2)
4070+
{
4071+
importData.VertexData1.AddRange(BitConverter.GetBytes(((Half)v.UV3[0]).RawValue));
4072+
importData.VertexData1.AddRange(BitConverter.GetBytes(((Half)v.UV3[1]).RawValue));
4073+
}
4074+
}
41094075

41104076

41114077
var size0 = importData.VertexData0.Count - start0;

xivModdingFramework/Models/FileTypes/MdlVertexReader.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,15 @@ public static void ReadData(VertexData data, BinaryReader br, VertexUsageType us
7373
if(usage == VertexUsageType.TextureCoordinate)
7474
{
7575
var r = ReadDoubleVector(br, type);
76-
data.TextureCoordinates0.Add(r.Vec0);
77-
data.TextureCoordinates1.Add(r.Vec1);
76+
if (count == 0)
77+
{
78+
data.TextureCoordinates0.Add(r.Vec0);
79+
data.TextureCoordinates1.Add(r.Vec1);
80+
}
81+
else
82+
{
83+
data.TextureCoordinates2.Add(r.Vec0);
84+
}
7885
} else if(usage == VertexUsageType.Binormal)
7986
{
8087
var r = ReadByteVector(br, type);

0 commit comments

Comments
 (0)