public void SimulateWaves(float t) { InitWaveSpectrum(t); m_idx = m_fourier.PeformFFT(0, m_fourierBuffer0, m_fourierBuffer1, m_fourierBuffer2); PackTextures(); }
void EvaluateWavesFFT(float t) { float kx, kz, len, lambda = -1.0f; int index, index1; for (int m_prime = 0; m_prime < N; m_prime++) { kz = Mathf.PI * (2.0f * m_prime - N) / m_length; for (int n_prime = 0; n_prime < N; n_prime++) { kx = Mathf.PI * (2 * n_prime - N) / m_length; len = Mathf.Sqrt(kx * kx + kz * kz); index = m_prime * N + n_prime; Vector2 c = InitSpectrum(t, n_prime, m_prime); m_heightBuffer[1, index].x = c.x; m_heightBuffer[1, index].y = c.y; m_slopeBuffer[1, index].x = -c.y * kx; m_slopeBuffer[1, index].y = c.x * kx; m_slopeBuffer[1, index].z = -c.y * kz; m_slopeBuffer[1, index].w = c.x * kz; if (len < 0.000001f) { m_displacementBuffer[1, index].x = 0.0f; m_displacementBuffer[1, index].y = 0.0f; m_displacementBuffer[1, index].z = 0.0f; m_displacementBuffer[1, index].w = 0.0f; } else { m_displacementBuffer[1, index].x = -c.y * -(kx / len); m_displacementBuffer[1, index].y = c.x * -(kx / len); m_displacementBuffer[1, index].z = -c.y * -(kz / len); m_displacementBuffer[1, index].w = c.x * -(kz / len); } } } m_fourier.PeformFFT(0, m_heightBuffer); m_fourier.PeformFFT(0, m_slopeBuffer); m_fourier.PeformFFT(0, m_displacementBuffer); Vector3[] vertices = m_mesh.vertices; Vector3[] normals = m_mesh.normals; int sign; float[] signs = new float[] { 1.0f, -1.0f }; Vector3 n; for (int m_prime = 0; m_prime < N; m_prime++) { for (int n_prime = 0; n_prime < N; n_prime++) { index = m_prime * N + n_prime; // index into buffers index1 = m_prime * Nplus1 + n_prime; // index into vertices sign = (int)signs[(n_prime + m_prime) & 1]; // height vertices[index1].y = m_heightBuffer[1, index].x * sign; // displacement vertices[index1].x = m_position[index1].x + m_displacementBuffer[1, index].x * lambda * sign; vertices[index1].z = m_position[index1].z + m_displacementBuffer[1, index].z * lambda * sign; // normal n = new Vector3(-m_slopeBuffer[1, index].x * sign, 1.0f, -m_slopeBuffer[1, index].z * sign); n.Normalize(); normals[index1].x = n.x; normals[index1].y = n.y; normals[index1].z = n.z; // for tiling if (n_prime == 0 && m_prime == 0) { vertices[index1 + N + Nplus1 * N].y = m_heightBuffer[1, index].x * sign; vertices[index1 + N + Nplus1 * N].x = m_position[index1 + N + Nplus1 * N].x + m_displacementBuffer[1, index].x * lambda * sign; vertices[index1 + N + Nplus1 * N].z = m_position[index1 + N + Nplus1 * N].z + m_displacementBuffer[1, index].z * lambda * sign; normals[index1 + N + Nplus1 * N].x = n.x; normals[index1 + N + Nplus1 * N].y = n.y; normals[index1 + N + Nplus1 * N].z = n.z; } if (n_prime == 0) { vertices[index1 + N].y = m_heightBuffer[1, index].x * sign; vertices[index1 + N].x = m_position[index1 + N].x + m_displacementBuffer[1, index].x * lambda * sign; vertices[index1 + N].z = m_position[index1 + N].z + m_displacementBuffer[1, index].z * lambda * sign; normals[index1 + N].x = n.x; normals[index1 + N].y = n.y; normals[index1 + N].z = n.z; } if (m_prime == 0) { vertices[index1 + Nplus1 * N].y = m_heightBuffer[1, index].x * sign; vertices[index1 + Nplus1 * N].x = m_position[index1 + Nplus1 * N].x + m_displacementBuffer[1, index].x * lambda * sign; vertices[index1 + Nplus1 * N].z = m_position[index1 + Nplus1 * N].z + m_displacementBuffer[1, index].z * lambda * sign; normals[index1 + Nplus1 * N].x = n.x; normals[index1 + Nplus1 * N].y = n.y; normals[index1 + Nplus1 * N].z = n.z; } } } m_mesh.vertices = vertices; m_mesh.normals = normals; m_mesh.RecalculateBounds(); }