2025-07-08 10:46:31 +00:00
//Stylized Water 2
//Staggart Creations (http://staggart.xyz)
//Copyright protected under Unity Asset Store EULA
#if SWS_DEV
#define ENABLE_SHADER_STRIPPING_LOG
#endif
using System ;
using System.Collections.Generic ;
using System.Diagnostics ;
using System.IO ;
using System.Linq ;
using System.Text ;
using UnityEditor ;
using UnityEditor.Build ;
using UnityEditor.Rendering ;
using UnityEngine ;
using UnityEngine.Rendering ;
using UnityEngine.Serialization ;
using Debug = UnityEngine . Debug ;
using Random = UnityEngine . Random ;
#if URP
using UnityEngine.Rendering.Universal ;
#endif
namespace StylizedWater2
{
public static class ShaderConfigurator
{
public static class Fog
{
public enum Assets
{
None ,
[InspectorName("Default Unity")]
UnityFog ,
#if SWS_DEV
[InspectorName("Colorful Sky")] //Unreleased
Colorful ,
#endif
[InspectorName("SC Post Effects (Screen-Space Fog)")]
SCPostEffects ,
[InspectorName("COZY: Stylized Weather (v1+2+3)")]
COZY ,
[InspectorName("Buto (2021 + 2022)")]
Buto ,
AtmosphericHeightFog ,
[InspectorName("Enviro - Sky & Weather")]
Enviro ,
[InspectorName("Enviro 3 - Sky & Weather")]
Enviro3 ,
[InspectorName("Azure[Sky] Dynamic Skybox ")]
Azure
}
[Serializable]
public class Integration
{
public string name ;
public Assets asset ;
public string libraryGUID ;
public string url ;
public bool underwaterCompatible = true ;
public string thumbnailBytes ;
public Texture2D thumbnail ;
public bool installed ;
public Integration ( string name , Assets asset , bool uwc , string guid , string url , string thumbData )
{
this . name = name ;
this . asset = asset ;
this . underwaterCompatible = uwc ;
this . libraryGUID = guid ;
this . url = url ;
this . thumbnailBytes = thumbData ;
if ( thumbData = = string . Empty ) this . thumbnail = EditorGUIUtility . IconContent ( "d_UnityLogo" ) . image as Texture2D ;
else this . thumbnail = UI . CreateIcon ( thumbData ) as Texture2D ;
}
}
private static Integration [ ] _Integrations ;
public static Integration [ ] Integrations
{
get
{
if ( _Integrations = = null ) _Integrations = GetAvailableIntegrations ( ) ;
return _Integrations ;
}
}
private static Integration [ ] GetAvailableIntegrations ( )
{
Integration [ ] integrationsArray = new [ ]
{
new Integration ( "None" , Assets . None , true , "" , "" , "" ) ,
new Integration ( "Default Unity" , Assets . UnityFog , true , "" , "" , "" ) ,
#if SWS_DEV
new Integration ( "Colorful Sky" , Assets . Colorful , true , "4a93911cc8864a3ba9f264d522fdfa3a" , "" , "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
#endif
new Integration ( "SC Post Effects (Screen-Space Fog)" , Assets . SCPostEffects , true , "a66e4b0e5c776404e9a091531ccac3f2" , "https://assetstore.unity.com/packages/slug/108753" ,
"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
new Integration ( "COZY: Stylized Weather (v1/2/3)" , Assets . COZY , false , "e9bc566e199a97947a3e600f2563fe85" , "https://assetstore.unity.com/packages/slug/230502" ,
"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
new Integration ( "Buto 2021 & 2022" , Assets . Buto , true , "ada48e5159bb1a5469288f9c75ca4629" , "https://assetstore.unity.com/packages/slug/258881" ,
"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
new Integration ( "Atmospheric Height Fog" , Assets . AtmosphericHeightFog , false , "8db8edf9bba0e9d48998019ca6c2f9ff" , "https://assetstore.unity.com/packages/slug/143825" ,
"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
new Integration ( "Enviro - Sky & Weather" , Assets . Enviro , true , "221026906cc779e4b9ab486bbbd30032" , "https://assetstore.unity.com/packages/slug/236601" ,
"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
new Integration ( "Enviro 3 - Sky & Weather" , Assets . Enviro3 , true , "8db9bd7b531f93d46ae2cb21180a00a8" , "https://assetstore.unity.com/packages/slug/236601" ,
"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
new Integration ( "Azure[Sky] Dynamic Skybox" , Assets . Azure , true , "5da6209b193d6eb49b25c88c861e52fa" , "https://assetstore.unity.com/packages/slug/36050" ,
"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
} ;
for ( int i = 0 ; i < integrationsArray . Length ; i + + )
{
integrationsArray [ i ] . installed = IsFogLibraryPresent ( integrationsArray [ i ] ) ;
}
return integrationsArray ;
}
public static Integration GetIntegration ( Assets asset )
{
for ( int i = 0 ; i < Integrations . Length ; i + + )
{
if ( Integrations [ i ] . asset = = asset ) return Integrations [ i ] ;
}
return null ;
}
public static bool IsFogLibraryPresent ( Integration integration )
{
if ( integration . asset = = Assets . None | | integration . asset = = Assets . UnityFog ) return true ;
string path = AssetDatabase . GUIDToAssetPath ( integration . libraryGUID ) ;
return path ! = string . Empty & & AssetDatabase . LoadAssetAtPath ( path , typeof ( TextAsset ) ) ;
}
public static Integration GetFirstInstalled ( )
{
for ( int i = 0 ; i < Integrations . Length ; i + + )
{
//Always installed anyway
if ( Integrations [ i ] . asset = = Assets . None | | Integrations [ i ] . asset = = Assets . UnityFog ) continue ;
#if SWS_DEV
//Gets in the way of testing and using default Unity fog
if ( Integrations [ i ] . asset = = Assets . SCPostEffects | | Integrations [ i ] . asset = = Assets . Colorful ) continue ;
#endif
if ( IsFogLibraryPresent ( Integrations [ i ] ) )
{
return Integrations [ i ] ;
}
}
//No third-party assets installed, default to Unity fog
return GetIntegration ( Assets . UnityFog ) ;
}
}
public class Keywords
{
public const string UNDERWATER_ENABLED = "UNDERWATER_ENABLED" ;
public const string DYNAMIC_EFFECTS_ENABLED = "DYNAMIC_EFFECTS_ENABLED" ;
}
public static class TemplateParser
{
//Converts relative include paths such as (../../Libraries/File.hlsl) to an absolute path
//Supports the source file being part of a package
public static string RelativeToAbsoluteIncludePath ( string filePath , string relativePath )
{
string fileDir = Path . GetDirectoryName ( filePath ) ;
//Count how many folders should be traversed up
int levels = relativePath . Split ( new [ ]
{
".."
} , StringSplitOptions . None ) . Length - 1 ;
string traveledPath = fileDir ;
if ( levels > 0 )
{
for ( int i = 0 ; i < levels ; i + + )
{
//Remove the number of needed sub-directories needed to reach the destination
int strimStart = traveledPath . LastIndexOf ( Path . DirectorySeparatorChar ) ;
traveledPath = traveledPath . Remove ( strimStart ) ;
}
}
//The directory without the "up" navigators
string relativeFolder = relativePath . Replace ( "../" , string . Empty ) ;
//Concatenate them together
string absolutePath = traveledPath + "/" + relativeFolder ;
//Convert back- to forward slashes
absolutePath = absolutePath . Replace ( "\\" , "/" ) ;
return absolutePath ;
}
public const string TESSELLATION_NAME_SUFFIX = " (Tessellation)" ;
public static string CreateShaderCode ( string templatePath , WaterShaderImporter importer , bool tessellation = false )
{
string [ ] lines = File . ReadAllLines ( templatePath ) ;
CreateShaderCode ( templatePath , ref lines , importer , tessellation ) ;
string shaderlab = String . Join ( Environment . NewLine , lines ) ;
return shaderlab ;
}
public static string CreateShaderCode ( string templatePath , ref string [ ] lines , WaterShaderImporter importer , bool tessellation = false )
{
//Extension installation states
var underwaterInstalled = StylizedWaterEditor . UnderwaterRenderingInstalled ( ) ;
var dynamicEffectsInstalled = StylizedWaterEditor . DynamicEffectsInstalled ( ) ;
Fog . Integration fogIntegration = importer . settings . autoIntegration ? Fog . GetFirstInstalled ( ) : Fog . GetIntegration ( importer . settings . fogIntegration ) ;
AssetInfo . VersionChecking . CheckUnityVersion ( ) ;
//Shader name
string prefix = importer . settings . hidden ? "Hidden/" : string . Empty ;
string suffix = tessellation ? TESSELLATION_NAME_SUFFIX : string . Empty ;
string shaderName = $"{prefix}{AssetInfo.ASSET_NAME}/{importer.settings.shaderName}" ;
StringBuilder sb = new StringBuilder ( ) ;
for ( int i = 0 ; i < lines . Length ; i + + )
{
//Ignore blank lines and comments for analysis
if ( string . IsNullOrWhiteSpace ( lines [ i ] ) | | lines [ i ] . StartsWith ( "//" ) )
{
sb . AppendLine ( lines [ i ] ) ;
continue ;
}
//First non-space character
int indent = System . Text . RegularExpressions . Regex . Match ( lines [ i ] , "[^-\\s]" ) . Index ;
string whitespace = lines [ i ] . Replace ( lines [ i ] . Substring ( indent ) , "" ) ;
//AppendLine using previous line's white spacing
void AddLine ( string source )
{
sb . AppendLine ( source . Insert ( 0 , whitespace ) ) ;
}
//Remove whitespaces
string line = lines [ i ] . Remove ( 0 , indent ) ;
bool Matches ( string source ) { return string . CompareOrdinal ( source , line ) = = 0 ; }
if ( Matches ( "%asset_version%" ) )
{
AddLine ( $"//Asset version {AssetInfo.INSTALLED_VERSION}" ) ;
continue ;
}
if ( Matches ( "%compiler_version%" ) )
{
AddLine ( $"//Shader generator version: {new Version(AssetInfo.SHADER_GENERATOR_VERSION_MAJOR, AssetInfo.SHADER_GENERATOR_MINOR, AssetInfo.SHADER_GENERATOR_PATCH)}" ) ;
continue ;
}
if ( Matches ( "%unity_version%" ) )
{
AddLine ( $"//Unity version: {AssetInfo.VersionChecking.GetUnityVersion()}" ) ;
continue ;
}
if ( Matches ( "%fog_integration%" ) )
{
AddLine ( $"//Fog integration: {fogIntegration.asset}" ) ;
continue ;
}
if ( Matches ( "%shader_name%" ) )
{
AddLine ( $"Shader \" { shaderName } { suffix } \ "" ) ;
continue ;
}
if ( Matches ( "%custom_directives%" ) )
{
foreach ( WaterShaderImporter . Directive directive in importer . settings . customIncludeDirectives )
{
if ( directive . enabled = = false ) continue ;
string directivePrefix = string . Empty ;
switch ( directive . type )
{
case WaterShaderImporter . Directive . Type . define :
directivePrefix = "#define " ;
break ;
case WaterShaderImporter . Directive . Type . include :
directivePrefix = "#include " ;
break ;
case WaterShaderImporter . Directive . Type . pragma :
directivePrefix = "#pragma " ;
break ;
}
if ( directive . value ! = string . Empty ) AddLine ( $"{directivePrefix}{directive.value}" ) ;
}
continue ;
}
if ( Matches ( "%pragma_target%" ) )
{
if ( tessellation )
{
AddLine ( "#pragma target 4.6" ) ;
}
else
{
AddLine ( "#pragma target 3.0" ) ;
}
continue ;
}
if ( Matches ( "%pragma_renderers%" ) )
{
if ( tessellation )
{
AddLine ( "#pragma exclude_renderers gles" ) ;
}
continue ;
}
if ( line . StartsWith ( "Fallback" ) )
{
if ( tessellation )
{
//Fallback to non-tessellation variant (with without suffix)
AddLine ( $"Fallback \" { shaderName } \ "" ) ;
//Test, disable fallback
//AddLine(line);
}
else
{
//Leave as is
AddLine ( line ) ;
}
continue ;
}
if ( importer . settings . type = = WaterShaderImporter . WaterShaderSettings . ShaderType . WaterSurface )
{
if ( Matches ( "%tessellation_properties%" ) )
{
if ( tessellation )
{
AddLine ( "_TessValue(\"Max subdivisions\", Range(1, 64)) = 16" ) ;
AddLine ( "_TessMin(\"Start Distance\", Float) = 0" ) ;
AddLine ( "_TessMax(\"End Distance\", Float) = 15" ) ;
}
continue ;
}
if ( Matches ( "%tessellation_directives%" ) )
{
if ( tessellation )
{
AddLine ( "#define TESSELLATION_ON" ) ;
AddLine ( "#pragma require tessellation tessHW" ) ;
AddLine ( "#pragma hull Hull" ) ;
AddLine ( "#pragma domain Domain" ) ;
}
continue ;
}
if ( line . Contains ( "%render_queue_offset%" ) )
{
int offset = 0 ;
switch ( fogIntegration . asset )
{
case Fog . Assets . COZY : offset = 2 ;
break ;
//case Fog.Assets.AtmosphericHeightFog : offset = 2; //Should actually render after the fog sphere, but asset inherently relies on double fog shading it seems?
//break;
default : offset = 0 ;
break ;
}
line = line . Replace ( "%render_queue_offset%" , offset . ToString ( ) ) ;
AddLine ( line ) ;
continue ;
}
if ( Matches ( "%stencil%" ) )
{
if ( importer . settings . fogIntegration = = Fog . Assets . COZY )
{
AddLine ( "Stencil { Ref 221 Comp Always Pass Replace }" ) ;
}
continue ;
}
if ( Matches ( "%multi_compile_light_cookies%" ) )
{
if ( importer . settings . lightCookies )
{
#if UNITY_2021_2_OR_NEWER
AddLine ( "#pragma multi_compile_fragment _ _LIGHT_COOKIES" ) ;
#endif
}
continue ;
}
}
if ( Matches ( "%multi_compile_shadows%" ) )
{
#if ! UNITY_2021_1_OR_NEWER
AddLine ( "#pragma multi_compile _ _MAIN_LIGHT_SHADOWS" ) ;
AddLine ( "#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE" ) ;
#else
AddLine ( "#pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN" ) ;
#endif
continue ;
}
if ( Matches ( "%multi_compile underwater rendering%" ) )
{
if ( underwaterInstalled )
{
AddLine ( $"#pragma multi_compile_fragment _ {Keywords.UNDERWATER_ENABLED}" ) ;
}
continue ;
}
if ( Matches ( "%multi_compile dynamic effects%" ) )
{
if ( dynamicEffectsInstalled )
{
AddLine ( $"#pragma multi_compile _ {Keywords.DYNAMIC_EFFECTS_ENABLED}" ) ;
}
continue ;
}
//Legacy, strip line
if ( Matches ( "%multi_compile surface modifiers%" ) ) continue ;
if ( Matches ( "%multi_compile wave sim%" ) ) continue ;
if ( line . StartsWith ( "#include " ) )
{
string includePath = line . Replace ( "#include " , string . Empty ) ;
//Remove parenthesis
includePath = includePath . Replace ( "\"" , string . Empty ) ;
importer . RegisterDependency ( includePath ) ;
}
if ( importer . settings . type = = WaterShaderImporter . WaterShaderSettings . ShaderType . WaterSurface )
{
if ( Matches ( "%define_fog_integration%" ) )
{
AddLine ( $"#define {fogIntegration.asset.ToString()}" ) ;
if ( fogIntegration . asset = = Fog . Assets . UnityFog )
{
AddLine ( "#pragma multi_compile_fog" ) ;
}
continue ;
}
/* include FogLibrary */
if ( Matches ( "%include_fog_integration_library%" ) )
{
//Default until otherwise valid
line = string . Empty ;
if ( fogIntegration . asset ! = Fog . Assets . None & & fogIntegration . asset ! = Fog . Assets . UnityFog )
{
string includePath = AssetDatabase . GUIDToAssetPath ( fogIntegration . libraryGUID ) ;
importer . RegisterDependency ( includePath ) ;
//Not found error
if ( includePath = = string . Empty )
{
if ( EditorUtility . DisplayDialog ( AssetInfo . ASSET_NAME ,
fogIntegration . name + " fog shader library could not be found with the GUID \"" + fogIntegration . libraryGUID + "\".\n\n" +
"This means it was changed by the author (rare!), you deleted the \".meta\" file at some point, or the asset simply isn't installed." , "Ok" ) )
{
}
}
else
{
line = $"#include_with_pragmas \" { includePath } \ "" ;
AddLine ( line ) ;
continue ;
}
}
}
}
//Shaders created using "ShaderUtil.CreateShaderAsset" don't exist in a literal sense. Hence any relative file paths are invalid
//Convert them to absolute file paths
//Bonus: moving a shader file (or its folder) triggers it to re-import, thus always keeping the file path up-to-date
if ( line . StartsWith ( "#include_library" ) )
{
string relativePath = line . Replace ( "#include_library " , string . Empty ) ;
//Remove parenthesis
relativePath = relativePath . Replace ( "\"" , string . Empty ) ;
string includePath = RelativeToAbsoluteIncludePath ( templatePath , relativePath ) ;
#if UNITY_2023_2_OR_NEWER
line = $"#include_with_pragmas \" { includePath } \ "" ;
#else
line = $"#include \" { includePath } \ "" ;
#endif
importer . RegisterDependency ( includePath ) ;
AddLine ( line ) ;
continue ;
}
//Insert whitespace back in
line = line . Insert ( 0 , whitespace ) ;
//Nothing special, keep whatever line this is
sb . AppendLine ( line ) ;
}
//Convert to separate lines again
lines = sb . ToString ( ) . Split ( new [ ] { Environment . NewLine } , StringSplitOptions . None ) ;
//Convert to single string, respecting line breaks and spacing.
return String . Join ( Environment . NewLine , lines ) ;
}
}
public static ShaderMessage [ ] GetErrorMessages ( Shader shader )
{
ShaderMessage [ ] messages = GetWarningsAndErrors ( shader ) ;
if ( messages ! = null )
{
//Filter for errors
messages = messages . Where ( x = > x . severity = = ShaderCompilerMessageSeverity . Error ) . ToArray ( ) ;
}
return messages ;
}
public static ShaderMessage [ ] GetWarningsAndErrors ( Shader shader )
{
ShaderMessage [ ] messages = null ;
if ( shader )
{
int n = ShaderUtil . GetShaderMessageCount ( shader ) ;
if ( n < 1 ) return messages ;
messages = ShaderUtil . GetShaderMessages ( shader ) ;
//Filter for errors
//messages = messages.Where(x => x.severity == ShaderCompilerMessageSeverity.Error).ToArray();
}
return messages ;
}
#if URP
//Strips keywords from the shader for features belonging to newer URP versions.
private class KeywordStripper : IPreprocessShaders
{
private const string LOG_FILEPATH = "Logs/Stylized Water 2 Compilation.log" ;
#if ENABLE_SHADER_STRIPPING_LOG
private System . Diagnostics . Stopwatch m_stripTimer = new System . Diagnostics . Stopwatch ( ) ;
#endif
private List < ShaderKeyword > StrippedKeywords = new List < ShaderKeyword > ( ) ;
//URP 10+ (2020.3)
private readonly ShaderKeyword _ADDITIONAL_LIGHT_SHADOWS = new ShaderKeyword ( "_ADDITIONAL_LIGHT_SHADOWS" ) ;
//URP 12+ (2021.2)
private readonly ShaderKeyword _REFLECTION_PROBE_BLENDING = new ShaderKeyword ( "_REFLECTION_PROBE_BLENDING" ) ;
private readonly ShaderKeyword _REFLECTION_PROBE_BOX_PROJECTION = new ShaderKeyword ( "_REFLECTION_PROBE_BOX_PROJECTION" ) ;
private readonly ShaderKeyword DYNAMICLIGHTMAP_ON = new ShaderKeyword ( "DYNAMICLIGHTMAP_ON" ) ;
private readonly ShaderKeyword DEBUG_DISPLAY = new ShaderKeyword ( "DEBUG_DISPLAY" ) ;
private readonly ShaderKeyword _CLUSTERED_RENDERING = new ShaderKeyword ( "_CLUSTERED_RENDERING" ) ;
private readonly ShaderKeyword _LIGHT_LAYERS = new ShaderKeyword ( "_LIGHT_LAYERS" ) ;
private readonly ShaderKeyword _LIGHT_COOKIES = new ShaderKeyword ( "_LIGHT_COOKIES" ) ;
//URP 14+ (2022.2)
private readonly ShaderKeyword _FORWARD_PLUS = new ShaderKeyword ( "_FORWARD_PLUS" ) ;
private readonly ShaderKeyword _WRITE_RENDERING_LAYERS = new ShaderKeyword ( "_WRITE_RENDERING_LAYERS" ) ;
//URP 15+ (2023.1)
private readonly ShaderKeyword EVALUATE_SH_MIXED = new ShaderKeyword ( "EVALUATE_SH_MIXED" ) ;
private readonly ShaderKeyword EVALUATE_SH_VERTEX = new ShaderKeyword ( "EVALUATE_SH_VERTEX" ) ;
//Keep in sync with actual pass name in shader!
private const string DISPLACEMENT_PASS_NAME = "Depth or Displacement" ;
private readonly bool displacementPrePassEnabled ;
#if SWS_DEV
[MenuItem("SWS/Debug/DisplacementPrePassEnabled")]
#endif
private static bool DisplacementPrePassEnabled ( )
{
bool state = false ;
//Check if the displacement pre-pass is enabled anywhere
for ( int i = 0 ; i < GraphicsSettings . allConfiguredRenderPipelines . Length ; i + + )
{
UniversalRenderPipelineAsset pipeline = ( UniversalRenderPipelineAsset ) GraphicsSettings . allConfiguredRenderPipelines [ i ] ;
ScriptableRendererData [ ] renderers = PipelineUtilities . GetRenderDataList ( pipeline ) ;
for ( int j = 0 ; j < renderers . Length ; j + + )
{
StylizedWaterRenderFeature renderFeature = ( StylizedWaterRenderFeature ) PipelineUtilities . GetRenderFeature < StylizedWaterRenderFeature > ( renderers [ j ] ) ;
if ( renderFeature )
{
state | = renderFeature . displacementPrePassSettings . enable ;
#if SWS_DEV
//Debug.Log($"{renderers[j].name}. Enable?:{renderFeature.displacementPrePassSettings.enable}");
#endif
}
}
}
#if SWS_DEV
//Debug.Log("Displacement pre-pass enabled somewhere: " + state);
#endif
return state ;
}
//Note: Constructor is called once, when building starts
public KeywordStripper ( )
{
if ( PlayerSettings . GetGraphicsAPIs ( EditorUserBuildSettings . activeBuildTarget ) [ 0 ] = = GraphicsDeviceType . OpenGLES3 )
{
if ( UniversalRenderPipeline . asset . msaaSampleCount > 1 )
{
Debug . LogWarning ( "[Stylized Water 2] You are deploying a build using the OpenGLES 3.0 graphics API with MSAA enabled (in your URP pipeline asset). Due to a bug in some graphics chips, transparent materials (including the water) will not render. " +
"Disable MSAA, or use the Vulkan graphics API" , UniversalRenderPipeline . asset ) ;
}
}
//Check if the displacement pre-pass is enabled anywhere
displacementPrePassEnabled = DisplacementPrePassEnabled ( ) ;
StrippedKeywords . Clear ( ) ;
if ( ! displacementPrePassEnabled )
{
StrippedKeywords . Add ( new ShaderKeyword ( DisplacementPrePass . KEYWORD ) ) ;
}
//Note: Keywords for extensions are only injected through the shader generator. Hence they don't need to be stripped
#if ! UNITY_2020_2_OR_NEWER //URP 10+
StrippedKeywords . Add ( _ADDITIONAL_LIGHT_SHADOWS ) ;
#endif
#if ! UNITY_2021_2_OR_NEWER //URP 12+
StrippedKeywords . Add ( _REFLECTION_PROBE_BLENDING ) ;
StrippedKeywords . Add ( _REFLECTION_PROBE_BOX_PROJECTION ) ;
StrippedKeywords . Add ( DYNAMICLIGHTMAP_ON ) ;
StrippedKeywords . Add ( DEBUG_DISPLAY ) ;
StrippedKeywords . Add ( _CLUSTERED_RENDERING ) ;
StrippedKeywords . Add ( _LIGHT_LAYERS ) ;
StrippedKeywords . Add ( _LIGHT_COOKIES ) ;
#endif
#if ! UNITY_2022_2_OR_NEWER //URP 14+
StrippedKeywords . Add ( _FORWARD_PLUS ) ;
StrippedKeywords . Add ( _WRITE_RENDERING_LAYERS ) ;
StrippedKeywords . Add ( EVALUATE_SH_MIXED ) ;
StrippedKeywords . Add ( EVALUATE_SH_VERTEX ) ;
#endif
LogInitialization ( ) ;
}
public int callbackOrder = > 0 ;
public void OnProcessShader ( Shader shader , ShaderSnippetData snippet , IList < ShaderCompilerData > compilerDataList )
{
#if URP
if ( UniversalRenderPipeline . asset = = null | | compilerDataList = = null | | compilerDataList . Count = = 0 ) return ;
//Only run for specific shaders
if ( shader . name . Contains ( "Stylized Water 2" ) = = false ) return ;
LogStart ( shader , snippet , compilerDataList ) ;
var inputShaderVariantCount = compilerDataList . Count ;
for ( int i = 0 ; i < inputShaderVariantCount ; )
{
//If any of the excluded keywords are enabled in this variant, strip it
bool removeInput = StripUnused ( shader , compilerDataList [ i ] , snippet ) ;
// Remove at swap back
if ( removeInput )
compilerDataList [ i ] = compilerDataList [ - - inputShaderVariantCount ] ;
else
+ + i ;
}
if ( compilerDataList is List < ShaderCompilerData > inputDataList )
{
inputDataList . RemoveRange ( inputShaderVariantCount , inputDataList . Count - inputShaderVariantCount ) ;
}
else
{
for ( int i = compilerDataList . Count - 1 ; i > = inputShaderVariantCount ; - - i )
compilerDataList . RemoveAt ( i ) ;
}
LogStrippingEnd ( compilerDataList . Count ) ;
#endif
}
private string GetKeywordName ( Shader shader , ShaderKeyword keyword )
{
#if UNITY_2021_2_OR_NEWER
return keyword . name ;
#else
return ShaderKeyword . GetKeywordName ( shader , keyword ) ;
#endif
}
private bool StripUnused ( Shader shader , ShaderCompilerData compilerData , ShaderSnippetData snippet )
{
if ( StripPass ( shader , snippet ) )
{
return true ;
}
foreach ( var keyword in StrippedKeywords )
{
if ( StripKeyword ( shader , keyword , compilerData , snippet ) )
{
return true ;
}
}
return false ;
}
private bool StripPass ( Shader shader , ShaderSnippetData snippet )
{
if ( displacementPrePassEnabled = = false & & snippet . passName = = DISPLACEMENT_PASS_NAME )
{
Log ( $"- Stripped Pass {snippet.passName} ({shader.name}) (Stage: {snippet.shaderType})" ) ;
return true ;
}
return false ;
}
private bool StripKeyword ( Shader shader , ShaderKeyword keyword , ShaderCompilerData compilerData , ShaderSnippetData snippet )
{
if ( compilerData . shaderKeywordSet . IsEnabled ( keyword ) )
{
LogStripping ( shader , keyword , snippet ) ;
return true ;
}
return false ;
}
#region Logging
struct StrippingLog
{
public Shader shader ;
public ShaderKeyword keyword ;
public string passName ;
public ShaderType shaderType ;
}
private void LogInitialization ( )
{
#if ENABLE_SHADER_STRIPPING_LOG
//Clear log file first
File . WriteAllLines ( LOG_FILEPATH , new string [ ] { } ) ;
Log ( "KeywordStripper initialized..." , true ) ;
Log ( string . Empty ) ;
Log ( $"Displacement Pre-pass enabled in build: {displacementPrePassEnabled}" , true ) ;
Log ( string . Empty ) ;
#if UNITY_2021_2_OR_NEWER
for ( int i = 0 ; i < StrippedKeywords . Count ; i + + )
{
Log ( $"• {StrippedKeywords[i].name} keyword to be stripped" ) ;
}
#endif
Log ( $"{StrippedKeywords.Count} total keywords to be stripped" ) ;
#endif
}
private void LogStart ( Shader shader , ShaderSnippetData snippet , IList < ShaderCompilerData > compilerDataList )
{
#if ENABLE_SHADER_STRIPPING_LOG
m_stripTimer . Start ( ) ;
var text = $"OnProcessShader running for {shader.name}. (Pass: {snippet.passName}) (Stage: {snippet.shaderType}). Num variants: {compilerDataList.Count}" ;
Log ( text , true ) ;
#endif
}
StrippingLog prevLog ;
private void LogStripping ( Shader shader , ShaderKeyword keyword , ShaderSnippetData snippet )
{
#if ENABLE_SHADER_STRIPPING_LOG
//Try to avoid spamming the log with duplicates, this otherwise slows down compilation to a crawl
if ( prevLog . keyword . index = = keyword . index & & prevLog . shader = = shader & & prevLog . passName = = snippet . passName & & prevLog . shaderType = = snippet . shaderType )
{
//File.AppendAllText(LOG_FILEPATH, "- Skipping log!\n" );
return ;
}
prevLog . shader = shader ;
prevLog . keyword = keyword ;
prevLog . passName = snippet . passName ;
prevLog . shaderType = snippet . shaderType ;
var text = $"- Stripped {GetKeywordName(shader, keyword)} ({shader.name}) variant. (Pass {snippet.passName}) (Stage: {snippet.shaderType})" ;
Log ( text ) ;
#endif
}
private void LogStrippingEnd ( int count )
{
#if ENABLE_SHADER_STRIPPING_LOG
m_stripTimer . Stop ( ) ;
System . TimeSpan stripTimespan = m_stripTimer . Elapsed ;
var text = $"Stripping took {stripTimespan.Minutes}m{stripTimespan.Seconds}s ({stripTimespan.Milliseconds}ms). Remaining variants to compile: {count}" ;
Log ( text ) ;
m_stripTimer . Reset ( ) ;
#endif
}
private void Log ( string text , bool newLine = false )
{
#if ENABLE_SHADER_STRIPPING_LOG
File . AppendAllText ( LOG_FILEPATH , ( newLine ? "\n" : "" ) + text + "\n" ) ;
#endif
}
#endregion
}
#endif
}
}