升级水插件

This commit is contained in:
2026-01-08 22:30:55 +08:00
parent febff82d24
commit ca68084264
415 changed files with 18138 additions and 7134 deletions

View File

@@ -85,8 +85,9 @@ namespace WaveHarmonic.Crest
public readonly float _WindDirectionRadians;
public readonly float _WindTurbulence;
public readonly float _WindAlignment;
public readonly float _Gravity;
public Parameters(WaveSpectrum spectrum, int resolution, float period, float speed, float direction, float turbulence, float alignment)
public Parameters(WaveSpectrum spectrum, int resolution, float period, float speed, float direction, float turbulence, float alignment, float gravity)
{
_Spectrum = spectrum;
_Resolution = resolution;
@@ -95,17 +96,18 @@ namespace WaveHarmonic.Crest
_WindDirectionRadians = direction;
_WindTurbulence = turbulence;
_WindAlignment = alignment;
_Gravity = gravity;
}
// Implement custom or incur allocations.
public override int GetHashCode()
{
return System.HashCode.Combine(_Spectrum, _LoopPeriod, _WindSpeed, _WindDirectionRadians, _WindTurbulence, _WindAlignment, _Resolution);
return System.HashCode.Combine(_Spectrum, _LoopPeriod, _WindSpeed, _WindDirectionRadians, _WindTurbulence, _WindAlignment, _Gravity, _Resolution);
}
public int GetHashCode(int resolution)
{
return System.HashCode.Combine(_Spectrum, _LoopPeriod, _WindSpeed, _WindDirectionRadians, _WindTurbulence, _WindAlignment, resolution);
return System.HashCode.Combine(_Spectrum, _LoopPeriod, _WindSpeed, _WindDirectionRadians, _WindTurbulence, _WindAlignment, _Gravity, resolution);
}
}
@@ -279,7 +281,7 @@ namespace WaveHarmonic.Crest
wrapper.SetFloat(ShaderIDs.s_WindSpeed, _Parameters._WindSpeed);
wrapper.SetFloat(ShaderIDs.s_Turbulence, _Parameters._WindTurbulence);
wrapper.SetFloat(ShaderIDs.s_Alignment, _Parameters._WindAlignment);
wrapper.SetFloat(ShaderIDs.s_Gravity, WaterRenderer.Instance.Gravity);
wrapper.SetFloat(ShaderIDs.s_Gravity, _Parameters._Gravity);
wrapper.SetFloat(ShaderIDs.s_Period, period < Mathf.Infinity ? period : -1);
wrapper.SetVector(ShaderIDs.s_WindDir, new(Mathf.Cos(_Parameters._WindDirectionRadians), Mathf.Sin(_Parameters._WindDirectionRadians)));
wrapper.SetTexture(ShaderIDs.s_SpectrumControls, _Parameters._Spectrum.ControlsTexture);
@@ -417,9 +419,9 @@ namespace WaveHarmonic.Crest
DebugGUI.DrawTextureArray(WaveBuffers, 8, 0.5f, 20f);
}
if (_Parameters._Spectrum != null && _Parameters._Spectrum.ControlsTexture != null)
if (_Parameters._Spectrum != null)
{
GUI.DrawTexture(new(0f, 0f, 100f, 10f), _Parameters._Spectrum.ControlsTexture);
_Parameters._Spectrum.OnGUI();
}
}
}

View File

@@ -88,9 +88,10 @@ namespace WaveHarmonic.Crest
/// <param name="wavelength">Wavelength in m</param>
/// <param name="componentsPerOctave">How many waves we're sampling, used to conserve energy for different sampling rates</param>
/// <param name="windSpeed">Wind speed in m/s</param>
/// <param name="gravity">Gravity</param>
/// <param name="power">The energy of the wave in J</param>
/// <returns>The amplitude of the wave in m</returns>
internal float GetAmplitude(float wavelength, float componentsPerOctave, float windSpeed, out float power)
internal float GetAmplitude(float wavelength, float componentsPerOctave, float windSpeed, float gravity, out float power)
{
Debug.AssertFormat(wavelength > 0f, this, "Crest: {0} wavelength must be > 0.", nameof(WaveSpectrum));
@@ -121,15 +122,18 @@ namespace WaveHarmonic.Crest
var hasNextIndex = nextIndex < _PowerLogarithmicScales.Length;
var nextPower = hasNextIndex && !_PowerDisabled[nextIndex] ? _PowerLogarithmicScales[nextIndex] : s_MinimumPowerLog;
// Empirical wind influence based on alpha-beta spectrum that underlies empirical spectra
gravity *= _GravityScale;
// The amplitude calculation follows this nice paper from Frechot:
// https://hal.archives-ouvertes.fr/file/index/docid/307938/filename/frechot_realistic_simulation_of_ocean_surface_using_wave_spectra.pdf
var wl_lo = Mathf.Pow(2f, Mathf.Floor(wl_pow2));
var k_lo = 2f * Mathf.PI / wl_lo;
var c_lo = ComputeWaveSpeed(wl_lo);
var c_lo = ComputeWaveSpeed(wl_lo, gravity);
var omega_lo = k_lo * c_lo;
var wl_hi = 2f * wl_lo;
var k_hi = 2f * Mathf.PI / wl_hi;
var c_hi = ComputeWaveSpeed(wl_hi);
var c_hi = ComputeWaveSpeed(wl_hi, gravity);
var omega_hi = k_hi * c_hi;
var domega = (omega_lo - omega_hi) / componentsPerOctave;
@@ -141,9 +145,6 @@ namespace WaveHarmonic.Crest
power = hasNextIndex ? Mathf.Lerp(thisPower, nextPower, alpha) : thisPower;
power = Mathf.Pow(10f, power);
// Empirical wind influence based on alpha-beta spectrum that underlies empirical spectra
var gravity = _GravityScale * WaterRenderer.Instance.Gravity;
// Zero gravity will cause NaNs, and they have always been flat.
if (gravity <= 0f) return 0f;
@@ -163,11 +164,11 @@ namespace WaveHarmonic.Crest
return a * _Multiplier;
}
static float ComputeWaveSpeed(float wavelength, float gravityMultiplier = 1f)
static float ComputeWaveSpeed(float wavelength, float gravity, float gravityMultiplier = 1f)
{
// wave speed of deep sea water waves: https://en.wikipedia.org/wiki/Wind_wave
// https://en.wikipedia.org/wiki/Dispersion_(water_waves)#Wave_propagation_and_dispersion
var g = WaterRenderer.Instance.Gravity * gravityMultiplier;
var g = gravity * gravityMultiplier;
var k = 2f * Mathf.PI / wavelength;
//float h = max(depth, 0.01);
//float cp = sqrt(abs(tanh_clamped(h * k)) * g / k);
@@ -209,10 +210,8 @@ namespace WaveHarmonic.Crest
}
// This applies the correct PM spectrum powers, validated against a separate implementation
internal void ApplyPiersonMoskowitzSpectrum()
internal void ApplyPiersonMoskowitzSpectrum(float gravity)
{
var gravity = WaterRenderer.Instance != null ? WaterRenderer.Instance.Gravity : Mathf.Abs(Physics.gravity.y);
for (var octave = 0; octave < k_NumberOfOctaves; octave++)
{
var wl = SmallWavelength(octave);