| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905 | using System.Collections;using System.Collections.Generic;using UnityEngine;using System;namespace Enviro {       [Serializable]     public class EnviroVolumetricCloudsQuality     {		public bool volumetricClouds = true;        [Range(1,6)]        public int downsampling = 4;        [Range(32,256)]		public int stepsLayer1 = 128;        [Range(32,256)]		public int stepsLayer2 = 64;        [Range(0f,2f)]        public float blueNoiseIntensity = 1f;        [Range(0f,10f)]		public float reprojectionBlendTime = 10f;        [Range(0f,1f)]		public float lodDistance = 0.25f;    }    [Serializable]     public class EnviroCloudGlobalSettings     {        public bool dualLayer = false;        public Gradient sunLightColorGradient;        public Gradient moonLightColorGradient;        public Gradient ambientColorGradient;        public Color sunLightColor;        public Color moonLightColor;        public Color ambientColor;        public bool depthBlending = false;        public Texture3D noise;         public Texture3D detailNoise;        public Texture2D curlTex;        public Texture2D blueNoise;        public float cloudsWorldScale = 5000000f;        public float atmosphereColorSaturateDistance = 25000f;        [Range(0.0f, 2.0f)]        public float ambientLighIntensity = 1f;        public bool cloudShadows = true;        [Range(0.0f, 2.0f)]        public float cloudShadowsIntensity = 1f;    }    [Serializable]     public class EnviroCloudLayerSettings     {        public float cloudsWindDirectionX = 0f;        public float cloudsWindDirectionY = 1f;        public float windIntensity = 0.001f;        [Range(-1f,1f)]        public float coverage = 1f;        public float worleyFreq2 = 4f;        public float worleyFreq1 = 1f;        [Range(0f,1f)]        public float dilateCoverage = 0.5f;        [Range(0f,1f)]        public float dilateType = 0.5f;        [Range(0f,1f)]        public float cloudsTypeModifier = 0.5f;        public Vector2 locationOffset;        public float bottomCloudsHeight = 2000f;        public float topCloudsHeight = 8000f;         [Range(0f,2f)]        public float density = 0.3f;        [Range(0f,2f)]        public float scatteringIntensity = 1f;        [Range(0f,1f)]         public float silverLiningSpread = 0.8f;        [Range(0f,1f)]        public float powderIntensity = 0.5f;        [Range(0f,1f)]        public float curlIntensity = 0.25f;        [Range(0f,0.25f)]        public float lightStepModifier = 0.05f;        [Range(0f,2f)]        public float lightAbsorbtion = 0.5f;           [Range(0f,1f)]        public float multiScatteringA = 0.5f;        [Range(0f,1f)]        public float multiScatteringB = 0.5f;         [Range(0f,1f)]        public float multiScatteringC = 0.5f;        public float baseNoiseUV = 15f;        public float detailNoiseUV = 50f;        [Range(0.0f, 1.0f)]        public float baseErosionIntensity = 0f;        [Range(0.0f, 1.0f)]        public float detailErosionIntensity = 0.3f;        [Range(0.0f, 1.0f)]        public float anvilBias = 0.0f;    }    public class EnviroVolumetricCloudRenderer    {         // Clouds Rendering        public Camera camera;        public Material raymarchMat;        public Material reprojectMat;        public Material depthMat;        public Material blendAndLightingMat;         public Material shadowMat;        public RenderTexture[] fullBuffer;        public int fullBufferIndex;         public RenderTexture undersampleBuffer;        public RenderTexture downsampledDepth;        public Matrix4x4 prevV;        public int frame = 0;        public bool firstFrame = true;#if ENVIRO_HDRP    public UnityEngine.Rendering.RTHandle[] fullBufferHandles;    public UnityEngine.Rendering.RTHandle undersampleBufferHandle;    public UnityEngine.Rendering.RTHandle downsampledDepthHandle;#endif    }    [Serializable]    [ExecuteInEditMode]    public class EnviroVolumetricCloudsModule : EnviroModule    {           //Base        public Enviro.EnviroCloudLayerSettings settingsLayer1;        public Enviro.EnviroCloudLayerSettings settingsLayer2;        public Enviro.EnviroCloudGlobalSettings settingsGlobal;        public Enviro.EnviroVolumetricCloudsQuality settingsQuality;        public EnviroVolumetricCloudsModule preset;        //Inspector        public bool showGlobalControls;        public bool showLayer1Controls;         public bool showLayer2Controls;        public bool showCoverageControls;        public bool showLightingControls;        public bool showDensityControls;        public bool showTextureControls;        public bool showWindControls;        //Wind        public Vector3 cloudAnimLayer1;        public Vector3 cloudAnimLayer2;        public Vector3 cloudAnimNonScaled;        //Weather Map        public RenderTexture weatherMap;        private Material weatherMapMat;        private ComputeShader weatherMapCS;        private Light dirLight;        //Update Method        public override void UpdateModule ()        {             UpdateWind();            UnityEngine.Profiling.Profiler.BeginSample("Enviro Clouds Weather Map");            weatherMap = EnviroManager.instance.VolumetricClouds.RenderWeatherMap();            UnityEngine.Profiling.Profiler.EndSample();        }         public override void Enable()        {        }        public override void Disable()         {            if(weatherMapMat != null)               DestroyImmediate(weatherMapMat);            if(weatherMap != null)               DestroyImmediate(weatherMap);        }        public void RenderCloudsShadows(RenderTexture source, RenderTexture destination, EnviroVolumetricCloudRenderer renderer)        {             if(renderer.shadowMat == null)                renderer.shadowMat = new Material(Shader.Find("Hidden/EnviroApplyShadows"));                renderer.shadowMat.SetTexture("_CloudsTex",renderer.undersampleBuffer);                renderer.shadowMat.SetFloat("_Intensity",EnviroManager.instance.VolumetricClouds.settingsGlobal.cloudShadowsIntensity);                renderer.shadowMat.SetTexture("_MainTex",source);                Graphics.Blit(source,destination,renderer.shadowMat);        } #if ENVIRO_URP        public void RenderCloudsShadowsURP(EnviroURPRenderPass pass,Camera cam, UnityEngine.Rendering.CommandBuffer cmd, RenderTexture source, UnityEngine.Rendering.RenderTargetIdentifier destination, EnviroVolumetricCloudRenderer renderer)        {              if(renderer.shadowMat == null)                renderer.shadowMat = new Material(Shader.Find("Hidden/EnviroApplyShadows"));                renderer.shadowMat.SetTexture("_CloudsTex",renderer.undersampleBuffer);                renderer.shadowMat.SetFloat("_Intensity",EnviroManager.instance.VolumetricClouds.settingsGlobal.cloudShadowsIntensity);                renderer.shadowMat.EnableKeyword("ENVIROURP");                pass.CustomBlit(cmd,cam.cameraToWorldMatrix,source,destination,renderer.shadowMat);        }#endif#if ENVIRO_HDRP        public void RenderCloudsShadowsHDRP(Camera cam, UnityEngine.Rendering.CommandBuffer cmd, UnityEngine.Rendering.RTHandle source, UnityEngine.Rendering.RTHandle destination, EnviroVolumetricCloudRenderer renderer)        {             if(renderer.shadowMat == null)                renderer.shadowMat = new Material(Shader.Find("Hidden/EnviroApplyShadowsHDRP"));                renderer.shadowMat.SetTexture("_MainTex",source);                renderer.shadowMat.SetTexture("_CloudsTex",renderer.undersampleBufferHandle);                renderer.shadowMat.SetVector("_HandleScales", new Vector4(1/renderer.undersampleBufferHandle.rtHandleProperties.rtHandleScale.x,1/renderer.undersampleBufferHandle.rtHandleProperties.rtHandleScale.y,1,1));                 renderer.shadowMat.SetFloat("_Intensity",EnviroManager.instance.VolumetricClouds.settingsGlobal.cloudShadowsIntensity);                cmd.Blit(source,destination,renderer.shadowMat);        }#endif        /// Render Clouds        public void RenderVolumetricClouds(Camera cam, RenderTexture source, RenderTexture destination, EnviroVolumetricCloudRenderer renderer, EnviroQuality quality)        {            UnityEngine.Profiling.Profiler.BeginSample("Enviro Clouds Rendering");            int downsampling = settingsQuality.downsampling;            if(quality != null)               downsampling = quality.volumetricCloudsOverride.downsampling;            int width = cam.pixelWidth / downsampling;            int height = cam.pixelHeight / downsampling;            if(cam.cameraType != CameraType.Reflection)            {                if (renderer.fullBuffer == null || renderer.fullBuffer.Length != 2)                {                    renderer.fullBuffer = new RenderTexture[2];                }                renderer.fullBufferIndex = (renderer.fullBufferIndex + 1) % 2;                renderer.firstFrame |= CreateRenderTexture(ref renderer.fullBuffer[0], width, height, RenderTextureFormat.ARGBHalf, FilterMode.Bilinear,source.descriptor);                renderer.firstFrame |= CreateRenderTexture(ref renderer.fullBuffer[1], width, height, RenderTextureFormat.ARGBHalf, FilterMode.Bilinear,source.descriptor);            }            renderer.firstFrame |= CreateRenderTexture(ref renderer.undersampleBuffer, width , height, RenderTextureFormat.ARGBHalf, FilterMode.Bilinear,source.descriptor);            renderer.frame++;             if(renderer.frame > 64)              renderer.frame = 0;                if(renderer.depthMat == null)               renderer.depthMat = new Material(Shader.Find("Hidden/EnviroVolumetricCloudsDepth"));             CreateRenderTexture(ref renderer.downsampledDepth, width, height, RenderTextureFormat.RFloat, FilterMode.Point, source.descriptor);            renderer.depthMat.SetTexture("_MainTex", source);            if (downsampling > 1)             {                Graphics.Blit(source, renderer.downsampledDepth, renderer.depthMat, 0);  //Downsample the texture.            }             else             {                Graphics.Blit(source, renderer.downsampledDepth, renderer.depthMat, 1);  //Just copy it.            }                      //1. Raymarch            SetRaymarchShader(cam,renderer, quality);            renderer.raymarchMat.SetTexture("_MainTex", source);            Graphics.Blit(source,renderer.undersampleBuffer,renderer.raymarchMat);            //Pass 2: Reprojection            if(cam.cameraType != CameraType.Reflection)            {                if(renderer.reprojectMat == null)                   renderer.reprojectMat = new Material(Shader.Find("Hidden/EnviroVolumetricCloudsReproject"));                SetReprojectShader(cam, renderer, quality);                    if (renderer.firstFrame)                 {                    Graphics.Blit(renderer.undersampleBuffer, renderer.fullBuffer[renderer.fullBufferIndex]);                }                renderer.reprojectMat.SetTexture("_MainTex", renderer.fullBuffer[renderer.fullBufferIndex]);                Graphics.Blit(renderer.fullBuffer[renderer.fullBufferIndex], renderer.fullBuffer[renderer.fullBufferIndex ^ 1], renderer.reprojectMat);            }             //Pass 3: Lighting and Blending            if(renderer.blendAndLightingMat == null)               renderer.blendAndLightingMat = new Material(Shader.Find("Hidden/EnviroVolumetricCloudsBlend"));            SetBlendShader(cam,renderer);            renderer.blendAndLightingMat.SetTexture("_MainTex", source);            Graphics.Blit(source, destination, renderer.blendAndLightingMat);              renderer.prevV = cam.worldToCameraMatrix;            renderer.firstFrame = false;            UnityEngine.Profiling.Profiler.EndSample();        } #if ENVIRO_URP        public void RenderVolumetricCloudsURP(UnityEngine.Rendering.Universal.RenderingData renderingData, EnviroURPRenderPass pass, UnityEngine.Rendering.CommandBuffer cmd,  RenderTexture source, UnityEngine.Rendering.RenderTargetIdentifier destination, EnviroVolumetricCloudRenderer renderer, EnviroQuality quality)        {            UnityEngine.Profiling.Profiler.BeginSample("Enviro Clouds Rendering");            int downsampling = settingsQuality.downsampling;            if(quality != null)               downsampling = quality.volumetricCloudsOverride.downsampling;            int width = renderingData.cameraData.camera.pixelWidth / downsampling;            int height = renderingData.cameraData.camera.pixelHeight / downsampling;            if(renderingData.cameraData.camera.cameraType != CameraType.Reflection)            {                if (renderer.fullBuffer == null || renderer.fullBuffer.Length != 2)                {                    renderer.fullBuffer = new RenderTexture[2];                }                renderer.fullBufferIndex = (renderer.fullBufferIndex + 1) % 2;                    renderer.firstFrame |= CreateRenderTexture(ref renderer.fullBuffer[0], width, height, RenderTextureFormat.ARGBHalf, FilterMode.Bilinear,source.descriptor);            renderer.firstFrame |= CreateRenderTexture(ref renderer.fullBuffer[1], width, height, RenderTextureFormat.ARGBHalf, FilterMode.Bilinear,source.descriptor);            }                          renderer.firstFrame |= CreateRenderTexture(ref renderer.undersampleBuffer, width , height, RenderTextureFormat.ARGBHalf, FilterMode.Bilinear,source.descriptor);            renderer.frame++;             if(renderer.frame > 64)              renderer.frame = 0;                if(renderer.depthMat == null)               renderer.depthMat = new Material(Shader.Find("Hidden/EnviroVolumetricCloudsDepth"));                        SetToURP(renderer.depthMat);               CreateRenderTexture(ref renderer.downsampledDepth, width, height, RenderTextureFormat.RFloat, FilterMode.Point, source.descriptor);                        if (downsampling > 1)             {                pass.CustomBlit(cmd,renderingData.cameraData.camera.cameraToWorldMatrix,source,renderer.downsampledDepth,renderer.depthMat,0);            }             else             {                pass.CustomBlit(cmd,renderingData.cameraData.camera.cameraToWorldMatrix,source,renderer.downsampledDepth,renderer.depthMat,1);            }                      //1. Raymarch                        SetRaymarchShader(renderingData.cameraData.camera,renderer, quality);                       SetToURP(renderer.raymarchMat);                 pass.CustomBlit(cmd,renderingData.cameraData.camera.cameraToWorldMatrix,source,renderer.undersampleBuffer,renderer.raymarchMat);              //Pass 2: Reprojection            if(renderingData.cameraData.camera.cameraType != CameraType.Reflection)            {                     if(renderer.reprojectMat == null)                   renderer.reprojectMat = new Material(Shader.Find("Hidden/EnviroVolumetricCloudsReproject"));                SetReprojectShader(renderingData.cameraData.camera, renderer, quality);                SetToURP(renderer.reprojectMat);                                if (renderer.firstFrame)                     pass.CustomBlit(cmd,renderingData.cameraData.camera.cameraToWorldMatrix,renderer.undersampleBuffer,renderer.fullBuffer[renderer.fullBufferIndex]);                pass.CustomBlit(cmd,renderingData.cameraData.camera.cameraToWorldMatrix,renderer.fullBuffer[renderer.fullBufferIndex],renderer.fullBuffer[renderer.fullBufferIndex ^ 1],renderer.reprojectMat);            }            //Pass 3: Lighting and Blending                   if(renderer.blendAndLightingMat == null)               renderer.blendAndLightingMat = new Material(Shader.Find("Hidden/EnviroVolumetricCloudsBlend"));            SetBlendShader(renderingData.cameraData.camera,renderer);            SetToURP(renderer.blendAndLightingMat);             pass.CustomBlit(cmd,renderingData.cameraData.camera.cameraToWorldMatrix,source,destination,renderer.blendAndLightingMat);            renderer.prevV = renderingData.cameraData.camera.worldToCameraMatrix;            renderer.firstFrame = false;             UnityEngine.Profiling.Profiler.EndSample();        }#endif#if ENVIRO_HDRP         public void RenderVolumetricCloudsHDRP(Camera cam, UnityEngine.Rendering.CommandBuffer cmd, UnityEngine.Rendering.RTHandle source, UnityEngine.Rendering.RTHandle destination, EnviroVolumetricCloudRenderer renderer, EnviroQuality quality)        {             //UnityEngine.Profiling.Profiler.BeginSample("Enviro Clouds Rendering");             int downsampling = settingsQuality.downsampling;            if(quality != null)               downsampling = quality.volumetricCloudsOverride.downsampling;            int width = cam.pixelWidth / downsampling;            int height = cam.pixelHeight / downsampling;            RenderTextureDescriptor desc = source.rt.descriptor;            desc.dimension = UnityEngine.Rendering.TextureDimension.Tex2D;              if(cam.cameraType != CameraType.Reflection)            {                if (renderer.fullBuffer == null || renderer.fullBuffer.Length != 2)                {                    renderer.fullBuffer = new RenderTexture[2];                    renderer.fullBufferHandles = new UnityEngine.Rendering.RTHandle[2];                }                renderer.fullBufferIndex = (renderer.fullBufferIndex + 1) % 2;                renderer.firstFrame |= CreateRenderTexture(ref renderer.fullBuffer[0], width, height, RenderTextureFormat.ARGBHalf, FilterMode.Bilinear,desc);                renderer.firstFrame |= CreateRenderTexture(ref renderer.fullBuffer[1], width, height, RenderTextureFormat.ARGBHalf, FilterMode.Bilinear,desc);                                renderer.fullBufferHandles[0] = UnityEngine.Rendering.RTHandles.Alloc(renderer.fullBuffer[0]);                renderer.fullBufferHandles[1] = UnityEngine.Rendering.RTHandles.Alloc(renderer.fullBuffer[1]);                 }            renderer.firstFrame |= CreateRenderTexture(ref renderer.undersampleBuffer, width , height, RenderTextureFormat.ARGBHalf, FilterMode.Bilinear,desc);            renderer.undersampleBufferHandle = UnityEngine.Rendering.RTHandles.Alloc(renderer.undersampleBuffer);            renderer.frame++;             if(renderer.frame > 64)              renderer.frame = 0;                if(renderer.depthMat == null)               renderer.depthMat = new Material(Shader.Find("Hidden/EnviroVolumetricCloudsDepthHDRP"));             CreateRenderTexture(ref renderer.downsampledDepth, width, height, RenderTextureFormat.RFloat, FilterMode.Point, desc);            renderer.downsampledDepthHandle = UnityEngine.Rendering.RTHandles.Alloc(renderer.downsampledDepth);                  renderer.depthMat.SetTexture("_MainTex", source);            if (downsampling > 1)             {                cmd.Blit(source, renderer.downsampledDepthHandle, renderer.depthMat, 0);  //Downsample the texture.            }             else             {                cmd.Blit(source, renderer.downsampledDepthHandle, renderer.depthMat, 1);  //Just copy it.            }                               //1. Raymarch            SetRaymarchShader(cam,renderer, quality);            renderer.raymarchMat.SetTexture("_MainTex", source);            cmd.Blit(source,renderer.undersampleBufferHandle,renderer.raymarchMat);            //Pass 2: Reprojection            if(cam.cameraType != CameraType.Reflection)            {                if(renderer.reprojectMat == null)                   renderer.reprojectMat = new Material(Shader.Find("Hidden/EnviroVolumetricCloudsReproject"));                SetReprojectShader(cam, renderer, quality);                    if (renderer.firstFrame)                 {                    cmd.Blit(renderer.undersampleBufferHandle, renderer.fullBufferHandles[renderer.fullBufferIndex]);                }                 renderer.reprojectMat.SetTexture("_MainTex", renderer.fullBufferHandles[renderer.fullBufferIndex]);                cmd.Blit(renderer.fullBufferHandles[renderer.fullBufferIndex], renderer.fullBufferHandles[renderer.fullBufferIndex ^ 1], renderer.reprojectMat);            }            //Pass 3: Lighting and Blending            if(renderer.blendAndLightingMat == null)               renderer.blendAndLightingMat = new Material(Shader.Find("Hidden/EnviroVolumetricCloudsBlendHDRP"));            SetBlendShader(cam,renderer);            renderer.blendAndLightingMat.SetTexture("_MainTex", source);             cmd.Blit(source, destination, renderer.blendAndLightingMat);            renderer.prevV = cam.worldToCameraMatrix;            renderer.firstFrame = false;            //UnityEngine.Profiling.Profiler.EndSample();        }#endif        void SetRaymarchShader (Camera cam, EnviroVolumetricCloudRenderer renderer, EnviroQuality quality)        {            if(renderer.raymarchMat == null)               renderer.raymarchMat = new Material(Shader.Find("Hidden/EnviroCloudsRaymarch"));                if(dirLight == null)            {               dirLight = EnviroHelper.GetDirectionalLight();            }            //Check if we use dual lightmode and change the light only in that case. Otherwise keep it to the cached one.            else if (EnviroManager.instance.Lighting != null && EnviroManager.instance.Lighting.Settings.lightingMode == EnviroLighting.LightingMode.Dual)            {               dirLight = EnviroHelper.GetDirectionalLight();            }            EnviroCloudLayerSettings layer1 = settingsLayer1;            EnviroCloudLayerSettings layer2 = settingsLayer2;            EnviroCloudGlobalSettings global = settingsGlobal;                        float blueNoiseIntensity = settingsQuality.blueNoiseIntensity;            float lodDistance = settingsQuality.lodDistance;            Vector4 steps = new Vector4(settingsQuality.stepsLayer1,settingsQuality.stepsLayer1,settingsQuality.stepsLayer2,settingsQuality.stepsLayer2);            int downsample = settingsQuality.downsampling;            if(quality != null)            {                blueNoiseIntensity = quality.volumetricCloudsOverride.blueNoiseIntensity;                steps = new Vector4(quality.volumetricCloudsOverride.stepsLayer1,quality.volumetricCloudsOverride.stepsLayer1,quality.volumetricCloudsOverride.stepsLayer2,quality.volumetricCloudsOverride.stepsLayer2);                lodDistance = quality.volumetricCloudsOverride.lodDistance;                downsample = quality.volumetricCloudsOverride.downsampling;            }                               //Textures            renderer.raymarchMat.SetTexture("_Noise", settingsGlobal.noise);            renderer.raymarchMat.SetTexture("_DetailNoise", settingsGlobal.detailNoise);             renderer.raymarchMat.SetTexture("_CurlNoise", settingsGlobal.curlTex);            if(weatherMap != null)                renderer.raymarchMat.SetTexture("_WeatherMap",weatherMap);            //Matrix            if(UnityEngine.XR.XRSettings.enabled && UnityEngine.XR.XRSettings.stereoRenderingMode == UnityEngine.XR.XRSettings.StereoRenderingMode.SinglePassInstanced)            {                renderer.raymarchMat.SetMatrix("_InverseProjection", cam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left).inverse);                renderer.raymarchMat.SetMatrix("_InverseRotation", cam.GetStereoViewMatrix(Camera.StereoscopicEye.Left).inverse);                renderer.raymarchMat.SetMatrix("_InverseProjectionRight", cam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right).inverse);                renderer.raymarchMat.SetMatrix("_InverseRotationRight", cam.GetStereoViewMatrix(Camera.StereoscopicEye.Right).inverse);            }            else            {                renderer.raymarchMat.SetMatrix("_InverseProjection", cam.projectionMatrix.inverse);                renderer.raymarchMat.SetMatrix("_InverseRotation", cam.cameraToWorldMatrix);            }               renderer.raymarchMat.SetVector("_CameraPosition", cam.transform.position);            renderer.raymarchMat.SetVector("_Steps", steps);                        if(dirLight != null)            renderer.raymarchMat.SetVector("_LightDir", -dirLight.transform.forward);              else            renderer.raymarchMat.SetVector("_LightDir", Vector3.zero);              renderer.raymarchMat.SetVector("_CloudsNoiseSettings", new Vector4(layer1.baseNoiseUV, layer1.detailNoiseUV, layer2.baseNoiseUV, layer2.detailNoiseUV));            renderer.raymarchMat.SetVector("_CloudsLighting", new Vector4(layer1.scatteringIntensity, 0f, 0f, layer1.silverLiningSpread));            renderer.raymarchMat.SetVector("_CloudsLighting2", new Vector4(layer2.scatteringIntensity, 0f, 0f, layer2.silverLiningSpread));                        renderer.raymarchMat.SetVector("_CloudsLightingExtended", new Vector4(layer1.powderIntensity, layer1.curlIntensity, layer1.lightStepModifier, layer1.lightAbsorbtion));               renderer.raymarchMat.SetVector("_CloudsLightingExtended2", new Vector4(layer2.powderIntensity, layer2.curlIntensity, layer2.lightStepModifier, layer2.lightAbsorbtion));            renderer.raymarchMat.SetVector("_CloudsMultiScattering", new Vector4(layer1.multiScatteringA, layer1.multiScatteringB, layer1.multiScatteringC, 0));            renderer.raymarchMat.SetVector("_CloudsMultiScattering2", new Vector4(layer2.multiScatteringA, layer2.multiScatteringB, layer2.multiScatteringC, 0));                        renderer.raymarchMat.SetVector("_CloudsParameter", new Vector4(layer1.bottomCloudsHeight, layer1.topCloudsHeight, 1 / (layer1.topCloudsHeight - layer1.bottomCloudsHeight), settingsGlobal.cloudsWorldScale));            renderer.raymarchMat.SetVector("_CloudsParameter2", new Vector4(layer2.bottomCloudsHeight, layer2.topCloudsHeight, 1 / (layer2.topCloudsHeight - layer2.bottomCloudsHeight), settingsGlobal.cloudsWorldScale));              renderer.raymarchMat.SetVector("_CloudDensityScale", new Vector4(layer1.density, layer2.density, blueNoiseIntensity, 0f));            renderer.raymarchMat.SetVector("_CloudsCoverageSettings", new Vector4(layer1.coverage, 0f, layer1.anvilBias, layer2.anvilBias));            renderer.raymarchMat.SetVector("_CloudsAnimation", new Vector4(cloudAnimLayer1.x, cloudAnimLayer1.y, cloudAnimLayer1.z, 0f));            renderer.raymarchMat.SetVector("_CloudsWindDirection", new Vector4(settingsLayer1.cloudsWindDirectionX, settingsLayer1.cloudsWindDirectionY, cloudAnimNonScaled.x,cloudAnimNonScaled.y));            renderer.raymarchMat.SetVector("_CloudsErosionIntensity", new Vector4(1f - layer1.baseErosionIntensity, layer1.detailErosionIntensity,1f - layer2.baseErosionIntensity, layer2.detailErosionIntensity));             renderer.raymarchMat.SetFloat("_LODDistance", lodDistance);            renderer.raymarchMat.SetTexture("_DownsampledDepth", renderer.downsampledDepth);            renderer.raymarchMat.SetInt("_Frame", renderer.frame);            renderer.raymarchMat.SetTexture("_BlueNoise",settingsGlobal.blueNoise);            renderer.raymarchMat.SetVector("_Randomness", new Vector4(UnityEngine.Random.value, UnityEngine.Random.value, UnityEngine.Random.value, UnityEngine.Random.value));              renderer.raymarchMat.SetVector("_Resolution", new Vector4(renderer.undersampleBuffer.width,renderer.undersampleBuffer.height,downsample,0f));             if(settingsGlobal.dualLayer)                renderer.raymarchMat.EnableKeyword("ENVIRO_DUAL_LAYER");            else                renderer.raymarchMat.DisableKeyword("ENVIRO_DUAL_LAYER");            if(settingsGlobal.cloudShadows)                renderer.raymarchMat.EnableKeyword("ENVIRO_CLOUD_SHADOWS");            else                renderer.raymarchMat.DisableKeyword("ENVIRO_CLOUD_SHADOWS");            SetDepthBlending(renderer.raymarchMat);        }          void SetReprojectShader (Camera cam, EnviroVolumetricCloudRenderer renderer, EnviroQuality quality)        {                      float reprojectionBlendTime = settingsQuality.reprojectionBlendTime;                                if(quality != null)            {                reprojectionBlendTime = quality.volumetricCloudsOverride.reprojectionBlendTime;            }            SetDepthBlending(renderer.reprojectMat);        #if ENVIRO_HDRP            renderer.reprojectMat.SetTexture("_DownsampledDepth", renderer.downsampledDepthHandle);            renderer.reprojectMat.SetTexture("_UndersampleCloudTex", renderer.undersampleBufferHandle);        #else            renderer.reprojectMat.SetTexture("_DownsampledDepth", renderer.downsampledDepth);            renderer.reprojectMat.SetTexture("_UndersampleCloudTex", renderer.undersampleBuffer);        #endif                     if(UnityEngine.XR.XRSettings.enabled && UnityEngine.XR.XRSettings.stereoRenderingMode == UnityEngine.XR.XRSettings.StereoRenderingMode.SinglePassInstanced)             {                renderer.reprojectMat.SetMatrix("_PrevVP", renderer.prevV);                renderer.reprojectMat.SetVector("_ProjectionExtents", EnviroHelper.GetProjectionExtents(cam,Camera.StereoscopicEye.Left));                renderer.reprojectMat.SetVector("_ProjectionExtentsRight", EnviroHelper.GetProjectionExtents(cam,Camera.StereoscopicEye.Right));            }            else             {                renderer.reprojectMat.SetMatrix("_PrevVP", renderer.prevV);                renderer.reprojectMat.SetVector("_ProjectionExtents", EnviroHelper.GetProjectionExtents(cam));            }            renderer.reprojectMat.SetFloat("_BlendTime", reprojectionBlendTime);            Matrix4x4 camtowolrd = Matrix4x4.TRS(cam.transform.position, cam.transform.rotation, Vector3.one);            renderer.reprojectMat.SetMatrix("_CamToWorld",  camtowolrd);        }        void SetBlendShader (Camera cam, EnviroVolumetricCloudRenderer renderer)        {            SetDepthBlending(renderer.blendAndLightingMat);            if(UnityEngine.XR.XRSettings.enabled && UnityEngine.XR.XRSettings.stereoRenderingMode == UnityEngine.XR.XRSettings.StereoRenderingMode.SinglePassInstanced)             {                renderer.blendAndLightingMat.SetVector("_ProjectionExtents", EnviroHelper.GetProjectionExtents(cam,Camera.StereoscopicEye.Left));                renderer.blendAndLightingMat.SetVector("_ProjectionExtentsRight", EnviroHelper.GetProjectionExtents(cam,Camera.StereoscopicEye.Right));            }            else              {                renderer.blendAndLightingMat.SetVector("_ProjectionExtents", EnviroHelper.GetProjectionExtents(cam));            }        #if ENVIRO_HDRP            renderer.blendAndLightingMat.SetTexture("_DownsampledDepth", renderer.downsampledDepthHandle);            renderer.blendAndLightingMat.SetVector("_DepthHandleScale", new Vector4(1/renderer.downsampledDepthHandle.rtHandleProperties.rtHandleScale.x,1/renderer.downsampledDepthHandle.rtHandleProperties.rtHandleScale.y,1,1));        #else             renderer.blendAndLightingMat.SetTexture("_DownsampledDepth", renderer.downsampledDepth);        #endif                       Matrix4x4 camtowolrd = Matrix4x4.TRS(cam.transform.position, cam.transform.rotation, Vector3.one);            renderer.blendAndLightingMat.SetMatrix("_CamToWorld",  camtowolrd);            Color directLightColor;            if(!EnviroManager.instance.isNight)            {                directLightColor = settingsGlobal.sunLightColorGradient.Evaluate(EnviroManager.instance.solarTime);            }            else            {                 directLightColor = settingsGlobal.moonLightColorGradient.Evaluate(EnviroManager.instance.lunarTime);            }            renderer.blendAndLightingMat.SetColor("_DirectLightColor", directLightColor);            renderer.blendAndLightingMat.SetColor("_AmbientColor", settingsGlobal.ambientColorGradient.Evaluate(EnviroManager.instance.solarTime) * settingsGlobal.ambientLighIntensity);            renderer.blendAndLightingMat.SetFloat("_AtmosphereColorSaturateDistance",settingsGlobal.atmosphereColorSaturateDistance);                        //We don't use reprojection pass for reflections.        #if ENVIRO_HDRP            if(cam.cameraType == CameraType.Reflection)            {               renderer.blendAndLightingMat.SetTexture("_CloudTex", renderer.undersampleBufferHandle);               renderer.blendAndLightingMat.SetVector("_HandleScales", new Vector4(1 / renderer.undersampleBufferHandle.rtHandleProperties.rtHandleScale.x, 1 / renderer.undersampleBufferHandle.rtHandleProperties.rtHandleScale.y,1,1));            }              else            {               renderer.blendAndLightingMat.SetTexture("_CloudTex", renderer.fullBufferHandles[renderer.fullBufferIndex ^ 1]);               renderer.blendAndLightingMat.SetVector("_HandleScales", new Vector4(1/ renderer.fullBufferHandles[renderer.fullBufferIndex ^ 1].rtHandleProperties.rtHandleScale.x, 1/ renderer.fullBufferHandles[renderer.fullBufferIndex ^ 1].rtHandleProperties.rtHandleScale.y,1,1));            }        #else            if(cam.cameraType == CameraType.Reflection)            {               renderer.blendAndLightingMat.SetTexture("_CloudTex", renderer.undersampleBuffer);            }              else            {               renderer.blendAndLightingMat.SetTexture("_CloudTex", renderer.fullBuffer[renderer.fullBufferIndex ^ 1]);            }         #endif        }         private void SetDepthBlending(Material mat)        {                    if(settingsGlobal.depthBlending)                mat.EnableKeyword("ENVIRO_DEPTH_BLENDING");            else                mat.DisableKeyword("ENVIRO_DEPTH_BLENDING");        }        private void SetToURP(Material mat)        {                    mat.EnableKeyword("ENVIROURP");        }        public bool CreateRenderTexture(ref RenderTexture texture, int width, int height, RenderTextureFormat format, FilterMode filterMode, RenderTextureDescriptor dsc)        {            if(texture != null && (texture.width != width || texture.height != height || texture.vrUsage != dsc.vrUsage))            {                DestroyImmediate(texture);                texture = null;                         }            if(texture == null)            {                RenderTextureDescriptor d = dsc;                d.width = width;                d.height = height;                d.colorFormat = format;                d.depthBufferBits = 0;                texture = new RenderTexture(d);                texture.antiAliasing = 1;                texture.useMipMap = false;                texture.filterMode = filterMode;                texture.Create();                return true;            }            else            {                return false;            }        }          public RenderTexture RenderWeatherMap()        {            if(weatherMapMat == null)               weatherMapMat = new Material(Shader.Find("Enviro3/Standard/WeatherTexture"));            if (weatherMap == null)            {                weatherMap = new RenderTexture(512, 512, 0, RenderTextureFormat.ARGBFloat);                weatherMap.wrapMode = TextureWrapMode.Repeat;                               }               weatherMapMat.SetFloat("_CoverageLayer1",settingsLayer1.coverage);                weatherMapMat.SetFloat("_WorleyFreq1Layer1", settingsLayer1.worleyFreq1);            weatherMapMat.SetFloat("_WorleyFreq2Layer1",settingsLayer1.worleyFreq2);            weatherMapMat.SetFloat("_DilateCoverageLayer1",settingsLayer1.dilateCoverage);            weatherMapMat.SetFloat("_DilateTypeLayer1",settingsLayer1.dilateType);            weatherMapMat.SetFloat("_CloudsTypeModifierLayer1",settingsLayer1.cloudsTypeModifier);            if(settingsGlobal.dualLayer)            {                weatherMapMat.EnableKeyword("ENVIRO_DUAL_LAYER");                weatherMapMat.SetFloat("_CoverageLayer2",settingsLayer2.coverage);                weatherMapMat.SetFloat("_WorleyFreq1Layer2",settingsLayer2.worleyFreq1);                weatherMapMat.SetFloat("_WorleyFreq2Layer2", settingsLayer2.worleyFreq2);                weatherMapMat.SetFloat("_DilateCoverageLayer2",settingsLayer2.dilateCoverage);                weatherMapMat.SetFloat("_DilateTypeLayer2",settingsLayer2.dilateType);                 weatherMapMat.SetFloat("_CloudsTypeModifierLayer2",settingsLayer2.cloudsTypeModifier);            }            else            {                weatherMapMat.DisableKeyword("ENVIRO_DUAL_LAYER");            }            weatherMapMat.SetVector("_LocationOffset",new Vector4(settingsLayer1.locationOffset.x,settingsLayer1.locationOffset.y,settingsLayer2.locationOffset.x,settingsLayer2.locationOffset.y));            //weatherMapMat.SetVector("_WindDirection", cloudAnimNonScaled);            //weatherMapMat.SetFloat("_WindSpeed",settingsLayer1.windIntensity);            Graphics.Blit(null,weatherMap,weatherMapMat);            return weatherMap;        }        public RenderTexture RenderWeatherMapCS()        {            if(weatherMapMat == null)               weatherMapMat = new Material(Shader.Find("Enviro3/Standard/WeatherMap"));            if(weatherMapCS == null)               weatherMapCS = (ComputeShader)Resources.Load("Shader/Clouds/EnviroWeatherMapCS");            if (weatherMap == null)            {                weatherMap = new RenderTexture(512, 512, 0, RenderTextureFormat.ARGBFloat);                weatherMap.wrapMode = TextureWrapMode.Repeat;                weatherMap.enableRandomWrite = true;                                }             weatherMap.enableRandomWrite = true;               weatherMapCS.SetFloat("_CoverageLayer1",settingsLayer1.coverage);                weatherMapCS.SetFloat("_WorleyFreq1Layer1", settingsLayer1.worleyFreq1);            weatherMapCS.SetFloat("_WorleyFreq2Layer1",settingsLayer1.worleyFreq2);            weatherMapCS.SetFloat("_DilateCoverageLayer1",settingsLayer1.dilateCoverage);            weatherMapCS.SetFloat("_DilateTypeLayer1",settingsLayer1.dilateType);            weatherMapCS.SetFloat("_CloudsTypeModifierLayer1",settingsLayer1.cloudsTypeModifier);            if(settingsGlobal.dualLayer)            {                 weatherMapCS.SetFloat("_CoverageLayer2",settingsLayer2.coverage);                weatherMapCS.SetFloat("_WorleyFreq1Layer2",settingsLayer2.worleyFreq1);                weatherMapCS.SetFloat("_WorleyFreq2Layer2", settingsLayer2.worleyFreq2);                weatherMapCS.SetFloat("_DilateCoverageLayer2",settingsLayer2.dilateCoverage);                weatherMapCS.SetFloat("_DilateTypeLayer2",settingsLayer2.dilateType);                 weatherMapCS.SetFloat("_CloudsTypeModifierLayer2",settingsLayer2.cloudsTypeModifier);            }            weatherMapCS.SetVector("_LocationOffset",new Vector4(settingsLayer1.locationOffset.x,settingsLayer1.locationOffset.y,settingsLayer2.locationOffset.x,settingsLayer2.locationOffset.y));            weatherMapCS.SetVector("_WindDirection", cloudAnimNonScaled);            weatherMapCS.SetFloat("_WindSpeed",settingsLayer1.windIntensity);                        weatherMapCS.SetTexture(0,"Result",weatherMap);            weatherMapCS.Dispatch(0, 512/16, 512/16, 1);            return weatherMap;        }         private void UpdateWind()        {                   cloudAnimLayer1 += new Vector3((settingsLayer1.windIntensity * settingsLayer1.cloudsWindDirectionX) * Time.deltaTime, (settingsLayer1.windIntensity * settingsLayer1.cloudsWindDirectionY) * Time.deltaTime, -1f * settingsLayer1.windIntensity * Time.deltaTime);            cloudAnimLayer1 = EnviroHelper.PingPong(cloudAnimLayer1);            if(settingsGlobal.dualLayer)            {                cloudAnimLayer2 += new Vector3((settingsLayer2.windIntensity * settingsLayer2.cloudsWindDirectionX) * Time.deltaTime, (settingsLayer2.windIntensity * settingsLayer2.cloudsWindDirectionY) * Time.deltaTime, -1f * settingsLayer2.windIntensity * Time.deltaTime);                cloudAnimLayer2 = EnviroHelper.PingPong(cloudAnimLayer2);            }            cloudAnimNonScaled += new Vector3((settingsLayer1.windIntensity * settingsLayer1.cloudsWindDirectionX) * Time.deltaTime, (settingsLayer1.windIntensity * settingsLayer1.cloudsWindDirectionY) * Time.deltaTime, -1f * settingsLayer1.windIntensity * Time.deltaTime) * 0.1f;        }         //Save and Load        public void LoadModuleValues ()        {            if(preset != null)            {                settingsLayer1 = JsonUtility.FromJson<Enviro.EnviroCloudLayerSettings>(JsonUtility.ToJson(preset.settingsLayer1));                settingsLayer2 = JsonUtility.FromJson<Enviro.EnviroCloudLayerSettings>(JsonUtility.ToJson(preset.settingsLayer2));                settingsGlobal = JsonUtility.FromJson<Enviro.EnviroCloudGlobalSettings>(JsonUtility.ToJson(preset.settingsGlobal));            }            else            {                Debug.Log("Please assign a saved module to load from!");            }        }        public void SaveModuleValues ()        {#if UNITY_EDITOR        EnviroVolumetricCloudsModule t =  ScriptableObject.CreateInstance<EnviroVolumetricCloudsModule>();        t.name = "Cloud Module";        t.settingsLayer1 = JsonUtility.FromJson<Enviro.EnviroCloudLayerSettings>(JsonUtility.ToJson(settingsLayer1));        t.settingsLayer2 = JsonUtility.FromJson<Enviro.EnviroCloudLayerSettings>(JsonUtility.ToJson(settingsLayer2));        t.settingsGlobal = JsonUtility.FromJson<Enviro.EnviroCloudGlobalSettings>(JsonUtility.ToJson(settingsGlobal));        string assetPathAndName = UnityEditor.AssetDatabase.GenerateUniqueAssetPath("Assets/Enviro 3" + "/New " + t.name + ".asset");        UnityEditor.AssetDatabase.CreateAsset(t, assetPathAndName);        UnityEditor.AssetDatabase.SaveAssets();        UnityEditor.AssetDatabase.Refresh();#endif        }        public void SaveModuleValues (EnviroVolumetricCloudsModule module)        {            module.settingsLayer1 = JsonUtility.FromJson<Enviro.EnviroCloudLayerSettings>(JsonUtility.ToJson(settingsLayer1));            module.settingsLayer2 = JsonUtility.FromJson<Enviro.EnviroCloudLayerSettings>(JsonUtility.ToJson(settingsLayer2));            module.settingsGlobal = JsonUtility.FromJson<Enviro.EnviroCloudGlobalSettings>(JsonUtility.ToJson(settingsGlobal));            #if UNITY_EDITOR            UnityEditor.EditorUtility.SetDirty(module);            UnityEditor.AssetDatabase.SaveAssets();            #endif        }    }}
 |