// SSAO Pro - Unity Asset // Copyright (c) 2015 - Thomas Hourdel // http://www.thomashourdel.com #if !(UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_5_0) #define UNITY_5_1_PLUS #endif using UnityEngine; using UnityEditor; using System; using System.IO; using System.Text.RegularExpressions; public class SSAOPro_StartupWindowProcessor : AssetPostprocessor { static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { string[] entries = System.Array.FindAll(importedAssets, name => name.Contains("SSAOPro_StartupWindow") && !name.EndsWith(".meta")); for (int i = 0; i < entries.Length; i++) if (SSAOPro_StartupWindow.Init(false)) break; } } public class SSAOPro_StartupWindow : EditorWindow { public static string identifier = "TH_SSAO_Pro"; static string pathChangelog = "Assets/SSAO Pro/Changelog.txt"; static string pathImages = "Assets/SSAO Pro/Scripts/Editor/Startup/Images/"; Texture2D headerPic; string changelogText = ""; Vector2 changelogScroll = Vector2.zero; GUIStyle richLabelStyle; GUIStyle richButtonStyle; GUIStyle iconButtonStyle; Texture2D iconColorful; Texture2D iconChromatica; Texture2D iconSSAOPro; Texture2D iconLutify; [MenuItem("Help/SSAO Pro/About", false, 0)] public static void MenuInit() { SSAOPro_StartupWindow.Init(true); } [MenuItem("Help/SSAO Pro/User Manual", false, 0)] public static void MenuManual() { Application.OpenURL("http://thomashourdel.com/ssaopro/doc/"); } public static void FindAssets() { // Get the relative data path string[] results = AssetDatabase.FindAssets("SP_StartupWindow t:Script", null); if (results.Length > 0) { string p = AssetDatabase.GUIDToAssetPath(results[0]); p = System.IO.Path.GetDirectoryName(p); p = p.Substring(0, p.LastIndexOf('/')); p = p.Substring(0, p.LastIndexOf('/')); p = p.Substring(0, p.LastIndexOf('/')); pathChangelog = p + "/Changelog.txt"; pathImages = p + "/Scripts/Editor/Startup/Images/"; } } public static T LoadAssetAt(string path) where T : UnityEngine.Object { #if UNITY_5_1_PLUS return AssetDatabase.LoadAssetAtPath(path); #else return Resources.LoadAssetAtPath(path); #endif } public static bool Init(bool forceOpen) { FindAssets(); // First line in the changelog is the version string TextAsset textAsset = LoadAssetAt(pathChangelog); if (textAsset == null && forceOpen == false) forceOpen = true; // Changelog.txt hasn't been imported yet (???) else if (textAsset == null) return false; // Something's wrong, should never happen if (forceOpen || EditorPrefs.GetString(identifier) != GetVersion()) { SSAOPro_StartupWindow window; window = EditorWindow.GetWindow(true, "About SSAO Pro", true); Vector2 size = new Vector2(530, 670); window.minSize = size; window.maxSize = size; window.ShowUtility(); return true; } return false; } static string GetVersion() { TextAsset textAsset = LoadAssetAt(pathChangelog); string version = textAsset.text.Split('\n')[0]; return version; } void OnEnable() { FindAssets(); EditorPrefs.SetString(identifier, GetVersion()); string versionColor = EditorGUIUtility.isProSkin ? "#ffffffee" : "#000000ee"; changelogText = LoadAssetAt(pathChangelog).text; changelogText = Regex.Replace(changelogText, @"^[0-9].*", "Version $0", RegexOptions.Multiline); changelogText = Regex.Replace(changelogText, @"^- (\w+:)", " $0", RegexOptions.Multiline); headerPic = LoadAssetAt(pathImages + "header.jpg"); iconColorful = LoadAssetAt(pathImages + "icon-colorful.png"); iconChromatica = LoadAssetAt(pathImages + "icon-chromatica.png"); iconSSAOPro = LoadAssetAt(pathImages + "icon-ssaopro.png"); iconLutify = LoadAssetAt(pathImages + "icon-lutify.png"); } void OnGUI() { if (richLabelStyle == null) { richLabelStyle = new GUIStyle(GUI.skin.label); richLabelStyle.richText = true; richLabelStyle.wordWrap = true; richButtonStyle = new GUIStyle(GUI.skin.button); richButtonStyle.richText = true; iconButtonStyle = new GUIStyle(GUI.skin.button); iconButtonStyle.normal.background = null; iconButtonStyle.imagePosition = ImagePosition.ImageOnly; iconButtonStyle.fixedWidth = 96; iconButtonStyle.fixedHeight = 96; } Rect headerRect = new Rect(0, 0, 530, 207); GUI.DrawTexture(headerRect, headerPic, ScaleMode.ScaleAndCrop, false); GUILayout.Space(214); GUILayout.BeginVertical(); { HR(0, 2); // Doc GUILayout.BeginHorizontal(); { if (GUILayout.Button("Documentation\nComplete manual, examples, tips & tricks", richButtonStyle, GUILayout.MaxWidth(260), GUILayout.Height(36))) Application.OpenURL("http://thomashourdel.com/ssaopro/doc/"); if (GUILayout.Button("Rate it\nLeave a review on the Asset Store", richButtonStyle, GUILayout.Height(36))) Application.OpenURL("com.unity3d.kharma:content/22369"); } GUILayout.EndHorizontal(); // Contact HR(4, 2); GUILayout.BeginHorizontal(); { if (GUILayout.Button("E-mail\nthomas@hourdel.com", richButtonStyle, GUILayout.MaxWidth(172), GUILayout.Height(36))) Application.OpenURL("mailto:thomas@hourdel.com"); if (GUILayout.Button("Twitter\n@Chman", richButtonStyle, GUILayout.Height(36))) Application.OpenURL("http://twitter.com/Chman"); if (GUILayout.Button("Support Forum\nUnity Community", richButtonStyle, GUILayout.MaxWidth(172), GUILayout.Height(36))) Application.OpenURL("http://forum.unity3d.com/threads/ssao-pro-high-quality-screen-space-ambient-occlusion.274003/"); } GUILayout.EndHorizontal(); // Changelog HR(4, 0); changelogScroll = GUILayout.BeginScrollView(changelogScroll); GUILayout.Label(changelogText, richLabelStyle); GUILayout.EndScrollView(); // Promo HR(0, 0); GUILayout.BeginHorizontal(); { GUILayout.FlexibleSpace(); if (GUILayout.Button(iconColorful, iconButtonStyle)) Application.OpenURL("com.unity3d.kharma:content/44845"); if (GUILayout.Button(iconChromatica, iconButtonStyle)) Application.OpenURL("com.unity3d.kharma:content/20743"); if (GUILayout.Button(iconSSAOPro, iconButtonStyle)) Application.OpenURL("com.unity3d.kharma:content/22369"); if (GUILayout.Button(iconLutify, iconButtonStyle)) Application.OpenURL("com.unity3d.kharma:content/46012"); GUILayout.FlexibleSpace(); } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); } void HR(int prevSpace, int nextSpace) { GUILayout.Space(prevSpace); Rect r = GUILayoutUtility.GetRect(Screen.width, 2); Color og = GUI.backgroundColor; GUI.backgroundColor = Color.black; GUI.Box(r, ""); GUI.backgroundColor = og; GUILayout.Space(nextSpace); } }