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..b1863fce9 100644
--- a/Source/Editor/Windows/Assets/JsonAssetWindow.cs
+++ b/Source/Editor/Windows/Assets/JsonAssetWindow.cs
@@ -263,6 +263,14 @@ 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..c18177b14 100644
--- a/Source/Editor/Windows/Assets/ModelBaseWindow.cs
+++ b/Source/Editor/Windows/Assets/ModelBaseWindow.cs
@@ -837,6 +837,13 @@ 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..35f6675d8 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.
+ ///
+ public void ClearInstance()
+ {
+ _instance = null;
+ }
+#endif
}
}