// Update m_CurrentWaterShaderType according to current selected water
    void UpdateCurrentShaderType()
    {
        // Check if there is renderer component
        if(m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>()==null)
            return;
        if(m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material==null)
            return;

        switch(m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.shader.name)
        {
            // Water Diffuse shader
            case "Water Flow/Water Diffuse":

                m_CurrentWaterShaderType 			= eWaterShaderType.WaterDiffuse;

                m_WaterDiffuse_Diffuse 				= m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetColor("_MainTexColor");
                m_WaterDiffuse_Multiply 			= m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetFloat("_MainTexMultiply");
                m_WaterDiffuse_UMoveSpeed 			= m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetFloat("_MainTexMoveSpeedU");
                m_WaterDiffuse_VMoveSpeed 			= m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetFloat("_MainTexMoveSpeedV");

                m_WaterDiffuseOld_Diffuse			= m_WaterDiffuse_Diffuse;
                m_WaterDiffuseOld_Multiply 			= m_WaterDiffuse_Multiply;
                m_WaterDiffuseOld_UMoveSpeed		= m_WaterDiffuse_UMoveSpeed;
                m_WaterDiffuseOld_VMoveSpeed		= m_WaterDiffuse_VMoveSpeed;

                break;

            // Water Heightmap shader
            case "Water Flow/Water Heightmap":

                m_CurrentWaterShaderType			= eWaterShaderType.WaterHeightmap;

                Texture txHeightMap1 = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetTexture("_HeightMap1");
                Texture txHeightMap2 = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetTexture("_HeightMap2");
                for(int i=0;i<m_HeightMapTextures.Length;i++)
                {
                    if(m_HeightMapTextures[i].name == txHeightMap1.name)
                    {
                        m_WaterHeightMap1Index = i;
                    }
                    if(m_HeightMapTextures[i].name == txHeightMap2.name)
                    {
                        m_WaterHeightMap2Index = i;
                    }
                }

                m_WaterHeightmap_WaterTile 			= m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetFloat("_MainTexTile");
                m_WaterHeightmap_HeightmapTile 		= m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetFloat("_HeightMapTile");
                m_WaterHeightmap_Refraction 		= m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetFloat("_MainTexRefraction");
                m_WaterHeightmap_Strength 			= m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetFloat("_HeightMapStrength");
                m_WaterHeightmap_Multiply 			= m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetFloat("_HeightMapMultiply");

                m_WaterHeightmapOld_WaterTile		= m_WaterHeightmap_WaterTile;
                m_WaterHeightmapOld_HeightmapTile	= m_WaterHeightmap_HeightmapTile;
                m_WaterHeightmapOld_Refraction		= m_WaterHeightmap_Refraction;
                m_WaterHeightmapOld_Strength		= m_WaterHeightmap_Strength;
                m_WaterHeightmapOld_Multiply		= m_WaterHeightmap_Multiply;

                break;

            // Water Simple shader
            case "Water Flow/Water Simple":

                m_CurrentWaterShaderType			= eWaterShaderType.WaterSimple;

                m_WaterSimple_Ambient				= RenderSettings.ambientLight;
                m_WaterSimple_UMoveSpeed 			= m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetFloat("_MainTexMoveSpeedU");
                m_WaterSimple_VMoveSpeed 			= m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent<Renderer>().material.GetFloat("_MainTexMoveSpeedV");

                m_WaterSimpleOld_Ambient			= m_WaterSimple_Ambient;
                m_WaterSimpleOld_UMoveSpeed			= m_WaterSimple_UMoveSpeed;
                m_WaterSimpleOld_VMoveSpeed			= m_WaterSimple_VMoveSpeed;

                break;

            // Unknown shader
            default:

                m_CurrentWaterShaderType = eWaterShaderType.None;

                break;
        }
    }
    // ######################################################################
    //  Utilities functions
    // ######################################################################

    #region Utilities functions

    // Update m_CurrentWaterShaderType according to current selected water
    void UpdateCurrentShaderType()
    {
        // Check if there is renderer component
        if (m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>() == null)
        {
            return;
        }
        if (m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material == null)
        {
            return;
        }

        switch (m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.shader.name)
        {
        // Water Diffuse shader
        case "Water Flow/Water Diffuse":

            m_CurrentWaterShaderType = eWaterShaderType.WaterDiffuse;

            m_WaterDiffuse_Diffuse    = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetColor("_MainTexColor");
            m_WaterDiffuse_Multiply   = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetFloat("_MainTexMultiply");
            m_WaterDiffuse_UMoveSpeed = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetFloat("_MainTexMoveSpeedU");
            m_WaterDiffuse_VMoveSpeed = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetFloat("_MainTexMoveSpeedV");

            m_WaterDiffuseOld_Diffuse    = m_WaterDiffuse_Diffuse;
            m_WaterDiffuseOld_Multiply   = m_WaterDiffuse_Multiply;
            m_WaterDiffuseOld_UMoveSpeed = m_WaterDiffuse_UMoveSpeed;
            m_WaterDiffuseOld_VMoveSpeed = m_WaterDiffuse_VMoveSpeed;

            break;

        // Water Heightmap shader
        case "Water Flow/Water Heightmap":

            m_CurrentWaterShaderType = eWaterShaderType.WaterHeightmap;

            Texture txHeightMap1 = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetTexture("_HeightMap1");
            Texture txHeightMap2 = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetTexture("_HeightMap2");
            for (int i = 0; i < m_HeightMapTextures.Length; i++)
            {
                if (m_HeightMapTextures[i].name == txHeightMap1.name)
                {
                    m_WaterHeightMap1Index = i;
                }
                if (m_HeightMapTextures[i].name == txHeightMap2.name)
                {
                    m_WaterHeightMap2Index = i;
                }
            }

            m_WaterHeightmap_WaterTile     = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetFloat("_MainTexTile");
            m_WaterHeightmap_HeightmapTile = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetFloat("_HeightMapTile");
            m_WaterHeightmap_Refraction    = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetFloat("_MainTexRefraction");
            m_WaterHeightmap_Strength      = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetFloat("_HeightMapStrength");
            m_WaterHeightmap_Multiply      = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetFloat("_HeightMapMultiply");

            m_WaterHeightmapOld_WaterTile     = m_WaterHeightmap_WaterTile;
            m_WaterHeightmapOld_HeightmapTile = m_WaterHeightmap_HeightmapTile;
            m_WaterHeightmapOld_Refraction    = m_WaterHeightmap_Refraction;
            m_WaterHeightmapOld_Strength      = m_WaterHeightmap_Strength;
            m_WaterHeightmapOld_Multiply      = m_WaterHeightmap_Multiply;

            break;

        // Water Simple shader
        case "Water Flow/Water Simple":

            m_CurrentWaterShaderType = eWaterShaderType.WaterSimple;

            m_WaterSimple_Ambient    = RenderSettings.ambientLight;
            m_WaterSimple_UMoveSpeed = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetFloat("_MainTexMoveSpeedU");
            m_WaterSimple_VMoveSpeed = m_WaterList[m_CurrentWaterIndex].gameObject.GetComponent <Renderer>().material.GetFloat("_MainTexMoveSpeedV");

            m_WaterSimpleOld_Ambient    = m_WaterSimple_Ambient;
            m_WaterSimpleOld_UMoveSpeed = m_WaterSimple_UMoveSpeed;
            m_WaterSimpleOld_VMoveSpeed = m_WaterSimple_VMoveSpeed;

            break;

        // Unknown shader
        default:

            m_CurrentWaterShaderType = eWaterShaderType.None;

            break;
        }
    }