Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/UltimateWater/WaveParticlesGroup.cs
2026-02-21 16:45:37 +08:00

146 lines
3.2 KiB
C#

using UnityEngine;
using UnityEngine.Serialization;
namespace UltimateWater
{
public class WaveParticlesGroup
{
[FormerlySerializedAs("lastUpdateTime")]
public float LastUpdateTime;
[FormerlySerializedAs("lastCostlyUpdateTime")]
public float LastCostlyUpdateTime;
[FormerlySerializedAs("leftParticle")]
public WaveParticle LeftParticle;
private readonly int _Id;
private static int _NextId;
public int ParticleCount
{
get
{
int num = 0;
for (WaveParticle waveParticle = LeftParticle; waveParticle != null; waveParticle = waveParticle.RightNeighbour)
{
num++;
}
return num;
}
}
public int Id
{
get
{
return _Id;
}
}
public WaveParticle LastParticle
{
get
{
if (LeftParticle == null)
{
return null;
}
WaveParticle waveParticle = LeftParticle;
while (waveParticle.RightNeighbour != null)
{
waveParticle = waveParticle.RightNeighbour;
}
return waveParticle;
}
}
public WaveParticlesGroup(float startTime)
{
_Id = ++_NextId;
LastUpdateTime = (LastCostlyUpdateTime = startTime);
}
public void CostlyUpdate(WaveParticlesQuadtree quadtree, float time)
{
WaveParticle waveParticle = LeftParticle;
float deltaTime = time - LastCostlyUpdateTime;
LastCostlyUpdateTime = time;
int num = 0;
do
{
WaveParticle waveParticle2 = waveParticle;
waveParticle = waveParticle.RightNeighbour;
num += waveParticle2.CostlyUpdate((num >= 30) ? null : quadtree, deltaTime);
}
while (waveParticle != null);
waveParticle = LeftParticle;
if (waveParticle == null)
{
return;
}
WaveParticle waveParticle3 = waveParticle;
int num2 = 0;
do
{
WaveParticle waveParticle4 = waveParticle;
waveParticle = waveParticle.RightNeighbour;
num2++;
if (waveParticle4 != waveParticle3 && (waveParticle4.DisallowSubdivision || waveParticle == null))
{
if (num2 > 3)
{
FilterRefractedDirections(waveParticle3, num2);
}
waveParticle3 = waveParticle;
num2 = 0;
}
}
while (waveParticle != null);
}
public void Update(float time)
{
WaveParticle waveParticle = LeftParticle;
float num = time - LastUpdateTime;
LastUpdateTime = time;
float num2 = ((!(num < 1f)) ? 1f : num);
float invStep = 1f - num2;
do
{
WaveParticle waveParticle2 = waveParticle;
waveParticle = waveParticle.RightNeighbour;
waveParticle2.Update(num, num2, invStep);
}
while (waveParticle != null);
}
private static void FilterRefractedDirections(WaveParticle left, int waveLength)
{
WaveParticle waveParticle = left;
int num = waveLength / 2;
Vector2 a = default(Vector2);
for (int i = 0; i < num; i++)
{
a += waveParticle.Direction;
waveParticle = waveParticle.RightNeighbour;
}
Vector2 b = default(Vector2);
for (int j = num; j < waveLength; j++)
{
b += waveParticle.Direction;
waveParticle = waveParticle.RightNeighbour;
}
a.Normalize();
b.Normalize();
waveParticle = left;
for (int k = 0; k < waveLength; k++)
{
waveParticle.Direction = Vector2.Lerp(a, b, (float)k / (float)(waveLength - 1));
waveParticle = waveParticle.RightNeighbour;
}
}
}
}