Files
FlaxEngine/Source/Editor/CustomEditors/Dedicated/ParticleEffectEditor.cs
2022-01-14 13:31:12 +01:00

72 lines
2.5 KiB
C#

// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved.
using System.Linq;
using FlaxEditor.Surface;
using FlaxEngine;
namespace FlaxEditor.CustomEditors.Dedicated
{
/// <summary>
/// Custom editor for <see cref="ParticleEffect"/>.
/// </summary>
/// <seealso cref="ActorEditor" />
[CustomEditor(typeof(ParticleEffect)), DefaultEditor]
public class ParticleEffectEditor : ActorEditor
{
private bool _isValid;
private bool IsValid
{
get
{
// All selected particle effects use the same system
var effect = (ParticleEffect)Values[0];
var system = effect.ParticleSystem;
return system != null && Values.TrueForAll(x => (x as ParticleEffect)?.ParticleSystem == system);
}
}
/// <inheritdoc />
public override void Initialize(LayoutElementsContainer layout)
{
base.Initialize(layout);
_isValid = IsValid;
if (!_isValid)
return;
// Show all effect parameters grouped by the emitter track name
var effect = (ParticleEffect)Values[0];
var groups = layout.Group("Parameters");
groups.Panel.Open(false);
var parameters = effect.Parameters;
var parametersGroups = parameters.GroupBy(x => x.EmitterIndex);
foreach (var parametersGroup in parametersGroups)
{
var trackName = parametersGroup.First().TrackName;
var group = groups.Group(trackName);
group.Panel.Open(false);
var data = SurfaceUtils.InitGraphParameters(parametersGroup);
SurfaceUtils.DisplayGraphParameters(group, data,
(instance, parameter, tag) => ((ParticleEffect)instance).GetParameterValue(trackName, parameter.Name),
(instance, value, parameter, tag) => ((ParticleEffect)instance).SetParameterValue(trackName, parameter.Name, value),
Values,
(instance, parameter, tag) => ((ParticleEffectParameter)tag).DefaultValue);
}
}
/// <inheritdoc />
public override void Refresh()
{
if (_isValid != IsValid)
{
RebuildLayout();
return;
}
base.Refresh();
}
}
}