EnviroWorldAPI.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. #if WORLDAPI_PRESENT
  5. using WAPI;
  6. #endif
  7. #if WORLDAPI_PRESENT
  8. namespace Enviro
  9. {
  10. [ExecuteInEditMode]
  11. [AddComponentMenu("Enviro 3/Integrations/WAPI Integration")]
  12. public class EnviroWorldAPI : MonoBehaviour, IWorldApiChangeHandler
  13. {
  14. public enum GetSet
  15. {
  16. None,
  17. GetFromWAPI,
  18. SendToWAPI
  19. }
  20. public enum Get
  21. {
  22. None,
  23. GetFromWAPI
  24. }
  25. public enum Set
  26. {
  27. None,
  28. SendToWAPI
  29. }
  30. // Controls
  31. public GetSet snowPower;
  32. public GetSet wetnessPower;
  33. public GetSet fogPower;
  34. public GetSet temperature;
  35. //public float fogPowerMult = 1000f;
  36. //public Set windDirection;
  37. //public Set windSpeed;
  38. public GetSet seasons;
  39. public GetSet time;
  40. public GetSet cloudCover;
  41. public GetSet location;
  42. private List<EnviroWeatherType> weatherPresets = new List<EnviroWeatherType>();
  43. private List<EnviroWeatherType> clearWeatherPresets = new List<EnviroWeatherType>();
  44. private List<EnviroWeatherType> cloudyWeatherPresets = new List<EnviroWeatherType>();
  45. private List<EnviroWeatherType> rainWeatherPresets = new List<EnviroWeatherType>();
  46. private List<EnviroWeatherType> snowWeatherPresets = new List<EnviroWeatherType>();
  47. private float timeOfDayChached;
  48. void OnEnable()
  49. {
  50. ConnectToWorldAPI();
  51. }
  52. void OnDisable()
  53. {
  54. DisconnectFromWorldAPI();
  55. }
  56. void Start()
  57. {
  58. if (EnviroManager.instance == null)
  59. {
  60. Debug.LogWarning("Enviro 3 Manager not found!");
  61. return;
  62. }
  63. if(EnviroManager.instance.Time != null)
  64. timeOfDayChached = EnviroManager.instance.Time.GetTimeOfDay();
  65. if(EnviroManager.instance.Weather != null)
  66. {
  67. //Create Lists of weather presets
  68. for (int i = 0; i < EnviroManager.instance.Weather.Settings.weatherTypes.Count; i++)
  69. {
  70. weatherPresets.Add(EnviroManager.instance.Weather.Settings.weatherTypes[i]);
  71. }
  72. for (int i = 0; i < weatherPresets.Count; i++)
  73. {
  74. //Clear Weather List
  75. if (weatherPresets [i].cloudsOverride.coverageLayer1 <= -0.5)
  76. clearWeatherPresets.Add (weatherPresets [i]);
  77. //Cloudy Weather List
  78. if (weatherPresets [i].cloudsOverride.coverageLayer1 >= -0.5) {
  79. if (weatherPresets [i].environmentOverride.wetnessTarget == 0f && weatherPresets [i].environmentOverride.snowTarget == 0f)
  80. cloudyWeatherPresets.Add (weatherPresets [i]);
  81. }
  82. // Rainy Weather List
  83. if (weatherPresets [i].environmentOverride.wetnessTarget > 0f)
  84. rainWeatherPresets.Add (weatherPresets [i]);
  85. //Snowy Weather List
  86. if (weatherPresets [i].environmentOverride.snowTarget > 0f)
  87. snowWeatherPresets.Add (weatherPresets [i]);
  88. }
  89. }
  90. ConnectToWorldAPI();
  91. }
  92. void Update()
  93. {
  94. if (EnviroManager.instance == null)
  95. return;
  96. if (snowPower == GetSet.SendToWAPI)
  97. {
  98. if(EnviroManager.instance.Environment != null)
  99. WorldManager.Instance.Snow = new Vector4 (EnviroManager.instance.Environment.Settings.snowTarget, EnviroManager.instance.Environment.Settings.snow, WorldManager.Instance.SnowMinHeight, WorldManager.Instance.SnowAge);
  100. }
  101. if (wetnessPower == GetSet.SendToWAPI)
  102. {
  103. if(EnviroManager.instance.Environment != null)
  104. WorldManager.Instance.Rain = new Vector4 (EnviroManager.instance.Environment.Settings.wetnessTarget, EnviroManager.instance.Environment.Settings.wetness, WorldManager.Instance.RainMinHeight, WorldManager.Instance.RainMaxHeight);
  105. }
  106. if (fogPower == GetSet.SendToWAPI)
  107. {
  108. if(EnviroManager.instance.Fog != null)
  109. WorldManager.Instance.Fog = new Vector4 (EnviroManager.instance.Fog.Settings.fogDensity2, EnviroManager.instance.Fog.Settings.fogHeight2, EnviroManager.instance.Fog.Settings.fogDensity, EnviroManager.instance.Fog.Settings.fogHeight);
  110. }
  111. if (seasons == GetSet.SendToWAPI)
  112. {
  113. if(EnviroManager.instance.Time != null)
  114. WorldManager.Instance.Season = Mathf.Lerp(0f, 4f, EnviroManager.instance.Time.Settings.date.DayOfYear / 366);
  115. }
  116. if (time == GetSet.SendToWAPI)
  117. {
  118. if(EnviroManager.instance.Time != null)
  119. WorldManager.Instance.SetDecimalTime(EnviroManager.instance.Time.GetTimeOfDay());
  120. }
  121. if (temperature == GetSet.SendToWAPI)
  122. {
  123. if(EnviroManager.instance.Environment != null)
  124. WorldManager.Instance.Temperature = EnviroManager.instance.Environment.Settings.temperature;
  125. }
  126. if (location == GetSet.SendToWAPI)
  127. {
  128. if(EnviroManager.instance.Time != null)
  129. {
  130. WorldManager.Instance.Latitude = EnviroManager.instance.Time.Settings.latitude;
  131. WorldManager.Instance.Longitude = EnviroManager.instance.Time.Settings.longitude;
  132. }
  133. }
  134. if (cloudCover == GetSet.SendToWAPI)
  135. {
  136. if(EnviroManager.instance.VolumetricClouds != null)
  137. WorldManager.Instance.CloudPower = Mathf.Clamp01(EnviroManager.instance.VolumetricClouds.settingsLayer1.coverage + EnviroManager.instance.VolumetricClouds.settingsLayer2.coverage);
  138. else if (EnviroManager.instance.FlatClouds != null)
  139. WorldManager.Instance.CloudPower = Mathf.Clamp01(EnviroManager.instance.FlatClouds.settings.flatCloudsCoverage);
  140. }
  141. }
  142. void ConnectToWorldAPI()
  143. {
  144. WorldManager.Instance.AddListener(this);
  145. }
  146. void DisconnectFromWorldAPI()
  147. {
  148. WorldManager.Instance.RemoveListener(this);
  149. }
  150. /// <summary>
  151. /// Handle updates from world manager
  152. /// </summary>
  153. /// <param name="changeArgs">Change to time of day</param>
  154. public void OnWorldChanged(WorldChangeArgs changeArgs)
  155. {
  156. if (EnviroManager.instance == null)
  157. {
  158. return;
  159. }
  160. // Get Time from WAPI
  161. if (changeArgs.HasChanged(WorldConstants.WorldChangeEvents.GameTimeChanged) && time == GetSet.GetFromWAPI && EnviroManager.instance.Time != null)
  162. {
  163. float newTimeOfDay = (float) changeArgs.manager.GetTimeDecimal();
  164. if (newTimeOfDay != timeOfDayChached)
  165. {
  166. timeOfDayChached = newTimeOfDay;
  167. EnviroManager.instance.Time.SetTimeOfDay(newTimeOfDay);
  168. }
  169. }
  170. //Get Season from WAPI
  171. if (changeArgs.HasChanged(WorldConstants.WorldChangeEvents.SeasonChanged) && seasons == GetSet.GetFromWAPI && EnviroManager.instance.Environment != null)
  172. {
  173. if (WorldManager.Instance.Season < 1f)
  174. EnviroManager.instance.Environment.ChangeSeason(EnviroEnvironment.Seasons.Winter);
  175. else if (WorldManager.Instance.Season < 2f)
  176. EnviroManager.instance.Environment.ChangeSeason(EnviroEnvironment.Seasons.Spring);
  177. else if (WorldManager.Instance.Season < 3f)
  178. EnviroManager.instance.Environment.ChangeSeason(EnviroEnvironment.Seasons.Summer);
  179. else
  180. EnviroManager.instance.Environment.ChangeSeason(EnviroEnvironment.Seasons.Autumn);
  181. }
  182. // Set Lat/Lng from WAPI
  183. if (changeArgs.HasChanged(WorldConstants.WorldChangeEvents.LatLngChanged) && location == GetSet.GetFromWAPI && EnviroManager.instance.Time != null)
  184. {
  185. EnviroManager.instance.Time.Settings.latitude = WorldManager.Instance.Latitude;
  186. EnviroManager.instance.Time.Settings.longitude = WorldManager.Instance.Longitude;
  187. }
  188. // Set Distance and Height Fog from WAPI
  189. if (changeArgs.HasChanged(WorldConstants.WorldChangeEvents.FogChanged) && fogPower == GetSet.GetFromWAPI && EnviroManager.instance.Fog != null)
  190. {
  191. EnviroManager.instance.Fog.Settings.fogDensity = WorldManager.Instance.FogDistancePower;
  192. EnviroManager.instance.Fog.Settings.fogDensity2 = WorldManager.Instance.FogHeightPower;
  193. EnviroManager.instance.Fog.Settings.fogHeight = WorldManager.Instance.FogHeightMax;
  194. EnviroManager.instance.Fog.Settings.fogHeight2 = WorldManager.Instance.FogHeightMax;
  195. }
  196. // Set temparaute from WAPI
  197. if (changeArgs.HasChanged(WorldConstants.WorldChangeEvents.TempAndHumidityChanged) && temperature == GetSet.GetFromWAPI && EnviroManager.instance.Environment != null)
  198. {
  199. EnviroManager.instance.Environment.Settings.temperature = WorldManager.Instance.Temperature;
  200. }
  201. if (EnviroManager.instance.Weather == null)
  202. {
  203. // Cloud
  204. if (changeArgs.HasChanged(WorldConstants.WorldChangeEvents.CloudsChanged) && cloudCover == GetSet.GetFromWAPI)
  205. {
  206. if(EnviroManager.instance.VolumetricClouds != null)
  207. {
  208. EnviroManager.instance.VolumetricClouds.settingsLayer1.coverage = EnviroHelper.Remap(WorldManager.Instance.CloudPower,0f,1f,-1f,1f);
  209. }
  210. if(EnviroManager.instance.FlatClouds != null)
  211. {
  212. EnviroManager.instance.FlatClouds.settings.flatCloudsCoverage = WorldManager.Instance.CloudPower;
  213. }
  214. }
  215. //Rain
  216. if (changeArgs.HasChanged (WorldConstants.WorldChangeEvents.RainChanged) && wetnessPower == GetSet.GetFromWAPI)
  217. {
  218. if(EnviroManager.instance.VolumetricClouds != null)
  219. {
  220. EnviroManager.instance.VolumetricClouds.settingsLayer1.scatteringIntensity = 1.25f - WorldManager.Instance.RainPower;
  221. }
  222. if(EnviroManager.instance.Effects != null)
  223. {
  224. EnviroManager.instance.Effects.Settings.rain1Emission = WorldManager.Instance.RainPower;
  225. EnviroManager.instance.Effects.Settings.rain2Emission = WorldManager.Instance.RainPower;
  226. }
  227. if(EnviroManager.instance.Audio != null)
  228. {
  229. }
  230. }
  231. //Snow
  232. if (changeArgs.HasChanged (WorldConstants.WorldChangeEvents.SnowChanged) && snowPower == GetSet.GetFromWAPI)
  233. {
  234. if(EnviroManager.instance.Effects != null)
  235. {
  236. EnviroManager.instance.Effects.Settings.snow1Emission = WorldManager.Instance.SnowPower;
  237. EnviroManager.instance.Effects.Settings.snow1Emission = WorldManager.Instance.SnowPower;
  238. }
  239. if(EnviroManager.instance.Audio != null)
  240. {
  241. }
  242. }
  243. }
  244. else
  245. {
  246. if (changeArgs.HasChanged(WorldConstants.WorldChangeEvents.CloudsChanged) && cloudCover == GetSet.GetFromWAPI){
  247. ChangeWeatherOnCloudCoverChanged ();
  248. }
  249. //Rain
  250. if (changeArgs.HasChanged (WorldConstants.WorldChangeEvents.RainChanged) && wetnessPower == GetSet.GetFromWAPI) {
  251. ChangeWeatherOnRainChanged (WorldManager.Instance.RainPower,WorldManager.Instance.SnowPower);
  252. }
  253. //Snow
  254. if (changeArgs.HasChanged (WorldConstants.WorldChangeEvents.SnowChanged) && snowPower == GetSet.GetFromWAPI) {
  255. ChangeWeatherOnSnowChanged (WorldManager.Instance.RainPower,WorldManager.Instance.SnowPower);
  256. }
  257. }
  258. void ChangeWeatherOnCloudCoverChanged()
  259. {
  260. if (WorldManager.Instance.RainPower > 0.01f)
  261. return;
  262. if (WorldManager.Instance.SnowPower > 0.01f)
  263. return;
  264. float cloudCover = WorldManager.Instance.CloudPower;
  265. if (cloudCover <= 0.1f)
  266. {
  267. if (clearWeatherPresets.Count > 0 && EnviroManager.instance.Weather.targetWeatherType.name != clearWeatherPresets[0].name)
  268. EnviroManager.instance.Weather.ChangeWeather(clearWeatherPresets[0].name);
  269. }
  270. else if (cloudCover > 0.1f && cloudCover <= 0.3f)
  271. {
  272. if (cloudyWeatherPresets.Count > 0 && EnviroManager.instance.Weather.targetWeatherType.name != cloudyWeatherPresets[0].name)
  273. EnviroManager.instance.Weather.ChangeWeather(cloudyWeatherPresets[0].name);
  274. }
  275. else if (cloudCover > 0.3f && cloudCover <= 0.7f)
  276. {
  277. if (cloudyWeatherPresets.Count > 1 && EnviroManager.instance.Weather.targetWeatherType.name != cloudyWeatherPresets[1].name)
  278. EnviroManager.instance.Weather.ChangeWeather(cloudyWeatherPresets[1].name);
  279. }
  280. else if (cloudCover > 0.7f)
  281. {
  282. if (cloudyWeatherPresets.Count > 2 && EnviroManager.instance.Weather.targetWeatherType.name != cloudyWeatherPresets[2].name)
  283. EnviroManager.instance.Weather.ChangeWeather(cloudyWeatherPresets[2].name);
  284. }
  285. }
  286. void ChangeWeatherOnRainChanged(float r, float s)
  287. {
  288. if (r < s || r == 0f)
  289. {
  290. if (s > 0)
  291. ChangeWeatherOnSnowChanged(r, s);
  292. else
  293. ChangeWeatherOnCloudCoverChanged();
  294. return;
  295. }
  296. float rainPower = r;
  297. if (rainPower < 0.1f)
  298. {
  299. ChangeWeatherOnCloudCoverChanged();
  300. }
  301. else if (rainPower > 0.1f && rainPower <= 0.4f)
  302. {
  303. if (rainWeatherPresets.Count > 0 && EnviroManager.instance.Weather.targetWeatherType.name != rainWeatherPresets[0].name)
  304. EnviroManager.instance.Weather.ChangeWeather(rainWeatherPresets[0].name);
  305. }
  306. else if (rainPower > 0.4f && rainPower < 0.7f)
  307. {
  308. if (rainWeatherPresets.Count > 1 && EnviroManager.instance.Weather.targetWeatherType.name != rainWeatherPresets[1].name)
  309. EnviroManager.instance.Weather.ChangeWeather(rainWeatherPresets[1].name);
  310. }
  311. else if (rainPower > 0.7f)
  312. {
  313. if (rainWeatherPresets.Count > 2 && EnviroManager.instance.Weather.targetWeatherType.name != rainWeatherPresets[2].name)
  314. EnviroManager.instance.Weather.ChangeWeather(rainWeatherPresets[2].name);
  315. }
  316. }
  317. void ChangeWeatherOnSnowChanged(float r, float s)
  318. {
  319. if (s < r || s == 0f)
  320. {
  321. if (r > 0)
  322. ChangeWeatherOnRainChanged(r, s);
  323. else
  324. ChangeWeatherOnCloudCoverChanged();
  325. return;
  326. }
  327. float snowPower = s;
  328. if (snowPower <= 0.1f)
  329. {
  330. ChangeWeatherOnCloudCoverChanged();
  331. }
  332. else if (snowPower > 0.1f && snowPower <= 0.5f)
  333. {
  334. if (snowWeatherPresets.Count > 0 && EnviroManager.instance.Weather.targetWeatherType.name != snowWeatherPresets[0].name)
  335. EnviroManager.instance.Weather.ChangeWeather(snowWeatherPresets[0].name);
  336. }
  337. else if (snowPower > 0.5f)
  338. {
  339. if (snowWeatherPresets.Count > 1 && EnviroManager.instance.Weather.targetWeatherType.name != snowWeatherPresets[1].name)
  340. EnviroManager.instance.Weather.ChangeWeather(snowWeatherPresets[1].name);
  341. }
  342. }
  343. }
  344. }
  345. }
  346. #endif