升级6.4.升级水,升级天气

This commit is contained in:
2026-04-05 00:26:54 +08:00
parent 63bc9b5536
commit 5f7cbfb713
635 changed files with 34718 additions and 22567 deletions

View File

@@ -19,11 +19,12 @@ namespace WaveHarmonic.Crest
[Tooltip("Whether to use the manual \"Height Range\" for water chunk culling.\n\nMandatory for non mesh inputs like \"Texture\".")]
[@GenerateAPI]
[@DecoratedField, SerializeField]
[@InlineToggle]
[@SerializeField]
bool _OverrideHeight;
[Tooltip("The minimum and maximum height value to report for water chunk culling.")]
[@Predicated(nameof(_OverrideHeight))]
[@Enable(nameof(_OverrideHeight))]
[@Range(-100, 100, Range.Clamp.None)]
[@GenerateAPI]
[SerializeField]
@@ -38,8 +39,6 @@ namespace WaveHarmonic.Crest
private protected override bool FollowHorizontalMotion => true;
internal override LodInputMode DefaultMode => LodInputMode.Geometry;
internal Rect _Rect;
internal override void InferBlend()
{
base.InferBlend();
@@ -56,35 +55,52 @@ namespace WaveHarmonic.Crest
{
base.Initialize();
_Reporter ??= new(this);
WaterChunkRenderer.HeightReporters.Add(_Reporter);
_HeightReporter = _Reporter;
}
private protected override void OnDisable()
{
base.OnDisable();
WaterChunkRenderer.HeightReporters.Remove(_Reporter);
_HeightReporter = null;
}
bool ReportHeight(ref Rect bounds, ref float minimum, ref float maximum)
bool ReportHeight(WaterRenderer water, ref Rect bounds, ref float minimum, ref float maximum)
{
if (!Enabled)
{
return false;
}
_Rect = Data.Rect;
// These modes do not provide a height yet.
if (!Data.HasHeightRange && !_OverrideHeight)
{
return false;
}
if (bounds.Overlaps(_Rect, false))
var rect = Data.Rect;
if (bounds.Overlaps(rect, false))
{
var range = _OverrideHeight ? _HeightRange : Data.HeightRange;
minimum = range.x;
maximum = range.y;
range *= Weight;
// Make relative to sea level.
range.x -= water.SeaLevel;
range.y -= water.SeaLevel;
var current = new Vector2(minimum, maximum);
range = _Blend switch
{
LodInputBlend.Additive => range + current,
LodInputBlend.Minimum => Vector2.Min(range, current),
LodInputBlend.Maximum => Vector2.Max(range, current),
_ => range,
};
minimum = Mathf.Min(minimum, range.x);
maximum = Mathf.Max(maximum, range.y);
return true;
}
@@ -100,33 +116,25 @@ namespace WaveHarmonic.Crest
{
readonly LevelLodInput _Input;
public Reporter(LevelLodInput input) => _Input = input;
public bool ReportHeight(ref Rect bounds, ref float minimum, ref float maximum) => _Input.ReportHeight(ref bounds, ref minimum, ref maximum);
public bool ReportHeight(WaterRenderer water, ref Rect bounds, ref float minimum, ref float maximum) =>
_Input.ReportHeight(water, ref bounds, ref minimum, ref maximum);
}
}
partial class LevelLodInput : ISerializationCallbackReceiver
partial class LevelLodInput
{
[SerializeField, HideInInspector]
#pragma warning disable 414
int _Version = 1;
#pragma warning restore 414
private protected override int Version => Mathf.Max(base.Version, 1);
/// <inheritdoc/>
void ISerializationCallbackReceiver.OnAfterDeserialize()
private protected override void OnMigrate()
{
base.OnMigrate();
// Version 1
// - Implemented blend mode but default value was serialized as Additive.
if (_Version < 1)
{
if (_Mode is LodInputMode.Spline or LodInputMode.Renderer) _Blend = LodInputBlend.Off;
_Version = 1;
}
}
/// <inheritdoc/>
void ISerializationCallbackReceiver.OnBeforeSerialize()
{
// Empty.
}
}
}