RealWorldTerrainGenerateGaiaStampPhase.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /* INFINITY CODE */
  2. /* https://infinity-code.com */
  3. #if GAIA_PRESENT || GAIA_PRO_PRESENT || GAIA_2_PRESENT
  4. using System;
  5. using System.IO;
  6. using System.Reflection;
  7. using Gaia;
  8. using InfinityCode.RealWorldTerrain.Generators;
  9. using UnityEditor;
  10. using UnityEngine;
  11. using Object = UnityEngine.Object;
  12. namespace InfinityCode.RealWorldTerrain.Phases
  13. {
  14. public class RealWorldTerrainGenerateGaiaStampPhase : RealWorldTerrainPhase
  15. {
  16. private Scanner scanner;
  17. private Stamper stamper;
  18. public override string title
  19. {
  20. get { return "Generate Gaia Stamp..."; }
  21. }
  22. public override void Enter()
  23. {
  24. try
  25. {
  26. RealWorldTerrainGaiaStampGenerator.Generate();
  27. }
  28. catch
  29. {
  30. phaseComplete = true;
  31. }
  32. if (!phaseComplete) return;
  33. #if !GAIA_PRO_PRESENT && !GAIA_2_PRESENT
  34. string basesDir = "Assets/Gaia/Stamps/Bases/";
  35. if (!Directory.Exists(basesDir)) Directory.CreateDirectory(basesDir);
  36. string basesDataDir = basesDir + "Data/";
  37. if (!Directory.Exists(basesDataDir)) Directory.CreateDirectory(basesDataDir);
  38. #endif
  39. GaiaConstants.RawBitDepth bd = GaiaConstants.RawBitDepth.Sixteen;
  40. int resolution = 0;
  41. scanner.LoadRawFile(RealWorldTerrainGaiaStampGenerator.fullFilename, GaiaConstants.RawByteOrder.IBM, ref bd, ref resolution);
  42. #if !GAIA_PRO_PRESENT && !GAIA_2_PRESENT
  43. scanner.m_featureType = GaiaConstants.FeatureType.Bases;
  44. #else
  45. scanner.m_exportFolder = GaiaDirectories.GetScannerExportDirectory();
  46. scanner.m_exportFileName = RealWorldTerrainGaiaStampGenerator.shortFilename;
  47. scanner.m_baseLevel = 0;
  48. #endif
  49. scanner.SaveScan();
  50. AssetDatabase.Refresh();
  51. Selection.activeGameObject = stamper.gameObject;
  52. #if !GAIA_PRO_PRESENT && !GAIA_2_PRESENT
  53. stamper.LoadStamp(basesDir + RealWorldTerrainGaiaStampGenerator.shortFilename + ".jpg");
  54. #else
  55. string maskFilename = GaiaDirectories.GetScannerExportDirectory() + "/" + RealWorldTerrainGaiaStampGenerator.shortFilename + ".exr";
  56. Texture2D maskTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(maskFilename);
  57. stamper.m_settings.m_imageMasks = new[]
  58. {
  59. new ImageMask
  60. {
  61. ImageMaskTexture = maskTexture
  62. }
  63. };
  64. stamper.m_seaLevel = 0;
  65. float maxElevation = RealWorldTerrainUtils.MAX_ELEVATION;
  66. float minElevation = -RealWorldTerrainUtils.MAX_ELEVATION;
  67. if (prefs.elevationRange == RealWorldTerrainElevationRange.autoDetect)
  68. {
  69. double maxEl, minEl;
  70. RealWorldTerrainElevationGenerator.GetElevationRange(out minEl, out maxEl);
  71. maxElevation = (float)maxEl + prefs.autoDetectElevationOffset.y;
  72. minElevation = (float)minEl - prefs.autoDetectElevationOffset.x;
  73. }
  74. else if (prefs.elevationRange == RealWorldTerrainElevationRange.fixedValue)
  75. {
  76. maxElevation = prefs.fixedMaxElevation;
  77. minElevation = prefs.fixedMinElevation;
  78. }
  79. float sY = (maxElevation - minElevation) / 1000;
  80. stamper.transform.localScale = new Vector3(100, sY, 100);
  81. #endif
  82. Complete();
  83. }
  84. public override void Finish()
  85. {
  86. if (scanner != null && scanner.gameObject != null) Object.DestroyImmediate(scanner.gameObject);
  87. scanner = null;
  88. stamper = null;
  89. }
  90. private static string GetAssetPath(string name)
  91. {
  92. string[] assets = AssetDatabase.FindAssets(name, null);
  93. if (assets.Length > 0)
  94. {
  95. return AssetDatabase.GUIDToAssetPath(assets[0]);
  96. }
  97. return null;
  98. }
  99. public override void Start()
  100. {
  101. try
  102. {
  103. GaiaSessionManager.GetSessionManager();
  104. #if !GAIA_PRO_PRESENT && !GAIA_2_PRESENT
  105. GaiaSettings m_settings = (GaiaSettings)Gaia.Utils.GetAssetScriptableObject("GaiaSettings");
  106. #else
  107. GaiaSettings m_settings = (GaiaSettings)GaiaUtils.GetAssetScriptableObject("GaiaSettings");
  108. #endif
  109. if (m_settings == null) m_settings = GaiaManagerEditor.CreateSettingsAsset();
  110. GaiaDefaults m_defaults = m_settings.m_currentDefaults;
  111. if (TerrainHelper.GetActiveTerrainCount() == 0)
  112. {
  113. #if !GAIA_PRO_PRESENT && !GAIA_2_PRESENT
  114. GaiaResource m_resources = m_settings.m_currentResources;
  115. m_defaults.CreateTerrain(m_resources);
  116. #else
  117. WorldCreationSettings worldCreationSettings = ScriptableObject.CreateInstance<WorldCreationSettings>();
  118. worldCreationSettings.m_xTiles = m_settings.m_tilesX;
  119. worldCreationSettings.m_zTiles = m_settings.m_tilesZ;
  120. worldCreationSettings.m_tileSize = m_settings.m_currentDefaults.m_terrainSize;
  121. worldCreationSettings.m_tileHeight = m_settings.m_tilesX * worldCreationSettings.m_tileSize;
  122. worldCreationSettings.m_createInScene = m_settings.m_createTerrainScenes;
  123. worldCreationSettings.m_autoUnloadScenes = m_settings.m_unloadTerrainScenes;
  124. worldCreationSettings.m_applyFloatingPointFix = m_settings.m_floatingPointFix;
  125. Type gsm = typeof(GaiaSessionManager);
  126. MethodInfo createWorldMethod = gsm.GetMethod("CreateWorld", BindingFlags.Static | BindingFlags.Public, null, new[]{typeof(WorldCreationSettings), typeof(bool) }, null);
  127. if (createWorldMethod != null)
  128. {
  129. createWorldMethod.Invoke(null, new object[] { worldCreationSettings, true });
  130. }
  131. else
  132. {
  133. createWorldMethod = gsm.GetMethod("CreateOrUpdateWorld", BindingFlags.Static | BindingFlags.Public, null, new[] { typeof(WorldCreationSettings), typeof(bool), typeof(bool) }, null);
  134. if (createWorldMethod != null)
  135. {
  136. createWorldMethod.Invoke(null, new object[] { worldCreationSettings, true, false });
  137. }
  138. else
  139. {
  140. phaseComplete = true;
  141. NextPhase();
  142. return;
  143. }
  144. }
  145. #if GAIA_PRO_PRESENT
  146. WorldOriginEditor.m_sessionManagerExits = true;
  147. #endif
  148. #endif
  149. }
  150. GameObject gaiaObj = GameObject.Find("Gaia");
  151. if (gaiaObj == null) gaiaObj = GameObject.Find("Gaia Tools");
  152. if (gaiaObj == null) gaiaObj = new GameObject("Gaia");
  153. GameObject stamperObj = GameObject.Find("Stamper");
  154. if (stamperObj == null)
  155. {
  156. stamperObj = new GameObject("Stamper");
  157. stamperObj.transform.parent = gaiaObj.transform;
  158. stamper = stamperObj.AddComponent<Stamper>();
  159. stamper.FitToTerrain();
  160. #if !GAIA_PRO_PRESENT && !GAIA_2_PRESENT
  161. stamper.m_resources = m_resources;
  162. stamperObj.transform.position = new Vector3(stamper.m_x, stamper.m_y, stamper.m_z);
  163. #endif
  164. }
  165. else stamper = stamperObj.GetComponent<Stamper>();
  166. GameObject scannerObj = GameObject.Find("Scanner");
  167. if (scannerObj == null)
  168. {
  169. scannerObj = new GameObject("Scanner");
  170. scannerObj.transform.parent = gaiaObj.transform;
  171. scannerObj.transform.position = TerrainHelper.GetActiveTerrainCenter(false);
  172. scanner = scannerObj.AddComponent<Scanner>();
  173. string matPath = GetAssetPath("GaiaScannerMaterial");
  174. if (!string.IsNullOrEmpty(matPath)) scanner.m_previewMaterial = AssetDatabase.LoadAssetAtPath<Material>(matPath);
  175. }
  176. else scanner = scannerObj.GetComponent<Scanner>();
  177. }
  178. catch (Exception e)
  179. {
  180. Debug.LogError(e.Message + "\n" + e.StackTrace);
  181. phaseComplete = true;
  182. NextPhase();
  183. }
  184. }
  185. }
  186. }
  187. #endif