Skip to content

Commit 395440d

Browse files
authored
Fix asset scan startup crash (#4554)
* Fix calling managed AssetScanComplete to early Editor::AssetSystem::AssetScanComplete(); was called at the end of PruneStaleAssets() in the UpdateMods() path. Before BuildDependencyData() ran, which is unsafe since AssetScanComplete() needs full dependency infomration * Restore some menu transients that shouldnt have been pruned * Don't orphan assets if they have a parent * Dont Oprhan menu transients, they may be referenced by otehr projects (yikes)
1 parent 675dbc8 commit 395440d

File tree

5 files changed

+29
-1
lines changed

5 files changed

+29
-1
lines changed

engine/Sandbox.Tools/Assets/Asset.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,12 @@ public void RebuildThumbnail( bool startBuild = true )
203203
/// <param name="deep">Whether to recurse. For example, will also include maps that are using models which use this material asset, as opposed to returning just the models.</param>
204204
public abstract List<Asset> GetDependants( bool deep );
205205

206+
/// <summary>
207+
/// Returns assets that are parents of this asset (i.e. this asset is a compiled child resource of the returned assets).
208+
/// </summary>
209+
/// <param name="deep">Whether to recurse up the parent chain.</param>
210+
public abstract List<Asset> GetParents( bool deep );
211+
206212
List<Asset> GetAssetList( NativeEngine.CUtlVectorAsset v, bool free )
207213
{
208214
var l = new List<Asset>();

engine/Sandbox.Tools/Assets/AssetSystem.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,11 +274,17 @@ public static Asset RegisterFile( string absoluteFilePath )
274274
/// </summary>
275275
public static void DeleteOrphans()
276276
{
277+
// Only delete orphans from the current project's transient folder.
278+
// Engine-shipped transients (e.g. addons/menu/Transients/) are shared
279+
// across all projects and must not be deleted.
280+
var transientRoot = FileSystem.Transient?.GetFullPath( "/" )?.NormalizeFilename( false );
281+
277282
var orphans = All
278283
.Where( x => x.IsTrivialChild )
279284
.Where( x => !x.IsDeleted )
280285
.Where( x => x.AssetType == AssetType.Texture ) // Note - gib models can be trivial children too, but I don't want to push my luck
281-
.Where( x => x.GetDependants( false ).Count == 0 )
286+
.Where( x => transientRoot is not null && x.AbsolutePath.StartsWith( transientRoot, StringComparison.OrdinalIgnoreCase ) )
287+
.Where( x => x.GetDependants( false ).Count == 0 && x.GetParents( false ).Count == 0 )
282288
.ToArray();
283289

284290
foreach ( var o in orphans )

engine/Sandbox.Tools/Assets/EmbeddedAsset/EmbeddedAsset.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ public override List<Asset> GetDependants( bool deep )
6565
return [];
6666
}
6767

68+
public override List<Asset> GetParents( bool deep )
69+
{
70+
return [];
71+
}
72+
6873
public override List<string> GetAdditionalContentFiles()
6974
{
7075
return [];

engine/Sandbox.Tools/Assets/MountAsset/MountAsset.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public override void OpenInEditor( string nativeEditor = null ) { } // I don't t
4747

4848
public override List<Asset> GetReferences( bool deep ) => new List<Asset>();
4949
public override List<Asset> GetDependants( bool deep ) => new List<Asset>();
50+
public override List<Asset> GetParents( bool deep ) => new List<Asset>();
5051
public override List<string> GetAdditionalContentFiles() => new List<string>();
5152
public override List<string> GetAdditionalGameFiles() => new List<string>();
5253
public override List<string> GetInputDependencies() => new List<string>();

engine/Sandbox.Tools/Assets/NativeAsset/NativeAsset.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,16 @@ public override List<Asset> GetDependants( bool deep )
150150
return GetAssetList( list, true );
151151
}
152152

153+
/// <summary>
154+
/// Returns assets that are parents of this asset.
155+
/// </summary>
156+
public override List<Asset> GetParents( bool deep )
157+
{
158+
var list = NativeEngine.CUtlVectorAsset.Create( 4, 4 );
159+
native.GetAssetsParentingMe( list, deep );
160+
return GetAssetList( list, true );
161+
}
162+
153163
List<Asset> GetAssetList( NativeEngine.CUtlVectorAsset v, bool free )
154164
{
155165
var l = new List<Asset>();

0 commit comments

Comments
 (0)