using System;
using Thousandto.Launcher.ExternalLibs;
using UnityEngine;

namespace UnityStandardAssets.ImageEffects
{
    [ExecuteInEditMode]
    [RequireComponent(typeof(Camera))]
    [AddComponentMenu("Image Effects/DistortEffect/DistortEffect(Optimized)")]
    public class DistortEffect : PostEffectsBase
    {

        [Range(0.0f, 1.0f)]
        public float DistortTimeFactor = 0.15f;
        //扭曲的强度
        [Range(0.0f, 0.2f)]
        public float DistortStrength = 0.01f;
        //噪声图
        public Texture NoiseTexture = null;
        //降采样系数
        public int downSample = 2;
        
        public LayerMask _Cameralayer = 1 << 28;

        private Camera mainCam = null;
        private Camera additionalCam = null;
        private RenderTexture renderTexture = null;
        private Material _Material = null;
        private Shader _Shader = null;
        //渲染Mask图所用的shader
        private Shader maskObjShader = null;
        public void OnRenderImage(RenderTexture source, RenderTexture destination)
        {

            //分辨率可以低一些
            if (renderTexture == null)
                renderTexture = RenderTexture.GetTemporary(source.width, source.height, 0);
            renderTexture.name = "RenderTexture59";
            renderTexture.antiAliasing = 1;

            if (_Material)
            {
                _Material.SetTexture("_NoiseTex", NoiseTexture);
                _Material.SetFloat("_DistortTimeFactor", DistortTimeFactor);
                _Material.SetFloat("_DistortStrength", DistortStrength);
                _Material.SetTexture("_MaskTex", renderTexture);
                Graphics.Blit(source, destination, _Material);
            }
            else
            {
                Graphics.Blit(source, destination);
            }
        }

        public override bool CheckResources()
        {
            CheckSupport(false);

            _Shader = ShaderFactory.Find("Ares/DistortEffect/DistortEffect");
            maskObjShader = ShaderFactory.Find("Ares/DistortEffect/DistortEffectMask");
            _Material = CheckShaderAndCreateMaterial(_Shader, _Material);

            if (!isSupported)
                ReportAutoDisable();
            return isSupported;
        }

        void Awake()
        {
            //创建一个和当前相机一致的相机
            InitAdditionalCam();
        }
        private void InitAdditionalCam()
        {
            mainCam = GetComponent<Camera>();
            if (mainCam == null)
                return;
            Transform addCamTransform = mainCam.transform.Find("additionalDistortCam");
            if (addCamTransform != null)
                DestroyImmediate(addCamTransform.gameObject);
            GameObject additionalCamObj = new GameObject("additionalDistortCam");
            additionalCam = additionalCamObj.AddComponent<Camera>();
            SetAdditionalCam();
        }
        private void SetAdditionalCam()
        {
            if (additionalCam)
            {
                additionalCam.transform.parent = mainCam.transform;
                additionalCam.transform.localPosition = Vector3.zero;
                additionalCam.transform.localRotation = Quaternion.identity;
                additionalCam.transform.localScale = Vector3.one;
                additionalCam.farClipPlane = mainCam.farClipPlane;
                additionalCam.nearClipPlane = mainCam.nearClipPlane;
                additionalCam.fieldOfView = mainCam.fieldOfView;
                additionalCam.backgroundColor = Color.clear;
                additionalCam.clearFlags = CameraClearFlags.Color;
                additionalCam.cullingMask = _Cameralayer;
                additionalCam.depth = -999;
            }
        }
        void OnEnable()
        {
            SetAdditionalCam();
            additionalCam.enabled = true;
        }
        void OnDisable()
        {
            additionalCam.enabled = false;
        }
        void OnDestroy()
        {
            if (renderTexture)
            {
                RenderTexture.ReleaseTemporary(renderTexture);
            }
            DestroyImmediate(additionalCam.gameObject);
        }
        //在真正渲染前的回调,此处渲染Mask遮罩图
        void OnPreRender()
        {
            //maskObjShader进行渲染

            if (additionalCam.enabled)
            {
                additionalCam.targetTexture = renderTexture;
                additionalCam.RenderWithShader(maskObjShader, "");
            }
        }
    }
}