Advertisement
Guest User

Untitled

a guest
Oct 26th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.57 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.  
  10. // Þetta er hérna til þess að við getum valið hvað við viljum sjá inní Unity
  11. // Þetta leyfir okkur að sjá svarthvítu myndirnar sem að heimurinn reiknast útfrá
  12. public enum DrawMode
  13. {
  14. NoiseMap,
  15. ColorMap,
  16. Mesh,
  17. FalloffMap,
  18. HeatMap}
  19. ;
  20.  
  21. // Hérna geymist í hvaða drawMode við erum með stilt á
  22. public DrawMode drawMode;
  23.  
  24. // Hérna getum við stillt hvort að við erum í Local eða Global
  25. // Normailzation Mode, Þetta hefur áhrif á þegar að mismunandi "reitir"
  26. // af heiminum snertast, ef við erum í global þá reiknast betur útúr þessu fyrir
  27. // marga reiti, en local er gott ef þú ert bara með einn reit
  28. public Noise.NormalizeMode normalizeMode;
  29.  
  30. // Viðjum við hafa flata skyggingu ?? Já við viljum það þannig að þetta ætti alltaf að vera stillt á
  31. public bool useFlatShading;
  32.  
  33. // Range er hérna til að Unity gefi okkur slider til að við getum "on the fly" breytt detail levelum
  34. // á terrain'inum inní editornum, þetta hefur engin áhrif þegar að leikurinn er "live"
  35. [Range (0, 6)]
  36. public int editorPreviewLOD;
  37.  
  38. // Stilling fyrir hversu langt er á milli fjalla "basically"
  39. public float noiseScale;
  40.  
  41. // Þetta er allt dót sem að er til að reikna hægðir og lægðir í heiminum
  42. public int octaves;
  43. [Range (0, 1)]
  44. public float persistance;
  45. public float lacunarity;
  46.  
  47. // hér er seedið, það er stillt í Unity og ætti ekki að vera breytt, á að vera "80194"
  48. public int seed;
  49.  
  50. // Offset á þennan chunk, notað til að við fáum ekki sama "height map" á alla reiti
  51. public Vector2 offset;
  52.  
  53. // Þetta er notað til að "takmarka stærð heimsins", Falloff mappið lækkar landslagið eftir að þu ert
  54. // kominn lengra út á það og endar þá með að það sé svo bara sjór allt í kring
  55. public bool useFalloff;
  56.  
  57. // Þetta er til að margfalda hæðartöluna svo að landslagið fái alvöru hæð, annars væru fjöllin bara
  58. // einhverjar þúfur
  59. public float meshHeightMultiplier;
  60. public AnimationCurve meshHeightCurve;
  61.  
  62. // Stilling fyrir Unity Editorinn og leyfir okkur að auto updeita það sem að renderast í
  63. // editornum, gott ef við viljum sjá stillingar hafa áhrif á heiminn án þess að þurfa að
  64. // ýta á "Generate" takkan til að sjá þetta
  65. public bool autoUpdate;
  66.  
  67. // Regions er listi af "ef hæðin á þessum punkti er þessi þá er jörðin svona á litin"
  68. // svona er vatn blátt, fjöll grá og grasið grænt, eins og er, þetta mun breytast
  69. public TerrainType[] regions;
  70.  
  71. // Þetta er static instance af þessum classa, bara svo við getum sótt upplýsingar í hann
  72. // út öðrum clössum
  73. static MapGenerator instance;
  74.  
  75. // Biome Systemið, þetta er ekki full klárað og á efitr að breytast dass
  76. public bool useBiomeSystem;
  77. public BiomeGenerator biomeGenerator = new BiomeGenerator ();
  78. public MapData heatMap;
  79.  
  80. // Þetta er Array sem að geymir upplýsingar um falloff mappið
  81. float[,] falloffMap;
  82.  
  83. // Þessir hérna tveir eru til þess að sækja map uplýsingar og reikna það á öðrum kjarna
  84. // á örgjafanum
  85. Queue<MapThreadInfo<MapData>> mapDataThreadInfoQueue = new Queue<MapThreadInfo<MapData>> ();
  86. Queue<MapThreadInfo<MeshData>> meshDataThreadInfoQueue = new Queue<MapThreadInfo<MeshData>> ();
  87.  
  88. // Awake er skipun frá Unity og ég nota hana hér til að búa til falloff mappið
  89. void Awake ()
  90. {
  91. falloffMap = FalloffGenerator.generateFalloffMap (mapChunkSize);
  92. }
  93.  
  94.  
  95. // hérna færðu töluna um hversu margir punktar eru í "einum reit" af heimunum
  96. public static int mapChunkSize {
  97. get {
  98. setInstance ();
  99. if (instance.useFlatShading)
  100. return 95;
  101. else
  102. return 239;
  103. }
  104. }
  105.  
  106. // Þessi skipun leyfir okkur að sjá hitt og þetta í editornum
  107. public void drawMapInEditor ()
  108. {
  109.  
  110. setInstance ();
  111. MapData mapData = generateMapData (Vector2.zero);
  112. MapDisplay display = FindObjectOfType<MapDisplay> ();
  113.  
  114. heatMap = biomeGenerator.generateHeatMapData (Vector2.zero, instance);
  115.  
  116. if (drawMode == DrawMode.NoiseMap)
  117. display.drawTexture (TextureGenerator.textureFromHeightMap (mapData.heightMap));
  118. else if (drawMode == DrawMode.ColorMap)
  119. display.drawTexture (TextureGenerator.textureFromColorMap (mapData.colorMap, mapChunkSize, mapChunkSize));
  120. else if (drawMode == DrawMode.Mesh)
  121. display.drawMesh (MeshGenerator.generateTerrainMesh (mapData.heightMap, heatMap.heightMap, meshHeightMultiplier, meshHeightCurve, editorPreviewLOD, useFlatShading), TextureGenerator.textureFromColorMap (mapData.colorMap, mapChunkSize, mapChunkSize));
  122. else if (drawMode == DrawMode.FalloffMap)
  123. display.drawTexture (TextureGenerator.textureFromHeightMap (FalloffGenerator.generateFalloffMap (mapChunkSize)));
  124. else if (drawMode == DrawMode.HeatMap)
  125. display.drawTexture (TextureGenerator.textureFromHeightMap (heatMap.heightMap));
  126. }
  127.  
  128. // þetta er hér til að vera viss um að "instancið" af þessum classa sé ekki "null"
  129. static void setInstance ()
  130. {
  131. if (instance == null)
  132. instance = FindObjectOfType<MapGenerator> ();
  133. }
  134.  
  135. // þetta er multy tasking dót, ekki pæla of mikið í þessu
  136. public void requestMapData (Vector2 center, Action<MapData> callback)
  137. {
  138. ThreadStart threadStart = delegate {
  139. MapDataThread (center, callback);
  140. };
  141.  
  142. new Thread (threadStart).Start ();
  143. }
  144.  
  145. void MapDataThread (Vector2 center, Action<MapData> callback)
  146. {
  147. MapData mapData = generateMapData (center);
  148. lock (mapDataThreadInfoQueue) {
  149. mapDataThreadInfoQueue.Enqueue (new MapThreadInfo<MapData> (callback, mapData));
  150. }
  151. }
  152.  
  153. public void requestMeshData (MapData mapData, int lod, Action<MeshData> callback)
  154. {
  155. ThreadStart threadStart = delegate {
  156. MeshDataThread (mapData, lod, callback);
  157. };
  158. new Thread (threadStart).Start ();
  159. }
  160.  
  161. void MeshDataThread (MapData mapData, int lod, Action<MeshData> callback)
  162. {
  163. MeshData meshData = MeshGenerator.generateTerrainMesh (mapData.heightMap, heatMap.heightMap, meshHeightMultiplier, meshHeightCurve, lod, useFlatShading);
  164. lock (meshDataThreadInfoQueue) {
  165. meshDataThreadInfoQueue.Enqueue (new MapThreadInfo<MeshData> (callback, meshData));
  166. }
  167. }
  168.  
  169.  
  170. // þetta er skipun frá unity sem að sér um að senda update áður en að hver einasti frame er búin til
  171. // þessi skipun er semsagt kölluð jafn oft og FPS'ið þitt á sek, semsagt öruglega yfir 100 sinnum á sec
  172. // hér erum við í þessu tilfelli bara að vera viss um að ef það þarf að reikna eitthvað þá er verið að
  173. // láta hinn kjarnan af örgjafanum sjá um að reikna
  174. void Update ()
  175. {
  176. if (mapDataThreadInfoQueue.Count > 0) {
  177. for (int i = 0; i < mapDataThreadInfoQueue.Count; i++) {
  178. MapThreadInfo<MapData> threadInfo = mapDataThreadInfoQueue.Dequeue ();
  179. threadInfo.callback (threadInfo.parameter);
  180. }
  181. }
  182.  
  183. if (meshDataThreadInfoQueue.Count > 0) {
  184. for (int i = 0; i < meshDataThreadInfoQueue.Count; i++) {
  185. MapThreadInfo<MeshData> threadInfo = meshDataThreadInfoQueue.Dequeue ();
  186. threadInfo.callback (threadInfo.parameter);
  187. }
  188. }
  189. }
  190.  
  191. // Hér gerist smá af töfrunum en þetta er það sem að setur saman allar upplýsingar um mappið svo það sé bara hægt að skila því og GO !!
  192. MapData generateMapData (Vector2 center)
  193. {
  194. float[,] noiseMap = Noise.generateNoiseMap (mapChunkSize + 2, mapChunkSize + 2, seed, noiseScale, octaves, persistance, lacunarity, center + offset, normalizeMode);
  195.  
  196. heatMap = biomeGenerator.generateHeatMapData (center, instance);
  197.  
  198. Color[] colorMap = new Color[mapChunkSize * mapChunkSize];
  199. for (int y = 0; y < mapChunkSize; y++) {
  200. for (int x = 0; x < mapChunkSize; x++) {
  201. if (useFalloff) {
  202. noiseMap [x, y] = Mathf.Clamp01 (noiseMap [x, y] - falloffMap [x, y]);
  203. }
  204. float currentHeight = noiseMap [x, y];
  205. for (int i = 0; i < regions.Length; i++) {
  206. if (currentHeight >= regions [i].height) {
  207. Color color = regions [i].color;
  208. if (useBiomeSystem) {
  209. color.r += heatMap.heightMap [x, y] / 5;
  210. color.g += heatMap.heightMap [x, y] / 5;
  211. color.b += heatMap.heightMap [x, y] / 5;
  212. }
  213. colorMap [y * mapChunkSize + x] = color;
  214. } else {
  215. break;
  216. }
  217. }
  218. }
  219. }
  220.  
  221. return new MapData (noiseMap, colorMap);
  222. }
  223.  
  224. // Skipun í Unity sem að leyfir okkur að tékka stillingar sem var breytt í editornum og þannig að ef sumar tölur
  225. // meiga ekki vera minni en 1 eða 0 þá setjum við þær í 0 ef þú setur þessar neðar
  226. void OnValidate ()
  227. {
  228. if (lacunarity < 1)
  229. lacunarity = 1;
  230. if (octaves < 0)
  231. octaves = 0;
  232.  
  233. falloffMap = FalloffGenerator.generateFalloffMap (mapChunkSize);
  234. }
  235.  
  236. struct MapThreadInfo<T>
  237. {
  238. public readonly Action<T> callback;
  239. public readonly T parameter;
  240.  
  241. public MapThreadInfo (Action<T> callback, T parameter)
  242. {
  243. this.callback = callback;
  244. this.parameter = parameter;
  245. }
  246. }
  247.  
  248. }
  249.  
  250.  
  251. // Þetta kemur upp í Unity undir "Regions" og þar er hægt að stilla frá þessari hæð að næstu þá er jörðin svona á litin
  252. [System.Serializable]
  253. public struct TerrainType
  254. {
  255. public string name;
  256. public float height;
  257. public Color color;
  258. }
  259.  
  260.  
  261. // þetta er bara hlutur til að geima mappið í, bara fyrir þægindiß
  262. public struct MapData
  263. {
  264. public readonly float[,] heightMap;
  265. public readonly Color[] colorMap;
  266.  
  267. public MapData (float[,] heightMap, Color[] colorMap)
  268. {
  269. this.heightMap = heightMap;
  270. this.colorMap = colorMap;
  271. }
  272.  
  273. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement