FortPlayerAugmentItemDefinition + no more auto save

This commit is contained in:
4sval
2022-12-10 00:47:18 +01:00
parent fc82540388
commit 2a4f91cc65
10 changed files with 157 additions and 225 deletions

View File

@@ -488,56 +488,6 @@ public class CUE4ParseViewModel : ViewModel
});
}
public void ExtractFolder(CancellationToken cancellationToken, TreeItem folder)
{
foreach (var asset in folder.AssetsList.Assets)
{
Thread.Sleep(10);
cancellationToken.ThrowIfCancellationRequested();
try
{
Extract(cancellationToken, asset.FullPath, TabControl.HasNoTabs);
}
catch
{
// ignore
}
}
foreach (var f in folder.Folders) ExtractFolder(cancellationToken, f);
}
public void ExportFolder(CancellationToken cancellationToken, TreeItem folder)
{
foreach (var asset in folder.AssetsList.Assets)
{
Thread.Sleep(10);
cancellationToken.ThrowIfCancellationRequested();
ExportData(asset.FullPath);
}
foreach (var f in folder.Folders) ExportFolder(cancellationToken, f);
}
public void SaveFolder(CancellationToken cancellationToken, TreeItem folder)
{
foreach (var asset in folder.AssetsList.Assets)
{
Thread.Sleep(10);
cancellationToken.ThrowIfCancellationRequested();
try
{
Extract(cancellationToken, asset.FullPath, TabControl.HasNoTabs, true);
}
catch
{
// ignore
}
}
foreach (var f in folder.Folders) SaveFolder(cancellationToken, f);
}
public void ExtractSelected(CancellationToken cancellationToken, IEnumerable<AssetItem> assetItems)
{
foreach (var asset in assetItems)
@@ -548,7 +498,41 @@ public class CUE4ParseViewModel : ViewModel
}
}
public void Extract(CancellationToken cancellationToken, string fullPath, bool addNewTab = false, bool bulkSave = false)
private void BulkFolder(CancellationToken cancellationToken, TreeItem folder, Action<AssetItem> action)
{
foreach (var asset in folder.AssetsList.Assets)
{
Thread.Sleep(10);
cancellationToken.ThrowIfCancellationRequested();
try
{
action(asset);
}
catch
{
// ignore
}
}
foreach (var f in folder.Folders) BulkFolder(cancellationToken, f, action);
}
public void ExportFolder(CancellationToken cancellationToken, TreeItem folder)
=> BulkFolder(cancellationToken, folder, asset => ExportData(asset.FullPath));
public void ExtractFolder(CancellationToken cancellationToken, TreeItem folder)
=> BulkFolder(cancellationToken, folder, asset => Extract(cancellationToken, asset.FullPath, TabControl.HasNoTabs));
public void SaveFolder(CancellationToken cancellationToken, TreeItem folder)
=> BulkFolder(cancellationToken, folder, asset => Extract(cancellationToken, asset.FullPath, TabControl.HasNoTabs, true));
public void TextureFolder(CancellationToken cancellationToken, TreeItem folder)
=> BulkFolder(cancellationToken, folder, asset =>
{
Extract(cancellationToken, asset.FullPath, TabControl.HasNoTabs, false, true);
});
public void Extract(CancellationToken cancellationToken, string fullPath, bool addNewTab = false, bool bulkSave = false, bool bulkTexture = false)
{
Log.Information("User DOUBLE-CLICKED to extract '{FullPath}'", fullPath);
@@ -581,7 +565,7 @@ public class CUE4ParseViewModel : ViewModel
foreach (var e in exports)
{
if (CheckExport(cancellationToken, e))
if (CheckExport(cancellationToken, e, bulkTexture))
break;
}
@@ -691,7 +675,7 @@ public class CUE4ParseViewModel : ViewModel
if (Provider.TrySaveAsset(fullPath, out var data))
{
using var stream = new MemoryStream(data) { Position = 0 };
TabControl.SelectedTab.AddImage(fileName.SubstringBeforeLast("."), false, SKBitmap.Decode(stream));
TabControl.SelectedTab.AddImage(fileName.SubstringBeforeLast("."), false, SKBitmap.Decode(stream), bulkTexture);
}
break;
@@ -711,7 +695,7 @@ public class CUE4ParseViewModel : ViewModel
canvas.DrawPicture(svg.Picture, paint);
}
TabControl.SelectedTab.AddImage(fileName.SubstringBeforeLast("."), false, bitmap);
TabControl.SelectedTab.AddImage(fileName.SubstringBeforeLast("."), false, bitmap, bulkTexture);
}
break;
@@ -759,11 +743,11 @@ public class CUE4ParseViewModel : ViewModel
}
}
private bool CheckExport(CancellationToken cancellationToken, UObject export) // return true once you wanna stop searching for exports
private bool CheckExport(CancellationToken cancellationToken, UObject export, bool bulkTexture = false) // return true once you wanna stop searching for exports
{
switch (export)
{
case USolarisDigest solarisDigest:
case USolarisDigest solarisDigest when !bulkTexture:
{
if (!TabControl.CanAddTabs) return false;
@@ -774,11 +758,11 @@ public class CUE4ParseViewModel : ViewModel
}
case UTexture2D texture:
{
TabControl.SelectedTab.AddImage(texture);
TabControl.SelectedTab.AddImage(texture, bulkTexture);
return false;
}
case UAkMediaAssetData:
case USoundWave:
case UAkMediaAssetData when !bulkTexture:
case USoundWave when !bulkTexture:
{
var shouldDecompress = UserSettings.Default.CompressedAudioMode == ECompressedAudio.PlayDecompressed;
export.Decode(shouldDecompress, out var audioFormat, out var data);
@@ -788,10 +772,10 @@ public class CUE4ParseViewModel : ViewModel
SaveAndPlaySound(Path.Combine(TabControl.SelectedTab.Directory, TabControl.SelectedTab.Header.SubstringBeforeLast('.')).Replace('\\', '/'), audioFormat, data);
return false;
}
case UWorld when UserSettings.Default.PreviewWorlds:
case UStaticMesh when UserSettings.Default.PreviewStaticMeshes:
case USkeletalMesh when UserSettings.Default.PreviewSkeletalMeshes:
case UMaterialInstance when UserSettings.Default.PreviewMaterials && !ModelIsOverwritingMaterial &&
case UWorld when !bulkTexture && UserSettings.Default.PreviewWorlds:
case UStaticMesh when !bulkTexture && UserSettings.Default.PreviewStaticMeshes:
case USkeletalMesh when !bulkTexture && UserSettings.Default.PreviewSkeletalMeshes:
case UMaterialInstance when !bulkTexture && UserSettings.Default.PreviewMaterials && !ModelIsOverwritingMaterial &&
!(Game == FGame.FortniteGame && export.Owner != null && (export.Owner.Name.EndsWith($"/MI_OfferImages/{export.Name}", StringComparison.OrdinalIgnoreCase) ||
export.Owner.Name.EndsWith($"/RenderSwitch_Materials/{export.Name}", StringComparison.OrdinalIgnoreCase) ||
export.Owner.Name.EndsWith($"/MI_BPTile/{export.Name}", StringComparison.OrdinalIgnoreCase))):
@@ -800,23 +784,23 @@ public class CUE4ParseViewModel : ViewModel
SnooperViewer.Run();
return true;
}
case UMaterialInstance m when ModelIsOverwritingMaterial:
case UMaterialInstance m when !bulkTexture && ModelIsOverwritingMaterial:
{
SnooperViewer.Renderer.Swap(m);
SnooperViewer.Run();
return true;
}
case UAnimSequence a when ModelIsWaitingAnimation:
case UAnimSequence a when !bulkTexture && ModelIsWaitingAnimation:
{
SnooperViewer.Renderer.Animate(a);
SnooperViewer.Run();
return true;
}
case UStaticMesh when UserSettings.Default.SaveStaticMeshes:
case USkeletalMesh when UserSettings.Default.SaveSkeletalMeshes:
case UMaterialInstance when UserSettings.Default.SaveMaterials:
case USkeleton when UserSettings.Default.SaveSkeletonAsMesh:
case UAnimSequence when UserSettings.Default.SaveAnimations:
case UStaticMesh when !bulkTexture && UserSettings.Default.SaveStaticMeshes:
case USkeletalMesh when !bulkTexture && UserSettings.Default.SaveSkeletalMeshes:
case UMaterialInstance when !bulkTexture && UserSettings.Default.SaveMaterials:
case USkeleton when !bulkTexture && UserSettings.Default.SaveSkeletonAsMesh:
case UAnimSequence when !bulkTexture && UserSettings.Default.SaveAnimations:
{
SaveExport(export);
return true;
@@ -827,7 +811,7 @@ public class CUE4ParseViewModel : ViewModel
if (!package.TryConstructCreator(out var creator)) return false;
creator.ParseForInfo();
TabControl.SelectedTab.AddImage(export.Name, false, creator.Draw());
TabControl.SelectedTab.AddImage(export.Name, false, creator.Draw(), bulkTexture);
return true;
}
}

