Effects/ArcTracer.cs
namespace PlanetMeat;

[Group( "Planet Meat - Effects" ), Title( "Arc Tracer" ), Icon( "looks" )]
public sealed class ArcTracer : Component, ITargetedEffect
{
	private DelayedStages Stages => field ??= Components.Get<DelayedStages>();
	private LineRenderer Line => field ??= Components.Get<LineRenderer>();
	List<float> StartingAlphas { get; } = [];

	public void SetTarget( SceneAnchor target )
	{
		var targetPos = target.ToWorld().Position;
		var myPos = WorldPosition;
		var toTarget = targetPos - myPos;
		WorldRotation = Rotation.LookAt( toTarget );

		var localEnd = toTarget;
		var localMiddle = localEnd * 0.5f;

		Line.UseVectorPoints = true;
		Line.VectorPoints = [
			myPos,
			myPos + localMiddle.WithZ( localEnd.z * 0.75f ),
			myPos + localEnd
		];
	}

	protected override void OnStart()
	{
		base.OnStart();
		StartingAlphas.AddRange( Line.Color.Alphas.Select( frame => frame.Value ) );
	}

	protected override void OnUpdate()
	{
		base.OnUpdate();

		if ( !Stages.IsEnding )
		{
			var currentGradient = Line.Color;
			var alphas = currentGradient.Alphas;
			var nextGradient = new Gradient
			{
				Colors = currentGradient.Colors
			};

			var frac = Stages.Fraction;
			for ( var i = 0; i < alphas.Count; i++ )
				nextGradient.AddAlpha( new( alphas[i].Time, StartingAlphas[i].LerpTo( 0.0f, frac ) ) );

			Line.Color = nextGradient;
		}
	}
}