升级水插件

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

@@ -1,8 +1,9 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;
using WaveHarmonic.Crest.Internal;
using WaveHarmonic.Crest.Utility;
namespace WaveHarmonic.Crest
{
@@ -84,60 +85,46 @@ namespace WaveHarmonic.Crest
}
}
if (_UseDisplacements)
var success = _UseDisplacements
? collProvider.RetrieveSucceeded(collProvider.Query(GetHashCode(), _ObjectWidth, _SamplePositions, _ResultDisplacements, _UseNormals ? _ResultNormals : null, null, _Layer))
: collProvider.RetrieveSucceeded(collProvider.Query(GetHashCode(), _ObjectWidth, _SamplePositions, _ResultHeights, _UseNormals ? _ResultNormals : null, null, _Layer));
#if !UNITY_EDITOR
// Gizmos handle this in editor.
if (success)
{
if (collProvider.RetrieveSucceeded(collProvider.Query(GetHashCode(), _ObjectWidth, _SamplePositions, _ResultDisplacements, _UseNormals ? _ResultNormals : null, null, _Layer)))
{
for (var i = 0; i < _Steps; i++)
{
for (var j = 0; j < _Steps; j++)
{
var result = _SamplePositions[j * _Steps + i];
result.y = water.SeaLevel;
result += _ResultDisplacements[j * _Steps + i];
var norm = _UseNormals ? _ResultNormals[j * _Steps + i] : Vector3.up;
DebugDrawCross(result, norm, Mathf.Min(_StepSize / 4f, 1f), Color.green);
}
}
}
}
else
{
if (collProvider.RetrieveSucceeded(collProvider.Query(GetHashCode(), _ObjectWidth, _SamplePositions, _ResultHeights, _UseNormals ? _ResultNormals : null, null, _Layer)))
{
for (var i = 0; i < _Steps; i++)
{
for (var j = 0; j < _Steps; j++)
{
var result = _SamplePositions[j * _Steps + i];
result.y = _ResultHeights[j * _Steps + i];
var norm = _UseNormals ? _ResultNormals[j * _Steps + i] : Vector3.up;
DebugDrawCross(result, norm, Mathf.Min(_StepSize / 4f, 1f), Color.green);
}
}
}
Render(water, Debug.DrawLine);
}
#endif
}
public static void DebugDrawCross(Vector3 pos, float r, Color col, float duration = 0f)
internal void Render(WaterRenderer water, DebugUtility.DrawLine draw)
{
Debug.DrawLine(pos - Vector3.up * r, pos + Vector3.up * r, col, duration);
Debug.DrawLine(pos - Vector3.right * r, pos + Vector3.right * r, col, duration);
Debug.DrawLine(pos - Vector3.forward * r, pos + Vector3.forward * r, col, duration);
}
if (_SamplePositions == null)
{
return;
}
public static void DebugDrawCross(Vector3 pos, Vector3 up, float r, Color col, float duration = 0f)
{
up.Normalize();
var right = Vector3.Normalize(Vector3.Cross(up, Vector3.forward));
var forward = Vector3.Cross(up, right);
Debug.DrawLine(pos - up * r, pos + up * r, col, duration);
Debug.DrawLine(pos - right * r, pos + right * r, col, duration);
Debug.DrawLine(pos - forward * r, pos + forward * r, col, duration);
for (var i = 0; i < _Steps; i++)
{
for (var j = 0; j < _Steps; j++)
{
var result = _SamplePositions[j * _Steps + i];
if (_UseDisplacements)
{
result.y = water.SeaLevel;
result += _ResultDisplacements[j * _Steps + i];
}
else
{
result.y = _ResultHeights[j * _Steps + i];
}
var normal = _UseNormals ? _ResultNormals[j * _Steps + i] : Vector3.up;
DebugUtility.DrawCross(draw, result, normal, Mathf.Min(_StepSize / 4f, 1f), Color.green);
}
}
}
}
}

View File

@@ -1,4 +1,4 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
// NOTE: DWP2 depends on this file. Any API changes need to be communicated to the DWP2 authors in advance.
@@ -13,23 +13,18 @@ namespace WaveHarmonic.Crest
/// <summary>
/// A layer/event where queries are executed.
/// </summary>
[@GenerateDoc]
public enum CollisionLayer
{
/// <summary>
/// Include all displacement.
/// </summary>
/// <inheritdoc cref="Generated.CollisionLayer.Everything"/>
[Tooltip("Include all displacement.")]
Everything,
/// <summary>
/// Only include Animated Waves.
/// </summary>
/// <inheritdoc cref="Generated.CollisionLayer.AfterAnimatedWaves"/>
[Tooltip("Only include Animated Waves.")]
AfterAnimatedWaves,
/// <summary>
/// Include Animated Waves and Dynamic Waves.
/// </summary>
/// <inheritdoc cref="Generated.CollisionLayer.AfterDynamicWaves"/>
[Tooltip("Include Animated Waves and Dynamic Waves.")]
AfterDynamicWaves,
}

View File

