Exemple #1
0
    protected virtual void Update()
    {
        if (meshFilter == null)
        {
            meshFilter = GetComponent <MeshFilter>();
        }

        if (mesh == null)
        {
            mesh           = new Mesh();
            mesh.hideFlags = HideFlags.DontSave;
        }

        // Prevent this from dirtying the scene when exiting play mode
        D2D_Helper.StealthSet(meshFilter, mesh);

        // Generate positions?
        if (positions == null || positions.Length != WaveCount * 3 + 3)
        {
            positions = new Vector3[WaveCount * 3 + 3];
        }

        // Generate colours?
        if (colours == null || colours.Length != WaveCount * 3 + 3)
        {
            colours = new Color[WaveCount * 3 + 3];
        }

        for (var i = 0; i <= WaveCount; i++)
        {
            colours[i * 3 + 0] = WaveColour;
            colours[i * 3 + 1] = SeaColour;
            colours[i * 3 + 2] = SeaColour;
        }

        // Generate uvs?
        if (uvs == null || uvs.Length != WaveCount * 3 + 3)
        {
            uvs = new Vector2[WaveCount * 3 + 3];
        }

        // Generate indices?
        if (indices == null || indices.Length != WaveCount * 12)
        {
            indices = new int[WaveCount * 12];

            for (var i = 0; i < WaveCount; i++)
            {
                // Wave
                indices[i * 12 + 0] = i * 3 + 0;
                indices[i * 12 + 1] = i * 3 + 1;
                indices[i * 12 + 2] = i * 3 + 3;
                indices[i * 12 + 3] = i * 3 + 4;
                indices[i * 12 + 4] = i * 3 + 3;
                indices[i * 12 + 5] = i * 3 + 1;

                // Sea
                indices[i * 12 + 6]  = i * 3 + 1;
                indices[i * 12 + 7]  = i * 3 + 2;
                indices[i * 12 + 8]  = i * 3 + 4;
                indices[i * 12 + 9]  = i * 3 + 5;
                indices[i * 12 + 10] = i * 3 + 4;
                indices[i * 12 + 11] = i * 3 + 2;
            }
        }

        // Make waves move?
        if (NoiseTex != null)
        {
            WaveAge += WaveSpeed * Time.deltaTime;

            var halfSize = WaveCount * WaveWidth * 0.5f;

            for (var i = 0; i <= WaveCount; i++)
            {
                var sample = NoiseTex.GetPixelBilinear(WaveOffset + i * WaveFrequency, WaveAge).r - 0.5f;
                var x      = i * WaveWidth - halfSize;
                var y      = sample * 2.0f * WaveAmplitude;

                positions[i * 3 + 0] = new Vector3(x, y, 0.0f);
                positions[i * 3 + 1] = new Vector3(x, y - WaveThickness, 0.0f);
                positions[i * 3 + 2] = new Vector3(x, y - SeaDepth, 0.0f);
            }
        }

        // Update mesh
        mesh.Clear();
        mesh.vertices  = positions;
        mesh.colors    = colours;
        mesh.triangles = indices;
        mesh.uv        = uvs;
        mesh.RecalculateBounds();
        mesh.RecalculateNormals();
    }