升级水插件
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user