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;
}
}
}