fragment_program SSAO/Post/BoxFilter_fp_hlsl hlsl
{
    source SSAOPost.cg
    entry_point boxFilter_fp
    target ps_3_0
}

fragment_program SSAO/Post/SmartBoxFilter_fp_hlsl hlsl
{
    source SSAOPost.cg
    entry_point smartBoxFilter_fp
    target ps_3_0
}

fragment_program SSAO/HorizonBased/CrossBilateralFilter/X_fp_hlsl hlsl
{
    source SSAOPost.cg
    entry_point crossBilateralFilterX_fp
    target ps_3_0
}

fragment_program SSAO/HorizonBased/CrossBilateralFilter/Y_fp_hlsl hlsl
{
    source SSAOPost.cg
    entry_point crossBilateralFilterY_fp
    target ps_3_0
}

fragment_program SSAO/Post/BoxFilter_fp_cg cg
{
    source SSAOPost.cg
    entry_point boxFilter_fp
    profiles ps_3_0 arbfp1
}

fragment_program SSAO/Post/SmartBoxFilter_fp_cg cg
{
    source SSAOPost.cg
    entry_point smartBoxFilter_fp
    profiles ps_3_0 arbfp1
}

fragment_program SSAO/HorizonBased/CrossBilateralFilter/X_fp_cg cg
{
    source SSAOPost.cg
    entry_point crossBilateralFilterX_fp
    profiles ps_3_0 arbfp1
}

fragment_program SSAO/HorizonBased/CrossBilateralFilter/Y_fp_cg cg
{
    source SSAOPost.cg
    entry_point crossBilateralFilterY_fp
    profiles ps_3_0 arbfp1
}

fragment_program SSAO/Post/BoxFilter_fp_glsl glsl
{
    source BoxFilterFP.glsl
    	
	default_params
	{
		param_named sOcclusion int 0
	}
}

fragment_program SSAO/Post/SmartBoxFilter_fp_glsl glsl
{
    source SmartBoxFilterFP.glsl
    	
	default_params
	{
        param_named sOcclusion int 0
		param_named sMrt1 int 1
	}
}

fragment_program SSAO/HorizonBased/CrossBilateralFilter/X_fp_glsl glsl
{
    source CrossBilateralFilterXFP.glsl
    	
	default_params
	{
		param_named sAccessibility int 0
		param_named sMRT2 int 1
	}
}

fragment_program SSAO/HorizonBased/CrossBilateralFilter/Y_fp_glsl glsl
{
    source CrossBilateralFilterYFP.glsl
    	
	default_params
	{
		param_named sAccessibility int 0
		param_named sMRT2 int 1
	}
}

fragment_program SSAO/Post/BoxFilter_fp unified
{
	delegate SSAO/Post/BoxFilter_fp_glsl
	delegate SSAO/Post/BoxFilter_fp_hlsl
	delegate SSAO/Post/BoxFilter_fp_cg 
}

fragment_program SSAO/Post/SmartBoxFilter_fp unified
{
	delegate SSAO/Post/SmartBoxFilter_fp_glsl
	delegate SSAO/Post/SmartBoxFilter_fp_hlsl
	delegate SSAO/Post/SmartBoxFilter_fp_cg 
}

fragment_program SSAO/HorizonBased/CrossBilateralFilter/X_fp unified
{
	delegate SSAO/HorizonBased/CrossBilateralFilter/X_fp_glsl
	delegate SSAO/HorizonBased/CrossBilateralFilter/X_fp_hlsl
	delegate SSAO/HorizonBased/CrossBilateralFilter/X_fp_cg
}

fragment_program SSAO/HorizonBased/CrossBilateralFilter/Y_fp unified
{
	delegate SSAO/HorizonBased/CrossBilateralFilter/Y_fp_glsl
	delegate SSAO/HorizonBased/CrossBilateralFilter/Y_fp_hlsl
	delegate SSAO/HorizonBased/CrossBilateralFilter/Y_fp_cg
}

material SSAO/Post/NoFilter
{
    technique
    {
        pass
        {
            cull_hardware none
			depth_check off
            lighting off

            texture_unit
            {
                content_type compositor SSAO/GBuffer occlusion
                tex_address_mode clamp
                filtering none
            }
        }
    }
}

material SSAO/Post/BoxFilter
{
    technique
    {
        pass
        {
            depth_check off

			vertex_program_ref Ogre/Compositor/StdQuad_vp {}
            fragment_program_ref SSAO/Post/BoxFilter_fp
            {
                param_named_auto screenSize viewport_size
            }

            texture_unit
            {
                content_type compositor SSAO/GBuffer occlusion
                tex_address_mode clamp
                filtering none
            }
        }
    }
}

material SSAO/Post/SmartBoxFilter
{
    technique
    {
        pass
        {
            depth_check off

			vertex_program_ref Ogre/Compositor/StdQuad_vp {}
            fragment_program_ref SSAO/Post/SmartBoxFilter_fp
            {
                param_named_auto screenSize viewport_size
                param_named_auto farClipDistance far_clip_distance
            }

            texture_unit
            {
                content_type compositor SSAO/GBuffer occlusion
                tex_address_mode clamp
                filtering none
            }

            texture_unit
            {
                content_type compositor SSAO/GBuffer mrt 0
                tex_address_mode clamp
                filtering none
            }
        }
    }
}

material SSAO/HorizonBased/CrossBilateralFilter/X
{
    technique
    {
        pass // two pass in x and y direction
        {
            depth_check off
            
			vertex_program_ref Ogre/Compositor/StdQuad_vp {}
            fragment_program_ref SSAO/HorizonBased/CrossBilateralFilter/X_fp
            {
                param_named_auto stepX inverse_viewport_width
                param_named cPhotometricExponent float 10
            }
            
            texture_unit // the accessability texture
            {
                content_type compositor SSAO/GBuffer occlusion
                tex_address_mode clamp
                filtering none
            }
            
            texture_unit
            {
                content_type compositor SSAO/GBuffer mrt 1
                tex_address_mode clamp
                filtering none
            }
        }
    }
}

material SSAO/HorizonBased/CrossBilateralFilter/Y
{
    technique
    {
        pass // two pass in x and y direction
        {
            depth_check off
            
			vertex_program_ref Ogre/Compositor/StdQuad_vp {}
            fragment_program_ref SSAO/HorizonBased/CrossBilateralFilter/Y_fp
            {
                param_named_auto stepY inverse_viewport_height
                param_named cPhotometricExponent float 10
            }
            
            texture_unit // the accessability texture, injected by the compositor
            {
                tex_address_mode clamp
                filtering none
            }
            
            texture_unit
            {
                content_type compositor SSAO/GBuffer mrt 1
                tex_address_mode clamp
                filtering none
            }
        }
    }
}
