Weapons/PhysGun/PhygunWorldmodel.cs

Worldmodel component for the physics gun. It finds the Physgun component in the root hierarchy and smoothly blends the worldmodel glow tint and light color between PhysTint and GravTint based on whether the gun's pull is active.

Reflection
public sealed class PhygunWorldmodel : Component
{
	[Property] public ParticleEffect GlowEffect { get; set; }
	[Property] public PointLight GlowLight { get; set; }

	[Property] public Color GravTint { get; set; } = new Color( 1f, 0.8f, 0f );
	[Property] public Color PhysTint { get; set; } = new Color( 0f, 0.68333f, 1f );

	float _tintFrac;

	protected override void OnUpdate()
	{
		var physgun = GameObject.Root.Components.Get<Physgun>( FindMode.EverythingInSelfAndDescendants );
		var pullActive = physgun?.PullActive ?? false;

		_tintFrac = MathX.Approach( _tintFrac, pullActive ? 1 : 0, Time.Delta * 5 );

		// Steep ease-in-out so the transition rushes through the midpoint
		var t = _tintFrac < 0.5f
			? 8f * _tintFrac * _tintFrac * _tintFrac * _tintFrac
			: 1f - 8f * (1f - _tintFrac) * (1f - _tintFrac) * (1f - _tintFrac) * (1f - _tintFrac);

		var tint = Color.Lerp( PhysTint, GravTint, t );

		if ( GlowEffect is not null )
			GlowEffect.Tint = tint;

		if ( GlowLight is not null )
			GlowLight.LightColor = tint;
	}
}