// 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(); } } }