Player/Immersion/PlayerPostProcessing.cs
using Sandbox;

public sealed class PlayerPostProcessing : Component
{
	[Property, Group( "Chromatic Aberration")] public ChromaticAberration CA { get; set; }
	[Property, Group( "Chromatic Aberration" )] public float CAScale { get; set; } = 1f;
	[Property, Group( "Chromatic Aberration" )] public float CATime { get; set; } = 0.2f;

	[Property, Group( "Pixelate" )] public Pixelate Pixelate { get; set; }
	[Property, Group( "Pixelate" )] public float PixelateTime { get; set; } = 0.2f;
	[Property, Group( "Pixelate" )] public float PixelateScale { get; set; } = 0.05f;

	[Property, Group( "Damage Taken Vignette #1" )] public Vignette DamageVignette { get; set; }
	[Property, Group( "Damage Taken Vignette #1" )] public float DamageVignetteIntensity { get; set; } = 1f;
	[Property, Group( "Damage Taken Vignette #1" )] public float DamageVigneteTime { get; set; } = 0.2f;
	[Property, Group( "Damage Taken Vignette #1" )] public Curve DamageVignetteIntensityCurve { get; set; }


	[Property, Group( "Throb Vignette" )] public float ThrobIntensity { get; set; } = 1f;
	[Property, Group( "Throb Vignette" )] public float ThrobFrequency { get; set; } = 0.2f;
	[Property, Group( "Throb Vignette" )] public Curve ThrobCurve { get; set; }

	[Property] public Opium.PlayerController Player { get; set; }

	protected override void OnUpdate()
	{
		var timeSinceDamage = Player.TimeSinceLastDamage.Relative;
		var chromaticAberrationTime = timeSinceDamage.LerpInverse( CATime, 0.0f, true );
		var pixelateTime = timeSinceDamage.LerpInverse( PixelateTime, 0.0f, true );
		var damageVignetteTime = timeSinceDamage.LerpInverse( DamageVigneteTime, 0.0f, true );
		var damageVignetteCurvedTime = DamageVignetteIntensityCurve.Evaluate( damageVignetteTime );

		var now = Time.Now;
		var hpDelta = Player.Health.Clamp( 0, 100f ).Remap( 75f, 25f, 0, 1f, true );

		var throb = (MathF.Sin( now * ThrobFrequency ) + 1) / 2;
		throb = ThrobCurve.Evaluate( throb );
		var a = hpDelta * throb;


		CA.Scale = chromaticAberrationTime * CAScale;
		Pixelate.Scale = pixelateTime * PixelateScale;
		DamageVignette.Intensity = damageVignetteCurvedTime * DamageVignetteIntensity;
		DamageVignette.Intensity += a * ThrobIntensity;
	}
}