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)); }