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