diff --git a/Source/Editor/Windows/Assets/AssetEditorWindow.cs b/Source/Editor/Windows/Assets/AssetEditorWindow.cs index 802686b76..16a2cf839 100644 --- a/Source/Editor/Windows/Assets/AssetEditorWindow.cs +++ b/Source/Editor/Windows/Assets/AssetEditorWindow.cs @@ -132,12 +132,24 @@ namespace FlaxEditor.Windows.Assets // Cancel closing return true; } + else + { + // Discard and close + DiscardChanges(); + } } } return base.OnClosing(reason); } + /// + /// Discards unsaved asset changes before closing the window. + /// + protected virtual void DiscardChanges() + { + } + /// protected override void OnClose() { diff --git a/Source/Editor/Windows/Assets/JsonAssetWindow.cs b/Source/Editor/Windows/Assets/JsonAssetWindow.cs index 696f63b25..75acd74dd 100644 --- a/Source/Editor/Windows/Assets/JsonAssetWindow.cs +++ b/Source/Editor/Windows/Assets/JsonAssetWindow.cs @@ -263,6 +263,15 @@ namespace FlaxEditor.Windows.Assets base.OnAssetLoaded(); } + /// + protected override void DiscardChanges() + { + Asset?.ClearInstance(); + _object = null; + + base.DiscardChanges(); + } + private void OpenOptionsContextMenu() { if (_optionsCM != null) diff --git a/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs b/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs index cb39930f9..b58873b1e 100644 --- a/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs +++ b/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs @@ -64,8 +64,14 @@ namespace FlaxEditor.Windows.Assets [CustomEditor(typeof(ParametersEditor))] private sealed class PropertiesProxy { + private struct ParameterState + { + public object Value; + public bool IsOverride; + } + private MaterialBase _restoreBase; - private Dictionary _restoreParams; + private Dictionary _restoreParams; [EditorDisplay("General"), Tooltip("The base material used to override it's properties")] public MaterialBase BaseMaterial @@ -181,9 +187,16 @@ namespace FlaxEditor.Windows.Assets var material = Window.Asset; _restoreBase = material.BaseMaterial; var parameters = material.Parameters; - _restoreParams = new Dictionary(); + _restoreParams = new Dictionary(); for (int i = 0; i < parameters.Length; i++) - _restoreParams[parameters[i].Name] = parameters[i].Value; + { + var p = parameters[i]; + _restoreParams[p.Name] = new ParameterState + { + Value = p.Value, + IsOverride = p.IsOverride, + }; + } } /// @@ -191,7 +204,7 @@ namespace FlaxEditor.Windows.Assets /// public void DiscardChanges() { - if (Window == null) + if (Window == null || _restoreParams == null) return; var material = Window.Asset; @@ -200,9 +213,10 @@ namespace FlaxEditor.Windows.Assets for (int i = 0; i < parameters.Length; i++) { var p = parameters[i]; - if (p.IsPublic && _restoreParams.TryGetValue(p.Name, out var value)) + if (p.IsPublic && _restoreParams.TryGetValue(p.Name, out var state)) { - p.Value = value; + p.Value = state.Value; + p.IsOverride = state.IsOverride; } } } diff --git a/Source/Editor/Windows/Assets/ModelBaseWindow.cs b/Source/Editor/Windows/Assets/ModelBaseWindow.cs index 89ff1ff96..eb22396f0 100644 --- a/Source/Editor/Windows/Assets/ModelBaseWindow.cs +++ b/Source/Editor/Windows/Assets/ModelBaseWindow.cs @@ -837,6 +837,14 @@ namespace FlaxEditor.Windows.Assets base.OnAssetLoaded(); } + /// + protected override void DiscardChanges() + { + _asset?.Reload(); + + base.DiscardChanges(); + } + /// public override void OnItemReimported(ContentItem item) { diff --git a/Source/Engine/Content/JsonAsset.cs b/Source/Engine/Content/JsonAsset.cs index 9d11a8c3c..86ed68c1b 100644 --- a/Source/Engine/Content/JsonAsset.cs +++ b/Source/Engine/Content/JsonAsset.cs @@ -93,5 +93,15 @@ namespace FlaxEngine string str = instance != null ? JsonSerializer.Serialize(instance) : null; Data = str; } + +#if FLAX_EDITOR + /// + /// Clears the cached managed instance. The next access will recreate it from the asset data. + /// + internal void ClearInstance() + { + _instance = null; + } +#endif } }