diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs index 0eadf9df..5b57665e 100644 --- a/FModel/ViewModels/CUE4ParseViewModel.cs +++ b/FModel/ViewModels/CUE4ParseViewModel.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -6,7 +6,9 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Windows; + using AdonisUI.Controls; + using CUE4Parse.Encryption.Aes; using CUE4Parse.FileProvider; using CUE4Parse.FileProvider.Vfs; @@ -26,10 +28,13 @@ using CUE4Parse.UE4.Oodle.Objects; using CUE4Parse.UE4.Shaders; using CUE4Parse.UE4.Versions; using CUE4Parse.UE4.Wwise; + using CUE4Parse_Conversion; using CUE4Parse_Conversion.Sounds; using CUE4Parse_Conversion.Textures; + using EpicManifestParser.Objects; + using FModel.Creator; using FModel.Extensions; using FModel.Framework; @@ -37,8 +42,11 @@ using FModel.Services; using FModel.Settings; using FModel.Views; using FModel.Views.Resources.Controls; + using Newtonsoft.Json; + using Serilog; + using SkiaSharp; namespace FModel.ViewModels @@ -147,7 +155,7 @@ namespace FModel.ViewModels byte[] manifestData; var chunksDir = Directory.CreateDirectory(Path.Combine(UserSettings.Default.OutputDirectory, ".data")); - var manifestPath = Path.Combine(chunksDir.FullName, manifestInfo.Filename); + var manifestPath = Path.Combine(chunksDir.FullName, manifestInfo.FileName); if (File.Exists(manifestPath)) { manifestData = File.ReadAllBytes(manifestPath); @@ -679,19 +687,21 @@ namespace FModel.ViewModels export.Owner.Name.EndsWith($"/RenderSwitch_Materials/{export.Name}", StringComparison.OrdinalIgnoreCase) || export.Owner.Name.EndsWith($"/MI_BPTile/{export.Name}", StringComparison.OrdinalIgnoreCase))): { - Application.Current.Dispatcher.InvokeAsync(() => + Application.Current.Dispatcher.Invoke(async () => { var modelViewer = Helper.GetWindow("Model Viewer", () => new ModelViewer().Show()); - modelViewer.Load(export); + await Task.Delay(100).ConfigureAwait(true); + await modelViewer.Load(export).ConfigureAwait(true); }); return true; } case UMaterialInstance m when ModelIsSwappingMaterial: { - Application.Current.Dispatcher.InvokeAsync(() => + Application.Current.Dispatcher.Invoke(async () => { var modelViewer = Helper.GetWindow("Model Viewer", () => new ModelViewer().Show()); - modelViewer.Swap(m); + await Task.Delay(100).ConfigureAwait(true); + await modelViewer.Swap(m).ConfigureAwait(true); }); return true; } diff --git a/FModel/ViewModels/ModelViewerViewModel.cs b/FModel/ViewModels/ModelViewerViewModel.cs index 3bbf7c4b..b4062f00 100644 --- a/FModel/ViewModels/ModelViewerViewModel.cs +++ b/FModel/ViewModels/ModelViewerViewModel.cs @@ -3,29 +3,40 @@ using System.Collections.ObjectModel; using System.ComponentModel; using System.IO; using System.Linq; +using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Data; using System.Windows.Media.Media3D; + using CUE4Parse.UE4.Assets.Exports; using CUE4Parse.UE4.Assets.Exports.Material; using CUE4Parse.UE4.Assets.Exports.SkeletalMesh; using CUE4Parse.UE4.Assets.Exports.StaticMesh; using CUE4Parse.UE4.Assets.Exports.Texture; using CUE4Parse.UE4.Objects.Core.Math; + using CUE4Parse_Conversion.Meshes; using CUE4Parse_Conversion.Meshes.PSK; using CUE4Parse_Conversion.Textures; + +using FModel.Extensions; using FModel.Framework; using FModel.Services; using FModel.Settings; using FModel.Views.Resources.Controls; + using HelixToolkit.SharpDX.Core; using HelixToolkit.Wpf.SharpDX; + using Ookii.Dialogs.Wpf; + using Serilog; + using SharpDX; + using SkiaSharp; + using Camera = HelixToolkit.Wpf.SharpDX.Camera; using Geometry3D = HelixToolkit.SharpDX.Core.Geometry3D; using PerspectiveCamera = HelixToolkit.Wpf.SharpDX.PerspectiveCamera; @@ -141,8 +152,8 @@ namespace FModel.ViewModels } bool valid = false; - await _threadWorkerView.Begin(_ => - { + //await _threadWorkerView.Begin(_ => + //{ valid = export switch { UStaticMesh st => TryLoadStaticMesh(st, p), @@ -150,7 +161,7 @@ namespace FModel.ViewModels UMaterialInstance mi => TryLoadMaterialInstance(mi, p), _ => throw new ArgumentOutOfRangeException(nameof(export)) }; - }); + //}).ConfigureAwait(true); if (!valid) return; SelectedModel = p; } @@ -247,7 +258,7 @@ namespace FModel.ViewModels { var (material, _, _) = LoadMaterial(materialInstance); m = material; - }); + }).ConfigureAwait(true); if (m == null) return false; model.SelectedGeometry.Material = m; diff --git a/FModel/ViewModels/ThreadWorkerViewModel.cs b/FModel/ViewModels/ThreadWorkerViewModel.cs index 2782a144..b74ae2ea 100644 --- a/FModel/ViewModels/ThreadWorkerViewModel.cs +++ b/FModel/ViewModels/ThreadWorkerViewModel.cs @@ -1,10 +1,12 @@ -using FModel.Framework; -using FModel.Services; using System; using System.Threading; using System.Threading.Tasks; + using FModel.Extensions; +using FModel.Framework; +using FModel.Services; using FModel.Views.Resources.Controls; + using Serilog; namespace FModel.ViewModels @@ -57,7 +59,7 @@ namespace FModel.ViewModels CurrentCancellationTokenSource ??= new CancellationTokenSource(); _jobs.Enqueue(action); - await ProcessQueues(); + await ProcessQueues().ConfigureAwait(true); } public void Cancel() @@ -76,12 +78,12 @@ namespace FModel.ViewModels if (_jobs.Count > 0) { _applicationView.Status = EStatusKind.Loading; - await foreach (var job in _jobs) + await foreach (var job in _jobs.ConfigureAwait(true)) { try { // will end in "catch" if canceled - await Task.Run(() => job(CurrentCancellationTokenSource.Token)); + await Task.Run(() => job(CurrentCancellationTokenSource.Token)).ConfigureAwait(true); } catch (OperationCanceledException) { diff --git a/FModel/Views/ModelViewer.xaml.cs b/FModel/Views/ModelViewer.xaml.cs index b122672a..e4a26d0b 100644 --- a/FModel/Views/ModelViewer.xaml.cs +++ b/FModel/Views/ModelViewer.xaml.cs @@ -1,12 +1,16 @@ using System.ComponentModel; +using System.Threading.Tasks; using System.Windows; using System.Windows.Input; + using AdonisUI.Controls; + using CUE4Parse.UE4.Assets.Exports; using CUE4Parse.UE4.Assets.Exports.Material; + using FModel.Services; -using FModel.Settings; using FModel.ViewModels; + using MessageBox = AdonisUI.Controls.MessageBox; using MessageBoxImage = AdonisUI.Controls.MessageBoxImage; @@ -23,10 +27,10 @@ namespace FModel.Views InitializeComponent(); } - public async void Load(UObject export) => await _applicationView.ModelViewer.LoadExport(export); - public async void Swap(UMaterialInstance materialInstance) + public async Task Load(UObject export) => await _applicationView.ModelViewer.LoadExport(export).ConfigureAwait(true); + public async Task Swap(UMaterialInstance materialInstance) { - var sucess = await _applicationView.ModelViewer.TryChangeSelectedMaterial(materialInstance); + var sucess = await _applicationView.ModelViewer.TryChangeSelectedMaterial(materialInstance).ConfigureAwait(true); if (sucess) { _applicationView.CUE4Parse.ModelIsSwappingMaterial = false;