コード例 #1
0
    public void SimulateWaves(float t)
    {
        InitWaveSpectrum(t);

        m_idx = m_fourier.PeformFFT(0, m_fourierBuffer0, m_fourierBuffer1, m_fourierBuffer2);

        PackTextures();
    }
コード例 #2
0
    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();
    }