122 lines
4.2 KiB
C#
122 lines
4.2 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 = (float)Math.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 + 6f * Mathf.Log(num5)) : 1.7f);
|
|
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 + 3f * Mathf.Log(num15 / 0.23f)) : (1f + 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);
|
|
float value = UnityEngine.Random.value;
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
value = 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;
|
|
int num23 = num22 * num;
|
|
for (int l = 0; l < num3; l++)
|
|
{
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
float value2 = UnityEngine.Random.value;
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
value2 = UnityEngine.Random.value;
|
|
}
|
|
for (int m = 0; m < num; m++)
|
|
{
|
|
float num24 = num4 * (float)(m - num2);
|
|
float num25 = Mathf.Sqrt(num21 + num24 * num24);
|
|
float num26 = PhaseSpeed(num25, num6);
|
|
float num27 = Mathf.Exp(-1.25f * FastMath.Pow2(num7 / num25));
|
|
float num28 = Mathf.Sqrt(num25 / num7) - 1f;
|
|
float p = Mathf.Exp((0f - FastMath.Pow2(num28)) * num13);
|
|
float num29 = Mathf.Pow(f, p);
|
|
float num30 = num27 * num29 * Mathf.Exp(num11 * num28);
|
|
float num31 = 0.5f * num10 * (num8 / num26) * num30;
|
|
float num32 = Mathf.Exp(-0.25f * FastMath.Pow2(num25 / num6 - 1f));
|
|
float num33 = 0.5f * num19 * (0.23f / num26) * num32 * num27;
|
|
float z = (float)Math.Tanh(num16 + num17 * Mathf.Pow(num26 / num8, 2.5f) + num18 * Mathf.Pow(0.23f / num26, 2.5f));
|
|
float num34 = _Amplitude * (num31 + num33) / (num25 * num25 * num25 * num25 * 2f * (float)Math.PI);
|
|
num34 = ((!(num34 > 0f)) ? 0f : (Mathf.Sqrt(num34) * num4 * 0.5f));
|
|
float x = FastMath.Gauss01() * num34;
|
|
float y = FastMath.Gauss01() * num34;
|
|
int num35 = (m + num2) % num;
|
|
if (k == num2 && m == num2)
|
|
{
|
|
x = 0f;
|
|
y = 0f;
|
|
z = 0f;
|
|
}
|
|
spectrum[num23 + num35] = new Vector3(x, y, z);
|
|
}
|
|
for (int n = 0; n < num3; n++)
|
|
{
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
float value3 = UnityEngine.Random.value;
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
value3 = UnityEngine.Random.value;
|
|
}
|
|
}
|
|
for (int num36 = 0; num36 < num3; num36++)
|
|
{
|
|
for (int num37 = 0; num37 < maxResolution; num37++)
|
|
{
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
float value4 = UnityEngine.Random.value;
|
|
UnityEngine.Random.Range(1E-06f, 1f);
|
|
value4 = UnityEngine.Random.value;
|
|
}
|
|
}
|
|
}
|
|
|
|
private float PhaseSpeed(float k, float km)
|
|
{
|
|
return Mathf.Sqrt(_Gravity / k * (1f + FastMath.Pow2(k / km)));
|
|
}
|
|
}
|
|
}
|