View File

@@ -50,12 +50,12 @@ public class RightClickMenuCommand : ViewModelCommand<ApplicationViewModel>
}
break;
case "Assets_Save_Texture":
case "Assets_Save_Textures":
foreach (var asset in assetItems)
{
cancellationToken.ThrowIfCancellationRequested();
contextViewModel.CUE4Parse.Extract(cancellationToken, asset.FullPath);
contextViewModel.CUE4Parse.TabControl.SelectedTab.SaveImage(false);
contextViewModel.CUE4Parse.TabControl.SelectedTab.SaveImages(false);
}
break;

View File

@@ -17,6 +17,7 @@ using System.Windows;
using System.Windows.Media.Imaging;
using CUE4Parse.UE4.Assets.Exports.Texture;
using CUE4Parse_Conversion.Textures;
using Ookii.Dialogs.Wpf;
namespace FModel.ViewModels;
@@ -221,19 +222,20 @@ public class TabItem : ViewModel
});
}
public void AddImage(UTexture2D texture) => AddImage(texture.Name, texture.bRenderNearestNeighbor, texture.Decode(UserSettings.Default.OverridedPlatform));
public void AddImage(UTexture2D texture, bool bulkTexture)
=> AddImage(texture.Name, texture.bRenderNearestNeighbor, texture.Decode(UserSettings.Default.OverridedPlatform), bulkTexture);
public void AddImage(string name, bool rnn, SKBitmap[] img)
public void AddImage(string name, bool rnn, SKBitmap[] img, bool bulkTexture)
{
foreach (var i in img) AddImage(name, rnn, i);
foreach (var i in img) AddImage(name, rnn, i, bulkTexture);
}
public void AddImage(string name, bool rnn, SKBitmap img)
public void AddImage(string name, bool rnn, SKBitmap img, bool bulkTexture)
{
Application.Current.Dispatcher.Invoke(() =>
{
var t = new TabImage(name, rnn, img);
if (UserSettings.Default.IsAutoSaveTextures)
if (bulkTexture)
SaveImage(t, true);
_images.Add(t);
@@ -253,7 +255,7 @@ public class TabItem : ViewModel
Document ??= new TextDocument();
Document.Text = text;
if (UserSettings.Default.IsAutoSaveProps || bulkSave)
if (bulkSave)
SaveProperty(true);
});
}
@@ -267,16 +269,47 @@ public class TabItem : ViewModel
});
}
public void SaveImage(bool autoSave) => SaveImage(SelectedImage, autoSave);
public void SaveImages(bool bulkTexture)
{
if (_images.Count == 1)
{
SaveImage(bulkTexture);
return;
}
private void SaveImage(TabImage image, bool autoSave)
var directory = Path.Combine(UserSettings.Default.TextureDirectory,
UserSettings.Default.KeepDirectoryStructure ? Directory : "").Replace('\\', '/');
if (!bulkTexture)
{
var folderBrowser = new VistaFolderBrowserDialog { Description = "description ???", UseDescriptionForTitle = false };
if (folderBrowser.ShowDialog() == true)
{
directory = folderBrowser.SelectedPath;
}
}
else
{
System.IO.Directory.CreateDirectory(directory);
}
foreach (var image in _images)
{
if (image == null) return;
var fileName = $"{image.ExportName}.png";
SaveImage(image, Path.Combine(directory, fileName), fileName);
}
}
public void SaveImage(bool bulkTexture) => SaveImage(SelectedImage, bulkTexture);
private void SaveImage(TabImage image, bool bulkTexture)
{
if (image == null) return;
var fileName = $"{image.ExportName}.png";
var directory = Path.Combine(UserSettings.Default.TextureDirectory,
var path = Path.Combine(UserSettings.Default.TextureDirectory,
UserSettings.Default.KeepDirectoryStructure ? Directory : "", fileName!).Replace('\\', '/');
if (!autoSave)
if (!bulkTexture)
{
var saveFileDialog = new SaveFileDialog
{
@@ -287,19 +320,26 @@ public class TabItem : ViewModel
};
var result = saveFileDialog.ShowDialog();
if (!result.HasValue || !result.Value) return;
directory = saveFileDialog.FileName;
path = saveFileDialog.FileName;
}
else
{
System.IO.Directory.CreateDirectory(directory.SubstringBeforeLast('/'));
System.IO.Directory.CreateDirectory(path.SubstringBeforeLast('/'));
}
using (var fs = new FileStream(directory, FileMode.Create, FileAccess.Write, FileShare.Read))
{
fs.Write(image.ImageBuffer, 0, image.ImageBuffer.Length);
}
SaveImage(image, path, fileName);
}
SaveCheck(directory, fileName);
private void SaveImage(TabImage image, string path, string fileName)
{
SaveImage(image, path);
SaveCheck(path, fileName);
}
private void SaveImage(TabImage image, string path)
{
using var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read);
fs.Write(image.ImageBuffer, 0, image.ImageBuffer.Length);
}
public void SaveProperty(bool autoSave)
@@ -451,4 +491,4 @@ public class TabControlViewModel : ViewModel
{
yield return new TabItem("New Tab", string.Empty);
}
}
}