Code/ParticleEffectPlus.cs

A ParticleController component that adjusts particle emitter properties over the emitter lifetime. It reads configured ParticleFloat curves (scale and rotation, per-axis or uniform) and applies evaluated size and angle values to each Particle on step using the emitter's Delta time.

Native Interop
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);
		}
	}
}