コード例 #1
0
        public void Update(float time, NativeArray <Color> pixels)
        {
            int halfYSize = (gridSize / 2) + 1;

            for (int y = 0; y < halfYSize; y++)
            {
                for (int x = 0; x < gridSize; x++)
                {
                    var index       = Grid2Index(x, y);
                    var data        = waveConstantLUT[index];
                    var mirrorIndex = Grid2MirrorIndex(x, y);
                    var mirrorData  = waveConstantLUT[mirrorIndex];

                    var freq    = data.freq * time;
                    var freqSin = Mathf.Sin(freq);
                    var freqCos = Mathf.Cos(freq);

                    var ep = new ComplexF(freqCos, freqSin);
                    var em = ep.conj;

                    var wave = data.amp * ep + mirrorData.amp.conj * em;
                    heightField[index] = wave;
                    dispFieldX[index]  = wave * data.kLenX;
                    dispFieldZ[index]  = wave * data.kLenZ;

                    if (y != halfYSize - 1)
                    {
                        heightField[mirrorIndex] = heightField[index].conj;
                        dispFieldX[mirrorIndex]  = dispFieldX[index].conj;
                        dispFieldZ[mirrorIndex]  = dispFieldZ[index].conj;
                    }
                }
            }

            fftHelper.DoFFT2D(heightField);
            fftHelper.DoFFT2D(dispFieldX);
            fftHelper.DoFFT2D(dispFieldZ);


            for (int y = 0; y < gridSize; y++)
            {
                for (int x = 0; x < gridSize; x++)
                {
                    var index = Grid2Index(x, y);
                    var sign  = PowNeg1(x + y);

                    heightField[index] *= sign * maxWaveSize;
                    dispFieldX[index]  *= sign * choppyWaveScale;
                    dispFieldZ[index]  *= sign * choppyWaveScale;

                    pixels[index] = new Color(dispFieldX[index].real,
                                              -heightField[index].real,
                                              dispFieldZ[index].real,
                                              1);
                }
            }
        }