OldBlueWater/BlueWater/Assets/StylizedWater2/Editor/HelpWindow.cs

660 lines
102 KiB
C#
Raw Normal View History

//Stylized Water 2
//Staggart Creations (http://staggart.xyz)
//Copyright protected under Unity Asset Store EULA
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.Build;
using UnityEngine;
using UnityEngine.Rendering;
namespace StylizedWater2
{
public class HelpWindow : EditorWindow
{
//Window properties
private static int width = 600;
private static int height = 520;
[SerializeField]
private Changelog changelog;
private bool underwaterExtensionInstalled;
private bool dynamicEffectsInstalled;
[NonSerialized] private string projectDetails;
private Vector2 projectDetailsScrollPos;
private const string HeaderImgData = "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
[MenuItem("Window/Stylized Water 2/Hub Window", false, 1001)]
public static void ShowWindow()
{
HelpWindow editorWindow = EditorWindow.GetWindow<HelpWindow>(true, AssetInfo.ASSET_NAME, true);
//Open somewhat in the center of the screen
editorWindow.position = new Rect((Screen.currentResolution.width / 2f) - (width * 0.5f), (Screen.currentResolution.height / 2f) - (height * 0.5f), (width * 2), height);
//Fixed size
editorWindow.maxSize = new Vector2(width, height);
editorWindow.minSize = new Vector2(width, height);
//Init
editorWindow.Init();
editorWindow.Show();
}
[MenuItem("Window/Stylized Water 2/Forum", false, 1002)]
public static void OpenForum()
{
AssetInfo.OpenForumPage();
}
private class Constants
{
public readonly GUIStyle sectionScrollView = "PreferencesSectionBox";
public readonly GUIStyle sectionElement = "PreferencesSection";
public readonly GUIStyle selected = "OL SelectedRow";
public readonly GUIStyle sectionHeader = new GUIStyle(EditorStyles.largeLabel);
public Constants()
{
sectionScrollView = new GUIStyle(sectionScrollView);
sectionScrollView.overflow.bottom += 1;
sectionHeader.fontStyle = FontStyle.Bold;
sectionHeader.fontSize = 18;
sectionHeader.margin.top = 10;
sectionHeader.margin.left += 1;
if (!EditorGUIUtility.isProSkin)
sectionHeader.normal.textColor = new Color(0.4f, 0.4f, 0.4f, 1.0f);
else
sectionHeader.normal.textColor = new Color(0.7f, 0.7f, 0.7f, 1.0f);
}
}
static Constants constants = null;
private void OnEnable()
{
AssetInfo.VersionChecking.CheckForUpdate(false);
AssetInfo.VersionChecking.CheckUnityVersion();
underwaterExtensionInstalled = StylizedWaterEditor.UnderwaterRenderingInstalled();
dynamicEffectsInstalled = StylizedWaterEditor.DynamicEffectsInstalled();
sections = new List<Section>();
sections.Add(new Section("Home", DrawHome));
sections.Add(new Section("Installation", DrawInstallation));
sections.Add(new Section("Integrations", DrawIntegrations));
//sections.Add(new Section("Extensions", DrawExtensions));
sections.Add(new Section("Support", DrawSupport));
}
private void Init()
{
HeaderImg = UI.CreateIcon(HeaderImgData);
}
public Texture HeaderImg { get; set; }
private Color defaultColor;
private delegate void OnGUIDelegate();
private class Section
{
public GUIContent content;
public OnGUIDelegate drawFunction;
public Section(string name, OnGUIDelegate drawFunction)
{
this.content = new GUIContent(name);
this.drawFunction = drawFunction;
}
}
private List<Section> sections;
private int _selectedSectionIndex;
private int selectedSectionIndex
{
get => _selectedSectionIndex;
set
{
_selectedSectionIndex = value;
if (_selectedSectionIndex >= sections.Count)
_selectedSectionIndex = 0;
else if (_selectedSectionIndex < 0)
_selectedSectionIndex = sections.Count - 1;
}
}
private Section selectedSection => sections[_selectedSectionIndex];
private Vector2 menuScrollPos;
private static Vector2 sectionScrollPos = Vector2.zero;
private void OnGUI()
{
EditorGUIUtility.labelWidth = width / 4f;
defaultColor = GUI.contentColor;
if (constants == null) constants = new Constants();
if (changelog == null) changelog = new Changelog();
if (EditorApplication.isCompiling)
{
EditorGUILayout.Space();
EditorGUILayout.LabelField(new GUIContent(" Compiling scripts...", EditorGUIUtility.FindTexture("cs Script Icon")), UI.Styles.H1);
EditorGUILayout.Space();
return;
}
Rect rect = EditorGUILayout.GetControlRect();
rect.x -= 3f;
rect.y -= 3f;
rect.height = 85f;
rect.width = width;
GUI.DrawTexture(rect, HeaderImg);
//float backgroundTint = EditorGUIUtility.isProSkin ? 0f : 1f;
//EditorGUI.DrawRect(rect, new Color(backgroundTint, backgroundTint, backgroundTint, 0.2f));
GUILayout.Space(-7f);
EditorGUILayout.LabelField("<size=26><color=#444444><b>" + AssetInfo.ASSET_NAME + "</b></color></size>", UI.Styles.H1);
GUILayout.Space(-5f);
EditorGUILayout.LabelField("<size=12><color=#444444><i>by Staggart Creations</i></color></size>", UI.Styles.H1);
GUILayout.Space(16f);
#if UNITY_2023_1_OR_NEWER
GUILayout.Space(4f);
#endif
if(sections == null) OnEnable();
#if !URP
UI.DrawNotification("The Universal Render Pipeline package isn't installed", MessageType.Error);
#endif
GUILayout.BeginHorizontal();
{
menuScrollPos = GUILayout.BeginScrollView(menuScrollPos, constants.sectionScrollView, GUILayout.Width(120f));
{
//GUILayout.Space(40f);
for (int i = 0; i < sections.Count; i++)
{
var section = sections[i];
Rect elementRect = GUILayoutUtility.GetRect(section.content, constants.sectionElement, GUILayout.ExpandWidth(true));
if (section == selectedSection && Event.current.type == EventType.Repaint)
{
constants.selected.Draw(elementRect, false, false, section == selectedSection, false);
}
if (GUI.Toggle(elementRect, selectedSectionIndex == i, section.content, constants.sectionElement))
{
selectedSectionIndex = i;
}
}
}
GUILayout.EndScrollView();
GUILayout.Space(5f);
GUILayout.BeginVertical();
{
//GUILayout.Label(selectedSection.content, constants.sectionHeader);
GUILayout.Space(5f);
sectionScrollPos = EditorGUILayout.BeginScrollView(sectionScrollPos);
selectedSection.drawFunction();
EditorGUILayout.EndScrollView();
}
GUILayout.EndVertical();
}
GUILayout.EndHorizontal();
}
void DrawHome()
{
using (new EditorGUILayout.VerticalScope())
{
UI.DrawH2("Thank you for licensing Stylized Water 2!");
EditorGUILayout.LabelField("This window houses common functionality and installation information.", EditorStyles.label);
EditorGUILayout.Space();
using (new EditorGUILayout.HorizontalScope())
{
if (GUILayout.Button(new GUIContent("<b><size=12>Write a review</size></b>\n<i>Support further development</i>", EditorGUIUtility.IconContent("Favorite Icon").image), UI.Styles.Button, GUILayout.Height(45f), GUILayout.Width(240f)))
{
AssetInfo.OpenReviewsPage();
}
}
EditorGUILayout.Space();
}
EditorGUILayout.Space();
using (new EditorGUILayout.VerticalScope())
{
UI.DrawH2("Extension assets");
DrawExtensions();
EditorGUILayout.Space();
}
EditorGUILayout.Space();
using (new EditorGUILayout.VerticalScope())
{
#if URP
UI.DrawH2("Quick set up");
using (new EditorGUILayout.HorizontalScope())
{
if (GUILayout.Button(new GUIContent("<b><size=12> Create water grid</size></b>", EditorGUIUtility.IconContent("Mesh Icon").image), UI.Styles.Button, GUILayout.Height(45f), GUILayout.Width(200f)))
{
StylizedWaterEditor.CreateWaterGrid();
}
if (GUILayout.Button(new GUIContent("<b><size=12> Setup planar reflections</size></b>", EditorGUIUtility.IconContent("ReflectionProbe Icon").image), UI.Styles.Button, GUILayout.Height(45f), GUILayout.Width(200f)))
{
StylizedWaterEditor.CreatePlanarReflectionRenderer();
}
}
GUILayout.Space(5f);
EditorGUILayout.LabelField("<i>These, and more, options can be found under GameObject->3D Object->Water</i>", UI.Styles.WordWrapLabel);
#endif
EditorGUILayout.Space();
}
}
void DrawInstallation()
{
//Testing
//AssetInfo.compatibleVersion = false;
//AssetInfo.alphaVersion = true;
//AssetInfo.IS_UPDATED = false;
using (new EditorGUILayout.VerticalScope())
{
EditorGUILayout.Separator();
//Version
using (new EditorGUILayout.HorizontalScope())
{
EditorGUILayout.LabelField("Asset version");
using (new EditorGUILayout.HorizontalScope(EditorStyles.textField))
{
if (AssetInfo.IS_UPDATED)
{
GUI.contentColor = UI.GreenColor;
EditorGUILayout.LabelField(AssetInfo.INSTALLED_VERSION + " (Latest)");
GUI.contentColor = defaultColor;
}
else
{
GUI.contentColor = UI.OrangeColor;
EditorGUILayout.LabelField(AssetInfo.INSTALLED_VERSION + " (Outdated)", EditorStyles.boldLabel);
GUI.contentColor = defaultColor;
}
}
}
UI.DrawNotification(!AssetInfo.IS_UPDATED, "Asset can be updated through the Package Manager. Please update any extensions as well!", "Open", () => AssetInfo.OpenInPackageManager());
changelog.Draw();
//Unity version
using (new EditorGUILayout.HorizontalScope())
{
EditorGUILayout.LabelField("Unity " + AssetInfo.VersionChecking.GetUnityVersion());
using (new EditorGUILayout.HorizontalScope(EditorStyles.textField))
{
if (AssetInfo.compatibleVersion && !AssetInfo.alphaVersion)
{
GUI.contentColor = UI.GreenColor;
EditorGUILayout.LabelField("Compatible");
GUI.contentColor = defaultColor;
}
else if (!AssetInfo.supportedVersion)
{
GUI.contentColor = UI.OrangeColor;
EditorGUILayout.LabelField("Unsupported");
GUI.contentColor = defaultColor;
}
if (AssetInfo.alphaVersion)
{
GUI.contentColor = UI.OrangeColor;
EditorGUILayout.LabelField("Alpha/beta", EditorStyles.boldLabel);
GUI.contentColor = defaultColor;
}
}
}
UI.DrawNotification(AssetInfo.compatibleVersion == false, "This version of Unity is not compatible." +
"\n\nPlease upgrade to at least Unity " + AssetInfo.MIN_UNITY_VERSION, MessageType.Error);
UI.DrawNotification(AssetInfo.supportedVersion == false, "This version of Unity is no longer supported. Any errors or issues will need to be resolved locally." +
"\n\nPlease upgrade to at least Unity " + AssetInfo.MIN_UNITY_VERSION, MessageType.Warning);
UI.DrawNotification(AssetInfo.alphaVersion, "Only release Unity versions are subject to support and fixes. You may run into issues at own risk.", MessageType.Warning);
using (new EditorGUILayout.HorizontalScope())
{
EditorGUILayout.LabelField("Target graphics API");
using (new EditorGUILayout.HorizontalScope(EditorStyles.textField))
{
string prefix = "Compatible";
#if !UNITY_2023_1_OR_NEWER //OpenGLES 2.0 no longer supported at all
if (PlayerSettings.GetGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget)[0] == GraphicsDeviceType.OpenGLES2)
{
GUI.contentColor = UI.RedColor;
prefix = "Incompatible";
}
else
#endif
{
GUI.contentColor = UI.GreenColor;
}
EditorGUILayout.LabelField($"{prefix} ({PlayerSettings.GetGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget)[0].ToString()})");
GUI.contentColor = defaultColor;
}
}
}
}
void DrawIntegrations()
{
UI.DrawH2("Scripting integrations");
//EditorGUILayout.LabelField("Scripting integrations", UI.Styles.H2);
//EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
using (new EditorGUILayout.HorizontalScope())
{
EditorGUILayout.LabelField("Dynamic Water Physics 2");
using (new EditorGUILayout.HorizontalScope(EditorStyles.textField))
{
if (StylizedWaterEditor.DWP2Installed) GUI.contentColor = UI.GreenColor;
EditorGUILayout.LabelField(StylizedWaterEditor.DWP2Installed ? "Installed" : "Not Installed", GUILayout.MaxWidth((75f)));
GUI.contentColor = defaultColor;
GUILayout.FlexibleSpace();
if (GUILayout.Button(UI.Styles.AssetStoreBtnContent))
{
AssetInfo.OpenAssetStore("https://assetstore.unity.com/packages/slug/147990");
}
}
}
UI.DrawNotification(StylizedWaterEditor.DWP2Installed, "Set up water data provider component", "Execute", StylizedWaterEditor.SetupForDWP2);
EditorGUILayout.Space();
UI.DrawH2("Shader integrations");
using (new EditorGUILayout.HorizontalScope())
{
EditorGUILayout.LabelField("Curved World 2020");
using (new EditorGUILayout.HorizontalScope(EditorStyles.textField))
{
if (StylizedWaterEditor.CurvedWorldInstalled(out var _)) GUI.contentColor = UI.GreenColor;
EditorGUILayout.LabelField(StylizedWaterEditor.CurvedWorldInstalled(out var _) ? "Installed" : "Not Installed", GUILayout.MaxWidth((75f)));
GUI.contentColor = defaultColor;
GUILayout.FlexibleSpace();
if (GUILayout.Button(UI.Styles.AssetStoreBtnContent))
{
AssetInfo.OpenAssetStore("https://assetstore.unity.com/packages/slug/173251");
}
}
}
EditorGUILayout.Space();
UI.DrawH2("Fog integrations");
foreach (ShaderConfigurator.Fog.Integration integration in ShaderConfigurator.Fog.Integrations)
{
if(integration.asset == ShaderConfigurator.Fog.Assets.None || integration.asset == ShaderConfigurator.Fog.Assets.UnityFog) continue;
UI.DrawIntegration(integration);
EditorGUILayout.Space();
if (underwaterExtensionInstalled && (integration.underwaterCompatible == false))
{
UI.DrawNotification("Editing of shader files for this asset is required to incorporate support for the Underwater Rendering extension. (See documentation section called \"Transparent Materials\")", MessageType.Warning);
}
}
EditorGUILayout.Space();
}
void DrawExtensions()
{
using (new EditorGUILayout.VerticalScope())
{
UI.DrawExtension("Dynamic Effects",
"Enables advanced effects to be projected onto the water surface. Such as boat wakes, ripples and shoreline waves.", dynamicEffectsInstalled,
"https://assetstore.unity.com/packages/slug/257865?aid=1011l7Uk8&pubref=sw2editor", UI.DynamicEffectsAssetIcon);
EditorGUILayout.Separator();
UI.DrawExtension("Underwater Rendering",
"Extends the Stylized Water 2 shader asset with underwater rendering, by seamlessly blending the water with post processing effects.", underwaterExtensionInstalled,
"https://assetstore.unity.com/packages/slug/185030?aid=1011l7Uk8&pubref=sw2editor", UI.UnderwaterAssetIcon);
}
}
void DrawSupport()
{
UI.DrawNotification(AssetInfo.alphaVersion, "You are using an beta/alpha version of Unity. You may run into issues at own risk.", MessageType.Warning);
using (new EditorGUILayout.VerticalScope())
{
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("<b><size=12>Documentation</size></b>\n<i>Usage instructions</i>", UI.Styles.Button))
{
Application.OpenURL(AssetInfo.DOC_URL);
}
if (GUILayout.Button("<b><size=12>FAQ/Troubleshooting</size></b>\n<i>Common issues and solutions</i>", UI.Styles.Button))
{
Application.OpenURL(AssetInfo.DOC_URL + "?section=troubleshooting-10");
}
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.Space();
using (new EditorGUILayout.VerticalScope())
{
UI.DrawNotification("Be sure to consult the documentation, it already covers many common topics", MessageType.Info);
EditorGUILayout.Space();
//Buttons box
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("<b><size=12>Forum</size></b>\n<i>Join the discussion</i>", UI.Styles.Button))
{
Application.OpenURL(AssetInfo.FORUM_URL);
}
if (GUILayout.Button("<b><size=12>Email</size></b>\n<i>Contact</i>", UI.Styles.Button))
{
if (EditorUtility.DisplayDialog("Email","Please be sure to provide your invoice number, so your license can be verified", "OK", "Cancel"))
{
Application.OpenURL(AssetInfo.EMAIL_URL);
}
}
if (GUILayout.Button("<b><size=12>Twitter</size></b>\n<i>Follow developments</i>", UI.Styles.Button))
{
Application.OpenURL("https://twitter.com/search?q=staggart%20creations&f=user");
}
EditorGUILayout.EndHorizontal(); //Buttons box
}
EditorGUILayout.Space();
if (projectDetails == null) projectDetails = GetProjectDetails();
EditorGUILayout.LabelField("Project details", EditorStyles.boldLabel);
projectDetailsScrollPos = EditorGUILayout.BeginScrollView(projectDetailsScrollPos, EditorStyles.helpBox, GUILayout.Height(200f));
EditorGUILayout.LabelField(projectDetails, UI.Styles.WordWrapLabel);
EditorGUILayout.EndScrollView();
using (new EditorGUILayout.HorizontalScope())
{
if (GUILayout.Button(new GUIContent(" Copy to clipboard", EditorGUIUtility.IconContent("Clipboard").image)))
{
EditorGUIUtility.systemCopyBuffer = GetProjectDetails();
EditorApplication.Beep();
}
EditorGUILayout.LabelField("Supplying this information is always useful!", EditorStyles.miniLabel);
//GUILayout.FlexibleSpace();
}
}
private static string GetProjectDetails()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendLine($"{AssetInfo.ASSET_NAME}: v{AssetInfo.INSTALLED_VERSION}");
stringBuilder.AppendLine($"Install location: {AssetInfo.GetRootFolder()}");
stringBuilder.AppendLine($"Unity version: {AssetInfo.VersionChecking.GetUnityVersion()}");
UnityEditor.PackageManager.PackageInfo urpPackage = AssetInfo.GetURPPackage();
if (urpPackage != null)
{
stringBuilder.AppendLine($"URP version: {urpPackage.version}");
}
else
{
stringBuilder.AppendLine($"URP version: NONE");
}
stringBuilder.AppendLine($"");
BuildTargetGroup buildTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
stringBuilder.AppendLine($"OS: {SystemInfo.operatingSystem}");
stringBuilder.AppendLine($"Platform: {EditorUserBuildSettings.activeBuildTarget}");
string scriptingBackend = string.Empty;
#if UNITY_2023_1_OR_NEWER
NamedBuildTarget buildTargetName = NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup);
scriptingBackend = PlayerSettings.GetDefaultScriptingBackend(buildTargetName).ToString();
#else
scriptingBackend = PlayerSettings.GetDefaultScriptingBackend(buildTargetGroup).ToString();
#endif
stringBuilder.AppendLine($"Scripting backend: {scriptingBackend}");
stringBuilder.AppendLine($"Color space: {PlayerSettings.colorSpace}");
stringBuilder.AppendLine($"Graphics API(s): (Auto:{PlayerSettings.GetUseDefaultGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget)}) {String.Join(" -> ", PlayerSettings.GetGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget))}");
stringBuilder.AppendLine($"Tessellation support: {SystemInfo.supportsTessellationShaders}");
string VRProvider = "";
#if XR && UNITY_2020_3_OR_NEWER
EditorBuildSettings.TryGetConfigObject(UnityEngine.XR.Management.XRGeneralSettings.k_SettingsKey, out UnityEditor.XR.Management.XRGeneralSettingsPerBuildTarget buildTargetSettings);
if (buildTargetSettings)
{
if (buildTargetSettings.SettingsForBuildTarget(buildTargetGroup).AssignedSettings.activeLoaders.Count > 0)
{
for (int i = 0; i < buildTargetSettings.SettingsForBuildTarget(buildTargetGroup).AssignedSettings.activeLoaders.Count; i++)
{
VRProvider += $"{buildTargetSettings.SettingsForBuildTarget(buildTargetGroup).AssignedSettings.activeLoaders[i].name} + ";
}
}
}
#endif
stringBuilder.AppendLine($"Active VR plugin(s): {VRProvider}");
stringBuilder.AppendLine($"");
stringBuilder.AppendLine($"First available fog integration: {ShaderConfigurator.Fog.GetFirstInstalled().name}");
stringBuilder.AppendLine($"Underwater Rendering installed: {StylizedWaterEditor.UnderwaterRenderingInstalled()}");
stringBuilder.AppendLine($"Dynamic Effects installed: {StylizedWaterEditor.DynamicEffectsInstalled()}");
#if URP
stringBuilder.AppendLine($"");
stringBuilder.AppendLine($"Depth texture option disabled (anywhere): {PipelineUtilities.IsDepthTextureOptionDisabledAnywhere()}");
stringBuilder.AppendLine($"Opaque texture option disabled (anywhere): {PipelineUtilities.IsOpaqueTextureOptionDisabledAnywhere()}");
#endif
stringBuilder.AppendLine($"");
stringBuilder.AppendLine($"Async shader compilation: {EditorSettings.asyncShaderCompilation}");
#if UNITY_2020_3_OR_NEWER
stringBuilder.AppendLine($"Caching Shader Preprocessor: {EditorSettings.cachingShaderPreprocessor}");
#endif
#if UNITY_2022_2_OR_NEWER
stringBuilder.AppendLine($"Strict shader variant matching: {PlayerSettings.strictShaderVariantMatching}");
#endif
string output = stringBuilder.ToString();
return output;
}
private class Changelog
{
private GUIStyle changelogStyle;
private string changelogContent;
private Vector2 scrollPos;
public float maxHeight = 300f;
public Changelog()
{
string changelogPath = AssetDatabase.GUIDToAssetPath("f07fbdad38458814a87e9b627e287ccb");
TextAsset textAsset = ((TextAsset)AssetDatabase.LoadAssetAtPath(changelogPath, typeof(TextAsset)));
if (textAsset == null) return;
changelogContent = textAsset.text;
//Format version header
changelogContent = Regex.Replace(changelogContent, @"^[0-9].*", "<size=18><b>Version $0</b></size>", RegexOptions.Multiline);
//Format headers
changelogContent = Regex.Replace(changelogContent, @"(\w*Added:|Changed:|Fixed:\w*)", "<size=14><b>$0</b></size>", RegexOptions.Multiline);
//Indent items with dashes
changelogContent = Regex.Replace(changelogContent, @"^-.*", " $0", RegexOptions.Multiline);
changelogStyle = new GUIStyle(GUI.skin.label);
changelogStyle.fontSize = 12;
changelogStyle.richText = true;
changelogStyle.wordWrap = true;
}
public void Draw()
{
if (changelogContent == null)
{
UI.DrawNotification("Changelog text file could not be found. It probably wasn't imported from the asset store...", MessageType.Error);
return;
}
scrollPos = GUILayout.BeginScrollView(scrollPos, EditorStyles.textArea, GUILayout.MaxHeight(maxHeight));
GUILayout.TextArea(changelogContent, changelogStyle);
GUILayout.EndScrollView();
}
}
}
}