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); } } }