﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.UI;

public class CommandBufferBlitBehavior : MonoBehaviour
{
    public Shader BriShaderBlit;
    private Material briMaterialBlit;
    public Material BriMaterialBlit
    {
        get
        {
            briMaterialBlit = checkShaderAndCreateMaterial(BriShaderBlit, briMaterialBlit);
            return briMaterialBlit;
        }
    }

    private Material checkShaderAndCreateMaterial(Shader s, Material m)
    {
        if (null == s)
            return null;
        if (null != m && m.shader == s)
            return m;

        m = new Material(s);
        m.hideFlags = HideFlags.DontSave;
        return m;
    }

    [Range(0.0f, 3.0f)]
    public float Brightness = 2.0f;
    [Range(0.0f, 3.0f)]
    public float Saturation = 2.0f;
    [Range(0.0f, 3.0f)]
    public float Contrast = 2.0f;


    Camera mainCamera;
    CommandBuffer cmdBuffer;
    private void Start()
    {

    }
    private void OnEnable()
    {
        mainCamera = Camera.main;
        cmdBuffer = new CommandBuffer { name = "Post-processing" };
        mainCamera.AddCommandBuffer(CameraEvent.AfterImageEffects, cmdBuffer);
        properties = new MaterialPropertyBlock();
        mainTexId = Shader.PropertyToID("_MainTex");
        // mainCamera.forceIntoRenderTexture = true;
        // mainCamera.allowHDR = true;

        renderWithBlit();
    }
    private void OnDisable()
    {
        // mainCamera.forceIntoRenderTexture = false;
        cmdBuffer.Clear();
        mainCamera.RemoveCommandBuffer(CameraEvent.AfterImageEffects, cmdBuffer);
        cmdBuffer = null;
    }

    public MaterialPropertyBlock properties;
    public int mainTexId;
    private bool isInited = false;
    private void OnPreRender()
    {
        

    }

    private void renderWithBlit()
    {
        cmdBuffer.Clear();
        var cameraTarget = BuiltinRenderTextureType.CameraTarget;

        

        // for(int i=0;i<100;i++)
        {
            cmdBuffer.SetGlobalFloat("_Brightness", Brightness);
            cmdBuffer.SetGlobalFloat("_Saturation", Saturation);
            cmdBuffer.SetGlobalFloat("_Contrast", Contrast);

            cmdBuffer.GetTemporaryRT(mainTexId, mainCamera.pixelWidth, mainCamera.pixelHeight);
            // var flipMat = new Material(Shader.Find("Hidden/BlitCopy"));
            cmdBuffer.Blit(BuiltinRenderTextureType.CurrentActive, mainTexId);

            cmdBuffer.Blit(mainTexId, cameraTarget, BriMaterialBlit);

            cmdBuffer.ReleaseTemporaryRT(mainTexId);
        }
        
    }
}
