Add creating particle systems from particle emitters.

This commit is contained in:
Menotdan
2024-04-10 05:04:36 -04:00
parent b2f9da4113
commit ad8bec40bb

View File

@@ -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));
}
/// <inheritdoc />
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);
}
/// <summary>
/// Creates the particle system from the given particle emitter.
/// </summary>
/// <param name="emitterItem">The particle emitter item to use as a base for the particle system.</param>
public static void CreateParticleSystem(BinaryAssetItem emitterItem)
{
var particleSystemName = emitterItem.ShortName + " Particle System";
var particleSystemProxy = Editor.Instance.ContentDatabase.GetProxy<ParticleSystem>();
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<ParticleSystem>(assetItem.ID);
if (particleSystem == null || particleSystem.WaitForLoaded())
{
Editor.LogError("Failed to load created particle system.");
return;
}
ParticleEmitter emitter = FlaxEngine.Content.LoadAsync<ParticleEmitter>(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);
}
/// <inheritdoc />
public override void OnThumbnailDrawPrepare(ThumbnailRequest request)
{