Skip to content

Commit 669b07f

Browse files
authored
Overall improvements (#633)
1 parent 31d426f commit 669b07f

18 files changed

+684
-302
lines changed

FModel/Enums.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ public enum EBulkType
104104
Properties = 1 << 1,
105105
Textures = 1 << 2,
106106
Meshes = 1 << 3,
107-
Skeletons = 1 << 4,
108-
Animations = 1 << 5,
109-
Audio = 1 << 6
107+
Animations = 1 << 4,
108+
Audio = 1 << 5,
109+
Code = 1 << 6,
110110
}
111111

112112
public enum EAssetCategory : uint
@@ -125,14 +125,18 @@ public enum EAssetCategory : uint
125125
Mesh = AssetCategoryExtensions.CategoryBase + (2 << 16),
126126
StaticMesh = Mesh + 1,
127127
SkeletalMesh = Mesh + 2,
128-
Skeleton = Mesh + 3,
128+
CustomizableObject = Mesh + 3,
129+
NaniteDisplacedMesh = Mesh + 4,
129130
Texture = AssetCategoryExtensions.CategoryBase + (3 << 16),
130131
Materials = AssetCategoryExtensions.CategoryBase + (4 << 16),
131132
Material = Materials + 1,
132133
MaterialEditorData = Materials + 2,
133134
MaterialFunction = Materials + 3,
134-
MaterialParameterCollection = Materials + 4,
135+
MaterialFunctionEditorData = Materials + 4,
136+
MaterialParameterCollection = Materials + 5,
135137
Animation = AssetCategoryExtensions.CategoryBase + (5 << 16),
138+
Skeleton = Animation + 1,
139+
Rig = Animation + 2,
136140
Level = AssetCategoryExtensions.CategoryBase + (6 << 16),
137141
World = Level + 1,
138142
BuildData = Level + 2,
@@ -142,9 +146,14 @@ public enum EAssetCategory : uint
142146
ItemDefinitionBase = Data + 1,
143147
CurveBase = Data + 2,
144148
PhysicsAsset = Data + 3,
149+
ObjectRedirector = Data + 4,
150+
PhysicalMaterial = Data + 5,
151+
ByteCode = Data + 6,
145152
Media = AssetCategoryExtensions.CategoryBase + (8 << 16),
146153
Audio = Media + 1,
147154
Video = Media + 2,
148155
Font = Media + 3,
156+
SoundBank = Media + 4,
157+
AudioEvent = Media + 5,
149158
Particle = AssetCategoryExtensions.CategoryBase + (9 << 16),
150159
}

FModel/MainWindow.xaml

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -535,17 +535,27 @@
535535
<ToggleButton Width="32"
536536
Height="32"
537537
Cursor="Hand"
538-
Margin="0, 0, 2, 0"
538+
Margin="0,0,2,0"
539+
IsChecked="{Binding IsAssetsExplorerVisible, Mode=TwoWay}"
540+
Style="{StaticResource AssetsExplorerToggleButtonStyle}" />
541+
<ToggleButton Width="32"
542+
Height="32"
543+
Cursor="Hand"
539544
Checked="OnPreviewTexturesToggled"
540545
Focusable="False"
541546
IsChecked="{Binding PreviewTexturesAssetExplorer, Source={x:Static settings:UserSettings.Default}, Mode=TwoWay}">
542547
<ToggleButton.Style>
543-
<Style TargetType="ToggleButton" BasedOn="{StaticResource ModernToggleButtonStyle}">
544-
<Setter Property="ToolTip" Value="Preview Textures (OFF)" />
548+
<Style TargetType="ToggleButton"
549+
BasedOn="{StaticResource ModernToggleButtonStyle}">
550+
<Setter Property="ToolTip"
551+
Value="Preview Textures (OFF)" />
545552
<Style.Triggers>
546-
<Trigger Property="IsChecked" Value="True">
547-
<Setter Property="Background" Value="MediumPurple" />
548-
<Setter Property="ToolTip" Value="Preview Textures (ON)" />
553+
<Trigger Property="IsChecked"
554+
Value="True">
555+
<Setter Property="Background"
556+
Value="MediumPurple" />
557+
<Setter Property="ToolTip"
558+
Value="Preview Textures (ON)" />
549559
</Trigger>
550560
</Style.Triggers>
551561
</Style>
@@ -559,40 +569,6 @@
559569
</Canvas>
560570
</Viewbox>
561571
</ToggleButton>
562-
<ToggleButton Width="32"
563-
Height="32"
564-
Cursor="Hand"
565-
Margin="0, 0, 2, 0"
566-
Checked="OnPreviewTexturesToggled"
567-
ToolTip="Assets Explorer"
568-
Focusable="False"
569-
IsChecked="{Binding IsAssetsExplorerVisible, Mode=TwoWay}"
570-
Style="{StaticResource ModernToggleButtonStyle}">
571-
<Viewbox Width="16"
572-
Height="16">
573-
<Canvas Width="24"
574-
Height="24">
575-
<Path Data="{StaticResource FolderIconAlt}"
576-
Fill="{DynamicResource {x:Static adonisUi:Brushes.ForegroundBrush}}" />
577-
</Canvas>
578-
</Viewbox>
579-
</ToggleButton>
580-
<ToggleButton Width="32"
581-
Height="32"
582-
Cursor="Hand"
583-
ToolTip="File Properties"
584-
Focusable="False"
585-
IsChecked="{Binding IsAssetsExplorerVisible, Converter={x:Static converters:InvertBooleanConverter.Instance}, Mode=TwoWay}"
586-
Style="{StaticResource ModernToggleButtonStyle}">
587-
<Viewbox Width="16"
588-
Height="16">
589-
<Canvas Width="24"
590-
Height="24">
591-
<Path Data="{StaticResource AssetIcon}"
592-
Fill="{DynamicResource {x:Static adonisUi:Brushes.ForegroundBrush}}" />
593-
</Canvas>
594-
</Viewbox>
595-
</ToggleButton>
596572
</StackPanel>
597573
</Border>
598574

