RealWorldTerrainFinishPhase.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /* INFINITY CODE */
  2. /* https://infinity-code.com */
  3. using System;
  4. using InfinityCode.RealWorldTerrain.Generators;
  5. using InfinityCode.RealWorldTerrain.Windows;
  6. using UnityEditor;
  7. using UnityEngine;
  8. using Object = UnityEngine.Object;
  9. namespace InfinityCode.RealWorldTerrain.Phases
  10. {
  11. public class RealWorldTerrainFinishPhase : RealWorldTerrainPhase
  12. {
  13. public override string title
  14. {
  15. get { return "Finish..."; }
  16. }
  17. private static void ApplyRTPTextures()
  18. {
  19. #if RTP
  20. if ((RealWorldTerrainWindow.generateType != RealWorldTerrainGenerateType.full && RealWorldTerrainWindow.generateType != RealWorldTerrainGenerateType.texture) ||
  21. prefs.resultType != RealWorldTerrainResultType.terrain ||
  22. !prefs.generateTextures)
  23. {
  24. return;
  25. }
  26. if (prefs.textureResultType != RealWorldTerrainTextureResultType.regularTexture) return;
  27. ReliefTerrain reliefTerrain = terrains[0, 0].GetComponent<ReliefTerrain>();
  28. ReliefTerrainGlobalSettingsHolder settingsHolder = reliefTerrain.globalSettingsHolder;
  29. settingsHolder.numLayers = 4;
  30. settingsHolder.splats = new Texture2D[4];
  31. settingsHolder.Bumps = new Texture2D[4];
  32. settingsHolder.Heights = new Texture2D[4];
  33. for (int i = 0; i < 4; i++)
  34. {
  35. settingsHolder.splats[i] = RealWorldTerrainTextureGenerator.rtpTextures[i * 3];
  36. settingsHolder.Heights[i] = RealWorldTerrainTextureGenerator.rtpTextures[i * 3 + 1];
  37. settingsHolder.Bumps[i] = RealWorldTerrainTextureGenerator.rtpTextures[i * 3 + 2];
  38. }
  39. settingsHolder.GlobalColorMapBlendValues = new Vector3(1, 1, 1);
  40. settingsHolder._GlobalColorMapNearMIP = 1;
  41. settingsHolder.GlobalColorMapSaturation = 1;
  42. settingsHolder.GlobalColorMapSaturationFar = 1;
  43. settingsHolder.GlobalColorMapBrightness = 1;
  44. settingsHolder.GlobalColorMapBrightnessFar = 1;
  45. foreach (RealWorldTerrainItem item in terrains)
  46. {
  47. #if !UNITY_2020_1_OR_NEWER
  48. item.terrain.materialType = Terrain.MaterialType.Custom;
  49. #endif
  50. item.GetComponent<ReliefTerrain>().RefreshTextures();
  51. }
  52. settingsHolder.Refresh();
  53. #endif
  54. }
  55. public override void Complete()
  56. {
  57. phaseProgress = 0;
  58. phaseComplete = false;
  59. index = 0;
  60. }
  61. public override void Enter()
  62. {
  63. ApplyRTPTextures();
  64. GeneratePOI();
  65. if (prefs.resultType == RealWorldTerrainResultType.terrain)
  66. {
  67. if (terrainCount > 1) GenerateNeighbors();
  68. foreach (RealWorldTerrainItem item in terrains) item.terrain.Flush();
  69. }
  70. else if (RealWorldTerrainWindow.generateType == RealWorldTerrainGenerateType.terrain &&
  71. prefs.resultType == RealWorldTerrainResultType.mesh)
  72. {
  73. foreach (RealWorldTerrainItem item in terrains)
  74. {
  75. Texture2D texture = item["texture"] as Texture2D;
  76. if (texture != null)
  77. {
  78. item.texture = texture;
  79. item["texture"] = null;
  80. }
  81. }
  82. }
  83. if (RealWorldTerrainWindow.generateType == RealWorldTerrainGenerateType.texture &&
  84. RealWorldTerrainWindow.generateTarget is RealWorldTerrainItem)
  85. {
  86. ((RealWorldTerrainItem)RealWorldTerrainWindow.generateTarget).needUpdate = true;
  87. }
  88. if (terrains != null)
  89. {
  90. foreach (RealWorldTerrainItem item in terrains)
  91. {
  92. item.ClearCustomFields();
  93. }
  94. }
  95. if (RealWorldTerrainWindow.container != null) EditorGUIUtility.PingObject(RealWorldTerrainWindow.container);
  96. if (RealWorldTerrainWindow.OnCaptureCompleted != null) RealWorldTerrainWindow.OnCaptureCompleted();
  97. RealWorldTerrainWindow.Dispose();
  98. Complete();
  99. }
  100. private void GenerateNeighbors()
  101. {
  102. for (int x = 0; x < prefs.terrainCount.x; x++)
  103. {
  104. for (int y = 0; y < prefs.terrainCount.y; y++)
  105. {
  106. Terrain bottom = y > 0 ? terrains[x, y - 1].terrain : null;
  107. Terrain top = y < prefs.terrainCount.y - 1 ? terrains[x, y + 1].terrain : null;
  108. Terrain left = x > 0 ? terrains[x - 1, y].terrain : null;
  109. Terrain right = x < prefs.terrainCount.x - 1 ? terrains[x + 1, y].terrain : null;
  110. terrains[x, y].terrain.SetNeighbors(left, top, right, bottom);
  111. }
  112. }
  113. }
  114. private static void GeneratePOI()
  115. {
  116. if (RealWorldTerrainWindow.generateType != RealWorldTerrainGenerateType.full || prefs.POI == null || prefs.POI.Count == 0) return;
  117. GameObject poiContainer = new GameObject("POI");
  118. poiContainer.transform.parent = RealWorldTerrainWindow.container.transform;
  119. foreach (RealWorldTerrainPOI poi in prefs.POI)
  120. {
  121. Vector3 pos;
  122. bool success;
  123. if (Math.Abs(poi.altitude) < float.Epsilon) pos = RealWorldTerrainEditorUtils.CoordsToWorldWithElevation(poi.x, poi.y, poi.altitude, RealWorldTerrainWindow.container, Vector3.zero, out success);
  124. else RealWorldTerrainWindow.container.GetWorldPosition(poi.x, poi.y, poi.altitude, out pos);
  125. GameObject poiGO;
  126. if (poi.prefab == null) poiGO = GameObject.CreatePrimitive(PrimitiveType.Cube);
  127. else poiGO = Object.Instantiate(poi.prefab);
  128. poiGO.AddComponent<RealWorldTerrainPOIItem>().SetPrefs(poi);
  129. poiGO.name = poi.title;
  130. poiGO.transform.parent = poiContainer.transform;
  131. poiGO.transform.position = pos;
  132. if (poi.prefab == null) poiGO.GetComponent<Renderer>().sharedMaterial.color = Color.red;
  133. }
  134. }
  135. }
  136. }