Skip to content

Commit

Permalink
Merge pull request #920 from WolvenKit/fix/xbm-fixes
Browse files Browse the repository at this point in the history
XBM Fixes
  • Loading branch information
rfuzzo committed Oct 1, 2022
2 parents 714aef6 + df6c203 commit 8fac2e4
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 34 deletions.
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

0 comments on commit 8fac2e4

Please sign in to comment.