121 lines
4.1 KiB
C#
121 lines
4.1 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace UltimateWater
|
|
{
|
|
public class UnifiedSpectrum : WaterWavesSpectrum
|
|
{
|
|
private readonly float _Fetch;
|
|
|
|
private readonly float _FreqScale;
|
|
|
|
public UnifiedSpectrum(float tileSize, float gravity, float windSpeed, float amplitude, float freqScale, float fetch)
|
|
: base(tileSize, gravity, windSpeed, amplitude)
|
|
{
|
|
_Fetch = fetch;
|
|
_FreqScale = freqScale;
|
|
}
|
|
|
|
public override void ComputeSpectrum(Vector3[] spectrum, float tileSizeMultiplier, int maxResolution, System.Random random)
|
|
{
|
|
int num = Mathf.RoundToInt(Mathf.Sqrt(spectrum.Length));
|
|
int num2 = num / 2;
|
|
int num3 = (maxResolution - num) / 2;
|
|
if (num3 < 0)
|
|
{
|
|
num3 = 0;
|
|
}
|
|
float num4 = MathF.PI * 2f / (base.TileSize * tileSizeMultiplier * _FreqScale);
|
|
float windSpeed = _WindSpeed;
|
|
float num5 = 0.84f * Mathf.Pow((float)Math.Tanh(Mathf.Pow(_Fetch / 22000f, 0.4f)), -0.75f);
|
|
float f = ((num5 <= 1f) ? 1.7f : (1.7f + 6f * Mathf.Log(num5)));
|
|
float num6 = 2f * _Gravity / 0.0529f;
|
|
float num7 = _Gravity * FastMath.Pow2(num5 / windSpeed);
|
|
float num8 = PhaseSpeed(num7, num6);
|
|
float num9 = windSpeed / num8;
|
|
float num10 = 0.006f * Mathf.Sqrt(num9);
|
|
float num11 = (0f - num9) / Mathf.Sqrt(10f);
|
|
float num12 = 0.08f * (1f + 4f * Mathf.Pow(num5, -3f));
|
|
float num13 = 1f / (2f * num12 * num12);
|
|
float num14 = 3.7E-05f * windSpeed * windSpeed / _Gravity * Mathf.Pow(windSpeed / num8, 0.9f);
|
|
float num15 = windSpeed * 0.41f / Mathf.Log(10f / num14);
|
|
float num16 = Mathf.Log(2f) / 4f;
|
|
float num17 = 4f;
|
|
float num18 = 0.13f * num15 / 0.23f;
|
|
float num19 = 0.01f * ((num15 < 0.23f) ? (1f + Mathf.Log(num15 / 0.23f)) : (1f + 3f * Mathf.Log(num15 / 0.23f)));
|
|
for (int i = 0; i < num3; i++)
|
|
{
|
|
for (int j = 0; j < maxResolution; j++)
|
|
{
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
_ = UnityEngine.Random.value;
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
_ = UnityEngine.Random.value;
|
|
}
|
|
}
|
|
for (int k = 0; k < num; k++)
|
|
{
|
|
float num20 = num4 * (float)(k - num2);
|
|
float num21 = num20 * num20;
|
|
int num22 = (k + num2) % num * num;
|
|
for (int l = 0; l < num3; l++)
|
|
{
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
_ = UnityEngine.Random.value;
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
_ = UnityEngine.Random.value;
|
|
}
|
|
for (int m = 0; m < num; m++)
|
|
{
|
|
float num23 = num4 * (float)(m - num2);
|
|
float num24 = Mathf.Sqrt(num21 + num23 * num23);
|
|
float num25 = PhaseSpeed(num24, num6);
|
|
float num26 = Mathf.Exp(-1.25f * FastMath.Pow2(num7 / num24));
|
|
float num27 = Mathf.Sqrt(num24 / num7) - 1f;
|
|
float p = Mathf.Exp((0f - FastMath.Pow2(num27)) * num13);
|
|
float num28 = Mathf.Pow(f, p);
|
|
float num29 = num26 * num28 * Mathf.Exp(num11 * num27);
|
|
float num30 = 0.5f * num10 * (num8 / num25) * num29;
|
|
float num31 = Mathf.Exp(-0.25f * FastMath.Pow2(num24 / num6 - 1f));
|
|
float num32 = 0.5f * num19 * (0.23f / num25) * num31 * num26;
|
|
float z = (float)Math.Tanh(num16 + num17 * Mathf.Pow(num25 / num8, 2.5f) + num18 * Mathf.Pow(0.23f / num25, 2.5f));
|
|
float num33 = _Amplitude * (num30 + num32) / (num24 * num24 * num24 * num24 * 2f * MathF.PI);
|
|
num33 = ((!(num33 > 0f)) ? 0f : (Mathf.Sqrt(num33) * num4 * 0.5f));
|
|
float x = FastMath.Gauss01() * num33;
|
|
float y = FastMath.Gauss01() * num33;
|
|
int num34 = (m + num2) % num;
|
|
if (k == num2 && m == num2)
|
|
{
|
|
x = 0f;
|
|
y = 0f;
|
|
z = 0f;
|
|
}
|
|
spectrum[num22 + num34] = new Vector3(x, y, z);
|
|
}
|
|
for (int n = 0; n < num3; n++)
|
|
{
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
_ = UnityEngine.Random.value;
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
_ = UnityEngine.Random.value;
|
|
}
|
|
}
|
|
for (int num35 = 0; num35 < num3; num35++)
|
|
{
|
|
for (int num36 = 0; num36 < maxResolution; num36++)
|
|
{
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
_ = UnityEngine.Random.value;
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
_ = UnityEngine.Random.value;
|
|
}
|
|
}
|
|
}
|
|
|
|
private float PhaseSpeed(float k, float km)
|
|
{
|
|
return Mathf.Sqrt(_Gravity / k * (1f + FastMath.Pow2(k / km)));
|
|
}
|
|
}
|
|
}
|