99using CUE4Parse . FileProvider . Objects ;
1010using CUE4Parse . GameTypes . FN . Assets . Exports . DataAssets ;
1111using CUE4Parse . GameTypes . SMG . UE4 . Assets . Exports . Wwise ;
12+ using CUE4Parse . GameTypes . SMG . UE4 . Assets . Objects ;
1213using CUE4Parse . UE4 . Assets ;
14+ using CUE4Parse . UE4 . Assets . Exports ;
1315using CUE4Parse . UE4 . Assets . Exports . Animation ;
1416using CUE4Parse . UE4 . Assets . Exports . BuildData ;
1517using CUE4Parse . UE4 . Assets . Exports . Component ;
1618using CUE4Parse . UE4 . Assets . Exports . CriWare ;
19+ using CUE4Parse . UE4 . Assets . Exports . CustomizableObject ;
1720using CUE4Parse . UE4 . Assets . Exports . Engine ;
1821using CUE4Parse . UE4 . Assets . Exports . Engine . Font ;
1922using CUE4Parse . UE4 . Assets . Exports . Fmod ;
2225using CUE4Parse . UE4 . Assets . Exports . LevelSequence ;
2326using CUE4Parse . UE4 . Assets . Exports . Material ;
2427using CUE4Parse . UE4 . Assets . Exports . Material . Editor ;
28+ using CUE4Parse . UE4 . Assets . Exports . Nanite ;
2529using CUE4Parse . UE4 . Assets . Exports . Niagara ;
2630using CUE4Parse . UE4 . Assets . Exports . SkeletalMesh ;
2731using 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
0 commit comments