void OnEnable()
 {
     try
     {
         m_MaterialClear = Help.CreateMaterial( "ComposeReflection" );
     }
     catch ( System.Exception _e )
     {
         Help.LogError( "An error occurred while creating the Sky Reflection shader : " + _e.Message );
     }
 }
        public override void OnEnable()
        {
            Help.LogDebug( "ModuleCloudVolume.OnEnable() !" );
            try
            {
                m_MaterialRenderCloud = Help.CreateMaterial( "Clouds/CloudVolume" );
                m_MaterialRenderCloudShadow = Help.CreateMaterial( "Clouds/CloudVolumeShadow" );

                ExitErrorState();
            }
            catch ( Exception _e )
            {
                EnterErrorState( "An error occurred while creating the materials for the module.\r\n" + _e.Message );
            }

            // Forward to layers
            foreach ( CloudLayer L in m_CloudLayers )
                L.OnEnable();
        }
 public void OnEnable()
 {
     m_Material = Help.CreateMaterial( "Utility/ImageScaler" );
     m_MaterialLog = Help.CreateMaterial( "Utility/ImageScalerLog" );
 }
        /// <summary>
        /// Unity.Material Proxy Method
        /// </summary>
        /// <param name="_Source"></param>
        public void CopyPropertiesFromMaterial( NuajMaterial _Source )
        {
            m_Material.CopyPropertiesFromMaterial( _Source.Material );

            // Copy other material's tables
            foreach ( string Key in _Source.m_ParamName2Texture.Keys )
                m_ParamName2Texture[Key] = _Source.m_ParamName2Texture[Key];
            foreach ( string Key in _Source.m_ParamName2CubeMap.Keys )
                m_ParamName2CubeMap[Key] = _Source.m_ParamName2CubeMap[Key];
        }
        /// <summary>
        /// Assigns basic scattering coefficients to a material that would require to compute the optical depth of the atmosphere
        /// </summary>
        /// <param name="_Material"></param>
        /// <param name="_bSetupDensityTexture"></param>
        internal void SetupScatteringCoefficients( NuajMaterial _Material, bool _bSetupDensityTexture )
        {
            // Build the GPU & CPU density textures if they do not already exist
            _Material.SetFloat( "_DensitySeaLevel_Rayleigh", m_DensityRayleigh );
            _Material.SetVector( "_Sigma_Rayleigh", m_SigmaRayleigh );
            _Material.SetFloat( "_DensitySeaLevel_Mie", m_DensityMie );
            _Material.SetFloat( "_Sigma_Mie", m_SigmaMie );
            _Material.SetFloat( "_MiePhaseAnisotropy", Mathf.Clamp( m_ScatteringAnisotropy, -0.99f, +0.99f ) );

            ComputeDensityTexture();
            if ( _bSetupDensityTexture )
             				_Material.SetTexture( "_TexDensity", m_DensityTexture );
        }
        public override void OnEnable()
        {
            Help.LogDebug( "ModuleCloudLayer.OnEnable() !" );
            try
            {
                m_Material = Help.CreateMaterial( "Clouds/CloudLayer" );

                ExitErrorState();
            }
            catch ( Exception _e )
            {
                EnterErrorState( "An error occurred while creating the materials for the module.\r\n" + _e.Message );
            }

            // Forward to layers
            foreach ( CloudLayer L in m_CloudLayers )
            {
                L.Owner = this;	// As Awake() or Start() are not always called...
                L.OnEnable();
            }
        }
        public override void OnEnable()
        {
            Help.LogDebug( "ModulePerspective.OnEnable() !" );
            try
            {
                m_MaterialRenderSkyComplex = Help.CreateMaterial( "Sky/AerialPerspectiveComplex" );
                m_MaterialRenderEnvironmentComplex = Help.CreateMaterial( "Sky/RenderEnvironmentComplex" );
                m_MaterialComposeSkyComplex = Help.CreateMaterial( "Sky/ComposeSkyAndCloudsComplex" );

                m_MaterialRenderSkySimple = Help.CreateMaterial( "Sky/AerialPerspectiveSimple" );
                m_MaterialRenderEnvironmentSimple = Help.CreateMaterial( "Sky/RenderEnvironmentSimple" );
                m_MaterialComposeSkySimple = Help.CreateMaterial( "Sky/ComposeSkyAndCloudsSimple" );

                m_MaterialRenderEnvironmentNone = Help.CreateMaterial( "Sky/RenderEnvironmentNone" );
                m_MaterialComposeSkyNone = Help.CreateMaterial( "Sky/ComposeSkyAndCloudsNone" );

                // Enable fog layer
                m_FogLayer.Owner = this;
                m_FogLayer.OnEnable();

                ExitErrorState();
            }
            catch ( Exception _e )
            {
                EnterErrorState( "An error occurred while creating the materials for the module.\r\n" + _e.Message );
            }

            // Update internal data
            UpdateCachedValues();
        }
        /// <summary>
        /// Performs CPU readback of a 1x1 texture
        /// </summary>
        /// <param name="_Source"></param>
        /// <param name="_PassIndex"></param>
        /// <param name="_ValueIndex"></param>
        /// <param name="_LuminanceScale"></param>
        /// <returns></returns>
        internal Vector3 CPUReadBack( RenderTexture _Source, NuajMaterial _Material, int _PassIndex, int _ValueIndex, float _LuminanceScale )
        {
            m_Owner.RenderToCPU( _Source, _ValueIndex, _Material, _PassIndex );

            // Read back
            Color	PackedResult = m_Owner.CPUReadBack( _ValueIndex );
            return Help.ColorToVec3( PackedResult ) * _LuminanceScale * PackedResult.a;
        }
            public override void OnEnable()
            {
                m_MaterialRender = Help.CreateMaterial( "Clouds/FogVolume" );

                // Update internal data
                UpdateCachedValues();
            }
 protected void SetupSunCloudMaps( NuajMaterial _Material, ICloudLayer[] _Layers )
 {
     switch ( _Layers.Length )
     {
         case 0:
             _Material.SetTexture( "_TexCloudLayer0", m_Owner.m_TextureEmptyCloud, true );
             _Material.SetTexture( "_TexCloudLayer1", m_Owner.m_TextureEmptyCloud, true );
             _Material.SetTexture( "_TexCloudLayer2", m_Owner.m_TextureEmptyCloud, true );
             _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
             break;
         case 1:
             _Material.SetTexture( "_TexCloudLayer0", _Layers[0].EnvironmentRenderTargetSun );
             _Material.SetTexture( "_TexCloudLayer1", m_Owner.m_TextureEmptyCloud, true );
             _Material.SetTexture( "_TexCloudLayer2", m_Owner.m_TextureEmptyCloud, true );
             _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
             break;
         case 2:
             _Material.SetTexture( "_TexCloudLayer0", _Layers[0].EnvironmentRenderTargetSun );
             _Material.SetTexture( "_TexCloudLayer1", _Layers[1].EnvironmentRenderTargetSun );
             _Material.SetTexture( "_TexCloudLayer2", m_Owner.m_TextureEmptyCloud, true );
             _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
             break;
         case 3:
             _Material.SetTexture( "_TexCloudLayer0", _Layers[0].EnvironmentRenderTargetSun );
             _Material.SetTexture( "_TexCloudLayer1", _Layers[1].EnvironmentRenderTargetSun );
             _Material.SetTexture( "_TexCloudLayer2", _Layers[2].EnvironmentRenderTargetSun );
             _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
             break;
         case 4:
             _Material.SetTexture( "_TexCloudLayer0", _Layers[0].EnvironmentRenderTargetSun );
             _Material.SetTexture( "_TexCloudLayer1", _Layers[1].EnvironmentRenderTargetSun );
             _Material.SetTexture( "_TexCloudLayer2", _Layers[2].EnvironmentRenderTargetSun );
             _Material.SetTexture( "_TexCloudLayer3", _Layers[3].EnvironmentRenderTargetSun );
             break;
     }
 }
        protected void SetupSkyParametersSimple( NuajMaterial _Material, ICloudLayer[] _Layers, bool _bIsEnvironmentRendering )
        {
            // Build the GPU & CPU density textures if they do not already exist
            ComputeDensityTexture();
            _Material.SetTexture( "_TexDensity", m_DensityTexture );

            _Material.SetVector( "_Sigma_Rayleigh", m_SigmaRayleigh );
            _Material.SetFloat( "_Sigma_Mie", m_SigmaMie );
            _Material.SetFloat( "_MiePhaseAnisotropy", Mathf.Clamp( m_ScatteringAnisotropy, -0.99f, +0.99f ) );
            _Material.SetFloat( "_PlanetRadiusOffsetKm", m_PlanetRadiusOffsetKm );

            // Prepare cloud Mie factors & cloud layers' textures
            switch ( _Layers.Length )
            {
                case 0:
                    _Material.SetTexture( "_TexCloudLayer0", m_Owner.m_TextureEmptyCloud, true );
                    _Material.SetTexture( "_TexCloudLayer1", m_Owner.m_TextureEmptyCloud, true );
                    _Material.SetTexture( "_TexCloudLayer2", m_Owner.m_TextureEmptyCloud, true );
                    _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
                    break;
                case 1:
                    _Material.SetTexture( "_TexCloudLayer0", _bIsEnvironmentRendering ? _Layers[0].EnvironmentRenderTargetSky : _Layers[0].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer1", m_Owner.m_TextureEmptyCloud, true );
                    _Material.SetTexture( "_TexCloudLayer2", m_Owner.m_TextureEmptyCloud, true );
                    _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
                    break;
                case 2:
                    _Material.SetTexture( "_TexCloudLayer0", _bIsEnvironmentRendering ? _Layers[0].EnvironmentRenderTargetSky : _Layers[0].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer1", _bIsEnvironmentRendering ? _Layers[1].EnvironmentRenderTargetSky : _Layers[1].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer2", m_Owner.m_TextureEmptyCloud, true );
                    _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
                    break;
                case 3:
                    _Material.SetTexture( "_TexCloudLayer0", _bIsEnvironmentRendering ? _Layers[0].EnvironmentRenderTargetSky : _Layers[0].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer1", _bIsEnvironmentRendering ? _Layers[1].EnvironmentRenderTargetSky : _Layers[1].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer2", _bIsEnvironmentRendering ? _Layers[2].EnvironmentRenderTargetSky : _Layers[2].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
                    break;
                case 4:
                    _Material.SetTexture( "_TexCloudLayer0", _bIsEnvironmentRendering ? _Layers[0].EnvironmentRenderTargetSky : _Layers[0].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer1", _bIsEnvironmentRendering ? _Layers[1].EnvironmentRenderTargetSky : _Layers[1].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer2", _bIsEnvironmentRendering ? _Layers[2].EnvironmentRenderTargetSky : _Layers[2].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer3", _bIsEnvironmentRendering ? _Layers[3].EnvironmentRenderTargetSky : _Layers[3].RenderTarget );
                    break;
            }
        }
 protected void SetupSkyParametersNone( NuajMaterial _Material, ICloudLayer[] _Layers, bool _bIsEnvironmentRendering )
 {
     // Prepare cloud Mie factors & cloud layers' textures
     switch ( _Layers.Length )
     {
         case 0:
             _Material.SetTexture( "_TexCloudLayer0", m_Owner.m_TextureEmptyCloud, true );
             _Material.SetTexture( "_TexCloudLayer1", m_Owner.m_TextureEmptyCloud, true );
             _Material.SetTexture( "_TexCloudLayer2", m_Owner.m_TextureEmptyCloud, true );
             _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
             break;
         case 1:
             _Material.SetTexture( "_TexCloudLayer0", _bIsEnvironmentRendering ? _Layers[0].EnvironmentRenderTargetSky : _Layers[0].RenderTarget );
             _Material.SetTexture( "_TexCloudLayer1", m_Owner.m_TextureEmptyCloud, true );
             _Material.SetTexture( "_TexCloudLayer2", m_Owner.m_TextureEmptyCloud, true );
             _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
             break;
         case 2:
             _Material.SetTexture( "_TexCloudLayer0", _bIsEnvironmentRendering ? _Layers[0].EnvironmentRenderTargetSky : _Layers[0].RenderTarget );
             _Material.SetTexture( "_TexCloudLayer1", _bIsEnvironmentRendering ? _Layers[1].EnvironmentRenderTargetSky : _Layers[1].RenderTarget );
             _Material.SetTexture( "_TexCloudLayer2", m_Owner.m_TextureEmptyCloud, true );
             _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
             break;
         case 3:
             _Material.SetTexture( "_TexCloudLayer0", _bIsEnvironmentRendering ? _Layers[0].EnvironmentRenderTargetSky : _Layers[0].RenderTarget );
             _Material.SetTexture( "_TexCloudLayer1", _bIsEnvironmentRendering ? _Layers[1].EnvironmentRenderTargetSky : _Layers[1].RenderTarget );
             _Material.SetTexture( "_TexCloudLayer2", _bIsEnvironmentRendering ? _Layers[2].EnvironmentRenderTargetSky : _Layers[2].RenderTarget );
             _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
             break;
         case 4:
             _Material.SetTexture( "_TexCloudLayer0", _bIsEnvironmentRendering ? _Layers[0].EnvironmentRenderTargetSky : _Layers[0].RenderTarget );
             _Material.SetTexture( "_TexCloudLayer1", _bIsEnvironmentRendering ? _Layers[1].EnvironmentRenderTargetSky : _Layers[1].RenderTarget );
             _Material.SetTexture( "_TexCloudLayer2", _bIsEnvironmentRendering ? _Layers[2].EnvironmentRenderTargetSky : _Layers[2].RenderTarget );
             _Material.SetTexture( "_TexCloudLayer3", _bIsEnvironmentRendering ? _Layers[3].EnvironmentRenderTargetSky : _Layers[3].RenderTarget );
             break;
     }
 }
        /// <summary>
        /// Setups the sky parameters for the sky material
        /// </summary>
        /// <param name="_Material">The material to setup</param>
        /// <param name="_Layers">The array of cloud layers (from 0 to 4 elements)</param>
        /// <param name="_ShadowMap">The shadow map</param>
        /// <param name="_bIsEnvironmentRendering"></param>
        protected void SetupSkyParameters( NuajMaterial _Material, ICloudLayer[] _Layers, Texture _ShadowMap, bool _bIsEnvironmentRendering )
        {
            // Build the GPU & CPU density textures if they do not already exist
            ComputeDensityTexture();
            _Material.SetTexture( "_TexDensity", m_DensityTexture );

            _Material.SetTextureRAW( "_TexShadowMap", _ShadowMap );

            _Material.SetFloat( "_DensitySeaLevel_Rayleigh", m_DensityRayleigh );
            _Material.SetVector( "_Sigma_Rayleigh", m_SigmaRayleigh );
            _Material.SetFloat( "_DensitySeaLevel_Mie", m_DensityMie );
            _Material.SetFloat( "_Sigma_Mie", m_SigmaMie );
            _Material.SetFloat( "_MiePhaseAnisotropy", Mathf.Clamp( m_ScatteringAnisotropy, -0.99f, +0.99f ) );

            _Material.SetFloat( "_SkyStepsCount", m_SkyStepsCount );//+ (_Layers.Length == 0 ? m_UnderCloudsMinStepsCount : 0) );	// Use higher resolution if no cloud layers
            _Material.SetFloat( "_UnderCloudsMinStepsCount", m_bGodRays ? m_UnderCloudsMinStepsCount : 0 );
            _Material.SetFloat( "_bGodRays", m_bGodRays ? 1 : 0 );
            _Material.SetFloat( "_PlanetRadiusOffsetKm", m_PlanetRadiusOffsetKm );

            // Prepare cloud Mie factors & cloud layers' textures
            switch ( _Layers.Length )
            {
                case 0:
                    _Material.SetTexture( "_TexCloudLayer0", m_Owner.m_TextureEmptyCloud, true );
                    _Material.SetTexture( "_TexCloudLayer1", m_Owner.m_TextureEmptyCloud, true );
                    _Material.SetTexture( "_TexCloudLayer2", m_Owner.m_TextureEmptyCloud, true );
                    _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
                    break;
                case 1:
                    _Material.SetTexture( "_TexCloudLayer0", _bIsEnvironmentRendering ? _Layers[0].EnvironmentRenderTargetSky : _Layers[0].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer1", m_Owner.m_TextureEmptyCloud, true );
                    _Material.SetTexture( "_TexCloudLayer2", m_Owner.m_TextureEmptyCloud, true );
                    _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
                    break;
                case 2:
                    _Material.SetTexture( "_TexCloudLayer0", _bIsEnvironmentRendering ? _Layers[0].EnvironmentRenderTargetSky : _Layers[0].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer1", _bIsEnvironmentRendering ? _Layers[1].EnvironmentRenderTargetSky : _Layers[1].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer2", m_Owner.m_TextureEmptyCloud, true );
                    _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
                    break;
                case 3:
                    _Material.SetTexture( "_TexCloudLayer0", _bIsEnvironmentRendering ? _Layers[0].EnvironmentRenderTargetSky : _Layers[0].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer1", _bIsEnvironmentRendering ? _Layers[1].EnvironmentRenderTargetSky : _Layers[1].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer2", _bIsEnvironmentRendering ? _Layers[2].EnvironmentRenderTargetSky : _Layers[2].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer3", m_Owner.m_TextureEmptyCloud, true );
                    break;
                case 4:
                    _Material.SetTexture( "_TexCloudLayer0", _bIsEnvironmentRendering ? _Layers[0].EnvironmentRenderTargetSky : _Layers[0].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer1", _bIsEnvironmentRendering ? _Layers[1].EnvironmentRenderTargetSky : _Layers[1].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer2", _bIsEnvironmentRendering ? _Layers[2].EnvironmentRenderTargetSky : _Layers[2].RenderTarget );
                    _Material.SetTexture( "_TexCloudLayer3", _bIsEnvironmentRendering ? _Layers[3].EnvironmentRenderTargetSky : _Layers[3].RenderTarget );
                    break;
            }
        }