205 lines
6.6 KiB
C#
205 lines
6.6 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using UnityEngine.InputSystem;
|
|
|
|
public class NoiseTesting : MonoBehaviour
|
|
{
|
|
System.Random rand = new System.Random();
|
|
Dictionary<Vector3, GameObject> mapGen;
|
|
Vector3 current;
|
|
Vector3 next;
|
|
public GameObject tilePrefab;
|
|
// Start is called before the first frame update
|
|
void Start()
|
|
{
|
|
mapGen = new Dictionary<Vector3, GameObject>();
|
|
current = new Vector3(0, 0, 0);
|
|
mapGen.Add(current, Instantiate(tilePrefab, current, Quaternion.identity));
|
|
applyNormalNoise(mapGen[current], mapGen);
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update()
|
|
{
|
|
if (Input.GetKeyDown(KeyCode.Space))
|
|
{
|
|
applyNormalNoise(mapGen[new Vector3(0, 0, 0)], mapGen);
|
|
}
|
|
|
|
if (Input.GetKeyDown(KeyCode.A))
|
|
{
|
|
next = current - new Vector3(100, 0, 0);
|
|
}
|
|
if (Input.GetKeyDown(KeyCode.W))
|
|
{
|
|
next = current - new Vector3(0, 0, -100);
|
|
}
|
|
if (Input.GetKeyDown(KeyCode.D))
|
|
{
|
|
next = current - new Vector3(-100, 0, 0);
|
|
}
|
|
if (Input.GetKeyDown(KeyCode.S))
|
|
{
|
|
next = current - new Vector3(0, 0, 100);
|
|
}
|
|
|
|
if (next != current)
|
|
{
|
|
current = next;
|
|
if (!mapGen.ContainsKey(current))
|
|
{
|
|
mapGen.Add(current, Instantiate(tilePrefab, current, Quaternion.identity));
|
|
applyNormalNoise(mapGen[current], mapGen);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
private void applyNormalNoise(GameObject tile, Dictionary<Vector3, GameObject> map)
|
|
{
|
|
//resetMesh(tile);
|
|
Mesh mesh = tile.GetComponent<MeshFilter>().mesh;
|
|
Vector3[] vertices = mesh.vertices;
|
|
//float[] samples = calculateBasicSamples(tile);
|
|
float[] samples = calculateConnectedSamples(tile);
|
|
|
|
Color32[] colors;
|
|
Color32 low = new Color32(0, 150, 0, 255);
|
|
Color32 high = new Color32(0, 110, 20, 255);
|
|
string tiletype = "";
|
|
|
|
float lowestValue = 10;
|
|
float highestValue = 0;
|
|
|
|
for (int i = 0; i < samples.Length; i++)
|
|
{
|
|
if (lowestValue > samples[i])
|
|
{
|
|
lowestValue = samples[i];
|
|
}
|
|
if (highestValue < samples[i])
|
|
{
|
|
highestValue = samples[i];
|
|
}
|
|
}
|
|
|
|
float modifier = highestValue - lowestValue;
|
|
|
|
colors = new Color32[samples.Length];
|
|
for (int i = 0; i < samples.Length; i++)
|
|
{
|
|
colors[i] = Color32.Lerp(low, high, (1 / modifier) * (samples[i] - lowestValue));
|
|
}
|
|
|
|
for (int i = 0; i < samples.Length; i++)
|
|
{
|
|
vertices[i].y = samples[i];// * 3;
|
|
}
|
|
applyMesh(tile, vertices, mesh, colors);
|
|
//tile.GetComponent<Tile>().setType(tiletype);
|
|
}
|
|
|
|
private void resetMesh(GameObject tile)
|
|
{
|
|
Mesh mesh = tile.GetComponent<MeshCollider>().sharedMesh;
|
|
Vector3[] vertices = mesh.vertices;
|
|
for (int i = 0; i < vertices.Length; i++)
|
|
{
|
|
vertices[i].y = 0;
|
|
}
|
|
mesh.vertices = vertices;
|
|
mesh.RecalculateBounds();
|
|
mesh.RecalculateNormals();
|
|
tile.GetComponent<MeshCollider>().sharedMesh = mesh;
|
|
}
|
|
|
|
private float[] calculateBasicSamples(GameObject tile)
|
|
{
|
|
Mesh mesh = tile.GetComponent<MeshFilter>().mesh;
|
|
Vector3[] vertices = mesh.vertices;
|
|
float[] samples = new float[vertices.Length];
|
|
for (int i = 0; i < vertices.Length; i++)
|
|
{
|
|
float xCord = vertices[i].x / (vertices.Length - 1) * 10;
|
|
float zCord = vertices[i].z / (vertices.Length - 1) * 10;
|
|
float sample = Mathf.PerlinNoise(xCord, zCord) - 0.5f * rand.Next(0, 6);
|
|
samples[i] = sample;
|
|
}
|
|
return samples;
|
|
}
|
|
|
|
private float[] calculateConnectedSamples(GameObject tile)
|
|
{
|
|
//Working with "next" as index for tile to be generated
|
|
//Working with "mapGen" as map Placeholder to check against neighbours
|
|
Mesh mesh = tile.GetComponent<MeshFilter>().mesh;
|
|
Vector3[] vertices = mesh.vertices;
|
|
float[] samples = Enumerable.Repeat(-100f, vertices.Length).ToArray();
|
|
int sideLength = Mathf.RoundToInt(Mathf.Sqrt(vertices.Length));
|
|
samples = connectSamples(samples, sideLength);
|
|
|
|
for (int i = 0; i < vertices.Length; i++)
|
|
{
|
|
if (samples[i] == -100)
|
|
{
|
|
float xCord = vertices[i].x / (vertices.Length - 1) * 10;
|
|
float zCord = vertices[i].z / (vertices.Length - 1) * 10;
|
|
float sample = Mathf.PerlinNoise(xCord, zCord) - 1f * rand.Next(0, 6);
|
|
samples[i] = sample;
|
|
}
|
|
}
|
|
return samples;
|
|
}
|
|
|
|
private void applyMesh(GameObject tile, Vector3[] vertices, Mesh mesh, Color32[] colors)
|
|
{
|
|
mesh.vertices = vertices;
|
|
mesh.RecalculateBounds();
|
|
mesh.RecalculateNormals();
|
|
mesh.colors32 = colors;
|
|
tile.GetComponent<MeshCollider>().sharedMesh = mesh;
|
|
}
|
|
|
|
private float[] connectSamples(float[] samples, int sideLength)
|
|
{
|
|
Mesh mesh;
|
|
Vector3[] vertices;
|
|
|
|
for (int i = 0; i < sideLength; i++)
|
|
{
|
|
if (mapGen.ContainsKey(next - new Vector3(100, 0, 0)))
|
|
{ //LINKS
|
|
mesh = mapGen[next - new Vector3(100, 0, 0)].GetComponent<MeshFilter>().mesh;
|
|
vertices = mesh.vertices;
|
|
samples[sideLength - 1 + sideLength * i] = vertices[sideLength * i].y;
|
|
}
|
|
|
|
if (mapGen.ContainsKey(next - new Vector3(-100, 0, 0)))
|
|
{ //RECHTS
|
|
mesh = mapGen[next - new Vector3(-100, 0, 0)].GetComponent<MeshFilter>().mesh;
|
|
vertices = mesh.vertices;
|
|
samples[sideLength * i] = vertices[sideLength - 1 + sideLength * i].y;
|
|
}
|
|
|
|
if (mapGen.ContainsKey(next - new Vector3(0, 0, -100)))
|
|
{ //OBEN
|
|
mesh = mapGen[next - new Vector3(0, 0, -100)].GetComponent<MeshFilter>().mesh;
|
|
vertices = mesh.vertices;
|
|
samples[i] = vertices[(sideLength * sideLength) - (sideLength-i)].y;
|
|
}
|
|
|
|
if (mapGen.ContainsKey(next - new Vector3(0, 0, 100)))
|
|
{ //UNTEN
|
|
mesh = mapGen[next - new Vector3(0, 0, 100)].GetComponent<MeshFilter>().mesh;
|
|
vertices = mesh.vertices;
|
|
samples[(sideLength * sideLength) - (sideLength-i)] = vertices[i].y;
|
|
}
|
|
}
|
|
|
|
return samples;
|
|
}
|
|
}
|