59 lines
1.8 KiB
C#
59 lines
1.8 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|