using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Noise : MonoBehaviour
{
public static int xlenght = 250;
public static int ylenght = 250;
[SerializeField] float[] Frequencies;
[SerializeField] float[] Amplitudes;
float[,] generatednoise = new float[xlenght + 1, ylenght + 1];
Texture2D texture;
[SerializeField] Material mat;
[SerializeField] float scale;
public float xOffset;
public float yOffset;
[SerializeField] terrainrype[] terrainrypearray;
Mesh mesh;
Vector3[] vertecies = new Vector3[(xlenght + 1) * (ylenght + 1)];
[SerializeField] MeshCollider terraincollider;
private void Start()
{
mesh = new Mesh();
GetComponent<MeshFilter>().mesh = mesh;
calculatenoise();
updatemesh();
mat.mainTexture = generatetexture(texture);
}
private void Update()
{
}
Texture2D generatetexture(Texture2D texture)
{
texture = new Texture2D(xlenght, ylenght);
for (int x = 0; x <= xlenght; x++)
{
for (int y = 0; y <= ylenght; y++)
{
for (int i = 0; i < Amplitudes.Length; i++)
{
texture.SetPixel(x, y, calculatecolor(x, y));
}
}
}
texture.Apply();
return texture;
}
void calculatenoise()
{
for (int x = 0, e = 0; x < xlenght + 1; x++)
{
for (int y = 0; y < ylenght + 1; y++)
{
for (int i = 0; i < Amplitudes.Length; i++)
{
generatednoise[x, y] += Amplitudes _* Mathf.PerlinNoise(_
Frequencies * x / xlenght * scale + xOffset, Frequencies * y / ylenght * scale + yOffset);
}
vertecies[e] = new Vector3(x, generatednoise[x,y], y);
e++;
}
}
}
int[] trianglesgenerate()
{
int[] triangles = new int[xlenght * ylenght * 6];
int tris = 0;
int verts = 0;
for (int y = 0; y < ylenght; y++)
{
for (int x = 0; x < xlenght; x++)
{
triangles[tris] = verts + 0;
triangles[tris + 1] = verts + xlenght + 1;
triangles[tris + 2] = verts + xlenght + 1;
triangles[tris + 3] = verts + 1;
triangles[tris + 4] = verts + 1;
triangles[tris + 5] = verts + xlenght + 2;
tris += 6;
verts++;
}
}
return triangles;
}
Color calculatecolor(int x, int y)
{
float sample = 0;
Color color = Color.white;
sample = generatednoise[x, y];
for (int a = 0; a < terrainrypearray.Length; a++)
{
if (sample <= terrainrypearray[a].depth)
{
color = terrainrypearray[a].color;
break;
}
}
return color;
}
[System.Serializable] public struct terrainrype
{
public string name;
public float depth;
public Color color;
}
void updatemesh()
{
mesh.Clear();
mesh.vertices = vertecies;
mesh.triangles = trianglesgenerate();
mesh.RecalculateNormals();
mesh.RecalculateBounds();
}
}