From 669b07f8070fe11032bae6bf265471aa2398a7df Mon Sep 17 00:00:00 2001
From: Masusder <59669685+Masusder@users.noreply.github.com>
Date: Sun, 25 Jan 2026 17:49:44 +0100
Subject: [PATCH] Overall improvements (#633)
---
CUE4Parse | 2 +-
FModel/Enums.cs | 19 +-
FModel/MainWindow.xaml | 56 +-
FModel/ViewModels/CUE4ParseViewModel.cs | 2 +-
FModel/ViewModels/GameFileViewModel.cs | 120 ++--
FModel/Views/Resources/Colors.xaml | 12 +-
.../ContextMenus/FileContextMenu.xaml | 13 +-
.../Controls/TiledExplorer/FileButton2.xaml | 20 +
.../Controls/TiledExplorer/Resources.xaml | 94 +++
.../Controls/TiledExplorer/Resources.xaml.cs | 35 ++
.../AnyItemMeetsConditionConverter.cs | 10 +
.../Converters/FileToGeometryConverter.cs | 17 +-
.../Converters/FolderToGeometryConverter.cs | 5 +-
FModel/Views/Resources/Icons.xaml | 2 +
FModel/Views/Resources/Resources.xaml | 553 ++++++++++++------
FModel/Views/SearchView.xaml | 2 +-
FModel/Views/SearchView.xaml.cs | 4 +-
FModel/Views/Snooper/Options.cs | 2 +-
18 files changed, 675 insertions(+), 293 deletions(-)
diff --git a/CUE4Parse b/CUE4Parse
index 32ddcc61..eaca2ce0 160000
--- a/CUE4Parse
+++ b/CUE4Parse
@@ -1 +1 @@
-Subproject commit 32ddcc61539cb8f82a92c8dc2d769ec34375aa37
+Subproject commit eaca2ce06fd5908f441936312d3c08f53ecb5edd
diff --git a/FModel/Enums.cs b/FModel/Enums.cs
index 0713bd58..c2f21f6e 100644
--- a/FModel/Enums.cs
+++ b/FModel/Enums.cs
@@ -104,9 +104,9 @@ public enum EBulkType
Properties = 1 << 1,
Textures = 1 << 2,
Meshes = 1 << 3,
- Skeletons = 1 << 4,
- Animations = 1 << 5,
- Audio = 1 << 6
+ Animations = 1 << 4,
+ Audio = 1 << 5,
+ Code = 1 << 6,
}
public enum EAssetCategory : uint
@@ -125,14 +125,18 @@ public enum EAssetCategory : uint
Mesh = AssetCategoryExtensions.CategoryBase + (2 << 16),
StaticMesh = Mesh + 1,
SkeletalMesh = Mesh + 2,
- Skeleton = Mesh + 3,
+ CustomizableObject = Mesh + 3,
+ NaniteDisplacedMesh = Mesh + 4,
Texture = AssetCategoryExtensions.CategoryBase + (3 << 16),
Materials = AssetCategoryExtensions.CategoryBase + (4 << 16),
Material = Materials + 1,
MaterialEditorData = Materials + 2,
MaterialFunction = Materials + 3,
- MaterialParameterCollection = Materials + 4,
+ MaterialFunctionEditorData = Materials + 4,
+ MaterialParameterCollection = Materials + 5,
Animation = AssetCategoryExtensions.CategoryBase + (5 << 16),
+ Skeleton = Animation + 1,
+ Rig = Animation + 2,
Level = AssetCategoryExtensions.CategoryBase + (6 << 16),
World = Level + 1,
BuildData = Level + 2,
@@ -142,9 +146,14 @@ public enum EAssetCategory : uint
ItemDefinitionBase = Data + 1,
CurveBase = Data + 2,
PhysicsAsset = Data + 3,
+ ObjectRedirector = Data + 4,
+ PhysicalMaterial = Data + 5,
+ ByteCode = Data + 6,
Media = AssetCategoryExtensions.CategoryBase + (8 << 16),
Audio = Media + 1,
Video = Media + 2,
Font = Media + 3,
+ SoundBank = Media + 4,
+ AudioEvent = Media + 5,
Particle = AssetCategoryExtensions.CategoryBase + (9 << 16),
}
diff --git a/FModel/MainWindow.xaml b/FModel/MainWindow.xaml
index 82da6143..8dc4c0b0 100644
--- a/FModel/MainWindow.xaml
+++ b/FModel/MainWindow.xaml
@@ -535,17 +535,27 @@
+
-
@@ -559,40 +569,6 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs
index 87f3bfc3..7921c537 100644
--- a/FModel/ViewModels/CUE4ParseViewModel.cs
+++ b/FModel/ViewModels/CUE4ParseViewModel.cs
@@ -21,8 +21,8 @@ using CUE4Parse.FileProvider.Objects;
using CUE4Parse.FileProvider.Vfs;
using CUE4Parse.GameTypes.Aion2.Objects;
using CUE4Parse.GameTypes.AshEchoes.FileProvider;
-using CUE4Parse.GameTypes.KRD.Assets.Exports;
using CUE4Parse.GameTypes.SMG.UE4.Assets.Exports.Wwise;
+using CUE4Parse.GameTypes.KRD.Assets.Exports;
using CUE4Parse.MappingsProvider;
using CUE4Parse.UE4.AssetRegistry;
using CUE4Parse.UE4.Assets;
diff --git a/FModel/ViewModels/GameFileViewModel.cs b/FModel/ViewModels/GameFileViewModel.cs
index d13390d1..3e97b075 100644
--- a/FModel/ViewModels/GameFileViewModel.cs
+++ b/FModel/ViewModels/GameFileViewModel.cs
@@ -9,11 +9,14 @@ using System.Windows.Media.Imaging;
using CUE4Parse.FileProvider.Objects;
using CUE4Parse.GameTypes.FN.Assets.Exports.DataAssets;
using CUE4Parse.GameTypes.SMG.UE4.Assets.Exports.Wwise;
+using CUE4Parse.GameTypes.SMG.UE4.Assets.Objects;
using CUE4Parse.UE4.Assets;
+using CUE4Parse.UE4.Assets.Exports;
using CUE4Parse.UE4.Assets.Exports.Animation;
using CUE4Parse.UE4.Assets.Exports.BuildData;
using CUE4Parse.UE4.Assets.Exports.Component;
using CUE4Parse.UE4.Assets.Exports.CriWare;
+using CUE4Parse.UE4.Assets.Exports.CustomizableObject;
using CUE4Parse.UE4.Assets.Exports.Engine;
using CUE4Parse.UE4.Assets.Exports.Engine.Font;
using CUE4Parse.UE4.Assets.Exports.Fmod;
@@ -22,6 +25,7 @@ using CUE4Parse.UE4.Assets.Exports.Internationalization;
using CUE4Parse.UE4.Assets.Exports.LevelSequence;
using CUE4Parse.UE4.Assets.Exports.Material;
using CUE4Parse.UE4.Assets.Exports.Material.Editor;
+using CUE4Parse.UE4.Assets.Exports.Nanite;
using CUE4Parse.UE4.Assets.Exports.Niagara;
using CUE4Parse.UE4.Assets.Exports.SkeletalMesh;
using CUE4Parse.UE4.Assets.Exports.Sound;
@@ -88,6 +92,16 @@ public class GameFileViewModel(GameFile asset) : ViewModel
}
}
+ private EBulkType _assetActions = EBulkType.None;
+ public EBulkType AssetActions
+ {
+ get => _assetActions;
+ private set
+ {
+ SetProperty(ref _assetActions, value);
+ }
+ }
+
private ImageSource _previewImage;
public ImageSource PreviewImage
{
@@ -101,6 +115,13 @@ public class GameFileViewModel(GameFile asset) : ViewModel
}
}
+ private int _numTextures = 0;
+ public int NumTextures
+ {
+ get => _numTextures;
+ private set => SetProperty(ref _numTextures, value);
+ }
+
public Task ExtractAsync()
=> ApplicationService.ThreadWorkerView.Begin(cancellationToken =>
_applicationView.CUE4Parse.ExtractSelected(cancellationToken, [Asset]));
@@ -142,6 +163,7 @@ public class GameFileViewModel(GameFile asset) : ViewModel
if (Asset.Extension is "umap")
{
AssetCategory = EAssetCategory.World;
+ AssetActions = EBulkType.Meshes | EBulkType.Textures | EBulkType.Audio | EBulkType.Code;
ResolvedAssetType = "World";
Resolved |= EResolveCompute.Preview;
return Task.CompletedTask;
@@ -149,6 +171,7 @@ public class GameFileViewModel(GameFile asset) : ViewModel
if (Asset.NameWithoutExtension.EndsWith("_BuiltData"))
{
AssetCategory = EAssetCategory.BuildData;
+ AssetActions = EBulkType.Textures;
ResolvedAssetType = "MapBuildDataRegistry";
Resolved |= EResolveCompute.Preview;
return Task.CompletedTask;
@@ -172,49 +195,59 @@ public class GameFileViewModel(GameFile asset) : ViewModel
var dummy = ((AbstractUePackage) pkg).ConstructObject(pointer.Class?.Object?.Value as UStruct, pkg);
ResolvedAssetType = dummy.ExportType;
- AssetCategory = dummy switch
+ (AssetCategory, AssetActions) = dummy switch
{
- URigVMBlueprintGeneratedClass => EAssetCategory.RigVMBlueprintGeneratedClass,
- UAnimBlueprintGeneratedClass => EAssetCategory.AnimBlueprintGeneratedClass,
- UWidgetBlueprintGeneratedClass => EAssetCategory.WidgetBlueprintGeneratedClass,
- UBlueprintGeneratedClass or UFunction => EAssetCategory.BlueprintGeneratedClass,
- UUserDefinedEnum => EAssetCategory.UserDefinedEnum,
- UUserDefinedStruct => EAssetCategory.UserDefinedStruct,
- UBlueprintCore => EAssetCategory.Blueprint,
- UClassCookedMetaData or UStructCookedMetaData or UEnumCookedMetaData => EAssetCategory.CookedMetaData,
+ URigVMBlueprintGeneratedClass => (EAssetCategory.RigVMBlueprintGeneratedClass, EBulkType.Code),
+ UAnimBlueprintGeneratedClass => (EAssetCategory.AnimBlueprintGeneratedClass, EBulkType.Code),
+ UWidgetBlueprintGeneratedClass => (EAssetCategory.WidgetBlueprintGeneratedClass, EBulkType.Code),
+ UBlueprintGeneratedClass or UFunction => (EAssetCategory.BlueprintGeneratedClass, EBulkType.Code),
+ UUserDefinedEnum => (EAssetCategory.UserDefinedEnum, EBulkType.None),
+ UUserDefinedStruct => (EAssetCategory.UserDefinedStruct, EBulkType.Code),
+ UBlueprintCore => (EAssetCategory.Blueprint, EBulkType.Code),
+ UClassCookedMetaData or UStructCookedMetaData or UEnumCookedMetaData => (EAssetCategory.CookedMetaData, EBulkType.None),
- UStaticMesh => EAssetCategory.StaticMesh,
- USkeletalMesh => EAssetCategory.SkeletalMesh,
- UPhysicsAsset => EAssetCategory.PhysicsAsset,
+ UStaticMesh => (EAssetCategory.StaticMesh, EBulkType.Meshes),
+ USkeletalMesh => (EAssetCategory.SkeletalMesh, EBulkType.Meshes),
+ UCustomizableObject => (EAssetCategory.CustomizableObject, EBulkType.None),
+ UNaniteDisplacedMesh => (EAssetCategory.NaniteDisplacedMesh, EBulkType.None),
- UTexture => EAssetCategory.Texture,
+ UTexture => (EAssetCategory.Texture, EBulkType.Textures),
- UMaterialInterface => EAssetCategory.Material,
- UMaterialInterfaceEditorOnlyData => EAssetCategory.MaterialEditorData,
- UMaterialFunction => EAssetCategory.MaterialFunction,
- UMaterialParameterCollection => EAssetCategory.MaterialParameterCollection,
+ UMaterialInterface => (EAssetCategory.Material, EBulkType.None),
+ UMaterialInterfaceEditorOnlyData => (EAssetCategory.MaterialEditorData, EBulkType.None),
+ UMaterialFunction => (EAssetCategory.MaterialFunction, EBulkType.None),
+ UMaterialFunctionEditorOnlyData => (EAssetCategory.MaterialFunctionEditorData, EBulkType.None),
+ UMaterialParameterCollection => (EAssetCategory.MaterialParameterCollection, EBulkType.None),
- UAnimationAsset => EAssetCategory.Animation,
- USkeleton => EAssetCategory.Skeleton,
+ UAnimationAsset => (EAssetCategory.Animation, EBulkType.Animations),
+ USkeleton => (EAssetCategory.Skeleton, EBulkType.Meshes),
+ URig => (EAssetCategory.Rig, EBulkType.None),
- UWorld => EAssetCategory.World,
- UMapBuildDataRegistry => EAssetCategory.BuildData,
- ULevelSequence => EAssetCategory.LevelSequence,
- UFoliageType => EAssetCategory.Foliage,
+ UWorld => (EAssetCategory.World, EBulkType.Meshes | EBulkType.Textures | EBulkType.Audio | EBulkType.Code),
+ UMapBuildDataRegistry => (EAssetCategory.BuildData, EBulkType.Textures),
+ ULevelSequence => (EAssetCategory.LevelSequence, EBulkType.Code),
+ UFoliageType => (EAssetCategory.Foliage, EBulkType.None),
- UItemDefinitionBase => EAssetCategory.ItemDefinitionBase,
- UDataAsset or UDataTable or UCurveTable or UStringTable => EAssetCategory.Data,
- UCurveBase => EAssetCategory.CurveBase,
+ UItemDefinitionBase => (EAssetCategory.ItemDefinitionBase, EBulkType.Textures),
+ UDataAsset or UDataTable or UCurveTable or UStringTable => (EAssetCategory.Data, EBulkType.None),
+ UCurveBase => (EAssetCategory.CurveBase, EBulkType.None),
+ UPhysicsAsset => (EAssetCategory.PhysicsAsset, EBulkType.None),
+ UObjectRedirector => (EAssetCategory.ObjectRedirector, EBulkType.None),
+ UPhysicalMaterial => (EAssetCategory.PhysicalMaterial, EBulkType.None),
- UWwiseAssetLibrary or USoundBase or UAkMediaAssetData or UAtomWaveBank or USoundAtomCue
- or UAtomCueSheet or USoundAtomCueSheet or UFMODBank or UFMODEvent or UAkAudioType
- or UExternalSource or UExternalSourceBank => EAssetCategory.Audio,
- UFileMediaSource => EAssetCategory.Video,
- UFont or UFontFace => EAssetCategory.Font,
+ USoundAtomCue or UAkAudioEvent or USoundCue or UFMODEvent => (EAssetCategory.AudioEvent, EBulkType.Audio),
- UNiagaraSystem or UNiagaraScriptBase or UParticleSystem => EAssetCategory.Particle,
+ UFMODBank or UAkAudioBank or UAtomWaveBank or UAkInitBank => (EAssetCategory.SoundBank, EBulkType.Audio),
- _ => EAssetCategory.All
+ UWwiseAssetLibrary or USoundBase or UAkMediaAssetData or UAtomCueSheet
+ or USoundAtomCueSheet or UAkAudioType or UExternalSource or UExternalSourceBank => (EAssetCategory.Audio, EBulkType.Audio),
+
+ UFileMediaSource => (EAssetCategory.Video, EBulkType.None),
+ UFont or UFontFace or USMGLocaleFontUMG => (EAssetCategory.Font, EBulkType.None),
+
+ UNiagaraSystem or UNiagaraScriptBase or UParticleSystem => (EAssetCategory.Particle, EBulkType.None),
+
+ _ => (EAssetCategory.All, EBulkType.None),
};
switch (AssetCategory)
@@ -224,6 +257,9 @@ public class GameFileViewModel(GameFile asset) : ViewModel
if (!resolve.HasFlag(EResolveCompute.Preview))
break;
+ if (pointer.Object.Value is UTexture2DArray textureArray && textureArray.GetFirstMip() is { SizeZ: > 1 } firstMip)
+ NumTextures = firstMip.SizeZ;
+
var img = texture.Decode(MaxPreviewSize, UserSettings.Default.CurrentDir.TexturePlatform);
if (img != null)
{
@@ -297,18 +333,25 @@ public class GameFileViewModel(GameFile asset) : ViewModel
case "xml":
AssetCategory = EAssetCategory.Data;
break;
+ case "ushaderbytecode":
+ AssetCategory = EAssetCategory.ByteCode;
+ break;
case "wav":
- case "bank":
- case "bnk":
- case "pck":
- case "awb":
- case "acb":
+ case "awb": // This is technically soundbank and should be below but I want it to be distinguishable from "acb"
case "xvag":
case "flac":
case "at9":
case "wem":
case "ogg":
AssetCategory = EAssetCategory.Audio;
+ AssetActions = EBulkType.Audio;
+ break;
+ case "acb":
+ case "bank":
+ case "bnk":
+ case "pck":
+ AssetCategory = EAssetCategory.SoundBank;
+ AssetActions = EBulkType.Audio;
break;
case "ufont":
case "otf":
@@ -325,6 +368,7 @@ public class GameFileViewModel(GameFile asset) : ViewModel
{
Resolved |= ~EResolveCompute.Preview;
AssetCategory = EAssetCategory.Texture;
+ AssetActions = EBulkType.Textures;
if (!resolve.HasFlag(EResolveCompute.Preview))
break;
diff --git a/FModel/Views/Resources/Colors.xaml b/FModel/Views/Resources/Colors.xaml
index 9d26790c..e2753c4d 100644
--- a/FModel/Views/Resources/Colors.xaml
+++ b/FModel/Views/Resources/Colors.xaml
@@ -10,14 +10,23 @@
-
+
+
+
+
+
+
+
+
+
+
@@ -32,4 +41,5 @@
+
diff --git a/FModel/Views/Resources/Controls/ContextMenus/FileContextMenu.xaml b/FModel/Views/Resources/Controls/ContextMenus/FileContextMenu.xaml
index b244bb5d..109b71fb 100644
--- a/FModel/Views/Resources/Controls/ContextMenus/FileContextMenu.xaml
+++ b/FModel/Views/Resources/Controls/ContextMenus/FileContextMenu.xaml
@@ -86,7 +86,7 @@
-
+
@@ -157,10 +157,9 @@
-
+
-
-
+
@@ -186,7 +185,7 @@
-
+
@@ -212,7 +211,7 @@
-
+
@@ -238,7 +237,7 @@
-
+
diff --git a/FModel/Views/Resources/Controls/TiledExplorer/FileButton2.xaml b/FModel/Views/Resources/Controls/TiledExplorer/FileButton2.xaml
index 9804169c..4096bb21 100644
--- a/FModel/Views/Resources/Controls/TiledExplorer/FileButton2.xaml
+++ b/FModel/Views/Resources/Controls/TiledExplorer/FileButton2.xaml
@@ -44,6 +44,26 @@
+
+
+
+
+
diff --git a/FModel/Views/Resources/Controls/TiledExplorer/Resources.xaml b/FModel/Views/Resources/Controls/TiledExplorer/Resources.xaml
index c9e8e347..a21c075e 100644
--- a/FModel/Views/Resources/Controls/TiledExplorer/Resources.xaml
+++ b/FModel/Views/Resources/Controls/TiledExplorer/Resources.xaml
@@ -34,6 +34,7 @@
+
@@ -114,4 +115,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Views/Resources/Controls/TiledExplorer/Resources.xaml.cs b/FModel/Views/Resources/Controls/TiledExplorer/Resources.xaml.cs
index d2f067d3..907a9a71 100644
--- a/FModel/Views/Resources/Controls/TiledExplorer/Resources.xaml.cs
+++ b/FModel/Views/Resources/Controls/TiledExplorer/Resources.xaml.cs
@@ -1,5 +1,7 @@
+using System;
using System.Windows.Controls;
using System.Windows.Input;
+using System.Windows.Threading;
using FModel.Services;
using FModel.ViewModels;
@@ -47,6 +49,39 @@ public partial class ResourcesDictionary
childFolder.IsSelected = true;
break;
}
+ }
+ // Hack to force re-evaluation of context menu options, also prevents menu flicker from happening
+ private void OnPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ if (sender is not ListBoxItem item)
+ return;
+ if (item.DataContext is not GameFileViewModel)
+ return;
+ var listBox = ItemsControl.ItemsControlFromItemContainer(item) as ListBox;
+ if (listBox == null)
+ return;
+
+ if (!item.IsSelected)
+ {
+ listBox.UnselectAll();
+ item.IsSelected = true;
+ }
+ item.Focus();
+
+ var contextMenu = listBox.FindResource("FileContextMenu") as ContextMenu;
+ if (contextMenu is not null)
+ {
+ listBox.ContextMenu = null;
+ item.Dispatcher.BeginInvoke(new Action(() =>
+ {
+ contextMenu.DataContext = listBox.DataContext;
+ listBox.ContextMenu = contextMenu;
+ contextMenu.PlacementTarget = listBox;
+ contextMenu.IsOpen = true;
+ }), DispatcherPriority.Input);
+ }
+
+ e.Handled = true;
}
}
diff --git a/FModel/Views/Resources/Converters/AnyItemMeetsConditionConverter.cs b/FModel/Views/Resources/Converters/AnyItemMeetsConditionConverter.cs
index c98977e9..61526c73 100644
--- a/FModel/Views/Resources/Converters/AnyItemMeetsConditionConverter.cs
+++ b/FModel/Views/Resources/Converters/AnyItemMeetsConditionConverter.cs
@@ -51,6 +51,16 @@ public interface IItemCondition
bool Matches(GameFileViewModel item);
}
+public class ItemActionCondition : IItemCondition
+{
+ public EBulkType Action { get; set; }
+
+ public bool Matches(GameFileViewModel item)
+ {
+ return item != null && item.AssetActions.HasFlag(Action);
+ }
+}
+
public class ItemCategoryCondition : IItemCondition
{
public EAssetCategory Category { get; set; }
diff --git a/FModel/Views/Resources/Converters/FileToGeometryConverter.cs b/FModel/Views/Resources/Converters/FileToGeometryConverter.cs
index d3678b72..437eefe1 100644
--- a/FModel/Views/Resources/Converters/FileToGeometryConverter.cs
+++ b/FModel/Views/Resources/Converters/FileToGeometryConverter.cs
@@ -32,25 +32,34 @@ public class FileToGeometryConverter : IMultiValueConverter
EAssetCategory.StaticMesh => ("StaticMeshIconAlt", "NeutralBrush"),
EAssetCategory.SkeletalMesh => ("SkeletalMeshIconAlt", "NeutralBrush"),
- EAssetCategory.Skeleton => ("SkeletonIcon", "NeutralBrush"),
+ EAssetCategory.CustomizableObject => ("StaticMeshIconAlt", "CustomizableObjectBrush"),
+ EAssetCategory.NaniteDisplacedMesh => ("StaticMeshIconAlt", "NaniteDisplacedMeshBrush"),
EAssetCategory.Material => ("MaterialIcon", "MaterialBrush"),
EAssetCategory.MaterialEditorData => ("MaterialIcon", "MaterialEditorBrush"),
EAssetCategory.MaterialParameterCollection => ("MaterialParameterCollectionIcon", "MaterialBrush"),
EAssetCategory.MaterialFunction => ("MaterialFunctionIcon", "MaterialBrush"),
+ EAssetCategory.MaterialFunctionEditorData => ("MaterialFunctionIcon", "MaterialEditorBrush"),
EAssetCategory.Animation => ("AnimationIconAlt", "AnimationBrush"),
+ EAssetCategory.Skeleton => ("SkeletonIcon", "NeutralBrush"),
+ EAssetCategory.Rig => ("AnimationIconAlt", "NeutralBrush"),
EAssetCategory.World => ("WorldIcon", "WorldBrush"),
EAssetCategory.BuildData => ("MapIconAlt", "BuildDataBrush"),
EAssetCategory.LevelSequence => ("ClapperIcon", "LevelSequenceBrush"),
EAssetCategory.Foliage => ("FoliageIcon", "FoliageBrush"),
- EAssetCategory.PhysicsAsset => ("PhysicsIcon", "NeutralBrush"),
- EAssetCategory.CurveBase => ("CurveIcon", "CurveBrush"),
EAssetCategory.ItemDefinitionBase => ("DataTableIcon", "NeutralBrush"),
+ EAssetCategory.CurveBase => ("CurveIcon", "CurveBrush"),
+ EAssetCategory.PhysicsAsset => ("PhysicsIcon", "NeutralBrush"),
+ EAssetCategory.ObjectRedirector => ("RedirectorIcon", "ConfigBrush"),
+ EAssetCategory.PhysicalMaterial => ("MaterialIcon", "NeutralBrush"),
EAssetCategory.Audio => ("AudioIconAlt", "AudioBrush"),
+ EAssetCategory.SoundBank => ("AudioIconAlt", "SoundBankBrush"),
+ EAssetCategory.AudioEvent => ("AudioIconAlt", "AudioEventBrush"),
+
EAssetCategory.Video => ("VideoIcon", "VideoBrush"),
EAssetCategory.Font => ("FontIcon", "NeutralBrush"),
@@ -73,6 +82,8 @@ public class FileToGeometryConverter : IMultiValueConverter
_ => ("DataTableIcon", "NeutralBrush")
},
+ EAssetCategory.ByteCode => ("CodeIcon", "CodeBrush"),
+
_ => ("AssetIcon", "NeutralBrush")
};
diff --git a/FModel/Views/Resources/Converters/FolderToGeometryConverter.cs b/FModel/Views/Resources/Converters/FolderToGeometryConverter.cs
index 15869d4c..88f83519 100644
--- a/FModel/Views/Resources/Converters/FolderToGeometryConverter.cs
+++ b/FModel/Views/Resources/Converters/FolderToGeometryConverter.cs
@@ -21,7 +21,9 @@ public class FolderToGeometryConverter : IValueConverter
{
"textures" or "texture" or "ui" or "icons" or "umgassets" or "hud" or "hdri" or "tex" => ("TextureIconAlt", "TextureBrush"),
"config" or "tags" => ("ConfigIcon", "ConfigBrush"),
- "audio" or "wwiseaudio" or "wwise" or "fmod" or "soundbanks" or "banks" or "sound" or "sounds" or "cue" => ("AudioIconAlt", "AudioBrush"),
+ "audio" or "wwiseaudio" or "wwise" or "fmod" or "sound" or "sounds" or "cue" => ("AudioIconAlt", "AudioBrush"),
+ "soundbanks" or "banks" => ("AudioIconAlt", "SoundBankBrush"),
+ "audioevent" or "audioevents" => ("AudioIconAlt", "AudioEventBrush"),
"movies" or "video" or "videos" or "cinematics" => ("VideoIcon", "VideoBrush"),
"data" or "datatable" or "datatables" => ("DataTableIcon", "DataTableBrush"),
"curves" => ("CurveIcon", "CurveBrush"),
@@ -39,6 +41,7 @@ public class FolderToGeometryConverter : IValueConverter
"locale" or "localization" or "l10n" => ("LocaleIcon", "LocalizationBrush"),
"skeleton" or "skeletons" => ("SkeletonIcon", "NeutralBrush"),
"certificate" or "certificates" => ("CertificateIcon", "NeutralBrush"),
+ "fonts" or "font" => ("FontIcon", "NeutralBrush"),
_ => (null, "NeutralBrush"),
};
diff --git a/FModel/Views/Resources/Icons.xaml b/FModel/Views/Resources/Icons.xaml
index 373635e7..93b90cc7 100644
--- a/FModel/Views/Resources/Icons.xaml
+++ b/FModel/Views/Resources/Icons.xaml
@@ -90,4 +90,6 @@
m397.529,58.225c-37.359,0-72.27,11.235-100.957,32.49-25.401,18.819-44.228,44.84-51.653,71.391-8.498,30.386-1.593,57.841 18.431,75.96-6.892,12.102-13.298,24.592-18.372,36.707-4.66-11.592-10.865-21.973-17.882-31.224 9.949-15.808 11.327-35.12 3.511-54.911-7.36-18.635-22.266-35.818-41.974-48.386-21.258-13.556-46.288-20.721-72.383-20.721-33.485,0-67.836,12.078-99.338,34.928l-16.912,12.268 20.162,5.478c33.26,9.036 59.805,34.679 83.225,57.303 23.91,23.098 46.495,44.914 72.659,44.921 0.004,0 0.008,0 0.012,0 12.875,0 25.18-5.146 37.498-15.667 11.82,16.664 20.228,37.094 20.228,61.938v127h20c0,0 0.018-122.778 0.018-129.384 0-15.96 9.362-39.486 26.042-68.882 12.387,6.689 23.962,9.954 35.235,9.954 36.76,0 60.665-35.173 85.974-72.41 22.59-33.238 48.194-70.911 86.29-90.421l18.581-9.516-19.061-8.516c-30.153-13.47-60.209-20.3-89.334-20.3zm-221.471,196.203c-0.002,0-0.004,0-0.007,0-18.085-0.005-36.938-18.218-58.768-39.306-20.663-19.961-43.588-42.108-72.305-55.135 23.345-13.586 47.248-20.456 71.272-20.456 48.227,0 84.676,28.4 95.755,56.453 2.869,7.266 5.835,19.295 0.99,31.335-17.942-18.216-37.69-30.663-49.979-38.408-3.594-2.266-6.698-4.222-8.771-5.695l-11.59,16.299c2.526,1.797 5.85,3.892 9.697,6.316 12.659,7.979 31.868,20.09 48.451,37.523-8.638,7.436-16.76,11.074-24.745,11.074zm208.452-78.693c-23.213,34.155-43.261,63.652-69.432,63.652-7.676,0-15.897-2.358-24.996-7.165 0.894-1.439 1.797-2.886 2.722-4.348 19.815-31.329 39.938-56.696 40.139-56.949l-15.649-12.454c-1.715,2.155-22.828,28.846-43.394,61.905-12.095-13.03-15.666-31.622-9.72-52.884 6.252-22.354 22.397-44.482 44.298-60.708 17.584-13.028 47.309-28.56 89.051-28.56 20.458,0 41.53,3.779 62.861,11.258-32.716,22.745-55.46,56.209-75.88,86.253z
M165.446 34.793c-23.17.023-45.634 12.97-54.612 36.323l-83.67 326.167c-12.673 94.537 81.04 88.742 137.957 65.396 81.422-33.396 181.723-29.213 263.244-8.26l6.45-17.218c-7.38-2.638-15.334-5.988-22.252-8.039.473-4.364.955-8.72 1.437-13.074l23.038 4.118 3.234-18.1c-8.074-1.441-16.147-2.885-24.221-4.328.615-5.403 1.238-10.799 1.87-16.189l22.134 3.278 2.693-18.186c-7.548-1.12-15.098-2.238-22.647-3.355.456-3.765.91-7.53 1.375-11.29 7.615 1.092 15.231 2.183 22.847 3.273l2.607-18.2-23.164-3.316c.46-3.593 1.29-9.988 1.76-13.577l22.781 2.55 2.045-17.57c-7.467-.834-14.935-1.671-22.402-2.508.783-5.767 1.917-11.182 2.728-16.943 7.67 1.12 15.341 2.244 23.012 3.368l2.31-17.139c-7.683-1.127-15.366-2.25-23.05-3.374.792-5.415 1.252-10.129 2.071-15.542 7.074 1.264 14.149 2.528 21.223 3.79l3.232-18.1-21.654-3.866c.736-4.676 1.473-9.35 2.23-14.026 6.978 1.673 13.955 3.347 20.932 5.022L465.276 208c-7.401-1.778-14.803-3.554-22.204-5.33a2809.25 2809.25 0 0 1 2.132-12.477c6.98 1.583 13.961 3.165 20.942 4.746l4.064-17.93c-7.271-1.65-14.543-3.298-21.815-4.946.769-4.267 1.55-8.535 2.342-12.805l20.742 5.151 4.431-17.843-21.751-5.405c.741-3.847 1.494-7.696 2.254-11.548l20.28 5.014 4.413-17.849-21.057-5.207a2444.47 2444.47 0 0 1 2.571-12.374c8.386 2.41 13.13 2.364 21.41 4.99L486 88.456c-83.808-26.776-179.25-33.22-244.192-6.453-24.337 114.036-37.305 221.4-68.032 338.64-3.407 13-14.47 21.89-27.342 28.064-27 11.608-64.033 13.778-84.63-4.91-10.971-10.34-16.174-27.036-12.467-47.579 2.303-12.762 10.883-21.986 20.834-26.378 19.749-7.074 43.492-4.25 58.893 7.95 12.463 9.302 12.318 38.283-3.882 31.82-9.639-6.17-1.964-11.851-8.615-17.378-11.6-7.428-26.42-10.872-38.972-5.57-5.564 2.455-8.887 5.737-10.166 12.822-2.94 16.29.685 24.996 6.985 30.933 18.333 13.49 45.279 10.495 64.068 1.712 10.045-4.82 16.277-11.436 17.511-16.147 30.538-116.518 43.443-224.123 68.293-339.964-11.796-28.344-35.67-41.247-58.84-41.225z M341 395l-36 -40 -45 20 3 -13 24 -11c5,-2 9,-4 11,-5 -2,-2 -5,-5 -8,-8l-19 -21 2 -12 33 36 49 -22 -3 13 -33 15c-2,1 -4,2 -6,2 2,2 4,4 5,5l24 26 -3 13zm-15 -177l-10 54 -9 -2 10 -54 9 2zm25 5l-10 54 -9 -2 10 -54 9 2zm39 -76l-2 10 -64 -12c2,3 4,6 5,11 2,4 3,8 3,12l-10 -2c-2,-6 -4,-12 -7,-17 -3,-5 -6,-9 -9,-11l1 -6 82 16z
M4,3C2.89,3 2,3.89 2,5V15A2,2 0 0,0 4,17H12V22L15,19L18,22V17H20A2,2 0 0,0 22,15V8L22,6V5A2,2 0 0,0 20,3H16V3H4M12,5L15,7L18,5V8.5L21,10L18,11.5V15L15,13L12,15V11.5L9,10L12,8.5V5M4,5H9V7H4V5M4,9H7V11H4V9M4,13H9V15H4V13Z
+ M289.718,1208.22 L283.795,1202.28 C283.404,1201.89 282.768,1201.89 282.376,1202.28 C281.984,1202.68 282,1203.35 282,1204 L282,1207 L266,1207 L266,1204 C266,1203.35 266.016,1202.68 265.624,1202.28 C265.232,1201.89 264.597,1201.89 264.205,1202.28 L258.282,1208.22 C258.073,1208.43 257.983,1208.71 257.998,1208.98 C257.983,1209.26 258.073,1209.54 258.282,1209.75 L264.205,1215.69 C264.597,1216.08 265.232,1216.08 265.624,1215.69 C266.016,1215.29 266,1214.39 266,1214 L266,1211 L282,1211 L282,1214 C282,1214.65 281.984,1215.29 282.376,1215.69 C282.768,1216.08 283.404,1216.08 283.795,1215.69 L289.718,1209.75 C289.927,1209.54 290.017,1209.26 290.002,1208.98 C290.017,1208.71 289.927,1208.43 289.718,1208.22
+ M13,9H18.5L13,3.5V9M6,2H14L20,8V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V4C4,2.89 4.89,2 6,2M6.12,15.5L9.86,19.24L11.28,17.83L8.95,15.5L11.28,13.17L9.86,11.76L6.12,15.5M17.28,15.5L13.54,11.76L12.12,13.17L14.45,15.5L12.12,17.83L13.54,19.24L17.28,15.5Z
diff --git a/FModel/Views/Resources/Resources.xaml b/FModel/Views/Resources/Resources.xaml
index c65d4fca..6f0ab0d2 100644
--- a/FModel/Views/Resources/Resources.xaml
+++ b/FModel/Views/Resources/Resources.xaml
@@ -215,25 +215,48 @@
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1976,4 +2072,79 @@
+
+
diff --git a/FModel/Views/SearchView.xaml b/FModel/Views/SearchView.xaml
index 42095bc2..1b37d87a 100644
--- a/FModel/Views/SearchView.xaml
+++ b/FModel/Views/SearchView.xaml
@@ -197,7 +197,7 @@
-
+
diff --git a/FModel/Views/SearchView.xaml.cs b/FModel/Views/SearchView.xaml.cs
index 31458820..e1499a39 100644
--- a/FModel/Views/SearchView.xaml.cs
+++ b/FModel/Views/SearchView.xaml.cs
@@ -43,9 +43,6 @@ public partial class SearchView
public void FocusTab(ESearchViewTab view)
{
- if (_currentTab == view)
- return;
-
_currentTab = view;
SearchTabControl.SelectedIndex = view switch
{
@@ -53,6 +50,7 @@ public partial class SearchView
ESearchViewTab.RefView => 1,
_ => SearchTabControl.SelectedIndex
};
+ WindowState = WindowState.Normal;
CurrentTextBox?.Focus();
CurrentTextBox?.SelectAll();
}
diff --git a/FModel/Views/Snooper/Options.cs b/FModel/Views/Snooper/Options.cs
index aa821f8f..e9d1520b 100644
--- a/FModel/Views/Snooper/Options.cs
+++ b/FModel/Views/Snooper/Options.cs
@@ -247,7 +247,7 @@ public class Options
{
return _game switch
{
- "LIESOFP" => true,
+ "LIESOFP" or "CODEVEIN2" => true,
_ => false,
};
}