@@ -1,4 +1,4 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;
@@ -82,27 +82,28 @@ namespace WaveHarmonic.Crest
{
var layers = _Water.AnimatedWavesLod._CollisionLayers;
// Displacement is the fallback if there are no layers (ie single layer).
if (layers == CollisionLayers.Nothing)
{
return _Displacement;
}
if (layer == CollisionLayer.Everything)
var everything = layer == CollisionLayer.Everything;
// Displacement is the final layer, if present.
if (everything && layers.HasFlag(CollisionLayers.Displacement))
{
if (layers.HasFlag(CollisionLayers.Displacement))
{
return _Displacement;
}
return _Displacement;
}
if (layer >= CollisionLayer.AfterDynamicWaves)
// Chosen/fallback to Dynamic Waves.
if ((everything || layer >= CollisionLayer.AfterDynamicWaves) &&
layers.HasFlag(CollisionLayers.DynamicWaves) && _Water.DynamicWavesLod.Enabled)
{
if (layers.HasFlag(CollisionLayers.DynamicWaves) && _Water.DynamicWavesLod.Enabled)
{
return _DynamicWaves;
}
return _DynamicWaves;
}
// If not single layer, this is always present.
return _AnimatedWaves;
}
@@ -131,6 +132,19 @@ namespace WaveHarmonic.Crest
_Displacement.UpdateQueries(water);
}
public void SendReadBack(WaterRenderer water, CollisionLayers layers)
{
// Will only submit readback if there are queries.
_AnimatedWaves.SendReadBack(water);
_DynamicWaves.SendReadBack(water);
_Displacement.SendReadBack(water);
}
public void SendReadBack(WaterRenderer water)
{
_Displacement.SendReadBack(water);
}
public void CleanUp()
{
_AnimatedWaves.CleanUp();
@@ -143,6 +157,7 @@ namespace WaveHarmonic.Crest
{
public static void UpdateQueries(this ICollisionProvider self, WaterRenderer water, CollisionLayer layer) => (self as CollisionQueryWithPasses)?.UpdateQueries(water, layer);
public static void UpdateQueries(this ICollisionProvider self, WaterRenderer water) => (self as IQueryable)?.UpdateQueries(water);
public static void SendReadBack(this ICollisionProvider self, WaterRenderer water, CollisionLayers layer) => (self as CollisionQueryWithPasses)?.SendReadBack(water, layer);
public static void CleanUp(this ICollisionProvider self) => (self as IQueryable)?.CleanUp();
}
}

View File

@@ -1,4 +1,4 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;

View File

@@ -1,8 +1,9 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;
using WaveHarmonic.Crest.Internal;
using WaveHarmonic.Crest.Utility;
namespace WaveHarmonic.Crest
{
@@ -33,7 +34,7 @@ namespace WaveHarmonic.Crest
{
var endPos = transform.position + transform.forward * dist;
Debug.DrawLine(transform.position, endPos, Color.green);
CollisionAreaVisualizer.DebugDrawCross(endPos, 2f, Color.green, 0f);
DebugUtility.DrawCross(Debug.DrawLine, endPos, 2f, Color.green, 0f);
}
else
{

View File

@@ -1,4 +1,4 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;

View File

@@ -1,4 +1,4 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;

View File

@@ -1,4 +1,4 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;

View File

@@ -1,4 +1,4 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
namespace WaveHarmonic.Crest

View File

@@ -1,4 +1,4 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
// Potential improvements
@@ -43,6 +43,7 @@ namespace WaveHarmonic.Crest
int RequestCount { get; }
int QueryCount { get; }
void UpdateQueries(WaterRenderer water);
void SendReadBack(WaterRenderer water);
void CleanUp();
}
@@ -512,7 +513,20 @@ namespace WaveHarmonic.Crest
if (_SegmentRegistrarRingBuffer.Current._QueryCount > 0)
{
ExecuteQueries();
}
}
public void SendReadBack(WaterRenderer water)
{
#if UNITY_EDITOR
// Seems to be a terrible memory leak coming from creating async GPU readbacks.
// This was marked as resolved by Unity and confirmed fixed by forum posts.
// May be worth keeping. See issue #630 for more details.
if (!water._HeightQueries && !Application.isPlaying) return;
#endif
if (_SegmentRegistrarRingBuffer.Current._QueryCount > 0)
{
// Remove oldest requests if we have hit the limit
while (_Requests.Count >= k_MaximumRequests)
{

View File

@@ -1,4 +1,4 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;
@@ -10,19 +10,15 @@ namespace WaveHarmonic.Crest
/// <summary>
/// What transform to use for queries.
/// </summary>
[@GenerateDoc]
public enum QuerySource
{
/// <summary>
/// This game object's transform.
/// </summary>
/// <inheritdoc cref="Generated.QuerySource.Transform"/>
[Tooltip("This game object's transform.")]
Transform,
/// <summary>
/// The viewer's transform.
/// </summary>
/// <remarks>
/// The viewer is the main camera the system uses.
/// </remarks>
/// <inheritdoc cref="Generated.QuerySource.Viewer"/>
[Tooltip("The viewer's transform.\n\nThe viewer is the main camera the system uses.")]
Viewer
}

View File

@@ -1,4 +1,4 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;
@@ -226,7 +226,7 @@ namespace WaveHarmonic.Crest
public bool Sample(Vector3 position, out Vector2 flow, float minimumLength = 0f)
{
var water = WaterRenderer.Instance;
var flowProvider = WaterRenderer.Instance == null ? null : water.FlowLod.Provider;
var flowProvider = water == null ? null : water.FlowLod.Provider;
if (flowProvider == null)
{
@@ -262,7 +262,7 @@ namespace WaveHarmonic.Crest
bool Sample(Vector3 position, out Vector2 result)
{
var water = WaterRenderer.Instance;
var depthProvider = WaterRenderer.Instance == null ? null : water.DepthLod.Provider;
var depthProvider = water == null ? null : water.DepthLod.Provider;
if (depthProvider == null)
{