public Vector4 GetForceAndHeightAt(float x, float z, float time)
        {
            Vector4 vector = default(Vector4);

            x = -(x + this._SurfaceOffset.x);
            z = -(z + this._SurfaceOffset.y);
            if (this._TargetDirectWavesCount == -1)
            {
                for (int i = this._NumTiles - 1; i >= 0; i--)
                {
                    WaterTileSpectrum waterTileSpectrum = this._TileSpectra[i];
                    if (waterTileSpectrum.ResolveByFFT)
                    {
                        float fx;
                        float invFx;
                        float fy;
                        float invFy;
                        int   num;
                        int   num2;
                        int   num3;
                        int   num4;
                        this.InterpolationParams(x, z, i, this._WindWaves.TileSizes[i], out fx, out invFx, out fy, out invFy, out num, out num2, out num3, out num4);
                        Vector2[] array;
                        Vector2[] array2;
                        Vector4[] array3;
                        Vector4[] array4;
                        float     t;
                        waterTileSpectrum.GetResults(time, out array, out array2, out array3, out array4, out t);
                        vector += FastMath.Interpolate(array3[num], array3[num2], array3[num3], array3[num4], array4[num], array4[num2], array4[num3], array4[num4], fx, invFx, fy, invFy, t);
                    }
                }
            }
            else
            {
                lock (this)
                {
                    WaterWave[] validatedDirectWavesList = this.GetValidatedDirectWavesList();
                    if (validatedDirectWavesList.Length != 0)
                    {
                        Vector4 b = default(Vector4);
                        for (int j = 0; j < validatedDirectWavesList.Length; j++)
                        {
                            validatedDirectWavesList[j].GetForceAndHeightAt(x, z, time, ref b);
                        }
                        vector += b;
                    }
                }
            }
            float num5 = -this._Water.Materials.HorizontalDisplacementScale * this._UniformWaterScale;

            vector.x *= num5;
            vector.z *= num5;
            vector.y *= 0.5f * this._UniformWaterScale;
            vector.w *= this._UniformWaterScale;
            return(vector);
        }
        internal void Update()
        {
            this._SurfaceOffset = this._Water.SurfaceOffset;
            float num = this._Water.Time;

            if (this._WindWaves.LoopDuration != 0f)
            {
                num %= this._WindWaves.LoopDuration;
            }
            this.LastFrameTime      = num;
            this._UniformWaterScale = this._Water.UniformWaterScale;
            this.UpdateCachedSeed();
            bool allowCpuFFT = WaterProjectSettings.Instance.AllowCpuFFT;

            for (int i = 0; i < this._NumTiles; i++)
            {
                int num2 = 16;
                int num3 = 0;
                for (;;)
                {
                    float num4 = 0f;
                    for (int j = this._SpectraDataList.Count - 1; j >= 0; j--)
                    {
                        WaterWavesSpectrumDataBase waterWavesSpectrumDataBase = this._SpectraDataList[j];
                        waterWavesSpectrumDataBase.ValidateSpectrumData();
                        float standardDeviation = waterWavesSpectrumDataBase.GetStandardDeviation(i, num3);
                        num4 += standardDeviation * waterWavesSpectrumDataBase.Weight;
                    }
                    for (int k = this._OverlayedSpectra.Count - 1; k >= 0; k--)
                    {
                        WaterWavesSpectrumDataBase waterWavesSpectrumDataBase2 = this._OverlayedSpectra[k];
                        waterWavesSpectrumDataBase2.ValidateSpectrumData();
                        float standardDeviation2 = waterWavesSpectrumDataBase2.GetStandardDeviation(i, num3);
                        num4 += standardDeviation2 * waterWavesSpectrumDataBase2.Weight;
                    }
                    if (num4 < this._WindWaves.CpuDesiredStandardError * 0.25f || num2 >= this._WindWaves.FinalResolution)
                    {
                        break;
                    }
                    num2 <<= 1;
                    num3++;
                }
                if (num2 > this._WindWaves.FinalResolution)
                {
                    num2 = this._WindWaves.FinalResolution;
                }
                WaterTileSpectrum waterTileSpectrum = this._TileSpectra[i];
                if (waterTileSpectrum.SetResolveMode(num2 >= 16 && allowCpuFFT, num2))
                {
                    this._CpuWavesDirty = true;
                }
            }
        }