/**
 * AmbientOcclusionEffect - A screen space ambient occlusion implementation.
 * Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
 */
class AmbientOcclusionEffect extends PostProcessEffect
	native;

/** The color that will replace scene color where there is a lot of occlusion. */
var(Color) interp LinearColor OcclusionColor;

/** 
 * Power to apply to the calculated occlusion value. 
 * Higher powers result in more contrast, but will need other factors like OcclusionScale to be tweaked as well. 
 */
var(Color) float OcclusionPower <UIMin=0.1 | UIMax=20.0>;

/** Scale to apply to the calculated occlusion value. */
var(Color) float OcclusionScale <UIMin=0.0 | UIMax=10.0>;

/** Bias to apply to the calculated occlusion value. */
var(Color) float OcclusionBias <UIMin=-1.0 | UIMax=4.0>;

/** Minimum occlusion value after all other transforms have been applied. */
var(Color) float MinOcclusion;

/** SSAO2 is SSAO with quality improvements, it is now the new method so the flag is no longer needed */
var deprecated bool SSAO2;

/** SSAO quality improvements, less noise, more detail, no darkening of flat surfaces, no overbright on convex, parameter retweak needed */
var(Occlusion) bool bAngleBasedSSAO;

/** Distance to check around each pixel for occluders, in world units. */
var(Occlusion) float OcclusionRadius <UIMin=0.0 | UIMax=256.0>;

/** Attenuation factor that determines how much to weigh in samples based on distance, larger values result in a faster falloff over distance. */
var deprecated float OcclusionAttenuation <UIMin=0.0 | UIMax=10.0>;

enum EAmbientOcclusionQuality
{
	AO_High,
	AO_Medium,
	AO_Low
};

/** 
 * Quality of the ambient occlusion effect.  Low quality gives the best performance and is appropriate for gameplay.  
 * Medium quality smooths noise between frames at a slightly higher performance cost.  High quality uses extra samples to preserve detail.
 */
var(Occlusion) EAmbientOcclusionQuality OcclusionQuality;

/** 
 * Distance at which to start fading out the occlusion factor, in world units. 
 * This is useful for hiding distant artifacts on skyboxes.
 */
var(Occlusion) float OcclusionFadeoutMinDistance;

/** Distance at which the occlusion factor should be fully faded, in world units. */
var(Occlusion) float OcclusionFadeoutMaxDistance;

/** 
 * Distance in front of a pixel that an occluder must be to be considered a different object, in world units.  
 * This threshold is used to identify halo regions around nearby objects, for example a first person weapon.
 */
var(Halo) float HaloDistanceThreshold;

/** 
 * Scale factor to increase HaloDistanceThreshold for distant pixels.  
 * A value of .001 would result in HaloDistanceThreshold being 1 unit larger at a distance of 1000 world units. 
 */
var(Halo) float HaloDistanceScale;

/** 
 * Occlusion factor to assign to samples determined to be contributing to a halo.  
 * 0 would result in full occlusion for that sample, increasing values map to quadratically decreasing occlusion values.
 */
var(Halo) float HaloOcclusion;

/** Difference in depth that two pixels must be to be considered an edge, and therefore not blurred across, in world units. */
var(Filter) float EdgeDistanceThreshold;

/** 
 * Scale factor to increase EdgeDistanceThreshold for distant pixels.  
 * A value of .001 would result in EdgeDistanceThreshold being 1 unit larger at a distance of 1000 world units. 
 */
var(Filter) float EdgeDistanceScale;

/** 
 * Distance in world units which should map to the kernel size in screen space.  
 * This is useful to reduce filter kernel size for distant pixels and keep detail, at the cost of leaving more noise in the result.
 */
var(Filter) float FilterDistanceScale;

/** Size of the blur filter, in pixels. */
var deprecated int FilterSize;

/** 
 * Time in which the occlusion history should approximately converge.  
 * Longer times (.5s) allow more smoothing between frames and less noise but history streaking is more noticeable.
 * 0 means the feature is off (less GPU performance and memory overhead)
 */
var(History) float HistoryConvergenceTime;

/** 
 * Time in which the weight history should approximately converge.  
 */
var float HistoryWeightConvergenceTime;

`if(`__TW_GAMEWORKS_HBAO_)
/** AO radius in meters */
var(HBAO) float HBAO_Radius;

/** To hide low-tessellation artifacts, 0.0~1.0 */
var(HBAO) float HBAO_Bias;

/** Scale factor for the detail AO, the greater the darker, 0.0~2.0 */
var(HBAO) float HBAO_DetailAO;

/** Scale factor for the coarse AO, the greater the darker, 0.0~2.0 */
var(HBAO) float HBAO_CoarseAO;

/** Final AO output is pow(AO, powerExponent) */
var(HBAO) float HBAO_PowerExponent;

/** To return white AO for ViewDepths > MaxViewDepth */
var(HBAO) bool HBAO_EnableDepthThreshold;

/** Custom view-depth threshold */
var(HBAO) float HBAO_MaxViewDepth;

/** The higher, the sharper the AO-to-white transitions */
var(HBAO) float HBAO_Sharpness;

/** To blur the AO with an edge-preserving blur */
var(HBAO) bool HBAO_EnableBlur;

/** BLUR_RADIUS_2, BLUR_RADIUS_4, or BLUR_RADIUS_8 */
enum EHBAOBlurRadius
{
	HBAO_BLUR_RADIUS_2,
	HBAO_BLUR_RADIUS_4,
	HBAO_BLUR_RADIUS_8
};
var(HBAO) EHBAOBlurRadius HBAO_BlurRadius;

/** The higher, the more the blur preserves edges, 0.0~16.0 */
var(HBAO) float HBAO_BlurSharpness;

`endif

cpptext
{
    // UPostProcessEffect interface

	/**
	 * Creates a proxy to represent the render info for a post process effect
	 * @param WorldSettings - The world's post process settings for the view.
	 * @return The proxy object.
	 */
	virtual class FPostProcessSceneProxy* CreateSceneProxy(const FPostProcessSettings* WorldSettings);

	/**
	 * @param View - current view
	 * @return TRUE if the effect should be rendered
	 */
	virtual UBOOL IsShown(const FSceneView* View) const;

	virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent);
}

defaultproperties
{
	bAffectsLightingOnly=TRUE
	SceneDPG = SDPG_World;
	OcclusionColor=(R=0.0,G=0.0,B=0.0,A=1.0)
	OcclusionPower=4.0
	OcclusionScale=20.0
	OcclusionBias=0
	MinOcclusion=.1
	OcclusionRadius=25.0
	OcclusionQuality=AO_Medium
	OcclusionFadeoutMinDistance=4000.0
	OcclusionFadeoutMaxDistance=4500.0
	HaloDistanceThreshold=40.0
	HaloDistanceScale=.1
	HaloOcclusion=.04
	EdgeDistanceThreshold=10.0
	EdgeDistanceScale=.003
	FilterDistanceScale=10.0
	HistoryConvergenceTime=0
	HistoryWeightConvergenceTime=.07
	bAngleBasedSSAO=FALSE

`if(`__TW_GAMEWORKS_HBAO_)
	HBAO_Radius=1.0
	HBAO_Bias=0.1
	HBAO_DetailAO=0.0
	HBAO_CoarseAO=1.0
	HBAO_PowerExponent=2.0
	HBAO_EnableDepthThreshold=false
	HBAO_MaxViewDepth=0.0
	HBAO_Sharpness=100.0
	HBAO_EnableBlur=true
	HBAO_BlurRadius=HBAO_BLUR_RADIUS_4
	HBAO_BlurSharpness=4.0
`endif
}