Code/Components/PostProcessing/CCSPerspectiveShift.cs
using Sandbox;
using System;


/// <summary>
/// Shift the perspective of the image.(very basic)
/// </summary>

[Title( "Perspective Shift" )]
[Category( "Post Processing" )]
[Icon( "grid_4x4" )]


public sealed class CCSPerspectiveShift : Component, Component.ExecuteInEditor
{

	/// <summary>
	/// Scale the upper edge of the image to simulate perspective shift
	/// </summary>
    [Property, Title("Upper Scale"),Range( 0.0f, 1.0f, 0, true)]  
    public float dUpper { get; set; } = 0.0f; 
	
	/// <summary>
	///  Scales the lower edge, disables upper scale when above 0.
	/// </summary>
    [Property, Title("Lower Scale"), Range( 0.0f, 1.0f, 0, true )]  
    public float dLower { get; set; } = 0.0f;
	
	
	
	/// <summary>
	/// Smooth the resulting image.
	/// </summary>
	[Property, Title("Smooth"), Range( 100.0f, 200.0f, 0, true )]  //zoom
    public bool Filter { get; set; }

	

    IDisposable renderHook;
	
//	protected override void OnUpdate()
//	{
//
//	}

    protected override void OnEnabled()
    {
		
		
		renderHook?.Dispose();
		var cc = Components.Get<CameraComponent>( true );
		
		renderHook = cc.AddHookAfterTransparent( "CCSPerspectiveShift", 2001, RenderEffect );
		
    }
	
    protected override void OnDisabled()
    {
        renderHook?.Dispose();
        renderHook = null;
    }

    RenderAttributes attributes = new RenderAttributes();

	
    public void RenderEffect( SceneCamera camera )
    {
        if ( !camera.EnablePostProcessing )
            return;

		
		
		attributes.Set( "dUpper", dUpper );
        attributes.Set( "dLower", dLower );
		attributes.Set( "Filter", Filter );
		Graphics.GrabFrameTexture( "ColorBuffer", attributes );
        Graphics.Blit( Material.Load( "materials/postprocess/ccs_perspectiveshift.vmat" ), attributes );

    }
}