This commit is contained in:
Ottermandias 2025-04-10 00:17:23 +02:00
parent f9b5a626cf
commit f03a139e0e

View file

@ -9,6 +9,7 @@ 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;
@ -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);
} }
} }