diff --git a/xivModdingFramework.sln b/xivModdingFramework.sln index 32330d49..913310ab 100644 --- a/xivModdingFramework.sln +++ b/xivModdingFramework.sln @@ -5,10 +5,6 @@ VisualStudioVersion = 15.0.27428.2015 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "xivModdingFramework", "xivModdingFramework\xivModdingFramework.csproj", "{83A720A7-A039-4FE3-BE65-95146CF5C6F3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "xivModdingFramework.xUnit", "xivModdingFramework.xUnit\xivModdingFramework.xUnit.csproj", "{4214BC4D-2FAD-4C9A-9F60-06A3EB22820D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "exChecker", "exChecker\exChecker.csproj", "{D174095D-1B25-471A-B443-83D69E0A3173}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/xivModdingFramework/Exd/Enums/XivEx.cs b/xivModdingFramework/Exd/Enums/XivEx.cs index 82d25a12..57595911 100644 --- a/xivModdingFramework/Exd/Enums/XivEx.cs +++ b/xivModdingFramework/Exd/Enums/XivEx.cs @@ -544,6 +544,7 @@ public enum XivEx recipe, recipeelement, recipeleveltable, + recipelookup, recipenotebooklist, recommendcontents, relic, diff --git a/xivModdingFramework/Materials/DataContainers/XivMtrl.cs b/xivModdingFramework/Materials/DataContainers/XivMtrl.cs index 82f761ec..b42b32de 100644 --- a/xivModdingFramework/Materials/DataContainers/XivMtrl.cs +++ b/xivModdingFramework/Materials/DataContainers/XivMtrl.cs @@ -137,7 +137,7 @@ public EShaderPack ShaderPack /// /// The list of half floats containing the ColorSet data /// - public List ColorSetData { get; set; } = new List(new Half[1024]); + public List ColorSetData { get; set; } = new List(new SharpDX.Half[1024]); /// /// The byte array containing the extra ColorSet data /// diff --git a/xivModdingFramework/Materials/FileTypes/Mtrl.cs b/xivModdingFramework/Materials/FileTypes/Mtrl.cs index 5b31a46f..b2df0451 100644 --- a/xivModdingFramework/Materials/FileTypes/Mtrl.cs +++ b/xivModdingFramework/Materials/FileTypes/Mtrl.cs @@ -262,7 +262,7 @@ public static XivMtrl GetXivMtrl(byte[] bytes, string internalMtrlPath = "") xivMtrl.AdditionalData = br.ReadBytes(additionalDataSize); - xivMtrl.ColorSetData = new List(); + xivMtrl.ColorSetData = new List(); xivMtrl.ColorSetDyeData = new byte[0]; if (colorSetDataSize > 0) @@ -273,7 +273,7 @@ public static XivMtrl GetXivMtrl(byte[] bytes, string internalMtrlPath = "") for (var i = 0; i < colorDataSize / 2; i++) { - xivMtrl.ColorSetData.Add(new Half(br.ReadUInt16())); + xivMtrl.ColorSetData.Add(new SharpDX.Half(br.ReadUInt16())); } // If the color set is 544 (DT: 2080) in length, it has an extra 32 bytes at the end diff --git a/xivModdingFramework/Materials/FileTypes/STM.cs b/xivModdingFramework/Materials/FileTypes/STM.cs index b666b84e..f5d2e989 100644 --- a/xivModdingFramework/Materials/FileTypes/STM.cs +++ b/xivModdingFramework/Materials/FileTypes/STM.cs @@ -139,30 +139,30 @@ public class StainingTemplateEntry { // Data Entries, in the format of // [Data Offset] => [Dye Id] = Dye values - public readonly List> Entries = new List>(); + public readonly List> Entries = new List>(); - public Half[] GetDiffuseData(int dyeId = 0) + public SharpDX.Half[] GetDiffuseData(int dyeId = 0) { return GetData(0, dyeId); } - public Half[] GetSpecularData(int dyeId = 0) + public SharpDX.Half[] GetSpecularData(int dyeId = 0) { return GetData(1, dyeId); } - public Half[] GetEmissiveData(int dyeId = 0) + public SharpDX.Half[] GetEmissiveData(int dyeId = 0) { return GetData(2, dyeId); } - public Half[] GetSpecularPowerData(int dyeId = 0) + public SharpDX.Half[] GetSpecularPowerData(int dyeId = 0) { return GetData(3, dyeId); } - public Half[] GetGlossData(int dyeId = 0) + public SharpDX.Half[] GetGlossData(int dyeId = 0) { return GetData(4, dyeId); } - public Half[] GetData(int offset, int dyeId = 0) + public SharpDX.Half[] GetData(int offset, int dyeId = 0) { if(offset >= Entries.Count) { @@ -225,7 +225,7 @@ public StainingTemplateEntry(byte[] data, int offset, EStainingTemplate template var lastOffset = 0; for (int x = 0; x < _ItemCount; x++) { - Entries.Add(new List()); + Entries.Add(new List()); var elementSize = 1; if(x < 3) { @@ -265,20 +265,20 @@ public StainingTemplateEntry(byte[] data, int offset, EStainingTemplate template var arrayStart = lastOffset; var offsetStart = (start + headerSize + (arrayStart * 2)); - List halfData = new List(); + List halfData = new List(); for (int i = 0; i < arraySize; i++) { - Half[] halfs = new Half[elementSize]; + SharpDX.Half[] halfs = new SharpDX.Half[elementSize]; var elementStart = offsetStart + ((i * 2) * elementSize); - halfs[0] = new Half(BitConverter.ToUInt16(data, elementStart)); + halfs[0] = new SharpDX.Half(BitConverter.ToUInt16(data, elementStart)); if (elementSize > 1) { - halfs[1] = new Half(BitConverter.ToUInt16(data, elementStart + 2)); - halfs[2] = new Half(BitConverter.ToUInt16(data, elementStart + 4)); + halfs[1] = new SharpDX.Half(BitConverter.ToUInt16(data, elementStart + 2)); + halfs[2] = new SharpDX.Half(BitConverter.ToUInt16(data, elementStart + 4)); } halfData.Add(halfs); @@ -286,7 +286,7 @@ public StainingTemplateEntry(byte[] data, int offset, EStainingTemplate template if(type == StainingTemplateArrayType.Indexed) { - var nArray = new List(); + var nArray = new List(); // The first entry in the list is an 0xFF byte that we skip // Since that would leave us with one less value than we need, as dummy value is added for the last dye for (int i = 1; i < numDyes + 1; i++) @@ -298,11 +298,11 @@ public StainingTemplateEntry(byte[] data, int offset, EStainingTemplate template { if (x < 3) { - nArray.Add(new Half[] { new Half(), new Half(), new Half() }); + nArray.Add(new SharpDX.Half[] { new SharpDX.Half(), new SharpDX.Half(), new SharpDX.Half() }); } else { - nArray.Add(new Half[] { new Half() }); + nArray.Add(new SharpDX.Half[] { new SharpDX.Half() }); } continue; } diff --git a/xivModdingFramework/Models/FileTypes/Mdl.cs b/xivModdingFramework/Models/FileTypes/Mdl.cs index b62e39b0..81de9007 100644 --- a/xivModdingFramework/Models/FileTypes/Mdl.cs +++ b/xivModdingFramework/Models/FileTypes/Mdl.cs @@ -90,7 +90,7 @@ public static class Mdl // Simple internal use hashable pair of Halfs. private struct HalfUV { - public HalfUV(Half _x, Half _y) + public HalfUV(SharpDX.Half _x, SharpDX.Half _y) { x = _x; y = _y; @@ -101,8 +101,8 @@ public HalfUV(float _x, float _y) y = _y; } - public Half x; - public Half y; + public SharpDX.Half x; + public SharpDX.Half y; public override int GetHashCode() { @@ -4120,20 +4120,20 @@ private static bool WriteVectorData(List buffer, Dictionary buffer, VertexDataType dataType, Vector3 data, bool handedness = true, int wDefault = 0) { - Half hx, hy, hz; + SharpDX.Half hx, hy, hz; if (dataType == VertexDataType.Half4) { - hx = new Half(data[0]); - hy = new Half(data[1]); - hz = new Half(data[2]); + hx = new SharpDX.Half(data[0]); + hy = new SharpDX.Half(data[1]); + hz = new SharpDX.Half(data[2]); buffer.AddRange(BitConverter.GetBytes(hx.RawValue)); buffer.AddRange(BitConverter.GetBytes(hy.RawValue)); buffer.AddRange(BitConverter.GetBytes(hz.RawValue)); // Half float positions have a W coordinate that is typically defaulted to either 0 (position data) or 1 (normal data). - var w = new Half(wDefault); + var w = new SharpDX.Half(wDefault); buffer.AddRange(BitConverter.GetBytes(w.RawValue)); } @@ -4248,12 +4248,12 @@ private static int WriteVertex(VertexByteData importData, Dictionary GetModelMaps(XivMtrl mtrl, bool pbrMa var dataLength = normalPixels != null ? normalPixels.Length : diffusePixels.Length; - var shaderFn = GetShaderMapper(GetCustomColors(), mtrl, settings); + var shaderFn = GetShaderMapper(colors, mtrl, settings); bool invertNormalGreen = colors.InvertNormalGreen; await Task.Run(() => @@ -647,7 +649,7 @@ private static ShaderMapperDelegate GetShaderMapper(CustomModelColors colors, Xi specularColorMul *= specularColorMul; emissiveColorMul *= emissiveColorMul; - List colorset = null; + List colorset = null; if(mtrl.ColorSetData != null && mtrl.ColorSetData.Count >= 1024) { // Clone the list in case the data is accessed or changed while we're working. @@ -920,6 +922,7 @@ private static ShaderMapperDelegate GetShaderMapper(CustomModelColors colors, Xi { var hairColor = (Color4)colors.HairColor; var bonusColor = GetHairBonusColor(mtrl, colors, colors.HairHighlightColor != null ? colors.HairHighlightColor.Value : colors.HairColor); + var lightColor = SrgbToLinear(new Color4(1, 0, 1, 1)); //bonusColor = SrgbToLinear(bonusColor); @@ -928,13 +931,15 @@ private static ShaderMapperDelegate GetShaderMapper(CustomModelColors colors, Xi var metalness = 0.0f; var occlusion = 1.0f; float bonusInfluence = normal.Blue; + float lightInfluence = (float)Math.Pow(mask.Red, 4.25f); - + //Console.WriteLine($"light influence: {lightInfluence}"); roughness = mask.Green; var specular = new Color4(mask.Red, mask.Red, mask.Red, 1.0f); - diffuse = Color4.Lerp(hairColor, bonusColor, bonusInfluence); + var baseHairColor = Color4.Lerp(hairColor, bonusColor, bonusInfluence); + diffuse = Color4.Lerp(baseHairColor, colors.LightColor, lightInfluence); diffuse *= diffuseColorMul; occlusion = (mask.Alpha * mask.Alpha); @@ -1336,7 +1341,7 @@ private static (Color4? Color, bool Blend) GetSkinBonusColor2(XivMtrl mtrl, Cust /// /// /// - public static Half[] GetColorsetRow(List colorsetData, float indexRed, float indexGreen, bool visualizeOnly = false, int highlightRow = -1) + public static SharpDX.Half[] GetColorsetRow(List colorsetData, float indexRed, float indexGreen, bool visualizeOnly = false, int highlightRow = -1) { if(colorsetData == null || colorsetData.Count == 0) { return null; @@ -1365,7 +1370,7 @@ public static Half[] GetColorsetRow(List colorsetData, float indexRed, flo } - var rowData = new Half[_RowSize]; + var rowData = new SharpDX.Half[_RowSize]; if (visualizeOnly) { for(int i = 0; i < 3; i++) { @@ -1430,7 +1435,7 @@ public static Half[] GetColorsetRow(List colorsetData, float indexRed, flo [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Half LerpHalf(Half a, Half b, float f) + public static SharpDX.Half LerpHalf(SharpDX.Half a, SharpDX.Half b, float f) { return a * (1.0f - f) + (b * f); } diff --git a/xivModdingFramework/Mods/EndwalkerUpgrade.cs b/xivModdingFramework/Mods/EndwalkerUpgrade.cs index 3c213834..3270e446 100644 --- a/xivModdingFramework/Mods/EndwalkerUpgrade.cs +++ b/xivModdingFramework/Mods/EndwalkerUpgrade.cs @@ -794,7 +794,7 @@ private static async Task> UpdateEndwalkerColors } // Update Colorset - List newData = new List(1024); + List newData = new List(1024); for (int i = 0; i < 32; i++) { @@ -1226,9 +1226,9 @@ private static async Task UpdateEndwalkerHairTextures(string normalPath, string } } - public static Half[] GetDefaultColorsetRow(EShaderPack pack) + public static SharpDX.Half[] GetDefaultColorsetRow(EShaderPack pack) { - var row = new Half[32]; + var row = new SharpDX.Half[32]; // Diffuse pixel base for (int i = 0; i < 8; i++) diff --git a/xivModdingFramework/Mods/FileTypes/TTMP.cs b/xivModdingFramework/Mods/FileTypes/TTMP.cs index 6669aa29..9968f54f 100644 --- a/xivModdingFramework/Mods/FileTypes/TTMP.cs +++ b/xivModdingFramework/Mods/FileTypes/TTMP.cs @@ -921,7 +921,7 @@ public static UpgradesNeeded DoesModpackNeedFix(string version) string[] parts = version.Split('.'); int.TryParse(parts[0], out major); if (parts.Length > 1) - int.TryParse(new(parts[1].TakeWhile(char.IsDigit).ToArray()), out minor); + int.TryParse(new string(parts[1].TakeWhile(char.IsDigit).ToArray()), out minor); if (major < 2) return UpgradesNeeded.NeedsTexFix | UpgradesNeeded.NeedsMdlFix; if (major == 2 && minor == 0) diff --git a/xivModdingFramework/Mods/WizardData.cs b/xivModdingFramework/Mods/WizardData.cs index b7873938..6d0964d3 100644 --- a/xivModdingFramework/Mods/WizardData.cs +++ b/xivModdingFramework/Mods/WizardData.cs @@ -57,8 +57,10 @@ public static string WriteImage(string currentPath, string tempFolder, string ne Directory.CreateDirectory(dir); using var fs = File.OpenWrite(fName); - var enc = new PngEncoder(); - enc.BitDepth = PngBitDepth.Bit16; + var enc = new PngEncoder + { + BitDepth = PngBitDepth.Bit16 + }; img.Save(fs, enc); return path; diff --git a/xivModdingFramework/Resources/XivStrings.Designer.cs b/xivModdingFramework/Resources/XivStrings.Designer.cs index 4700f42b..e8ecc570 100644 --- a/xivModdingFramework/Resources/XivStrings.Designer.cs +++ b/xivModdingFramework/Resources/XivStrings.Designer.cs @@ -22,7 +22,7 @@ namespace xivModdingFramework.Resources { [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class XivStrings { + public class XivStrings { private static global::System.Resources.ResourceManager resourceMan; @@ -279,7 +279,7 @@ internal static string Bishop_Autoturret { /// /// Looks up a localized string similar to Body. /// - internal static string Body { + public static string Body { get { return ResourceManager.GetString("Body", resourceCulture); } @@ -936,7 +936,7 @@ internal static string ExdFolder { /// /// Looks up a localized string similar to Face. /// - internal static string Face { + public static string Face { get { return ResourceManager.GetString("Face", resourceCulture); } diff --git a/xivModdingFramework/SqPack/DataContainers/IndexFile.cs b/xivModdingFramework/SqPack/DataContainers/IndexFile.cs index 418cae9a..6354bf31 100644 --- a/xivModdingFramework/SqPack/DataContainers/IndexFile.cs +++ b/xivModdingFramework/SqPack/DataContainers/IndexFile.cs @@ -105,8 +105,8 @@ public IndexFile(XivDataFile dataFile, BinaryReader index1Stream, BinaryReader i public virtual void Save() { var dir = XivCache.GameInfo.GameDirectory; - var index1Path = XivDataFiles.GetFullPath(DataFile, Index.IndexExtension); - var index2Path = XivDataFiles.GetFullPath(DataFile, Index.Index2Extension); + var index1Path = XivDataFiles.GetFullPath(DataFile, xivModdingFramework.SqPack.FileTypes.Index.IndexExtension); + var index2Path = XivDataFiles.GetFullPath(DataFile, xivModdingFramework.SqPack.FileTypes.Index.Index2Extension); using (var index1Stream = new BinaryWriter(File.Open(index1Path, FileMode.OpenOrCreate, FileAccess.Write))) { using (var index2Stream = new BinaryWriter(File.Open(index2Path, FileMode.OpenOrCreate, FileAccess.Write))) diff --git a/xivModdingFramework/Textures/FileTypes/DDS.cs b/xivModdingFramework/Textures/FileTypes/DDS.cs index 2e86672e..b5d187fb 100644 --- a/xivModdingFramework/Textures/FileTypes/DDS.cs +++ b/xivModdingFramework/Textures/FileTypes/DDS.cs @@ -16,11 +16,13 @@ using SharpDX; using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Png; using SixLabors.ImageSharp.Formats.Tga; using SixLabors.ImageSharp.PixelFormats; using System; using System.Collections.Generic; +using System.Data.Entity.ModelConfiguration.Conventions; using System.Diagnostics; using System.IO; using System.Linq; @@ -654,10 +656,10 @@ await Task.Run(async () => { for (var x = 0; x < width; x++) { - var r = new Half(br.ReadUInt16()); - var g = new Half(br.ReadUInt16()); - var b = new Half(br.ReadUInt16()); - var a = new Half(br.ReadUInt16()); + var r = new SharpDX.Half(br.ReadUInt16()); + var g = new SharpDX.Half(br.ReadUInt16()); + var b = new SharpDX.Half(br.ReadUInt16()); + var a = new SharpDX.Half(br.ReadUInt16()); // 255 * value, clamped to 0-255. var byteR = (byte)Math.Max(0, Math.Min(255, Math.Round(r * 255.0f))); @@ -748,9 +750,11 @@ public static async Task TexConv(byte[] rgbaData, int width, int height, { using (var img = Image.LoadPixelData(rgbaData, width, height)) { - var encoder = new TgaEncoder(); - encoder.Compression = TgaCompression.None; - encoder.BitsPerPixel = TgaBitsPerPixel.Pixel32; + var encoder = new TgaEncoder + { + Compression = TgaCompression.None, + BitsPerPixel = TgaBitsPerPixel.Pixel32 + }; img.SaveAsTga(input, encoder); } } @@ -758,9 +762,11 @@ public static async Task TexConv(byte[] rgbaData, int width, int height, { using (var img = Image.LoadPixelData(rgbaData, width, height)) { - var encoder = new TgaEncoder(); - encoder.Compression = TgaCompression.None; - encoder.BitsPerPixel = TgaBitsPerPixel.Pixel32; + var encoder = new TgaEncoder + { + Compression = TgaCompression.None, + BitsPerPixel = TgaBitsPerPixel.Pixel32 + }; img.SaveAsTga(input, encoder); } } @@ -781,14 +787,20 @@ public static async Task TexConv(string file, string format, bool genera // TexConv does not handle PNGs correctly. Rip the raw bytes ourselves and resave as TGA. if (file.ToLower().EndsWith(".png")) { - var decoder = new PngDecoder(); + var decoder = PngDecoder.Instance; byte[] data; int width, height; - using (var img = Image.Load(file, decoder)) + + using (var stream = File.OpenRead(file)) { - width = img.Width; - height = img.Height; - data = IOUtil.GetImageSharpPixels(img); + var options = new DecoderOptions { Configuration = SixLabors.ImageSharp.Configuration.Default }; + + using (var img = Image.Load(options, stream)) + { + width = img.Width; + height = img.Height; + data = IOUtil.GetImageSharpPixels(img); + } } // TexConv does not handle PNG reading correctly. return await TexConv(data, width, height, format, generateMipMaps); diff --git a/xivModdingFramework/Textures/FileTypes/Tex.cs b/xivModdingFramework/Textures/FileTypes/Tex.cs index cce7b1ea..0f5e84ee 100644 --- a/xivModdingFramework/Textures/FileTypes/Tex.cs +++ b/xivModdingFramework/Textures/FileTypes/Tex.cs @@ -1350,7 +1350,7 @@ public static async Task CompressTexFile(BinaryReader br, uint lengthInc #region Colorset Import Handling // Special one-off functions for importing colorsets as image files. - public static (List ColorsetData, byte[] DyeData) GetColorsetDataFromDDS(string ddsFilePath) + public static (List ColorsetData, byte[] DyeData) GetColorsetDataFromDDS(string ddsFilePath) { var colorSetData = DDSToColorset(ddsFilePath); var dyeData = GetColorsetDyeInformationFromFile(ddsFilePath); @@ -1395,7 +1395,7 @@ public static void ImportColorsetTexture(XivMtrl xivMtrl, string ddsFilePath, bo /// /// /// - public static List DDSToColorset(string ddsPath) + public static List DDSToColorset(string ddsPath) { using (var br = new BinaryReader(File.OpenRead(ddsPath))) { @@ -1436,14 +1436,14 @@ public static List DDSToColorset(string ddsPath) } var size = width * height * 4; - var colorSetData = new List(size); + var colorSetData = new List(size); br.BaseStream.Seek(128, SeekOrigin.Begin); for (var i = 0; i < size; i++) { - colorSetData.Add((new Half(br.ReadUInt16()))); + colorSetData.Add((new SharpDX.Half(br.ReadUInt16()))); } return colorSetData; diff --git a/xivModdingFramework/xivModdingFramework.csproj b/xivModdingFramework/xivModdingFramework.csproj index 31146c25..7840122c 100644 --- a/xivModdingFramework/xivModdingFramework.csproj +++ b/xivModdingFramework/xivModdingFramework.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + net8.0 3.1.0.0 3.1.0 true @@ -34,7 +34,7 @@ - + diff --git a/xivModdingFramework/xivModdingFramework.sln b/xivModdingFramework/xivModdingFramework.sln new file mode 100644 index 00000000..612d8db4 --- /dev/null +++ b/xivModdingFramework/xivModdingFramework.sln @@ -0,0 +1,24 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "xivModdingFramework", "xivModdingFramework.csproj", "{6487CDA4-F7B7-6B62-ECD4-0B2CF7696991}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6487CDA4-F7B7-6B62-ECD4-0B2CF7696991}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6487CDA4-F7B7-6B62-ECD4-0B2CF7696991}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6487CDA4-F7B7-6B62-ECD4-0B2CF7696991}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6487CDA4-F7B7-6B62-ECD4-0B2CF7696991}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A1F3DA06-CC78-4E54-8EA9-4A6FAFA6F16E} + EndGlobalSection +EndGlobal