diff --git a/Source/Editor/Content/Proxy/ParticleEmitterProxy.cs b/Source/Editor/Content/Proxy/ParticleEmitterProxy.cs index 8c1204128..9ac4d698c 100644 --- a/Source/Editor/Content/Proxy/ParticleEmitterProxy.cs +++ b/Source/Editor/Content/Proxy/ParticleEmitterProxy.cs @@ -3,6 +3,9 @@ using System; using FlaxEditor.Content.Create; using FlaxEditor.Content.Thumbnails; +using FlaxEditor.GUI.ContextMenu; +using FlaxEditor.GUI.Timeline; +using FlaxEditor.GUI.Timeline.Tracks; using FlaxEditor.Viewport.Previews; using FlaxEditor.Windows; using FlaxEditor.Windows.Assets; @@ -48,6 +51,59 @@ namespace FlaxEditor.Content Editor.Instance.ContentImporting.Create(new ParticleEmitterCreateEntry(outputPath)); } + /// + public override void OnContentWindowContextMenu(ContextMenu menu, ContentItem item) + { + base.OnContentWindowContextMenu(menu, item); + + if (item is BinaryAssetItem binaryAssetItem) + { + var button = menu.AddButton("Create Particle System", CreateParticleSystemClicked); + button.Tag = binaryAssetItem; + } + } + + private void CreateParticleSystemClicked(ContextMenuButton obj) + { + var binaryAssetItem = (BinaryAssetItem)obj.Tag; + CreateParticleSystem(binaryAssetItem); + } + + /// + /// Creates the particle system from the given particle emitter. + /// + /// The particle emitter item to use as a base for the particle system. + public static void CreateParticleSystem(BinaryAssetItem emitterItem) + { + var particleSystemName = emitterItem.ShortName + " Particle System"; + var particleSystemProxy = Editor.Instance.ContentDatabase.GetProxy(); + Editor.Instance.Windows.ContentWin.NewItem(particleSystemProxy, null, item => OnParticleSystemCreated(item, emitterItem), particleSystemName); + } + + private static void OnParticleSystemCreated(ContentItem item, BinaryAssetItem particleItem) + { + var assetItem = (AssetItem)item; + var particleSystem = FlaxEngine.Content.LoadAsync(assetItem.ID); + if (particleSystem == null || particleSystem.WaitForLoaded()) + { + Editor.LogError("Failed to load created particle system."); + return; + } + + ParticleEmitter emitter = FlaxEngine.Content.LoadAsync(particleItem.ID); + + ParticleSystemPreview tempPreview = new ParticleSystemPreview(false); + ParticleSystemTimeline timeline = new ParticleSystemTimeline(tempPreview); + timeline.Load(particleSystem); + + var track = (ParticleEmitterTrack)timeline.NewTrack(ParticleEmitterTrack.GetArchetype()); + track.Asset = emitter; + track.TrackMedia.DurationFrames = timeline.DurationFrames; + track.Rename(particleItem.ShortName); + timeline.AddTrack(track); + timeline.Save(particleSystem); + } + /// public override void OnThumbnailDrawPrepare(ThumbnailRequest request) {