EnviroLightingModule.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using System;
  5. namespace Enviro
  6. {
  7. [Serializable]
  8. public class EnviroLighting
  9. {
  10. // DirectLighting
  11. public enum LightingMode
  12. {
  13. Single,
  14. Dual
  15. };
  16. public LightingMode lightingMode;
  17. public bool setDirectLighting = true;
  18. public AnimationCurve sunIntensityCurve;
  19. public AnimationCurve moonIntensityCurve;
  20. public Gradient sunColorGradient;
  21. public Gradient moonColorGradient;
  22. public AnimationCurve sunIntensityCurveHDRP = new AnimationCurve();
  23. public AnimationCurve moonIntensityCurveHDRP = new AnimationCurve();
  24. public AnimationCurve lightColorTemperatureHDRP = new AnimationCurve();
  25. [GradientUsageAttribute(true)]
  26. public Gradient lightColorTintHDRP;
  27. [GradientUsageAttribute(true)]
  28. public Gradient ambientColorTintHDRP;
  29. public bool controlExposure = true;
  30. public AnimationCurve sceneExposure = new AnimationCurve();
  31. public bool controlIndirectLighting = true;
  32. public AnimationCurve diffuseIndirectIntensity = new AnimationCurve();
  33. public AnimationCurve reflectionIndirectIntensity = new AnimationCurve();
  34. [Range(0f,2f)]
  35. public float directLightIntensityModifier = 1f;
  36. //Ambient Lighting
  37. public bool setAmbientLighting = true;
  38. public UnityEngine.Rendering.AmbientMode ambientMode;
  39. [GradientUsage(true)]
  40. public Gradient ambientSkyColorGradient;
  41. [GradientUsage(true)]
  42. public Gradient ambientEquatorColorGradient;
  43. [GradientUsage(true)]
  44. public Gradient ambientGroundColorGradient;
  45. public AnimationCurve ambientIntensityCurve;
  46. [Range(0f,2f)]
  47. public float ambientIntensityModifier = 1f;
  48. //Reflections
  49. public enum GlobalReflectionResolution
  50. {
  51. R16,
  52. R32,
  53. R64,
  54. R128,
  55. R256,
  56. R512,
  57. R1024,
  58. R2048
  59. }
  60. [Tooltip("Enable/disable enviro reflection probe..")]
  61. public bool updateReflectionProbe = true;
  62. [Tooltip("Enable/disable if enviro reflection probe should render in custom mode to support clouds and other Enviro effects.")]
  63. public bool globalReflectionCustomRendering = true;
  64. [Tooltip("Enable/disable if enviro reflection probe should render with fog.")]
  65. public bool globalReflectionUseFog = false;
  66. [Tooltip("Set if enviro reflection probe should update faces individual on different frames.")]
  67. public bool globalReflectionTimeSlicing = true;
  68. [Tooltip("Enable/disable enviro reflection probe updates based on gametime changes..")]
  69. public bool globalReflectionsUpdateOnGameTime = true;
  70. [Tooltip("Enable/disable enviro reflection probe updates based on transform position changes..")]
  71. public bool globalReflectionsUpdateOnPosition = true;
  72. [Tooltip("Reflection probe intensity.")]
  73. [Range(0f, 2f)]
  74. public float globalReflectionsIntensity = 1.0f;
  75. [Tooltip("Reflection probe update rate based on game time.")]
  76. public float globalReflectionsTimeTreshold = 0.025f;
  77. [Tooltip("Reflection probe update rate based on camera position.")]
  78. public float globalReflectionsPositionTreshold = 0.25f;
  79. [Tooltip("Reflection probe scale. Increase that one to increase the area where reflection probe will influence your scene.")]
  80. [Range(10f, 10000f)]
  81. public float globalReflectionsScale = 1f;
  82. [Tooltip("Reflection probe resolution.")]
  83. public GlobalReflectionResolution globalReflectionResolution = GlobalReflectionResolution.R256;
  84. [Tooltip("Reflection probe rendered Layers.")]
  85. public LayerMask globalReflectionLayers;
  86. [Tooltip("Enable this option to update the default reflection with global reflection probes cubemap. This can be needed for material that might not support direct reflection probes. (Instanced Indirect Rendering)")]
  87. public bool updateDefaultEnvironmentReflections = true;
  88. [Tooltip("Reflection cubemap used for default scene sky reflections.")]
  89. public Cubemap defaultSkyReflectionTex;
  90. }
  91. [Serializable]
  92. [ExecuteInEditMode]
  93. public class EnviroLightingModule : EnviroModule
  94. {
  95. public Enviro.EnviroLighting Settings;
  96. public EnviroLightingModule preset;
  97. private float lastAmbientSkyboxUpdate;
  98. public float lastReflectionUpdate;
  99. public Vector3 lastReflectionUpdatePos;
  100. //Inspector
  101. public bool showDirectLightingControls;
  102. public bool showAmbientLightingControls;
  103. public bool showReflectionControls;
  104. #if ENVIRO_HDRP
  105. public UnityEngine.Rendering.HighDefinition.HDAdditionalLightData directionalLightHDRP;
  106. public UnityEngine.Rendering.HighDefinition.HDAdditionalLightData additionalLightHDRP;
  107. public UnityEngine.Rendering.HighDefinition.Exposure exposureHDRP;
  108. public UnityEngine.Rendering.HighDefinition.IndirectLightingController indirectLightingHDRP;
  109. #endif
  110. public override void Enable ()
  111. {
  112. Setup();
  113. // Update global reflections once on enable.
  114. if(Settings.updateReflectionProbe && EnviroManager.instance.Objects.globalReflectionProbe != null)
  115. {
  116. EnviroManager.instance.Objects.globalReflectionProbe.RefreshReflection(false);
  117. UpdateDefaultReflection(EnviroManager.instance.Objects.globalReflectionProbe, false);
  118. }
  119. }
  120. public override void Disable ()
  121. {
  122. Cleanup();
  123. }
  124. //Applies changes when you switch the lighting mode.
  125. public void ApplyLightingChanges ()
  126. {
  127. Cleanup();
  128. Setup();
  129. }
  130. private void Setup()
  131. {
  132. if(EnviroManager.instance.Objects.directionalLight == null)
  133. {
  134. GameObject newLight = new GameObject();
  135. if(Settings.lightingMode == EnviroLighting.LightingMode.Single)
  136. newLight.name = "Sun/Moon Directional Light";
  137. else
  138. newLight.name = "Sun Directional Light";
  139. newLight.transform.SetParent(EnviroManager.instance.transform);
  140. newLight.transform.localPosition = Vector3.zero;
  141. EnviroManager.instance.Objects.directionalLight = newLight.AddComponent<Light>();
  142. EnviroManager.instance.Objects.directionalLight.type = LightType.Directional;
  143. EnviroManager.instance.Objects.directionalLight.shadows = LightShadows.Soft;
  144. }
  145. if(EnviroManager.instance.Objects.additionalDirectionalLight == null && Settings.lightingMode == EnviroLighting.LightingMode.Dual)
  146. {
  147. GameObject newLight = new GameObject();
  148. newLight.name = "Moon Directional Light";
  149. newLight.transform.SetParent(EnviroManager.instance.transform);
  150. newLight.transform.localPosition = Vector3.zero;
  151. EnviroManager.instance.Objects.additionalDirectionalLight = newLight.AddComponent<Light>();
  152. EnviroManager.instance.Objects.additionalDirectionalLight.type = LightType.Directional;
  153. EnviroManager.instance.Objects.additionalDirectionalLight.shadows = LightShadows.Soft;
  154. }
  155. else if (EnviroManager.instance.Objects.additionalDirectionalLight != null && Settings.lightingMode == EnviroLighting.LightingMode.Single)
  156. {
  157. DestroyImmediate(EnviroManager.instance.Objects.additionalDirectionalLight.gameObject);
  158. }
  159. if(EnviroManager.instance.Objects.globalReflectionProbe == null)
  160. {
  161. GameObject newReflectionProbe = new GameObject();
  162. newReflectionProbe.name = "Global Reflection Probe";
  163. newReflectionProbe.transform.SetParent(EnviroManager.instance.transform);
  164. newReflectionProbe.transform.localPosition = Vector3.zero;
  165. EnviroManager.instance.Objects.globalReflectionProbe = newReflectionProbe.AddComponent<EnviroReflectionProbe>();
  166. }
  167. }
  168. private void Cleanup()
  169. {
  170. if(EnviroManager.instance.Objects.directionalLight != null)
  171. DestroyImmediate(EnviroManager.instance.Objects.directionalLight.gameObject);
  172. if(EnviroManager.instance.Objects.additionalDirectionalLight != null)
  173. DestroyImmediate(EnviroManager.instance.Objects.additionalDirectionalLight.gameObject);
  174. if(EnviroManager.instance.Objects.globalReflectionProbe != null)
  175. DestroyImmediate(EnviroManager.instance.Objects.globalReflectionProbe.gameObject);
  176. }
  177. // Update Method
  178. public override void UpdateModule ()
  179. {
  180. //Update Direct Lighting
  181. if(EnviroManager.instance.Objects.directionalLight != null && Settings.setDirectLighting)
  182. {
  183. #if !ENVIRO_HDRP
  184. UpdateDirectLighting ();
  185. #else
  186. UpdateDirectLightingHDRP();
  187. #endif
  188. }
  189. if (Settings.setAmbientLighting)
  190. {
  191. #if !ENVIRO_HDRP
  192. UpdateAmbientLighting ();
  193. #else
  194. UpdateAmbientLightingHDRP ();
  195. #endif
  196. }
  197. if(EnviroManager.instance.Objects.globalReflectionProbe != null && Settings.updateReflectionProbe)
  198. {
  199. UpdateReflection();
  200. }
  201. #if ENVIRO_HDRP
  202. UpdateExposureHDRP ();
  203. #endif
  204. }
  205. private void UpdateDirectLighting ()
  206. {
  207. if(Settings.lightingMode == EnviroLighting.LightingMode.Single)
  208. {
  209. if(!EnviroManager.instance.isNight)
  210. {
  211. //Set light to sun
  212. EnviroManager.instance.Objects.directionalLight.transform.rotation = EnviroManager.instance.Objects.sun.transform.rotation;
  213. EnviroManager.instance.Objects.directionalLight.intensity = Settings.sunIntensityCurve.Evaluate(EnviroManager.instance.solarTime) * Settings.directLightIntensityModifier;
  214. EnviroManager.instance.Objects.directionalLight.color = Settings.sunColorGradient.Evaluate(EnviroManager.instance.solarTime);
  215. }
  216. else
  217. {
  218. //Set light to moon
  219. EnviroManager.instance.Objects.directionalLight.transform.rotation = EnviroManager.instance.Objects.moon.transform.rotation;
  220. EnviroManager.instance.Objects.directionalLight.intensity = Settings.moonIntensityCurve.Evaluate(EnviroManager.instance.lunarTime) * Settings.directLightIntensityModifier;
  221. EnviroManager.instance.Objects.directionalLight.color = Settings.moonColorGradient.Evaluate(EnviroManager.instance.lunarTime);
  222. }
  223. }
  224. else
  225. {
  226. //Sun
  227. EnviroManager.instance.Objects.directionalLight.transform.rotation = EnviroManager.instance.Objects.sun.transform.rotation;
  228. EnviroManager.instance.Objects.directionalLight.intensity = Settings.sunIntensityCurve.Evaluate(EnviroManager.instance.solarTime) * Settings.directLightIntensityModifier;
  229. EnviroManager.instance.Objects.directionalLight.color = Settings.sunColorGradient.Evaluate(EnviroManager.instance.solarTime);
  230. //Moon
  231. EnviroManager.instance.Objects.additionalDirectionalLight.transform.rotation = EnviroManager.instance.Objects.moon.transform.rotation;
  232. EnviroManager.instance.Objects.additionalDirectionalLight.intensity = Settings.moonIntensityCurve.Evaluate(EnviroManager.instance.lunarTime) * Settings.directLightIntensityModifier;
  233. EnviroManager.instance.Objects.additionalDirectionalLight.color = Settings.moonColorGradient.Evaluate(EnviroManager.instance.lunarTime);
  234. }
  235. }
  236. #if ENVIRO_HDRP
  237. private void UpdateDirectLightingHDRP ()
  238. {
  239. if(directionalLightHDRP == null && EnviroManager.instance.Objects.directionalLight != null)
  240. directionalLightHDRP = EnviroManager.instance.Objects.directionalLight.gameObject.GetComponent<UnityEngine.Rendering.HighDefinition.HDAdditionalLightData>();
  241. if(additionalLightHDRP == null && EnviroManager.instance.Objects.additionalDirectionalLight != null)
  242. additionalLightHDRP = EnviroManager.instance.Objects.additionalDirectionalLight.gameObject.GetComponent<UnityEngine.Rendering.HighDefinition.HDAdditionalLightData>();
  243. if(Settings.lightingMode == EnviroLighting.LightingMode.Single)
  244. {
  245. if(!EnviroManager.instance.isNight)
  246. {
  247. //Set light to sun
  248. EnviroManager.instance.Objects.directionalLight.transform.rotation = EnviroManager.instance.Objects.sun.transform.rotation;
  249. EnviroManager.instance.Objects.directionalLight.color = Settings.lightColorTintHDRP.Evaluate(EnviroManager.instance.solarTime);
  250. EnviroManager.instance.Objects.directionalLight.useColorTemperature = true;
  251. EnviroManager.instance.Objects.directionalLight.colorTemperature = Settings.lightColorTemperatureHDRP.Evaluate(EnviroManager.instance.solarTime);
  252. if(directionalLightHDRP != null)
  253. directionalLightHDRP.SetIntensity(Settings.sunIntensityCurveHDRP.Evaluate(EnviroManager.instance.solarTime) * Settings.directLightIntensityModifier);
  254. }
  255. else
  256. {
  257. //Set light to moon
  258. EnviroManager.instance.Objects.directionalLight.transform.rotation = EnviroManager.instance.Objects.moon.transform.rotation;
  259. EnviroManager.instance.Objects.directionalLight.color = Settings.lightColorTintHDRP.Evaluate(EnviroManager.instance.solarTime);
  260. EnviroManager.instance.Objects.directionalLight.useColorTemperature = true;
  261. EnviroManager.instance.Objects.directionalLight.colorTemperature = Settings.lightColorTemperatureHDRP.Evaluate(EnviroManager.instance.solarTime);
  262. if(directionalLightHDRP != null)
  263. directionalLightHDRP.SetIntensity(Settings.moonIntensityCurveHDRP.Evaluate(EnviroManager.instance.lunarTime) * Settings.directLightIntensityModifier);
  264. }
  265. }
  266. else
  267. {
  268. //Sun
  269. EnviroManager.instance.Objects.directionalLight.transform.rotation = EnviroManager.instance.Objects.sun.transform.rotation;
  270. EnviroManager.instance.Objects.directionalLight.color = Settings.lightColorTintHDRP.Evaluate(EnviroManager.instance.solarTime);
  271. EnviroManager.instance.Objects.directionalLight.useColorTemperature = true;
  272. EnviroManager.instance.Objects.directionalLight.colorTemperature = Settings.lightColorTemperatureHDRP.Evaluate(EnviroManager.instance.solarTime);
  273. if(directionalLightHDRP != null)
  274. directionalLightHDRP.SetIntensity(Settings.sunIntensityCurveHDRP.Evaluate(EnviroManager.instance.solarTime) * Settings.directLightIntensityModifier);
  275. //Moon
  276. if(EnviroManager.instance.Objects.additionalDirectionalLight != null)
  277. {
  278. EnviroManager.instance.Objects.additionalDirectionalLight.transform.rotation = EnviroManager.instance.Objects.moon.transform.rotation;
  279. EnviroManager.instance.Objects.additionalDirectionalLight.color = Settings.lightColorTintHDRP.Evaluate(EnviroManager.instance.solarTime);
  280. EnviroManager.instance.Objects.additionalDirectionalLight.useColorTemperature = true;
  281. EnviroManager.instance.Objects.additionalDirectionalLight.colorTemperature = Settings.lightColorTemperatureHDRP.Evaluate(EnviroManager.instance.solarTime);
  282. }
  283. if(additionalLightHDRP != null)
  284. additionalLightHDRP.SetIntensity(Settings.moonIntensityCurveHDRP.Evaluate(EnviroManager.instance.lunarTime) * Settings.directLightIntensityModifier);
  285. }
  286. }
  287. private void UpdateAmbientLightingHDRP ()
  288. {
  289. if(EnviroManager.instance.Sky != null && EnviroManager.instance.Sky.mySkyboxMat != null)
  290. {
  291. EnviroManager.instance.Sky.mySkyboxMat.SetColor("_AmbientColorTintHDRP", Settings.ambientColorTintHDRP.Evaluate(EnviroManager.instance.solarTime));
  292. }
  293. if(EnviroManager.instance.volumeHDRP != null)
  294. {
  295. if(indirectLightingHDRP == null)
  296. {
  297. UnityEngine.Rendering.HighDefinition.IndirectLightingController TempIndirectLight;
  298. if (EnviroManager.instance.volumeHDRP.sharedProfile != null && EnviroManager.instance.volumeHDRP.sharedProfile.TryGet<UnityEngine.Rendering.HighDefinition.IndirectLightingController>(out TempIndirectLight))
  299. {
  300. indirectLightingHDRP = TempIndirectLight;
  301. }
  302. else
  303. {
  304. EnviroManager.instance.volumeHDRP.sharedProfile.Add<UnityEngine.Rendering.HighDefinition.IndirectLightingController>();
  305. if (EnviroManager.instance.volumeHDRP.sharedProfile.TryGet<UnityEngine.Rendering.HighDefinition.IndirectLightingController>(out TempIndirectLight))
  306. {
  307. indirectLightingHDRP = TempIndirectLight;
  308. }
  309. }
  310. }
  311. else
  312. {
  313. if(Settings.controlIndirectLighting)
  314. {
  315. indirectLightingHDRP.active = true;
  316. indirectLightingHDRP.indirectDiffuseLightingMultiplier.overrideState = true;
  317. indirectLightingHDRP.indirectDiffuseLightingMultiplier.value = Settings.diffuseIndirectIntensity.Evaluate(EnviroManager.instance.solarTime);
  318. indirectLightingHDRP.reflectionLightingMultiplier.overrideState = true;
  319. indirectLightingHDRP.reflectionLightingMultiplier.value = Settings.reflectionIndirectIntensity.Evaluate(EnviroManager.instance.solarTime);
  320. }
  321. else
  322. {
  323. indirectLightingHDRP.active = false;
  324. }
  325. }
  326. }
  327. }
  328. private void UpdateExposureHDRP ()
  329. {
  330. if(EnviroManager.instance.volumeHDRP != null)
  331. {
  332. if(exposureHDRP == null)
  333. {
  334. UnityEngine.Rendering.HighDefinition.Exposure TempExposure;
  335. if (EnviroManager.instance.volumeHDRP.sharedProfile != null && EnviroManager.instance.volumeHDRP.sharedProfile.TryGet<UnityEngine.Rendering.HighDefinition.Exposure>(out TempExposure))
  336. {
  337. exposureHDRP = TempExposure;
  338. }
  339. else
  340. {
  341. EnviroManager.instance.volumeHDRP.sharedProfile.Add<UnityEngine.Rendering.HighDefinition.Exposure>();
  342. if (EnviroManager.instance.volumeHDRP.sharedProfile.TryGet<UnityEngine.Rendering.HighDefinition.Exposure>(out TempExposure))
  343. {
  344. exposureHDRP = TempExposure;
  345. }
  346. }
  347. }
  348. else
  349. {
  350. if(Settings.controlExposure)
  351. {
  352. exposureHDRP.active = true;
  353. exposureHDRP.mode.overrideState = true;
  354. exposureHDRP.mode.value = UnityEngine.Rendering.HighDefinition.ExposureMode.Fixed;
  355. exposureHDRP.fixedExposure.overrideState = true;
  356. exposureHDRP.fixedExposure.value = Settings.sceneExposure.Evaluate(EnviroManager.instance.solarTime);
  357. }
  358. else
  359. {
  360. exposureHDRP.active = false;
  361. }
  362. }
  363. }
  364. }
  365. #endif
  366. private void UpdateAmbientLighting ()
  367. {
  368. RenderSettings.ambientMode = Settings.ambientMode;
  369. float intensity = Mathf.Lerp(Settings.ambientIntensityCurve.Evaluate(EnviroManager.instance.solarTime), Settings.ambientIntensityCurve.Evaluate(EnviroManager.instance.solarTime) * 0.25f, EnviroManager.instance.lunarTime * (1f - EnviroManager.instance.solarTime)) * Settings.ambientIntensityModifier;
  370. switch (Settings.ambientMode)
  371. {
  372. case UnityEngine.Rendering.AmbientMode.Flat:
  373. RenderSettings.ambientSkyColor = Settings.ambientSkyColorGradient.Evaluate(EnviroManager.instance.solarTime) * intensity;
  374. break;
  375. case UnityEngine.Rendering.AmbientMode.Trilight:
  376. RenderSettings.ambientSkyColor = Settings.ambientSkyColorGradient.Evaluate(EnviroManager.instance.solarTime) * intensity;
  377. RenderSettings.ambientEquatorColor = Settings.ambientEquatorColorGradient.Evaluate(EnviroManager.instance.solarTime) * intensity;
  378. RenderSettings.ambientGroundColor = Settings.ambientGroundColorGradient.Evaluate(EnviroManager.instance.solarTime) * intensity;
  379. break;
  380. case UnityEngine.Rendering.AmbientMode.Skybox:
  381. RenderSettings.ambientIntensity = intensity;
  382. if(EnviroManager.instance.Time != null)
  383. {
  384. if (lastAmbientSkyboxUpdate < EnviroManager.instance.Time.Settings.timeOfDay || lastAmbientSkyboxUpdate > EnviroManager.instance.Time.Settings.timeOfDay + 0.101f)
  385. {
  386. DynamicGI.UpdateEnvironment();
  387. lastAmbientSkyboxUpdate = EnviroManager.instance.Time.Settings.timeOfDay + 0.1f;
  388. }
  389. }
  390. else
  391. {
  392. if (lastAmbientSkyboxUpdate < Time.realtimeSinceStartup || lastAmbientSkyboxUpdate > Time.realtimeSinceStartup + 0.101f)
  393. {
  394. DynamicGI.UpdateEnvironment();
  395. lastAmbientSkyboxUpdate = Time.realtimeSinceStartup + 0.1f;
  396. }
  397. }
  398. break;
  399. }
  400. }
  401. public void UpdateReflectionForced ()
  402. {
  403. if(EnviroManager.instance.Objects.globalReflectionProbe == null)
  404. return;
  405. #if !ENVIRO_HDRP
  406. EnviroManager.instance.Objects.globalReflectionProbe.RefreshReflection(false);
  407. UpdateDefaultReflection(EnviroManager.instance.Objects.globalReflectionProbe,false);
  408. #else
  409. EnviroManager.instance.Objects.globalReflectionProbe.RefreshReflection(false);
  410. #endif
  411. }
  412. private void UpdateReflection()
  413. {
  414. EnviroReflectionProbe probe = EnviroManager.instance.Objects.globalReflectionProbe;
  415. int res = 128;
  416. switch (Settings.globalReflectionResolution)
  417. {
  418. case EnviroLighting.GlobalReflectionResolution.R16:
  419. res = 16;
  420. break;
  421. case EnviroLighting.GlobalReflectionResolution.R32:
  422. res = 32;
  423. break;
  424. case EnviroLighting.GlobalReflectionResolution.R64:
  425. res = 64;
  426. break;
  427. case EnviroLighting.GlobalReflectionResolution.R128:
  428. res = 128;
  429. break;
  430. case EnviroLighting.GlobalReflectionResolution.R256:
  431. res = 256;
  432. break;
  433. case EnviroLighting.GlobalReflectionResolution.R512:
  434. res = 512;
  435. break;
  436. case EnviroLighting.GlobalReflectionResolution.R1024:
  437. res = 1024;
  438. break;
  439. case EnviroLighting.GlobalReflectionResolution.R2048:
  440. res = 2048;
  441. break;
  442. }
  443. #if !ENVIRO_HDRP
  444. probe.customRendering = Settings.globalReflectionCustomRendering;
  445. probe.myProbe.cullingMask = Settings.globalReflectionLayers;
  446. probe.myProbe.intensity = Settings.globalReflectionsIntensity;
  447. probe.myProbe.size = new Vector3 (Settings.globalReflectionsScale,Settings.globalReflectionsScale,Settings.globalReflectionsScale);
  448. probe.myProbe.resolution = res;
  449. #else
  450. probe.customRendering = false;
  451. probe.myProbe.resolution = res;
  452. if(probe.hdprobe != null)
  453. {
  454. probe.hdprobe.settingsRaw.cameraSettings.culling.cullingMask = Settings.globalReflectionLayers;
  455. probe.hdprobe.settingsRaw.influence.boxSize = new Vector3 (Settings.globalReflectionsScale,Settings.globalReflectionsScale,Settings.globalReflectionsScale);
  456. probe.hdprobe.settingsRaw.influence.sphereRadius = Settings.globalReflectionsScale;
  457. probe.hdprobe.settingsRaw.lighting.multiplier = Settings.globalReflectionsIntensity;
  458. }
  459. #endif
  460. if(EnviroManager.instance.Time != null)
  461. {
  462. if ((lastReflectionUpdate < EnviroManager.instance.Time.Settings.timeOfDay || lastReflectionUpdate > EnviroManager.instance.Time.Settings.timeOfDay + (Settings.globalReflectionsTimeTreshold + 0.01f)) && Settings.globalReflectionsUpdateOnGameTime)
  463. {
  464. #if !ENVIRO_HDRP
  465. probe.RefreshReflection(Settings.globalReflectionTimeSlicing);
  466. UpdateDefaultReflection(probe,Settings.globalReflectionTimeSlicing);
  467. #else
  468. probe.RefreshReflection(false);
  469. #endif
  470. lastReflectionUpdate = EnviroManager.instance.Time.Settings.timeOfDay + Settings.globalReflectionsTimeTreshold;
  471. }
  472. }
  473. if ((probe.transform.position.magnitude > lastReflectionUpdatePos.magnitude + Settings.globalReflectionsPositionTreshold || probe.transform.position.magnitude < lastReflectionUpdatePos.magnitude - Settings.globalReflectionsPositionTreshold) && Settings.globalReflectionsUpdateOnPosition)
  474. {
  475. #if !ENVIRO_HDRP
  476. probe.RefreshReflection(Settings.globalReflectionTimeSlicing);
  477. UpdateDefaultReflection(probe,Settings.globalReflectionTimeSlicing);
  478. #else
  479. probe.RefreshReflection(false);
  480. #endif
  481. lastReflectionUpdatePos = probe.transform.position;
  482. }
  483. }
  484. //Main method to update default reflections.
  485. private void UpdateDefaultReflection (EnviroReflectionProbe probe, bool timeSlice)
  486. {
  487. //Update Default Reflections
  488. #if UNITY_EDITOR
  489. if((Settings.updateDefaultEnvironmentReflections && UnityEngine.SceneManagement.SceneManager.GetActiveScene() == EnviroManager.instance.gameObject.scene) || (Settings.updateDefaultEnvironmentReflections && EnviroManager.instance != null && EnviroManager.instance.dontDestroyOnLoad))
  490. #else
  491. if(Settings.updateDefaultEnvironmentReflections)
  492. #endif
  493. {
  494. if(timeSlice)
  495. EnviroManager.instance.StartCoroutine(CopyDefaultReflectionSliced(probe));
  496. else
  497. EnviroManager.instance.StartCoroutine(CopyDefaultReflectionInstant(probe));
  498. }
  499. else
  500. {
  501. RenderSettings.defaultReflectionMode = UnityEngine.Rendering.DefaultReflectionMode.Skybox;
  502. }
  503. }
  504. //Checks if custom rendering is activated, otherwise check if unity probe is finished rendering to copy the cubemap.
  505. private void CopyDefaultReflection (EnviroReflectionProbe probe)
  506. {
  507. if(!Settings.globalReflectionCustomRendering)
  508. {
  509. if(probe.renderId == -1 || probe.myProbe.IsFinishedRendering(probe.renderId))
  510. {
  511. CopyDefaultReflectionCubemap(probe);
  512. }
  513. else
  514. {
  515. EnviroManager.instance.StartCoroutine(WaitForProbeFinish(probe));
  516. }
  517. }
  518. else
  519. {
  520. CopyDefaultReflectionCubemap(probe);
  521. }
  522. }
  523. //Copy reflection probe to cubemap and assign as default reflections.
  524. private void CopyDefaultReflectionCubemap (EnviroReflectionProbe probe)
  525. {
  526. if(Settings.defaultSkyReflectionTex == null || Settings.defaultSkyReflectionTex.height != probe.myProbe.resolution || Settings.defaultSkyReflectionTex.width != probe.myProbe.resolution)
  527. {
  528. if(Settings.defaultSkyReflectionTex != null)
  529. DestroyImmediate(Settings.defaultSkyReflectionTex);
  530. Settings.defaultSkyReflectionTex = new Cubemap(probe.myProbe.resolution, probe.myProbe.hdr ? TextureFormat.RGBAHalf : TextureFormat.RGBA32, true);
  531. Settings.defaultSkyReflectionTex.name = "Enviro Default Sky Reflection";
  532. }
  533. if(probe.myProbe.texture != null)
  534. Graphics.CopyTexture(probe.myProbe.texture, Settings.defaultSkyReflectionTex as Texture);
  535. RenderSettings.defaultReflectionMode = UnityEngine.Rendering.DefaultReflectionMode.Custom;
  536. RenderSettings.customReflection = Settings.defaultSkyReflectionTex;
  537. }
  538. //Wait a frame and check again if unity probe finished now. Set to DefaultReflectionMode to Skybox in meantime.
  539. private IEnumerator WaitForProbeFinish (EnviroReflectionProbe probe)
  540. {
  541. RenderSettings.defaultReflectionMode = UnityEngine.Rendering.DefaultReflectionMode.Skybox;
  542. yield return null;
  543. CopyDefaultReflection(probe);
  544. }
  545. private IEnumerator CopyDefaultReflectionInstant(EnviroReflectionProbe probe)
  546. {
  547. //Wait one frame for probe to finish rendering in case of timeslicing
  548. yield return null;
  549. CopyDefaultReflection(probe);
  550. }
  551. //Wait 7 frames for custom rendered time sliced probes.
  552. private IEnumerator CopyDefaultReflectionSliced(EnviroReflectionProbe probe)
  553. {
  554. //Wait for 7 frames in case of timeslicing
  555. for (int i = 0; i < 8; i++)
  556. {
  557. yield return null;
  558. }
  559. CopyDefaultReflection(probe);
  560. }
  561. //Save and Load
  562. public void LoadModuleValues ()
  563. {
  564. if(preset != null)
  565. {
  566. Settings = JsonUtility.FromJson<Enviro.EnviroLighting>(JsonUtility.ToJson(preset.Settings));
  567. }
  568. else
  569. {
  570. Debug.Log("Please assign a saved module to load from!");
  571. }
  572. }
  573. public void SaveModuleValues ()
  574. {
  575. #if UNITY_EDITOR
  576. EnviroLightingModule t = ScriptableObject.CreateInstance<EnviroLightingModule>();
  577. t.name = "Lighting Module";
  578. t.Settings = JsonUtility.FromJson<Enviro.EnviroLighting>(JsonUtility.ToJson(Settings));
  579. string assetPathAndName = UnityEditor.AssetDatabase.GenerateUniqueAssetPath("Assets/Enviro 3" + "/New " + t.name + ".asset");
  580. UnityEditor.AssetDatabase.CreateAsset(t, assetPathAndName);
  581. UnityEditor.AssetDatabase.SaveAssets();
  582. UnityEditor.AssetDatabase.Refresh();
  583. #endif
  584. }
  585. public void SaveModuleValues (EnviroLightingModule module)
  586. {
  587. module.Settings = JsonUtility.FromJson<Enviro.EnviroLighting>(JsonUtility.ToJson(Settings));
  588. #if UNITY_EDITOR
  589. UnityEditor.EditorUtility.SetDirty(module);
  590. UnityEditor.AssetDatabase.SaveAssets();
  591. #endif
  592. }
  593. }
  594. }