SkyManagerEditor.cs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. namespace Funly.SkyStudio
  6. {
  7. // TODO - Delete this class, it's been replaced.
  8. public class SkyManagerEditor : Editor
  9. {
  10. private static string GRADIENT_KEYWORD = "GRADIENT_BACKGROUND";
  11. private static string STAR_LAYER_1_KEYWORD = "STAR_LAYER_1";
  12. private static string STAR_LAYER_2_KEYWORD = "STAR_LAYER_2";
  13. private static string STAR_LAYER_3_KEYWORD = "STAR_LAYER_3";
  14. private static string MOON_KEYWORD = "MOON";
  15. private static string SUN_KEYWORD = "SUN";
  16. private static string CLOUDS_KEYWORD = "CLOUDS";
  17. private static string EDITOR_PREF_NEEDS_REBUILDING_KEY = "SkyNeedsRebuilding";
  18. private bool _gradientEnabled;
  19. private bool _starLayer1Enabled;
  20. private bool _starLayer2Enabled;
  21. private bool _starLayer3Enabled;
  22. private bool _moonEnabled;
  23. private bool _sunEnabled;
  24. private bool _cloudsEnabled;
  25. private Material _skyboxMaterial;
  26. private SkyBuilder _builder;
  27. private bool _skyNeedsRebuilding;
  28. private Texture2D _sectionHeaderBg;
  29. private void OnEnable()
  30. {
  31. serializedObject.Update();
  32. _sectionHeaderBg = CreateColorImage(Color.grey);
  33. if (EditorPrefs.HasKey(EDITOR_PREF_NEEDS_REBUILDING_KEY)) {
  34. _skyNeedsRebuilding = EditorPrefs.GetBool(EDITOR_PREF_NEEDS_REBUILDING_KEY);
  35. }
  36. }
  37. private void OnDisable()
  38. {
  39. EditorPrefs.SetBool(EDITOR_PREF_NEEDS_REBUILDING_KEY, _skyNeedsRebuilding);
  40. }
  41. public override void OnInspectorGUI()
  42. {
  43. serializedObject.Update();
  44. DisplayCustomLayout();
  45. serializedObject.ApplyModifiedProperties();
  46. }
  47. private void DisplayCustomLayout()
  48. {
  49. serializedObject.Update();
  50. EditorGUILayout.PropertyField(serializedObject.FindProperty("_skyboxMaterial"));
  51. _skyboxMaterial = SkyboxMaterial();
  52. if (_skyboxMaterial == null) {
  53. EditorGUILayout.HelpBox("You can't edit a skybox without a skybox material.", MessageType.Error);
  54. return;
  55. }
  56. // Verify it's a supported shader.
  57. if (_skyboxMaterial.shader.name.Contains("Funly/Sky") == false)
  58. {
  59. Debug.LogError("Skybox material must use the DyanmicSky shader, clearing material field.");
  60. serializedObject.FindProperty("_skyboxMaterial").objectReferenceValue = null;
  61. //SkyMaterialController.Instance.SkyboxMaterial = null;
  62. }
  63. // Load enabled features from shader.
  64. LoadFeatureFlagsFromShader();
  65. EditorGUILayout.Space();
  66. // Button to rebuild skyColors data.
  67. RebuildSettings();
  68. EditorGUILayout.Space();
  69. // Feature settings.
  70. FeatureSettings();
  71. // Background.
  72. SkyBackgroundSettings();
  73. // Star layer 1 settings.
  74. if (_starLayer1Enabled) {
  75. StarLayerSettings("1");
  76. }
  77. // Star layer 2 settings.
  78. if (_starLayer2Enabled) {
  79. StarLayerSettings("2");
  80. }
  81. // Star layer 3 settings.
  82. if (_starLayer3Enabled) {
  83. StarLayerSettings("3");
  84. }
  85. // Sun Settings.
  86. if (_sunEnabled)
  87. {
  88. SunSettings();
  89. }
  90. // Moon settings.
  91. if (_moonEnabled) {
  92. MoonSettings();
  93. }
  94. // Cloud Settings.
  95. if (_cloudsEnabled)
  96. {
  97. CloudSettings();
  98. }
  99. serializedObject.ApplyModifiedProperties();
  100. }
  101. private void LoadFeatureFlagsFromShader()
  102. {
  103. if (_skyboxMaterial == null)
  104. {
  105. return;
  106. }
  107. _gradientEnabled = _skyboxMaterial.IsKeywordEnabled(GRADIENT_KEYWORD);
  108. _starLayer1Enabled = _skyboxMaterial.IsKeywordEnabled(STAR_LAYER_1_KEYWORD);
  109. _starLayer2Enabled = _skyboxMaterial.IsKeywordEnabled(STAR_LAYER_2_KEYWORD);
  110. _starLayer3Enabled = _skyboxMaterial.IsKeywordEnabled(STAR_LAYER_3_KEYWORD);
  111. _moonEnabled = _skyboxMaterial.IsKeywordEnabled(MOON_KEYWORD);
  112. _sunEnabled = _skyboxMaterial.IsKeywordEnabled(SUN_KEYWORD);
  113. _cloudsEnabled = _skyboxMaterial.IsKeywordEnabled(CLOUDS_KEYWORD);
  114. }
  115. private void FeatureSettings()
  116. {
  117. AddSectionTitle("Skybox Features");
  118. _starLayer1Enabled = ToggleShaderFeature("Use Star Layer 1", STAR_LAYER_1_KEYWORD, _starLayer1Enabled, false);
  119. _starLayer2Enabled = ToggleShaderFeature("Use Star Layer 2", STAR_LAYER_2_KEYWORD, _starLayer2Enabled, false);
  120. _starLayer3Enabled = ToggleShaderFeature("Use Star Layer 3", STAR_LAYER_3_KEYWORD, _starLayer3Enabled, false);
  121. _moonEnabled = ToggleShaderFeature("Use Moon", MOON_KEYWORD, _moonEnabled, false);
  122. _sunEnabled = ToggleShaderFeature("Use Sun", SUN_KEYWORD, _sunEnabled, false);
  123. _cloudsEnabled = ToggleShaderFeature("Use Clouds", CLOUDS_KEYWORD, _cloudsEnabled, false);
  124. }
  125. private void SkyBackgroundSettings()
  126. {
  127. AddSectionTitle("Sky Background");
  128. _gradientEnabled = ToggleShaderFeature("Use Gradient Background", GRADIENT_KEYWORD, _gradientEnabled, false);
  129. if (_gradientEnabled) {
  130. EditorGUILayout.PropertyField(serializedObject.FindProperty("_skyColor"));
  131. EditorGUILayout.PropertyField(serializedObject.FindProperty("_horizonColor"));
  132. EditorGUILayout.PropertyField(serializedObject.FindProperty("_gradientFadeBegin"));
  133. EditorGUILayout.PropertyField(serializedObject.FindProperty("_gradientFadeLength"));
  134. } else {
  135. EditorGUILayout.PropertyField(serializedObject.FindProperty("_backgroundCubemap"));
  136. }
  137. EditorGUILayout.PropertyField(serializedObject.FindProperty("_starFadeBegin"));
  138. EditorGUILayout.PropertyField(serializedObject.FindProperty("_starFadeLength"));
  139. EditorGUILayout.PropertyField(serializedObject.FindProperty("_horizonDistanceScale"));
  140. }
  141. private void RebuildSettings()
  142. {
  143. // Make rebuild button red to help user not miss it after changes.
  144. GUIStyle style = new GUIStyle(GUI.skin.button);
  145. if (DoesStarSystemNeedRebuilding()) {
  146. style.normal.textColor = Color.red;
  147. }
  148. // Rebuild our data images if necessary.
  149. if (GUILayout.Button("Rebuild Star System", style)) {
  150. if (_builder == null) {
  151. _builder = CreateSkyBuilder();
  152. }
  153. if (_builder.IsComplete == false) {
  154. return;
  155. }
  156. _builder.BuildSkySystem();
  157. }
  158. }
  159. private void StarLayerSettings(string layerId)
  160. {
  161. AddSectionTitle("Star Layer " + layerId);
  162. string namePrefix = "_StarLayer" + layerId;
  163. float density = _skyboxMaterial.GetFloat(namePrefix + "Density");
  164. float currDensity = EditorGUILayout.Slider("Star Layer " + layerId + " Density",
  165. density, 0, .05f);
  166. _skyboxMaterial.SetFloat(namePrefix + "Density", currDensity);
  167. if (_skyNeedsRebuilding == false && density != currDensity) {
  168. _skyNeedsRebuilding = true;
  169. }
  170. SerializedProperty prop = serializedObject.GetIterator();
  171. while (prop.NextVisible(true)) {
  172. if (prop.name.Contains("_starLayer" + layerId)) {
  173. EditorGUILayout.PropertyField(prop);
  174. }
  175. }
  176. }
  177. private SkyBuilder CreateSkyBuilder()
  178. {
  179. SkyBuilder b = new SkyBuilder();
  180. b.starLayer1Enabled = _starLayer1Enabled;
  181. b.starLayer2Enabled = _starLayer2Enabled;
  182. b.starLayer3Enabled = _starLayer3Enabled;
  183. b.skyboxMaterial = _skyboxMaterial;
  184. b.completionCallback += BuilderCompletion;
  185. return b;
  186. }
  187. bool ToggleShaderFeature(string label, string keyword, bool value, bool leftAlign)
  188. {
  189. bool updatedValue;
  190. if (leftAlign) {
  191. updatedValue = EditorGUILayout.ToggleLeft(label, value);
  192. } else {
  193. updatedValue = EditorGUILayout.Toggle(label, value);
  194. }
  195. UpdateShaderKeyword(keyword, updatedValue);
  196. return updatedValue;
  197. }
  198. void UpdateShaderKeyword(string keyword, bool value)
  199. {
  200. if (value) {
  201. _skyboxMaterial.EnableKeyword(keyword);
  202. } else {
  203. _skyboxMaterial.DisableKeyword(keyword);
  204. }
  205. }
  206. void SunSettings()
  207. {
  208. RenderSettingsSection("Sun", "_sun");
  209. }
  210. void MoonSettings()
  211. {
  212. RenderSettingsSection("Moon", "_moon");
  213. }
  214. void CloudSettings()
  215. {
  216. RenderSettingsSection("Clouds", "_cloud");
  217. }
  218. void RenderSettingsSection(string title, string variablePrefix)
  219. {
  220. AddSectionTitle(title);
  221. SerializedProperty prop = serializedObject.GetIterator();
  222. while (prop.NextVisible(true)) {
  223. if (prop.name.Contains(variablePrefix)) {
  224. EditorGUILayout.PropertyField(prop);
  225. }
  226. }
  227. }
  228. private Material SkyboxMaterial()
  229. {
  230. //SkyMaterialController controller = SkyMaterialController.Instance;
  231. //return controller != null ? controller.SkyboxMaterial : null;
  232. return null;
  233. }
  234. private void AddSectionTitle(string title)
  235. {
  236. EditorGUILayout.Space();
  237. GUIStyle bgStyle = new GUIStyle();
  238. bgStyle.normal.background = _sectionHeaderBg;
  239. EditorGUILayout.BeginHorizontal(bgStyle);
  240. GUIStyle titleStyle = new GUIStyle();
  241. titleStyle.normal.textColor = Color.black;
  242. titleStyle.fontStyle = FontStyle.Bold;
  243. EditorGUILayout.LabelField(title, titleStyle);
  244. EditorGUILayout.EndHorizontal();
  245. }
  246. private Texture2D CreateColorImage(Color c)
  247. {
  248. Texture2D tex = new Texture2D(1, 1);
  249. tex.SetPixel(0, 0, c);
  250. return tex;
  251. }
  252. private bool DoesStarSystemNeedRebuilding()
  253. {
  254. return _skyNeedsRebuilding;
  255. }
  256. private void BuilderCompletion(SkyBuilder builder, bool successful)
  257. {
  258. _builder.completionCallback -= BuilderCompletion;
  259. _builder = null;
  260. _skyNeedsRebuilding = false;
  261. }
  262. }
  263. }