WorkInProgress/LineRendererLight.cs
namespace Sandbox;
[Title("Line Renderer Light (Staging)")]
public class LineRendererLight : Component, Component.ExecuteInEditor
{
LineRenderer Renderer;
SceneLight so;
[Property] public float Brightness { get; set; } = 1.0f;
public LineRendererLight()
{
}
protected override void OnEnabled()
{
Renderer = Components.GetInAncestorsOrSelf<LineRenderer>();
if (Renderer is null)
{
Log.Warning($"No line renderer component found for {this}");
return;
}
// Clean up any existing light
if (so.IsValid())
so.Delete();
so = new SceneLight(Renderer.Scene.SceneWorld, Vector3.Zero, 100, Color.Red);
}
protected override void OnDisabled()
{
if ( !so.IsValid() ) return;
so.Delete();
}
protected override void OnUpdate()
{
if (!so.IsValid() || Renderer == null) return;
// Skip update if renderer has no points
bool useVectorPoints = Renderer.UseVectorPoints;
if ((useVectorPoints && (Renderer.VectorPoints == null || Renderer.VectorPoints.Count == 0)) ||
(!useVectorPoints && (Renderer.Points == null || Renderer.Points.Count == 0)))
return;
Vector3 p1, p2;
if (useVectorPoints)
{
p1 = Renderer.VectorPoints.First();
p2 = Renderer.VectorPoints.Last();
}
else
{
p1 = Renderer.Points.First().WorldPosition;
p2 = Renderer.Points.Last().WorldPosition;
}
float distance = p1.Distance(p2);
so.Position = ( p1 + p2 ) / 2.0f;
so.Radius = 256 + p1.Distance( p2 );
so.LightColor = Renderer.Color.Evaluate( 0.5f ) * Brightness;
so.ShapeSize = new Vector2( Renderer.Width.Evaluate( 0.5f ) * 0.5f, p1.Distance( p2 ) );
so.Rotation = Rotation.LookAt( p2 - p1 );
so.Shape = SceneLight.LightShape.Capsule;
}
}