Files
2026-02-21 16:45:37 +08:00

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