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 vector = default(Vector2); for (int j = num; j < waveLength; j++) { vector += waveParticle.Direction; waveParticle = waveParticle.RightNeighbour; } a.Normalize(); vector.Normalize(); waveParticle = left; for (int k = 0; k < waveLength; k++) { waveParticle.Direction = Vector2.Lerp(a, vector, (float)k / (float)(waveLength - 1)); waveParticle = waveParticle.RightNeighbour; } }
private void UpdateSpawnPoints(float deltaTime) { deltaTime *= this._EmissionFrequencyScale; for (int i = 0; i < this._SpawnPoints.Length; i++) { ComplexWavesEmitter.SpawnPoint spawnPoint = this._SpawnPoints[i]; spawnPoint.TimeLeft -= deltaTime; if (spawnPoint.TimeLeft < 0f) { float num = 6.28318548f / spawnPoint.Frequency; float num2 = this._Span * 0.3f / num; int min = Mathf.Max(2, Mathf.RoundToInt(num2 * 0.7f)); int max = Mathf.Max(2, Mathf.RoundToInt(num2 * 1.429f)); spawnPoint.TimeLeft += spawnPoint.TimeInterval; Vector2 position = spawnPoint.Position + new Vector2(spawnPoint.Direction.y, -spawnPoint.Direction.x) * UnityEngine.Random.Range(-this._Span * 0.35f, this._Span * 0.35f); WaveParticle waveParticle = WaveParticle.Create(position, spawnPoint.Direction, spawnPoint.Frequency, spawnPoint.Amplitude, this._Lifetime, this._ShoreWaves); if (waveParticle != null) { this._WavesParticleSystem.Spawn(waveParticle, UnityEngine.Random.Range(min, max), this._WaveShapeIrregularity, 2f, 0.35f); waveParticle.Destroy(); waveParticle.AddToCache(); } } } }
static WaveParticle() { for (int i = 0; i < 2048; i++) { double num = (double)(((float)i + 0.49f) / 2047f); double kh = 4.0 * (1.0 - Math.Pow(1.0 - num, 0.33333333)); WaveParticle._AmplitudeFuncPrecomp[i] = WaveParticle.ComputeAmplitudeAtShore(kh); WaveParticle._FrequencyFuncPrecomp[i] = Mathf.Sqrt(1f / WaveParticle.ComputeWavelengthAtShore(kh)); } }
public bool AddParticle(WaveParticle particle) { if (particle == null) { return(false); } if (particle.Group == null) { throw new ArgumentException("Particle has no group"); } return(this._Particles.AddElement(particle)); }
public void Update(float time) { WaveParticle waveParticle = this.LeftParticle; float num = time - this.LastUpdateTime; this.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); }
public WaveParticle Clone(Vector2 position) { WaveParticle waveParticle = WaveParticle.Create(position, this.Direction, this.BaseFrequency, this.BaseAmplitude, this.Lifetime, this.IsShoreWave); if (waveParticle == null) { return(null); } waveParticle.Amplitude = this.Amplitude; waveParticle.Frequency = this.Frequency; waveParticle.Speed = this.Speed; waveParticle.TargetSpeed = this.TargetSpeed; waveParticle.EnergyBalance = this.EnergyBalance; waveParticle.Shoaling = this.Shoaling; waveParticle.Group = this.Group; return(waveParticle); }
public void UpdateParticles(float time, float deltaTime) { if (!base.isActiveAndEnabled) { return; } ComplexWavesEmitter.WavesSource wavesSource = this._WavesSource; if (wavesSource != ComplexWavesEmitter.WavesSource.CustomWaveFrequency) { if (wavesSource != ComplexWavesEmitter.WavesSource.WindWavesSpectrum) { if (wavesSource == ComplexWavesEmitter.WavesSource.Shoaling) { if (this._SpawnPoints == null) { this.CreateShoalingSpawnPoints(); } this.UpdateSpawnPoints(deltaTime); } } else { if (this._SpawnPoints == null) { this.CreateSpectralWavesSpawnPoints(); } this.UpdateSpawnPoints(deltaTime); } } else if (time > this._NextSpawnTime) { Vector3 position = base.transform.position; Vector3 forward = base.transform.forward; Vector2 position2 = new Vector2(position.x, position.z); Vector2 vector = new Vector2(forward.x, forward.z); WaveParticle waveParticle = WaveParticle.Create(position2, vector.normalized, 6.28318548f / this._Wavelength, this._Amplitude, this._Lifetime, this._ShoreWaves); if (waveParticle != null) { this._WavesParticleSystem.Spawn(waveParticle, this._Width, this._WaveShapeIrregularity, 2f, 0.35f); waveParticle.Destroy(); waveParticle.AddToCache(); } this._NextSpawnTime += this._TimeStep; } }
public static WaveParticle Create(Vector2 position, Vector2 direction, float baseFrequency, float baseAmplitude, float lifetime, bool isShoreWave) { WaveParticle waveParticle; if (WaveParticle._WaveParticlesCache.Count != 0) { waveParticle = WaveParticle._WaveParticlesCache.Pop(); waveParticle._Position = position; waveParticle.Direction = direction; waveParticle.BaseFrequency = baseFrequency; waveParticle.BaseAmplitude = baseAmplitude; waveParticle.FadeFactor = 0f; waveParticle.IsShoreWave = isShoreWave; waveParticle.BaseSpeed = 2.2f * Mathf.Sqrt(9.81f / baseFrequency); waveParticle.Amplitude = baseAmplitude; waveParticle.Frequency = baseFrequency; waveParticle.TargetSpeed = 1f; waveParticle.Invkh = 1f; waveParticle.TargetInvKh = 1f; waveParticle.EnergyBalance = 0f; waveParticle.Shoaling = 0f; waveParticle.Speed = 0f; waveParticle.TargetEnergyBalance = 0f; waveParticle.Lifetime = lifetime; waveParticle.AmplitudeModifiers = 0f; waveParticle.AmplitudeModifiers2 = 1f; waveParticle.ExpansionEnergyLoss = 0f; waveParticle.IsAlive = true; waveParticle.DisallowSubdivision = false; if (waveParticle.LeftNeighbour != null || waveParticle.RightNeighbour != null) { waveParticle.LeftNeighbour = null; waveParticle.RightNeighbour = null; } waveParticle.CostlyUpdate(null, 0.1f); } else { waveParticle = new WaveParticle(position, direction, baseFrequency, baseAmplitude, lifetime, isShoreWave); } return((waveParticle.BaseAmplitude == 0f) ? null : waveParticle); }
public bool Spawn(WaveParticle particle, int clones, float waveShapeIrregularity, float centerElevation = 2f, float edgesElevation = 0.35f) { if (particle == null || this._Particles.FreeSpace < clones * 2 + 1) { return(false); } particle.Group = new WaveParticlesGroup(this._SimulationTime); particle.BaseAmplitude *= this._Water.UniformWaterScale; particle.BaseFrequency /= this._Water.UniformWaterScale; WaveParticle waveParticle = null; float min = 1f / waveShapeIrregularity; for (int i = -clones; i <= clones; i++) { WaveParticle waveParticle2 = particle.Clone(particle.Position + new Vector2(particle.Direction.y, -particle.Direction.x) * ((float)i * 1.48f / particle.BaseFrequency)); if (waveParticle2 != null) { waveParticle2.AmplitudeModifiers2 = UnityEngine.Random.Range(min, 1f) * (edgesElevation + (0.5f + Mathf.Cos(3.14159274f * (float)i / (float)clones) * 0.5f) * (centerElevation - edgesElevation)); waveParticle2.LeftNeighbour = waveParticle; if (waveParticle != null) { waveParticle.RightNeighbour = waveParticle2; if (i == clones) { waveParticle2.DisallowSubdivision = true; } } else { waveParticle2.Group.LeftParticle = waveParticle2; waveParticle2.DisallowSubdivision = true; } if (!this._Particles.AddElement(waveParticle2)) { return(waveParticle != null); } waveParticle = waveParticle2; } } return(true); }
public void CostlyUpdate(WaveParticlesQuadtree quadtree, float time) { WaveParticle waveParticle = this.LeftParticle; float deltaTime = time - this.LastCostlyUpdateTime; this.LastCostlyUpdateTime = time; int num = 0; do { WaveParticle waveParticle2 = waveParticle; waveParticle = waveParticle.RightNeighbour; num += waveParticle2.CostlyUpdate((num >= 30) ? null : quadtree, deltaTime); }while (waveParticle != null); waveParticle = this.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) { WaveParticlesGroup.FilterRefractedDirections(waveParticle3, num2); } waveParticle3 = waveParticle; num2 = 0; } }while (waveParticle != null); }
private void Subdivide(WaveParticlesQuadtree quadtree, WaveParticle left, WaveParticle right, ref int numSubdivisions) { Vector2 a = left._Position - right._Position; float magnitude = a.magnitude; if (magnitude * this.Frequency > 1f && magnitude > 1f && quadtree.FreeSpace != 0) { WaveParticle waveParticle = WaveParticle.Create(right._Position + a * 0.5f, (left.Direction + right.Direction) * 0.5f, (left.BaseFrequency + right.BaseFrequency) * 0.5f, (left.BaseAmplitude + right.BaseAmplitude) * 0.5f, (left.Lifetime + right.Lifetime) * 0.5f, left.IsShoreWave); if (waveParticle != null) { waveParticle.Group = left.Group; waveParticle.Amplitude = (left.Amplitude + right.Amplitude) * 0.5f; waveParticle.Frequency = (left.Frequency + right.Frequency) * 0.5f; waveParticle.Speed = (left.Speed + right.Speed) * 0.5f; waveParticle.TargetSpeed = (left.TargetSpeed + right.TargetSpeed) * 0.5f; waveParticle.EnergyBalance = (left.EnergyBalance + right.EnergyBalance) * 0.5f; waveParticle.Shoaling = (left.Shoaling + right.Shoaling) * 0.5f; waveParticle.TargetInvKh = (left.TargetInvKh + right.TargetInvKh) * 0.5f; waveParticle.Lifetime = (left.Lifetime + right.Lifetime) * 0.5f; waveParticle.TargetEnergyBalance = (left.TargetEnergyBalance + right.TargetEnergyBalance) * 0.5f; waveParticle.AmplitudeModifiers = (left.AmplitudeModifiers + right.AmplitudeModifiers) * 0.5f; waveParticle.AmplitudeModifiers2 = (left.AmplitudeModifiers2 + right.AmplitudeModifiers2) * 0.5f; waveParticle.Invkh = (left.Invkh + right.Invkh) * 0.5f; waveParticle.BaseSpeed = (left.BaseSpeed + right.BaseSpeed) * 0.5f; waveParticle.ExpansionEnergyLoss = (left.ExpansionEnergyLoss + right.ExpansionEnergyLoss) * 0.5f; waveParticle.Direction = left.Direction; if (quadtree.AddElement(waveParticle)) { waveParticle.LeftNeighbour = left; waveParticle.RightNeighbour = right; left.RightNeighbour = waveParticle; right.LeftNeighbour = waveParticle; } numSubdivisions++; } } }
public static WaveParticle Create(Vector3 position, Vector2 direction, float baseFrequency, float baseAmplitude, float lifetime, bool isShoreWave) { return(WaveParticle.Create(new Vector2(position.x, position.z), direction, baseFrequency, baseAmplitude, lifetime, isShoreWave)); }