2025-07-08 10:46:31 +00:00
//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 UnityEditor.Rendering ;
using UnityEngine ;
using UnityEngine.Rendering ;
#if URP
using UnityEngine.Rendering.Universal ;
#endif
namespace StylizedWater2
{
public class HelpWindow : EditorWindow
{
//Window properties
private static readonly int width = 600 ;
private static readonly int height = 620 ;
[SerializeField]
private Changelog changelog ;
private bool underwaterExtensionInstalled ;
private bool dynamicEffectsInstalled ;
[NonSerialized] private string projectDetails ;
private Vector2 projectDetailsScrollPos ;
[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 ) ;
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 Texture m_HeaderImg ;
private Texture HeaderImg
{
get
{
if ( m_HeaderImg = = null )
m_HeaderImg = UI . CreateIcon ( "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
return m_HeaderImg ;
}
}
private Texture m_ReviewIcon ;
private Texture ReviewIcon
{
get
{
if ( m_ReviewIcon = = null )
m_ReviewIcon = UI . CreateIcon ( "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAD0ElEQVRYCb1XaWxMURT+ph2GqUpF2libNtQyQlClIQSR1JYgokSkPyxVS/1C/KA/CJFUxBaRWEIJIVEk+FGSirYSZUgItYWOEkuVGqP7tL7zdKZ3xps3ozPpSb73zj33nu/cd+57595naruDiIhpemg0ajzxMamG0Ci8o9KolRE1hOgfiP8W8397dDgcoNqN6Ff0AGUZWzCBenVHt76mPnA4GZhO+mI1xLRN2Mf2FtWm6ncPAW1tTLlJtQKdzUCuLw2QlYHMNfnYT/sn/z5P2z94ZzMwnoR2D6nnXtcAd2o2trItk/CRioK/zUhlYJMPe3vD2gPRGxYhJ/cgjtP0S29MJDKQSGKHHrnYqmvRmJiJHKqnpS1SX/T3Lle9DER1dIekrTMaFR8Hy+al2NjQhCgCAlXCzcAgkr0ieqqk/nrlZ9QlL8MS2m+qn5yM08uAXiGSAMnEYGIoMbZdl++8LxFUPtXA2b8vznDgS+I1UUW8IxoIr3i+Agst6cQ2Io6wEb2JiEprK5xcgmdEJYm/ETJBu2RgJ5W1RALRZeKqhzN2DtLkJaz+7kRLl0VuD1T1FSaqe6LLK1BeWALXwqnI6G5GdFdM5MsPNE7MwSMWL4fpQp435KQFU1Da09Lp8uwlMlJqnGgauwoPP1Rru+cq7/fKb/b+xWLMbGqG24ggnL5aF5pT12jBZb+Q984VZbUACkqulmJ2ixut4QTS8/1Vh+bJG2B3fMFX9mcTtTJOzYBWuZiJ2+dvY4EUjUhJfSPc6ethr3Bo5wWppt893FEWHil0cP1SMRZ7BoVz55K2Ts2F/XklfpBH0v5Z5TNPkrKjL4Usq8eS+mmbi/6IEKyHC+Gwv9LSLZuUrL2PmBnASGTWYUlTi/Y+yYngvR6RFCIjCZwfIy+lz5aEGDYDFrpgExiicHVKTUxADzomBXI2OhPK4owK5BiqPbk/Ynhakp1VV4wyMJIeUq/Dkrhe6JZug41l10zAH0YTSAkW+elbOF+81z//qb5DBmg7bbJq8+hGExjtGeR///kbzavz8WzMSjwamYWCvFO4wycLWMJHJMJKjgH+PNI2msA/6y8levdZvImbh7KTN/CG/rKVbdxVgBkxszH3yBXtyCa8PjIuBbE06L4HRhOIV1nO3cLHPvNRuv0kKmk/SiwkSgjsyJIrig5dxvBhK5Bzrcy32sVatW1+uDbK/yIHxwDYRntb6RF8GzoQ9+gnv2LyR2QhgknMrFTkPz6BWuHgX9MTOvzzwxKMRPqXExJ4L+GTEba90p4BpPDcLFBEWvwr1DgmK3av+gf86jED3McCCAAAAABJRU5ErkJggg==" ) ;
return m_ReviewIcon ;
}
}
private Texture m_DocIcon ;
private Texture DocIcon
{
get
{
if ( m_DocIcon = = null )
m_DocIcon = UI . CreateIcon ( "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEzklEQVRYCbVXTUhjVxR+L8nExtHEn6KtadMZ7DCLQVtShC5MRYrVYkFEQUUQxYWLrkRdjGhVxFIcLUPp1k0XrlwquKiVUFroDJV2OiJjFVRSicaf4kz+TGLmO7fvPl7eezeNZXrhcs89f/fknPPd+yLv7+9LZiOdTjO2LMtmYgOP63N/DocjQ2dtbS1jzzcyN+AMZf0eDutB4/ycIngOfRv0/ZifKj5yWsjIbLyJcy3RaDR5dXVFUZjpMB4OTttstpt5eXkWMJr29vYCWN8SGugEogBeJz2v1/tzJBJ5AfIKUxjF9PT0uz09PXeXlpYCDQ0NZeFw+AT6zAfWrEMUQJSshoeHPV1dXQ/z8/MzC6pxiezsIUudYN1dX18/Gxoa+gpl/fbo6Ohv8Io0qqakDRk0E7ygtPf399+C8KGZAueRPS+R2+3OA/8R9nfKy8v/PDk5ucDeyXXNVlEGmNHc3Nx2MBi8dLlcIj1pZ2cn2tvb666vry+zWCxUpjKPx/N4YGDg/dHR0d9CoVDWIGw8el109EukhYWFIHrga5CnmIXEMxsTExPN4H+u+GK9gv75fXV1tbqpqenJ8fHxc8hN7WV0rZnPp3B2z0xwTV4QJXLAl2txcfEJbN/T24syQJCSUMNYKpWSkFq9nbqntBNcz8/PE8XFxXZcQFY0JWusRCLhQgPLRUVFUjKZdI6Pj/fA8DvVGISotqWk5PP5HqEEQZApTHEU//ghuJ5jlmDexExiSlNTU3fQI15kgkpjJZ52iAKIkNLY2Nittra21dcwtEZEwyEdgOzKeqfUdHz8BT3qJ6/CMNwlIhiG4Vjq7u72wPBL7k27kjyXwfUQCJXFgHlRBtgFMjg4+Mfh4eElaqvqAVaJyspKx+zs7D30SBwIeFZYWGi12+2GEm1vb0f6+vrcjY2NbyAQitgYAI9Q92tu0B4wOkcP3AdJV6sKI9wLdDVvxGKx5PLy8jPQDzDzMZkdVnXMzMx8gs2IwjCkTVSCEAIr29ra+giGP6nedMTFxQX1AfXLY52IbRWIf6CRGQMQZICl8/T0NK5/DamUVqtVLikpsSs3H3U/G4I7hYtNV7W2OimDYW1t7S8oQQiyDBiWlpZaNzY2WgsKClQEZDmcyiUcogAYDNFgt1tbW39Ag9m5B2QsDJqwLjmdTvv8/Lyvvb39ATKjBqPRPQZNZRQOUQ8wGHZ2dr4Ny0mRNQK4gcOrIa8WlFI1/U8wxPfA00AgEEfKDd3Nr1ulD9SDtMTm5mZ4ZGTknebm5goEeH0YrqysEAxH4TQDhppDOK4N3c11ampqPgP9hbI36IlKwGHog+GP3FkO6yVSza5oRZcakD3tSgmMAQhqxxrq4OAgjBctDdhlPRvOJbya6YqKCgdeP7qQRMOACBEKWJfjCv0VJdiFN/pV2aPANYtbsaGqqsojOt2MLwqAwXBycvJ2S0uLH4+hCkMzJ8gA/TJ6ij80k2fjiXqAwbCjo4NgOJ7NAckEZfw3MyY3vGA5Wb1CJdEnWYzOiMfjqVdwlkz/mvBJxiGb4dIGQQZD2XxcV1f3Db71KnHRxM0UrsPDXzf57OyMmtjwgwy41Dim7zpqUgN0NDrXISkAekcSWiN5d3dX3eNXS36/n+3x1aPy/0/iJfpMtnfwrhsgAAAAAElFTkSuQmCC" ) ;
return m_DocIcon ;
}
}
private Texture m_FaqIcon ;
private Texture FaqIcon
{
get
{
if ( m_FaqIcon = = null )
m_FaqIcon = UI . CreateIcon ( "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFRklEQVRYCa1XXyykVxT/vjEo1qKxSUuxiSUxTUtS3T5oMgm7NmM3EtKkL0v6sjw0G2lVmj548lCLCtG0kRINb4ZGttXSbiTYJbPjT2xaFqNhsBjs6CzKjD/9nc93ufPNmD/Sk5w5/++937nnnntHnJ+fFwgSEhIkyn7MZrMgiqIkHh0dCUFBQcLBwYFAvBKY3/HxsaBSqYSdnR0hNDRUcqOYmZkZp5CRkZFTWaSJ4uLihIWFBWkRPCUvGlCtVhN7BYPdwQK04DXAGGAI8BAL2ASdwwIM8O8Bb6TFrK+vC1FRURAFobe3V6Lsp6KiQmJFcmSwuLgoLYZk4mW4hkm/AH8XE4UxpSe6u7s7igw8gI+ez0BnZ6dTWHl5uSDSFlD6+S9nMry/BH6NiU/2wincu4AMGJGBj+BpPs/bKQOcUwC25mfIOk53IRYZcKAG7iK43d0AUgbcGAz46Otu9BdWdXd3f4bgOuUAIqVeAX9AvqHQOYlra2t7JpPp1crKyj7gKCIiQp2cnHwJeNnJUSGg8D6GyikTygV8DodvFHGSaLPZHIODg+sdHR2Wvr6+LShXgCbgGtAODNfpdBmlpaU3k5KSwiG7AGpiPz09PQmG0wrnt+BNpP2FS5SsmJub287MzHwE8TGQsvSMCpjVJ9dHNKOjo0PR0dERcqgTaW1t/ROKd5iSX0ALBvuEGdxRfN1v0OfU1taSWYvjmYoYahIDQKm7yMf6NvS/kJMSDg8PjzMyMoqh/4Fs4tTUFNHwkJCQLQSpSDgPkIVX2PMfU1JSdPC9xvsNDAzcg9yUlZVF6isOh8PC23m+oaHBVFNT8y50/6qoZQLzvE1OAyQmJoZrNJr7ysnJNjk5+VVBQcH1mJgYAVk4625kVEBOTs4bUN0hNftij1WviHcRNzY29pqbm6koE8mINL/t4sQp4uPjQyFmk4otQMPZ/WKnp6dt+KJRi8WyjMBuCkZtVHsaBHbK0FXyUVG2gJQSvwEXzGp2dvYY+sIEgouANpyMh9ii9z0NhgyRWfqhCiagW80vMBqNm0VFRc8RRCejamlpKRkD94NP9XGgkwVgteR/4GOQ5EYpLCkpmYZgAFahm76HyR+Df01y8OOH1YDVjxi65/eXl5f3EVMlx9WD+j05xbIFUEv1GQICAkStVmvHmyEJ+AEC43wOhmNgYCCbV1DLR5Zuv9u+DoI2G4yWegtbccvXGN5ve3vbATmIdOwU6HkHX3m8/fyqHTbu8PDwJngbySp6MgGf2+32SebgjW5tbdkLCwvH0tLSnmArHo2Pj/tVQ01NTdQzhmkeFb12ZaQHg0/Q1dX1or+/fwGL/hTnXre6uip1NV+CabG4Lbfh+xP5q/E1LO53ME8jIyO9voRQL3R2HwL/kh+v/6Ae2DgeaVlZGR3fMeDf5KjGLUiUwU1shxXP8NMqZQae5ufnx+BFJN2GKOLXgd/x9vP4+vp60+zs7B7sNcxHHBoaYjyjN2JjY+nB4RVwNZuDg4Mj4XjZmzO1bblzfgvfTuYvNjY2Mp6nxejx3+NPhtQmecNF+J6enpXi4mJKfQ/wAT+GWn6Q8DriG6G35ubmNuMNcElp9EeWHx9LiPkV6HJLevvCq5WVlXosJDUsLCzQn4lx1jeqq6vn5YqnGnHba0R8odDW1uY0dnt7uyTX1dXRK4j4ory8vPs4829RRuRT4BRDgtVq3TcYDC/1er0FtUWNhi6oFqBU8aAucJoBZS1gz5TOYVBQ6/0QSCcgAOgOXkL5FEiFTNe1RxAnJugtcQItLbTYM+AyIOBBemb4H7n/AIKWOUx2b5M6AAAAAElFTkSuQmCC" ) ;
return m_FaqIcon ;
}
}
private Texture m_DiscordIcon ;
private Texture DiscordIcon
{
get
{
if ( m_DiscordIcon = = null )
m_DiscordIcon = UI . CreateIcon ( "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAElElEQVRYCb1WbUxbZRS+t7TMQfnoYMIYA8rKwkLWaSTMqH80+7FFs8wM94FfhGXZD0O2337Fjx9qdFmMxsQtatTMMZdoZh1uEswWzOLClH1RGbD2Im3pQCylXytbW59z6VvfW+6FgoyTPL3ve85z3ve85557+oq7900K85XBPz8XLOtb5nSLx6cEnS47xTv97UOpMRuICwmAOc/n6Ru/KtPPfveYwk2nmGU4oQxkIpQBJqYiq0CgA5uKNwp5BTUyljwDLCDKBAWhZ4r5PBdSA3R6vgZo84B/QMg0A/kIcBPwBNAB/AJoyXswuIBOwM5IWjUwVwA7sMAeYAuQS4vdvRPySYMnDuIr+AfTAoDq6DZwC6gDPgFkQQ0M4iv4BpPjQN+0Vvk7WwAXQW1Q0hc+QwZegncqOLaSVg28AsKibU6bFa6o+7j9ZIMDwzM0Z6KWgWIYxxhhMZ8u6UfPrx1Na7EmvTJZ1DLwLjMu9rO86qky9IBXsS5BlvRGZIJ2b9J2Tx7rrQeafX9fKQIEQnoA93RzOtEa8/ayZfcVtQACYckDEHV6sXJt4wvR2+PLAEUAFgRYq5V3x42vhn87t/9af++nkhZncqI/0N3V2tvddaA34L8Z1OKtqthyP2zyvxJfhJu1HPqufui4fPG1v2BvkwaOXzMYjHvN655t4fnhkCvSfrL+d+j6gWM3+77QPf2804Y0G3kejVcUP0AN7FGgkw+gnozpEo9FY8nNj8JGXU2otDxzAV2uEV2OWrQszhvH3Bi4gP2kSP7Nv40htWaFZGcXGKCwkpIPwKxgJSeJRJxGUUDenLs/hKFLBRCLRYl4CuCF/GZIPH4nASVlQVEDZTOYUGTpl2fVWltLAXYqotF/QykNmFRZdq7CWL4AcEHO9lXJXD4D1ANUZWPDW1bP8M+HYTwCPJh8Krj5ptq8zds6DheXbJJgEIE3gA3ArMIH8N/lLc1FFLPE1RVbD0JN0BRsXg3jFU2CioHvA/Rellz4AOT/+/QIgpOOkHuo3Zuun2se8A8G3UOn4TfzXFRXzJ9/Bc2xu5GvYeR1eJs6wevqvD4+2n02x7jm8ZWlDxfmGity9AajkickEpGwN0rNaNTTNTE+dilgrmnCRmIJNqOaSMktz3n6t80hhbiy9JGUAYPtqPaPVlc+Wc4raRwKDNlsbRvewbBOb8itN+aZLWgyhaIuS8QtKR4OuqbCITd9dl7YnY3NIy+THy+R8EjE3nPIOWA/Mgp9F/C6IrIkOb+8atubVTW7dqHwStC75dd0/syOnpHhDuoFHyR51Ezo7sBfy+iaNrF7n58oP+F89LkKwYAUcvR96bZfPuTBdAT4DKA74/SltO1ovsAyMea9QHqSanxaL1ave65pasoft/e8T86twHUyagnXA0wuydYuDZxY7pJ+8IHvBL4HbLyv4kZEgZAgAwKcGK8Qg60Adb5TTJnhMw+8PcAl4A81n/QaELgMCMiAMOmbeZnFO6bbsdp6so5lgR1Ik0gGRuZJlIH/I8kayGgJucAoCKoBVgcs/ZSB+cr0gUTVg6mtlUkNqPktmu5fRzyST440lD0AAAAASUVORK5CYII=" ) ;
return m_DiscordIcon ;
}
}
private Texture m_ForumIcon ;
private Texture ForumIcon
{
get
{
if ( m_ForumIcon = = null )
m_ForumIcon = UI . CreateIcon ( "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" ) ;
return m_ForumIcon ;
}
}
private Texture m_TwitterIcon ;
private Texture TwitterIcon
{
get
{
if ( m_TwitterIcon = = null )
m_TwitterIcon = UI . CreateIcon ( "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAE5ElEQVRYCZ3VW2iWdRzA8b1LnTs4U9FVzra5bB6W6WblYaQkREE3ItGBJLyNCC8CFSHspi666EZCKUiHnYSioReeJhqIWrrNLRPncu82dWpzraZTc4e+35f3Eba9h2f+4MOz932e9////f7/3/NfJCMjIxM5mIAIgvDvobj7XG9jEA8TjuX42XC+u7gDx88owCeI4kZcD9d/4PUKfsJCPIKxhpNPwXrUowUfYSYyHfA/WN1KlCAXfj8OZj0Jfj8HDehCLHOuYcLVfRkf4yk4nyv5N9qdyA9WqmfhMrWiCZfQh2lwpVy+39GLsGHyn6EMzuHvj2IvuoMlNSsrm4F5uIUvsB2/oDTuca4XYWL2RbpwFefidYzHOdRiF65jVDjRfrg8ZlgOV2QV6mDznMBSOHiqsLhF2IMo/N2nKEIEsQhWIPhsZ3biBbhfrkoTzNYKHLAQ7utZuKSJwgmexgaswnlYgJW7vW57LEYm0M+3dn8WSjAZZn4ZUdi5JmYV3eiADTwEw4lt2mV4B69hIqL4ChYzbOtGJsD9WNM1ch3ASviDP3ENJuOWVMJ7VuK9XphEPt7ENlShDTbdbziMfxE6yniyAZ4D78PBDRv1c7j8nhubMBVWuhYu9z24OjVYB1clYSRageBBB3QbKmAyF9AOq7XquXE+Y6VPYDPmweT+wD78iKSVp0qgjx9ehWeDkxXAxrMxfU1vYjGKUQ4b16tvSjMO4nv4XNJIlYB76kSeEQ4+Gw7eCCsykSwsgfeehA3Zglp8A5vXcZJGqgT8kZPbA4/CiXy1/OwkJuGB5JsxB07k94fwHdymAaSMdAn4Y6t27518PmbB/e2EFXt9Bo/BV/NbnIbJp40wCViZE9l8z6MU41AHT0wbzsm8Z5/4nPe8po0wCThIP64hggqUwS1wJbx2IA9uk/c8zM7D1UsZYRNwEAfzrbDzfSuKYA+4PTarveE2mYAN2QwTM/mkMZYEPAGr8CpsvCmwavfbV80lt3LfmGJ4zxPQbUoaYRPIYoTl+BCVsLvHw8Yz6uFWuE2DWApfTatvRB8SRpgEbLiF8JR7EW5FK9wOE3Ar/kILTKITNqNvhvfcBp/3f8qoSJdAJr+wki14BVZ0EUdQg0KUYjpcheuwH7rgSvmfcyrOwO+GMCzSJWAlG7EGJuPhcgq7cBL+M6qCSebiV/haOpnXFbAh7Y1zGLUVqRKwqg+wDjaUy+j7/TUacAcu/QRYrUm4PU5kQ5rcRLgV9kwtTGRYJEsgn6es+l24pDaXe7wTrkBwyvlv1y1xYA+iJTDxswj6wt8vg8l4bpj4g0iUQA53V+M93EcHfkA1rNwqg3BPrdatuQ23w4Z1O+x+G9UJ34AJ9uMCHiQxMgGX0we3YgHacBA1cBIHSBR9fOlZUIr5mIXLuAR/4/ZUoBBBYgP8PSxMxuwPwAwdcA8cMBPpwtfVsyLoj2P8vRieIc/hONyqn2GisQhWIMKnYmzFSzA7l8pX6yhc5nQxyAOeej1wFa26AM24AYvy+xI4n81qf8Q++HA1HMC9tIrtKIeVhQ0HLsIOdMNJbeCO+NXmtTiTegt5rsA0vI21yEY7mvAlzNJGHEu4Wm1wO2ciPy6Hq03rSvlaz0CTCdyDzeL+eL63YjdOwwrGGk7ShRPwbxvUVbgCVyIavzp29v/0qmv/9is4ZAAAAABJRU5ErkJggg==" ) ;
return m_TwitterIcon ;
}
}
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 ( ) )
{
GUILayout . FlexibleSpace ( ) ;
if ( GUILayout . Button ( new GUIContent ( "<b><size=12> Write a review</size></b>\n<i> Support further development</i>" , ReviewIcon ) , UI . Styles . Button , GUILayout . Height ( 45f ) , GUILayout . Width ( 240f ) ) )
{
AssetInfo . OpenReviewsPage ( ) ;
}
GUILayout . FlexibleSpace ( ) ;
}
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 ( ) ;
//Unity version
using ( new EditorGUILayout . HorizontalScope ( ) )
{
EditorGUILayout . LabelField ( "Unity " + AssetInfo . VersionChecking . GetUnityVersion ( ) ) ;
using ( new EditorGUILayout . HorizontalScope ( EditorStyles . textField ) )
{
if ( ! AssetInfo . supportedVersion | | AssetInfo . outdatedVersion )
{
GUI . contentColor = UI . OrangeColor ;
EditorGUILayout . LabelField ( "Unsupported" ) ;
GUI . contentColor = defaultColor ;
}
else if ( AssetInfo . compatibleVersion & & ! AssetInfo . alphaVersion )
{
GUI . contentColor = UI . GreenColor ;
EditorGUILayout . LabelField ( "Compatible" ) ;
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 . outdatedVersion , "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 ) ;
UI . Unity6Message ( ) ;
//Version
using ( new EditorGUILayout . HorizontalScope ( ) )
{
EditorGUILayout . LabelField ( "Asset version" ) ;
using ( new EditorGUILayout . HorizontalScope ( EditorStyles . textField ) )
{
if ( AssetInfo . VersionChecking . UPDATE_AVAILABLE = = false )
{
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 . VersionChecking . UPDATE_AVAILABLE , "Asset can be updated through the Package Manager. Please update any extensions as well!" , "Open" , ( ) = > AssetInfo . OpenInPackageManager ( ) ) ;
changelog . Draw ( ) ;
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 ) ;
if ( integration . asset = = ShaderConfigurator . Fog . Assets . COZY ) UI . DrawNotification ( "For COZY version 3.0+, an integration package comes with the asset, which must be unpacked. This contains pre-edited shader files." ) ;
}
}
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 ( new GUIContent ( "<b><size=12> Documentation</size></b>\n<i><size=11> Usage instructions</size></i>" , DocIcon ) , UI . Styles . Button ) )
{
Application . OpenURL ( AssetInfo . DOC_URL ) ;
}
if ( GUILayout . Button ( new GUIContent ( "<b><size=12> FAQ/Troubleshooting</size></b>\n<i><size=11> Common issues and solutions</size></i>" , FaqIcon ) , 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 ( new GUIContent ( "<b><size=12> Discord</size></b>\n<i><size=11> Access support</size></i>" , DiscordIcon ) , UI . Styles . Button ) )
{
Application . OpenURL ( AssetInfo . DISCORD_INVITE_URL ) ;
}
if ( GUILayout . Button ( new GUIContent ( "<b><size=12> Forum</size></b>\n<i><size=11> Join the discussion</size></i>" , ForumIcon ) , UI . Styles . Button ) )
{
Application . OpenURL ( AssetInfo . FORUM_URL ) ;
}
if ( GUILayout . Button ( new GUIContent ( "<b><size=12> X</size></b>\n<i><size=11> Follow developments</size></i>" , TwitterIcon ) , 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 ( ) ;
using ( new EditorGUILayout . HorizontalScope ( ) )
{
EditorGUILayout . LabelField ( "Project details" , EditorStyles . boldLabel ) ;
if ( GUILayout . Button ( "Refresh" , EditorStyles . miniButton ) )
{
projectDetails = GetProjectDetails ( ) ;
}
}
projectDetailsScrollPos = EditorGUILayout . BeginScrollView ( projectDetailsScrollPos , EditorStyles . helpBox , GUILayout . Height ( 300f ) ) ;
EditorGUILayout . LabelField ( projectDetails , UI . Styles . WordWrapLabel ) ;
EditorGUILayout . EndScrollView ( ) ;
using ( new EditorGUILayout . HorizontalScope ( ) )
{
EditorGUILayout . LabelField ( "Supplying this information is always useful!" , EditorStyles . miniLabel ) ;
if ( GUILayout . Button ( new GUIContent ( " Copy to clipboard" , EditorGUIUtility . IconContent ( "Clipboard" ) . image ) ) )
{
EditorGUIUtility . systemCopyBuffer = projectDetails ;
EditorApplication . Beep ( ) ;
}
}
}
private static string GetProjectDetails ( )
{
StringBuilder stringBuilder = new StringBuilder ( ) ;
stringBuilder . AppendLine ( $"Version: 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}" ) ;
#if UNITY_6000_0_OR_NEWER & & URP
stringBuilder . AppendLine ( $"GPU Resident Drawer: {UniversalRenderPipeline.asset.gpuResidentDrawerMode != GPUResidentDrawerMode.Disabled}" ) ;
#endif
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 & & buildTargetSettings . SettingsForBuildTarget ( buildTargetGroup ) )
{
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 ( "Render features (on default renderer):" ) ;
ScriptableRendererFeature [ ] rendererFeatures = PipelineUtilities . GetDefaultRenderFeatures ( ) ;
for ( int i = 0 ; i < rendererFeatures . Length ; i + + )
{
stringBuilder . AppendLine ( $"• {rendererFeatures[i].name}" ) ;
}
#endif
#if URP
stringBuilder . AppendLine ( $"" ) ;
stringBuilder . AppendLine ( $"Depth texture option disabled (anywhere): {PipelineUtilities.IsDepthTextureOptionDisabledAnywhere()}" ) ;
stringBuilder . AppendLine ( $"Opaque texture option disabled (anywhere): {PipelineUtilities.IsOpaqueTextureOptionDisabledAnywhere()}" ) ;
#if UNITY_2022_2_OR_NEWER
stringBuilder . AppendLine ( $"Depth Texture Mode, after transparents?: {PipelineUtilities.IsDepthAfterTransparents()}" ) ;
#endif
#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
stringBuilder . AppendLine ( $"" ) ;
string defaultShaderPath = AssetDatabase . GUIDToAssetPath ( "d7b0192b9bf19c949900035fa781fdc4" ) ;
Shader defaultShader = AssetDatabase . LoadAssetAtPath < Shader > ( defaultShaderPath ) ;
if ( defaultShader ! = null )
{
ShaderMessage [ ] shaderMessages = ShaderConfigurator . GetWarningsAndErrors ( defaultShader ) ;
#if UNITY_6000_0_OR_NEWER
//ConsoleWindowUtility.GetConsoleLogCounts(out var errors, out var _, out var _);
#endif
List < string > errorMessages = new List < string > ( ) ;
List < string > warningMessages = new List < string > ( ) ;
if ( shaderMessages ! = null )
{
foreach ( var t in shaderMessages )
{
string message = $"• {t.message} {t.file}:{t.line} ({t.platform})" ;
if ( t . severity = = ShaderCompilerMessageSeverity . Error )
{
errorMessages . Add ( message ) ;
}
if ( t . severity = = ShaderCompilerMessageSeverity . Warning )
{
warningMessages . Add ( message ) ;
}
}
}
stringBuilder . AppendLine ( $"Shader compile warnings ({warningMessages?.Count ?? 0}):" ) ;
foreach ( var t in warningMessages )
{
stringBuilder . AppendLine ( t ) ;
}
stringBuilder . AppendLine ( $"Shader compile errors ({errorMessages?.Count ?? 0}):" ) ;
foreach ( var t in errorMessages )
{
stringBuilder . AppendLine ( t ) ;
}
}
else
{
stringBuilder . AppendLine ( $"Water shader failed to compile entirely" ) ;
}
return stringBuilder . ToString ( ) ;
}
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 ( ) ;
}
}
}
}