892 lines
272 KiB
C#
892 lines
272 KiB
C#
![]() |
//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",
|
|||
|
"iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAgAElEQVR4ASS815Nkd3Ymdr3Ja/Km91mV5au72je6G40GMBjOgBySQw65w6XblciI3YcN6YEMRSj0pheF/glFSKFQKBjaXXK55AyHw3EYB9NAN9p3VZfJqqxK7/N6ry+xiBmggK7KyvyZcz53Lvn1nUuZVF7WVMd2rhSzckISRJEnqdftwXYx6QZkcaX6H3/8kWPaOVXJqIodRJHniInkyLTjMEzwlO7FqUQimeBP+uPfun/3g/ffmQ3GL49bP3v23NH1Wr6i8KSqJP/u419b1vzu5cv//R/8YfP5q60rl3/y65/+H3//D1cbl3//nXeFhBCToWV7N+7cShULf/N3f////P0/UlFIxf7eWuP9d+6RAbV9eT1m45/++OMf/uKzu7fffvvK2rCPX3SeyqfVpFrMyIPzST5fpBPOeLgwdU+SpFfnfd+wxnHAhKEmMBSb7NnmH3x4/fPXR/0znXAmA9PkBHmrssor7NnFJI49yzLmfkwyfCWTiMM48GyaY1aLjaqUIel4v3Uo8lIipUiE/ea8O1gQNOGGBJ2Sk0Toba+vd2Zzwz7yPc5xRUXizoeTtELRrMjzWuyZh+1WTHGmbZOxx9Ce4zj09bXNr9/aiojY9kIjiE4Hk2xWxYK+7o0mhsGzzI8eP597QRxEFMOkJVlkeT0IX7YHWYXnGd52nLcbtf3BqDOfb2ZTjUJ+MZ21O53VYr6SkiPXoVn+uNuJGK6STi8MqzscPXryLAij2/duPvryk9dn/e9+80OVExUtiXdTKBXVjPb9n/zsP33vB0QUEJH31val37jz9nAyTSbEREJotVu/+OzJzd1NJSFoqjIzHd/1IheL7HMcq8kJfTIfzOzu0CikkxTBua7HcizHkY7rOSQ9cmIsU6fbjl0yJHnDs7PpbFJRjMAx3YDyQo5np5aXVESGpHhu+XlZgUmllblukjQd0mTg+3jNgCQ5ym+PFhv1dTbyTC9SFS2n8M3ueDhdxB5leGwuUyJILsGpNEMaTlBIlwliOluYsihHYUAyQRh6OHD0+zduBUG4mJkpjhc4MqcIlmcfDSat8cz2Ay2pTOYzkRWuNlZkJfHsvG14vmU71aTy4c09fLbz0RTbxrM8yVJT22mPxycX7d5Mx9HJKeJMt95ctIsCa1iWKCd26yXCi3C9Tkb9wWj48OkrhhH+7I//gKWpbquT1NRcJf3i1aP/+2+/71gGScTv3751//otTUvOLas/GLa6nVa7l9OyV69dGg0nxULZMN3YDViK1Q09iONSoRy5br1WOx5MUjR3PO73F2Y9Jfd1Uw9pfF2T+avl6tlgxkZcWkpEsZvgKIVl5p7PkHG1nKYF3nScICLsiKJJQqSorCpd9GYMSZIUOZlbMUWe9fuua0910/eI+kod1zoMQ5QKQeQCIsQJ5Vg6IphStlDNV7RE0sRd4BQpwTieaTp4g9aNS1e8YKJJGk3G9NcuXwkIyidjPyRymjZ03NPhApu8U89ZrnfaHcm8lFPlve3VlVqJwnEjmW/df+t3v/X1ie4m+MRRu+f5YUkRJ6ZxpVaxKWZmOeVsrqebZ8MxzQlr1SKK2na9OJ4uXrUHZExObXd3dbPbOTrrj3ZWNt67f2c8GDuOffn2tScHz//TP/0UlzgMvG+8c+fP/vS75mLh2/ZosXjy5s2VzZ0wigeTBcewUUwospRSBdsMdMvOoL7Q9HBo+JahG+bZeFyvZaWEcNofB250gRdkiIamaoLUW8wymjo1zNAPA4qYT2YcLThxFMWMoZssGSRl0bVdy8Y5tLBA/ck8CJmcLBqeNTMWC9vSFCmOAt2OcSOHo2FvOEkw7P3b92Ql3R/j11mmS2Uy2UY5l5bT44XlhURKSQaBc9Q+CV07lVTrleJ0MZ3OFwwX0Xk5xZM0EUcmbitBtYYjwvVUhtWDaKQ7JSWZk4SF7b3qjfLZ5M2NlaOLbr2QF2jKtKzj9gWu6ka5uLlS7vXG1xqruXRG9MJqUsrlMuOpcXVro16pRzTxyesDWeBlirq7uZLRJJeMR4N2dzLfaWzcv3fH0VEVnYf7R3/z/R/NdSsMnNuX9/70j/+QcG3f8VhBHA+HN65dvv3u3ePD4/PzVkaWtXxeS0opSbN1W1F4LavSFIWXQdnUZDFg+d5Er6YKF+OhwnMeT0tUzPHiQLf90MVt3W1s6p6JTxH7QT6f5mTOscll5RfF4XBORj5KnJIQi/kSEUUBGdo+IXLcWi1lOmRG1aI4wr/yHOe7oW471/culUsly3JZ0p0bJsMmVFHerdVImj3pnC5sO5tKdWdjBc2A4kVROjh/ahvhxaCPKkdv5/MT2/O9wHPsnmnvFVOblWJaldcrOdyd8/4kpOiYpTM8//jVURiH1xoNy4sePnsxmE0qpfLJ+YXr+7QgltOZ8/OzN6027u+1rQaBozrVoyjUUskilsS2yuVqtZx1bXv36t4Hv/Xu93/ww/HC+71v//ZqPsdx3GGr9Z9//BPCdyLP2m2s/fu/+AuOjnR9ouXLbugk2ERjp9FpnXXbXYFXpnbg+EE6qbqzQF9YyaQ4nBlhSFQLWTGZXIxnOM+VSmVto9zqzgI6yqqE5zoJWihKycvru83ecBG7w9nIi6i5Hw0WC1w4lqeJgByNDZaIOZF1IsLyIw+NA+tPUCFJow5zDJ/Ppaq5ZLs/sS0He+Q5Zhx679651hkbb06OCQoVERsZqbIIAMGLJE2x6HzoQrY1vOi0eFF1rGlgurYXZNDk45D+n//Nd5utThQEFEmFnpdUM9e31ziKTtCM4TmeF+yWcqjgURCrArXf6p2P9fNun2dpywsEQbixs0mheaCju7ooJnZ2tku1sqRo+miqRP6b3jAShHw6O2i1hTiub2++evGMT8gM6fzk579yI05V1dVapdNp/9ef/3o+HWDbMpn0X/7pH2WU5PHrfQE9kBIpgpFTqf03x7a5QItr9mZyMqlwzHAEvGGvba2ajh0RlK6bk7FeyBRtx3t+dKJlc7urxYExefrqDWnFEsvurNVsin52frZRK47G40IyXS2lm/2xH0UsI4Y+VdcyCSacO0ZI4+O4TBQmBRl/KPO8F/pjO1A5KYN64FqtwdS0CUmUTHsB9DhaxCqnWPbEo2RgB1lgQ5I0PWu8sC/6Y8v3FVmcTAez2dR1XWBOgeOmer+YE+Iopq80GmRArFULN7ar71zd7vYGP3/xpjOex7Y/X5gzx586fklJuD5xbbWcESVFURuVvEjRksAGXtio1jfq5fZFt5DP7F7eSifUnb2d2XR00ul1x9NEFGJrJUXdvrxzcnTIM9xsNCnWKo+fPPny1XFKS9c17dXxyeOj5un5OUuRBBF997d+5/Lejj7rmZbujnwyiMtr64Isz+ezVDL55fNjrPpWNZuTJc8l84XUcDjq9IZxQKKQklGYTqY4miPZeDYb9Yfmm/MeUEo2m9FSMstIW6X6bNwDijMW5o3ttUwm9fzNGy+MaYJUACIce+4HqBt5NcniAyYBflwgPZ6XMklA9URH14+Hi6nhpRJpVBNO4GxTj0M/IWXCwNTdkGN5y0SVV3qzBXq5uVxDfXd9KyUlDpvPM1r29o2bNCNcDE5VibSdcDSy6E2ttFoq9OYGQVCypBU1YP9wsjAkVR6aXkCgI3i5giYK3EF75C+BP6cbdq1WuXPzkioKT56/lMjw0uYaQMj5eX983v7ZLz8WeP76jasbu9uqJsuRr8+NRCrtRY69MGmeB4/4+OlTfG+juvI7v/3hk4PmqzdHIk2iDj64fv39d94xp/N5uxNTgoZly6l4ZV4Sy9XCs6fPjlu9cjFLonBrmf5sJqvabLYYjacpWUYVjmPyTfO0O5isbebLa9iboT1z25YznOukS/IRp1suVuRkMHGBahj60YsDlROsIExwdBw4ju8lRZGOUXVQ4oVKIesTHLbHJyjT9iYmDiHJ0bSCnyRZlQ00LkHGMRDWeq0sCLKiaO1uN4yJkemEcRyEhG5ZUkKOCNLxFmE4C2OLjgLLmTvBVEokTs4moe
|
|||
|
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",
|
|||
|
"iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAgAElEQVR4Ae29edCt2VWft8/wDbe/e/venmepJ0loQlJAkSBAgSyCUWyDCsoJ2JUQO1UMRcWkXC7i2E5lUOKkjP/A5ZA4NnbsRDZyhEkAO2AHIdCMBJrV0OpB6pa61cMduvtO33DOyfP81n7POd/te7uFoozlfd/vPXtYe+21fmvt4d3vcEeLxaIl7B8c/NYjZ//7j5/64Plrn2zH9tuk8v/l+euCwPZ877r9M988evLHv+Wm77r3xObmRrEdYYDF7ODh0xff9YXF33xw6/G9zTLIpM0nbTHy+L8pdEd48dZC+FVTvzi/UBQ/lCVSKi8VXzW1il3KdVlCrdFIDpXDedFGszaejcbUIf+mycWfeOmFH7prdPeNO+PphgZ4+OTZv/LRC7/w1HXQgfvOaP+qtnfVaH+zzSajr48Nhm62lFvxutD953LJtWrL6KIIh1rh2POKp8qjdG8qdGvERntyVbRWbjXcju4Phw7los1TaZ52lpJA1hupn2p01EB6nDPZi5HoXxxNz4+3Loy3zo+3scRkMfvBncff8S1H7731xHRv/+AfPrR4V9Dfagc3js/dODp7zeiiBhjNxtUJYtKIdKjFQ4nSeAXFqnApsQKt/w0I9GHQul2lIluMekY4DFQDSbGtoqGe0OcvBiiKEqToil/nZAEtEIZmrIrKm+PV+BtzLmaLVoeWSPXBwN3SSQ6jRSwxGTWOrUk7aOPzi+m58dYzk52npsdPbhzfHW+++9wtr3romZ++bn/6W4+e/ZsPXQXRdju4Y/wMx03jsyfGuxhgyihkDzB4xh+WoZtkme6RDs4yO5otcSgQlupWPucVpMRNdBX9wc0kSLYleITZ+Uszo9FiPq/ynt9hLSIh7v/yE5piVEZKvJqUwMzt0WITBfXihV6/aPuLxQH9gMjc3hA5/CFAXwN1Ipb0sFjQD45NR+PR6OxicmG8eWayc3R2fmux/9jm9djgv/nizhuvOTP92588/cTeCUYefP8lk2dfMsEA506MdrfHB8wBTgMFe34qGsF72xFgaHKt9coKmIJVETKjY/10DC0bCAod6VPBn1TooIdpFZpj72TQnM7m+3KugopRrXy1N5lCKnjIsUYPeVixC1AReG6N27QtOGv9RTuYt9050C9guTePR1qPWmrvIGG/6ajIPSWp2jb3Rxvj0YnJeD7ZOLW4cGSxD+XeeOMrG9c9Nd/6uQ8/Of3I+Wuowbh/0+TcLZOzt0zO3zQ5f/V4j/EH9DNxpB0cosOftg+naLz6cm87JIMcajj8s0CdPPc4v8aFqE54XSI9o0orZ3k2UnUWB6W6Sbo8YC3ZDFwlnsudiJXUI40pAYKTSR+KjJ5b25gzBC1G8zbOYILjT+ft4kwDbIVPkJBhjfWwGLCRWec0/OxMRjdOAWh69WKfCWF3tPHs/lXPTnaem1z10cVN06cXO1TBANeOL14z4dg9Mdk7Nt6fjuZwh29nbTxpqAmDNdZKS/hezI+icDYMEdPml5jRZSCwg4eS08h4CjxVvvUEd6DvuVYJH3rqgpUdda+dLk7tLS4wZmvKYjNUJRlZQljSme7ZvXAB7pn89GuaZ0LeiHg1CUO9RHyUDhGUOuP1HzrQ1dN2fNpGB4yTBzvjdnS0cbSdu3pydnu+iwFObZ6Ynl9sMNbvjPePckxmHEcm863xXJuNxqi/PvasusHSAN0CKrEWXaUKINKBqZ9FJa5XpTmrdiJoZ8+jZSEEC5QvB50E7nkawkWhh8Y8kS50jk3a0eni2YM2kRtGyQQR2WyxWlBYmVBTPfxZni2QYwLjPtGM/tJA5dhFVk2NiSyJ1+o5+qMC9Bfni729tDCeTTcOtiZ7O5O9I/O9q+a7k8V8fzSd0tB4tNgazY6M58cm8+PTxfFJ22biUCkFjO6wSuh9oH7MhA47ReRBagkH+xB1hAxw0RFxYWimgnMGuHJ3iIKmiBJBRWNEcDKBhAsCBQMMMWmjvcyH5pOcjI6O285kcc20ndsfTcaYE6ejUFFLEYVcxYYhUxKYwliV5U/FxpQ7wsSIygiHoIrgrzzEVcnDO7L1fDrK2EFJgcNJwob8kOoHFw7ms9F8q812xgfbC6bYOSvUGKC1zdFie8LRjkzb1RvtKucf5FD62WKEEH0dlsYLXiTyHy3QprKlOZs0VFGitI4QwqQmIg65mUmC1DjDSfDW6yMvp+7dwQPgrFF2AOv59qid2W+7NBApr58ubtykeL6LuKPR8Y22y8LRsX3hKsTqAo2rGFc8heliGtXGDBVIQi3Njw2o3tmTslapG15WMBIAZDZqR8aj6zcWuAX9L8xtgIhH0geLxbnZ4vxsMZvNx21eqGkAYhvjBWPOhPXvpI3Ho+l4xIRGG7RCoNNjAATCLzgUMdVCIoEK1O/qvMqhecYyZOTPIwKtRzRJQYxcKF8+I9paLr+pW3gsFldNxzMKslrHs/D967bsxwczfQX3P7oxOrm/YBJzESGlyobraDyGvVIuoSuR9RhlTGuOgKTEmFJzjcQ5ijq59pqoQ/GRcWMpSQ8ARkifO7DZ9HWTdQAjEdZRjEusqWiNNssADljTsfUnyAo/z0HVXzqj1xSbzCVRZ0Yk/oVkS3kqUulIbMaQVBkapEVkKbGQL+ngw2Ci3EKvSsQ5Z1iP0qkbccknZ78tLkKomDo4iOMTqLC7GLEgvbBgFDKN9er6n/qMSAfoHDQ1hxOJ4uhj5urK8/Q5ShV8PJ7N4NpDKhZVlNM3qOU4aXXGwwUitYkzpq2w9NydL2bpbcUCrWE3ozQ4WClBAxBk5wE/pw87O5zSA5JtV+AflydIDq/pYADiNggRQ1H9kiPL6GV7akpObziTKhmZcgVciWtkEPrM+9UbKo7BkpTJcJyXEog8U7o3auSwh3XyYHEwt7NO6dBeuyoDHKGjJXq2MoQJZkNzGCAzMoAUXSo6UqG6IKMCa384yEUoSi1VSyxaq3eSNHr6oD0neG1j1K7mAnihYIITAoDC5yATMbM4+asB+CWXsWW/jfYd8UezwhsI4GhcTcpC1SFoxs3SyidiocTQhq0n9O/9zMr8OZ4ogTYRC9RSLDzFAV/5iJOtrlWXOD4FbZkk2FGUpU1Y6uJeo56jX7fRBfJG+p1jpgLZRNQD/ZSRQTO04LpD5UlxcQtxfChjFWJEixMbovnkHraJNxXYsImEKqxeVnSEAED4BEk4swPBpYOwRsyrJiyHGuJBjETrofcAuPFvOOwHCBG3tysEWZqrDEEmh0GJCpwiRhV1BhRAzFnnshhYilJ8yYz9yx/JwQEdH6BEVeEQYruIY8KIOVqhYx7rUVTL1B4PiI5IUEQNvJoBAdHsIgSYOLU05noE1uf1AE/71lgw9gKUCjC7jNqFWcOWR8eL6zddCJ3eBwp1oAoSqoZBr0hz7djYCQB8zwYILHF0igBePMsy1AzdENNyDzDpfGoOEOtgOh5tTEbTHAW6hHCRkZUg409GYUZKVQwhk6ISlFuE5ODYQ0VAMMqDDDGhCJ6utec6EepiDIw0nzOJUqbtyOhdIWTmxiRmIwsWKiM7PHI9nI6lASMNwz9sA33Y2SiCXcWVAvIuQNBF51GW5QxiuyxAFtcx4Y0cSTAGOGCh6i5nnFppOZKrsQqyc4e/P8fEOOgO9G5dIFIBgjGQhUpQE0I2gBIDVC5DDY3hNSyBsAFxq9uIfwHaNtNuTJLCMOr5VrFWzyuD02ZNblU3sksFR9eImME4Izi+udhYjKazBY55MGuz8RgCxiTHB5ZtWIB/+iCVsI5g20P032KTy0YFdcqFp+MWbCkeezWry3rQKR2mbthqRyftHEvGRbuG9bvrk9HN29mGy3hCEX4Nf6ZWzHNWObzCWg9I/1yZXzXsCpgNN2JCxjNYER2buiKCD5R1QKjOQ1gOQQ7hTFMcNMmJJWlBH0zRupCn/RhDOQZZelyC2Ene5Q5FVI6sC9i0DmQ+44jeL5wkgQrUvMJCB7qCo4cjkgPr3Kn1YD4GbkxGMh1AbjQJW3hhD+QlH09jkKEuB6
|
|||
|
};
|
|||
|
|
|||
|
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);
|
|||
|
|
|||
|
line = $"#include \"{includePath}\"";
|
|||
|
|
|||
|
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;
|
|||
|
|
|||
|
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
|
|||
|
}
|
|||
|
}
|