コード例 #1
0
        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;
            }
        }
コード例 #2
0
 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();
             }
         }
     }
 }
コード例 #3
0
 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));
     }
 }
コード例 #4
0
 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));
 }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
 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;
     }
 }
コード例 #8
0
        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);
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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++;
                }
            }
        }
コード例 #12
0
 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));
 }