Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

XBM Fixes #920

Merged
merged 3 commits into from
Oct 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
42 changes: 42 additions & 0 deletions WolvenKit.App/Converters/JsonFileEntryConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System;
using System.IO;
using System.Text.Json;
using System.Text.Json.Serialization;
using Splat;
using WolvenKit.Common;
using WolvenKit.Common.FNV1A;
using WolvenKit.RED4.Archive;
using WolvenKit.RED4.CR2W.Archive;

namespace WolvenKit.Functionality.Converters;

public class JsonFileEntryConverter : JsonConverter<FileEntry>
{
public override FileEntry Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (Locator.Current.GetService<IArchiveManager>() is not ArchiveManager archiveManager)
{
throw new Exception();
}

var fileHash = reader.TokenType switch
{
JsonTokenType.String => FNV1A64HashAlgorithm.HashString(reader.GetString()),
JsonTokenType.Number => reader.GetUInt64(),
_ => throw new NotImplementedException()
};

var fileEntry = archiveManager.Lookup(fileHash);
if (fileEntry.HasValue)
{
return (FileEntry)fileEntry.Value;
}

throw new FileNotFoundException();
}

public override void Write(Utf8JsonWriter writer, FileEntry value, JsonSerializerOptions options)
{
JsonSerializer.Serialize(writer, value.NameOrHash);
}
}
39 changes: 21 additions & 18 deletions WolvenKit.App/ViewModels/Tools/ImportExportViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
using WolvenKit.Core.Interfaces;
using WolvenKit.Core.Services;
using WolvenKit.Functionality.Controllers;
using WolvenKit.Functionality.Converters;
using WolvenKit.Functionality.Services;
using WolvenKit.Models;
using WolvenKit.Models.Docking;
Expand Down Expand Up @@ -93,18 +94,20 @@ public partial class ImportExportViewModel : ToolViewModel

private Dictionary<string, Dictionary<string, JsonObject>> _loadedSettings;

#endregion fields
private static JsonSerializerOptions s_jsonSerializerSettings = new() { Converters = { new JsonFileEntryConverter() }, WriteIndented = true };

/// <summary>
/// Import Export ViewModel Constructor
/// </summary>
/// <param name="projectManager"></param>
/// <param name="loggerService"></param>
/// <param name="messageService"></param>
/// <param name="watcherService"></param>
/// <param name="gameController"></param>
/// <param name="modTools"></param>
public ImportExportViewModel(
#endregion fields

/// <summary>
/// Import Export ViewModel Constructor
/// </summary>
/// <param name="projectManager"></param>
/// <param name="loggerService"></param>
/// <param name="messageService"></param>
/// <param name="watcherService"></param>
/// <param name="gameController"></param>
/// <param name="modTools"></param>
public ImportExportViewModel(
IProjectManager projectManager,
ILoggerService loggerService,
IProgressService<double> progressService,
Expand Down Expand Up @@ -1083,7 +1086,7 @@ public void LoadSettings()
}

var json = File.ReadAllText(fileName);
_loadedSettings = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, JsonObject>>>(json);
_loadedSettings = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, JsonObject>>>(json, s_jsonSerializerSettings);
}

private void SetSetting(string type, IEventPattern<object, NotifyCollectionChangedEventArgs> item)
Expand All @@ -1099,7 +1102,7 @@ private void SetSetting(string type, IEventPattern<object, NotifyCollectionChang
{
if (entry is ImportExportItemViewModel vm && _loadedSettings[type].TryGetValue(vm.GetBaseFile().RelativePath, out var args))
{
vm.Properties = (ImportExportArgs)args.Deserialize(vm.Properties.GetType());
vm.Properties = (ImportExportArgs)args.Deserialize(vm.Properties.GetType(), s_jsonSerializerSettings);
}
}
}
Expand All @@ -1108,7 +1111,7 @@ private void SetSetting(string type, IEventPattern<object, NotifyCollectionChang
{
if (_loadedSettings[type].TryGetValue(vm2.GetBaseFile().RelativePath, out var args))
{
vm2.Properties = (ImportExportArgs)args.Deserialize(vm2.Properties.GetType());
vm2.Properties = (ImportExportArgs)args.Deserialize(vm2.Properties.GetType(), s_jsonSerializerSettings);
}
}
}
Expand All @@ -1121,7 +1124,7 @@ public void SaveSettings()

