|
@@ -1,4 +1,5 @@
|
|
|
using UnityEngine;
|
|
using UnityEngine;
|
|
|
|
|
+using System.Collections;
|
|
|
using System;
|
|
using System;
|
|
|
using System.Threading;
|
|
using System.Threading;
|
|
|
using System.Collections.Generic;
|
|
using System.Collections.Generic;
|
|
@@ -6,27 +7,25 @@ using System.Collections.Generic;
|
|
|
public class MapGenerator : MonoBehaviour
|
|
public class MapGenerator : MonoBehaviour
|
|
|
{
|
|
{
|
|
|
|
|
|
|
|
- public enum DrawMode { NoiseMap, ColourMap, Mesh, FallOff};
|
|
|
|
|
|
|
+ public enum DrawMode { NoiseMap, ColourMap, Mesh, FalloffMap };
|
|
|
public DrawMode drawMode;
|
|
public DrawMode drawMode;
|
|
|
|
|
|
|
|
public Noise.NormalizeMode normalizeMode;
|
|
public Noise.NormalizeMode normalizeMode;
|
|
|
|
|
|
|
|
- public const int mapChunkSize = 241;
|
|
|
|
|
-
|
|
|
|
|
- [Range(0,6)]
|
|
|
|
|
|
|
+ public const int mapChunkSize = 239;
|
|
|
|
|
+ [Range(0, 6)]
|
|
|
public int editorPreviewLOD;
|
|
public int editorPreviewLOD;
|
|
|
public float noiseScale;
|
|
public float noiseScale;
|
|
|
|
|
|
|
|
public int octaves;
|
|
public int octaves;
|
|
|
-
|
|
|
|
|
- [Range(0,1)]
|
|
|
|
|
|
|
+ [Range(0, 1)]
|
|
|
public float persistance;
|
|
public float persistance;
|
|
|
public float lacunarity;
|
|
public float lacunarity;
|
|
|
|
|
|
|
|
public int seed;
|
|
public int seed;
|
|
|
public Vector2 offset;
|
|
public Vector2 offset;
|
|
|
|
|
|
|
|
- public bool useFallOff;
|
|
|
|
|
|
|
+ public bool useFalloff;
|
|
|
|
|
|
|
|
public float meshHeightMultiplier;
|
|
public float meshHeightMultiplier;
|
|
|
public AnimationCurve meshHeightCurve;
|
|
public AnimationCurve meshHeightCurve;
|
|
@@ -35,14 +34,14 @@ public class MapGenerator : MonoBehaviour
|
|
|
|
|
|
|
|
public TerrainType[] regions;
|
|
public TerrainType[] regions;
|
|
|
|
|
|
|
|
- float[,] fallOffMap;
|
|
|
|
|
|
|
+ float[,] falloffMap;
|
|
|
|
|
|
|
|
Queue<MapThreadInfo<MapData>> mapDataThreadInfoQueue = new Queue<MapThreadInfo<MapData>>();
|
|
Queue<MapThreadInfo<MapData>> mapDataThreadInfoQueue = new Queue<MapThreadInfo<MapData>>();
|
|
|
Queue<MapThreadInfo<MeshData>> meshDataThreadInfoQueue = new Queue<MapThreadInfo<MeshData>>();
|
|
Queue<MapThreadInfo<MeshData>> meshDataThreadInfoQueue = new Queue<MapThreadInfo<MeshData>>();
|
|
|
|
|
|
|
|
- private void Awake()
|
|
|
|
|
|
|
+ void Awake()
|
|
|
{
|
|
{
|
|
|
- fallOffMap = FallOffGenerator.GenerateFallOffMap(mapChunkSize);
|
|
|
|
|
|
|
+ falloffMap = FallOffGenerator.GenerateFallOffMap(mapChunkSize);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void DrawMapInEditor()
|
|
public void DrawMapInEditor()
|
|
@@ -50,7 +49,6 @@ public class MapGenerator : MonoBehaviour
|
|
|
MapData mapData = GenerateMapData(Vector2.zero);
|
|
MapData mapData = GenerateMapData(Vector2.zero);
|
|
|
|
|
|
|
|
MapDisplay display = FindFirstObjectByType<MapDisplay>();
|
|
MapDisplay display = FindFirstObjectByType<MapDisplay>();
|
|
|
-
|
|
|
|
|
if (drawMode == DrawMode.NoiseMap)
|
|
if (drawMode == DrawMode.NoiseMap)
|
|
|
{
|
|
{
|
|
|
display.DrawTexture(TextureGenerator.TextureFromHeightMap(mapData.heightMap));
|
|
display.DrawTexture(TextureGenerator.TextureFromHeightMap(mapData.heightMap));
|
|
@@ -62,7 +60,8 @@ public class MapGenerator : MonoBehaviour
|
|
|
else if (drawMode == DrawMode.Mesh)
|
|
else if (drawMode == DrawMode.Mesh)
|
|
|
{
|
|
{
|
|
|
display.DrawMesh(MeshGenerator.GenerateTerrainMesh(mapData.heightMap, meshHeightMultiplier, meshHeightCurve, editorPreviewLOD), TextureGenerator.TextureFromColourMap(mapData.colourMap, mapChunkSize, mapChunkSize));
|
|
display.DrawMesh(MeshGenerator.GenerateTerrainMesh(mapData.heightMap, meshHeightMultiplier, meshHeightCurve, editorPreviewLOD), TextureGenerator.TextureFromColourMap(mapData.colourMap, mapChunkSize, mapChunkSize));
|
|
|
- }else if (drawMode ==DrawMode.FallOff)
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (drawMode == DrawMode.FalloffMap)
|
|
|
{
|
|
{
|
|
|
display.DrawTexture(TextureGenerator.TextureFromHeightMap(FallOffGenerator.GenerateFallOffMap(mapChunkSize)));
|
|
display.DrawTexture(TextureGenerator.TextureFromHeightMap(FallOffGenerator.GenerateFallOffMap(mapChunkSize)));
|
|
|
}
|
|
}
|
|
@@ -70,8 +69,7 @@ public class MapGenerator : MonoBehaviour
|
|
|
|
|
|
|
|
public void RequestMapData(Vector2 centre, Action<MapData> callback)
|
|
public void RequestMapData(Vector2 centre, Action<MapData> callback)
|
|
|
{
|
|
{
|
|
|
- ThreadStart threadStart = delegate
|
|
|
|
|
- {
|
|
|
|
|
|
|
+ ThreadStart threadStart = delegate {
|
|
|
MapDataThread(centre, callback);
|
|
MapDataThread(centre, callback);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -89,8 +87,7 @@ public class MapGenerator : MonoBehaviour
|
|
|
|
|
|
|
|
public void RequestMeshData(MapData mapData, int lod, Action<MeshData> callback)
|
|
public void RequestMeshData(MapData mapData, int lod, Action<MeshData> callback)
|
|
|
{
|
|
{
|
|
|
- ThreadStart threadStart = delegate
|
|
|
|
|
- {
|
|
|
|
|
|
|
+ ThreadStart threadStart = delegate {
|
|
|
MeshDataThread(mapData, lod, callback);
|
|
MeshDataThread(mapData, lod, callback);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -106,7 +103,7 @@ public class MapGenerator : MonoBehaviour
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private void Update()
|
|
|
|
|
|
|
+ void Update()
|
|
|
{
|
|
{
|
|
|
if (mapDataThreadInfoQueue.Count > 0)
|
|
if (mapDataThreadInfoQueue.Count > 0)
|
|
|
{
|
|
{
|
|
@@ -116,9 +113,10 @@ public class MapGenerator : MonoBehaviour
|
|
|
threadInfo.callback(threadInfo.parameter);
|
|
threadInfo.callback(threadInfo.parameter);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
if (meshDataThreadInfoQueue.Count > 0)
|
|
if (meshDataThreadInfoQueue.Count > 0)
|
|
|
{
|
|
{
|
|
|
- for(int i = 0; i < meshDataThreadInfoQueue.Count; i++)
|
|
|
|
|
|
|
+ for (int i = 0; i < meshDataThreadInfoQueue.Count; i++)
|
|
|
{
|
|
{
|
|
|
MapThreadInfo<MeshData> threadInfo = meshDataThreadInfoQueue.Dequeue();
|
|
MapThreadInfo<MeshData> threadInfo = meshDataThreadInfoQueue.Dequeue();
|
|
|
threadInfo.callback(threadInfo.parameter);
|
|
threadInfo.callback(threadInfo.parameter);
|
|
@@ -128,24 +126,23 @@ public class MapGenerator : MonoBehaviour
|
|
|
|
|
|
|
|
MapData GenerateMapData(Vector2 centre)
|
|
MapData GenerateMapData(Vector2 centre)
|
|
|
{
|
|
{
|
|
|
- float[,] noiseMap = Noise.GenerateNoiseMap(mapChunkSize, mapChunkSize, seed, noiseScale, octaves, persistance, lacunarity, centre + offset, normalizeMode);
|
|
|
|
|
|
|
+ float[,] noiseMap = Noise.GenerateNoiseMap(mapChunkSize + 2, mapChunkSize + 2, seed, noiseScale, octaves, persistance, lacunarity, centre + offset, normalizeMode);
|
|
|
|
|
|
|
|
Color[] colourMap = new Color[mapChunkSize * mapChunkSize];
|
|
Color[] colourMap = new Color[mapChunkSize * mapChunkSize];
|
|
|
-
|
|
|
|
|
- for(int y=0; y<mapChunkSize; y++)
|
|
|
|
|
|
|
+ for (int y = 0; y < mapChunkSize; y++)
|
|
|
{
|
|
{
|
|
|
- for (int x=0; x<mapChunkSize; x++)
|
|
|
|
|
|
|
+ for (int x = 0; x < mapChunkSize; x++)
|
|
|
{
|
|
{
|
|
|
- if (useFallOff)
|
|
|
|
|
|
|
+ if (useFalloff)
|
|
|
{
|
|
{
|
|
|
- noiseMap[x, y] = Mathf.Clamp(noiseMap[x, y] - fallOffMap[x, y], 0, 1);
|
|
|
|
|
|
|
+ noiseMap[x, y] = Mathf.Clamp01(noiseMap[x, y] - falloffMap[x, y]);
|
|
|
}
|
|
}
|
|
|
float currentHeight = noiseMap[x, y];
|
|
float currentHeight = noiseMap[x, y];
|
|
|
for (int i = 0; i < regions.Length; i++)
|
|
for (int i = 0; i < regions.Length; i++)
|
|
|
{
|
|
{
|
|
|
- if(currentHeight >= regions[i].height)
|
|
|
|
|
|
|
+ if (currentHeight >= regions[i].height)
|
|
|
{
|
|
{
|
|
|
- colourMap[y*mapChunkSize + x] = regions[i].colour;
|
|
|
|
|
|
|
+ colourMap[y * mapChunkSize + x] = regions[i].colour;
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
@@ -154,21 +151,23 @@ public class MapGenerator : MonoBehaviour
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
return new MapData(noiseMap, colourMap);
|
|
return new MapData(noiseMap, colourMap);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private void OnValidate()
|
|
|
|
|
|
|
+ void OnValidate()
|
|
|
{
|
|
{
|
|
|
if (lacunarity < 1)
|
|
if (lacunarity < 1)
|
|
|
{
|
|
{
|
|
|
lacunarity = 1;
|
|
lacunarity = 1;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- if(octaves < 0)
|
|
|
|
|
|
|
+ if (octaves < 0)
|
|
|
{
|
|
{
|
|
|
octaves = 0;
|
|
octaves = 0;
|
|
|
}
|
|
}
|
|
|
- fallOffMap = FallOffGenerator.GenerateFallOffMap(mapChunkSize);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ falloffMap = FallOffGenerator.GenerateFallOffMap(mapChunkSize);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
struct MapThreadInfo<T>
|
|
struct MapThreadInfo<T>
|
|
@@ -181,7 +180,9 @@ public class MapGenerator : MonoBehaviour
|
|
|
this.callback = callback;
|
|
this.callback = callback;
|
|
|
this.parameter = parameter;
|
|
this.parameter = parameter;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
[System.Serializable]
|
|
[System.Serializable]
|
|
@@ -202,4 +203,4 @@ public struct MapData
|
|
|
this.heightMap = heightMap;
|
|
this.heightMap = heightMap;
|
|
|
this.colourMap = colourMap;
|
|
this.colourMap = colourMap;
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
+}
|