SebastianLague

Fixed falloff map edges

Sep 1st, 2016
1,377
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.07 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. using System.Threading;
  5. using System.Collections.Generic;
  6.  
  7. public class MapGenerator : MonoBehaviour {
  8.  
  9.     public enum DrawMode {NoiseMap, ColourMap, Mesh, FalloffMap};
  10.     public DrawMode drawMode;
  11.  
  12.     public Noise.NormalizeMode normalizeMode;
  13.  
  14.     public const int mapChunkSize = 239;
  15.     [Range(0,6)]
  16.     public int editorPreviewLOD;
  17.     public float noiseScale;
  18.  
  19.     public int octaves;
  20.     [Range(0,1)]
  21.     public float persistance;
  22.     public float lacunarity;
  23.  
  24.     public int seed;
  25.     public Vector2 offset;
  26.  
  27.     public bool useFalloff;
  28.  
  29.     public float meshHeightMultiplier;
  30.     public AnimationCurve meshHeightCurve;
  31.  
  32.     public bool autoUpdate;
  33.  
  34.     public TerrainType[] regions;
  35.  
  36.     float[,] falloffMap;
  37.     bool falloffMapGenerated;
  38.  
  39.     Queue<MapThreadInfo<MapData>> mapDataThreadInfoQueue = new Queue<MapThreadInfo<MapData>>();
  40.     Queue<MapThreadInfo<MeshData>> meshDataThreadInfoQueue = new Queue<MapThreadInfo<MeshData>>();
  41.  
  42.  
  43.     void GenerateFalloffMap() {
  44.         if (useFalloff && !falloffMapGenerated) {
  45.             falloffMap = FalloffGenerator.GenerateFalloffMap (mapChunkSize + 2);
  46.             falloffMapGenerated = true;
  47.         }
  48.     }
  49.  
  50.     public void DrawMapInEditor() {
  51.         MapData mapData = GenerateMapData (Vector2.zero);
  52.  
  53.         MapDisplay display = FindObjectOfType<MapDisplay> ();
  54.         if (drawMode == DrawMode.NoiseMap) {
  55.             display.DrawTexture (TextureGenerator.TextureFromHeightMap (mapData.heightMap));
  56.         } else if (drawMode == DrawMode.ColourMap) {
  57.             display.DrawTexture (TextureGenerator.TextureFromColourMap (mapData.colourMap, mapChunkSize, mapChunkSize));
  58.         } else if (drawMode == DrawMode.Mesh) {
  59.             display.DrawMesh (MeshGenerator.GenerateTerrainMesh (mapData.heightMap, meshHeightMultiplier, meshHeightCurve, editorPreviewLOD), TextureGenerator.TextureFromColourMap (mapData.colourMap, mapChunkSize, mapChunkSize));
  60.         } else if (drawMode == DrawMode.FalloffMap) {
  61.             display.DrawTexture(TextureGenerator.TextureFromHeightMap(FalloffGenerator.GenerateFalloffMap(mapChunkSize)));
  62.         }
  63.     }
  64.  
  65.     public void RequestMapData(Vector2 centre, Action<MapData> callback) {
  66.         ThreadStart threadStart = delegate {
  67.             MapDataThread (centre, callback);
  68.         };
  69.  
  70.         new Thread (threadStart).Start ();
  71.     }
  72.  
  73.     void MapDataThread(Vector2 centre, Action<MapData> callback) {
  74.         MapData mapData = GenerateMapData (centre);
  75.         lock (mapDataThreadInfoQueue) {
  76.             mapDataThreadInfoQueue.Enqueue (new MapThreadInfo<MapData> (callback, mapData));
  77.         }
  78.     }
  79.  
  80.     public void RequestMeshData(MapData mapData, int lod, Action<MeshData> callback) {
  81.         ThreadStart threadStart = delegate {
  82.             MeshDataThread (mapData, lod, callback);
  83.         };
  84.  
  85.         new Thread (threadStart).Start ();
  86.     }
  87.  
  88.     void MeshDataThread(MapData mapData, int lod, Action<MeshData> callback) {
  89.         MeshData meshData = MeshGenerator.GenerateTerrainMesh (mapData.heightMap, meshHeightMultiplier, meshHeightCurve, lod);
  90.         lock (meshDataThreadInfoQueue) {
  91.             meshDataThreadInfoQueue.Enqueue (new MapThreadInfo<MeshData> (callback, meshData));
  92.         }
  93.     }
  94.  
  95.     void Update() {
  96.         if (mapDataThreadInfoQueue.Count > 0) {
  97.             for (int i = 0; i < mapDataThreadInfoQueue.Count; i++) {
  98.                 MapThreadInfo<MapData> threadInfo = mapDataThreadInfoQueue.Dequeue ();
  99.                 threadInfo.callback (threadInfo.parameter);
  100.             }
  101.         }
  102.  
  103.         if (meshDataThreadInfoQueue.Count > 0) {
  104.             for (int i = 0; i < meshDataThreadInfoQueue.Count; i++) {
  105.                 MapThreadInfo<MeshData> threadInfo = meshDataThreadInfoQueue.Dequeue ();
  106.                 threadInfo.callback (threadInfo.parameter);
  107.             }
  108.         }
  109.     }
  110.  
  111.     MapData GenerateMapData(Vector2 centre) {
  112.  
  113.         GenerateFalloffMap ();
  114.  
  115.         float[,] noiseMap = Noise.GenerateNoiseMap (mapChunkSize + 2, mapChunkSize + 2, seed, noiseScale, octaves, persistance, lacunarity, centre + offset, normalizeMode);
  116.         Color[] colourMap = new Color[mapChunkSize * mapChunkSize];
  117.         for (int y = 0; y < mapChunkSize+2; y++) {
  118.             for (int x = 0; x < mapChunkSize+2; x++) {
  119.                 if (useFalloff) {
  120.                     noiseMap [x, y] = Mathf.Clamp01(noiseMap [x, y] - falloffMap [x, y]);
  121.                 }
  122.  
  123.                 if (x < mapChunkSize && y < mapChunkSize) {
  124.                     float currentHeight = noiseMap [x, y];
  125.                     for (int i = 0; i < regions.Length; i++) {
  126.                         if (currentHeight >= regions [i].height) {
  127.                             colourMap [y * mapChunkSize + x] = regions [i].colour;
  128.                         } else {
  129.                             break;
  130.                         }
  131.                     }
  132.                 }
  133.             }
  134.         }
  135.  
  136.  
  137.         return new MapData (noiseMap, colourMap);
  138.     }
  139.  
  140.     void OnValidate() {
  141.         if (lacunarity < 1) {
  142.             lacunarity = 1;
  143.         }
  144.         if (octaves < 0) {
  145.             octaves = 0;
  146.         }
  147.  
  148.         falloffMapGenerated = false;
  149.     }
  150.  
  151.     struct MapThreadInfo<T> {
  152.         public readonly Action<T> callback;
  153.         public readonly T parameter;
  154.  
  155.         public MapThreadInfo (Action<T> callback, T parameter)
  156.         {
  157.             this.callback = callback;
  158.             this.parameter = parameter;
  159.         }
  160.  
  161.     }
  162.  
  163. }
  164.  
  165. [System.Serializable]
  166. public struct TerrainType {
  167.     public string name;
  168.     public float height;
  169.     public Color colour;
  170. }
  171.  
  172. public struct MapData {
  173.     public readonly float[,] heightMap;
  174.     public readonly Color[] colourMap;
  175.  
  176.     public MapData (float[,] heightMap, Color[] colourMap)
  177.     {
  178.         this.heightMap = heightMap;
  179.         this.colourMap = colourMap;
  180.     }
  181. }
Advertisement
Add Comment
Please, Sign In to add comment