public WaveSpectrumCPU(int size, float windSpeed, float waveAmp, float omega, int ansio, Vector4 gridSizes)
        {
            if (!Mathf.IsPowerOfTwo(size))
            {
                Debug.Log("Fourier grid size must be pow2 number, changing to nearest pow2 number");
                size = Mathf.NextPowerOfTwo(size);
            }

            m_size      = size;
            m_waveAmp   = waveAmp;
            m_windSpeed = windSpeed;
            m_omega     = omega;
            m_gridSizes = gridSizes;

            m_fsize        = (float)m_size;
            m_mipMapLevels = Mathf.Log(m_fsize) / Mathf.Log(2.0f);

            float factor = 2.0f * Mathf.PI * m_fsize;

            m_inverseGridSizes = new Vector4(factor / m_gridSizes.x, factor / m_gridSizes.y, factor / m_gridSizes.z, factor / m_gridSizes.w);

            m_fourierBuffer0 = new Vector2[2, m_size *m_size];
            m_fourierBuffer1 = new Vector4[2, m_size *m_size];
            m_fourierBuffer2 = new Vector4[2, m_size *m_size];

            m_result0 = new Color[m_size * m_size];
            m_result1 = new Color[m_size * m_size];
            m_result2 = new Color[m_size * m_size];

            m_fourier = new FourierCPU(m_size);

            m_map0            = new Texture2D(m_size, m_size, TextureFormat.RGBAFloat, true, true);
            m_map0.wrapMode   = TextureWrapMode.Repeat;
            m_map0.filterMode = FilterMode.Trilinear;
            m_map0.anisoLevel = ansio;

            m_map1            = new Texture2D(m_size, m_size, TextureFormat.RGBAFloat, true, true);
            m_map1.wrapMode   = TextureWrapMode.Repeat;
            m_map1.filterMode = FilterMode.Trilinear;
            m_map1.anisoLevel = ansio;

            m_map2            = new Texture2D(m_size, m_size, TextureFormat.RGBAFloat, true, true);
            m_map2.wrapMode   = TextureWrapMode.Repeat;
            m_map2.filterMode = FilterMode.Trilinear;
            m_map2.anisoLevel = ansio;

            GenerateWavesSpectrum();
            CreateWTabele();
        }
        public WaveSpectrumCPU(int size, float windSpeed, float waveAmp, float omega, int ansio, Vector4 gridSizes)
        {
            if (!Mathf.IsPowerOfTwo(size))
            {
                Debug.Log("Fourier grid size must be pow2 number, changing to nearest pow2 number");
                size = Mathf.NextPowerOfTwo(size);
            }

            //These are the recommend limits of wind speed and wave age.
            //If you exceed them you may see artifacts or objects not floating at wave height
            if (windSpeed > 8.0f)
            {
                Debug.Log("Wind speed must be <= 8.0, changing to 8.0");
                windSpeed = 8.0f;
            }

            if (omega < 0.8f)
            {
                Debug.Log("Inverse wave age must be >= 0.8, changing to 0.8");
                m_omega = 0.8f;
            }

            if (waveAmp < 0.0 || waveAmp > 1.0)
            {
                Debug.Log("Wave amp must be between 0 and 1, clamping");
                Mathf.Clamp01(waveAmp);
            }

            m_size = size;
            m_waveAmp = waveAmp;
            m_windSpeed = windSpeed;
            m_omega = omega;
            m_gridSizes = gridSizes;

            m_fsize = (float)m_size;
            m_mipMapLevels = Mathf.Log(m_fsize) / Mathf.Log(2.0f);

            float factor = 2.0f * Mathf.PI * m_fsize;
            m_inverseGridSizes = new Vector4(factor / m_gridSizes.x, factor / m_gridSizes.y, factor / m_gridSizes.z, factor / m_gridSizes.w);

            m_fourierBuffer0 = new Vector2[2, m_size * m_size];
            m_fourierBuffer1 = new Vector4[2, m_size * m_size];
            m_fourierBuffer2 = new Vector4[2, m_size * m_size];

            m_result0 = new Color[m_size * m_size];
            m_result1 = new Color[m_size * m_size];
            m_result2 = new Color[m_size * m_size];

            m_fourier = new FourierCPU(m_size);

            m_map0 = new Texture2D(m_size, m_size, TextureFormat.RGB24, true, true);
            m_map0.wrapMode = TextureWrapMode.Repeat;
            m_map0.filterMode = FilterMode.Trilinear;
            m_map0.anisoLevel = ansio;

            m_map1 = new Texture2D(m_size, m_size, TextureFormat.ARGB32, true, true);
            m_map1.wrapMode = TextureWrapMode.Repeat;
            m_map1.filterMode = FilterMode.Trilinear;
            m_map1.anisoLevel = ansio;

            m_map2 = new Texture2D(m_size, m_size, TextureFormat.ARGB32, true, true);
            m_map2.wrapMode = TextureWrapMode.Repeat;
            m_map2.filterMode = FilterMode.Trilinear;
            m_map2.anisoLevel = ansio;

            GenerateWavesSpectrum();
            CreateWTabele();
        }
        public WaveSpectrumCPU(int size, float windSpeed, float waveAmp, float omega, int ansio, Vector4 gridSizes)
        {
            if (!Mathf.IsPowerOfTwo(size))
            {
                Debug.Log("Fourier grid size must be pow2 number, changing to nearest pow2 number");
                size = Mathf.NextPowerOfTwo(size);
            }

            m_size = size;
            m_waveAmp = waveAmp;
            m_windSpeed = windSpeed;
            m_omega = omega;
            m_gridSizes = gridSizes;

            m_fsize = (float)m_size;
            m_mipMapLevels = Mathf.Log(m_fsize) / Mathf.Log(2.0f);

            float factor = 2.0f * Mathf.PI * m_fsize;
            m_inverseGridSizes = new Vector4(factor / m_gridSizes.x, factor / m_gridSizes.y, factor / m_gridSizes.z, factor / m_gridSizes.w);

            m_fourierBuffer0 = new Vector2[2, m_size * m_size];
            m_fourierBuffer1 = new Vector4[2, m_size * m_size];
            m_fourierBuffer2 = new Vector4[2, m_size * m_size];

            m_result0 = new Color[m_size * m_size];
            m_result1 = new Color[m_size * m_size];
            m_result2 = new Color[m_size * m_size];

            m_fourier = new FourierCPU(m_size);

            m_map0 = new Texture2D(m_size, m_size, TextureFormat.RGBAFloat, true, true);
            m_map0.wrapMode = TextureWrapMode.Repeat;
            m_map0.filterMode = FilterMode.Trilinear;
            m_map0.anisoLevel = ansio;

            m_map1 = new Texture2D(m_size, m_size, TextureFormat.RGBAFloat, true, true);
            m_map1.wrapMode = TextureWrapMode.Repeat;
            m_map1.filterMode = FilterMode.Trilinear;
            m_map1.anisoLevel = ansio;

            m_map2 = new Texture2D(m_size, m_size, TextureFormat.RGBAFloat, true, true);
            m_map2.wrapMode = TextureWrapMode.Repeat;
            m_map2.filterMode = FilterMode.Trilinear;
            m_map2.anisoLevel = ansio;

            GenerateWavesSpectrum();
            CreateWTabele();
        }