using System; using UnityEngine; namespace UltimateWater { public class PhillipsSpectrum : WaterWavesSpectrum { private readonly float _CutoffFactor; public PhillipsSpectrum(float tileSize, float gravity, float windSpeed, float amplitude, float cutoffFactor) : base(tileSize, gravity, windSpeed, amplitude) { _CutoffFactor = cutoffFactor; } public override void ComputeSpectrum(Vector3[] spectrum, float tileSizeMultiplier, int maxResolution, System.Random random) { float num = base.TileSize * tileSizeMultiplier; float num2 = _Amplitude * ComputeWaveAmplitude(_WindSpeed); float num3 = 1f / num; int num4 = Mathf.RoundToInt(Mathf.Sqrt(spectrum.Length)); int num5 = num4 / 2; float windSpeed = _WindSpeed; float num6 = windSpeed * windSpeed / _Gravity; float num7 = num6 * num6; float num8 = FastMath.Pow2(num6 / _CutoffFactor); float num9 = Mathf.Sqrt(num2 * Mathf.Pow(100f / num, 2.35f) / 2000000f); for (int i = 0; i < num4; i++) { float num10 = (float)Math.PI * 2f * (float)(i - num5) * num3; for (int j = 0; j < num4; j++) { float num11 = (float)Math.PI * 2f * (float)(j - num5) * num3; float num12 = Mathf.Sqrt(num10 * num10 + num11 * num11); float num13 = num12 * num12; float num14 = num13 * num13; float f = Mathf.Exp(-1f / (num13 * num7) - num13 * num8) / num14; f = num9 * Mathf.Sqrt(f); float x = FastMath.Gauss01() * f; float y = FastMath.Gauss01() * f; int num15 = (i + num5) % num4; int num16 = (j + num5) % num4; if (i == num5 && j == num5) { x = 0f; y = 0f; } spectrum[num15 * num4 + num16] = new Vector3(x, y, 1f); } } } private static float ComputeWaveAmplitude(float windSpeed) { return 0.002f * windSpeed * windSpeed * windSpeed; } } }