// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
using FlaxEditor.GUI.Input;
using FlaxEngine;
using Object = FlaxEngine.Object;
namespace FlaxEditor.Viewport.Previews
{
///
/// Particle Emitter asset preview editor viewport.
///
///
public class ParticleEmitterPreview : ParticleSystemPreview
{
private ParticleEmitter _emitter;
private ParticleSystem _system;
private float _playbackDuration = 5.0f;
///
/// Gets or sets the particle emitter asset to preview.
///
public ParticleEmitter Emitter
{
get => _emitter;
set
{
if (_emitter != value)
{
_emitter = value;
_system.Init(value, _playbackDuration);
PreviewActor.ResetSimulation();
}
}
}
///
/// Gets or sets the duration of the emitter playback (in seconds).
///
public float PlaybackDuration
{
get => _playbackDuration;
set
{
value = Mathf.Clamp(value, 0.1f, 100000000000.0f);
if (Mathf.NearEqual(_playbackDuration, value))
return;
_playbackDuration = value;
if (_system != null)
{
_system.Init(_emitter, _playbackDuration);
PreviewActor.ResetSimulation();
}
}
}
///
/// Initializes a new instance of the class.
///
/// if set to true use widgets.
public ParticleEmitterPreview(bool useWidgets)
: base(useWidgets)
{
_system = FlaxEngine.Content.CreateVirtualAsset();
System = _system;
if (useWidgets)
{
var playbackDuration = ViewWidgetButtonMenu.AddButton("Duration");
playbackDuration.CloseMenuOnClick = false;
var playbackDurationValue = new FloatValueBox(_playbackDuration, 90, 2, 70.0f, 0.1f, 1000000.0f, 0.1f)
{
Parent = playbackDuration
};
playbackDurationValue.ValueChanged += () => PlaybackDuration = playbackDurationValue.Value;
ViewWidgetButtonMenu.VisibleChanged += control => playbackDurationValue.Value = PlaybackDuration;
}
}
///
public override bool HasLoadedAssets => (_emitter == null || _emitter.IsLoaded) && base.HasLoadedAssets;
///
public override void OnDestroy()
{
// Cleanup objects
_emitter = null;
Object.Destroy(ref _system);
base.OnDestroy();
}
}
}