Weapons/GluonGun/BeamComponent.cs
public sealed class BeamComponent : Component
{
	[Property] public GameObject End { get; set; }
	[Property] List<BeamRenderer> beamRenderers { get; set; } = new();

	/// <summary>
	/// Sets the middle point for all beam renderers
	/// </summary>
	/// <param name="forward"></param>
	/// <param name="power"></param>
	public void SetMiddlePoint( Vector3 forward, float power = 1f )
	{
		var start = WorldPosition;
		var direction = End.WorldPosition - start;
		var cross = Vector3.Cross( forward, direction.Normal );
		var perpendicular = Vector3.Cross( direction.Normal, cross );

		// Set the middle point on all beam renderers
		foreach ( var beam in GetComponentsInChildren<BeamRenderer>() )
		{
			beam.MiddlePoint = start + (direction * 0.5f) + (perpendicular * direction.Length * power * 0.25f); ;
		}
	}

	public void SetBeam( Vector3 end )
	{
		var distance = Vector3.Dot( end - WorldPosition, WorldRotation.Forward );
		if ( distance < float.Epsilon )
		{
			distance = float.Epsilon;
			end = WorldPosition + (WorldRotation.Forward * distance);
		}

		End.WorldPosition = end;

		foreach ( var beam in beamRenderers )
		{
			beam.SinFrequency = -distance * 0.00005f;
			beam.CosFrequency = -distance * 0.00005f;
		}
	}
}