diff --git a/Source/Editor/Windows/Assets/ParticleEmitterWindow.cs b/Source/Editor/Windows/Assets/ParticleEmitterWindow.cs
index 80eafd9e0..bc1f49443 100644
--- a/Source/Editor/Windows/Assets/ParticleEmitterWindow.cs
+++ b/Source/Editor/Windows/Assets/ParticleEmitterWindow.cs
@@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Linq;
using FlaxEditor.Content;
using FlaxEditor.CustomEditors;
+using FlaxEditor.GUI;
using FlaxEditor.Scripting;
using FlaxEditor.Surface;
using FlaxEditor.Viewport.Previews;
@@ -114,6 +115,7 @@ namespace FlaxEditor.Windows.Assets
private readonly PropertiesProxy _properties;
private Tab _previewTab;
+ private ToolStripButton _showSourceCodeButton;
///
public ParticleEmitterWindow(Editor editor, AssetItem item)
@@ -146,7 +148,8 @@ namespace FlaxEditor.Windows.Assets
// Toolstrip
SurfaceUtils.PerformCommonSetup(this, _toolstrip, _surface, out _saveButton, out _undoButton, out _redoButton);
- _toolstrip.AddButton(editor.Icons.Code64, ShowSourceCode).LinkTooltip("Show generated shader source code");
+ _showSourceCodeButton = _toolstrip.AddButton(editor.Icons.Code64, ShowSourceCode);
+ _showSourceCodeButton.LinkTooltip("Show generated shader source code");
_toolstrip.AddSeparator();
_toolstrip.AddButton(editor.Icons.Docs64, () => Platform.OpenUrl(Utilities.Constants.DocsUrl + "manual/particles/index.html")).LinkTooltip("See documentation to learn more");
}
@@ -285,5 +288,16 @@ namespace FlaxEditor.Windows.Assets
///
public SearchAssetTypes AssetType => SearchAssetTypes.ParticleEmitter;
+
+ ///
+ public override void Update(float deltaTime)
+ {
+ base.Update(deltaTime);
+
+ if(_asset == null)
+ return;
+
+ _showSourceCodeButton.Enabled = _asset.HasShaderCode();
+ }
}
}
diff --git a/Source/Engine/Particles/ParticleEmitter.cpp b/Source/Engine/Particles/ParticleEmitter.cpp
index 452d4560a..4490406bc 100644
--- a/Source/Engine/Particles/ParticleEmitter.cpp
+++ b/Source/Engine/Particles/ParticleEmitter.cpp
@@ -440,4 +440,21 @@ bool ParticleEmitter::Save(const StringView& path)
return SaveSurface(data);
}
+bool ParticleEmitter::HasShaderCode()
+{
+ if(SimulationMode != ParticlesSimulationMode::GPU)
+ {
+ return false;
+ }
+
+ #if COMPILE_WITH_PARTICLE_GPU_GRAPH && COMPILE_WITH_SHADER_COMPILER
+ if(_shaderHeader.ParticleEmitter.GraphVersion == PARTICLE_GPU_GRAPH_VERSION
+ && HasChunk(SHADER_FILE_CHUNK_SOURCE)
+ && !HasDependenciesModified())
+ return true;
+ #endif
+
+ return false;
+}
+
#endif
diff --git a/Source/Engine/Particles/ParticleEmitter.h b/Source/Engine/Particles/ParticleEmitter.h
index b3343da1a..4b27036f7 100644
--- a/Source/Engine/Particles/ParticleEmitter.h
+++ b/Source/Engine/Particles/ParticleEmitter.h
@@ -173,6 +173,12 @@ public:
#if USE_EDITOR
void GetReferences(Array& assets, Array& files) const override;
bool Save(const StringView& path = StringView::Empty) override;
+
+ ///
+ /// Determine if the particle emitter has valid shader code present.
+ ///
+ /// True if particle emitter has shader code, otherwise false.
+ API_FUNCTION() bool HasShaderCode();
#endif
protected: