public WaterWave[] FindMostMeaningfulWaves(int waveCount)
        {
            Heap <WaterWave> heap = new Heap <WaterWave>();

            for (int i = this._SpectraDataList.Count - 1; i >= 0; i--)
            {
                WaterWavesSpectrumDataBase waterWavesSpectrumDataBase = this._SpectraDataList[i];
                waterWavesSpectrumDataBase.UpdateSpectralValues(this.WindDirection, this._WindWaves.SpectrumDirectionality);
                object obj = waterWavesSpectrumDataBase;
                lock (obj)
                {
                    float weight = waterWavesSpectrumDataBase.Weight;
                    foreach (WaterWave element in waterWavesSpectrumDataBase.CpuWaves)
                    {
                        element._Amplitude   *= weight;
                        element._CPUPriority *= weight;
                        heap.Insert(element);
                        if (heap.Count > waveCount)
                        {
                            heap.ExtractMax();
                        }
                    }
                }
            }
            return(heap.ToArray <WaterWave>());
        }
        public virtual void RemoveSpectrum(WaterWavesSpectrumDataBase spectrum)
        {
            object overlayedSpectra = this._OverlayedSpectra;

            lock (overlayedSpectra)
            {
                this._OverlayedSpectra.Remove(spectrum);
            }
        }
        internal virtual void OnProfilesChanged()
        {
            Water.WeightedProfile[] profiles = this._Water.ProfilesManager.Profiles;
            Dictionary <WaterWavesSpectrum, WaterWavesSpectrumData> .Enumerator enumerator = this._SpectraDataCache.GetEnumerator();
            while (enumerator.MoveNext())
            {
                KeyValuePair <WaterWavesSpectrum, WaterWavesSpectrumData> keyValuePair = enumerator.Current;
                keyValuePair.Value.Weight = 0f;
            }
            enumerator.Dispose();
            foreach (Water.WeightedProfile weightedProfile in profiles)
            {
                if (weightedProfile.Weight > 0.0001f)
                {
                    WaterWavesSpectrum     spectrum = weightedProfile.Profile.Spectrum;
                    WaterWavesSpectrumData spectrumData;
                    if (!this._SpectraDataCache.TryGetValue(spectrum, out spectrumData))
                    {
                        spectrumData = this.GetSpectrumData(spectrum);
                    }
                    spectrumData.Weight = weightedProfile.Weight;
                }
            }
            this.SetDirectionalSpectrumDirty();
            this.StdDev = 0f;
            float num = 0f;

            enumerator = this._SpectraDataCache.GetEnumerator();
            while (enumerator.MoveNext())
            {
                KeyValuePair <WaterWavesSpectrum, WaterWavesSpectrumData> keyValuePair2 = enumerator.Current;
                WaterWavesSpectrumData value = keyValuePair2.Value;
                value.ValidateSpectrumData();
                this.StdDev += value.GetStandardDeviation() * value.Weight;
                if (value.CpuWaves.Length != 0)
                {
                    num += value.CpuWaves[0]._Amplitude * value.Weight;
                }
            }
            enumerator.Dispose();
            for (int j = this._OverlayedSpectra.Count - 1; j >= 0; j--)
            {
                WaterWavesSpectrumDataBase waterWavesSpectrumDataBase = this._OverlayedSpectra[j];
                waterWavesSpectrumDataBase.ValidateSpectrumData();
                this.StdDev += waterWavesSpectrumDataBase.GetStandardDeviation() * waterWavesSpectrumDataBase.Weight;
                if (waterWavesSpectrumDataBase.CpuWaves.Length != 0)
                {
                    num += waterWavesSpectrumDataBase.CpuWaves[0]._Amplitude * waterWavesSpectrumDataBase.Weight;
                }
            }
            this.MaxVerticalDisplacement   = this.StdDev * 1.6f + num;
            this.MaxHorizontalDisplacement = this.MaxVerticalDisplacement * this._Water.Materials.HorizontalDisplacementScale;
        }
        internal void Update()
        {
            this._SurfaceOffset = this._Water.SurfaceOffset;
            float num = this._Water.Time;

            if (this._WindWaves.LoopDuration != 0f)
            {
                num %= this._WindWaves.LoopDuration;
            }
            this.LastFrameTime      = num;
            this._UniformWaterScale = this._Water.UniformWaterScale;
            this.UpdateCachedSeed();
            bool allowCpuFFT = WaterProjectSettings.Instance.AllowCpuFFT;

            for (int i = 0; i < this._NumTiles; i++)
            {
                int num2 = 16;
                int num3 = 0;
                for (;;)
                {
                    float num4 = 0f;
                    for (int j = this._SpectraDataList.Count - 1; j >= 0; j--)
                    {
                        WaterWavesSpectrumDataBase waterWavesSpectrumDataBase = this._SpectraDataList[j];
                        waterWavesSpectrumDataBase.ValidateSpectrumData();
                        float standardDeviation = waterWavesSpectrumDataBase.GetStandardDeviation(i, num3);
                        num4 += standardDeviation * waterWavesSpectrumDataBase.Weight;
                    }
                    for (int k = this._OverlayedSpectra.Count - 1; k >= 0; k--)
                    {
                        WaterWavesSpectrumDataBase waterWavesSpectrumDataBase2 = this._OverlayedSpectra[k];
                        waterWavesSpectrumDataBase2.ValidateSpectrumData();
                        float standardDeviation2 = waterWavesSpectrumDataBase2.GetStandardDeviation(i, num3);
                        num4 += standardDeviation2 * waterWavesSpectrumDataBase2.Weight;
                    }
                    if (num4 < this._WindWaves.CpuDesiredStandardError * 0.25f || num2 >= this._WindWaves.FinalResolution)
                    {
                        break;
                    }
                    num2 <<= 1;
                    num3++;
                }
                if (num2 > this._WindWaves.FinalResolution)
                {
                    num2 = this._WindWaves.FinalResolution;
                }
                WaterTileSpectrum waterTileSpectrum = this._TileSpectra[i];
                if (waterTileSpectrum.SetResolveMode(num2 >= 16 && allowCpuFFT, num2))
                {
                    this._CpuWavesDirty = true;
                }
            }
        }
        public GerstnerWave[] SelectShorelineWaves(int waveCount, float angle, float coincidenceRange)
        {
            Heap <WaterWave> heap = new Heap <WaterWave>();

            for (int i = this._SpectraDataList.Count - 1; i >= 0; i--)
            {
                WaterWavesSpectrumDataBase waterWavesSpectrumDataBase = this._SpectraDataList[i];
                waterWavesSpectrumDataBase.UpdateSpectralValues(this.WindDirection, this._WindWaves.SpectrumDirectionality);
                object obj = waterWavesSpectrumDataBase;
                lock (obj)
                {
                    float weight = waterWavesSpectrumDataBase.Weight;
                    foreach (WaterWave element in waterWavesSpectrumDataBase.ShorelineCandidates)
                    {
                        element._Amplitude   *= weight;
                        element._CPUPriority *= weight;
                        float current = Mathf.Atan2(element._Nkx, element._Nky) * 57.29578f;
                        if (Mathf.Abs(Mathf.DeltaAngle(current, angle)) < coincidenceRange && element._Amplitude > 0.025f)
                        {
                            heap.Insert(element);
                            if (heap.Count > waveCount)
                            {
                                heap.ExtractMax();
                            }
                        }
                    }
                }
            }
            Vector2[] array = new Vector2[4];
            for (int k = 0; k < 4; k++)
            {
                float num = this._WindWaves.TileSizes[k];
                array[k].x = num + 0.5f / (float)this._WindWaves.FinalResolution * num;
                array[k].y = -num + 0.5f / (float)this._WindWaves.FinalResolution * num;
            }
            WaterWave[] array2 = heap.ToArray <WaterWave>();
            int         num2   = Mathf.Min(heap.Count, waveCount);

            GerstnerWave[] array3 = new GerstnerWave[num2];
            for (int l = 0; l < num2; l++)
            {
                array3[l] = new GerstnerWave(array2[heap.Count - l - 1], array);
            }
            return(array3);
        }
 public bool ContainsSpectrum(WaterWavesSpectrumDataBase spectrum)
 {
     return(this._OverlayedSpectra.Contains(spectrum));
 }