mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 18:27:24 +01:00
blech
This commit is contained in:
parent
f9b5a626cf
commit
f03a139e0e
1 changed files with 77 additions and 59 deletions
|
|
@ -1,17 +1,18 @@
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
using OtterGui.Classes;
|
using OtterGui.Classes;
|
||||||
using OtterGui.Services;
|
using OtterGui.Services;
|
||||||
using Penumbra.Api.Enums;
|
using Penumbra.Api.Enums;
|
||||||
using Penumbra.GameData.Data;
|
using Penumbra.GameData.Data;
|
||||||
using Penumbra.GameData.Files;
|
using Penumbra.GameData.Files;
|
||||||
using Penumbra.GameData.Files.MaterialStructs;
|
using Penumbra.GameData.Files.MaterialStructs;
|
||||||
using Penumbra.GameData.Structs;
|
using Penumbra.GameData.Structs;
|
||||||
using Penumbra.Import.Textures;
|
using Penumbra.Import.Textures;
|
||||||
using Penumbra.Mods;
|
using Penumbra.Mods;
|
||||||
using Penumbra.Mods.SubMods;
|
using Penumbra.Mods.SubMods;
|
||||||
|
using Penumbra.String.Classes;
|
||||||
namespace Penumbra.Services;
|
|
||||||
|
namespace Penumbra.Services;
|
||||||
|
|
||||||
public class ModMigrator(IDataManager gameData, TextureManager textures) : IService
|
public class ModMigrator(IDataManager gameData, TextureManager textures) : IService
|
||||||
{
|
{
|
||||||
private sealed class FileDataDict : MultiDictionary<string, (string GamePath, IModDataContainer Container)>;
|
private sealed class FileDataDict : MultiDictionary<string, (string GamePath, IModDataContainer Container)>;
|
||||||
|
|
@ -175,6 +176,7 @@ public class ModMigrator(IDataManager gameData, TextureManager textures) : IServ
|
||||||
|
|
||||||
public enum TextureUsage
|
public enum TextureUsage
|
||||||
{
|
{
|
||||||
|
Unknown,
|
||||||
Normal,
|
Normal,
|
||||||
Index,
|
Index,
|
||||||
Mask,
|
Mask,
|
||||||
|
|
@ -191,51 +193,44 @@ public class ModMigrator(IDataManager gameData, TextureManager textures) : IServ
|
||||||
if (data.FileExists(newPath))
|
if (data.FileExists(newPath))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
switch (usage)
|
ReadOnlySpan<(string, string)> pairs = usage switch
|
||||||
{
|
{
|
||||||
case TextureUsage.Normal:
|
TextureUsage.Unknown =>
|
||||||
newPath = path.Replace("_n.tex", "_norm.tex");
|
[
|
||||||
if (data.FileExists(newPath))
|
("_n.tex", "_norm.tex"),
|
||||||
return true;
|
("_m.tex", "_mult.tex"),
|
||||||
|
("_m.tex", "_mask.tex"),
|
||||||
newPath = path.Replace("_n_", "_norm_");
|
("_d.tex", "_base.tex"),
|
||||||
if (data.FileExists(newPath))
|
],
|
||||||
return true;
|
TextureUsage.Normal =>
|
||||||
|
[
|
||||||
return false;
|
("_n_", "_norm_"),
|
||||||
case TextureUsage.Index: return false;
|
("_n.tex", "_norm.tex"),
|
||||||
case TextureUsage.Mask:
|
],
|
||||||
newPath = path.Replace("_m.tex", "_mult.tex");
|
TextureUsage.Mask =>
|
||||||
if (data.FileExists(newPath))
|
[
|
||||||
return true;
|
("_m_", "_mult_"),
|
||||||
|
("_m_", "_mask_"),
|
||||||
newPath = path.Replace("_m.tex", "_mask.tex");
|
("_m.tex", "_mult.tex"),
|
||||||
if (data.FileExists(newPath))
|
("_m.tex", "_mask.tex"),
|
||||||
return true;
|
],
|
||||||
|
TextureUsage.Diffuse =>
|
||||||
newPath = path.Replace("_m_", "_mult_");
|
[
|
||||||
if (data.FileExists(newPath))
|
("_d_", "_base_"),
|
||||||
return true;
|
("_d.tex", "_base.tex"),
|
||||||
|
],
|
||||||
newPath = path.Replace("_m_", "_mask_");
|
TextureUsage.Index => [],
|
||||||
if (data.FileExists(newPath))
|
TextureUsage.Specular => [],
|
||||||
return true;
|
_ => [],
|
||||||
|
};
|
||||||
return false;
|
foreach (var (from, to) in pairs)
|
||||||
case TextureUsage.Diffuse:
|
{
|
||||||
newPath = path.Replace("_d.tex", "_base.tex");
|
newPath = path.Replace(from, to);
|
||||||
if (data.FileExists(newPath))
|
if (data.FileExists(newPath))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
newPath = path.Replace("_d_", "_base_");
|
|
||||||
if (data.FileExists(newPath))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
case TextureUsage.Specular:
|
|
||||||
return false;
|
|
||||||
default: throw new ArgumentOutOfRangeException(nameof(usage), usage, null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -326,6 +321,29 @@ public class ModMigrator(IDataManager gameData, TextureManager textures) : IServ
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to migrate texture swaps
|
var newSwapFrom = swapFrom;
|
||||||
|
if (!fromExists && !MaterialPack.AdaptPath(gameData, swapFrom, MaterialPack.TextureUsage.Unknown, out newSwapFrom))
|
||||||
|
{
|
||||||
|
_messages.Add($"Could not migrate file swap {swapFrom} -> {swapTo} in {container.Mod.Name}: {container.GetFullName()}.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var newSwapTo = swapTo;
|
||||||
|
if (!toExists && !MaterialPack.AdaptPath(gameData, swapTo, MaterialPack.TextureUsage.Unknown, out newSwapTo))
|
||||||
|
{
|
||||||
|
_messages.Add($"Could not migrate file swap {swapFrom} -> {swapTo} in {container.Mod.Name}: {container.GetFullName()}.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Utf8GamePath.FromString(swapFrom, out var path) || !Utf8GamePath.FromString(newSwapFrom, out var newPath))
|
||||||
|
{
|
||||||
|
_messages.Add(
|
||||||
|
$"Could not migrate file swap {swapFrom} -> {swapTo} in {container.Mod.Name}: {container.GetFullName()}. Unknown Error.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
container.FileSwaps.Remove(path);
|
||||||
|
container.FileSwaps.Add(newPath, new FullPath(newSwapTo));
|
||||||
|
_changedMods.Add((Mod)container.Mod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue