namespace Sandbox;
public partial class SceneCamera
{
///
/// Access tonemapping properties of camera
///
internal TonemapSystem Tonemap { get; set; }
}
internal class TonemapSystem
{
private readonly SceneCamera Camera;
private ITonemapSystem System;
private SceneTonemapParameters_t Parameters = new SceneTonemapParameters_t();
internal TonemapSystem( SceneCamera camera )
{
Camera = camera;
System = Camera.ToneMapping?.GetNative() ?? default;
if ( System.IsValid )
{
SceneTonemapParameters_t defaultParams = new SceneTonemapParameters_t();
System.SetTonemapParameters( ref defaultParams );
}
}
internal void SetTonemapParameters( SceneTonemapParameters_t parameters )
{
Parameters = parameters;
Update();
}
///
/// Enable or disable exposure.
///
public bool Enabled { get; set; } = false;
///
/// The rate of change for exposure.
///
public float Rate
{
get => Parameters.m_flRate;
set
{
Parameters.m_flRate = value;
Update();
}
}
///
/// Set the speed at which exposure fades downwards (diminishes) in response to light changes.
///
public float Fade
{
get => Parameters.m_flAccelerateExposureDown;
set
{
Parameters.m_flAccelerateExposureDown = value;
Update();
}
}
///
/// Minimum auto exposure scale
///
public float MinExposure
{
get => Parameters.m_flAutoExposureMin;
set
{
Parameters.m_flAutoExposureMin = value;
Update();
}
}
///
/// Maximum auto exposure scale
///
public float MaxExposure
{
get => Parameters.m_flAutoExposureMax;
set
{
Parameters.m_flAutoExposureMax = value;
Update();
}
}
///
/// Number of stops to adjust auto-exposure by
///
public float ExposureCompensation
{
get => MathF.Log( Parameters.m_flExposureCompensationScalar, 2.0f );
set
{
Parameters.m_flExposureCompensationScalar = MathF.Pow( 2.0f, value );
Update();
}
}
///
/// Set a custom brightness target to go along with 'Target Bright Pixel Percentage'. (-1 for default engine behavior)
///
public float PercentTarget
{
get => Parameters.m_flTonemapPercentTarget;
set
{
Parameters.m_flTonemapPercentTarget = value;
Update();
}
}
///
/// Set a target for percentage of pixels above a certain brightness. (-1 for default engine behavior)
///
public float PercentBrightPixels
{
get => Parameters.m_flTonemapPercentBrightPixels;
set
{
Parameters.m_flTonemapPercentBrightPixels = value;
Update();
}
}
///
/// Set the minimum average luminance. This ensures that certain regions aren't too dim after tonemapping
///
public float MinAverageLuminance
{
get => Parameters.m_flTonemapMinAvgLum;
set
{
Parameters.m_flTonemapMinAvgLum = value;
Update();
}
}
private void Update()
{
if ( System.IsValid )
{
System.SetTonemapParameters( ref Parameters );
}
}
}