ParticleEffectPlus is a ParticleController component that reads properties from a linked ParticleEmitter and applies size and rotation values to particles based on emitter lifetime feature curves. It supports per-axis and uniform shape scaling and per-axis rotation, evaluating ParticleFloat curves using the emitter Delta value.
namespace Sandbox;
[Description("This component let's you set values for particles over the emitters lifetime instead of the particles lifetimes")]
public class ParticleEffectPlus : ParticleController
{
[Property, RequireComponent] private ParticleEmitter ParticleEmitter { get; set; }
[Property, FeatureEnabled( "ShapeXYZ" )]
private bool ShapeXyzEnabled { get; set; }
[Property, Feature( "ShapeXYZ" )] private ParticleFloat ScaleX { get; set; }
[Property, Feature( "ShapeXYZ" )] private ParticleFloat ScaleY { get; set; }
[Property, Feature( "ShapeXYZ" )] private ParticleFloat ScaleZ { get; set; }
[Property, FeatureEnabled ("Rotate")]
private bool RotateXyzEnabled {get; set;}
[Property, Feature( "Rotate" )] private ParticleFloat RotateX { get; set; }
[Property, Feature( "Rotate" )] private ParticleFloat RotateY { get; set; }
[Property, Feature( "Rotate" )] private ParticleFloat RotateZ { get; set; }
[Property, FeatureEnabled( "Shape" )] private bool ShapeEnabled { get; set; }
[Property, FeatureEnabled( "Shape" )] private ParticleFloat Scale { get; set; }
protected override void OnParticleStep( Particle particle, float delta )
{
if(ParticleEmitter == null) return;
SetSize( particle, delta );
}
private void SetSize( Particle particle, float delta )
{
Vector3 size;
if ( ShapeXyzEnabled )
{
var x = ScaleX.Evaluate( ParticleEmitter.Delta, 65343 );
var y = ScaleY.Evaluate( ParticleEmitter.Delta, 65343 );
var z = ScaleZ.Evaluate( ParticleEmitter.Delta, 65343 );
particle.Size = new Vector3( x, y, z );
}
if ( ShapeEnabled )
{
particle.Size = Scale.Evaluate( ParticleEmitter.Delta, 65343 );
}
if ( RotateXyzEnabled )
{
var x = RotateX.Evaluate( ParticleEmitter.Delta, 65343 );
var y = RotateY.Evaluate( ParticleEmitter.Delta, 65343 );
var z = RotateZ.Evaluate( ParticleEmitter.Delta, 65343 );
particle.Angles = new Angles(x,y,z);
}
}
}