public static float[] noise(Vector3[] vertices,
                                Vector3 pos, ref NoiseVars nVars)
    {
        Random rnd = new Random(nVars.Seed);

        Vector2[] offsets = new Vector2[nVars.Octaves];

        float[] values = new float[vertices.Length];

        for (int i = 0; i < nVars.Octaves; i++)
        {
            offsets[i] = new Vector2(rnd.Next(-10000, 10000),
                                     rnd.Next(-10000, 10000));
        }

        for (int i = 0; i < vertices.Length; i++)
        {
            Vector2 point =
                new Vector2(vertices[i].x + pos.x + offsets[0].x,
                            vertices[i].z + pos.z + offsets[0].y);

            float frequency = nVars.Frequency;

            float sum = Mathf.PerlinNoise(point.x * frequency / 10000,
                                          point.y * frequency / 10000);

            float amplitude = 1f;
            float range     = 1f;

            for (int j = 1; j < nVars.Octaves; j++)
            {
                frequency *= nVars.Lacunarity;
                amplitude *= nVars.Persistence;
                range     += amplitude;

                point =
                    new Vector2(vertices[i].x + pos.x + offsets[j].x,
                                vertices[i].z + pos.z + offsets[j].y);

                sum += Mathf.PerlinNoise(point.x * frequency / 10000,
                                         point.y * frequency / 10000) * amplitude;
            }

            values[i] = sum / range;
        }

        return(values);
    }
Пример #2
0
    private static void AddNoise(ref TerrainVars tVars,
                                 ref NoiseVars nVars, ref MeshData mesh, Vector3 pos)
    {
        Vector3[] vertices = mesh.vertices;
        float     height   = tVars.Height;

        float[] noise = NoiseGenerator.noise(vertices, pos, ref nVars);

        for (int i = 0; i < vertices.Length; i++)
        {
            Vector3 currentVertex = vertices[i];
            vertices[i].y = (noise[i] * 2 - 1) * height;
        }

        mesh.vertices = vertices;
    }
Пример #3
0
    private static void AddNoise(ref TerrainVars tVars,
                                 ref NoiseVars nVars, ref MeshData mesh, Vector3 pos)
    {
        Vector3[] vertices = mesh.vertices;
        Color[]   colors   = new Color[vertices.Length];

        Gradient gradient = tVars.gradient;
        float    height   = tVars.Height;

        float[] noise = NoiseGenerator.noise(vertices, pos, ref nVars);

        for (int i = 0; i < vertices.Length; i++)
        {
            Vector3 currentVertex = vertices[i];
            colors[i]     = gradient.Evaluate(noise[i]);
            vertices[i].y = (noise[i] * 2 - 1) * height;
        }

        mesh.vertices = vertices;
        mesh.colors   = colors;
        mesh.RecalculateNormals();
    }
Пример #4
0
    public void AddHeights(ref TerrainVars tVars,
                           ref NoiseVars nVars, Vector3 pos)
    {
        float height = tVars.Height;

        Vector3[] vertices = this.vertices;

        AnimationCurve curve =
            new AnimationCurve(tVars.curve.keys);

        // Get noise
        float[] noise =
            NoiseGenerator.noise(vertices, pos, ref nVars);

        for (int i = 0; i < vertices.Length; i++)
        {
            noise[i]      = Mathf.Clamp01(curve.Evaluate(noise[i]));
            vertices[i].y = (noise[i] * 2 - 1) * height;
        }

        // Save mesh values
        this.vertices = vertices;
    }
Пример #5
0
    public void AddHeightsAndColors(ref TerrainVars tVars,
                                    ref NoiseVars nVars, Vector3 pos)
    {
        Vector3[] vertices = this.vertices;
        Color[]   colors   = new Color[vertices.Length];

        Gradient gradient = tVars.gradient;

        // Color keys
        float[] keys = gradient.colorKeys
                       .Select(k => k.time).ToArray();

        i1 = new float[vertices.Length];
        i2 = new float[vertices.Length];

        AnimationCurve curve =
            new AnimationCurve(tVars.curve.keys);

        float height = tVars.Height;

        // Get noise
        float[] noise =
            NoiseGenerator.noise(vertices, pos, ref nVars);

        for (int i = 0; i < vertices.Length; i++)
        {
            float cNoise = Mathf.Clamp01(curve.Evaluate(noise[i]));

            colors[i] = gradient.Evaluate(cNoise);

            vertices[i].y = (cNoise * 2 - 1) * height;

            try
            {
                if (cNoise < keys[1])
                {
                    i1[i] = 0;
                }
                if (cNoise > keys[0] && cNoise < keys[3])
                {
                    i2[i] = 1;
                }
                if (cNoise > keys[2] && cNoise < keys[5])
                {
                    i1[i] = 2;
                }
                if (cNoise > keys[4] && cNoise < keys[7])
                {
                    i2[i] = 3;
                }
                if (cNoise > keys[6])
                {
                    i1[i] = 4;
                }
            }
            catch (IndexOutOfRangeException) { };
        }

        // Save mesh values
        this.vertices = vertices;
        this.colors   = colors;
        RecalculateNormals();
        SaveIndexes();
    }