FModel/ViewModels/CUE4ParseViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
using CUE4Parse.FileProvider.Vfs;
2222
using CUE4Parse.GameTypes.Aion2.Objects;
2323
using CUE4Parse.GameTypes.AshEchoes.FileProvider;
24-
using CUE4Parse.GameTypes.KRD.Assets.Exports;
2524
using CUE4Parse.GameTypes.SMG.UE4.Assets.Exports.Wwise;
25+
using CUE4Parse.GameTypes.KRD.Assets.Exports;
2626
using CUE4Parse.MappingsProvider;
2727
using CUE4Parse.UE4.AssetRegistry;
2828
using CUE4Parse.UE4.Assets;

FModel/ViewModels/GameFileViewModel.cs

Lines changed: 91 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@
99
using CUE4Parse.FileProvider.Objects;
1010
using CUE4Parse.GameTypes.FN.Assets.Exports.DataAssets;
1111
using CUE4Parse.GameTypes.SMG.UE4.Assets.Exports.Wwise;
12+
using CUE4Parse.GameTypes.SMG.UE4.Assets.Objects;
1213
using CUE4Parse.UE4.Assets;
14+
using CUE4Parse.UE4.Assets.Exports;
1315
using CUE4Parse.UE4.Assets.Exports.Animation;
1416
using CUE4Parse.UE4.Assets.Exports.BuildData;
1517
using CUE4Parse.UE4.Assets.Exports.Component;
1618
using CUE4Parse.UE4.Assets.Exports.CriWare;
19+
using CUE4Parse.UE4.Assets.Exports.CustomizableObject;
1720
using CUE4Parse.UE4.Assets.Exports.Engine;
1821
using CUE4Parse.UE4.Assets.Exports.Engine.Font;
1922
using CUE4Parse.UE4.Assets.Exports.Fmod;
@@ -22,6 +25,7 @@
2225
using CUE4Parse.UE4.Assets.Exports.LevelSequence;
2326
using CUE4Parse.UE4.Assets.Exports.Material;
2427
using CUE4Parse.UE4.Assets.Exports.Material.Editor;
28+
using CUE4Parse.UE4.Assets.Exports.Nanite;
2529
using CUE4Parse.UE4.Assets.Exports.Niagara;
2630
using CUE4Parse.UE4.Assets.Exports.SkeletalMesh;
2731
using CUE4Parse.UE4.Assets.Exports.Sound;
@@ -88,6 +92,16 @@ private set
8892
}
8993
}
9094

95+
private EBulkType _assetActions = EBulkType.None;
96+
public EBulkType AssetActions
97+
{
98+
get => _assetActions;
99+
private set
100+
{
101+
SetProperty(ref _assetActions, value);
102+
}
103+
}
104+
91105
private ImageSource _previewImage;
92106
public ImageSource PreviewImage
93107
{
@@ -101,6 +115,13 @@ private set
101115
}
102116
}
103117

