还原水插件

This commit is contained in:
2026-03-05 00:14:42 +08:00
parent 0de35591e7
commit e82f2ea6b7
270 changed files with 2773 additions and 12445 deletions

View File

@@ -2,7 +2,6 @@
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;
using WaveHarmonic.Crest.Internal;
namespace WaveHarmonic.Crest
{
@@ -39,6 +38,8 @@ namespace WaveHarmonic.Crest
private protected override bool FollowHorizontalMotion => true;
internal override LodInputMode DefaultMode => LodInputMode.Geometry;
internal Rect _Rect;
internal override void InferBlend()
{
base.InferBlend();
@@ -55,60 +56,35 @@ namespace WaveHarmonic.Crest
{
base.Initialize();
_Reporter ??= new(this);
_HeightReporter = _Reporter;
WaterChunkRenderer.HeightReporters.Add(_Reporter);
}
private protected override void OnDisable()
{
base.OnDisable();
_HeightReporter = null;
WaterChunkRenderer.HeightReporters.Remove(_Reporter);
}
bool ReportHeight(WaterRenderer water, ref Rect bounds, ref float minimum, ref float maximum)
bool ReportHeight(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;
}
var rect = Data.Rect;
if (bounds.Overlaps(rect, false))
if (bounds.Overlaps(_Rect, false))
{
var range = _OverrideHeight ? _HeightRange : Data.HeightRange;
range *= Weight;
// Make relative to sea level.
range.x -= water.SeaLevel;
range.y -= water.SeaLevel;
var r = new Vector2(minimum, maximum);
range = _Blend switch
{
LodInputBlend.Additive => range + r,
LodInputBlend.Minimum => Vector2.Min(range, r),
LodInputBlend.Maximum => Vector2.Max(range, r),
_ => range,
};
if (rect.Encapsulates(bounds))
{
minimum = range.x;
maximum = range.y;
}
else
{
minimum = Mathf.Min(minimum, range.x);
maximum = Mathf.Max(maximum, range.y);
}
minimum = range.x;
maximum = range.y;
return true;
}
@@ -124,8 +100,7 @@ namespace WaveHarmonic.Crest
{
readonly LevelLodInput _Input;
public Reporter(LevelLodInput input) => _Input = input;
public bool ReportHeight(WaterRenderer water, ref Rect bounds, ref float minimum, ref float maximum) =>
_Input.ReportHeight(water, ref bounds, ref minimum, ref maximum);
public bool ReportHeight(ref Rect bounds, ref float minimum, ref float maximum) => _Input.ReportHeight(ref bounds, ref minimum, ref maximum);
}
}