WaterBaseEditor.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using UnityEngine;
  2. using UnityEditor;
  3. namespace UnityStandardAssets.Water
  4. {
  5. [CustomEditor(typeof(WaterBase))]
  6. public class WaterBaseEditor : Editor
  7. {
  8. public GameObject oceanBase;
  9. private WaterBase waterBase;
  10. private Material oceanMaterial = null;
  11. private SerializedObject serObj;
  12. private SerializedProperty sharedMaterial;
  13. public SerializedProperty waterQuality;
  14. public SerializedProperty edgeBlend;
  15. public void OnEnable()
  16. {
  17. serObj = new SerializedObject(target);
  18. sharedMaterial = serObj.FindProperty("sharedMaterial");
  19. waterQuality = serObj.FindProperty("waterQuality");
  20. edgeBlend = serObj.FindProperty("edgeBlend");
  21. }
  22. public override void OnInspectorGUI()
  23. {
  24. serObj.Update();
  25. waterBase = (WaterBase)serObj.targetObject;
  26. oceanBase = ((WaterBase)serObj.targetObject).gameObject;
  27. if (!oceanBase)
  28. return;
  29. GUILayout.Label("This script helps adjusting water material properties", EditorStyles.miniBoldLabel);
  30. EditorGUILayout.PropertyField(sharedMaterial, new GUIContent("Material"));
  31. oceanMaterial = (Material)sharedMaterial.objectReferenceValue;
  32. if (!oceanMaterial)
  33. {
  34. sharedMaterial.objectReferenceValue = (Object)WaterEditorUtility.LocateValidWaterMaterial(oceanBase.transform);
  35. serObj.ApplyModifiedProperties();
  36. oceanMaterial = (Material)sharedMaterial.objectReferenceValue;
  37. if (!oceanMaterial)
  38. return;
  39. }
  40. EditorGUILayout.Separator();
  41. GUILayout.Label("Overall Quality", EditorStyles.boldLabel);
  42. EditorGUILayout.PropertyField(waterQuality, new GUIContent("Quality"));
  43. EditorGUILayout.PropertyField(edgeBlend, new GUIContent("Edge blend?"));
  44. if (waterQuality.intValue > (int)WaterQuality.Low)
  45. EditorGUILayout.HelpBox("Water features not supported", MessageType.Warning);
  46. if (edgeBlend.boolValue && !SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.Depth))
  47. EditorGUILayout.HelpBox("Edge blend not supported", MessageType.Warning);
  48. EditorGUILayout.Separator();
  49. bool hasShore = oceanMaterial.HasProperty("_ShoreTex");
  50. GUILayout.Label("Main Colors", EditorStyles.boldLabel);
  51. GUILayout.Label("Alpha values define blending with realtime textures", EditorStyles.miniBoldLabel);
  52. WaterEditorUtility.SetMaterialColor("_BaseColor", EditorGUILayout.ColorField("Refraction", WaterEditorUtility.GetMaterialColor("_BaseColor", oceanMaterial)), oceanMaterial);
  53. WaterEditorUtility.SetMaterialColor("_ReflectionColor", EditorGUILayout.ColorField("Reflection", WaterEditorUtility.GetMaterialColor("_ReflectionColor", oceanMaterial)), oceanMaterial);
  54. EditorGUILayout.Separator();
  55. GUILayout.Label("Main Textures", EditorStyles.boldLabel);
  56. GUILayout.Label("Used for small waves (bumps), foam and white caps", EditorStyles.miniBoldLabel);
  57. WaterEditorUtility.SetMaterialTexture("_BumpMap", (Texture)EditorGUILayout.ObjectField("Normals", WaterEditorUtility.GetMaterialTexture("_BumpMap", waterBase.sharedMaterial), typeof(Texture), false), waterBase.sharedMaterial);
  58. if (hasShore)
  59. WaterEditorUtility.SetMaterialTexture("_ShoreTex", (Texture)EditorGUILayout.ObjectField("Shore & Foam", WaterEditorUtility.GetMaterialTexture("_ShoreTex", waterBase.sharedMaterial), typeof(Texture), false), waterBase.sharedMaterial);
  60. Vector4 animationTiling;
  61. Vector4 animationDirection;
  62. Vector2 firstTiling;
  63. Vector2 secondTiling;
  64. Vector2 firstDirection;
  65. Vector2 secondDirection;
  66. animationTiling = WaterEditorUtility.GetMaterialVector("_BumpTiling", oceanMaterial);
  67. animationDirection = WaterEditorUtility.GetMaterialVector("_BumpDirection", oceanMaterial);
  68. firstTiling = new Vector2(animationTiling.x * 100.0F, animationTiling.y * 100.0F);
  69. secondTiling = new Vector2(animationTiling.z * 100.0F, animationTiling.w * 100.0F);
  70. firstTiling = EditorGUILayout.Vector2Field("Tiling 1", firstTiling);
  71. secondTiling = EditorGUILayout.Vector2Field("Tiling 2", secondTiling);
  72. //firstTiling.x = EditorGUILayout.FloatField("1st Tiling U", firstTiling.x);
  73. //firstTiling.y = EditorGUILayout.FloatField("1st Tiling V", firstTiling.y);
  74. //secondTiling.x = EditorGUILayout.FloatField("2nd Tiling U", secondTiling.x);
  75. //secondTiling.y = EditorGUILayout.FloatField("2nd Tiling V", secondTiling.y);
  76. firstDirection = new Vector2(animationDirection.x, animationDirection.y);
  77. secondDirection = new Vector2(animationDirection.z, animationDirection.w);
  78. //firstDirection.x = EditorGUILayout.FloatField("1st Animation U", firstDirection.x);
  79. //firstDirection.y = EditorGUILayout.FloatField("1st Animation V", firstDirection.y);
  80. //secondDirection.x = EditorGUILayout.FloatField("2nd Animation U", secondDirection.x);
  81. //secondDirection.y = EditorGUILayout.FloatField("2nd Animation V", secondDirection.y);
  82. firstDirection = EditorGUILayout.Vector2Field("Direction 1", firstDirection);
  83. secondDirection = EditorGUILayout.Vector2Field("Direction 2", secondDirection);
  84. animationTiling = new Vector4(firstTiling.x / 100.0F, firstTiling.y / 100.0F, secondTiling.x / 100.0F, secondTiling.y / 100.0F);
  85. animationDirection = new Vector4(firstDirection.x, firstDirection.y, secondDirection.x, secondDirection.y);
  86. WaterEditorUtility.SetMaterialVector("_BumpTiling", animationTiling, oceanMaterial);
  87. WaterEditorUtility.SetMaterialVector("_BumpDirection", animationDirection, oceanMaterial);
  88. Vector4 displacementParameter = WaterEditorUtility.GetMaterialVector("_DistortParams", oceanMaterial);
  89. Vector4 fade = WaterEditorUtility.GetMaterialVector("_InvFadeParemeter", oceanMaterial);
  90. EditorGUILayout.Separator();
  91. GUILayout.Label("Normals", EditorStyles.boldLabel);
  92. GUILayout.Label("Displacement for fresnel, specular and reflection/refraction", EditorStyles.miniBoldLabel);
  93. float gerstnerNormalIntensity = WaterEditorUtility.GetMaterialFloat("_GerstnerIntensity", oceanMaterial);
  94. gerstnerNormalIntensity = EditorGUILayout.Slider("Per Vertex", gerstnerNormalIntensity, -2.5F, 2.5F);
  95. WaterEditorUtility.SetMaterialFloat("_GerstnerIntensity", gerstnerNormalIntensity, oceanMaterial);
  96. displacementParameter.x = EditorGUILayout.Slider("Per Pixel", displacementParameter.x, -4.0F, 4.0F);
  97. displacementParameter.y = EditorGUILayout.Slider("Distortion", displacementParameter.y, -0.5F, 0.5F);
  98. // fade.z = EditorGUILayout.Slider("Distance fade", fade.z, 0.0f, 0.5f);
  99. EditorGUILayout.Separator();
  100. GUILayout.Label("Fresnel", EditorStyles.boldLabel);
  101. GUILayout.Label("Defines reflection to refraction relation", EditorStyles.miniBoldLabel);
  102. if (!oceanMaterial.HasProperty("_Fresnel"))
  103. {
  104. if (oceanMaterial.HasProperty("_FresnelScale"))
  105. {
  106. float fresnelScale = EditorGUILayout.Slider("Intensity", WaterEditorUtility.GetMaterialFloat("_FresnelScale", oceanMaterial), 0.1F, 4.0F);
  107. WaterEditorUtility.SetMaterialFloat("_FresnelScale", fresnelScale, oceanMaterial);
  108. }
  109. displacementParameter.z = EditorGUILayout.Slider("Power", displacementParameter.z, 0.1F, 10.0F);
  110. displacementParameter.w = EditorGUILayout.Slider("Bias", displacementParameter.w, -3.0F, 3.0F);
  111. }
  112. else
  113. {
  114. Texture fresnelTex = (Texture)EditorGUILayout.ObjectField(
  115. "Ramp",
  116. (Texture)WaterEditorUtility.GetMaterialTexture("_Fresnel",
  117. oceanMaterial),
  118. typeof(Texture),
  119. false);
  120. WaterEditorUtility.SetMaterialTexture("_Fresnel", fresnelTex, oceanMaterial);
  121. }
  122. EditorGUILayout.Separator();
  123. WaterEditorUtility.SetMaterialVector("_DistortParams", displacementParameter, oceanMaterial);
  124. if (edgeBlend.boolValue)
  125. {
  126. GUILayout.Label("Fading", EditorStyles.boldLabel);
  127. fade.x = EditorGUILayout.Slider("Edge fade", fade.x, 0.001f, 3.0f);
  128. if (hasShore)
  129. fade.y = EditorGUILayout.Slider("Shore fade", fade.y, 0.001f, 3.0f);
  130. fade.w = EditorGUILayout.Slider("Extinction fade", fade.w, 0.0f, 2.5f);
  131. WaterEditorUtility.SetMaterialVector("_InvFadeParemeter", fade, oceanMaterial);
  132. }
  133. EditorGUILayout.Separator();
  134. if (oceanMaterial.HasProperty("_Foam"))
  135. {
  136. GUILayout.Label("Foam", EditorStyles.boldLabel);
  137. Vector4 foam = WaterEditorUtility.GetMaterialVector("_Foam", oceanMaterial);
  138. foam.x = EditorGUILayout.Slider("Intensity", foam.x, 0.0F, 1.0F);
  139. foam.y = EditorGUILayout.Slider("Cutoff", foam.y, 0.0F, 1.0F);
  140. WaterEditorUtility.SetMaterialVector("_Foam", foam, oceanMaterial);
  141. }
  142. serObj.ApplyModifiedProperties();
  143. }
  144. }
  145. }