118+
private int _numTextures = 0;
119+
public int NumTextures
120+
{
121+
get => _numTextures;
122+
private set => SetProperty(ref _numTextures, value);
123+
}
124+
104125
public Task ExtractAsync()
105126
=> ApplicationService.ThreadWorkerView.Begin(cancellationToken =>
106127
_applicationView.CUE4Parse.ExtractSelected(cancellationToken, [Asset]));
@@ -142,13 +163,15 @@ private Task ResolveByPackageAsync(EResolveCompute resolve)
142163
if (Asset.Extension is "umap")
143164
{
144165
AssetCategory = EAssetCategory.World;
166+
AssetActions = EBulkType.Meshes | EBulkType.Textures | EBulkType.Audio | EBulkType.Code;
145167
ResolvedAssetType = "World";
146168
Resolved |= EResolveCompute.Preview;
147169
return Task.CompletedTask;
148170
}
149171
if (Asset.NameWithoutExtension.EndsWith("_BuiltData"))
150172
{
151173
AssetCategory = EAssetCategory.BuildData;
174+
AssetActions = EBulkType.Textures;
152175
ResolvedAssetType = "MapBuildDataRegistry";
153176
Resolved |= EResolveCompute.Preview;
154177
return Task.CompletedTask;
@@ -172,49 +195,59 @@ private Task ResolveByPackageAsync(EResolveCompute resolve)
172195
var dummy = ((AbstractUePackage) pkg).ConstructObject(pointer.Class?.Object?.Value as UStruct, pkg);
173196
ResolvedAssetType = dummy.ExportType;
174197

175-
AssetCategory = dummy switch
198+
(AssetCategory, AssetActions) = dummy switch
176199
{
177-
URigVMBlueprintGeneratedClass => EAssetCategory.RigVMBlueprintGeneratedClass,
178-
UAnimBlueprintGeneratedClass => EAssetCategory.AnimBlueprintGeneratedClass,
179-
UWidgetBlueprintGeneratedClass => EAssetCategory.WidgetBlueprintGeneratedClass,
180-
UBlueprintGeneratedClass or UFunction => EAssetCategory.BlueprintGeneratedClass,
181-
UUserDefinedEnum => EAssetCategory.UserDefinedEnum,
182-
UUserDefinedStruct => EAssetCategory.UserDefinedStruct,
183-
UBlueprintCore => EAssetCategory.Blueprint,
184-
UClassCookedMetaData or UStructCookedMetaData or UEnumCookedMetaData => EAssetCategory.CookedMetaData,
185-
186-
UStaticMesh => EAssetCategory.StaticMesh,
187-
USkeletalMesh => EAssetCategory.SkeletalMesh,
188-
UPhysicsAsset => EAssetCategory.PhysicsAsset,
189-
190-
UTexture => EAssetCategory.Texture,
191-
192-
UMaterialInterface => EAssetCategory.Material,
193-
UMaterialInterfaceEditorOnlyData => EAssetCategory.MaterialEditorData,
194-
UMaterialFunction => EAssetCategory.MaterialFunction,
195-
UMaterialParameterCollection => EAssetCategory.MaterialParameterCollection,
196-
197-
UAnimationAsset => EAssetCategory.Animation,
198-
USkeleton => EAssetCategory.Skeleton,
199-
200-
UWorld => EAssetCategory.World,
201-
UMapBuildDataRegistry => EAssetCategory.BuildData,
202-
ULevelSequence => EAssetCategory.LevelSequence,
203-
UFoliageType => EAssetCategory.Foliage,
204-
205-
UItemDefinitionBase => EAssetCategory.ItemDefinitionBase,
206-
UDataAsset or UDataTable or UCurveTable or UStringTable => EAssetCategory.Data,
207-
UCurveBase => EAssetCategory.CurveBase,
208-
209-
UWwiseAssetLibrary or USoundBase or UAkMediaAssetData or UAtomWaveBank or USoundAtomCue
210-
or UAtomCueSheet or USoundAtomCueSheet or UFMODBank or UFMODEvent or UAkAudioType
211-
or UExternalSource or UExternalSourceBank => EAssetCategory.Audio,
212-
UFileMediaSource => EAssetCategory.Video,
213-
UFont or UFontFace => EAssetCategory.Font,
214-
215-
UNiagaraSystem or UNiagaraScriptBase or UParticleSystem => EAssetCategory.Particle,
216-
217-
_ => EAssetCategory.All
200+
URigVMBlueprintGeneratedClass => (EAssetCategory.RigVMBlueprintGeneratedClass, EBulkType.Code),
201+
UAnimBlueprintGeneratedClass => (EAssetCategory.AnimBlueprintGeneratedClass, EBulkType.Code),
202+
UWidgetBlueprintGeneratedClass => (EAssetCategory.WidgetBlueprintGeneratedClass, EBulkType.Code),
203+
UBlueprintGeneratedClass or UFunction => (EAssetCategory.BlueprintGeneratedClass, EBulkType.Code),
204+
UUserDefinedEnum => (EAssetCategory.UserDefinedEnum, EBulkType.None),
205+
UUserDefinedStruct => (EAssetCategory.UserDefinedStruct, EBulkType.Code),
206+
UBlueprintCore => (EAssetCategory.Blueprint, EBulkType.Code),
207+
UClassCookedMetaData or UStructCookedMetaData or UEnumCookedMetaData => (EAssetCategory.CookedMetaData, EBulkType.None),
208+
209+
UStaticMesh => (EAssetCategory.StaticMesh, EBulkType.Meshes),
210+
USkeletalMesh => (EAssetCategory.SkeletalMesh, EBulkType.Meshes),
211+
UCustomizableObject => (EAssetCategory.CustomizableObject, EBulkType.None),
212+
UNaniteDisplacedMesh => (EAssetCategory.NaniteDisplacedMesh, EBulkType.None),
213+
214+
UTexture => (EAssetCategory.Texture, EBulkType.Textures),
215+
216+
UMaterialInterface => (EAssetCategory.Material, EBulkType.None),
217+
UMaterialInterfaceEditorOnlyData => (EAssetCategory.MaterialEditorData, EBulkType.None),
218+
UMaterialFunction => (EAssetCategory.MaterialFunction, EBulkType.None),
219+
UMaterialFunctionEditorOnlyData => (EAssetCategory.MaterialFunctionEditorData, EBulkType.None),
220+
UMaterialParameterCollection => (EAssetCategory.MaterialParameterCollection, EBulkType.None),
221+
222+
UAnimationAsset => (EAssetCategory.Animation, EBulkType.Animations),
223+
USkeleton => (EAssetCategory.Skeleton, EBulkType.Meshes),
224+
URig => (EAssetCategory.Rig, EBulkType.None),
225+
226+
UWorld => (EAssetCategory.World, EBulkType.Meshes | EBulkType.Textures | EBulkType.Audio | EBulkType.Code),
227+
UMapBuildDataRegistry => (EAssetCategory.BuildData, EBulkType.Textures),
228+
ULevelSequence => (EAssetCategory.LevelSequence, EBulkType.Code),
229+
UFoliageType => (EAssetCategory.Foliage, EBulkType.None),
230+
231+
UItemDefinitionBase => (EAssetCategory.ItemDefinitionBase, EBulkType.Textures),
232+
UDataAsset or UDataTable or UCurveTable or UStringTable => (EAssetCategory.Data, EBulkType.None),
233+
UCurveBase => (EAssetCategory.CurveBase, EBulkType.None),
234+
UPhysicsAsset => (EAssetCategory.PhysicsAsset, EBulkType.None),
235+
UObjectRedirector => (EAssetCategory.ObjectRedirector, EBulkType.None),
236+
UPhysicalMaterial => (EAssetCategory.PhysicalMaterial, EBulkType.None),
237+
238+
USoundAtomCue or UAkAudioEvent or USoundCue or UFMODEvent => (EAssetCategory.AudioEvent, EBulkType.Audio),
239+
240+
UFMODBank or UAkAudioBank or UAtomWaveBank or UAkInitBank => (EAssetCategory.SoundBank, EBulkType.Audio),
241+
242+
UWwiseAssetLibrary or USoundBase or UAkMediaAssetData or UAtomCueSheet
243+
or USoundAtomCueSheet or UAkAudioType or UExternalSource or UExternalSourceBank => (EAssetCategory.Audio, EBulkType.Audio),
244+
245+
UFileMediaSource => (EAssetCategory.Video, EBulkType.None),
246+
UFont or UFontFace or USMGLocaleFontUMG => (EAssetCategory.Font, EBulkType.None),
247+
248+
UNiagaraSystem or UNiagaraScriptBase or UParticleSystem => (EAssetCategory.Particle, EBulkType.None),
249+
250+
_ => (EAssetCategory.All, EBulkType.None),
218251
};
219252

220253
switch (AssetCategory)
@@ -224,6 +257,9 @@ or UAtomCueSheet or USoundAtomCueSheet or UFMODBank or UFMODEvent or UAkAudioTyp
224257
if (!resolve.HasFlag(EResolveCompute.Preview))
225258
break;
226259

260+
if (pointer.Object.Value is UTexture2DArray textureArray && textureArray.GetFirstMip() is { SizeZ: > 1 } firstMip)
261+
NumTextures = firstMip.SizeZ;
262+
227263
var img = texture.Decode(MaxPreviewSize, UserSettings.Default.CurrentDir.TexturePlatform);
228264
if (img != null)
229265
{
@@ -297,18 +333,25 @@ private Task ResolveByExtensionAsync(EResolveCompute resolve)
297333
case "xml":
298334
AssetCategory = EAssetCategory.Data;
299335
break;
336+
case "ushaderbytecode":
337+
AssetCategory = EAssetCategory.ByteCode;
338+
break;
300339
case "wav":
301-
case "bank":
302-
case "bnk":
303-
case "pck":
304-
case "awb":
305-
case "acb":
340+
case "awb": // This is technically soundbank and should be below but I want it to be distinguishable from "acb"
306341
case "xvag":
307342
case "flac":
308343
case "at9":
309344
case "wem":
310345
case "ogg":
311346
AssetCategory = EAssetCategory.Audio;
347+
AssetActions = EBulkType.Audio;
348+
break;
349+
case "acb":
350+
case "bank":
351+
case "bnk":
352+
case "pck":
353+
AssetCategory = EAssetCategory.SoundBank;
354+
AssetActions = EBulkType.Audio;
312355
break;
313356
case "ufont":
314357
case "otf":
@@ -325,6 +368,7 @@ private Task ResolveByExtensionAsync(EResolveCompute resolve)
325368
{
326369
Resolved |= ~EResolveCompute.Preview;
327370
AssetCategory = EAssetCategory.Texture;
371+
AssetActions = EBulkType.Textures;
328372
if (!resolve.HasFlag(EResolveCompute.Preview))
329373
break;
330374

FModel/Views/Resources/Colors.xaml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,23 @@
1010
<SolidColorBrush x:Key="CookedMetaDataBrush" Color="Yellow" />
1111
<SolidColorBrush x:Key="UserDefinedEnumBrush" Color="DarkGoldenrod" />
1212
<SolidColorBrush x:Key="UserDefinedStructBrush" Color="Tan" />
13-
13+
14+
<SolidColorBrush x:Key="CustomizableObjectBrush" Color="DarkRed" />
15+
<SolidColorBrush x:Key="NaniteDisplacedMeshBrush" Color="ForestGreen" />
16+
1417
<SolidColorBrush x:Key="MaterialBrush" Color="BurlyWood" />
1518
<SolidColorBrush x:Key="MaterialEditorBrush" Color="Yellow" />
1619

20+
<SolidColorBrush x:Key="RigBrush" Color="YellowGreen" />
21+
1722
<SolidColorBrush x:Key="BinaryBrush" Color="Yellow" />
1823
<SolidColorBrush x:Key="TextureBrush" Color="MediumPurple" />
1924
<SolidColorBrush x:Key="ConfigBrush" Color="LightSlateGray" />
25+
2026
<SolidColorBrush x:Key="AudioBrush" Color="MediumSeaGreen" />
27+
<SolidColorBrush x:Key="SoundBankBrush" Color="DarkSeaGreen" />
28+
<SolidColorBrush x:Key="AudioEventBrush" Color="DarkTurquoise" />
29+
2130
<SolidColorBrush x:Key="VideoBrush" Color="IndianRed" />
2231
<SolidColorBrush x:Key="DataTableBrush" Color="SteelBlue" />
2332
<SolidColorBrush x:Key="CurveBrush" Color="HotPink" />
@@ -32,4 +41,5 @@
3241
<SolidColorBrush x:Key="AnimationBrush" Color="Coral" />
3342
<SolidColorBrush x:Key="LuaBrush" Color="DarkBlue" />
3443
<SolidColorBrush x:Key="JsonXmlBrush" Color="LightGreen" />
44+
<SolidColorBrush x:Key="CodeBrush" Color="SandyBrown" />
3545
</ResourceDictionary>

0 commit comments

Comments
 (0)