foreach (var importableItem in ImportableItems)
{
var node = (JsonObject)JsonSerializer.SerializeToNode(importableItem.Properties, importableItem.Properties.GetType());
var node = (JsonObject)JsonSerializer.SerializeToNode(importableItem.Properties, importableItem.Properties.GetType(), s_jsonSerializerSettings);

node.Remove("Changing");
node.Remove("Changed");
Expand All @@ -1132,7 +1135,7 @@ public void SaveSettings()

foreach (var exportableItem in ExportableItems)
{
var node = (JsonObject)JsonSerializer.SerializeToNode(exportableItem.Properties, exportableItem.Properties.GetType());
var node = (JsonObject)JsonSerializer.SerializeToNode(exportableItem.Properties, exportableItem.Properties.GetType(), s_jsonSerializerSettings);

node.Remove("Changing");
node.Remove("Changed");
Expand All @@ -1143,7 +1146,7 @@ public void SaveSettings()

foreach (var convertableItem in ConvertableItems)
{
var node = (JsonObject)JsonSerializer.SerializeToNode(convertableItem.Properties, convertableItem.Properties.GetType());
var node = (JsonObject)JsonSerializer.SerializeToNode(convertableItem.Properties, convertableItem.Properties.GetType(), s_jsonSerializerSettings);

node.Remove("Changing");
node.Remove("Changed");
Expand All @@ -1159,7 +1162,7 @@ public void SaveSettings()
{ "convert", convertSettings },
};

var json = JsonSerializer.Serialize(settings, new JsonSerializerOptions {WriteIndented = true});
var json = JsonSerializer.Serialize(settings, s_jsonSerializerSettings);
File.WriteAllText(Path.Combine(_projectManager.ActiveProject.ProjectDirectory, "ImportExportSettings.json"), json);
}
}
Expand Down
31 changes: 17 additions & 14 deletions WolvenKit.Common/RED4/RedImage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -262,10 +262,10 @@ public byte[] SaveToTGAMemory()
SaveToMemory(InternalScratchImage.SaveToWICMemory(0, WIC_FLAGS.NONE, TexHelper.Instance.GetWICCodec(WICCodecs.JPEG)));

public void SaveToPNG(string szFile) =>
InternalScratchImage.SaveToWICFile(0, WIC_FLAGS.FORCE_RGB, TexHelper.Instance.GetWICCodec(WICCodecs.PNG), szFile);
InternalScratchImage.SaveToWICFile(0, WIC_FLAGS.NONE, TexHelper.Instance.GetWICCodec(WICCodecs.PNG), szFile);

public byte[] SaveToPNGMemory() =>
SaveToMemory(InternalScratchImage.SaveToWICMemory(0, WIC_FLAGS.FORCE_RGB, TexHelper.Instance.GetWICCodec(WICCodecs.PNG)));
SaveToMemory(InternalScratchImage.SaveToWICMemory(0, WIC_FLAGS.NONE, TexHelper.Instance.GetWICCodec(WICCodecs.PNG)));

public void SaveToTIFF(string szFile) =>
InternalScratchImage.SaveToWICFile(0, WIC_FLAGS.NONE, TexHelper.Instance.GetWICCodec(WICCodecs.TIFF), szFile);
Expand Down Expand Up @@ -440,11 +440,6 @@ public class RedImageTransformSettings

private (STextureGroupSetup, rendRenderTextureBlobPC) GetSetupAndBlob(RedImageTransformSettings settings)
{
if (settings.RawFormat != DXGI_FORMAT.UNKNOWN && settings.IsGamma != TexHelper.Instance.IsSRGB(settings.RawFormat))
{
throw new ArgumentException("");
}

var setup = new STextureGroupSetup();
var blob = new rendRenderTextureBlobPC();

Expand All @@ -461,25 +456,33 @@ public class RedImageTransformSettings

tmpImage = true;

img = img.Convert(settings.RawFormat, TEX_FILTER_FLAGS.DEFAULT, 0.5F);
img = img.Convert(settings.RawFormat, TEX_FILTER_FLAGS.FORCE_WIC, 0.5F);
metadata = img.GetMetadata();
}
else
{
if (settings.IsGamma && !TexHelper.Instance.IsSRGB(metadata.Format))
{
tmpImage = true;
var srgbFormat = TexHelper.Instance.MakeSRGB(metadata.Format);
if (metadata.Format != srgbFormat)
{
tmpImage = true;

img = img.Convert(TexHelper.Instance.MakeSRGB(metadata.Format), TEX_FILTER_FLAGS.DEFAULT, 0.5F);
metadata = img.GetMetadata();
img = img.Convert(srgbFormat, TEX_FILTER_FLAGS.FORCE_WIC, 0.5F);
metadata = img.GetMetadata();
}
}

if (!settings.IsGamma && TexHelper.Instance.IsSRGB(metadata.Format))
{
tmpImage = true;
var linearFormat = TexHelper.Instance.MakeLinear(metadata.Format);
if (metadata.Format != linearFormat)
{
tmpImage = true;

img = img.Convert(TexHelper.Instance.MakeTypelessUNORM(metadata.Format), TEX_FILTER_FLAGS.DEFAULT, 0.5F);
metadata = img.GetMetadata();
img = img.Convert(linearFormat, TEX_FILTER_FLAGS.FORCE_WIC, 0.5F);
metadata = img.GetMetadata();
}
}
}

Expand Down
Binary file modified WolvenKit.Common/lib/DirectXTexNet.dll
Binary file not shown.
Binary file modified WolvenKit.Common/lib/DirectXTexNetImpl.dll
Binary file not shown.
2 changes: 0 additions & 2 deletions WolvenKit.RED4.Archive/Base/Archive.cs
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,6 @@ private void CopyFileSegmentToStream(Stream outStream, FileSegment offsetEntry,
vs.DecompressAndCopySegment(outStream, zSize, size);
}
vs.Dispose();
ReleaseFileHandle();
}

/// <summary>
Expand All @@ -206,7 +205,6 @@ private async Task CopyFileSegmentToStreamAsync(Stream outStream, FileSegment of
var size = offsetEntry.Size;
await vs.DecompressAndCopySegmentAsync(outStream, zSize, size);
}
ReleaseFileHandle();
}

#region IDisposable
Expand Down