internal static void SetGlobalSkyParameters(Gradient skyGradient, float skyAtmosphereMie, float skyMieMultiplier, float skyRayleighMultiplier, float skyAtmosphereThickness,
                                                    float skyAtmosphereTurbidity, float skyExposure, Color skyTintColor, float skyOuterRadius, float skyInnerRadius, float skyCameraHeight, Vector4 waveLength)
        {
            // global sky parameters
            float mieG             = -skyAtmosphereMie;
            float mieG2            = skyAtmosphereMie * skyAtmosphereMie;
            float mieConstant      = 0.001f * skyMieMultiplier;
            float rayleighConstant = 0.0025f * skyRayleighMultiplier;

            rayleighConstant = Mathf.LerpUnclamped(0.0f, rayleighConstant, Mathf.Pow(skyAtmosphereThickness, 2.5f));
            float       redColor                     = waveLength.x;
            float       greenColor                   = waveLength.y;
            float       blueColor                    = waveLength.z;
            float       lightRange                   = waveLength.w;
            float       lightWaveLengthRedTint       = Mathf.Lerp(redColor - lightRange, redColor + lightRange, 1.0f - skyTintColor.r);
            float       lightWaveLengthGreenTint     = Mathf.Lerp(greenColor - lightRange, greenColor + lightRange, 1.0f - skyTintColor.g);
            float       lightWaveLengthBlueTint      = Mathf.Lerp(blueColor - lightRange, blueColor + lightRange, 1.0f - skyTintColor.b);
            float       lightWaveLengthRed4          = lightWaveLengthRedTint * lightWaveLengthRedTint * lightWaveLengthRedTint * lightWaveLengthRedTint;
            float       lightWaveLengthGreen4        = lightWaveLengthGreenTint * lightWaveLengthGreenTint * lightWaveLengthGreenTint * lightWaveLengthGreenTint;
            float       lightWaveLengthBlue4         = lightWaveLengthBlueTint * lightWaveLengthBlueTint * lightWaveLengthBlueTint * lightWaveLengthBlueTint;
            float       lightInverseWaveLengthRed4   = 1.0f / lightWaveLengthRed4;
            float       lightInverseWaveLengthGreen4 = 1.0f / lightWaveLengthGreen4;
            float       lightInverseWaveLengthBlue4  = 1.0f / lightWaveLengthBlue4;
            const float sunBrightnessFactor          = 40.0f;
            float       sunRed              = rayleighConstant * sunBrightnessFactor * lightInverseWaveLengthRed4;
            float       sunGreen            = rayleighConstant * sunBrightnessFactor * lightInverseWaveLengthGreen4;
            float       sunBlue             = rayleighConstant * sunBrightnessFactor * lightInverseWaveLengthBlue4;
            float       sunIntensity        = mieConstant * sunBrightnessFactor;
            float       pi4Red              = rayleighConstant * 4.0f * skyAtmosphereTurbidity * Mathf.PI * lightInverseWaveLengthRed4;
            float       pi4Green            = rayleighConstant * 4.0f * skyAtmosphereTurbidity * Mathf.PI * lightInverseWaveLengthGreen4;
            float       pi4Blue             = rayleighConstant * 4.0f * skyAtmosphereTurbidity * Mathf.PI * lightInverseWaveLengthBlue4;
            float       pi4Intensity        = mieConstant * 4.0f * skyAtmosphereTurbidity * Mathf.PI;
            float       scaleFactor         = 1.0f / (skyOuterRadius - 1.0f);
            const float scaleDepth          = 0.25f;
            float       scaleOverScaleDepth = scaleFactor / scaleDepth;
            Vector4     col = WeatherMakerScript.EvaluateSunGradient(skyGradient);

            col.w = skyExposure;
            Shader.SetGlobalVector("_WeatherMakerSkyGradientColor", col);
            Shader.SetGlobalFloat("_WeatherMakerSkySamples", 3.0f);
            float mieDot = Mathf.Pow(1.0f - Vector3.Dot(Vector3.up, -WeatherMakerScript.Instance.Sun.Transform.forward), 5.0f);

            Shader.SetGlobalVector("_WeatherMakerSkyMieG", new Vector4(mieG, mieG2, -mieG, mieDot));
            Shader.SetGlobalVector("_WeatherMakerSkyAtmosphereParams", new Vector4(skyAtmosphereThickness, skyAtmosphereTurbidity, skyExposure, 0.0f));
            Shader.SetGlobalVector("_WeatherMakerSkyRadius", new Vector4(skyOuterRadius, skyOuterRadius * skyOuterRadius, skyInnerRadius, skyInnerRadius * skyInnerRadius));
            Shader.SetGlobalVector("_WeatherMakerSkyMie", new Vector4(1.5f * ((1.0f - mieG2) / (2.0f + mieG2)), 1.0f + mieG2, 2.0f + mieG, 0.0f));
            Shader.SetGlobalVector("_WeatherMakerSkyLightScattering", new Vector4(sunRed, sunGreen, sunBlue, sunIntensity));
            Shader.SetGlobalVector("_WeatherMakerSkyLightPIScattering", new Vector4(pi4Red, pi4Green, pi4Blue, pi4Intensity));
            Shader.SetGlobalVector("_WeatherMakerSkyScale", new Vector4(scaleFactor, scaleDepth, scaleOverScaleDepth, skyCameraHeight));

            // reduce wave length for preetham sky formulas
            waveLength *= 1E-6f;
            Shader.SetGlobalVector("_WeatherMakerSkyTotalRayleigh", GetTotalRayleigh(waveLength, skyRayleighMultiplier * skyAtmosphereThickness));
            Shader.SetGlobalVector("_WeatherMakerSkyTotalMie", GetTotalMie(waveLength, skyAtmosphereTurbidity, skyMieMultiplier));
        }
        public void SetShaderCloudParameters(Material m)
        {
            m.DisableKeyword("ENABLE_CLOUDS");
            m.DisableKeyword("ENABLE_CLOUDS_MASK");

            if (CloudsEnabled)
            {
                m.SetTexture("_CloudNoise1", CloudLayer1.CloudNoise ?? Texture2D.blackTexture);
                m.SetTexture("_CloudNoise2", CloudLayer2.CloudNoise ?? Texture2D.blackTexture);
                m.SetTexture("_CloudNoise3", CloudLayer3.CloudNoise ?? Texture2D.blackTexture);
                m.SetTexture("_CloudNoise4", CloudLayer4.CloudNoise ?? Texture2D.blackTexture);

                //WeatherMakerShaderIds.SetFloatArray(m, "_CloudSampleCount", (float)CloudSampleCount, (float)CloudSampleCount2, (float)CloudSampleCount3, (float)CloudSampleCount4);
                //WeatherMakerShaderIds.SetVectorArray(m, "_CloudSampleStepMultiplier", CloudSampleStepMultiplier, CloudSampleStepMultiplier2, CloudSampleStepMultiplier3, CloudSampleStepMultiplier4);
                //WeatherMakerShaderIds.SetFloatArray(m, "_CloudSampleCount", CloudSampleCount, CloudSampleCount2, CloudSampleCount3, CloudSampleCount4);
                //WeatherMakerShaderIds.SetVectorArray(m, "_CloudSampleDitherMagic", CloudSampleDitherMagic, CloudSampleDitherMagic2, CloudSampleDitherMagic3, CloudSampleDitherMagic4);
                //WeatherMakerShaderIds.SetFloatArray(m, "_CloudSampleDitherIntensity", CloudSampleDitherIntensity.x, CloudSampleDitherIntensity.y, CloudSampleDitherIntensity.z, CloudSampleDitherIntensity.w);

                WeatherMakerShaderIds.SetColorArray(m, "_CloudColor",
                                                    CloudLayer1.CloudColor * WeatherMakerScript.EvaluateSunGradient(CloudLayer1.CloudGradientColor),
                                                    CloudLayer2.CloudColor * WeatherMakerScript.EvaluateSunGradient(CloudLayer2.CloudGradientColor),
                                                    CloudLayer3.CloudColor * WeatherMakerScript.EvaluateSunGradient(CloudLayer3.CloudGradientColor),
                                                    CloudLayer4.CloudColor * WeatherMakerScript.EvaluateSunGradient(CloudLayer4.CloudGradientColor));
                WeatherMakerShaderIds.SetColorArray(m, "_CloudEmissionColor",
                                                    CloudLayer1.CloudEmissionColor,
                                                    CloudLayer2.CloudEmissionColor,
                                                    CloudLayer3.CloudEmissionColor,
                                                    CloudLayer4.CloudEmissionColor);
                WeatherMakerShaderIds.SetFloatArray(m, "_CloudAmbientMultiplier",
                                                    CloudLayer1.CloudAmbientMultiplier,
                                                    CloudLayer2.CloudAmbientMultiplier,
                                                    CloudLayer3.CloudAmbientMultiplier,
                                                    CloudLayer4.CloudAmbientMultiplier);
                WeatherMakerShaderIds.SetVectorArray(m, "_CloudNoiseScale",
                                                     CloudLayer1.CloudNoiseScale * scaleReducer,
                                                     CloudLayer2.CloudNoiseScale * scaleReducer,
                                                     CloudLayer3.CloudNoiseScale * scaleReducer,
                                                     CloudLayer4.CloudNoiseScale * scaleReducer);
                WeatherMakerShaderIds.SetVectorArray(m, "_CloudNoiseMultiplier",
                                                     CloudLayer1.CloudNoiseMultiplier,
                                                     CloudLayer2.CloudNoiseMultiplier,
                                                     CloudLayer3.CloudNoiseMultiplier,
                                                     CloudLayer4.CloudNoiseMultiplier);
                float velMult = Time.deltaTime * 0.005f;
                WeatherMakerShaderIds.SetVectorArray(m, "_CloudNoiseVelocity",
                                                     (cloudNoiseVelocityAccum1 += (CloudLayer1.CloudNoiseVelocity * velMult)),
                                                     (cloudNoiseVelocityAccum2 += (CloudLayer2.CloudNoiseVelocity * velMult)),
                                                     (cloudNoiseVelocityAccum3 += (CloudLayer3.CloudNoiseVelocity * velMult)),
                                                     (cloudNoiseVelocityAccum4 += (CloudLayer4.CloudNoiseVelocity * velMult)));
                WeatherMakerShaderIds.SetFloatArrayRotation(m, "_CloudNoiseRotation",
                                                            CloudLayer1.CloudNoiseRotation.LastValue,
                                                            CloudLayer2.CloudNoiseRotation.LastValue,
                                                            CloudLayer3.CloudNoiseRotation.LastValue,
                                                            CloudLayer4.CloudNoiseRotation.LastValue);
                if (CloudLayer1.CloudNoiseMask == null && CloudLayer2.CloudNoiseMask == null && CloudLayer3.CloudNoiseMask == null && CloudLayer4.CloudNoiseMask == null)
                {
                    m.EnableKeyword("ENABLE_CLOUDS");
                }
                else
                {
                    m.EnableKeyword("ENABLE_CLOUDS_MASK");
                    m.SetTexture("_CloudNoiseMask1", CloudLayer1.CloudNoiseMask ?? Texture2D.whiteTexture);
                    m.SetTexture("_CloudNoiseMask2", CloudLayer2.CloudNoiseMask ?? Texture2D.whiteTexture);
                    m.SetTexture("_CloudNoiseMask3", CloudLayer3.CloudNoiseMask ?? Texture2D.whiteTexture);
                    m.SetTexture("_CloudNoiseMask4", CloudLayer4.CloudNoiseMask ?? Texture2D.whiteTexture);
                    WeatherMakerShaderIds.SetVectorArray(m, "_CloudNoiseMaskOffset",
                                                         CloudLayer1.CloudNoiseMaskOffset,
                                                         CloudLayer2.CloudNoiseMaskOffset,
                                                         CloudLayer3.CloudNoiseMaskOffset,
                                                         CloudLayer4.CloudNoiseMaskOffset);
                    WeatherMakerShaderIds.SetVectorArray(m, "_CloudNoiseMaskVelocity",
                                                         (cloudNoiseMaskVelocityAccum1 += (CloudLayer1.CloudNoiseMaskVelocity * velMult)),
                                                         (cloudNoiseMaskVelocityAccum2 += (CloudLayer2.CloudNoiseMaskVelocity * velMult)),
                                                         (cloudNoiseMaskVelocityAccum3 += (CloudLayer3.CloudNoiseMaskVelocity * velMult)),
                                                         (cloudNoiseMaskVelocityAccum4 += (CloudLayer4.CloudNoiseMaskVelocity * velMult)));
                    WeatherMakerShaderIds.SetFloatArray(m, "_CloudNoiseMaskScale",
                                                        CloudLayer1.CloudNoiseMaskScale * scaleReducer,
                                                        CloudLayer2.CloudNoiseMaskScale * scaleReducer,
                                                        CloudLayer3.CloudNoiseMaskScale * scaleReducer,
                                                        CloudLayer4.CloudNoiseMaskScale * scaleReducer);
                    WeatherMakerShaderIds.SetFloatArrayRotation(m, "_CloudNoiseMaskRotation",
                                                                CloudLayer1.CloudNoiseMaskRotation.LastValue,
                                                                CloudLayer2.CloudNoiseMaskRotation.LastValue,
                                                                CloudLayer3.CloudNoiseMaskRotation.LastValue,
                                                                CloudLayer4.CloudNoiseMaskRotation.LastValue);
                }
                WeatherMakerShaderIds.SetFloatArray(m, "_CloudHeight",
                                                    CloudLayer1.CloudHeight,
                                                    CloudLayer2.CloudHeight,
                                                    CloudLayer3.CloudHeight,
                                                    CloudLayer4.CloudHeight);
                WeatherMakerShaderIds.SetFloatArray(m, "_CloudCover",
                                                    CloudLayer1.CloudCover,
                                                    CloudLayer2.CloudCover,
                                                    CloudLayer3.CloudCover,
                                                    CloudLayer4.CloudCover);
                WeatherMakerShaderIds.SetFloatArray(m, "_CloudDensity",
                                                    CloudLayer1.CloudDensity,
                                                    CloudLayer2.CloudDensity,
                                                    CloudLayer3.CloudDensity,
                                                    CloudLayer4.CloudDensity);
                WeatherMakerShaderIds.SetFloatArray(m, "_CloudLightAbsorption",
                                                    CloudLayer1.CloudLightAbsorption,
                                                    CloudLayer2.CloudLightAbsorption,
                                                    CloudLayer3.CloudLightAbsorption,
                                                    CloudLayer4.CloudLightAbsorption);
                WeatherMakerShaderIds.SetFloatArray(m, "_CloudSharpness",
                                                    CloudLayer1.CloudSharpness,
                                                    CloudLayer2.CloudSharpness,
                                                    CloudLayer3.CloudSharpness,
                                                    CloudLayer4.CloudSharpness);
                WeatherMakerShaderIds.SetFloatArray(m, "_CloudShadowThreshold",
                                                    CloudLayer1.CloudShadowThreshold,
                                                    CloudLayer2.CloudShadowThreshold,
                                                    CloudLayer3.CloudShadowThreshold,
                                                    CloudLayer4.CloudShadowThreshold);
                float shadowDotPower = Mathf.Clamp(Mathf.Pow(3.0f * Vector3.Dot(Vector3.down, WeatherMakerScript.Instance.Sun.Transform.forward), 0.5f), 0.0f, 1.0f);
                float shadowPower1   = Mathf.Lerp(2.0f, CloudLayer1.CloudShadowPower, shadowDotPower);
                float shadowPower2   = Mathf.Lerp(2.0f, CloudLayer2.CloudShadowPower, shadowDotPower);
                float shadowPower3   = Mathf.Lerp(2.0f, CloudLayer3.CloudShadowPower, shadowDotPower);
                float shadowPower4   = Mathf.Lerp(2.0f, CloudLayer4.CloudShadowPower, shadowDotPower);
                WeatherMakerShaderIds.SetFloatArray(m, "_CloudShadowPower", shadowPower1, shadowPower2, shadowPower3, shadowPower4);
                WeatherMakerShaderIds.SetFloatArray(m, "_CloudRayOffset",
                                                    CloudLayer1.CloudRayOffset,
                                                    CloudLayer2.CloudRayOffset,
                                                    CloudLayer3.CloudRayOffset,
                                                    CloudLayer4.CloudRayOffset);

#if UNITY_EDITOR
                if (Application.isPlaying)
                {
#endif

                float cover = CloudCoverTotal * (1.5f - CloudLightAbsorptionTotal);
                float sunIntensityMultiplier = Mathf.Clamp(1.0f - (CloudDensityTotal * 0.85f), 0.0f, 1.0f);
                WeatherMakerScript.Instance.DayNightScript.DirectionalLightIntensityMultipliers["WeatherMakerFullScreenCloudsScript"] = sunIntensityMultiplier * Mathf.Lerp(1.0f, DirectionalLightIntensityMultiplier, cover);
                float sunShadowMultiplier = Mathf.Lerp(1.0f, 0.0f, Mathf.Clamp(((CloudDensityTotal + cover) * 0.85f), 0.0f, 1.0f));
                WeatherMakerScript.Instance.DayNightScript.DirectionalLightShadowIntensityMultipliers["WeatherMakerFullScreenCloudsScript"] = sunShadowMultiplier * Mathf.Lerp(1.0f, DirectionalLightShadowStrengthMultiplier, cover);

#if UNITY_EDITOR
            }
#endif
            }
            else
            {
#if UNITY_EDITOR
                if (Application.isPlaying)
                {
#endif

                WeatherMakerScript.Instance.DayNightScript.DirectionalLightIntensityMultipliers["WeatherMakerFullScreenCloudsScript"]       = 1.0f;
                WeatherMakerScript.Instance.DayNightScript.DirectionalLightShadowIntensityMultipliers["WeatherMakerFullScreenCloudsScript"] = 1.0f;

#if UNITY_EDITOR
            }
#endif
            }
        }