diff --git a/Source/Editor/Content/Proxy/SceneProxy.cs b/Source/Editor/Content/Proxy/SceneProxy.cs index 78d88b440..004c2aed7 100644 --- a/Source/Editor/Content/Proxy/SceneProxy.cs +++ b/Source/Editor/Content/Proxy/SceneProxy.cs @@ -30,6 +30,12 @@ namespace FlaxEditor.Content return item is SceneItem; } + /// + public override bool AcceptsAsset(string typeName, string path) + { + return (typeName == Scene.AssetTypename || typeName == Scene.EditorPickerTypename) && path.EndsWith(FileExtension, StringComparison.OrdinalIgnoreCase); + } + /// public override bool CanCreate(ContentFolder targetLocation) { diff --git a/Source/Editor/Content/Thumbnails/ThumbnailsModule.cs b/Source/Editor/Content/Thumbnails/ThumbnailsModule.cs index 160c783ed..1282e4daa 100644 --- a/Source/Editor/Content/Thumbnails/ThumbnailsModule.cs +++ b/Source/Editor/Content/Thumbnails/ThumbnailsModule.cs @@ -406,18 +406,16 @@ namespace FlaxEditor.Content.Thumbnails for (int i = 0; i < maxChecks; i++) { var request = _requests[i]; - try { if (request.IsReady) - { return request; - } } catch (Exception ex) { - Editor.LogWarning(ex); Editor.LogWarning($"Failed to prepare thumbnail rendering for {request.Item.ShortName}."); + Editor.LogWarning(ex); + _requests.RemoveAt(i--); } } @@ -515,7 +513,6 @@ namespace FlaxEditor.Content.Thumbnails for (int i = 0; i < checks; i++) { var request = _requests[i]; - try { if (request.IsReady) @@ -529,8 +526,9 @@ namespace FlaxEditor.Content.Thumbnails } catch (Exception ex) { - Editor.LogWarning(ex); Editor.LogWarning($"Failed to prepare thumbnail rendering for {request.Item.ShortName}."); + Editor.LogWarning(ex); + _requests.RemoveAt(i--); } } diff --git a/Source/Editor/Modules/ContentDatabaseModule.cs b/Source/Editor/Modules/ContentDatabaseModule.cs index b1de78456..80f419a6f 100644 --- a/Source/Editor/Modules/ContentDatabaseModule.cs +++ b/Source/Editor/Modules/ContentDatabaseModule.cs @@ -811,10 +811,9 @@ namespace FlaxEditor.Modules { if (node == null) return; - - // Temporary data var folder = node.Folder; var path = folder.Path; + var canHaveAssets = node.CanHaveAssets; if (_isDuringFastSetup) { @@ -833,20 +832,38 @@ namespace FlaxEditor.Modules var child = folder.Children[i]; if (!child.Exists) { - // Send info + // Item doesn't exist anymore Editor.Log(string.Format($"Content item \'{child.Path}\' has been removed")); - - // Destroy it Delete(child, false); - i--; } + else if (canHaveAssets && child is AssetItem childAsset) + { + // Check if asset type doesn't match the item proxy (eg. item reimported as Material Instance instead of Material) + if (FlaxEngine.Content.GetAssetInfo(child.Path, out var assetInfo)) + { + bool changed = assetInfo.ID != childAsset.ID; + if (!changed && assetInfo.TypeName != childAsset.TypeName) + { + // Use proxy check (eg. scene asset might accept different typename than AssetInfo reports) + var proxy = GetAssetProxy(childAsset.TypeName, child.Path); + if (proxy == null) + proxy = GetAssetProxy(assetInfo.TypeName, child.Path); + changed = !proxy.AcceptsAsset(assetInfo.TypeName, child.Path); + } + if (changed) + { + OnAssetTypeInfoChanged(childAsset, ref assetInfo); + i--; + } + } + } } } // Find files var files = Directory.GetFiles(path, "*.*", SearchOption.TopDirectoryOnly); - if (node.CanHaveAssets) + if (canHaveAssets) { LoadAssets(node, files); } @@ -1157,19 +1174,8 @@ namespace FlaxEditor.Modules // For eg. change texture to sprite atlas on reimport if (binaryAssetItem.TypeName != assetInfo.TypeName) { - // Asset type has been changed! - Editor.LogWarning(string.Format("Asset \'{0}\' changed type from {1} to {2}", item.Path, binaryAssetItem.TypeName, assetInfo.TypeName)); - Editor.Windows.CloseAllEditors(item); - - // Remove this item from the database and some related data var toRefresh = binaryAssetItem.ParentFolder; - binaryAssetItem.Dispose(); - toRefresh.Children.Remove(binaryAssetItem); - if (!binaryAssetItem.HasDefaultThumbnail) - { - // Delete old thumbnail and remove it from the cache - Editor.Instance.Thumbnails.DeletePreview(binaryAssetItem); - } + OnAssetTypeInfoChanged(binaryAssetItem, ref assetInfo); // Refresh the parent folder to find the new asset (it should have different type or some other format) RefreshFolder(toRefresh, false); @@ -1186,6 +1192,23 @@ namespace FlaxEditor.Modules } } + private void OnAssetTypeInfoChanged(AssetItem assetItem, ref AssetInfo assetInfo) + { + // Asset type has been changed! + Editor.LogWarning(string.Format("Asset \'{0}\' changed type from {1} to {2}", assetItem.Path, assetItem.TypeName, assetInfo.TypeName)); + Editor.Windows.CloseAllEditors(assetItem); + + // Remove this item from the database and some related data + assetItem.Dispose(); + assetItem.ParentFolder.Children.Remove(assetItem); + + // Delete old thumbnail and remove it from the cache + if (!assetItem.HasDefaultThumbnail) + { + Editor.Instance.Thumbnails.DeletePreview(assetItem); + } + } + internal void OnDirectoryEvent(MainContentTreeNode node, FileSystemEventArgs e) { // Ensure to be ready for external events diff --git a/Source/Editor/Surface/SurfaceUtils.cs b/Source/Editor/Surface/SurfaceUtils.cs index 5f4c3ef07..6fc54545c 100644 --- a/Source/Editor/Surface/SurfaceUtils.cs +++ b/Source/Editor/Surface/SurfaceUtils.cs @@ -295,6 +295,8 @@ namespace FlaxEditor.Surface continue; var tag = e.Tag; var parameter = e.Parameter; + if (parameter == null) + continue; // Editor Display var itemLayout = CustomEditors.Editors.GenericEditor.OnGroup(layout, e.Display); diff --git a/Source/Editor/Windows/Assets/AssetEditorWindow.cs b/Source/Editor/Windows/Assets/AssetEditorWindow.cs index 0d244479c..2e048b924 100644 --- a/Source/Editor/Windows/Assets/AssetEditorWindow.cs +++ b/Source/Editor/Windows/Assets/AssetEditorWindow.cs @@ -388,14 +388,16 @@ namespace FlaxEditor.Windows.Assets protected override void OnShow() { // Check if has no asset (but has item linked) - if (_asset == null && _item != null) + var item = _item; + if (_asset == null && item != null) { // Load asset _asset = LoadAsset(); if (_asset == null) { - Editor.LogError(string.Format("Cannot load asset \'{0}\' ({1})", _item.Path, typeof(T))); + Editor.LogError(string.Format("Cannot load asset \'{0}\' ({1})", item.Path, typeof(T))); Close(); + Editor.ContentDatabase.RefreshFolder(item, false); return; } diff --git a/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs b/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs index 5f1273999..3e0525fb7 100644 --- a/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs +++ b/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs @@ -521,8 +521,11 @@ namespace FlaxEditor.Windows.Assets /// protected override void OnClose() { - // Discard unsaved changes - _properties.DiscardChanges(); + if (Asset) + { + // Discard unsaved changes + _properties.DiscardChanges(); + } // Cleanup _undo.Clear();