From 215019b5242967fc243aaed24caec9229a71868b Mon Sep 17 00:00:00 2001 From: Exist Date: Sun, 8 Sep 2024 09:30:27 +0200 Subject: [PATCH 001/131] before switching noise to textures --- .../Snow Cover/Shaders/Features/SnowCover.ini | 2 + .../Shaders/SnowCover/FastNoiseLite.hlsl | 2920 +++++++++++++++++ .../Shaders/SnowCover/SnowCover.hlsli | 170 + package/Shaders/Common/PBR.hlsli | 48 +- .../Shaders/Common/PBRSurfaceProperties.hlsli | 50 + package/Shaders/Common/SharedData.hlsli | 18 + package/Shaders/Lighting.hlsl | 72 +- src/Feature.cpp | 4 +- src/FeatureBuffer.cpp | 2 + src/Features/SnowCover.cpp | 221 ++ src/Features/SnowCover.h | 80 + 11 files changed, 3530 insertions(+), 57 deletions(-) create mode 100644 features/Snow Cover/Shaders/Features/SnowCover.ini create mode 100644 features/Snow Cover/Shaders/SnowCover/FastNoiseLite.hlsl create mode 100644 features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli create mode 100644 package/Shaders/Common/PBRSurfaceProperties.hlsli create mode 100644 src/Features/SnowCover.cpp create mode 100644 src/Features/SnowCover.h diff --git a/features/Snow Cover/Shaders/Features/SnowCover.ini b/features/Snow Cover/Shaders/Features/SnowCover.ini new file mode 100644 index 0000000000..19f01444dc --- /dev/null +++ b/features/Snow Cover/Shaders/Features/SnowCover.ini @@ -0,0 +1,2 @@ +[Info] +Version = 1-0-0 \ No newline at end of file diff --git a/features/Snow Cover/Shaders/SnowCover/FastNoiseLite.hlsl b/features/Snow Cover/Shaders/SnowCover/FastNoiseLite.hlsl new file mode 100644 index 0000000000..adc49c8bc5 --- /dev/null +++ b/features/Snow Cover/Shaders/SnowCover/FastNoiseLite.hlsl @@ -0,0 +1,2920 @@ + +// MIT License +// +// Copyright(c) 2023 Jordan Peck (jordan.me2@gmail.com) +// Copyright(c) 2023 Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files(the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions : +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// .'',;:cldxkO00KKXXNNWWWNNXKOkxdollcc::::::;:::ccllloooolllllllllooollc:,'... ...........',;cldxkO000Okxdlc::;;;,,;;;::cclllllll +// ..',;:ldxO0KXXNNNNNNNNXXK0kxdolcc::::::;;;,,,,,,;;;;;;;;;;:::cclllllc:;'.... ...........',;:ldxO0KXXXK0Okxdolc::;;;;::cllodddddo +// ...',:loxO0KXNNNNNXXKK0Okxdolc::;::::::::;;;,,'''''.....''',;:clllllc:;,'............''''''''',;:loxO0KXNNNNNXK0Okxdollccccllodxxxxxxd +// ....';:ldkO0KXXXKK00Okxdolcc:;;;;;::cclllcc:;;,''..... ....',;clooddolcc:;;;;,,;;;;;::::;;;;;;:cloxk0KXNWWWWWWNXKK0Okxddoooddxxkkkkkxx +// .....';:ldxkOOOOOkxxdolcc:;;;,,,;;:cllooooolcc:;'... ..,:codxkkkxddooollloooooooollcc:::::clodkO0KXNWWWWWWNNXK00Okxxxxxxxxkkkkxxx +// . ....';:cloddddo___________,,,,;;:clooddddoolc:,... ..,:ldx__00OOOkkk___kkkkkkxxdollc::::cclodkO0KXXNNNNNNXXK0OOkxxxxxxxxxxxxddd +// .......',;:cccc:| |,,,;;:cclooddddoll:;'.. ..';cox| \KKK000| |KK00OOkxdocc___;::clldxxkO0KKKKK00Okkxdddddddddddddddoo +// .......'',,,,,''| ________|',,;;::cclloooooolc:;'......___:ldk| \KK000| |XKKK0Okxolc| |;;::cclodxxkkkkxxdoolllcclllooodddooooo +// ''......''''....| | ....'',,,,;;;::cclloooollc:;,''.'| |oxk| \OOO0| |KKK00Oxdoll|___|;;;;;::ccllllllcc::;;,,;;;:cclloooooooo +// ;;,''.......... | |_____',,;;;____:___cllo________.___| |___| \xkk| |KK_______ool___:::;________;;;_______...'',;;:ccclllloo +// c:;,''......... | |:::/ ' |lo/ | | \dx| |0/ \d| |cc/ |'/ \......',,;;:ccllo +// ol:;,'..........| _____|ll/ __ |o/ ______|____ ___| | \o| |/ ___ \| |o/ ______|/ ___ \ .......'',;:clo +// dlc;,...........| |::clooo| / | |x\___ \KXKKK0| |dol| |\ \| | | | | |d\___ \..| | / / ....',:cl +// xoc;'... .....'| |llodddd| \__| |_____\ \KKK0O| |lc:| |'\ | |___| | |_____\ \.| |_/___/... ...',;:c +// dlc;'... ....',;| |oddddddo\ | |Okkx| |::;| |..\ |\ /| | | \ |... ....',;:c +// ol:,'.......',:c|___|xxxddollc\_____,___|_________/ddoll|___|,,,|___|...\_____|:\ ______/l|___|_________/...\________|'........',;::cc +// c:;'.......';:codxxkkkkxxolc::;::clodxkOO0OOkkxdollc::;;,,''''',,,,''''''''''',,'''''',;:loxkkOOkxol:;,'''',,;:ccllcc:;,'''''',;::ccll +// ;,'.......',:codxkOO0OOkxdlc:;,,;;:cldxxkkxxdolc:;;,,''.....'',;;:::;;,,,'''''........,;cldkO0KK0Okdoc::;;::cloodddoolc:;;;;;::ccllooo +// .........',;:lodxOO0000Okdoc:,,',,;:clloddoolc:;,''.......'',;:clooollc:;;,,''.......',:ldkOKXNNXX0Oxdolllloddxxxxxxdolccccccllooodddd +// . .....';:cldxkO0000Okxol:;,''',,;::cccc:;,,'.......'',;:cldxxkkxxdolc:;;,'.......';coxOKXNWWWNXKOkxddddxxkkkkkkxdoollllooddxxxxkkk +// ....',;:codxkO000OOxdoc:;,''',,,;;;;,''.......',,;:clodkO00000Okxolc::;,,''..',;:ldxOKXNWWWNNK0OkkkkkkkkkkkxxddooooodxxkOOOOO000 +// ....',;;clodxkkOOOkkdolc:;,,,,,,,,'..........,;:clodxkO0KKXKK0Okxdolcc::;;,,,;;:codkO0XXNNNNXKK0OOOOOkkkkxxdoollloodxkO0KKKXXXXX +// +// VERSION: 1.1.1 +// https://github.com/Auburn/FastNoiseLite + +// Switch between using floats or doubles for input position +typedef float FNLfloat; +//typedef double FNLfloat; + +// Noise Type +#define FNL_NOISE_OPENSIMPLEX2 0 +#define FNL_NOISE_OPENSIMPLEX2S 1 +#define FNL_NOISE_CELLULAR 2 +#define FNL_NOISE_PERLIN 3 +#define FNL_NOISE_VALUE_CUBIC 4 +#define FNL_NOISE_VALUE 5 +typedef int fnl_noise_type; + +// Rotation types +#define FNL_ROTATION_NONE 0 +#define FNL_ROTATION_IMPROVE_XY_PLANES 1 +#define FNL_ROTATION_IMPROVE_XZ_PLANES 2 +typedef int fnl_rotation_type_3d; + +// Fractal types +#define FNL_FRACTAL_NONE 0 +#define FNL_FRACTAL_FBM 1 +#define FNL_FRACTAL_RIDGED 2 +#define FNL_FRACTAL_PINGPONG 3 +#define FNL_FRACTAL_DOMAIN_WARP_PROGRESSIVE 4 +#define FNL_FRACTAL_DOMAIN_WARP_INDEPENDENT 5 +typedef int fnl_fractal_type; + +#define FNL_CELLULAR_DISTANCE_EUCLIDEAN 0 +#define FNL_CELLULAR_DISTANCE_EUCLIDEANSQ 1 +#define FNL_CELLULAR_DISTANCE_MANHATTAN 2 +#define FNL_CELLULAR_DISTANCE_HYBRID 3 +typedef int fnl_cellular_distance_func; + +#define FNL_CELLULAR_RETURN_TYPE_CELLVALUE 0 +#define FNL_CELLULAR_RETURN_TYPE_DISTANCE 1 +#define FNL_CELLULAR_RETURN_TYPE_DISTANCE2 2 +#define FNL_CELLULAR_RETURN_TYPE_DISTANCE2ADD 3 +#define FNL_CELLULAR_RETURN_TYPE_DISTANCE2SUB 4 +#define FNL_CELLULAR_RETURN_TYPE_DISTANCE2MUL 5 +#define FNL_CELLULAR_RETURN_TYPE_DISTANCE2DIV 6 +typedef int fnl_cellular_return_type; + +#define FNL_DOMAIN_WARP_OPENSIMPLEX2 0 +#define FNL_DOMAIN_WARP_OPENSIMPLEX2_REDUCED 1 +#define FNL_DOMAIN_WARP_BASICGRID 2 +typedef int fnl_domain_warp_type; + +// Removes [0x80004005 - unknown error] 'internal error: no storage type for block output' +#if UNITY_VERSION +# define FNL_FLATTEN [flatten] +# define FNL_UNROLL [unroll(1)] +#else +# define FNL_FLATTEN +# define FNL_UNROLL +#endif + +/** + * Structure containing entire noise system state. + * @note Must only be created using fnlCreateState(optional: seed). To ensure defaults are set. + */ +struct fnl_state +{ + /** + * Seed used for all noise types. + * @remark Default: 1337 + */ + int seed; + + /** + * The frequency for all noise types. + * @remark Default: 0.01 + */ + float frequency; + + /** + * The noise algorithm to be used by GetNoise(...). + * @remark Default: FNL_NOISE_OPENSIMPLEX2 + */ + fnl_noise_type noise_type; + + /** + * Sets noise rotation type for 3D. + * @remark Default: FNL_ROTATION_NONE + */ + fnl_rotation_type_3d rotation_type_3d; + + /** + * The method used for combining octaves for all fractal noise types. + * @remark Default: None + * @remark FNL_FRACTAL_DOMAIN_WARP_... only effects fnlDomainWarp... + */ + fnl_fractal_type fractal_type; + + /** + * The octave count for all fractal noise types. + * @remark Default: 3 + */ + int octaves; + + /** + * The octave lacunarity for all fractal noise types. + * @remark Default: 2.0 + */ + float lacunarity; + + /** + * The octave gain for all fractal noise types. + * @remark Default: 0.5 + */ + float gain; + + /** + * The octave weighting for all none Domaain Warp fractal types. + * @remark Default: 0.0 + * @remark + */ + float weighted_strength; + + /** + * The strength of the fractal ping pong effect. + * @remark Default: 2.0 + */ + float ping_pong_strength; + + /** + * The distance function used in cellular noise calculations. + * @remark Default: FNL_CELLULAR_DISTANCE_EUCLIDEANSQ + */ + fnl_cellular_distance_func cellular_distance_func; + + /** + * The cellular return type from cellular noise calculations. + * @remark Default: FNL_CELLULAR_RETURN_TYPE_DISTANCE + */ + fnl_cellular_return_type cellular_return_type; + + /** + * The maximum distance a cellular point can move from it's grid position. + * @remark Default: 1.0 + * @note Setting this higher than 1 will cause artifacts. + */ + float cellular_jitter_mod; + + /** + * The warp algorithm when using fnlDomainWarp... + * @remark Default: OpenSimplex2 + */ + fnl_domain_warp_type domain_warp_type; + + /** + * The maximum warp distance from original position when using fnlDomainWarp... + * @remark Default: 1.0 + */ + float domain_warp_amp; +}; + +/** + * Creates a noise state with default values. + * @param seed Optionally set the state seed. + */ +fnl_state fnlCreateState(int seed = 1337); + +/** + * 2D noise at given position using the state settings + * @returns Noise output bounded between -1 and 1. + */ +float fnlGetNoise2D(fnl_state state, FNLfloat x, FNLfloat y); + +/** + * 3D noise at given position using the state settings + * @returns Noise output bounded between -1 and 1. + */ +float fnlGetNoise3D(fnl_state state, FNLfloat x, FNLfloat y, FNLfloat z); + +/** + * 2D warps the input position using current domain warp settings. + * + * Example usage with fnlGetNoise2D: + * ``` + * fnlDomainWarp2D(state, x, y); + * noise = fnlGetNoise2D(state, x, y); + * ``` + */ +void fnlDomainWarp2D(fnl_state state, inout FNLfloat x, inout FNLfloat y); + +/** + * 3D warps the input position using current domain warp settings. + * + * Example usage with fnlGetNoise3D: + * ``` + * fnlDomainWarp3D(state, x, y, z); + * noise = fnlGetNoise3D(state, x, y, z); + * ``` + */ +void fnlDomainWarp3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z); + +// From here on, this is private implementation + +// Constants + +static const float GRADIENTS_2D[] = { + 0.130526192220052f, + 0.99144486137381f, + 0.38268343236509f, + 0.923879532511287f, + 0.608761429008721f, + 0.793353340291235f, + 0.793353340291235f, + 0.608761429008721f, + 0.923879532511287f, + 0.38268343236509f, + 0.99144486137381f, + 0.130526192220051f, + 0.99144486137381f, + -0.130526192220051f, + 0.923879532511287f, + -0.38268343236509f, + 0.793353340291235f, + -0.60876142900872f, + 0.608761429008721f, + -0.793353340291235f, + 0.38268343236509f, + -0.923879532511287f, + 0.130526192220052f, + -0.99144486137381f, + -0.130526192220052f, + -0.99144486137381f, + -0.38268343236509f, + -0.923879532511287f, + -0.608761429008721f, + -0.793353340291235f, + -0.793353340291235f, + -0.608761429008721f, + -0.923879532511287f, + -0.38268343236509f, + -0.99144486137381f, + -0.130526192220052f, + -0.99144486137381f, + 0.130526192220051f, + -0.923879532511287f, + 0.38268343236509f, + -0.793353340291235f, + 0.608761429008721f, + -0.608761429008721f, + 0.793353340291235f, + -0.38268343236509f, + 0.923879532511287f, + -0.130526192220052f, + 0.99144486137381f, + 0.130526192220052f, + 0.99144486137381f, + 0.38268343236509f, + 0.923879532511287f, + 0.608761429008721f, + 0.793353340291235f, + 0.793353340291235f, + 0.608761429008721f, + 0.923879532511287f, + 0.38268343236509f, + 0.99144486137381f, + 0.130526192220051f, + 0.99144486137381f, + -0.130526192220051f, + 0.923879532511287f, + -0.38268343236509f, + 0.793353340291235f, + -0.60876142900872f, + 0.608761429008721f, + -0.793353340291235f, + 0.38268343236509f, + -0.923879532511287f, + 0.130526192220052f, + -0.99144486137381f, + -0.130526192220052f, + -0.99144486137381f, + -0.38268343236509f, + -0.923879532511287f, + -0.608761429008721f, + -0.793353340291235f, + -0.793353340291235f, + -0.608761429008721f, + -0.923879532511287f, + -0.38268343236509f, + -0.99144486137381f, + -0.130526192220052f, + -0.99144486137381f, + 0.130526192220051f, + -0.923879532511287f, + 0.38268343236509f, + -0.793353340291235f, + 0.608761429008721f, + -0.608761429008721f, + 0.793353340291235f, + -0.38268343236509f, + 0.923879532511287f, + -0.130526192220052f, + 0.99144486137381f, + 0.130526192220052f, + 0.99144486137381f, + 0.38268343236509f, + 0.923879532511287f, + 0.608761429008721f, + 0.793353340291235f, + 0.793353340291235f, + 0.608761429008721f, + 0.923879532511287f, + 0.38268343236509f, + 0.99144486137381f, + 0.130526192220051f, + 0.99144486137381f, + -0.130526192220051f, + 0.923879532511287f, + -0.38268343236509f, + 0.793353340291235f, + -0.60876142900872f, + 0.608761429008721f, + -0.793353340291235f, + 0.38268343236509f, + -0.923879532511287f, + 0.130526192220052f, + -0.99144486137381f, + -0.130526192220052f, + -0.99144486137381f, + -0.38268343236509f, + -0.923879532511287f, + -0.608761429008721f, + -0.793353340291235f, + -0.793353340291235f, + -0.608761429008721f, + -0.923879532511287f, + -0.38268343236509f, + -0.99144486137381f, + -0.130526192220052f, + -0.99144486137381f, + 0.130526192220051f, + -0.923879532511287f, + 0.38268343236509f, + -0.793353340291235f, + 0.608761429008721f, + -0.608761429008721f, + 0.793353340291235f, + -0.38268343236509f, + 0.923879532511287f, + -0.130526192220052f, + 0.99144486137381f, + 0.130526192220052f, + 0.99144486137381f, + 0.38268343236509f, + 0.923879532511287f, + 0.608761429008721f, + 0.793353340291235f, + 0.793353340291235f, + 0.608761429008721f, + 0.923879532511287f, + 0.38268343236509f, + 0.99144486137381f, + 0.130526192220051f, + 0.99144486137381f, + -0.130526192220051f, + 0.923879532511287f, + -0.38268343236509f, + 0.793353340291235f, + -0.60876142900872f, + 0.608761429008721f, + -0.793353340291235f, + 0.38268343236509f, + -0.923879532511287f, + 0.130526192220052f, + -0.99144486137381f, + -0.130526192220052f, + -0.99144486137381f, + -0.38268343236509f, + -0.923879532511287f, + -0.608761429008721f, + -0.793353340291235f, + -0.793353340291235f, + -0.608761429008721f, + -0.923879532511287f, + -0.38268343236509f, + -0.99144486137381f, + -0.130526192220052f, + -0.99144486137381f, + 0.130526192220051f, + -0.923879532511287f, + 0.38268343236509f, + -0.793353340291235f, + 0.608761429008721f, + -0.608761429008721f, + 0.793353340291235f, + -0.38268343236509f, + 0.923879532511287f, + -0.130526192220052f, + 0.99144486137381f, + 0.130526192220052f, + 0.99144486137381f, + 0.38268343236509f, + 0.923879532511287f, + 0.608761429008721f, + 0.793353340291235f, + 0.793353340291235f, + 0.608761429008721f, + 0.923879532511287f, + 0.38268343236509f, + 0.99144486137381f, + 0.130526192220051f, + 0.99144486137381f, + -0.130526192220051f, + 0.923879532511287f, + -0.38268343236509f, + 0.793353340291235f, + -0.60876142900872f, + 0.608761429008721f, + -0.793353340291235f, + 0.38268343236509f, + -0.923879532511287f, + 0.130526192220052f, + -0.99144486137381f, + -0.130526192220052f, + -0.99144486137381f, + -0.38268343236509f, + -0.923879532511287f, + -0.608761429008721f, + -0.793353340291235f, + -0.793353340291235f, + -0.608761429008721f, + -0.923879532511287f, + -0.38268343236509f, + -0.99144486137381f, + -0.130526192220052f, + -0.99144486137381f, + 0.130526192220051f, + -0.923879532511287f, + 0.38268343236509f, + -0.793353340291235f, + 0.608761429008721f, + -0.608761429008721f, + 0.793353340291235f, + -0.38268343236509f, + 0.923879532511287f, + -0.130526192220052f, + 0.99144486137381f, + 0.38268343236509f, + 0.923879532511287f, + 0.923879532511287f, + 0.38268343236509f, + 0.923879532511287f, + -0.38268343236509f, + 0.38268343236509f, + -0.923879532511287f, + -0.38268343236509f, + -0.923879532511287f, + -0.923879532511287f, + -0.38268343236509f, + -0.923879532511287f, + 0.38268343236509f, + -0.38268343236509f, + 0.923879532511287f, +}; + +static const float RAND_VECS_2D[] = { + -0.2700222198f, + -0.9628540911f, + 0.3863092627f, + -0.9223693152f, + 0.04444859006f, + -0.999011673f, + -0.5992523158f, + -0.8005602176f, + -0.7819280288f, + 0.6233687174f, + 0.9464672271f, + 0.3227999196f, + -0.6514146797f, + -0.7587218957f, + 0.9378472289f, + 0.347048376f, + -0.8497875957f, + -0.5271252623f, + -0.879042592f, + 0.4767432447f, + -0.892300288f, + -0.4514423508f, + -0.379844434f, + -0.9250503802f, + -0.9951650832f, + 0.0982163789f, + 0.7724397808f, + -0.6350880136f, + 0.7573283322f, + -0.6530343002f, + -0.9928004525f, + -0.119780055f, + -0.0532665713f, + 0.9985803285f, + 0.9754253726f, + -0.2203300762f, + -0.7665018163f, + 0.6422421394f, + 0.991636706f, + 0.1290606184f, + -0.994696838f, + 0.1028503788f, + -0.5379205513f, + -0.84299554f, + 0.5022815471f, + -0.8647041387f, + 0.4559821461f, + -0.8899889226f, + -0.8659131224f, + -0.5001944266f, + 0.0879458407f, + -0.9961252577f, + -0.5051684983f, + 0.8630207346f, + 0.7753185226f, + -0.6315704146f, + -0.6921944612f, + 0.7217110418f, + -0.5191659449f, + -0.8546734591f, + 0.8978622882f, + -0.4402764035f, + -0.1706774107f, + 0.9853269617f, + -0.9353430106f, + -0.3537420705f, + -0.9992404798f, + 0.03896746794f, + -0.2882064021f, + -0.9575683108f, + -0.9663811329f, + 0.2571137995f, + -0.8759714238f, + -0.4823630009f, + -0.8303123018f, + -0.5572983775f, + 0.05110133755f, + -0.9986934731f, + -0.8558373281f, + -0.5172450752f, + 0.09887025282f, + 0.9951003332f, + 0.9189016087f, + 0.3944867976f, + -0.2439375892f, + -0.9697909324f, + -0.8121409387f, + -0.5834613061f, + -0.9910431363f, + 0.1335421355f, + 0.8492423985f, + -0.5280031709f, + -0.9717838994f, + -0.2358729591f, + 0.9949457207f, + 0.1004142068f, + 0.6241065508f, + -0.7813392434f, + 0.662910307f, + 0.7486988212f, + -0.7197418176f, + 0.6942418282f, + -0.8143370775f, + -0.5803922158f, + 0.104521054f, + -0.9945226741f, + -0.1065926113f, + -0.9943027784f, + 0.445799684f, + -0.8951327509f, + 0.105547406f, + 0.9944142724f, + -0.992790267f, + 0.1198644477f, + -0.8334366408f, + 0.552615025f, + 0.9115561563f, + -0.4111755999f, + 0.8285544909f, + -0.5599084351f, + 0.7217097654f, + -0.6921957921f, + 0.4940492677f, + -0.8694339084f, + -0.3652321272f, + -0.9309164803f, + -0.9696606758f, + 0.2444548501f, + 0.08925509731f, + -0.996008799f, + 0.5354071276f, + -0.8445941083f, + -0.1053576186f, + 0.9944343981f, + -0.9890284586f, + 0.1477251101f, + 0.004856104961f, + 0.9999882091f, + 0.9885598478f, + 0.1508291331f, + 0.9286129562f, + -0.3710498316f, + -0.5832393863f, + -0.8123003252f, + 0.3015207509f, + 0.9534596146f, + -0.9575110528f, + 0.2883965738f, + 0.9715802154f, + -0.2367105511f, + 0.229981792f, + 0.9731949318f, + 0.955763816f, + -0.2941352207f, + 0.740956116f, + 0.6715534485f, + -0.9971513787f, + -0.07542630764f, + 0.6905710663f, + -0.7232645452f, + -0.290713703f, + -0.9568100872f, + 0.5912777791f, + -0.8064679708f, + -0.9454592212f, + -0.325740481f, + 0.6664455681f, + 0.74555369f, + 0.6236134912f, + 0.7817328275f, + 0.9126993851f, + -0.4086316587f, + -0.8191762011f, + 0.5735419353f, + -0.8812745759f, + -0.4726046147f, + 0.9953313627f, + 0.09651672651f, + 0.9855650846f, + -0.1692969699f, + -0.8495980887f, + 0.5274306472f, + 0.6174853946f, + -0.7865823463f, + 0.8508156371f, + 0.52546432f, + 0.9985032451f, + -0.05469249926f, + 0.1971371563f, + -0.9803759185f, + 0.6607855748f, + -0.7505747292f, + -0.03097494063f, + 0.9995201614f, + -0.6731660801f, + 0.739491331f, + -0.7195018362f, + -0.6944905383f, + 0.9727511689f, + 0.2318515979f, + 0.9997059088f, + -0.0242506907f, + 0.4421787429f, + -0.8969269532f, + 0.9981350961f, + -0.061043673f, + -0.9173660799f, + -0.3980445648f, + -0.8150056635f, + -0.5794529907f, + -0.8789331304f, + 0.4769450202f, + 0.0158605829f, + 0.999874213f, + -0.8095464474f, + 0.5870558317f, + -0.9165898907f, + -0.3998286786f, + -0.8023542565f, + 0.5968480938f, + -0.5176737917f, + 0.8555780767f, + -0.8154407307f, + -0.5788405779f, + 0.4022010347f, + -0.9155513791f, + -0.9052556868f, + -0.4248672045f, + 0.7317445619f, + 0.6815789728f, + -0.5647632201f, + -0.8252529947f, + -0.8403276335f, + -0.5420788397f, + -0.9314281527f, + 0.363925262f, + 0.5238198472f, + 0.8518290719f, + 0.7432803869f, + -0.6689800195f, + -0.985371561f, + -0.1704197369f, + 0.4601468731f, + 0.88784281f, + 0.825855404f, + 0.5638819483f, + 0.6182366099f, + 0.7859920446f, + 0.8331502863f, + -0.553046653f, + 0.1500307506f, + 0.9886813308f, + -0.662330369f, + -0.7492119075f, + -0.668598664f, + 0.743623444f, + 0.7025606278f, + 0.7116238924f, + -0.5419389763f, + -0.8404178401f, + -0.3388616456f, + 0.9408362159f, + 0.8331530315f, + 0.5530425174f, + -0.2989720662f, + -0.9542618632f, + 0.2638522993f, + 0.9645630949f, + 0.124108739f, + -0.9922686234f, + -0.7282649308f, + -0.6852956957f, + 0.6962500149f, + 0.7177993569f, + -0.9183535368f, + 0.3957610156f, + -0.6326102274f, + -0.7744703352f, + -0.9331891859f, + -0.359385508f, + -0.1153779357f, + -0.9933216659f, + 0.9514974788f, + -0.3076565421f, + -0.08987977445f, + -0.9959526224f, + 0.6678496916f, + 0.7442961705f, + 0.7952400393f, + -0.6062947138f, + -0.6462007402f, + -0.7631674805f, + -0.2733598753f, + 0.9619118351f, + 0.9669590226f, + -0.254931851f, + -0.9792894595f, + 0.2024651934f, + -0.5369502995f, + -0.8436138784f, + -0.270036471f, + -0.9628500944f, + -0.6400277131f, + 0.7683518247f, + -0.7854537493f, + -0.6189203566f, + 0.06005905383f, + -0.9981948257f, + -0.02455770378f, + 0.9996984141f, + -0.65983623f, + 0.751409442f, + -0.6253894466f, + -0.7803127835f, + -0.6210408851f, + -0.7837781695f, + 0.8348888491f, + 0.5504185768f, + -0.1592275245f, + 0.9872419133f, + 0.8367622488f, + 0.5475663786f, + -0.8675753916f, + -0.4973056806f, + -0.2022662628f, + -0.9793305667f, + 0.9399189937f, + 0.3413975472f, + 0.9877404807f, + -0.1561049093f, + -0.9034455656f, + 0.4287028224f, + 0.1269804218f, + -0.9919052235f, + -0.3819600854f, + 0.924178821f, + 0.9754625894f, + 0.2201652486f, + -0.3204015856f, + -0.9472818081f, + -0.9874760884f, + 0.1577687387f, + 0.02535348474f, + -0.9996785487f, + 0.4835130794f, + -0.8753371362f, + -0.2850799925f, + -0.9585037287f, + -0.06805516006f, + -0.99768156f, + -0.7885244045f, + -0.6150034663f, + 0.3185392127f, + -0.9479096845f, + 0.8880043089f, + 0.4598351306f, + 0.6476921488f, + -0.7619021462f, + 0.9820241299f, + 0.1887554194f, + 0.9357275128f, + -0.3527237187f, + -0.8894895414f, + 0.4569555293f, + 0.7922791302f, + 0.6101588153f, + 0.7483818261f, + 0.6632681526f, + -0.7288929755f, + -0.6846276581f, + 0.8729032783f, + -0.4878932944f, + 0.8288345784f, + 0.5594937369f, + 0.08074567077f, + 0.9967347374f, + 0.9799148216f, + -0.1994165048f, + -0.580730673f, + -0.8140957471f, + -0.4700049791f, + -0.8826637636f, + 0.2409492979f, + 0.9705377045f, + 0.9437816757f, + -0.3305694308f, + -0.8927998638f, + -0.4504535528f, + -0.8069622304f, + 0.5906030467f, + 0.06258973166f, + 0.9980393407f, + -0.9312597469f, + 0.3643559849f, + 0.5777449785f, + 0.8162173362f, + -0.3360095855f, + -0.941858566f, + 0.697932075f, + -0.7161639607f, + -0.002008157227f, + -0.9999979837f, + -0.1827294312f, + -0.9831632392f, + -0.6523911722f, + 0.7578824173f, + -0.4302626911f, + -0.9027037258f, + -0.9985126289f, + -0.05452091251f, + -0.01028102172f, + -0.9999471489f, + -0.4946071129f, + 0.8691166802f, + -0.2999350194f, + 0.9539596344f, + 0.8165471961f, + 0.5772786819f, + 0.2697460475f, + 0.962931498f, + -0.7306287391f, + -0.6827749597f, + -0.7590952064f, + -0.6509796216f, + -0.907053853f, + 0.4210146171f, + -0.5104861064f, + -0.8598860013f, + 0.8613350597f, + 0.5080373165f, + 0.5007881595f, + -0.8655698812f, + -0.654158152f, + 0.7563577938f, + -0.8382755311f, + -0.545246856f, + 0.6940070834f, + 0.7199681717f, + 0.06950936031f, + 0.9975812994f, + 0.1702942185f, + -0.9853932612f, + 0.2695973274f, + 0.9629731466f, + 0.5519612192f, + -0.8338697815f, + 0.225657487f, + -0.9742067022f, + 0.4215262855f, + -0.9068161835f, + 0.4881873305f, + -0.8727388672f, + -0.3683854996f, + -0.9296731273f, + -0.9825390578f, + 0.1860564427f, + 0.81256471f, + 0.5828709909f, + 0.3196460933f, + -0.9475370046f, + 0.9570913859f, + 0.2897862643f, + -0.6876655497f, + -0.7260276109f, + -0.9988770922f, + -0.047376731f, + -0.1250179027f, + 0.992154486f, + -0.8280133617f, + 0.560708367f, + 0.9324863769f, + -0.3612051451f, + 0.6394653183f, + 0.7688199442f, + -0.01623847064f, + -0.9998681473f, + -0.9955014666f, + -0.09474613458f, + -0.81453315f, + 0.580117012f, + 0.4037327978f, + -0.9148769469f, + 0.9944263371f, + 0.1054336766f, + -0.1624711654f, + 0.9867132919f, + -0.9949487814f, + -0.100383875f, + -0.6995302564f, + 0.7146029809f, + 0.5263414922f, + -0.85027327f, + -0.5395221479f, + 0.841971408f, + 0.6579370318f, + 0.7530729462f, + 0.01426758847f, + -0.9998982128f, + -0.6734383991f, + 0.7392433447f, + 0.639412098f, + -0.7688642071f, + 0.9211571421f, + 0.3891908523f, + -0.146637214f, + -0.9891903394f, + -0.782318098f, + 0.6228791163f, + -0.5039610839f, + -0.8637263605f, + -0.7743120191f, + -0.6328039957f, +}; + +static const float GRADIENTS_3D[] = { + 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, + 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, + 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, + 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, + 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, + 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, + 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, + 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, + 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, + 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, + 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, + 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, + 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, + 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, + 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, + 1, 1, 0, 0, 0, -1, 1, 0, -1, 1, 0, 0, 0, -1, -1, 0 +}; + +static const float RAND_VECS_3D[] = { + -0.7292736885f, -0.6618439697f, 0.1735581948f, 0, 0.790292081f, -0.5480887466f, -0.2739291014f, 0, 0.7217578935f, 0.6226212466f, -0.3023380997f, 0, 0.565683137f, -0.8208298145f, -0.0790000257f, 0, 0.760049034f, -0.5555979497f, -0.3370999617f, 0, 0.3713945616f, 0.5011264475f, 0.7816254623f, 0, -0.1277062463f, -0.4254438999f, -0.8959289049f, 0, -0.2881560924f, -0.5815838982f, 0.7607405838f, 0, + 0.5849561111f, -0.662820239f, -0.4674352136f, 0, 0.3307171178f, 0.0391653737f, 0.94291689f, 0, 0.8712121778f, -0.4113374369f, -0.2679381538f, 0, 0.580981015f, 0.7021915846f, 0.4115677815f, 0, 0.503756873f, 0.6330056931f, -0.5878203852f, 0, 0.4493712205f, 0.601390195f, 0.6606022552f, 0, -0.6878403724f, 0.09018890807f, -0.7202371714f, 0, -0.5958956522f, -0.6469350577f, 0.475797649f, 0, + -0.5127052122f, 0.1946921978f, -0.8361987284f, 0, -0.9911507142f, -0.05410276466f, -0.1212153153f, 0, -0.2149721042f, 0.9720882117f, -0.09397607749f, 0, -0.7518650936f, -0.5428057603f, 0.3742469607f, 0, 0.5237068895f, 0.8516377189f, -0.02107817834f, 0, 0.6333504779f, 0.1926167129f, -0.7495104896f, 0, -0.06788241606f, 0.3998305789f, 0.9140719259f, 0, -0.5538628599f, -0.4729896695f, -0.6852128902f, 0, + -0.7261455366f, -0.5911990757f, 0.3509933228f, 0, -0.9229274737f, -0.1782808786f, 0.3412049336f, 0, -0.6968815002f, 0.6511274338f, 0.3006480328f, 0, 0.9608044783f, -0.2098363234f, -0.1811724921f, 0, 0.06817146062f, -0.9743405129f, 0.2145069156f, 0, -0.3577285196f, -0.6697087264f, -0.6507845481f, 0, -0.1868621131f, 0.7648617052f, -0.6164974636f, 0, -0.6541697588f, 0.3967914832f, 0.6439087246f, 0, + 0.6993340405f, -0.6164538506f, 0.3618239211f, 0, -0.1546665739f, 0.6291283928f, 0.7617583057f, 0, -0.6841612949f, -0.2580482182f, -0.6821542638f, 0, 0.5383980957f, 0.4258654885f, 0.7271630328f, 0, -0.5026987823f, -0.7939832935f, -0.3418836993f, 0, 0.3202971715f, 0.2834415347f, 0.9039195862f, 0, 0.8683227101f, -0.0003762656404f, -0.4959995258f, 0, 0.791120031f, -0.08511045745f, 0.6057105799f, 0, + -0.04011016052f, -0.4397248749f, 0.8972364289f, 0, 0.9145119872f, 0.3579346169f, -0.1885487608f, 0, -0.9612039066f, -0.2756484276f, 0.01024666929f, 0, 0.6510361721f, -0.2877799159f, -0.7023778346f, 0, -0.2041786351f, 0.7365237271f, 0.644859585f, 0, -0.7718263711f, 0.3790626912f, 0.5104855816f, 0, -0.3060082741f, -0.7692987727f, 0.5608371729f, 0, 0.454007341f, -0.5024843065f, 0.7357899537f, 0, + 0.4816795475f, 0.6021208291f, -0.6367380315f, 0, 0.6961980369f, -0.3222197429f, 0.641469197f, 0, -0.6532160499f, -0.6781148932f, 0.3368515753f, 0, 0.5089301236f, -0.6154662304f, -0.6018234363f, 0, -0.1635919754f, -0.9133604627f, -0.372840892f, 0, 0.52408019f, -0.8437664109f, 0.1157505864f, 0, 0.5902587356f, 0.4983817807f, -0.6349883666f, 0, 0.5863227872f, 0.494764745f, 0.6414307729f, 0, + 0.6779335087f, 0.2341345225f, 0.6968408593f, 0, 0.7177054546f, -0.6858979348f, 0.120178631f, 0, -0.5328819713f, -0.5205125012f, 0.6671608058f, 0, -0.8654874251f, -0.0700727088f, -0.4960053754f, 0, -0.2861810166f, 0.7952089234f, 0.5345495242f, 0, -0.04849529634f, 0.9810836427f, -0.1874115585f, 0, -0.6358521667f, 0.6058348682f, 0.4781800233f, 0, 0.6254794696f, -0.2861619734f, 0.7258696564f, 0, + -0.2585259868f, 0.5061949264f, -0.8227581726f, 0, 0.02136306781f, 0.5064016808f, -0.8620330371f, 0, 0.200111773f, 0.8599263484f, 0.4695550591f, 0, 0.4743561372f, 0.6014985084f, -0.6427953014f, 0, 0.6622993731f, -0.5202474575f, -0.5391679918f, 0, 0.08084972818f, -0.6532720452f, 0.7527940996f, 0, -0.6893687501f, 0.0592860349f, 0.7219805347f, 0, -0.1121887082f, -0.9673185067f, 0.2273952515f, 0, + 0.7344116094f, 0.5979668656f, -0.3210532909f, 0, 0.5789393465f, -0.2488849713f, 0.7764570201f, 0, 0.6988182827f, 0.3557169806f, -0.6205791146f, 0, -0.8636845529f, -0.2748771249f, -0.4224826141f, 0, -0.4247027957f, -0.4640880967f, 0.777335046f, 0, 0.5257722489f, -0.8427017621f, 0.1158329937f, 0, 0.9343830603f, 0.316302472f, -0.1639543925f, 0, -0.1016836419f, -0.8057303073f, -0.5834887393f, 0, + -0.6529238969f, 0.50602126f, -0.5635892736f, 0, -0.2465286165f, -0.9668205684f, -0.06694497494f, 0, -0.9776897119f, -0.2099250524f, -0.007368825344f, 0, 0.7736893337f, 0.5734244712f, 0.2694238123f, 0, -0.6095087895f, 0.4995678998f, 0.6155736747f, 0, 0.5794535482f, 0.7434546771f, 0.3339292269f, 0, -0.8226211154f, 0.08142581855f, 0.5627293636f, 0, -0.510385483f, 0.4703667658f, 0.7199039967f, 0, + -0.5764971849f, -0.07231656274f, -0.8138926898f, 0, 0.7250628871f, 0.3949971505f, -0.5641463116f, 0, -0.1525424005f, 0.4860840828f, -0.8604958341f, 0, -0.5550976208f, -0.4957820792f, 0.667882296f, 0, -0.1883614327f, 0.9145869398f, 0.357841725f, 0, 0.7625556724f, -0.5414408243f, -0.3540489801f, 0, -0.5870231946f, -0.3226498013f, -0.7424963803f, 0, 0.3051124198f, 0.2262544068f, -0.9250488391f, 0, + 0.6379576059f, 0.577242424f, -0.5097070502f, 0, -0.5966775796f, 0.1454852398f, -0.7891830656f, 0, -0.658330573f, 0.6555487542f, -0.3699414651f, 0, 0.7434892426f, 0.2351084581f, 0.6260573129f, 0, 0.5562114096f, 0.8264360377f, -0.0873632843f, 0, -0.3028940016f, -0.8251527185f, 0.4768419182f, 0, 0.1129343818f, -0.985888439f, -0.1235710781f, 0, 0.5937652891f, -0.5896813806f, 0.5474656618f, 0, + 0.6757964092f, -0.5835758614f, -0.4502648413f, 0, 0.7242302609f, -0.1152719764f, 0.6798550586f, 0, -0.9511914166f, 0.0753623979f, -0.2992580792f, 0, 0.2539470961f, -0.1886339355f, 0.9486454084f, 0, 0.571433621f, -0.1679450851f, -0.8032795685f, 0, -0.06778234979f, 0.3978269256f, 0.9149531629f, 0, 0.6074972649f, 0.733060024f, -0.3058922593f, 0, -0.5435478392f, 0.1675822484f, 0.8224791405f, 0, + -0.5876678086f, -0.3380045064f, -0.7351186982f, 0, -0.7967562402f, 0.04097822706f, -0.6029098428f, 0, -0.1996350917f, 0.8706294745f, 0.4496111079f, 0, -0.02787660336f, -0.9106232682f, -0.4122962022f, 0, -0.7797625996f, -0.6257634692f, 0.01975775581f, 0, -0.5211232846f, 0.7401644346f, -0.4249554471f, 0, 0.8575424857f, 0.4053272873f, -0.3167501783f, 0, 0.1045223322f, 0.8390195772f, -0.5339674439f, 0, + 0.3501822831f, 0.9242524096f, -0.1520850155f, 0, 0.1987849858f, 0.07647613266f, 0.9770547224f, 0, 0.7845996363f, 0.6066256811f, -0.1280964233f, 0, 0.09006737436f, -0.9750989929f, -0.2026569073f, 0, -0.8274343547f, -0.542299559f, 0.1458203587f, 0, -0.3485797732f, -0.415802277f, 0.840000362f, 0, -0.2471778936f, -0.7304819962f, -0.6366310879f, 0, -0.3700154943f, 0.8577948156f, 0.3567584454f, 0, + 0.5913394901f, -0.548311967f, -0.5913303597f, 0, 0.1204873514f, -0.7626472379f, -0.6354935001f, 0, 0.616959265f, 0.03079647928f, 0.7863922953f, 0, 0.1258156836f, -0.6640829889f, -0.7369967419f, 0, -0.6477565124f, -0.1740147258f, -0.7417077429f, 0, 0.6217889313f, -0.7804430448f, -0.06547655076f, 0, 0.6589943422f, -0.6096987708f, 0.4404473475f, 0, -0.2689837504f, -0.6732403169f, -0.6887635427f, 0, + -0.3849775103f, 0.5676542638f, 0.7277093879f, 0, 0.5754444408f, 0.8110471154f, -0.1051963504f, 0, 0.9141593684f, 0.3832947817f, 0.131900567f, 0, -0.107925319f, 0.9245493968f, 0.3654593525f, 0, 0.377977089f, 0.3043148782f, 0.8743716458f, 0, -0.2142885215f, -0.8259286236f, 0.5214617324f, 0, 0.5802544474f, 0.4148098596f, -0.7008834116f, 0, -0.1982660881f, 0.8567161266f, -0.4761596756f, 0, + -0.03381553704f, 0.3773180787f, -0.9254661404f, 0, -0.6867922841f, -0.6656597827f, 0.2919133642f, 0, 0.7731742607f, -0.2875793547f, -0.5652430251f, 0, -0.09655941928f, 0.9193708367f, -0.3813575004f, 0, 0.2715702457f, -0.9577909544f, -0.09426605581f, 0, 0.2451015704f, -0.6917998565f, -0.6792188003f, 0, 0.977700782f, -0.1753855374f, 0.1155036542f, 0, -0.5224739938f, 0.8521606816f, 0.02903615945f, 0, + -0.7734880599f, -0.5261292347f, 0.3534179531f, 0, -0.7134492443f, -0.269547243f, 0.6467878011f, 0, 0.1644037271f, 0.5105846203f, -0.8439637196f, 0, 0.6494635788f, 0.05585611296f, 0.7583384168f, 0, -0.4711970882f, 0.5017280509f, -0.7254255765f, 0, -0.6335764307f, -0.2381686273f, -0.7361091029f, 0, -0.9021533097f, -0.270947803f, -0.3357181763f, 0, -0.3793711033f, 0.872258117f, 0.3086152025f, 0, + -0.6855598966f, -0.3250143309f, 0.6514394162f, 0, 0.2900942212f, -0.7799057743f, -0.5546100667f, 0, -0.2098319339f, 0.85037073f, 0.4825351604f, 0, -0.4592603758f, 0.6598504336f, -0.5947077538f, 0, 0.8715945488f, 0.09616365406f, -0.4807031248f, 0, -0.6776666319f, 0.7118504878f, -0.1844907016f, 0, 0.7044377633f, 0.312427597f, 0.637304036f, 0, -0.7052318886f, -0.2401093292f, -0.6670798253f, 0, + 0.081921007f, -0.7207336136f, -0.6883545647f, 0, -0.6993680906f, -0.5875763221f, -0.4069869034f, 0, -0.1281454481f, 0.6419895885f, 0.7559286424f, 0, -0.6337388239f, -0.6785471501f, -0.3714146849f, 0, 0.5565051903f, -0.2168887573f, -0.8020356851f, 0, -0.5791554484f, 0.7244372011f, -0.3738578718f, 0, 0.1175779076f, -0.7096451073f, 0.6946792478f, 0, -0.6134619607f, 0.1323631078f, 0.7785527795f, 0, + 0.6984635305f, -0.02980516237f, -0.715024719f, 0, 0.8318082963f, -0.3930171956f, 0.3919597455f, 0, 0.1469576422f, 0.05541651717f, -0.9875892167f, 0, 0.708868575f, -0.2690503865f, 0.6520101478f, 0, 0.2726053183f, 0.67369766f, -0.68688995f, 0, -0.6591295371f, 0.3035458599f, -0.6880466294f, 0, 0.4815131379f, -0.7528270071f, 0.4487723203f, 0, 0.9430009463f, 0.1675647412f, -0.2875261255f, 0, + 0.434802957f, 0.7695304522f, -0.4677277752f, 0, 0.3931996188f, 0.594473625f, 0.7014236729f, 0, 0.7254336655f, -0.603925654f, 0.3301814672f, 0, 0.7590235227f, -0.6506083235f, 0.02433313207f, 0, -0.8552768592f, -0.3430042733f, 0.3883935666f, 0, -0.6139746835f, 0.6981725247f, 0.3682257648f, 0, -0.7465905486f, -0.5752009504f, 0.3342849376f, 0, 0.5730065677f, 0.810555537f, -0.1210916791f, 0, + -0.9225877367f, -0.3475211012f, -0.167514036f, 0, -0.7105816789f, -0.4719692027f, -0.5218416899f, 0, -0.08564609717f, 0.3583001386f, 0.929669703f, 0, -0.8279697606f, -0.2043157126f, 0.5222271202f, 0, 0.427944023f, 0.278165994f, 0.8599346446f, 0, 0.5399079671f, -0.7857120652f, -0.3019204161f, 0, 0.5678404253f, -0.5495413974f, -0.6128307303f, 0, -0.9896071041f, 0.1365639107f, -0.04503418428f, 0, + -0.6154342638f, -0.6440875597f, 0.4543037336f, 0, 0.1074204368f, -0.7946340692f, 0.5975094525f, 0, -0.3595449969f, -0.8885529948f, 0.28495784f, 0, -0.2180405296f, 0.1529888965f, 0.9638738118f, 0, -0.7277432317f, -0.6164050508f, -0.3007234646f, 0, 0.7249729114f, -0.00669719484f, 0.6887448187f, 0, -0.5553659455f, -0.5336586252f, 0.6377908264f, 0, 0.5137558015f, 0.7976208196f, -0.3160000073f, 0, + -0.3794024848f, 0.9245608561f, -0.03522751494f, 0, 0.8229248658f, 0.2745365933f, -0.4974176556f, 0, -0.5404114394f, 0.6091141441f, 0.5804613989f, 0, 0.8036581901f, -0.2703029469f, 0.5301601931f, 0, 0.6044318879f, 0.6832968393f, 0.4095943388f, 0, 0.06389988817f, 0.9658208605f, -0.2512108074f, 0, 0.1087113286f, 0.7402471173f, -0.6634877936f, 0, -0.713427712f, -0.6926784018f, 0.1059128479f, 0, + 0.6458897819f, -0.5724548511f, -0.5050958653f, 0, -0.6553931414f, 0.7381471625f, 0.159995615f, 0, 0.3910961323f, 0.9188871375f, -0.05186755998f, 0, -0.4879022471f, -0.5904376907f, 0.6429111375f, 0, 0.6014790094f, 0.7707441366f, -0.2101820095f, 0, -0.5677173047f, 0.7511360995f, 0.3368851762f, 0, 0.7858573506f, 0.226674665f, 0.5753666838f, 0, -0.4520345543f, -0.604222686f, -0.6561857263f, 0, + 0.002272116345f, 0.4132844051f, -0.9105991643f, 0, -0.5815751419f, -0.5162925989f, 0.6286591339f, 0, -0.03703704785f, 0.8273785755f, 0.5604221175f, 0, -0.5119692504f, 0.7953543429f, -0.3244980058f, 0, -0.2682417366f, -0.9572290247f, -0.1084387619f, 0, -0.2322482736f, -0.9679131102f, -0.09594243324f, 0, 0.3554328906f, -0.8881505545f, 0.2913006227f, 0, 0.7346520519f, -0.4371373164f, 0.5188422971f, 0, + 0.9985120116f, 0.04659011161f, -0.02833944577f, 0, -0.3727687496f, -0.9082481361f, 0.1900757285f, 0, 0.91737377f, -0.3483642108f, 0.1925298489f, 0, 0.2714911074f, 0.4147529736f, -0.8684886582f, 0, 0.5131763485f, -0.7116334161f, 0.4798207128f, 0, -0.8737353606f, 0.18886992f, -0.4482350644f, 0, 0.8460043821f, -0.3725217914f, 0.3814499973f, 0, 0.8978727456f, -0.1780209141f, -0.4026575304f, 0, + 0.2178065647f, -0.9698322841f, -0.1094789531f, 0, -0.1518031304f, -0.7788918132f, -0.6085091231f, 0, -0.2600384876f, -0.4755398075f, -0.8403819825f, 0, 0.572313509f, -0.7474340931f, -0.3373418503f, 0, -0.7174141009f, 0.1699017182f, -0.6756111411f, 0, -0.684180784f, 0.02145707593f, -0.7289967412f, 0, -0.2007447902f, 0.06555605789f, -0.9774476623f, 0, -0.1148803697f, -0.8044887315f, 0.5827524187f, 0, + -0.7870349638f, 0.03447489231f, 0.6159443543f, 0, -0.2015596421f, 0.6859872284f, 0.6991389226f, 0, -0.08581082512f, -0.10920836f, -0.9903080513f, 0, 0.5532693395f, 0.7325250401f, -0.396610771f, 0, -0.1842489331f, -0.9777375055f, -0.1004076743f, 0, 0.0775473789f, -0.9111505856f, 0.4047110257f, 0, 0.1399838409f, 0.7601631212f, -0.6344734459f, 0, 0.4484419361f, -0.845289248f, 0.2904925424f, 0 +}; + +// Utilities + +static inline float _fnlFastMin(float x, float y) { return x < y ? x : y; } + +static inline float _fnlFastMax(float x, float y) { return x > y ? x : y; } + +static inline float _fnlFastAbs(float f) { return f < 0 ? -f : f; } + +static inline float _fnlFastSqrt(float a) { return sqrt(a); } + +static inline int _fnlFastFloor(FNLfloat f) { return (f >= 0 ? (int)f : (int)f - 1); } + +static inline int _fnlFastRound(FNLfloat f) { return (f >= 0) ? (int)(f + 0.5f) : (int)(f - 0.5f); } + +static inline float _fnlLerp(float a, float b, float t) { return a + t * (b - a); } + +static inline float _fnlInterpHermite(float t) { return t * t * (3 - 2 * t); } + +static inline float _fnlInterpQuintic(float t) { return t * t * t * (t * (t * 6 - 15) + 10); } + +static inline float _fnlCubicLerp(float a, float b, float c, float d, float t) +{ + float p = (d - c) - (a - b); + return t * t * t * p + t * t * ((a - b) - p) + t * (c - a) + b; +} + +static inline float _fnlPingPong(float t) +{ + t -= (int)(t * 0.5f) * 2; + return t < 1 ? t : 2 - t; +} + +static float _fnlCalculateFractalBounding(fnl_state state) +{ + float gain = _fnlFastAbs(state.gain); + float amp = gain; + float ampFractal = 1.0f; + for (int i = 1; i < state.octaves; i++) { + ampFractal += amp; + amp *= gain; + } + return 1.0f / ampFractal; +} + +// Hashing + +static const int PRIME_X = 501125321; +static const int PRIME_Y = 1136930381; +static const int PRIME_Z = 1720413743; + +static inline int _fnlHash2D(int seed, int xPrimed, int yPrimed) +{ + int hash = seed ^ xPrimed ^ yPrimed; + + hash *= 0x27d4eb2d; + return hash; +} + +static inline int _fnlHash3D(int seed, int xPrimed, int yPrimed, int zPrimed) +{ + int hash = seed ^ xPrimed ^ yPrimed ^ zPrimed; + + hash *= 0x27d4eb2d; + return hash; +} + +static inline float _fnlValCoord2D(int seed, int xPrimed, int yPrimed) +{ + int hash = _fnlHash2D(seed, xPrimed, yPrimed); + hash *= hash; + hash ^= hash << 19; + return hash * (1 / 2147483648.0f); +} + +static inline float _fnlValCoord3D(int seed, int xPrimed, int yPrimed, int zPrimed) +{ + int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed); + hash *= hash; + hash ^= hash << 19; + return hash * (1 / 2147483648.0f); +} + +static inline float _fnlGradCoord2D(int seed, int xPrimed, int yPrimed, float xd, float yd) +{ + int hash = _fnlHash2D(seed, xPrimed, yPrimed); + hash ^= hash >> 15; + hash &= 127 << 1; + return xd * GRADIENTS_2D[hash] + yd * GRADIENTS_2D[hash | 1]; +} + +static inline float _fnlGradCoord3D(int seed, int xPrimed, int yPrimed, int zPrimed, float xd, float yd, float zd) +{ + int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed); + hash ^= hash >> 15; + hash &= 63 << 2; + return xd * GRADIENTS_3D[hash] + yd * GRADIENTS_3D[hash | 1] + zd * GRADIENTS_3D[hash | 2]; +} + +static inline void _fnlGradCoordOut2D(int seed, int xPrimed, int yPrimed, out float xo, out float yo) +{ + int hash = _fnlHash2D(seed, xPrimed, yPrimed) & (255 << 1); + + xo = RAND_VECS_2D[hash]; + yo = RAND_VECS_2D[hash | 1]; +} + +static inline void _fnlGradCoordOut3D(int seed, int xPrimed, int yPrimed, int zPrimed, out float xo, out float yo, out float zo) +{ + int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed) & (255 << 2); + + xo = RAND_VECS_3D[hash]; + yo = RAND_VECS_3D[hash | 1]; + zo = RAND_VECS_3D[hash | 2]; +} + +static inline void _fnlGradCoordDual2D(int seed, int xPrimed, int yPrimed, float xd, float yd, out float xo, out float yo) +{ + int hash = _fnlHash2D(seed, xPrimed, yPrimed); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + + float xg = GRADIENTS_2D[index1]; + float yg = GRADIENTS_2D[index1 | 1]; + float value = xd * xg + yd * yg; + + float xgo = RAND_VECS_2D[index2]; + float ygo = RAND_VECS_2D[index2 | 1]; + + xo = value * xgo; + yo = value * ygo; +} + +static inline void _fnlGradCoordDual3D(int seed, int xPrimed, int yPrimed, int zPrimed, float xd, float yd, float zd, out float xo, out float yo, out float zo) +{ + int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed); + int index1 = hash & (63 << 2); + int index2 = (hash >> 6) & (255 << 2); + + float xg = GRADIENTS_3D[index1]; + float yg = GRADIENTS_3D[index1 | 1]; + float zg = GRADIENTS_3D[index1 | 2]; + float value = xd * xg + yd * yg + zd * zg; + + float xgo = RAND_VECS_3D[index2]; + float ygo = RAND_VECS_3D[index2 | 1]; + float zgo = RAND_VECS_3D[index2 | 2]; + + xo = value * xgo; + yo = value * ygo; + zo = value * zgo; +} + +// Generic Noise Gen + +static float _fnlSingleSimplex2D(int seed, FNLfloat x, FNLfloat y); +static float _fnlSingleOpenSimplex23D(int seed, FNLfloat x, FNLfloat y, FNLfloat z); +static float _fnlSingleOpenSimplex2S2D(int seed, FNLfloat x, FNLfloat y); +static float _fnlSingleOpenSimplex2S3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z); +static float _fnlSingleCellular2D(fnl_state state, int seed, FNLfloat x, FNLfloat y); +static float _fnlSingleCellular3D(fnl_state state, int seed, FNLfloat x, FNLfloat y, FNLfloat z); +static float _fnlSinglePerlin2D(int seed, FNLfloat x, FNLfloat y); +static float _fnlSinglePerlin3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z); +static float _fnlSingleValueCubic2D(int seed, FNLfloat x, FNLfloat y); +static float _fnlSingleValueCubic3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z); +static float _fnlSingleValue2D(int seed, FNLfloat x, FNLfloat y); +static float _fnlSingleValue3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z); + +static float _fnlGenNoiseSingle2D(fnl_state state, int seed, FNLfloat x, FNLfloat y) +{ + FNL_FLATTEN switch (state.noise_type) + { + case FNL_NOISE_OPENSIMPLEX2: + return _fnlSingleSimplex2D(seed, x, y); + case FNL_NOISE_OPENSIMPLEX2S: + return _fnlSingleOpenSimplex2S2D(seed, x, y); + case FNL_NOISE_CELLULAR: + return _fnlSingleCellular2D(state, seed, x, y); + case FNL_NOISE_PERLIN: + return _fnlSinglePerlin2D(seed, x, y); + case FNL_NOISE_VALUE_CUBIC: + return _fnlSingleValueCubic2D(seed, x, y); + case FNL_NOISE_VALUE: + return _fnlSingleValue2D(seed, x, y); + default: + return 0; + } +} + +static float _fnlGenNoiseSingle3D(fnl_state state, int seed, FNLfloat x, FNLfloat y, FNLfloat z) +{ + FNL_FLATTEN switch (state.noise_type) + { + case FNL_NOISE_OPENSIMPLEX2: + return _fnlSingleOpenSimplex23D(seed, x, y, z); + case FNL_NOISE_OPENSIMPLEX2S: + return _fnlSingleOpenSimplex2S3D(seed, x, y, z); + case FNL_NOISE_CELLULAR: + return _fnlSingleCellular3D(state, seed, x, y, z); + case FNL_NOISE_PERLIN: + return _fnlSinglePerlin3D(seed, x, y, z); + case FNL_NOISE_VALUE_CUBIC: + return _fnlSingleValueCubic3D(seed, x, y, z); + case FNL_NOISE_VALUE: + return _fnlSingleValue3D(seed, x, y, z); + default: + return 0; + } +} + +// Noise Coordinate Transforms (frequency, and possible skew or rotation) + +static void _fnlTransformNoiseCoordinate2D(fnl_state state, inout FNLfloat x, inout FNLfloat y) +{ + x *= state.frequency; + y *= state.frequency; + + switch (state.noise_type) { + case FNL_NOISE_OPENSIMPLEX2: + case FNL_NOISE_OPENSIMPLEX2S: + { + const FNLfloat SQRT3 = (FNLfloat)1.7320508075688772935274463415059; + const FNLfloat F2 = 0.5f * (SQRT3 - 1); + FNLfloat t = (x + y) * F2; + x += t; + y += t; + } + break; + default: + break; + } +} + +static void _fnlTransformNoiseCoordinate3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z) +{ + x *= state.frequency; + y *= state.frequency; + z *= state.frequency; + + switch (state.rotation_type_3d) { + case FNL_ROTATION_IMPROVE_XY_PLANES: + { + FNLfloat xy = x + y; + FNLfloat s2 = xy * -(FNLfloat)0.211324865405187; + z *= (FNLfloat)0.577350269189626; + x += s2 - z; + y = y + s2 - z; + z += xy * (FNLfloat)0.577350269189626; + } + break; + case FNL_ROTATION_IMPROVE_XZ_PLANES: + { + FNLfloat xz = x + z; + FNLfloat s2 = xz * -(FNLfloat)0.211324865405187; + y *= (FNLfloat)0.577350269189626; + x += s2 - y; + z += s2 - y; + y += xz * (FNLfloat)0.577350269189626; + } + break; + default: + switch (state.noise_type) { + case FNL_NOISE_OPENSIMPLEX2: + case FNL_NOISE_OPENSIMPLEX2S: + { + const FNLfloat R3 = (FNLfloat)(2.0 / 3.0); + FNLfloat r = (x + y + z) * R3; // Rotation, not skew + x = r - x; + y = r - y; + z = r - z; + } + break; + default: + break; + } + break; + } +} + +// Domain Warp Coordinate Transforms + +static void _fnlTransformDomainWarpCoordinate2D(fnl_state state, inout FNLfloat x, inout FNLfloat y) +{ + switch (state.domain_warp_type) { + case FNL_DOMAIN_WARP_OPENSIMPLEX2: + case FNL_DOMAIN_WARP_OPENSIMPLEX2_REDUCED: + { + const FNLfloat SQRT3 = (FNLfloat)1.7320508075688772935274463415059; + const FNLfloat F2 = 0.5f * (SQRT3 - 1); + FNLfloat t = (x + y) * F2; + x += t; + y += t; + } + break; + default: + break; + } +} + +static void _fnlTransformDomainWarpCoordinate3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z) +{ + switch (state.rotation_type_3d) { + case FNL_ROTATION_IMPROVE_XY_PLANES: + { + FNLfloat xy = x + y; + FNLfloat s2 = xy * -(FNLfloat)0.211324865405187; + z *= (FNLfloat)0.577350269189626; + x += s2 - z; + y = y + s2 - z; + z += xy * (FNLfloat)0.577350269189626; + } + break; + case FNL_ROTATION_IMPROVE_XZ_PLANES: + { + FNLfloat xz = x + z; + FNLfloat s2 = xz * -(FNLfloat)0.211324865405187; + y *= (FNLfloat)0.577350269189626; + x += s2 - y; + z += s2 - y; + y += xz * (FNLfloat)0.577350269189626; + } + break; + default: + switch (state.domain_warp_type) { + case FNL_DOMAIN_WARP_OPENSIMPLEX2: + case FNL_DOMAIN_WARP_OPENSIMPLEX2_REDUCED: + { + const FNLfloat R3 = (FNLfloat)(2.0 / 3.0); + FNLfloat r = (x + y + z) * R3; // Rotation, not skew + x = r - x; + y = r - y; + z = r - z; + } + break; + default: + break; + } + break; + } +} + +// Fractal FBm + +static float _fnlGenFractalFBM2D(fnl_state state, FNLfloat x, FNLfloat y) +{ + int seed = state.seed; + float sum = 0; + float amp = _fnlCalculateFractalBounding(state); + + for (int i = 0; i < state.octaves; i++) { + float noise = _fnlGenNoiseSingle2D(state, seed++, x, y); + sum += noise * amp; + amp *= _fnlLerp(1.0f, _fnlFastMin(noise + 1, 2) * 0.5f, state.weighted_strength); + + x *= state.lacunarity; + y *= state.lacunarity; + amp *= state.gain; + } + + return sum; +} + +static float _fnlGenFractalFBM3D(fnl_state state, FNLfloat x, FNLfloat y, FNLfloat z) +{ + int seed = state.seed; + float sum = 0; + float amp = _fnlCalculateFractalBounding(state); + + for (int i = 0; i < state.octaves; i++) { + float noise = _fnlGenNoiseSingle3D(state, seed++, x, y, z); + sum += noise * amp; + amp *= _fnlLerp(1.0f, (noise + 1) * 0.5f, state.weighted_strength); + + x *= state.lacunarity; + y *= state.lacunarity; + z *= state.lacunarity; + amp *= state.gain; + } + + return sum; +} + +// Fractal Ridged + +static float _fnlGenFractalRidged2D(fnl_state state, FNLfloat x, FNLfloat y) +{ + int seed = state.seed; + float sum = 0; + float amp = _fnlCalculateFractalBounding(state); + + for (int i = 0; i < state.octaves; i++) { + float noise = _fnlFastAbs(_fnlGenNoiseSingle2D(state, seed++, x, y)); + sum += (noise * -2 + 1) * amp; + amp *= _fnlLerp(1.0f, 1 - noise, state.weighted_strength); + + x *= state.lacunarity; + y *= state.lacunarity; + amp *= state.gain; + } + + return sum; +} + +static float _fnlGenFractalRidged3D(fnl_state state, FNLfloat x, FNLfloat y, FNLfloat z) +{ + int seed = state.seed; + float sum = 0; + float amp = _fnlCalculateFractalBounding(state); + + for (int i = 0; i < state.octaves; i++) { + float noise = _fnlFastAbs(_fnlGenNoiseSingle3D(state, seed++, x, y, z)); + sum += (noise * -2 + 1) * amp; + amp *= _fnlLerp(1.0f, 1 - noise, state.weighted_strength); + + x *= state.lacunarity; + y *= state.lacunarity; + z *= state.lacunarity; + amp *= state.gain; + } + + return sum; +} + +// Fractal PingPong + +static float _fnlGenFractalPingPong2D(fnl_state state, FNLfloat x, FNLfloat y) +{ + int seed = state.seed; + float sum = 0; + float amp = _fnlCalculateFractalBounding(state); + + for (int i = 0; i < state.octaves; i++) { + float noise = _fnlPingPong((_fnlGenNoiseSingle2D(state, seed++, x, y) + 1) * state.ping_pong_strength); + sum += (noise - 0.5f) * 2 * amp; + amp *= _fnlLerp(1.0f, noise, state.weighted_strength); + + x *= state.lacunarity; + y *= state.lacunarity; + amp *= state.gain; + } + + return sum; +} + +static float _fnlGenFractalPingPong3D(fnl_state state, FNLfloat x, FNLfloat y, FNLfloat z) +{ + int seed = state.seed; + float sum = 0; + float amp = _fnlCalculateFractalBounding(state); + + for (int i = 0; i < state.octaves; i++) { + float noise = _fnlPingPong((_fnlGenNoiseSingle3D(state, seed++, x, y, z) + 1) * state.ping_pong_strength); + sum += (noise - 0.5f) * 2 * amp; + amp *= _fnlLerp(1.0f, noise, state.weighted_strength); + + x *= state.lacunarity; + y *= state.lacunarity; + z *= state.lacunarity; + amp *= state.gain; + } + + return sum; +} + +// Simplex/OpenSimplex2 Noise + +static float _fnlSingleSimplex2D(int seed, FNLfloat x, FNLfloat y) +{ + // 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex. + + const float SQRT3 = 1.7320508075688772935274463415059f; + const float G2 = (3 - SQRT3) / 6; + + /* + * --- Skew moved to TransformNoiseCoordinate method --- + * const FNLfloat F2 = 0.5f * (SQRT3 - 1); + * FNLfloat s = (x + y) * F2; + * x += s; y += s; + */ + + int i = _fnlFastFloor(x); + int j = _fnlFastFloor(y); + float xi = (float)(x - i); + float yi = (float)(y - j); + + float t = (xi + yi) * G2; + float x0 = (float)(xi - t); + float y0 = (float)(yi - t); + + i *= PRIME_X; + j *= PRIME_Y; + + float n0, n1, n2; + + float a = 0.5f - x0 * x0 - y0 * y0; + if (a <= 0) + n0 = 0; + else { + n0 = (a * a) * (a * a) * _fnlGradCoord2D(seed, i, j, x0, y0); + } + + float c = (float)(2 * (1 - 2 * G2) * (1 / G2 - 2)) * t + ((float)(-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); + if (c <= 0) + n2 = 0; + else { + float x2 = x0 + (2 * (float)G2 - 1); + float y2 = y0 + (2 * (float)G2 - 1); + n2 = (c * c) * (c * c) * _fnlGradCoord2D(seed, i + PRIME_X, j + PRIME_Y, x2, y2); + } + + if (y0 > x0) { + float x1 = x0 + (float)G2; + float y1 = y0 + ((float)G2 - 1); + float b = 0.5f - x1 * x1 - y1 * y1; + if (b <= 0) + n1 = 0; + else { + n1 = (b * b) * (b * b) * _fnlGradCoord2D(seed, i, j + PRIME_Y, x1, y1); + } + } else { + float x1 = x0 + ((float)G2 - 1); + float y1 = y0 + (float)G2; + float b = 0.5f - x1 * x1 - y1 * y1; + if (b <= 0) + n1 = 0; + else { + n1 = (b * b) * (b * b) * _fnlGradCoord2D(seed, i + PRIME_X, j, x1, y1); + } + } + + return (n0 + n1 + n2) * 99.83685446303647f; +} + +static float _fnlSingleOpenSimplex23D(int seed, FNLfloat x, FNLfloat y, FNLfloat z) +{ + // 3D OpenSimplex2 case uses two offset rotated cube grids. + + /* + * --- Rotation moved to TransformNoiseCoordinate method --- + * const FNLfloat R3 = (FNLfloat)(2.0 / 3.0); + * FNLfloat r = (x + y + z) * R3; // Rotation, not skew + * x = r - x; y = r - y; z = r - z; + */ + + int i = _fnlFastRound(x); + int j = _fnlFastRound(y); + int k = _fnlFastRound(z); + float x0 = (float)(x - i); + float y0 = (float)(y - j); + float z0 = (float)(z - k); + + int xNSign = (int)(-1.0f - x0) | 1; + int yNSign = (int)(-1.0f - y0) | 1; + int zNSign = (int)(-1.0f - z0) | 1; + + float ax0 = xNSign * -x0; + float ay0 = yNSign * -y0; + float az0 = zNSign * -z0; + + i *= PRIME_X; + j *= PRIME_Y; + k *= PRIME_Z; + + float value = 0; + float a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); + + FNL_UNROLL for (int l = 0;; l++) + { + if (a > 0) { + value += (a * a) * (a * a) * _fnlGradCoord3D(seed, i, j, k, x0, y0, z0); + } + + float b = a + 1; + int i1 = i; + int j1 = j; + int k1 = k; + float x1 = x0; + float y1 = y0; + float z1 = z0; + if (ax0 >= ay0 && ax0 >= az0) { + x1 += xNSign; + b -= xNSign * 2 * x1; + i1 -= xNSign * PRIME_X; + } else if (ay0 > ax0 && ay0 >= az0) { + y1 += yNSign; + b -= yNSign * 2 * y1; + j1 -= yNSign * PRIME_Y; + } else { + z1 += zNSign; + b -= zNSign * 2 * z1; + k1 -= zNSign * PRIME_Z; + } + + if (b > 0) { + value += (b * b) * (b * b) * _fnlGradCoord3D(seed, i1, j1, k1, x1, y1, z1); + } + + if (l == 1) + break; + + ax0 = 0.5f - ax0; + ay0 = 0.5f - ay0; + az0 = 0.5f - az0; + + x0 = xNSign * ax0; + y0 = yNSign * ay0; + z0 = zNSign * az0; + + a += (0.75f - ax0) - (ay0 + az0); + + i += (xNSign >> 1) & PRIME_X; + j += (yNSign >> 1) & PRIME_Y; + k += (zNSign >> 1) & PRIME_Z; + + xNSign = -xNSign; + yNSign = -yNSign; + zNSign = -zNSign; + + seed = ~seed; + } + + return value * 32.69428253173828125f; +} + +// OpenSimplex2S Noise + +static float _fnlSingleOpenSimplex2S2D(int seed, FNLfloat x, FNLfloat y) +{ + // 2D OpenSimplex2S case is a modified 2D simplex noise. + + const FNLfloat SQRT3 = (FNLfloat)1.7320508075688772935274463415059; + const FNLfloat G2 = (3 - SQRT3) / 6; + + /* + * --- Skew moved to TransformNoiseCoordinate method --- + * const FNLfloat F2 = 0.5f * (SQRT3 - 1); + * FNLfloat s = (x + y) * F2; + * x += s; y += s; + */ + + int i = _fnlFastFloor(x); + int j = _fnlFastFloor(y); + float xi = (float)(x - i); + float yi = (float)(y - j); + + i *= PRIME_X; + j *= PRIME_Y; + int i1 = i + PRIME_X; + int j1 = j + PRIME_Y; + + float t = (xi + yi) * (float)G2; + float x0 = xi - t; + float y0 = yi - t; + + int aMask = (int)((xi + yi + 1) * -0.5f); + int bMask = (int)((xi - (aMask + 2)) * 0.5f - yi); + int cMask = (int)((yi - (aMask + 2)) * 0.5f - xi); + + float a0 = (2.0f / 3.0f) - x0 * x0 - y0 * y0; + float value = (a0 * a0) * (a0 * a0) * _fnlGradCoord2D(seed, i, j, x0, y0); + + float a1 = (float)(2 * (1 - 2 * G2) * (1 / G2 - 2)) * t + ((float)(-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a0); + float x1 = x0 - (float)(1 - 2 * G2); + float y1 = y0 - (float)(1 - 2 * G2); + value += (a1 * a1) * (a1 * a1) * _fnlGradCoord2D(seed, i1, j1, x1, y1); + + int di2 = ~(aMask | cMask) | 1; + int ndj2 = (aMask & bMask) << 1; + float t2 = (di2 - ndj2) * (float)G2; + float x2 = x0 - di2 + t2; + float y2 = y0 + ndj2 + t2; + float a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * _fnlGradCoord2D(seed, i1 + (di2 & (-PRIME_X << 1)), j + (ndj2 & (PRIME_Y << 1)), x2, y2); + } + + int ndi3 = (aMask & cMask) << 1; + int dj3 = ~(aMask | bMask) | 1; + float t3 = (dj3 - ndi3) * (float)G2; + float x3 = x0 + ndi3 + t3; + float y3 = y0 - dj3 + t3; + float a3 = (2.0f / 3.0f) - x3 * x3 - y3 * y3; + if (a3 > 0) { + value += (a3 * a3) * (a3 * a3) * _fnlGradCoord2D(seed, i + (ndi3 & (PRIME_X << 1)), j1 + (dj3 & (-PRIME_Y << 1)), x3, y3); + } + + return value * 18.24196194486065f; +} + +static float _fnlSingleOpenSimplex2S3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z) +{ + // 3D OpenSimplex2S case uses two offset rotated cube grids. + + /* + * --- Rotation moved to TransformNoiseCoordinate method --- + * const FNLfloat R3 = (FNLfloat)(2.0 / 3.0); + * FNLfloat r = (x + y + z) * R3; // Rotation, not skew + * x = r - x; y = r - y; z = r - z; + */ + + int i = _fnlFastFloor(x); + int j = _fnlFastFloor(y); + int k = _fnlFastFloor(z); + float xi = (float)(x - i); + float yi = (float)(y - j); + float zi = (float)(z - k); + + i *= PRIME_X; + j *= PRIME_Y; + k *= PRIME_Z; + int seed2 = seed + 1293373; + + int xNMask = (int)(-0.5f - xi); + int yNMask = (int)(-0.5f - yi); + int zNMask = (int)(-0.5f - zi); + + float x0 = xi + xNMask; + float y0 = yi + yNMask; + float z0 = zi + zNMask; + float a0 = 0.75f - x0 * x0 - y0 * y0 - z0 * z0; + float value = (a0 * a0) * (a0 * a0) * _fnlGradCoord3D(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x0, y0, z0); + + float x1 = xi - 0.5f; + float y1 = yi - 0.5f; + float z1 = zi - 0.5f; + float a1 = 0.75f - x1 * x1 - y1 * y1 - z1 * z1; + value += (a1 * a1) * (a1 * a1) * _fnlGradCoord3D(seed2, i + PRIME_X, j + PRIME_Y, k + PRIME_Z, x1, y1, z1); + + float xAFlipMask0 = ((xNMask | 1) << 1) * x1; + float yAFlipMask0 = ((yNMask | 1) << 1) * y1; + float zAFlipMask0 = ((zNMask | 1) << 1) * z1; + float xAFlipMask1 = (-2 - (xNMask << 2)) * x1 - 1.0f; + float yAFlipMask1 = (-2 - (yNMask << 2)) * y1 - 1.0f; + float zAFlipMask1 = (-2 - (zNMask << 2)) * z1 - 1.0f; + + bool skip5 = false; + float a2 = xAFlipMask0 + a0; + if (a2 > 0) { + float x2 = x0 - (xNMask | 1); + float y2 = y0; + float z2 = z0; + value += (a2 * a2) * (a2 * a2) * _fnlGradCoord3D(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x2, y2, z2); + } else { + float a3 = yAFlipMask0 + zAFlipMask0 + a0; + if (a3 > 0) { + float x3 = x0; + float y3 = y0 - (yNMask | 1); + float z3 = z0 - (zNMask | 1); + value += (a3 * a3) * (a3 * a3) * _fnlGradCoord3D(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), x3, y3, z3); + } + + float a4 = xAFlipMask1 + a1; + if (a4 > 0) { + float x4 = (xNMask | 1) + x1; + float y4 = y1; + float z4 = z1; + value += (a4 * a4) * (a4 * a4) * _fnlGradCoord3D(seed2, i + (xNMask & (PRIME_X * 2)), j + PRIME_Y, k + PRIME_Z, x4, y4, z4); + skip5 = true; + } + } + + bool skip9 = false; + float a6 = yAFlipMask0 + a0; + if (a6 > 0) { + float x6 = x0; + float y6 = y0 - (yNMask | 1); + float z6 = z0; + value += (a6 * a6) * (a6 * a6) * _fnlGradCoord3D(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x6, y6, z6); + } else { + float a7 = xAFlipMask0 + zAFlipMask0 + a0; + if (a7 > 0) { + float x7 = x0 - (xNMask | 1); + float y7 = y0; + float z7 = z0 - (zNMask | 1); + value += (a7 * a7) * (a7 * a7) * _fnlGradCoord3D(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), x7, y7, z7); + } + + float a8 = yAFlipMask1 + a1; + if (a8 > 0) { + float x8 = x1; + float y8 = (yNMask | 1) + y1; + float z8 = z1; + value += (a8 * a8) * (a8 * a8) * _fnlGradCoord3D(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z, x8, y8, z8); + skip9 = true; + } + } + + bool skipD = false; + float aA = zAFlipMask0 + a0; + if (aA > 0) { + float xA = x0; + float yA = y0; + float zA = z0 - (zNMask | 1); + value += (aA * aA) * (aA * aA) * _fnlGradCoord3D(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), xA, yA, zA); + } else { + float aB = xAFlipMask0 + yAFlipMask0 + a0; + if (aB > 0) { + float xB = x0 - (xNMask | 1); + float yB = y0 - (yNMask | 1); + float zB = z0; + value += (aB * aB) * (aB * aB) * _fnlGradCoord3D(seed, i + (~xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z), xB, yB, zB); + } + + float aC = zAFlipMask1 + a1; + if (aC > 0) { + float xC = x1; + float yC = y1; + float zC = (zNMask | 1) + z1; + value += (aC * aC) * (aC * aC) * _fnlGradCoord3D(seed2, i + PRIME_X, j + PRIME_Y, k + (zNMask & (PRIME_Z << 1)), xC, yC, zC); + skipD = true; + } + } + + if (!skip5) { + float a5 = yAFlipMask1 + zAFlipMask1 + a1; + if (a5 > 0) { + float x5 = x1; + float y5 = (yNMask | 1) + y1; + float z5 = (zNMask | 1) + z1; + value += (a5 * a5) * (a5 * a5) * _fnlGradCoord3D(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + (zNMask & (PRIME_Z << 1)), x5, y5, z5); + } + } + + if (!skip9) { + float a9 = xAFlipMask1 + zAFlipMask1 + a1; + if (a9 > 0) { + float x9 = (xNMask | 1) + x1; + float y9 = y1; + float z9 = (zNMask | 1) + z1; + value += (a9 * a9) * (a9 * a9) * _fnlGradCoord3D(seed2, i + (xNMask & (PRIME_X * 2)), j + PRIME_Y, k + (zNMask & (PRIME_Z << 1)), x9, y9, z9); + } + } + + if (!skipD) { + float aD = xAFlipMask1 + yAFlipMask1 + a1; + if (aD > 0) { + float xD = (xNMask | 1) + x1; + float yD = (yNMask | 1) + y1; + float zD = z1; + value += (aD * aD) * (aD * aD) * _fnlGradCoord3D(seed2, i + (xNMask & (PRIME_X << 1)), j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z, xD, yD, zD); + } + } + + return value * 9.046026385208288f; +} + +// Cellular Noise + +static float _fnlSingleCellular2D(fnl_state state, int seed, FNLfloat x, FNLfloat y) +{ + int xr = _fnlFastRound(x); + int yr = _fnlFastRound(y); + + float distance0 = 1e10f; + float distance1 = 1e10f; + int closestHash = 0; + + float cellularJitter = 0.43701595f * state.cellular_jitter_mod; + + int xPrimed = (xr - 1) * PRIME_X; + int yPrimedBase = (yr - 1) * PRIME_Y; + + FNL_FLATTEN switch (state.cellular_distance_func) + { + default: + case FNL_CELLULAR_DISTANCE_EUCLIDEAN: + case FNL_CELLULAR_DISTANCE_EUCLIDEANSQ: + { + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int hash = _fnlHash2D(seed, xPrimed, yPrimed); + int idx = hash & (255 << 1); + + float vecX = (float)(xi - x) + RAND_VECS_2D[idx] * cellularJitter; + float vecY = (float)(yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; + + float newDistance = vecX * vecX + vecY * vecY; + + distance1 = _fnlFastMax(_fnlFastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + } + yPrimed += PRIME_Y; + } + xPrimed += PRIME_X; + } + break; + } + case FNL_CELLULAR_DISTANCE_MANHATTAN: + { + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int hash = _fnlHash2D(seed, xPrimed, yPrimed); + int idx = hash & (255 << 1); + + float vecX = (float)(xi - x) + RAND_VECS_2D[idx] * cellularJitter; + float vecY = (float)(yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; + + float newDistance = _fnlFastAbs(vecX) + _fnlFastAbs(vecY); + + distance1 = _fnlFastMax(_fnlFastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + } + yPrimed += PRIME_Y; + } + xPrimed += PRIME_X; + } + break; + } + case FNL_CELLULAR_DISTANCE_HYBRID: + { + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int hash = _fnlHash2D(seed, xPrimed, yPrimed); + int idx = hash & (255 << 1); + + float vecX = (float)(xi - x) + RAND_VECS_2D[idx] * cellularJitter; + float vecY = (float)(yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; + + float newDistance = (_fnlFastAbs(vecX) + _fnlFastAbs(vecY)) + (vecX * vecX + vecY * vecY); + + distance1 = _fnlFastMax(_fnlFastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + } + yPrimed += PRIME_Y; + } + xPrimed += PRIME_X; + } + break; + } + } + + FNL_FLATTEN if (state.cellular_distance_func == FNL_CELLULAR_DISTANCE_EUCLIDEAN && state.cellular_return_type >= FNL_CELLULAR_RETURN_TYPE_DISTANCE) + { + distance0 = _fnlFastSqrt(distance0); + if (state.cellular_return_type >= FNL_CELLULAR_RETURN_TYPE_DISTANCE2) + distance1 = _fnlFastSqrt(distance1); + } + + switch (state.cellular_return_type) { + case FNL_CELLULAR_RETURN_TYPE_CELLVALUE: + return closestHash * (1 / 2147483648.0f); + case FNL_CELLULAR_RETURN_TYPE_DISTANCE: + return distance0 - 1; + case FNL_CELLULAR_RETURN_TYPE_DISTANCE2: + return distance1 - 1; + case FNL_CELLULAR_RETURN_TYPE_DISTANCE2ADD: + return (distance1 + distance0) * 0.5f - 1; + case FNL_CELLULAR_RETURN_TYPE_DISTANCE2SUB: + return distance1 - distance0 - 1; + case FNL_CELLULAR_RETURN_TYPE_DISTANCE2MUL: + return distance1 * distance0 * 0.5f - 1; + case FNL_CELLULAR_RETURN_TYPE_DISTANCE2DIV: + return distance0 / distance1 - 1; + default: + return 0; + } +} + +static float _fnlSingleCellular3D(fnl_state state, int seed, FNLfloat x, FNLfloat y, FNLfloat z) +{ + int xr = _fnlFastRound(x); + int yr = _fnlFastRound(y); + int zr = _fnlFastRound(z); + + float distance0 = 1e10f; + float distance1 = 1e10f; + int closestHash = 0; + + float cellularJitter = 0.39614353f * state.cellular_jitter_mod; + + int xPrimed = (xr - 1) * PRIME_X; + int yPrimedBase = (yr - 1) * PRIME_Y; + int zPrimedBase = (zr - 1) * PRIME_Z; + + switch (state.cellular_distance_func) { + default: + case FNL_CELLULAR_DISTANCE_EUCLIDEAN: + case FNL_CELLULAR_DISTANCE_EUCLIDEANSQ: + { + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int zPrimed = zPrimedBase; + + for (int zi = zr - 1; zi <= zr + 1; zi++) { + int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed); + int idx = hash & (255 << 2); + + float vecX = (float)(xi - x) + RAND_VECS_3D[idx] * cellularJitter; + float vecY = (float)(yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; + float vecZ = (float)(zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; + + float newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ; + + distance1 = _fnlFastMax(_fnlFastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + } + zPrimed += PRIME_Z; + } + yPrimed += PRIME_Y; + } + xPrimed += PRIME_X; + } + break; + } + case FNL_CELLULAR_DISTANCE_MANHATTAN: + { + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int zPrimed = zPrimedBase; + + for (int zi = zr - 1; zi <= zr + 1; zi++) { + int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed); + int idx = hash & (255 << 2); + + float vecX = (float)(xi - x) + RAND_VECS_3D[idx] * cellularJitter; + float vecY = (float)(yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; + float vecZ = (float)(zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; + + float newDistance = _fnlFastAbs(vecX) + _fnlFastAbs(vecY) + _fnlFastAbs(vecZ); + + distance1 = _fnlFastMax(_fnlFastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + } + zPrimed += PRIME_Z; + } + yPrimed += PRIME_Y; + } + xPrimed += PRIME_X; + } + break; + } + case FNL_CELLULAR_DISTANCE_HYBRID: + { + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int zPrimed = zPrimedBase; + + for (int zi = zr - 1; zi <= zr + 1; zi++) { + int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed); + int idx = hash & (255 << 2); + + float vecX = (float)(xi - x) + RAND_VECS_3D[idx] * cellularJitter; + float vecY = (float)(yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; + float vecZ = (float)(zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; + + float newDistance = (_fnlFastAbs(vecX) + _fnlFastAbs(vecY) + _fnlFastAbs(vecZ)) + (vecX * vecX + vecY * vecY + vecZ * vecZ); + + distance1 = _fnlFastMax(_fnlFastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + } + zPrimed += PRIME_Z; + } + yPrimed += PRIME_Y; + } + xPrimed += PRIME_X; + } + break; + } + } + + if (state.cellular_distance_func == FNL_CELLULAR_DISTANCE_EUCLIDEAN && state.cellular_return_type >= FNL_CELLULAR_RETURN_TYPE_DISTANCE) { + distance0 = _fnlFastSqrt(distance0); + if (state.cellular_return_type >= FNL_CELLULAR_RETURN_TYPE_DISTANCE2) + distance1 = _fnlFastSqrt(distance1); + } + + switch (state.cellular_return_type) { + case FNL_CELLULAR_RETURN_TYPE_CELLVALUE: + return closestHash * (1 / 2147483648.0f); + case FNL_CELLULAR_RETURN_TYPE_DISTANCE: + return distance0 - 1; + case FNL_CELLULAR_RETURN_TYPE_DISTANCE2: + return distance1 - 1; + case FNL_CELLULAR_RETURN_TYPE_DISTANCE2ADD: + return (distance1 + distance0) * 0.5f - 1; + case FNL_CELLULAR_RETURN_TYPE_DISTANCE2SUB: + return distance1 - distance0 - 1; + case FNL_CELLULAR_RETURN_TYPE_DISTANCE2MUL: + return distance1 * distance0 * 0.5f - 1; + case FNL_CELLULAR_RETURN_TYPE_DISTANCE2DIV: + return distance0 / distance1 - 1; + default: + return 0; + } +} + +// Perlin Noise + +static float _fnlSinglePerlin2D(int seed, FNLfloat x, FNLfloat y) +{ + int x0 = _fnlFastFloor(x); + int y0 = _fnlFastFloor(y); + + float xd0 = (float)(x - x0); + float yd0 = (float)(y - y0); + float xd1 = xd0 - 1; + float yd1 = yd0 - 1; + + float xs = _fnlInterpQuintic(xd0); + float ys = _fnlInterpQuintic(yd0); + + x0 *= PRIME_X; + y0 *= PRIME_Y; + int x1 = x0 + PRIME_X; + int y1 = y0 + PRIME_Y; + + float xf0 = _fnlLerp(_fnlGradCoord2D(seed, x0, y0, xd0, yd0), _fnlGradCoord2D(seed, x1, y0, xd1, yd0), xs); + float xf1 = _fnlLerp(_fnlGradCoord2D(seed, x0, y1, xd0, yd1), _fnlGradCoord2D(seed, x1, y1, xd1, yd1), xs); + + return _fnlLerp(xf0, xf1, ys) * 1.4247691104677813f; +} + +static float _fnlSinglePerlin3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z) +{ + int x0 = _fnlFastFloor(x); + int y0 = _fnlFastFloor(y); + int z0 = _fnlFastFloor(z); + + float xd0 = (float)(x - x0); + float yd0 = (float)(y - y0); + float zd0 = (float)(z - z0); + float xd1 = xd0 - 1; + float yd1 = yd0 - 1; + float zd1 = zd0 - 1; + + float xs = _fnlInterpQuintic(xd0); + float ys = _fnlInterpQuintic(yd0); + float zs = _fnlInterpQuintic(zd0); + + x0 *= PRIME_X; + y0 *= PRIME_Y; + z0 *= PRIME_Z; + int x1 = x0 + PRIME_X; + int y1 = y0 + PRIME_Y; + int z1 = z0 + PRIME_Z; + + float xf00 = _fnlLerp(_fnlGradCoord3D(seed, x0, y0, z0, xd0, yd0, zd0), _fnlGradCoord3D(seed, x1, y0, z0, xd1, yd0, zd0), xs); + float xf10 = _fnlLerp(_fnlGradCoord3D(seed, x0, y1, z0, xd0, yd1, zd0), _fnlGradCoord3D(seed, x1, y1, z0, xd1, yd1, zd0), xs); + float xf01 = _fnlLerp(_fnlGradCoord3D(seed, x0, y0, z1, xd0, yd0, zd1), _fnlGradCoord3D(seed, x1, y0, z1, xd1, yd0, zd1), xs); + float xf11 = _fnlLerp(_fnlGradCoord3D(seed, x0, y1, z1, xd0, yd1, zd1), _fnlGradCoord3D(seed, x1, y1, z1, xd1, yd1, zd1), xs); + + float yf0 = _fnlLerp(xf00, xf10, ys); + float yf1 = _fnlLerp(xf01, xf11, ys); + + return _fnlLerp(yf0, yf1, zs) * 0.964921414852142333984375f; +} + +// Value Cubic + +static float _fnlSingleValueCubic2D(int seed, FNLfloat x, FNLfloat y) +{ + int x1 = _fnlFastFloor(x); + int y1 = _fnlFastFloor(y); + + float xs = x - (float)x1; + float ys = y - (float)y1; + + x1 *= PRIME_X; + y1 *= PRIME_Y; + + int x0 = x1 - PRIME_X; + int y0 = y1 - PRIME_Y; + int x2 = x1 + PRIME_X; + int y2 = y1 + PRIME_Y; + int x3 = x1 + PRIME_X * 2; + int y3 = y1 + PRIME_Y * 2; + + return _fnlCubicLerp( + _fnlCubicLerp(_fnlValCoord2D(seed, x0, y0), _fnlValCoord2D(seed, x1, y0), _fnlValCoord2D(seed, x2, y0), _fnlValCoord2D(seed, x3, y0), + xs), + _fnlCubicLerp(_fnlValCoord2D(seed, x0, y1), _fnlValCoord2D(seed, x1, y1), _fnlValCoord2D(seed, x2, y1), _fnlValCoord2D(seed, x3, y1), + xs), + _fnlCubicLerp(_fnlValCoord2D(seed, x0, y2), _fnlValCoord2D(seed, x1, y2), _fnlValCoord2D(seed, x2, y2), _fnlValCoord2D(seed, x3, y2), + xs), + _fnlCubicLerp(_fnlValCoord2D(seed, x0, y3), _fnlValCoord2D(seed, x1, y3), _fnlValCoord2D(seed, x2, y3), _fnlValCoord2D(seed, x3, y3), + xs), + ys) * + (1 / (1.5f * 1.5f)); +} + +static float _fnlSingleValueCubic3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z) +{ + int x1 = _fnlFastFloor(x); + int y1 = _fnlFastFloor(y); + int z1 = _fnlFastFloor(z); + + float xs = x - (float)x1; + float ys = y - (float)y1; + float zs = z - (float)z1; + + x1 *= PRIME_X; + y1 *= PRIME_Y; + z1 *= PRIME_Z; + + int x0 = x1 - PRIME_X; + int y0 = y1 - PRIME_Y; + int z0 = z1 - PRIME_Z; + int x2 = x1 + PRIME_X; + int y2 = y1 + PRIME_Y; + int z2 = z1 + PRIME_Z; + int x3 = x1 + PRIME_X * 2; + int y3 = y1 + PRIME_Y * 2; + int z3 = z1 + PRIME_Z * 2; + + return _fnlCubicLerp( + _fnlCubicLerp( + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y0, z0), _fnlValCoord3D(seed, x1, y0, z0), _fnlValCoord3D(seed, x2, y0, z0), _fnlValCoord3D(seed, x3, y0, z0), xs), + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y1, z0), _fnlValCoord3D(seed, x1, y1, z0), _fnlValCoord3D(seed, x2, y1, z0), _fnlValCoord3D(seed, x3, y1, z0), xs), + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y2, z0), _fnlValCoord3D(seed, x1, y2, z0), _fnlValCoord3D(seed, x2, y2, z0), _fnlValCoord3D(seed, x3, y2, z0), xs), + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y3, z0), _fnlValCoord3D(seed, x1, y3, z0), _fnlValCoord3D(seed, x2, y3, z0), _fnlValCoord3D(seed, x3, y3, z0), xs), + ys), + _fnlCubicLerp( + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y0, z1), _fnlValCoord3D(seed, x1, y0, z1), _fnlValCoord3D(seed, x2, y0, z1), _fnlValCoord3D(seed, x3, y0, z1), xs), + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y1, z1), _fnlValCoord3D(seed, x1, y1, z1), _fnlValCoord3D(seed, x2, y1, z1), _fnlValCoord3D(seed, x3, y1, z1), xs), + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y2, z1), _fnlValCoord3D(seed, x1, y2, z1), _fnlValCoord3D(seed, x2, y2, z1), _fnlValCoord3D(seed, x3, y2, z1), xs), + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y3, z1), _fnlValCoord3D(seed, x1, y3, z1), _fnlValCoord3D(seed, x2, y3, z1), _fnlValCoord3D(seed, x3, y3, z1), xs), + ys), + _fnlCubicLerp( + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y0, z2), _fnlValCoord3D(seed, x1, y0, z2), _fnlValCoord3D(seed, x2, y0, z2), _fnlValCoord3D(seed, x3, y0, z2), xs), + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y1, z2), _fnlValCoord3D(seed, x1, y1, z2), _fnlValCoord3D(seed, x2, y1, z2), _fnlValCoord3D(seed, x3, y1, z2), xs), + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y2, z2), _fnlValCoord3D(seed, x1, y2, z2), _fnlValCoord3D(seed, x2, y2, z2), _fnlValCoord3D(seed, x3, y2, z2), xs), + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y3, z2), _fnlValCoord3D(seed, x1, y3, z2), _fnlValCoord3D(seed, x2, y3, z2), _fnlValCoord3D(seed, x3, y3, z2), xs), + ys), + _fnlCubicLerp( + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y0, z3), _fnlValCoord3D(seed, x1, y0, z3), _fnlValCoord3D(seed, x2, y0, z3), _fnlValCoord3D(seed, x3, y0, z3), xs), + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y1, z3), _fnlValCoord3D(seed, x1, y1, z3), _fnlValCoord3D(seed, x2, y1, z3), _fnlValCoord3D(seed, x3, y1, z3), xs), + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y2, z3), _fnlValCoord3D(seed, x1, y2, z3), _fnlValCoord3D(seed, x2, y2, z3), _fnlValCoord3D(seed, x3, y2, z3), xs), + _fnlCubicLerp(_fnlValCoord3D(seed, x0, y3, z3), _fnlValCoord3D(seed, x1, y3, z3), _fnlValCoord3D(seed, x2, y3, z3), _fnlValCoord3D(seed, x3, y3, z3), xs), + ys), + zs) * + (1 / (1.5f * 1.5f * 1.5f)); +} + +// Value noise + +static float _fnlSingleValue2D(int seed, FNLfloat x, FNLfloat y) +{ + int x0 = _fnlFastFloor(x); + int y0 = _fnlFastFloor(y); + + float xs = _fnlInterpHermite((float)(x - x0)); + float ys = _fnlInterpHermite((float)(y - y0)); + + x0 *= PRIME_X; + y0 *= PRIME_Y; + int x1 = x0 + PRIME_X; + int y1 = y0 + PRIME_Y; + + float xf0 = _fnlLerp(_fnlValCoord2D(seed, x0, y0), _fnlValCoord2D(seed, x1, y0), xs); + float xf1 = _fnlLerp(_fnlValCoord2D(seed, x0, y1), _fnlValCoord2D(seed, x1, y1), xs); + + return _fnlLerp(xf0, xf1, ys); +} + +static float _fnlSingleValue3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z) +{ + int x0 = _fnlFastFloor(x); + int y0 = _fnlFastFloor(y); + int z0 = _fnlFastFloor(z); + + float xs = _fnlInterpHermite((float)(x - x0)); + float ys = _fnlInterpHermite((float)(y - y0)); + float zs = _fnlInterpHermite((float)(z - z0)); + + x0 *= PRIME_X; + y0 *= PRIME_Y; + z0 *= PRIME_Z; + int x1 = x0 + PRIME_X; + int y1 = y0 + PRIME_Y; + int z1 = z0 + PRIME_Z; + + float xf00 = _fnlLerp(_fnlValCoord3D(seed, x0, y0, z0), _fnlValCoord3D(seed, x1, y0, z0), xs); + float xf10 = _fnlLerp(_fnlValCoord3D(seed, x0, y1, z0), _fnlValCoord3D(seed, x1, y1, z0), xs); + float xf01 = _fnlLerp(_fnlValCoord3D(seed, x0, y0, z1), _fnlValCoord3D(seed, x1, y0, z1), xs); + float xf11 = _fnlLerp(_fnlValCoord3D(seed, x0, y1, z1), _fnlValCoord3D(seed, x1, y1, z1), xs); + + float yf0 = _fnlLerp(xf00, xf10, ys); + float yf1 = _fnlLerp(xf01, xf11, ys); + + return _fnlLerp(yf0, yf1, zs); +} + +// Domain Warp + +// Forward declare +static void _fnlSingleDomainWarpBasicGrid2D(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, inout FNLfloat xp, inout FNLfloat yp); +static void _fnlSingleDomainWarpBasicGrid3D(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, FNLfloat z, inout FNLfloat xp, inout FNLfloat yp, inout FNLfloat zp); +static void _fnlSingleDomainWarpSimplexGradient(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, inout FNLfloat xr, inout FNLfloat yr, bool outGradOnly); +static void _fnlSingleDomainWarpOpenSimplex2Gradient(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, FNLfloat z, inout FNLfloat xr, inout FNLfloat yr, inout FNLfloat zr, bool outGradOnly); + +static void _fnlDoSingleDomainWarp2D(fnl_state state, int seed, float amp, float freq, FNLfloat x, FNLfloat y, inout FNLfloat xp, inout FNLfloat yp) +{ + FNL_FLATTEN switch (state.domain_warp_type) + { + case FNL_DOMAIN_WARP_OPENSIMPLEX2: + _fnlSingleDomainWarpSimplexGradient(seed, amp * 38.283687591552734375f, freq, x, y, xp, yp, false); + break; + case FNL_DOMAIN_WARP_OPENSIMPLEX2_REDUCED: + _fnlSingleDomainWarpSimplexGradient(seed, amp * 16.0f, freq, x, y, xp, yp, true); + break; + case FNL_DOMAIN_WARP_BASICGRID: + _fnlSingleDomainWarpBasicGrid2D(seed, amp, freq, x, y, xp, yp); + break; + } +} + +static void _fnlDoSingleDomainWarp3D(fnl_state state, int seed, float amp, float freq, FNLfloat x, FNLfloat y, FNLfloat z, inout FNLfloat xp, inout FNLfloat yp, inout FNLfloat zp) +{ + FNL_FLATTEN switch (state.domain_warp_type) + { + case FNL_DOMAIN_WARP_OPENSIMPLEX2: + _fnlSingleDomainWarpOpenSimplex2Gradient(seed, amp * 32.69428253173828125f, freq, x, y, z, xp, yp, zp, false); + break; + case FNL_DOMAIN_WARP_OPENSIMPLEX2_REDUCED: + _fnlSingleDomainWarpOpenSimplex2Gradient(seed, amp * 7.71604938271605f, freq, x, y, z, xp, yp, zp, true); + break; + case FNL_DOMAIN_WARP_BASICGRID: + _fnlSingleDomainWarpBasicGrid3D(seed, amp, freq, x, y, z, xp, yp, zp); + break; + } +} + +// Domain Warp Single Wrapper + +static void _fnlDomainWarpSingle2D(fnl_state state, inout FNLfloat x, inout FNLfloat y) +{ + int seed = state.seed; + float amp = state.domain_warp_amp * _fnlCalculateFractalBounding(state); + float freq = state.frequency; + + FNLfloat xs = x; + FNLfloat ys = y; + _fnlTransformDomainWarpCoordinate2D(state, xs, ys); + + _fnlDoSingleDomainWarp2D(state, seed, amp, freq, xs, ys, x, y); +} + +static void _fnlDomainWarpSingle3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z) +{ + int seed = state.seed; + float amp = state.domain_warp_amp * _fnlCalculateFractalBounding(state); + float freq = state.frequency; + + FNLfloat xs = x; + FNLfloat ys = y; + FNLfloat zs = z; + _fnlTransformDomainWarpCoordinate3D(state, xs, ys, zs); + + _fnlDoSingleDomainWarp3D(state, seed, amp, freq, xs, ys, zs, x, y, z); +} + +// Domain Warp Fractal Progressive + +static void _fnlDomainWarpFractalProgressive2D(fnl_state state, inout FNLfloat x, inout FNLfloat y) +{ + int seed = state.seed; + float amp = state.domain_warp_amp * _fnlCalculateFractalBounding(state); + float freq = state.frequency; + + for (int i = 0; i < state.octaves; i++) { + FNLfloat xs = x; + FNLfloat ys = y; + _fnlTransformDomainWarpCoordinate2D(state, xs, ys); + + _fnlDoSingleDomainWarp2D(state, seed, amp, freq, xs, ys, x, y); + + seed++; + amp *= state.gain; + freq *= state.lacunarity; + } +} + +static void _fnlDomainWarpFractalProgressive3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z) +{ + int seed = state.seed; + float amp = state.domain_warp_amp * _fnlCalculateFractalBounding(state); + float freq = state.frequency; + + for (int i = 0; i < state.octaves; i++) { + FNLfloat xs = x; + FNLfloat ys = y; + FNLfloat zs = z; + _fnlTransformDomainWarpCoordinate3D(state, xs, ys, zs); + + _fnlDoSingleDomainWarp3D(state, seed, amp, freq, xs, ys, zs, x, y, z); + + seed++; + amp *= state.gain; + freq *= state.lacunarity; + } +} + +// Domain Warp Fractal Independent + +static void _fnlDomainWarpFractalIndependent2D(fnl_state state, inout FNLfloat x, inout FNLfloat y) +{ + FNLfloat xs = x; + FNLfloat ys = y; + _fnlTransformDomainWarpCoordinate2D(state, xs, ys); + + int seed = state.seed; + float amp = state.domain_warp_amp * _fnlCalculateFractalBounding(state); + float freq = state.frequency; + + for (int i = 0; i < state.octaves; i++) { + _fnlDoSingleDomainWarp2D(state, seed, amp, freq, xs, ys, x, y); + + seed++; + amp *= state.gain; + freq *= state.lacunarity; + } +} + +static void _fnlDomainWarpFractalIndependent3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z) +{ + FNLfloat xs = x; + FNLfloat ys = y; + FNLfloat zs = z; + _fnlTransformDomainWarpCoordinate3D(state, xs, ys, zs); + + int seed = state.seed; + float amp = state.domain_warp_amp * _fnlCalculateFractalBounding(state); + float freq = state.frequency; + + for (int i = 0; i < state.octaves; i++) { + _fnlDoSingleDomainWarp3D(state, seed, amp, freq, xs, ys, zs, x, y, z); + + seed++; + amp *= state.gain; + freq *= state.lacunarity; + } +} + +// Domain Warp Basic Grid + +static void _fnlSingleDomainWarpBasicGrid2D(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, inout FNLfloat xp, inout FNLfloat yp) +{ + FNLfloat xf = x * frequency; + FNLfloat yf = y * frequency; + + int x0 = _fnlFastFloor(xf); + int y0 = _fnlFastFloor(yf); + + float xs = _fnlInterpHermite((float)(xf - x0)); + float ys = _fnlInterpHermite((float)(yf - y0)); + + x0 *= PRIME_X; + y0 *= PRIME_Y; + int x1 = x0 + PRIME_X; + int y1 = y0 + PRIME_Y; + + int idx0 = _fnlHash2D(seed, x0, y0) & (255 << 1); + int idx1 = _fnlHash2D(seed, x1, y0) & (255 << 1); + + float lx0x = _fnlLerp(RAND_VECS_2D[idx0], RAND_VECS_2D[idx1], xs); + float ly0x = _fnlLerp(RAND_VECS_2D[idx0 | 1], RAND_VECS_2D[idx1 | 1], xs); + + idx0 = _fnlHash2D(seed, x0, y1) & (255 << 1); + idx1 = _fnlHash2D(seed, x1, y1) & (255 << 1); + + float lx1x = _fnlLerp(RAND_VECS_2D[idx0], RAND_VECS_2D[idx1], xs); + float ly1x = _fnlLerp(RAND_VECS_2D[idx0 | 1], RAND_VECS_2D[idx1 | 1], xs); + + xp += _fnlLerp(lx0x, lx1x, ys) * warpAmp; + yp += _fnlLerp(ly0x, ly1x, ys) * warpAmp; +} + +static void _fnlSingleDomainWarpBasicGrid3D(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, FNLfloat z, inout FNLfloat xp, inout FNLfloat yp, inout FNLfloat zp) +{ + FNLfloat xf = x * frequency; + FNLfloat yf = y * frequency; + FNLfloat zf = z * frequency; + + int x0 = _fnlFastFloor(xf); + int y0 = _fnlFastFloor(yf); + int z0 = _fnlFastFloor(zf); + + float xs = _fnlInterpHermite((float)(xf - x0)); + float ys = _fnlInterpHermite((float)(yf - y0)); + float zs = _fnlInterpHermite((float)(zf - z0)); + + x0 *= PRIME_X; + y0 *= PRIME_Y; + z0 *= PRIME_Z; + int x1 = x0 + PRIME_X; + int y1 = y0 + PRIME_Y; + int z1 = z0 + PRIME_Z; + + int idx0 = _fnlHash3D(seed, x0, y0, z0) & (255 << 2); + int idx1 = _fnlHash3D(seed, x1, y0, z0) & (255 << 2); + + float lx0x = _fnlLerp(RAND_VECS_3D[idx0], RAND_VECS_3D[idx1], xs); + float ly0x = _fnlLerp(RAND_VECS_3D[idx0 | 1], RAND_VECS_3D[idx1 | 1], xs); + float lz0x = _fnlLerp(RAND_VECS_3D[idx0 | 2], RAND_VECS_3D[idx1 | 2], xs); + + idx0 = _fnlHash3D(seed, x0, y1, z0) & (255 << 2); + idx1 = _fnlHash3D(seed, x1, y1, z0) & (255 << 2); + + float lx1x = _fnlLerp(RAND_VECS_3D[idx0], RAND_VECS_3D[idx1], xs); + float ly1x = _fnlLerp(RAND_VECS_3D[idx0 | 1], RAND_VECS_3D[idx1 | 1], xs); + float lz1x = _fnlLerp(RAND_VECS_3D[idx0 | 2], RAND_VECS_3D[idx1 | 2], xs); + + float lx0y = _fnlLerp(lx0x, lx1x, ys); + float ly0y = _fnlLerp(ly0x, ly1x, ys); + float lz0y = _fnlLerp(lz0x, lz1x, ys); + + idx0 = _fnlHash3D(seed, x0, y0, z1) & (255 << 2); + idx1 = _fnlHash3D(seed, x1, y0, z1) & (255 << 2); + + lx0x = _fnlLerp(RAND_VECS_3D[idx0], RAND_VECS_3D[idx1], xs); + ly0x = _fnlLerp(RAND_VECS_3D[idx0 | 1], RAND_VECS_3D[idx1 | 1], xs); + lz0x = _fnlLerp(RAND_VECS_3D[idx0 | 2], RAND_VECS_3D[idx1 | 2], xs); + + idx0 = _fnlHash3D(seed, x0, y1, z1) & (255 << 2); + idx1 = _fnlHash3D(seed, x1, y1, z1) & (255 << 2); + + lx1x = _fnlLerp(RAND_VECS_3D[idx0], RAND_VECS_3D[idx1], xs); + ly1x = _fnlLerp(RAND_VECS_3D[idx0 | 1], RAND_VECS_3D[idx1 | 1], xs); + lz1x = _fnlLerp(RAND_VECS_3D[idx0 | 2], RAND_VECS_3D[idx1 | 2], xs); + + xp += _fnlLerp(lx0y, _fnlLerp(lx0x, lx1x, ys), zs) * warpAmp; + yp += _fnlLerp(ly0y, _fnlLerp(ly0x, ly1x, ys), zs) * warpAmp; + zp += _fnlLerp(lz0y, _fnlLerp(lz0x, lz1x, ys), zs) * warpAmp; +} + +// Domain Warp Simplex/OpenSimplex2 + +static void _fnlSingleDomainWarpSimplexGradient(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, inout FNLfloat xr, inout FNLfloat yr, bool outGradOnly) +{ + const float SQRT3 = 1.7320508075688772935274463415059f; + const float G2 = (3 - SQRT3) / 6; + + x *= frequency; + y *= frequency; + + /* + * --- Skew moved to TransformNoiseCoordinate method --- + * const FNLfloat F2 = 0.5f * (SQRT3 - 1); + * FNLfloat s = (x + y) * F2; + * x += s; y += s; + */ + + int i = _fnlFastFloor(x); + int j = _fnlFastFloor(y); + float xi = (float)(x - i); + float yi = (float)(y - j); + + float t = (xi + yi) * G2; + float x0 = (float)(xi - t); + float y0 = (float)(yi - t); + + i *= PRIME_X; + j *= PRIME_Y; + + float vx, vy; + vx = vy = 0; + + float a = 0.5f - x0 * x0 - y0 * y0; + if (a > 0) { + float aaaa = (a * a) * (a * a); + float xo, yo; + if (outGradOnly) + _fnlGradCoordOut2D(seed, i, j, xo, yo); + else + _fnlGradCoordDual2D(seed, i, j, x0, y0, xo, yo); + vx += aaaa * xo; + vy += aaaa * yo; + } + + float c = (float)(2 * (1 - 2 * G2) * (1 / G2 - 2)) * t + ((float)(-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); + if (c > 0) { + float x2 = x0 + (2 * (float)G2 - 1); + float y2 = y0 + (2 * (float)G2 - 1); + float cccc = (c * c) * (c * c); + float xo, yo; + if (outGradOnly) + _fnlGradCoordOut2D(seed, i + PRIME_X, j + PRIME_Y, xo, yo); + else + _fnlGradCoordDual2D(seed, i + PRIME_X, j + PRIME_Y, x2, y2, xo, yo); + vx += cccc * xo; + vy += cccc * yo; + } + + if (y0 > x0) { + float x1 = x0 + (float)G2; + float y1 = y0 + ((float)G2 - 1); + float b = 0.5f - x1 * x1 - y1 * y1; + if (b > 0) { + float bbbb = (b * b) * (b * b); + float xo, yo; + if (outGradOnly) + _fnlGradCoordOut2D(seed, i, j + PRIME_Y, xo, yo); + else + _fnlGradCoordDual2D(seed, i, j + PRIME_Y, x1, y1, xo, yo); + vx += bbbb * xo; + vy += bbbb * yo; + } + } else { + float x1 = x0 + ((float)G2 - 1); + float y1 = y0 + (float)G2; + float b = 0.5f - x1 * x1 - y1 * y1; + if (b > 0) { + float bbbb = (b * b) * (b * b); + float xo, yo; + if (outGradOnly) + _fnlGradCoordOut2D(seed, i + PRIME_X, j, xo, yo); + else + _fnlGradCoordDual2D(seed, i + PRIME_X, j, x1, y1, xo, yo); + vx += bbbb * xo; + vy += bbbb * yo; + } + } + + xr += vx * warpAmp; + yr += vy * warpAmp; +} + +static void _fnlSingleDomainWarpOpenSimplex2Gradient(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, FNLfloat z, inout FNLfloat xr, inout FNLfloat yr, inout FNLfloat zr, bool outGradOnly) +{ + x *= frequency; + y *= frequency; + z *= frequency; + + /* + * --- Rotation moved to TransformDomainWarpCoordinate method --- + * const FNLfloat R3 = (FNLfloat)(2.0 / 3.0); + * FNLfloat r = (x + y + z) * R3; // Rotation, not skew + * x = r - x; y = r - y; z = r - z; + */ + + int i = _fnlFastRound(x); + int j = _fnlFastRound(y); + int k = _fnlFastRound(z); + float x0 = (float)x - i; + float y0 = (float)y - j; + float z0 = (float)z - k; + + int xNSign = (int)(-x0 - 1.0f) | 1; + int yNSign = (int)(-y0 - 1.0f) | 1; + int zNSign = (int)(-z0 - 1.0f) | 1; + + float ax0 = xNSign * -x0; + float ay0 = yNSign * -y0; + float az0 = zNSign * -z0; + + i *= PRIME_X; + j *= PRIME_Y; + k *= PRIME_Z; + + float vx, vy, vz; + vx = vy = vz = 0; + + float a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); + for (int l = 0; l < 2; l++) { + if (a > 0) { + float aaaa = (a * a) * (a * a); + float xo, yo, zo; + if (outGradOnly) + _fnlGradCoordOut3D(seed, i, j, k, xo, yo, zo); + else + _fnlGradCoordDual3D(seed, i, j, k, x0, y0, z0, xo, yo, zo); + vx += aaaa * xo; + vy += aaaa * yo; + vz += aaaa * zo; + } + + float b = a + 1; + int i1 = i; + int j1 = j; + int k1 = k; + float x1 = x0; + float y1 = y0; + float z1 = z0; + if (ax0 >= ay0 && ax0 >= az0) { + x1 += xNSign; + b -= xNSign * 2 * x1; + i1 -= xNSign * PRIME_X; + } else if (ay0 > ax0 && ay0 >= az0) { + y1 += yNSign; + b -= yNSign * 2 * y1; + j1 -= yNSign * PRIME_Y; + } else { + z1 += zNSign; + b -= zNSign * 2 * z1; + k1 -= zNSign * PRIME_Z; + } + + if (b > 0) { + float bbbb = (b * b) * (b * b); + float xo, yo, zo; + if (outGradOnly) + _fnlGradCoordOut3D(seed, i1, j1, k1, xo, yo, zo); + else + _fnlGradCoordDual3D(seed, i1, j1, k1, x1, y1, z1, xo, yo, zo); + vx += bbbb * xo; + vy += bbbb * yo; + vz += bbbb * zo; + } + + if (l == 1) + break; + + ax0 = 0.5f - ax0; + ay0 = 0.5f - ay0; + az0 = 0.5f - az0; + + x0 = xNSign * ax0; + y0 = yNSign * ay0; + z0 = zNSign * az0; + + a += (0.75f - ax0) - (ay0 + az0); + + i += (xNSign >> 1) & PRIME_X; + j += (yNSign >> 1) & PRIME_Y; + k += (zNSign >> 1) & PRIME_Z; + + xNSign = -xNSign; + yNSign = -yNSign; + zNSign = -zNSign; + + seed += 1293373; + } + + xr += vx * warpAmp; + yr += vy * warpAmp; + zr += vz * warpAmp; +} + +// ==================== +// Public API +// ==================== + +fnl_state fnlCreateState(int seed) +{ + fnl_state newState; + newState.seed = seed; + newState.frequency = 0.01f; + newState.noise_type = FNL_NOISE_OPENSIMPLEX2; + newState.rotation_type_3d = FNL_ROTATION_NONE; + newState.fractal_type = FNL_FRACTAL_NONE; + newState.octaves = 3; + newState.lacunarity = 2.0f; + newState.gain = 0.5f; + newState.weighted_strength = 0.0f; + newState.ping_pong_strength = 2.0f; + newState.cellular_distance_func = FNL_CELLULAR_DISTANCE_EUCLIDEANSQ; + newState.cellular_return_type = FNL_CELLULAR_RETURN_TYPE_DISTANCE; + newState.cellular_jitter_mod = 1.0f; + newState.domain_warp_amp = 30.0f; + newState.domain_warp_type = FNL_DOMAIN_WARP_OPENSIMPLEX2; + return newState; +} + +float fnlGetNoise2D(fnl_state state, FNLfloat x, FNLfloat y) +{ + _fnlTransformNoiseCoordinate2D(state, x, y); + + FNL_FLATTEN switch (state.fractal_type) + { + default: + return _fnlGenNoiseSingle2D(state, state.seed, x, y); + case FNL_FRACTAL_FBM: + return _fnlGenFractalFBM2D(state, x, y); + case FNL_FRACTAL_RIDGED: + return _fnlGenFractalRidged2D(state, x, y); + case FNL_FRACTAL_PINGPONG: + return _fnlGenFractalPingPong2D(state, x, y); + } +} + +float fnlGetNoise3D(fnl_state state, FNLfloat x, FNLfloat y, FNLfloat z) +{ + _fnlTransformNoiseCoordinate3D(state, x, y, z); + + // Select a noise type + FNL_FLATTEN switch (state.fractal_type) + { + default: + return _fnlGenNoiseSingle3D(state, state.seed, x, y, z); + case FNL_FRACTAL_FBM: + return _fnlGenFractalFBM3D(state, x, y, z); + case FNL_FRACTAL_RIDGED: + return _fnlGenFractalRidged3D(state, x, y, z); + case FNL_FRACTAL_PINGPONG: + return _fnlGenFractalPingPong3D(state, x, y, z); + } +} + +void fnlDomainWarp2D(fnl_state state, inout FNLfloat x, inout FNLfloat y) +{ + FNL_FLATTEN switch (state.fractal_type) + { + default: + _fnlDomainWarpSingle2D(state, x, y); + break; + case FNL_FRACTAL_DOMAIN_WARP_PROGRESSIVE: + _fnlDomainWarpFractalProgressive2D(state, x, y); + break; + case FNL_FRACTAL_DOMAIN_WARP_INDEPENDENT: + _fnlDomainWarpFractalIndependent2D(state, x, y); + break; + } +} + +void fnlDomainWarp3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z) +{ + FNL_FLATTEN switch (state.fractal_type) + { + default: + _fnlDomainWarpSingle3D(state, x, y, z); + break; + case FNL_FRACTAL_DOMAIN_WARP_PROGRESSIVE: + _fnlDomainWarpFractalProgressive3D(state, x, y, z); + break; + case FNL_FRACTAL_DOMAIN_WARP_INDEPENDENT: + _fnlDomainWarpFractalIndependent3D(state, x, y, z); + break; + } +} diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli new file mode 100644 index 0000000000..16aa6868b5 --- /dev/null +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -0,0 +1,170 @@ +#include "Common/SharedData.hlsli" +#include "SnowCover/FastNoiseLite.hlsl" +#if defined(PSHADER) +#include "Common/PBRSurfaceProperties.hlsli" + +float MyHash11(float p) +{ + return frac(sin(p) * 1e4); +} + +// https://blog.selfshadow.com/publications/blending-in-detail/ +// for when s = (0,0,1) +float3 MyReorientNormal(float3 n1, float3 n2) +{ + n1 += float3(0, 0, 1); + n2 *= float3(-1, -1, 1); + + return n1 * dot(n1, n2) / n1.z - n2; +} + +// stolen from wetness effects +float SnowNoise(float3 pos) +{ + // https://github.com/BelmuTM/Noble/blob/master/LICENSE.txt + + const float3 step = float3(110.0, 241.0, 171.0); + float3 i = floor(pos); + float3 f = frac(pos); + float n = dot(i, step); + + float3 u = f * f * (3.0 - 2.0 * f); + return lerp(lerp(lerp(MyHash11(n + dot(step, float3(0.0, 0.0, 0.0))), MyHash11(n + dot(step, float3(1.0, 0.0, 0.0))), u.x), + lerp(MyHash11(n + dot(step, float3(0.0, 1.0, 0.0))), MyHash11(n + dot(step, float3(1.0, 1.0, 0.0))), u.x), u.y), + lerp(lerp(MyHash11(n + dot(step, float3(0.0, 0.0, 1.0))), MyHash11(n + dot(step, float3(1.0, 0.0, 1.0))), u.x), + lerp(MyHash11(n + dot(step, float3(0.0, 1.0, 1.0))), MyHash11(n + dot(step, float3(1.0, 1.0, 1.0))), u.x), u.y), + u.z); +} + +// http://chilliant.blogspot.com/2010/11/rgbhsv-in-hlsl.html +float3 Hue(float H) +{ + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); +} + +float3 HSVtoRGB(in float3 HSV) +{ + return ((Hue(HSV.x) - 1) * HSV.y + 1) * HSV.z; +} + +float3 RGBtoHSV(in float3 RGB) +{ + float3 HSV = 0; + HSV.z = max(RGB.r, max(RGB.g, RGB.b)); + float M = min(RGB.r, min(RGB.g, RGB.b)); + float C = HSV.z - M; + + if (C != 0) { + HSV.y = C / HSV.z; + float3 Delta = (HSV.z - RGB) / C; + Delta.rgb -= Delta.brg; + Delta.rg += float2(2, 4); + if (RGB.r >= HSV.z) + HSV.x = Delta.b; + else if (RGB.g >= HSV.z) + HSV.x = Delta.r; + else + HSV.x = Delta.g; + HSV.x = frac(HSV.x / 6); + } + return HSV; +} + +float GetHeightMult(float3 p) +{ + float height_tresh = p.z - snowCoverSettings.SnowHeightOffset - (p.x * 0.010569460362286 - p.y * 0.165389061732133 - p.x * p.x * 0.000000034552775 - p.x * p.y * 0.000000572526633 - p.y * p.y * 0.000000272913055 - p.x * p.x * p.x * 0.000000000001466 + p.x * p.x * p.y * 0.000000000000441 + p.x * p.y * p.y * 0.000000000003507 + p.y * p.y * p.y * 0.000000000006575); + return height_tresh / 1000; +} + +float GetEnvironmentalMultiplier(float3 p) +{ + return GetHeightMult(p); +} + +void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, float3 p) +{ + fnl_state noise = fnlCreateState(); + noise.noise_type = FNL_NOISE_VALUE_CUBIC; + float v = fnlGetNoise2D(noise, p.x * 512, p.y * 512); + noise.octaves = 1; + float mult = saturate(pow(abs(worldNormal.z), 0.5) - 0.25 * abs(v)) * saturate(GetEnvironmentalMultiplier(p)); + if (snowCoverSettings.AffectFoliageColor) { + float gmult = saturate(GetHeightMult(p) - snowCoverSettings.FoliageHeightOffset / 1000); + float3 hsv = RGBtoHSV(color); + if (hsv.x > 0.5625) + hsv.x = frac(lerp(hsv.x, 1.125, gmult)); + else + hsv.x = lerp(hsv.x, 0.125, gmult); + //hsv.z = pow(hsv.z, 1+gmult*0.5); + color = HSVtoRGB(hsv); + } + //float mult = skylight; + color = lerp(color, 0.35 + v * 0.05, mult); + //color = worldNormal*0.5+0.5; + glossiness = lerp(glossiness, 0.5 * pow(v, 3.0), mult); + shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); + worldNormal = normalize(lerp(worldNormal, float3(0, 0, 1.0), mult)); +} + +float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos, out float vnoise, out float snoise) +{ + float viewDist = max(1,sqrt(viewPos.z)/512);//max(1, (viewPos.z + (sin(viewPos.x * 7 + viewPos.z * 13))) / 512); + fnl_state noise = fnlCreateState(); + noise.noise_type = FNL_NOISE_VALUE_CUBIC; + noise.fractal_type = FNL_FRACTAL_PINGPONG; + noise.ping_pong_strength = 1.0; + noise.octaves = max(1, (2 / viewDist)); + float v = fnlGetNoise2D(noise, p.x * 512, p.y * 512) / viewDist; + noise.fractal_type = FNL_FRACTAL_FBM; + noise.noise_type = FNL_NOISE_OPENSIMPLEX2S; + noise.octaves = max(1, (5 / viewDist)); + float simplex_scale = 1; + float s = fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale) / viewDist; + float sx = fnlGetNoise2D(noise, p.x * simplex_scale + (1 + worldNormal.x)*viewDist, p.y * simplex_scale) / viewDist; + float sy = fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale + (1 + worldNormal.y)*viewDist) / viewDist; + float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(GetEnvironmentalMultiplier(p)+s+sh0*snowDispScale)); + sh0 = saturate(sh0 + mult*s*0.1/snowDispScale); + vnoise = (v)*0.5 + 0.5; + snoise = s * 0.5 + 0.5; + //color = normalize(abs(float3(sx - s, sy - s, 1.0-worldNormal.z))); + //color = lerp(color, 0.35 + v * 0.05 + s * 0.001, mult); + //color = 1/viewDist; + //color = worldNormal*0.5+0.5; + worldNormal = normalize(lerp(worldNormal, normalize(float3(sx-s+sin(v*3.14)*0.02, sy-s+cos(v*3.14)*0.02,0.05+vnoise*0.05)), mult)); + //worldNormal = float3(0,0,1); + //worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normalize(float3(sx-s, sy-s,vnoise*0.2))), mult)); + return mult; +} +# if defined(TRUE_PBR) +void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos) +{ + float v; + float s; + float mult = ApplySnowBase(color, worldNormal, sh0, snowDispScale, p, skylight, viewPos, v, s); + color = lerp(color, 0.8 + s * 0.15, mult); + prop.Metallic *= mult; + prop.Roughness = lerp(prop.Roughness, 0.9 - 0.6 * pow(v * s, 3.0), mult); + prop.F0 = lerp(prop.F0, 0.04, mult); + //prop.AO = lerp(prop.AO, saturate(max(pow(0.5 * s, 0.5) + 0.5, v)), mult); + prop.GlintScreenSpaceScale = lerp(prop.GlintScreenSpaceScale, 1.15, mult); + prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, 40, mult); + prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, 0.01, mult); + prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, 5.0, mult); +} +# else +void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos) +{ + float v; + float s; + //color = sRGB2Lin(color); + float mult = ApplySnowBase(color, worldNormal, sh0, snowDispScale, p, skylight, viewPos, v, s); + color = lerp(color, 0.35 + v * 0.05 + s * 0.001, mult); + //color = Lin2sRGB(color); + glossiness = lerp(glossiness, 0.5 * pow(v * s, 3.0), mult); + shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); +} +# endif +#endif \ No newline at end of file diff --git a/package/Shaders/Common/PBR.hlsli b/package/Shaders/Common/PBR.hlsli index 560c4ce4a8..7cf8420375 100644 --- a/package/Shaders/Common/PBR.hlsli +++ b/package/Shaders/Common/PBR.hlsli @@ -37,54 +37,8 @@ namespace PBR # include "Common/Glints/Glints2023.hlsli" #endif - struct SurfaceProperties - { - float3 BaseColor; - float Roughness; - float Metallic; - float AO; - float3 F0; - float3 SubsurfaceColor; - float Thickness; - float3 CoatColor; - float CoatStrength; - float CoatRoughness; - float3 CoatF0; - float3 FuzzColor; - float FuzzWeight; - float GlintScreenSpaceScale; - float GlintLogMicrofacetDensity; - float GlintMicrofacetRoughness; - float GlintDensityRandomization; - }; - - SurfaceProperties InitSurfaceProperties() - { - SurfaceProperties surfaceProperties; - - surfaceProperties.Roughness = 1; - surfaceProperties.Metallic = 0; - surfaceProperties.AO = 1; - surfaceProperties.F0 = 0.04; +# include "Common/PBRSurfaceProperties.hlsli" - surfaceProperties.SubsurfaceColor = 0; - surfaceProperties.Thickness = 0; - - surfaceProperties.CoatColor = 0; - surfaceProperties.CoatStrength = 0; - surfaceProperties.CoatRoughness = 0; - surfaceProperties.CoatF0 = 0.04; - - surfaceProperties.FuzzColor = 0; - surfaceProperties.FuzzWeight = 0; - - surfaceProperties.GlintScreenSpaceScale = 1.5; - surfaceProperties.GlintLogMicrofacetDensity = 40.0; - surfaceProperties.GlintMicrofacetRoughness = 0.015; - surfaceProperties.GlintDensityRandomization = 2.0; - - return surfaceProperties; - } struct LightProperties { diff --git a/package/Shaders/Common/PBRSurfaceProperties.hlsli b/package/Shaders/Common/PBRSurfaceProperties.hlsli new file mode 100644 index 0000000000..0f8d59b915 --- /dev/null +++ b/package/Shaders/Common/PBRSurfaceProperties.hlsli @@ -0,0 +1,50 @@ +namespace PBR{ + struct SurfaceProperties + { + float3 BaseColor; + float Roughness; + float Metallic; + float AO; + float3 F0; + float3 SubsurfaceColor; + float Thickness; + float3 CoatColor; + float CoatStrength; + float CoatRoughness; + float3 CoatF0; + float3 FuzzColor; + float FuzzWeight; + float GlintScreenSpaceScale; + float GlintLogMicrofacetDensity; + float GlintMicrofacetRoughness; + float GlintDensityRandomization; + }; + + SurfaceProperties InitSurfaceProperties() + { + SurfaceProperties surfaceProperties; + + surfaceProperties.Roughness = 1; + surfaceProperties.Metallic = 0; + surfaceProperties.AO = 1; + surfaceProperties.F0 = 0.04; + + surfaceProperties.SubsurfaceColor = 0; + surfaceProperties.Thickness = 0; + + surfaceProperties.CoatColor = 0; + surfaceProperties.CoatStrength = 0; + surfaceProperties.CoatRoughness = 0; + surfaceProperties.CoatF0 = 0.04; + + surfaceProperties.FuzzColor = 0; + surfaceProperties.FuzzWeight = 0; + + surfaceProperties.GlintScreenSpaceScale = 1.5; + surfaceProperties.GlintLogMicrofacetDensity = 40.0; + surfaceProperties.GlintMicrofacetRoughness = 0.015; + surfaceProperties.GlintDensityRandomization = 2.0; + + return surfaceProperties; + } +} \ No newline at end of file diff --git a/package/Shaders/Common/SharedData.hlsli b/package/Shaders/Common/SharedData.hlsli index 06233b04d3..c6e418d31e 100644 --- a/package/Shaders/Common/SharedData.hlsli +++ b/package/Shaders/Common/SharedData.hlsli @@ -134,6 +134,23 @@ struct SkylightingSettings uint3 pad2; }; +struct SnowCoverSettings +{ + uint Month; + float Time; + float Snowing; + float SnowAmount; + float SnowpileAmount; + + uint EnableSnowCover; + uint AffectFoliageColor; + float SnowHeightOffset; + float FoliageHeightOffset; + uint MaxSummerMonth; + uint MaxWinterMonth; + uint pad; +}; + struct PBRSettings { uint UseMultipleScattering; @@ -150,6 +167,7 @@ cbuffer FeatureData : register(b6) WetnessEffectsSettings wetnessEffectsSettings; LightLimitFixSettings lightLimitFixSettings; SkylightingSettings skylightingSettings; + SnowCoverSettings snowCoverSettings; PBRSettings pbrSettings; }; diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 10d24deeb4..ea7b0c0c1f 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -26,6 +26,13 @@ # define LOD #endif +#if defined(SNOW_COVER) +# undef SNOW +# undef PROJECTED_UV +# undef SPARKLE +# include "SnowCover/SnowCover.hlsli" +#endif + struct VS_INPUT { float4 Position : POSITION0; @@ -955,6 +962,9 @@ float GetSnowParameterY(float texProjTmp, float alpha) # endif # if defined(TRUE_PBR) +# if defined(SNOW_COVER) +# define GLINT +# endif # include "Common/PBR.hlsli" # endif @@ -1066,7 +1076,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if defined(LANDSCAPE) float mipLevels[6]; - float sh0; + float sh0 = 0.5; float pixelOffset; # if defined(EMAT) @@ -1077,7 +1087,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif # else float mipLevel; - float sh0; + float sh0 = 0.5; float pixelOffset; # if defined(EMAT) @@ -1758,6 +1768,56 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace sh2 skylightingSH = inWorld ? Skylighting::sample(skylightingSettings, SkylightingProbeArray, positionMSSkylight, worldSpaceNormal) : float4(sqrt(4.0 * shPI), 0, 0, 0); # endif +# endif + +# if defined(HAIR) + float3 vertexColor = lerp(1, TintColor.xyz, input.Color.y); +# else + float3 vertexColor = input.Color.xyz; +# endif // defined (HAIR) + baseColor.rgb *= vertexColor; + +# if defined(SKYLIGHTING) + float occlusion = inWorld ? smoothstep(0,1,(shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? worldSpaceNormal : float3(0, 0, 1)))) : 0; +# else + float occlusion = inWorld ? 1 : 0; +#endif + +# if defined(SNOW_COVER) + float snowDispScale = 1.0; + +# if defined(TRUE_PBR) + float shininess = 100; +# if defined(LANDSCAPE) + snowDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, + max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, + max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); +# else + snowDispScale = displacementParams.HeightScale; +# endif +# endif + + //float3 pos = float3(diffuseUv.x, diffuseUv.y, 0); + float3 pos = (input.WorldPosition + CameraPosAdjust[eyeIndex]).xyz; + if (snowCoverSettings.EnableSnowCover) +# if defined(TREE_ANIM) + ApplySnowFoliage(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, pos); +# else +# if defined(TRUE_PBR) + ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, snowDispScale, pos, occlusion, viewPosition.z); +# else + ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, occlusion, viewPosition.z); +# endif +# endif + glossiness = glossiness.xxxx; + +# if !defined(DRAW_IN_WORLDSPACE) // && (defined(SKINNED) || !defined(MODELSPACENORMALS)) + [flatten] if (!input.WorldSpace) + modelNormal.xyz = mul(transpose(input.World[eyeIndex]), float4(worldSpaceNormal, 0)); + else +# endif + modelNormal.xyz = worldSpaceNormal; + modelNormal.xyz = normalize(modelNormal.xyz); # endif float4 waterData = GetWaterData(input.WorldPosition.xyz); @@ -2357,11 +2417,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif # endif -# if defined(HAIR) - float3 vertexColor = lerp(1, TintColor.xyz, input.Color.y); -# else - float3 vertexColor = input.Color.xyz; -# endif // defined (HAIR) + float4 color = 0; @@ -2405,8 +2461,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace color.xyz += diffuseColor * baseColor.xyz; # endif - color.xyz *= vertexColor; - # if defined(MULTI_LAYER_PARALLAX) float layerValue = MultiLayerParallaxData.x * TexLayerSampler.Sample(SampLayerSampler, uv).w; float3 tangentViewDirection = mul(viewDirection, tbn); diff --git a/src/Feature.cpp b/src/Feature.cpp index 5349291d68..1460272090 100644 --- a/src/Feature.cpp +++ b/src/Feature.cpp @@ -15,6 +15,7 @@ #include "Features/TerrainOcclusion.h" #include "Features/WaterLighting.h" #include "Features/WetnessEffects.h" +#include "Features/SnowCover.h" #include "State.h" @@ -124,7 +125,8 @@ const std::vector& Feature::GetFeatureList() TerrainOcclusion::GetSingleton(), ScreenSpaceGI::GetSingleton(), Skylighting::GetSingleton(), - TerrainBlending::GetSingleton() + TerrainBlending::GetSingleton(), + SnowCover::GetSingleton() }; static std::vector featuresVR(features); diff --git a/src/FeatureBuffer.cpp b/src/FeatureBuffer.cpp index 251dd88e7a..ff502d9e6d 100644 --- a/src/FeatureBuffer.cpp +++ b/src/FeatureBuffer.cpp @@ -7,6 +7,7 @@ #include "Features/Skylighting.h" #include "Features/TerrainOcclusion.h" #include "Features/WetnessEffects.h" +#include "Features/SnowCover.h" #include "TruePBR.h" @@ -36,5 +37,6 @@ std::pair GetFeatureBufferData() WetnessEffects::GetSingleton()->GetCommonBufferData(), LightLimitFix::GetSingleton()->GetCommonBufferData(), Skylighting::GetSingleton()->cbData, + SnowCover::GetSingleton()->GetCommonBufferData(), TruePBR::GetSingleton()->settings); } \ No newline at end of file diff --git a/src/Features/SnowCover.cpp b/src/Features/SnowCover.cpp new file mode 100644 index 0000000000..91ade01d54 --- /dev/null +++ b/src/Features/SnowCover.cpp @@ -0,0 +1,221 @@ +#include "SnowCover.h" + +#include "Util.h" + +const float MIN_START_PERCENTAGE = 0.05f; +const float DEFAULT_TRANSITION_PERCENTAGE = 1.0f; +const float TRANSITION_CURVE_MULTIPLIER = 2.0f; +const float TRANSITION_DENOMINATOR = 256.0f; +const float DRY_WETNESS = 0.0f; +const float RAIN_DELTA_PER_SECOND = 2.0f / 3600.0f; +const float SNOWY_DAY_DELTA_PER_SECOND = -0.0f / 3600.0f; // Only doing evaporation until snow wetness feature is added +const float CLOUDY_DAY_DELTA_PER_SECOND = -0.735f / 3600.0f; +const float CLEAR_DAY_DELTA_PER_SECOND = -1.518f / 3600.0f; +const float WETNESS_SCALE = 2.0; // Speed at which wetness builds up and drys. +const float PUDDLE_SCALE = 1.0; // Speed at which puddles build up and dry +const float MAX_PUDDLE_DEPTH = 3.0f; +const float MAX_WETNESS_DEPTH = 2.0f; +const float MAX_PUDDLE_WETNESS = 1.0f; +const float MAX_WETNESS = 1.0f; +const float SECONDS_IN_A_DAY = 86400; +const float MAX_TIME_DELTA = SECONDS_IN_A_DAY - 30; +const float MIN_WEATHER_TRANSITION_SPEED = 0.0f; +const float MAX_WEATHER_TRANSITION_SPEED = 500.0f; +const float AVERAGE_RAIN_VOLUME = 4000.0f; +const float MIN_RAINDROP_CHANCE_MULTIPLIER = 0.1f; +const float MAX_RAINDROP_CHANCE_MULTIPLIER = 2.0f; + +NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT( + SnowCover::Settings, + EnableSnowCover, + AffectFoliageColor, + SnowHeightOffset, + FoliageHeightOffset, + MaxSummerMonth, + MaxWinterMonth) + +void SnowCover::DrawSettings() +{ + if (ImGui::TreeNodeEx("Snow Cover", ImGuiTreeNodeFlags_DefaultOpen)) { + ImGui::Checkbox("Enable Snow Cover", (bool*)&settings.EnableSnowCover); + ImGui::Checkbox("Affect Foliage Color", (bool*)&settings.AffectFoliageColor); + ImGui::SliderFloat("Snow Line Height Offset", &settings.SnowHeightOffset, -10000.0f, 10000.0f); + ImGui::SliderFloat("Foliage Color Height Offset", &settings.FoliageHeightOffset, -10000.0f, 10000.0f); + ImGui::SliderInt("Maximum Summer Month", (int*)&settings.MaxSummerMonth, 0, 11); + ImGui::SliderInt("Maximum Winter Month", (int*)&settings.MaxWinterMonth, 0, 11); + ImGui::TreePop(); + } + + ImGui::Spacing(); + ImGui::Spacing(); + + if (ImGui::TreeNodeEx("...", ImGuiTreeNodeFlags_DefaultOpen)) { + ImGui::TreePop(); + } + + ImGui::Spacing(); + ImGui::Spacing(); +} + +float SnowCover::CalculateWeatherTransitionPercentage(float skyCurrentWeatherPct, float beginFade, bool fadeIn) +{ + float weatherTransitionPercentage = DEFAULT_TRANSITION_PERCENTAGE; + // Correct if beginFade is zero or negative + beginFade = beginFade > 0 ? beginFade : beginFade + TRANSITION_DENOMINATOR; + // Wait to start transition until precipitation begins/ends + float startPercentage = 1 - ((TRANSITION_DENOMINATOR - beginFade) * (1.0f / TRANSITION_DENOMINATOR)); + + if (fadeIn) { + float currentPercentage = (skyCurrentWeatherPct - startPercentage) / (1 - startPercentage); + weatherTransitionPercentage = std::clamp(currentPercentage, 0.0f, 1.0f); + } else { + float currentPercentage = (startPercentage - skyCurrentWeatherPct) / (startPercentage); + weatherTransitionPercentage = 1 - std::clamp(currentPercentage, 0.0f, 1.0f); + } + return weatherTransitionPercentage; +} + +void SnowCover::CalculateWetness(RE::TESWeather* weather, RE::Sky* sky, float seconds, float& weatherWetnessDepth, float& weatherPuddleDepth) +{ + float wetnessDepthDelta = CLEAR_DAY_DELTA_PER_SECOND * WETNESS_SCALE * seconds; + float puddleDepthDelta = CLEAR_DAY_DELTA_PER_SECOND * PUDDLE_SCALE * seconds; + if (weather && sky) { + // Figure out the weather type and set the wetness + if (weather->precipitationData && weather->data.flags.any(RE::TESWeather::WeatherDataFlag::kRainy)) { + // Raining + wetnessDepthDelta = RAIN_DELTA_PER_SECOND * WETNESS_SCALE * seconds; + puddleDepthDelta = RAIN_DELTA_PER_SECOND * PUDDLE_SCALE * seconds; + } else if (weather->precipitationData && weather->data.flags.any(RE::TESWeather::WeatherDataFlag::kSnow)) { + wetnessDepthDelta = SNOWY_DAY_DELTA_PER_SECOND * WETNESS_SCALE * seconds; + puddleDepthDelta = SNOWY_DAY_DELTA_PER_SECOND * PUDDLE_SCALE * seconds; + } else if (weather->data.flags.any(RE::TESWeather::WeatherDataFlag::kCloudy)) { + wetnessDepthDelta = CLOUDY_DAY_DELTA_PER_SECOND * WETNESS_SCALE * seconds; + puddleDepthDelta = CLOUDY_DAY_DELTA_PER_SECOND * PUDDLE_SCALE * seconds; + } + } + + weatherWetnessDepth = wetnessDepthDelta > 0 ? std::min(weatherWetnessDepth + wetnessDepthDelta, MAX_WETNESS_DEPTH) : std::max(weatherWetnessDepth + wetnessDepthDelta, 0.0f); + weatherPuddleDepth = puddleDepthDelta > 0 ? std::min(weatherPuddleDepth + puddleDepthDelta, MAX_PUDDLE_DEPTH) : std::max(weatherPuddleDepth + puddleDepthDelta, 0.0f); +} + +void SnowCover::Draw(const RE::BSShader*, const uint32_t) +{ +} + +SnowCover::PerFrame SnowCover::GetCommonBufferData() +{ + PerFrame data{}; + data.SnowAmount = DRY_WETNESS; + data.SnowpileAmount = DRY_WETNESS; + currentWeatherID = 0; + uint32_t previousLastWeatherID = lastWeatherID; + lastWeatherID = 0; + float currentWeatherRaining = 0.0f; + float lastWeatherRaining = 0.0f; + float weatherTransitionPercentage = previousWeatherTransitionPercentage; + + if (settings.EnableSnowCover) { + if (auto sky = RE::Sky::GetSingleton()) { + if (sky->mode.get() == RE::Sky::Mode::kFull) { + if (auto currentWeather = sky->currentWeather) { + if (currentWeather->precipitationData && currentWeather->data.flags.any(RE::TESWeather::WeatherDataFlag::kSnow)) { + float rainDensity = currentWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity)].f; + float rainGravity = currentWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kGravityVelocity)].f; + currentWeatherRaining = std::clamp(((rainDensity * rainGravity) / AVERAGE_RAIN_VOLUME), MIN_RAINDROP_CHANCE_MULTIPLIER, MAX_RAINDROP_CHANCE_MULTIPLIER); + } + currentWeatherID = currentWeather->GetFormID(); + if (auto calendar = RE::Calendar::GetSingleton()) { + data.Month = calendar->GetMonth(); + float currentWeatherWetnessDepth = wetnessDepth; + float currentWeatherPuddleDepth = puddleDepth; + float currentGameTime = calendar->GetCurrentGameTime() * SECONDS_IN_A_DAY; + lastGameTimeValue = lastGameTimeValue == 0 ? currentGameTime : lastGameTimeValue; + float seconds = currentGameTime - lastGameTimeValue; + lastGameTimeValue = currentGameTime; + + if (abs(seconds) >= MAX_TIME_DELTA) { + // If too much time has passed, snap wetness depths to the current weather. + seconds = 0.0f; + currentWeatherWetnessDepth = 0.0f; + currentWeatherPuddleDepth = 0.0f; + weatherTransitionPercentage = DEFAULT_TRANSITION_PERCENTAGE; + CalculateWetness(currentWeather, sky, 1.0f, currentWeatherWetnessDepth, currentWeatherPuddleDepth); + wetnessDepth = currentWeatherWetnessDepth > 0 ? MAX_WETNESS_DEPTH : 0.0f; + puddleDepth = currentWeatherPuddleDepth > 0 ? MAX_PUDDLE_DEPTH : 0.0f; + } + + if (seconds > 0 || (seconds < 0 && (wetnessDepth > 0 || puddleDepth > 0))) { + weatherTransitionPercentage = DEFAULT_TRANSITION_PERCENTAGE; + float lastWeatherWetnessDepth = wetnessDepth; + float lastWeatherPuddleDepth = puddleDepth; + seconds *= MIN_WEATHER_TRANSITION_SPEED + (MAX_WEATHER_TRANSITION_SPEED - MIN_WEATHER_TRANSITION_SPEED) / 2.0f; + CalculateWetness(currentWeather, sky, seconds, currentWeatherWetnessDepth, currentWeatherPuddleDepth); + // If there is a lastWeather, figure out what type it is and set the wetness + if (auto lastWeather = sky->lastWeather) { + lastWeatherID = lastWeather->GetFormID(); + CalculateWetness(lastWeather, sky, seconds, lastWeatherWetnessDepth, lastWeatherPuddleDepth); + // If it was raining, wait to transition until precipitation ends, otherwise use the current weather's fade in + if (lastWeather->precipitationData && lastWeather->data.flags.any(RE::TESWeather::WeatherDataFlag::kRainy)) { + float rainDensity = lastWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity)].f; + float rainGravity = lastWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kGravityVelocity)].f; + lastWeatherRaining = std::clamp(((rainDensity * rainGravity) / AVERAGE_RAIN_VOLUME), MIN_RAINDROP_CHANCE_MULTIPLIER, MAX_RAINDROP_CHANCE_MULTIPLIER); + weatherTransitionPercentage = CalculateWeatherTransitionPercentage(sky->currentWeatherPct, lastWeather->data.precipitationEndFadeOut, false); + } else { + weatherTransitionPercentage = CalculateWeatherTransitionPercentage(sky->currentWeatherPct, currentWeather->data.precipitationBeginFadeIn, true); + } + } + + // Transition between CurrentWeather and LastWeather depth values + wetnessDepth = std::lerp(lastWeatherWetnessDepth, currentWeatherWetnessDepth, weatherTransitionPercentage); + puddleDepth = std::lerp(lastWeatherPuddleDepth, currentWeatherPuddleDepth, weatherTransitionPercentage); + } else { + lastWeatherID = previousLastWeatherID; + } + + // Calculate the wetness value from the water depth + data.SnowAmount = std::min(wetnessDepth, MAX_WETNESS); + data.SnowpileAmount = std::min(puddleDepth, MAX_PUDDLE_WETNESS); + data.Snowing = std::lerp(lastWeatherRaining, currentWeatherRaining, weatherTransitionPercentage); + previousWeatherTransitionPercentage = weatherTransitionPercentage; + } + } + } + } + } + + static size_t rainTimer = 0; // size_t for precision + if (!RE::UI::GetSingleton()->GameIsPaused()) // from lightlimitfix + rainTimer += (size_t)(RE::GetSecondsSinceLastFrame() * 1000); // BSTimer::delta is always 0 for some reason + data.Time = rainTimer / 1000.f; + + data.settings = settings; + + return data; +} + +void SnowCover::SetupResources() +{ +} + +void SnowCover::Reset() +{ + requiresUpdate = true; +} + +void SnowCover::Load(json& o_json) +{ + if (o_json[GetName()].is_object()) + settings = o_json[GetName()]; + + Feature::Load(o_json); +} + +void SnowCover::Save(json& o_json) +{ + o_json[GetName()] = settings; +} + +void SnowCover::RestoreDefaultSettings() +{ + settings = {}; +} \ No newline at end of file diff --git a/src/Features/SnowCover.h b/src/Features/SnowCover.h new file mode 100644 index 0000000000..ef24aab16e --- /dev/null +++ b/src/Features/SnowCover.h @@ -0,0 +1,80 @@ +#pragma once + +#include "Buffer.h" +#include "Feature.h" +#include "State.h" + +struct SnowCover : Feature +{ +public: + static SnowCover* GetSingleton() + { + static SnowCover singleton; + return &singleton; + } + + virtual inline std::string GetName() { return "Snow Cover"; } + virtual inline std::string GetShortName() { return "SnowCover"; } + inline std::string_view GetShaderDefineName() override { return "SNOW_COVER"; } + + bool HasShaderDefine(RE::BSShader::Type) override { return true; }; + + struct Settings + { + uint EnableSnowCover = true; + uint AffectFoliageColor = true; + float SnowHeightOffset = 0; + float FoliageHeightOffset = -512; + uint MaxSummerMonth = 6; + uint MaxWinterMonth = 0; + }; + + struct alignas(16) PerFrame + { + uint Month; + float Time; + float Snowing; + float SnowAmount; + float SnowpileAmount; + Settings settings; + + float pad[1]; + }; + + Settings settings; + + PerFrame GetCommonBufferData(); + + bool requiresUpdate = true; + float wetnessDepth = 0.0f; + float puddleDepth = 0.0f; + float lastGameTimeValue = 0.0f; + uint32_t currentWeatherID = 0; + uint32_t lastWeatherID = 0; + float previousWeatherTransitionPercentage = 0.0f; + + virtual void SetupResources(); + virtual void Reset(); + + virtual void DrawSettings(); + + virtual void Draw(const RE::BSShader* shader, const uint32_t descriptor); + + virtual void Load(json& o_json); + virtual void Save(json& o_json); + + virtual void RestoreDefaultSettings(); + float CalculateWeatherTransitionPercentage(float skyCurrentWeatherPct, float beginFade, bool fadeIn); + void CalculateWetness(RE::TESWeather* weather, RE::Sky* sky, float seconds, float& wetness, float& puddleWetness); + + virtual inline void PostPostLoad() override { Hooks::Install(); } + + struct Hooks + { + static void Install() + { + } + }; + + bool SupportsVR() override { return true; }; +}; From 800af474ed07bfd22b1c4579b690de030d117df2 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Sun, 8 Sep 2024 07:30:59 +0000 Subject: [PATCH 002/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Snow Cover/Shaders/SnowCover/SnowCover.hlsli | 14 +++++++------- package/Shaders/Common/PBR.hlsli | 3 +-- package/Shaders/Common/PBRSurfaceProperties.hlsli | 5 +++-- package/Shaders/Lighting.hlsl | 14 ++++++-------- src/Feature.cpp | 2 +- src/FeatureBuffer.cpp | 2 +- 6 files changed, 19 insertions(+), 21 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 16aa6868b5..69de5a674e 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -1,7 +1,7 @@ #include "Common/SharedData.hlsli" #include "SnowCover/FastNoiseLite.hlsl" #if defined(PSHADER) -#include "Common/PBRSurfaceProperties.hlsli" +# include "Common/PBRSurfaceProperties.hlsli" float MyHash11(float p) { @@ -111,7 +111,7 @@ void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, inout float float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos, out float vnoise, out float snoise) { - float viewDist = max(1,sqrt(viewPos.z)/512);//max(1, (viewPos.z + (sin(viewPos.x * 7 + viewPos.z * 13))) / 512); + float viewDist = max(1, sqrt(viewPos.z) / 512); //max(1, (viewPos.z + (sin(viewPos.x * 7 + viewPos.z * 13))) / 512); fnl_state noise = fnlCreateState(); noise.noise_type = FNL_NOISE_VALUE_CUBIC; noise.fractal_type = FNL_FRACTAL_PINGPONG; @@ -123,17 +123,17 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh noise.octaves = max(1, (5 / viewDist)); float simplex_scale = 1; float s = fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale) / viewDist; - float sx = fnlGetNoise2D(noise, p.x * simplex_scale + (1 + worldNormal.x)*viewDist, p.y * simplex_scale) / viewDist; - float sy = fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale + (1 + worldNormal.y)*viewDist) / viewDist; - float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(GetEnvironmentalMultiplier(p)+s+sh0*snowDispScale)); - sh0 = saturate(sh0 + mult*s*0.1/snowDispScale); + float sx = fnlGetNoise2D(noise, p.x * simplex_scale + (1 + worldNormal.x) * viewDist, p.y * simplex_scale) / viewDist; + float sy = fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale + (1 + worldNormal.y) * viewDist) / viewDist; + float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(GetEnvironmentalMultiplier(p) + s + sh0 * snowDispScale)); + sh0 = saturate(sh0 + mult * s * 0.1 / snowDispScale); vnoise = (v)*0.5 + 0.5; snoise = s * 0.5 + 0.5; //color = normalize(abs(float3(sx - s, sy - s, 1.0-worldNormal.z))); //color = lerp(color, 0.35 + v * 0.05 + s * 0.001, mult); //color = 1/viewDist; //color = worldNormal*0.5+0.5; - worldNormal = normalize(lerp(worldNormal, normalize(float3(sx-s+sin(v*3.14)*0.02, sy-s+cos(v*3.14)*0.02,0.05+vnoise*0.05)), mult)); + worldNormal = normalize(lerp(worldNormal, normalize(float3(sx - s + sin(v * 3.14) * 0.02, sy - s + cos(v * 3.14) * 0.02, 0.05 + vnoise * 0.05)), mult)); //worldNormal = float3(0,0,1); //worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normalize(float3(sx-s, sy-s,vnoise*0.2))), mult)); return mult; diff --git a/package/Shaders/Common/PBR.hlsli b/package/Shaders/Common/PBR.hlsli index 7cf8420375..1a3d07768d 100644 --- a/package/Shaders/Common/PBR.hlsli +++ b/package/Shaders/Common/PBR.hlsli @@ -37,8 +37,7 @@ namespace PBR # include "Common/Glints/Glints2023.hlsli" #endif -# include "Common/PBRSurfaceProperties.hlsli" - +#include "Common/PBRSurfaceProperties.hlsli" struct LightProperties { diff --git a/package/Shaders/Common/PBRSurfaceProperties.hlsli b/package/Shaders/Common/PBRSurfaceProperties.hlsli index 0f8d59b915..807c9f7a0a 100644 --- a/package/Shaders/Common/PBRSurfaceProperties.hlsli +++ b/package/Shaders/Common/PBRSurfaceProperties.hlsli @@ -1,5 +1,6 @@ -namespace PBR{ - struct SurfaceProperties +namespace PBR +{ + struct SurfaceProperties { float3 BaseColor; float Roughness; diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index ea7b0c0c1f..35c6752352 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1778,20 +1778,20 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace baseColor.rgb *= vertexColor; # if defined(SKYLIGHTING) - float occlusion = inWorld ? smoothstep(0,1,(shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? worldSpaceNormal : float3(0, 0, 1)))) : 0; + float occlusion = inWorld ? smoothstep(0, 1, (shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? worldSpaceNormal : float3(0, 0, 1)))) : 0; # else float occlusion = inWorld ? 1 : 0; -#endif +# endif # if defined(SNOW_COVER) float snowDispScale = 1.0; - + # if defined(TRUE_PBR) float shininess = 100; # if defined(LANDSCAPE) snowDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, - max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, - max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); + max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, + max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); # else snowDispScale = displacementParams.HeightScale; # endif @@ -1806,7 +1806,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if defined(TRUE_PBR) ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, snowDispScale, pos, occlusion, viewPosition.z); # else - ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, occlusion, viewPosition.z); + ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, occlusion, viewPosition.z); # endif # endif glossiness = glossiness.xxxx; @@ -2417,8 +2417,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif # endif - - float4 color = 0; # if defined(TRUE_PBR) diff --git a/src/Feature.cpp b/src/Feature.cpp index 1460272090..c639a7f2ba 100644 --- a/src/Feature.cpp +++ b/src/Feature.cpp @@ -10,12 +10,12 @@ #include "Features/ScreenSpaceGI.h" #include "Features/ScreenSpaceShadows.h" #include "Features/Skylighting.h" +#include "Features/SnowCover.h" #include "Features/SubsurfaceScattering.h" #include "Features/TerrainBlending.h" #include "Features/TerrainOcclusion.h" #include "Features/WaterLighting.h" #include "Features/WetnessEffects.h" -#include "Features/SnowCover.h" #include "State.h" diff --git a/src/FeatureBuffer.cpp b/src/FeatureBuffer.cpp index ff502d9e6d..36b54e4c28 100644 --- a/src/FeatureBuffer.cpp +++ b/src/FeatureBuffer.cpp @@ -5,9 +5,9 @@ #include "Features/GrassLighting.h" #include "Features/LightLimitFix.h" #include "Features/Skylighting.h" +#include "Features/SnowCover.h" #include "Features/TerrainOcclusion.h" #include "Features/WetnessEffects.h" -#include "Features/SnowCover.h" #include "TruePBR.h" From 7b148c4512b685a177525cadfe69b216df603801 Mon Sep 17 00:00:00 2001 From: Exist Date: Sun, 8 Sep 2024 15:55:52 +0200 Subject: [PATCH 003/131] basic texture use --- .../Shaders/SnowCover/SnowCover.hlsli | 38 +++++++++----- package/Shaders/Common/PBR.hlsli | 49 +++++++++++++++++- .../Shaders/Common/PBRSurfaceProperties.hlsli | 50 ------------------- package/Shaders/Common/SharedData.hlsli | 18 +++++-- package/Shaders/Lighting.hlsl | 13 ++--- src/Features/SnowCover.cpp | 49 ++++++++++++------ src/Features/SnowCover.h | 30 +++++++++-- vcpkg.json | 5 ++ 8 files changed, 156 insertions(+), 96 deletions(-) delete mode 100644 package/Shaders/Common/PBRSurfaceProperties.hlsli diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 16aa6868b5..04c8fea3da 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -1,7 +1,12 @@ #include "Common/SharedData.hlsli" #include "SnowCover/FastNoiseLite.hlsl" #if defined(PSHADER) -#include "Common/PBRSurfaceProperties.hlsli" + +Texture2D SnowDiffuse : register(t73); +Texture2D SnowNormal : register(t74); +Texture2D SnowRMAOS : register(t75); +Texture2D SnowParallax : register(t76); + float MyHash11(float p) { @@ -117,23 +122,30 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh noise.fractal_type = FNL_FRACTAL_PINGPONG; noise.ping_pong_strength = 1.0; noise.octaves = max(1, (2 / viewDist)); - float v = fnlGetNoise2D(noise, p.x * 512, p.y * 512) / viewDist; + float v = 0.5;//fnlGetNoise2D(noise, p.x * 512, p.y * 512) / viewDist; noise.fractal_type = FNL_FRACTAL_FBM; noise.noise_type = FNL_NOISE_OPENSIMPLEX2S; noise.octaves = max(1, (5 / viewDist)); float simplex_scale = 1; - float s = fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale) / viewDist; - float sx = fnlGetNoise2D(noise, p.x * simplex_scale + (1 + worldNormal.x)*viewDist, p.y * simplex_scale) / viewDist; - float sy = fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale + (1 + worldNormal.y)*viewDist) / viewDist; + float s = 0.5;//fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale) / viewDist; + float sx = 0.5;//fnlGetNoise2D(noise, p.x * simplex_scale + (1 + worldNormal.x)*viewDist, p.y * simplex_scale) / viewDist; + float sy = 0.5;//fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale + (1 + worldNormal.y)*viewDist) / viewDist; float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(GetEnvironmentalMultiplier(p)+s+sh0*snowDispScale)); - sh0 = saturate(sh0 + mult*s*0.1/snowDispScale); + float parallax = 0.0001*(SnowParallax.Sample(SampColorSampler, p.xy/100).x-0.5); + if(!snowCoverSettings.AffectFoliageColor) + parallax = 0; + float2 uv = p.xy/100 + parallax*viewPos.xy; + color = lerp(color, SnowDiffuse.Sample(SampColorSampler, uv).rgb, mult); + float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); + worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normal), mult)); + sh0 = saturate(sh0 + mult*parallax); vnoise = (v)*0.5 + 0.5; snoise = s * 0.5 + 0.5; //color = normalize(abs(float3(sx - s, sy - s, 1.0-worldNormal.z))); //color = lerp(color, 0.35 + v * 0.05 + s * 0.001, mult); //color = 1/viewDist; //color = worldNormal*0.5+0.5; - worldNormal = normalize(lerp(worldNormal, normalize(float3(sx-s+sin(v*3.14)*0.02, sy-s+cos(v*3.14)*0.02,0.05+vnoise*0.05)), mult)); + //worldNormal = normalize(lerp(worldNormal, normalize(float3(sx-s+sin(v*3.14)*0.02, sy-s+cos(v*3.14)*0.02,0.05+vnoise*0.05)), mult)); //worldNormal = float3(0,0,1); //worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normalize(float3(sx-s, sy-s,vnoise*0.2))), mult)); return mult; @@ -144,15 +156,15 @@ void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::Surfa float v; float s; float mult = ApplySnowBase(color, worldNormal, sh0, snowDispScale, p, skylight, viewPos, v, s); - color = lerp(color, 0.8 + s * 0.15, mult); + //color = lerp(color, 0.8 + s * 0.15, mult); prop.Metallic *= mult; prop.Roughness = lerp(prop.Roughness, 0.9 - 0.6 * pow(v * s, 3.0), mult); prop.F0 = lerp(prop.F0, 0.04, mult); //prop.AO = lerp(prop.AO, saturate(max(pow(0.5 * s, 0.5) + 0.5, v)), mult); - prop.GlintScreenSpaceScale = lerp(prop.GlintScreenSpaceScale, 1.15, mult); - prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, 40, mult); - prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, 0.01, mult); - prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, 5.0, mult); + prop.GlintScreenSpaceScale = lerp(prop.GlintScreenSpaceScale, snowCoverSettings.Glint.x, mult); + prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, snowCoverSettings.Glint.y, mult); + prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, snowCoverSettings.Glint.z, mult); + prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, snowCoverSettings.Glint.w, mult); } # else void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos) @@ -161,7 +173,7 @@ void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossin float s; //color = sRGB2Lin(color); float mult = ApplySnowBase(color, worldNormal, sh0, snowDispScale, p, skylight, viewPos, v, s); - color = lerp(color, 0.35 + v * 0.05 + s * 0.001, mult); + //color = lerp(color, 0.35 + v * 0.05 + s * 0.001, mult); //color = Lin2sRGB(color); glossiness = lerp(glossiness, 0.5 * pow(v * s, 3.0), mult); shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); diff --git a/package/Shaders/Common/PBR.hlsli b/package/Shaders/Common/PBR.hlsli index 7cf8420375..ca14b425d8 100644 --- a/package/Shaders/Common/PBR.hlsli +++ b/package/Shaders/Common/PBR.hlsli @@ -37,7 +37,54 @@ namespace PBR # include "Common/Glints/Glints2023.hlsli" #endif -# include "Common/PBRSurfaceProperties.hlsli" + struct SurfaceProperties + { + float3 BaseColor; + float Roughness; + float Metallic; + float AO; + float3 F0; + float3 SubsurfaceColor; + float Thickness; + float3 CoatColor; + float CoatStrength; + float CoatRoughness; + float3 CoatF0; + float3 FuzzColor; + float FuzzWeight; + float GlintScreenSpaceScale; + float GlintLogMicrofacetDensity; + float GlintMicrofacetRoughness; + float GlintDensityRandomization; + }; + + SurfaceProperties InitSurfaceProperties() + { + SurfaceProperties surfaceProperties; + + surfaceProperties.Roughness = 1; + surfaceProperties.Metallic = 0; + surfaceProperties.AO = 1; + surfaceProperties.F0 = 0.04; + + surfaceProperties.SubsurfaceColor = 0; + surfaceProperties.Thickness = 0; + + surfaceProperties.CoatColor = 0; + surfaceProperties.CoatStrength = 0; + surfaceProperties.CoatRoughness = 0; + surfaceProperties.CoatF0 = 0.04; + + surfaceProperties.FuzzColor = 0; + surfaceProperties.FuzzWeight = 0; + + surfaceProperties.GlintScreenSpaceScale = 1.5; + surfaceProperties.GlintLogMicrofacetDensity = 40.0; + surfaceProperties.GlintMicrofacetRoughness = 0.015; + surfaceProperties.GlintDensityRandomization = 2.0; + + return surfaceProperties; + } struct LightProperties diff --git a/package/Shaders/Common/PBRSurfaceProperties.hlsli b/package/Shaders/Common/PBRSurfaceProperties.hlsli deleted file mode 100644 index 0f8d59b915..0000000000 --- a/package/Shaders/Common/PBRSurfaceProperties.hlsli +++ /dev/null @@ -1,50 +0,0 @@ -namespace PBR{ - struct SurfaceProperties - { - float3 BaseColor; - float Roughness; - float Metallic; - float AO; - float3 F0; - float3 SubsurfaceColor; - float Thickness; - float3 CoatColor; - float CoatStrength; - float CoatRoughness; - float3 CoatF0; - float3 FuzzColor; - float FuzzWeight; - float GlintScreenSpaceScale; - float GlintLogMicrofacetDensity; - float GlintMicrofacetRoughness; - float GlintDensityRandomization; - }; - - SurfaceProperties InitSurfaceProperties() - { - SurfaceProperties surfaceProperties; - - surfaceProperties.Roughness = 1; - surfaceProperties.Metallic = 0; - surfaceProperties.AO = 1; - surfaceProperties.F0 = 0.04; - - surfaceProperties.SubsurfaceColor = 0; - surfaceProperties.Thickness = 0; - - surfaceProperties.CoatColor = 0; - surfaceProperties.CoatStrength = 0; - surfaceProperties.CoatRoughness = 0; - surfaceProperties.CoatF0 = 0.04; - - surfaceProperties.FuzzColor = 0; - surfaceProperties.FuzzWeight = 0; - - surfaceProperties.GlintScreenSpaceScale = 1.5; - surfaceProperties.GlintLogMicrofacetDensity = 40.0; - surfaceProperties.GlintMicrofacetRoughness = 0.015; - surfaceProperties.GlintDensityRandomization = 2.0; - - return surfaceProperties; - } -} \ No newline at end of file diff --git a/package/Shaders/Common/SharedData.hlsli b/package/Shaders/Common/SharedData.hlsli index c6e418d31e..36d172a137 100644 --- a/package/Shaders/Common/SharedData.hlsli +++ b/package/Shaders/Common/SharedData.hlsli @@ -136,19 +136,27 @@ struct SkylightingSettings struct SnowCoverSettings { - uint Month; - float Time; - float Snowing; + float Month; + float TimeSnowing; float SnowAmount; - float SnowpileAmount; + uint pad; uint EnableSnowCover; uint AffectFoliageColor; float SnowHeightOffset; float FoliageHeightOffset; + uint MaxSummerMonth; uint MaxWinterMonth; - uint pad; + float SummerHeightOffset; + float WinterHeightOffset; + + float UVScale; + float ParallaxScale; + + float4 Glint; + uint2 pad2; + }; struct PBRSettings diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index ea7b0c0c1f..dea1b33928 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -26,12 +26,6 @@ # define LOD #endif -#if defined(SNOW_COVER) -# undef SNOW -# undef PROJECTED_UV -# undef SPARKLE -# include "SnowCover/SnowCover.hlsli" -#endif struct VS_INPUT { @@ -1011,6 +1005,13 @@ float GetSnowParameterY(float texProjTmp, float alpha) # include "Skylighting/Skylighting.hlsli" # endif +#if defined(SNOW_COVER) +# undef SNOW +# undef PROJECTED_UV +# undef SPARKLE +# include "SnowCover/SnowCover.hlsli" +#endif + # define LinearSampler SampColorSampler # include "Common/ShadowSampling.hlsli" diff --git a/src/Features/SnowCover.cpp b/src/Features/SnowCover.cpp index 91ade01d54..1b3f0cab81 100644 --- a/src/Features/SnowCover.cpp +++ b/src/Features/SnowCover.cpp @@ -1,14 +1,15 @@ #include "SnowCover.h" #include "Util.h" +#include const float MIN_START_PERCENTAGE = 0.05f; const float DEFAULT_TRANSITION_PERCENTAGE = 1.0f; const float TRANSITION_CURVE_MULTIPLIER = 2.0f; const float TRANSITION_DENOMINATOR = 256.0f; const float DRY_WETNESS = 0.0f; -const float RAIN_DELTA_PER_SECOND = 2.0f / 3600.0f; -const float SNOWY_DAY_DELTA_PER_SECOND = -0.0f / 3600.0f; // Only doing evaporation until snow wetness feature is added +const float RAIN_DELTA_PER_SECOND = -2.0f / 3600.0f; +const float SNOWY_DAY_DELTA_PER_SECOND = 2.0f / 3600.0f; const float CLOUDY_DAY_DELTA_PER_SECOND = -0.735f / 3600.0f; const float CLEAR_DAY_DELTA_PER_SECOND = -1.518f / 3600.0f; const float WETNESS_SCALE = 2.0; // Speed at which wetness builds up and drys. @@ -32,7 +33,7 @@ NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT( SnowHeightOffset, FoliageHeightOffset, MaxSummerMonth, - MaxWinterMonth) + MaxWinterMonth, SummerHeightOffset, WinterHeightOffset, UVScale, ParallaxScale, screenSpaceScale, logMicrofacetDensity, microfacetRoughness, densityRandomization) void SnowCover::DrawSettings() { @@ -43,13 +44,18 @@ void SnowCover::DrawSettings() ImGui::SliderFloat("Foliage Color Height Offset", &settings.FoliageHeightOffset, -10000.0f, 10000.0f); ImGui::SliderInt("Maximum Summer Month", (int*)&settings.MaxSummerMonth, 0, 11); ImGui::SliderInt("Maximum Winter Month", (int*)&settings.MaxWinterMonth, 0, 11); - ImGui::TreePop(); - } - - ImGui::Spacing(); - ImGui::Spacing(); - - if (ImGui::TreeNodeEx("...", ImGuiTreeNodeFlags_DefaultOpen)) { + ImGui::SliderFloat("Summer Height Offset", &settings.SummerHeightOffset, -10000.0f, 10000.0f); + ImGui::SliderFloat("Winter Height Offset", &settings.WinterHeightOffset, -10000.0f, 10000.0f); + + if (ImGui::TreeNodeEx("Snow Material", ImGuiTreeNodeFlags_DefaultOpen)) { + ImGui::SliderFloat("UV Scale", &settings.UVScale, 0.1f, 10.f, "%.1f"); + ImGui::SliderFloat("Parallax Scale", &settings.UVScale, 0.01f, 10.f, "%.1f"); + ImGui::SliderFloat("Screenspace Scale", &settings.screenSpaceScale, 0.f, 3.f, "%.3f"); + ImGui::SliderFloat("Log Microfacet Density", &settings.logMicrofacetDensity, 0.f, 40.f, "%.3f"); + ImGui::SliderFloat("Microfacet Roughness", &settings.microfacetRoughness, 0.f, 1.f, "%.3f"); + ImGui::SliderFloat("Density Randomization", &settings.densityRandomization, 0.f, 5.f, "%.3f"); + ImGui::TreePop(); + } ImGui::TreePop(); } @@ -105,8 +111,7 @@ void SnowCover::Draw(const RE::BSShader*, const uint32_t) SnowCover::PerFrame SnowCover::GetCommonBufferData() { PerFrame data{}; - data.SnowAmount = DRY_WETNESS; - data.SnowpileAmount = DRY_WETNESS; + data.SnowAmount = 0; currentWeatherID = 0; uint32_t previousLastWeatherID = lastWeatherID; lastWeatherID = 0; @@ -125,7 +130,8 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() } currentWeatherID = currentWeather->GetFormID(); if (auto calendar = RE::Calendar::GetSingleton()) { - data.Month = calendar->GetMonth(); + auto time = calendar->GetTime(); + data.Month = static_cast((time.tm_mon + (time.tm_mday + (time.tm_hour + (time.tm_min + time.tm_sec / 61.0) / 60.0) / 24.0) / 32.0) / 12.0); float currentWeatherWetnessDepth = wetnessDepth; float currentWeatherPuddleDepth = puddleDepth; float currentGameTime = calendar->GetCurrentGameTime() * SECONDS_IN_A_DAY; @@ -174,8 +180,6 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() // Calculate the wetness value from the water depth data.SnowAmount = std::min(wetnessDepth, MAX_WETNESS); - data.SnowpileAmount = std::min(puddleDepth, MAX_PUDDLE_WETNESS); - data.Snowing = std::lerp(lastWeatherRaining, currentWeatherRaining, weatherTransitionPercentage); previousWeatherTransitionPercentage = weatherTransitionPercentage; } } @@ -186,7 +190,7 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() static size_t rainTimer = 0; // size_t for precision if (!RE::UI::GetSingleton()->GameIsPaused()) // from lightlimitfix rainTimer += (size_t)(RE::GetSecondsSinceLastFrame() * 1000); // BSTimer::delta is always 0 for some reason - data.Time = rainTimer / 1000.f; + data.TimeSnowing = rainTimer / 1000.f; data.settings = settings; @@ -195,6 +199,19 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() void SnowCover::SetupResources() { + auto& device = State::GetSingleton()->device; + auto& context = State::GetSingleton()->context; + DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow.dds", nullptr, &views.at(0)); + DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow_n.dds", nullptr, &views.at(1)); + DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow_rmaos.dds", nullptr, &views.at(2)); + DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow_p.dds", nullptr, &views.at(3)); +} + +void SnowCover::Prepass() +{ + auto& context = State::GetSingleton()->context; + context->PSSetShaderResources(73, (uint)views.size(), views.data()); + } void SnowCover::Reset() diff --git a/src/Features/SnowCover.h b/src/Features/SnowCover.h index ef24aab16e..7967eccc49 100644 --- a/src/Features/SnowCover.h +++ b/src/Features/SnowCover.h @@ -3,6 +3,7 @@ #include "Buffer.h" #include "Feature.h" #include "State.h" +#include "TruePBR.h" struct SnowCover : Feature { @@ -25,26 +26,44 @@ struct SnowCover : Feature uint AffectFoliageColor = true; float SnowHeightOffset = 0; float FoliageHeightOffset = -512; + uint MaxSummerMonth = 6; uint MaxWinterMonth = 0; + float SummerHeightOffset = 0; + float WinterHeightOffset = -10000; + + float UVScale = 1; + float ParallaxScale = 0.1; + //glint + float screenSpaceScale = 1.2f; + float logMicrofacetDensity = 33.f; + float microfacetRoughness = .15f; + float densityRandomization = 2.f; + + uint pad[2]; }; + static_assert(sizeof(Settings) % 16 == 0); struct alignas(16) PerFrame { - uint Month; - float Time; - float Snowing; + float Month; + float TimeSnowing; float SnowAmount; - float SnowpileAmount; + uint pad[1]; + Settings settings; - float pad[1]; }; + static_assert(sizeof(PerFrame) % 16 == 0); Settings settings; PerFrame GetCommonBufferData(); + std::array views; + + + bool requiresUpdate = true; float wetnessDepth = 0.0f; float puddleDepth = 0.0f; @@ -55,6 +74,7 @@ struct SnowCover : Feature virtual void SetupResources(); virtual void Reset(); + virtual void Prepass() override; virtual void DrawSettings(); diff --git a/vcpkg.json b/vcpkg.json index a5a9fdc57a..882a9d720a 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -40,6 +40,11 @@ { "name": "tracy", "version": "0.11.0" + }, + { + "name": "magic-enum", + "version": "0.9.6", + "port-version": 1 } ], "builtin-baseline": "1dc5ee30eb1032221d29f281f4a94b73f06b4284" From 0fe99a8370607f0c8e95fe07e7d6cd9914273c23 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Sun, 8 Sep 2024 14:04:36 +0000 Subject: [PATCH 004/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Shaders/SnowCover/SnowCover.hlsli | 21 +++++++-------- package/Shaders/Common/PBR.hlsli | 1 - package/Shaders/Common/SharedData.hlsli | 1 - package/Shaders/Lighting.hlsl | 27 +++++++++---------- src/Feature.cpp | 2 +- src/FeatureBuffer.cpp | 2 +- src/Features/SnowCover.cpp | 3 +-- src/Features/SnowCover.h | 3 --- 8 files changed, 25 insertions(+), 35 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 04c8fea3da..e8b65aa6cb 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -7,7 +7,6 @@ Texture2D SnowNormal : register(t74); Texture2D SnowRMAOS : register(t75); Texture2D SnowParallax : register(t76); - float MyHash11(float p) { return frac(sin(p) * 1e4); @@ -116,29 +115,29 @@ void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, inout float float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos, out float vnoise, out float snoise) { - float viewDist = max(1,sqrt(viewPos.z)/512);//max(1, (viewPos.z + (sin(viewPos.x * 7 + viewPos.z * 13))) / 512); + float viewDist = max(1, sqrt(viewPos.z) / 512); //max(1, (viewPos.z + (sin(viewPos.x * 7 + viewPos.z * 13))) / 512); fnl_state noise = fnlCreateState(); noise.noise_type = FNL_NOISE_VALUE_CUBIC; noise.fractal_type = FNL_FRACTAL_PINGPONG; noise.ping_pong_strength = 1.0; noise.octaves = max(1, (2 / viewDist)); - float v = 0.5;//fnlGetNoise2D(noise, p.x * 512, p.y * 512) / viewDist; + float v = 0.5; //fnlGetNoise2D(noise, p.x * 512, p.y * 512) / viewDist; noise.fractal_type = FNL_FRACTAL_FBM; noise.noise_type = FNL_NOISE_OPENSIMPLEX2S; noise.octaves = max(1, (5 / viewDist)); float simplex_scale = 1; - float s = 0.5;//fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale) / viewDist; - float sx = 0.5;//fnlGetNoise2D(noise, p.x * simplex_scale + (1 + worldNormal.x)*viewDist, p.y * simplex_scale) / viewDist; - float sy = 0.5;//fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale + (1 + worldNormal.y)*viewDist) / viewDist; - float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(GetEnvironmentalMultiplier(p)+s+sh0*snowDispScale)); - float parallax = 0.0001*(SnowParallax.Sample(SampColorSampler, p.xy/100).x-0.5); - if(!snowCoverSettings.AffectFoliageColor) + float s = 0.5; //fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale) / viewDist; + float sx = 0.5; //fnlGetNoise2D(noise, p.x * simplex_scale + (1 + worldNormal.x)*viewDist, p.y * simplex_scale) / viewDist; + float sy = 0.5; //fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale + (1 + worldNormal.y)*viewDist) / viewDist; + float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(GetEnvironmentalMultiplier(p) + s + sh0 * snowDispScale)); + float parallax = 0.0001 * (SnowParallax.Sample(SampColorSampler, p.xy / 100).x - 0.5); + if (!snowCoverSettings.AffectFoliageColor) parallax = 0; - float2 uv = p.xy/100 + parallax*viewPos.xy; + float2 uv = p.xy / 100 + parallax * viewPos.xy; color = lerp(color, SnowDiffuse.Sample(SampColorSampler, uv).rgb, mult); float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normal), mult)); - sh0 = saturate(sh0 + mult*parallax); + sh0 = saturate(sh0 + mult * parallax); vnoise = (v)*0.5 + 0.5; snoise = s * 0.5 + 0.5; //color = normalize(abs(float3(sx - s, sy - s, 1.0-worldNormal.z))); diff --git a/package/Shaders/Common/PBR.hlsli b/package/Shaders/Common/PBR.hlsli index ca14b425d8..560c4ce4a8 100644 --- a/package/Shaders/Common/PBR.hlsli +++ b/package/Shaders/Common/PBR.hlsli @@ -86,7 +86,6 @@ namespace PBR return surfaceProperties; } - struct LightProperties { float3 LinearLightColor; diff --git a/package/Shaders/Common/SharedData.hlsli b/package/Shaders/Common/SharedData.hlsli index 36d172a137..c703243e07 100644 --- a/package/Shaders/Common/SharedData.hlsli +++ b/package/Shaders/Common/SharedData.hlsli @@ -156,7 +156,6 @@ struct SnowCoverSettings float4 Glint; uint2 pad2; - }; struct PBRSettings diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index dea1b33928..c402b45f0a 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -26,7 +26,6 @@ # define LOD #endif - struct VS_INPUT { float4 Position : POSITION0; @@ -1005,12 +1004,12 @@ float GetSnowParameterY(float texProjTmp, float alpha) # include "Skylighting/Skylighting.hlsli" # endif -#if defined(SNOW_COVER) -# undef SNOW -# undef PROJECTED_UV -# undef SPARKLE -# include "SnowCover/SnowCover.hlsli" -#endif +# if defined(SNOW_COVER) +# undef SNOW +# undef PROJECTED_UV +# undef SPARKLE +# include "SnowCover/SnowCover.hlsli" +# endif # define LinearSampler SampColorSampler @@ -1779,20 +1778,20 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace baseColor.rgb *= vertexColor; # if defined(SKYLIGHTING) - float occlusion = inWorld ? smoothstep(0,1,(shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? worldSpaceNormal : float3(0, 0, 1)))) : 0; + float occlusion = inWorld ? smoothstep(0, 1, (shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? worldSpaceNormal : float3(0, 0, 1)))) : 0; # else float occlusion = inWorld ? 1 : 0; -#endif +# endif # if defined(SNOW_COVER) float snowDispScale = 1.0; - + # if defined(TRUE_PBR) float shininess = 100; # if defined(LANDSCAPE) snowDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, - max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, - max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); + max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, + max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); # else snowDispScale = displacementParams.HeightScale; # endif @@ -1807,7 +1806,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if defined(TRUE_PBR) ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, snowDispScale, pos, occlusion, viewPosition.z); # else - ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, occlusion, viewPosition.z); + ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, occlusion, viewPosition.z); # endif # endif glossiness = glossiness.xxxx; @@ -2418,8 +2417,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif # endif - - float4 color = 0; # if defined(TRUE_PBR) diff --git a/src/Feature.cpp b/src/Feature.cpp index 1460272090..c639a7f2ba 100644 --- a/src/Feature.cpp +++ b/src/Feature.cpp @@ -10,12 +10,12 @@ #include "Features/ScreenSpaceGI.h" #include "Features/ScreenSpaceShadows.h" #include "Features/Skylighting.h" +#include "Features/SnowCover.h" #include "Features/SubsurfaceScattering.h" #include "Features/TerrainBlending.h" #include "Features/TerrainOcclusion.h" #include "Features/WaterLighting.h" #include "Features/WetnessEffects.h" -#include "Features/SnowCover.h" #include "State.h" diff --git a/src/FeatureBuffer.cpp b/src/FeatureBuffer.cpp index ff502d9e6d..36b54e4c28 100644 --- a/src/FeatureBuffer.cpp +++ b/src/FeatureBuffer.cpp @@ -5,9 +5,9 @@ #include "Features/GrassLighting.h" #include "Features/LightLimitFix.h" #include "Features/Skylighting.h" +#include "Features/SnowCover.h" #include "Features/TerrainOcclusion.h" #include "Features/WetnessEffects.h" -#include "Features/SnowCover.h" #include "TruePBR.h" diff --git a/src/Features/SnowCover.cpp b/src/Features/SnowCover.cpp index 1b3f0cab81..4c8dbf140e 100644 --- a/src/Features/SnowCover.cpp +++ b/src/Features/SnowCover.cpp @@ -9,7 +9,7 @@ const float TRANSITION_CURVE_MULTIPLIER = 2.0f; const float TRANSITION_DENOMINATOR = 256.0f; const float DRY_WETNESS = 0.0f; const float RAIN_DELTA_PER_SECOND = -2.0f / 3600.0f; -const float SNOWY_DAY_DELTA_PER_SECOND = 2.0f / 3600.0f; +const float SNOWY_DAY_DELTA_PER_SECOND = 2.0f / 3600.0f; const float CLOUDY_DAY_DELTA_PER_SECOND = -0.735f / 3600.0f; const float CLEAR_DAY_DELTA_PER_SECOND = -1.518f / 3600.0f; const float WETNESS_SCALE = 2.0; // Speed at which wetness builds up and drys. @@ -211,7 +211,6 @@ void SnowCover::Prepass() { auto& context = State::GetSingleton()->context; context->PSSetShaderResources(73, (uint)views.size(), views.data()); - } void SnowCover::Reset() diff --git a/src/Features/SnowCover.h b/src/Features/SnowCover.h index 7967eccc49..f5c1f4849a 100644 --- a/src/Features/SnowCover.h +++ b/src/Features/SnowCover.h @@ -52,7 +52,6 @@ struct SnowCover : Feature uint pad[1]; Settings settings; - }; static_assert(sizeof(PerFrame) % 16 == 0); @@ -62,8 +61,6 @@ struct SnowCover : Feature std::array views; - - bool requiresUpdate = true; float wetnessDepth = 0.0f; float puddleDepth = 0.0f; From 055d4f61fe9cdd6e8db8bf32bcd4e2a731687912 Mon Sep 17 00:00:00 2001 From: Exist Date: Sun, 8 Sep 2024 16:42:41 +0200 Subject: [PATCH 005/131] buffer fixes --- features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli | 6 ++---- package/Shaders/Common/SharedData.hlsli | 2 +- src/Features/SnowCover.cpp | 9 +++------ src/Features/SnowCover.h | 2 +- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 04c8fea3da..26a57d267d 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -131,10 +131,8 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh float sx = 0.5;//fnlGetNoise2D(noise, p.x * simplex_scale + (1 + worldNormal.x)*viewDist, p.y * simplex_scale) / viewDist; float sy = 0.5;//fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale + (1 + worldNormal.y)*viewDist) / viewDist; float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(GetEnvironmentalMultiplier(p)+s+sh0*snowDispScale)); - float parallax = 0.0001*(SnowParallax.Sample(SampColorSampler, p.xy/100).x-0.5); - if(!snowCoverSettings.AffectFoliageColor) - parallax = 0; - float2 uv = p.xy/100 + parallax*viewPos.xy; + float parallax = 0.1*snowCoverSettings.ParallaxScale*(SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale*p.xy/100).x-0.5); + float2 uv = snowCoverSettings.UVScale*p.xy/100 + parallax*viewPos.xy; color = lerp(color, SnowDiffuse.Sample(SampColorSampler, uv).rgb, mult); float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normal), mult)); diff --git a/package/Shaders/Common/SharedData.hlsli b/package/Shaders/Common/SharedData.hlsli index 36d172a137..301eddf0c5 100644 --- a/package/Shaders/Common/SharedData.hlsli +++ b/package/Shaders/Common/SharedData.hlsli @@ -153,9 +153,9 @@ struct SnowCoverSettings float UVScale; float ParallaxScale; + uint2 pad2; float4 Glint; - uint2 pad2; }; diff --git a/src/Features/SnowCover.cpp b/src/Features/SnowCover.cpp index 1b3f0cab81..3da76b67fa 100644 --- a/src/Features/SnowCover.cpp +++ b/src/Features/SnowCover.cpp @@ -49,7 +49,7 @@ void SnowCover::DrawSettings() if (ImGui::TreeNodeEx("Snow Material", ImGuiTreeNodeFlags_DefaultOpen)) { ImGui::SliderFloat("UV Scale", &settings.UVScale, 0.1f, 10.f, "%.1f"); - ImGui::SliderFloat("Parallax Scale", &settings.UVScale, 0.01f, 10.f, "%.1f"); + ImGui::SliderFloat("Parallax Scale", &settings.ParallaxScale, 0.f, 1.f, "%.1f"); ImGui::SliderFloat("Screenspace Scale", &settings.screenSpaceScale, 0.f, 3.f, "%.3f"); ImGui::SliderFloat("Log Microfacet Density", &settings.logMicrofacetDensity, 0.f, 40.f, "%.3f"); ImGui::SliderFloat("Microfacet Roughness", &settings.microfacetRoughness, 0.f, 1.f, "%.3f"); @@ -221,15 +221,12 @@ void SnowCover::Reset() void SnowCover::Load(json& o_json) { - if (o_json[GetName()].is_object()) - settings = o_json[GetName()]; - - Feature::Load(o_json); + settings = o_json; } void SnowCover::Save(json& o_json) { - o_json[GetName()] = settings; + o_json = settings; } void SnowCover::RestoreDefaultSettings() diff --git a/src/Features/SnowCover.h b/src/Features/SnowCover.h index 7967eccc49..c6728c6d7b 100644 --- a/src/Features/SnowCover.h +++ b/src/Features/SnowCover.h @@ -34,13 +34,13 @@ struct SnowCover : Feature float UVScale = 1; float ParallaxScale = 0.1; + uint pad[2]; //glint float screenSpaceScale = 1.2f; float logMicrofacetDensity = 33.f; float microfacetRoughness = .15f; float densityRandomization = 2.f; - uint pad[2]; }; static_assert(sizeof(Settings) % 16 == 0); From 7b4e72159c1ae766375e3d227460c8802d61d498 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Sun, 8 Sep 2024 14:43:20 +0000 Subject: [PATCH 006/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Shaders/SnowCover/SnowCover.hlsli | 19 +++++++------ package/Shaders/Common/PBR.hlsli | 1 - package/Shaders/Common/SharedData.hlsli | 1 - package/Shaders/Lighting.hlsl | 27 +++++++++---------- src/Feature.cpp | 2 +- src/FeatureBuffer.cpp | 2 +- src/Features/SnowCover.cpp | 3 +-- src/Features/SnowCover.h | 4 --- 8 files changed, 24 insertions(+), 35 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 26a57d267d..d930e081c1 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -7,7 +7,6 @@ Texture2D SnowNormal : register(t74); Texture2D SnowRMAOS : register(t75); Texture2D SnowParallax : register(t76); - float MyHash11(float p) { return frac(sin(p) * 1e4); @@ -116,27 +115,27 @@ void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, inout float float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos, out float vnoise, out float snoise) { - float viewDist = max(1,sqrt(viewPos.z)/512);//max(1, (viewPos.z + (sin(viewPos.x * 7 + viewPos.z * 13))) / 512); + float viewDist = max(1, sqrt(viewPos.z) / 512); //max(1, (viewPos.z + (sin(viewPos.x * 7 + viewPos.z * 13))) / 512); fnl_state noise = fnlCreateState(); noise.noise_type = FNL_NOISE_VALUE_CUBIC; noise.fractal_type = FNL_FRACTAL_PINGPONG; noise.ping_pong_strength = 1.0; noise.octaves = max(1, (2 / viewDist)); - float v = 0.5;//fnlGetNoise2D(noise, p.x * 512, p.y * 512) / viewDist; + float v = 0.5; //fnlGetNoise2D(noise, p.x * 512, p.y * 512) / viewDist; noise.fractal_type = FNL_FRACTAL_FBM; noise.noise_type = FNL_NOISE_OPENSIMPLEX2S; noise.octaves = max(1, (5 / viewDist)); float simplex_scale = 1; - float s = 0.5;//fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale) / viewDist; - float sx = 0.5;//fnlGetNoise2D(noise, p.x * simplex_scale + (1 + worldNormal.x)*viewDist, p.y * simplex_scale) / viewDist; - float sy = 0.5;//fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale + (1 + worldNormal.y)*viewDist) / viewDist; - float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(GetEnvironmentalMultiplier(p)+s+sh0*snowDispScale)); - float parallax = 0.1*snowCoverSettings.ParallaxScale*(SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale*p.xy/100).x-0.5); - float2 uv = snowCoverSettings.UVScale*p.xy/100 + parallax*viewPos.xy; + float s = 0.5; //fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale) / viewDist; + float sx = 0.5; //fnlGetNoise2D(noise, p.x * simplex_scale + (1 + worldNormal.x)*viewDist, p.y * simplex_scale) / viewDist; + float sy = 0.5; //fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale + (1 + worldNormal.y)*viewDist) / viewDist; + float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(GetEnvironmentalMultiplier(p) + s + sh0 * snowDispScale)); + float parallax = 0.1 * snowCoverSettings.ParallaxScale * (SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale * p.xy / 100).x - 0.5); + float2 uv = snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; color = lerp(color, SnowDiffuse.Sample(SampColorSampler, uv).rgb, mult); float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normal), mult)); - sh0 = saturate(sh0 + mult*parallax); + sh0 = saturate(sh0 + mult * parallax); vnoise = (v)*0.5 + 0.5; snoise = s * 0.5 + 0.5; //color = normalize(abs(float3(sx - s, sy - s, 1.0-worldNormal.z))); diff --git a/package/Shaders/Common/PBR.hlsli b/package/Shaders/Common/PBR.hlsli index ca14b425d8..560c4ce4a8 100644 --- a/package/Shaders/Common/PBR.hlsli +++ b/package/Shaders/Common/PBR.hlsli @@ -86,7 +86,6 @@ namespace PBR return surfaceProperties; } - struct LightProperties { float3 LinearLightColor; diff --git a/package/Shaders/Common/SharedData.hlsli b/package/Shaders/Common/SharedData.hlsli index 301eddf0c5..10258e5f83 100644 --- a/package/Shaders/Common/SharedData.hlsli +++ b/package/Shaders/Common/SharedData.hlsli @@ -156,7 +156,6 @@ struct SnowCoverSettings uint2 pad2; float4 Glint; - }; struct PBRSettings diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index dea1b33928..c402b45f0a 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -26,7 +26,6 @@ # define LOD #endif - struct VS_INPUT { float4 Position : POSITION0; @@ -1005,12 +1004,12 @@ float GetSnowParameterY(float texProjTmp, float alpha) # include "Skylighting/Skylighting.hlsli" # endif -#if defined(SNOW_COVER) -# undef SNOW -# undef PROJECTED_UV -# undef SPARKLE -# include "SnowCover/SnowCover.hlsli" -#endif +# if defined(SNOW_COVER) +# undef SNOW +# undef PROJECTED_UV +# undef SPARKLE +# include "SnowCover/SnowCover.hlsli" +# endif # define LinearSampler SampColorSampler @@ -1779,20 +1778,20 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace baseColor.rgb *= vertexColor; # if defined(SKYLIGHTING) - float occlusion = inWorld ? smoothstep(0,1,(shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? worldSpaceNormal : float3(0, 0, 1)))) : 0; + float occlusion = inWorld ? smoothstep(0, 1, (shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? worldSpaceNormal : float3(0, 0, 1)))) : 0; # else float occlusion = inWorld ? 1 : 0; -#endif +# endif # if defined(SNOW_COVER) float snowDispScale = 1.0; - + # if defined(TRUE_PBR) float shininess = 100; # if defined(LANDSCAPE) snowDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, - max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, - max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); + max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, + max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); # else snowDispScale = displacementParams.HeightScale; # endif @@ -1807,7 +1806,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if defined(TRUE_PBR) ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, snowDispScale, pos, occlusion, viewPosition.z); # else - ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, occlusion, viewPosition.z); + ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, occlusion, viewPosition.z); # endif # endif glossiness = glossiness.xxxx; @@ -2418,8 +2417,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif # endif - - float4 color = 0; # if defined(TRUE_PBR) diff --git a/src/Feature.cpp b/src/Feature.cpp index 1460272090..c639a7f2ba 100644 --- a/src/Feature.cpp +++ b/src/Feature.cpp @@ -10,12 +10,12 @@ #include "Features/ScreenSpaceGI.h" #include "Features/ScreenSpaceShadows.h" #include "Features/Skylighting.h" +#include "Features/SnowCover.h" #include "Features/SubsurfaceScattering.h" #include "Features/TerrainBlending.h" #include "Features/TerrainOcclusion.h" #include "Features/WaterLighting.h" #include "Features/WetnessEffects.h" -#include "Features/SnowCover.h" #include "State.h" diff --git a/src/FeatureBuffer.cpp b/src/FeatureBuffer.cpp index ff502d9e6d..36b54e4c28 100644 --- a/src/FeatureBuffer.cpp +++ b/src/FeatureBuffer.cpp @@ -5,9 +5,9 @@ #include "Features/GrassLighting.h" #include "Features/LightLimitFix.h" #include "Features/Skylighting.h" +#include "Features/SnowCover.h" #include "Features/TerrainOcclusion.h" #include "Features/WetnessEffects.h" -#include "Features/SnowCover.h" #include "TruePBR.h" diff --git a/src/Features/SnowCover.cpp b/src/Features/SnowCover.cpp index 3da76b67fa..3050b5611a 100644 --- a/src/Features/SnowCover.cpp +++ b/src/Features/SnowCover.cpp @@ -9,7 +9,7 @@ const float TRANSITION_CURVE_MULTIPLIER = 2.0f; const float TRANSITION_DENOMINATOR = 256.0f; const float DRY_WETNESS = 0.0f; const float RAIN_DELTA_PER_SECOND = -2.0f / 3600.0f; -const float SNOWY_DAY_DELTA_PER_SECOND = 2.0f / 3600.0f; +const float SNOWY_DAY_DELTA_PER_SECOND = 2.0f / 3600.0f; const float CLOUDY_DAY_DELTA_PER_SECOND = -0.735f / 3600.0f; const float CLEAR_DAY_DELTA_PER_SECOND = -1.518f / 3600.0f; const float WETNESS_SCALE = 2.0; // Speed at which wetness builds up and drys. @@ -211,7 +211,6 @@ void SnowCover::Prepass() { auto& context = State::GetSingleton()->context; context->PSSetShaderResources(73, (uint)views.size(), views.data()); - } void SnowCover::Reset() diff --git a/src/Features/SnowCover.h b/src/Features/SnowCover.h index c6728c6d7b..373789a7ff 100644 --- a/src/Features/SnowCover.h +++ b/src/Features/SnowCover.h @@ -40,7 +40,6 @@ struct SnowCover : Feature float logMicrofacetDensity = 33.f; float microfacetRoughness = .15f; float densityRandomization = 2.f; - }; static_assert(sizeof(Settings) % 16 == 0); @@ -52,7 +51,6 @@ struct SnowCover : Feature uint pad[1]; Settings settings; - }; static_assert(sizeof(PerFrame) % 16 == 0); @@ -62,8 +60,6 @@ struct SnowCover : Feature std::array views; - - bool requiresUpdate = true; float wetnessDepth = 0.0f; float puddleDepth = 0.0f; From c52f1ca9494234cf4bf0ff2445af154fc56e8fb5 Mon Sep 17 00:00:00 2001 From: Exist Date: Mon, 9 Sep 2024 17:33:55 +0200 Subject: [PATCH 007/131] working basic seasons and lod snow, first test --- .../Shaders/SnowCover/SnowCover.hlsli | 170 +++++++++--------- package/Shaders/Common/SharedData.hlsli | 2 +- package/Shaders/DistantTree.hlsl | 25 ++- package/Shaders/Lighting.hlsl | 26 +-- package/Shaders/RunGrass.hlsl | 34 +++- src/Features/SnowCover.cpp | 5 +- src/Features/SnowCover.h | 2 +- 7 files changed, 155 insertions(+), 109 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index d930e081c1..95eff2f59b 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -1,5 +1,4 @@ #include "Common/SharedData.hlsli" -#include "SnowCover/FastNoiseLite.hlsl" #if defined(PSHADER) Texture2D SnowDiffuse : register(t73); @@ -7,10 +6,6 @@ Texture2D SnowNormal : register(t74); Texture2D SnowRMAOS : register(t75); Texture2D SnowParallax : register(t76); -float MyHash11(float p) -{ - return frac(sin(p) * 1e4); -} // https://blog.selfshadow.com/publications/blending-in-detail/ // for when s = (0,0,1) @@ -22,23 +17,6 @@ float3 MyReorientNormal(float3 n1, float3 n2) return n1 * dot(n1, n2) / n1.z - n2; } -// stolen from wetness effects -float SnowNoise(float3 pos) -{ - // https://github.com/BelmuTM/Noble/blob/master/LICENSE.txt - - const float3 step = float3(110.0, 241.0, 171.0); - float3 i = floor(pos); - float3 f = frac(pos); - float n = dot(i, step); - - float3 u = f * f * (3.0 - 2.0 * f); - return lerp(lerp(lerp(MyHash11(n + dot(step, float3(0.0, 0.0, 0.0))), MyHash11(n + dot(step, float3(1.0, 0.0, 0.0))), u.x), - lerp(MyHash11(n + dot(step, float3(0.0, 1.0, 0.0))), MyHash11(n + dot(step, float3(1.0, 1.0, 0.0))), u.x), u.y), - lerp(lerp(MyHash11(n + dot(step, float3(0.0, 0.0, 1.0))), MyHash11(n + dot(step, float3(1.0, 0.0, 1.0))), u.x), - lerp(MyHash11(n + dot(step, float3(0.0, 1.0, 1.0))), MyHash11(n + dot(step, float3(1.0, 1.0, 1.0))), u.x), u.y), - u.z); -} // http://chilliant.blogspot.com/2010/11/rgbhsv-in-hlsl.html float3 Hue(float H) @@ -80,23 +58,40 @@ float3 RGBtoHSV(in float3 RGB) float GetHeightMult(float3 p) { float height_tresh = p.z - snowCoverSettings.SnowHeightOffset - (p.x * 0.010569460362286 - p.y * 0.165389061732133 - p.x * p.x * 0.000000034552775 - p.x * p.y * 0.000000572526633 - p.y * p.y * 0.000000272913055 - p.x * p.x * p.x * 0.000000000001466 + p.x * p.x * p.y * 0.000000000000441 + p.x * p.y * p.y * 0.000000000003507 + p.y * p.y * p.y * 0.000000000006575); - return height_tresh / 1000; + return height_tresh; } float GetEnvironmentalMultiplier(float3 p) { - return GetHeightMult(p); + float maxMonth = max(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); + float minMonth = min(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); + float summerToWinter; + if(snowCoverSettings.Month > maxMonth){ + summerToWinter = (snowCoverSettings.Month-maxMonth)/(minMonth + 12 - maxMonth); + if(snowCoverSettings.MaxWinterMonth > snowCoverSettings.MaxSummerMonth) + summerToWinter = 1 - summerToWinter; + } + else if(snowCoverSettings.Month < minMonth){ + summerToWinter = (12 - maxMonth + snowCoverSettings.Month)/(minMonth + 12 - maxMonth); + if(snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) + summerToWinter = 1 - summerToWinter; + } + else{ + summerToWinter = (snowCoverSettings.Month - minMonth)/(maxMonth-minMonth); + if(snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) + summerToWinter = 1 - summerToWinter; + } + + + return (GetHeightMult(p) - lerp(snowCoverSettings.SummerHeightOffset, snowCoverSettings.WinterHeightOffset, summerToWinter)) / 1000; } -void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, float3 p) +void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, float3 p, float skylight) { - fnl_state noise = fnlCreateState(); - noise.noise_type = FNL_NOISE_VALUE_CUBIC; - float v = fnlGetNoise2D(noise, p.x * 512, p.y * 512); - noise.octaves = 1; - float mult = saturate(pow(abs(worldNormal.z), 0.5) - 0.25 * abs(v)) * saturate(GetEnvironmentalMultiplier(p)); + float env_mult = GetEnvironmentalMultiplier(p); + float mult = saturate(pow(abs(worldNormal.z), 1)) * saturate(env_mult) * skylight; if (snowCoverSettings.AffectFoliageColor) { - float gmult = saturate(GetHeightMult(p) - snowCoverSettings.FoliageHeightOffset / 1000); + float gmult = saturate(env_mult - snowCoverSettings.FoliageHeightOffset / 1000); float3 hsv = RGBtoHSV(color); if (hsv.x > 0.5625) hsv.x = frac(lerp(hsv.x, 1.125, gmult)); @@ -105,75 +100,86 @@ void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, inout float //hsv.z = pow(hsv.z, 1+gmult*0.5); color = HSVtoRGB(hsv); } - //float mult = skylight; - color = lerp(color, 0.35 + v * 0.05, mult); - //color = worldNormal*0.5+0.5; - glossiness = lerp(glossiness, 0.5 * pow(v, 3.0), mult); - shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); - worldNormal = normalize(lerp(worldNormal, float3(0, 0, 1.0), mult)); -} + float2 uv = snowCoverSettings.UVScale * p.xy / 100; + float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; +#if !defined(TRUE_PBR) + diffuse = pow(LinearToGamma(diffuse)/3.141, 1/1.5); +#endif + color = lerp(color, diffuse, mult); -float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos, out float vnoise, out float snoise) +} +#if !defined(BASIC_SNOW_COVER) +float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, inout float2 uv, float snowDispScale, float3 p, float skylight, float3 viewPos) { - float viewDist = max(1, sqrt(viewPos.z) / 512); //max(1, (viewPos.z + (sin(viewPos.x * 7 + viewPos.z * 13))) / 512); - fnl_state noise = fnlCreateState(); - noise.noise_type = FNL_NOISE_VALUE_CUBIC; - noise.fractal_type = FNL_FRACTAL_PINGPONG; - noise.ping_pong_strength = 1.0; - noise.octaves = max(1, (2 / viewDist)); - float v = 0.5; //fnlGetNoise2D(noise, p.x * 512, p.y * 512) / viewDist; - noise.fractal_type = FNL_FRACTAL_FBM; - noise.noise_type = FNL_NOISE_OPENSIMPLEX2S; - noise.octaves = max(1, (5 / viewDist)); - float simplex_scale = 1; - float s = 0.5; //fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale) / viewDist; - float sx = 0.5; //fnlGetNoise2D(noise, p.x * simplex_scale + (1 + worldNormal.x)*viewDist, p.y * simplex_scale) / viewDist; - float sy = 0.5; //fnlGetNoise2D(noise, p.x * simplex_scale, p.y * simplex_scale + (1 + worldNormal.y)*viewDist) / viewDist; - float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(GetEnvironmentalMultiplier(p) + s + sh0 * snowDispScale)); + if(snowCoverSettings.Sky < 3) // 3 = exterior + return 0; + //float viewDist = max(1, sqrt(viewPos.z) / 512); + float parallax = 0.1 * snowCoverSettings.ParallaxScale * (SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale * p.xy / 100).x - 0.5); - float2 uv = snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; - color = lerp(color, SnowDiffuse.Sample(SampColorSampler, uv).rgb, mult); - float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); - worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normal), mult)); + float env_mult = GetEnvironmentalMultiplier(p) + parallax + sh0 * snowDispScale; + float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(env_mult)); + uv = snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; +#if defined(TREE_ANIM) + if (snowCoverSettings.AffectFoliageColor) { + float gmult = saturate(env_mult - snowCoverSettings.FoliageHeightOffset / 1000); + float3 hsv = RGBtoHSV(color); + if (hsv.x > 0.5625) + hsv.x = frac(lerp(hsv.x, 1.125, gmult)); + else + hsv.x = lerp(hsv.x, 0.125, gmult); + //hsv.z = pow(hsv.z, 1+gmult*0.5); + color = HSVtoRGB(hsv); + } +#endif + if(mult < 0.1) + return 0; sh0 = saturate(sh0 + mult * parallax); - vnoise = (v)*0.5 + 0.5; - snoise = s * 0.5 + 0.5; - //color = normalize(abs(float3(sx - s, sy - s, 1.0-worldNormal.z))); - //color = lerp(color, 0.35 + v * 0.05 + s * 0.001, mult); - //color = 1/viewDist; - //color = worldNormal*0.5+0.5; - //worldNormal = normalize(lerp(worldNormal, normalize(float3(sx-s+sin(v*3.14)*0.02, sy-s+cos(v*3.14)*0.02,0.05+vnoise*0.05)), mult)); - //worldNormal = float3(0,0,1); - //worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normalize(float3(sx-s, sy-s,vnoise*0.2))), mult)); return mult; } + # if defined(TRUE_PBR) void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos) { - float v; - float s; - float mult = ApplySnowBase(color, worldNormal, sh0, snowDispScale, p, skylight, viewPos, v, s); - //color = lerp(color, 0.8 + s * 0.15, mult); - prop.Metallic *= mult; - prop.Roughness = lerp(prop.Roughness, 0.9 - 0.6 * pow(v * s, 3.0), mult); - prop.F0 = lerp(prop.F0, 0.04, mult); - //prop.AO = lerp(prop.AO, saturate(max(pow(0.5 * s, 0.5) + 0.5, v)), mult); + float2 uv; + float mult = ApplySnowBase(color, worldNormal, sh0, uv, snowDispScale, p, skylight, viewPos); + if(mult <= 0.0) + return; + float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; + color = lerp(color, diffuse, mult); + float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); + //worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normal), mult)); + worldNormal = normalize(lerp(worldNormal, normal, mult)); + float4 rmaos = SnowRMAOS.Sample(SampRMAOSSampler, uv); + prop.Roughness = lerp(prop.Roughness, rmaos.x, mult); + prop.Metallic = lerp(prop.Metallic, rmaos.y, mult); + prop.AO = lerp(prop.AO, rmaos.z, mult); + prop.F0 = lerp(prop.F0, rmaos.w*0.08, mult); prop.GlintScreenSpaceScale = lerp(prop.GlintScreenSpaceScale, snowCoverSettings.Glint.x, mult); prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, snowCoverSettings.Glint.y, mult); prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, snowCoverSettings.Glint.z, mult); prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, snowCoverSettings.Glint.w, mult); } # else + void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos) { - float v; - float s; + float2 uv; //color = sRGB2Lin(color); - float mult = ApplySnowBase(color, worldNormal, sh0, snowDispScale, p, skylight, viewPos, v, s); - //color = lerp(color, 0.35 + v * 0.05 + s * 0.001, mult); - //color = Lin2sRGB(color); - glossiness = lerp(glossiness, 0.5 * pow(v * s, 3.0), mult); - shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); + float mult = ApplySnowBase(color, worldNormal, sh0, uv, snowDispScale, p, skylight, viewPos); + if(mult <= 0.0) + return; + float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; + diffuse = pow(LinearToGamma(diffuse)/PI, 1/1.5); + float4 rmaos = SnowRMAOS.Sample(SampColorSampler, uv); + glossiness = lerp(glossiness, 1-rmaos.x, mult); // yes these are named wrong not my fault bye + shininess = lerp(shininess, 25*500*rmaos.w, mult); + diffuse *= rmaos.z; + color = lerp(color, diffuse, mult); + float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); + worldNormal = normalize(lerp(worldNormal, normal, mult)); + //glossiness = lerp(glossiness, 0.5 * pow(v * s, 3.0), mult); + //shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); } # endif +#endif #endif \ No newline at end of file diff --git a/package/Shaders/Common/SharedData.hlsli b/package/Shaders/Common/SharedData.hlsli index 9fd9100091..3d899ec6bb 100644 --- a/package/Shaders/Common/SharedData.hlsli +++ b/package/Shaders/Common/SharedData.hlsli @@ -142,7 +142,7 @@ struct SnowCoverSettings float Month; float TimeSnowing; float SnowAmount; - uint pad; + uint Sky; uint EnableSnowCover; uint AffectFoliageColor; diff --git a/package/Shaders/DistantTree.hlsl b/package/Shaders/DistantTree.hlsl index b56dbd24a0..9e2eeb769a 100644 --- a/package/Shaders/DistantTree.hlsl +++ b/package/Shaders/DistantTree.hlsl @@ -5,6 +5,7 @@ #include "Common/Random.hlsli" #include "Common/SharedData.hlsli" #include "Common/VR.hlsli" +#include "Common/Color.hlsli" struct VS_INPUT { @@ -171,6 +172,15 @@ const static float DepthOffsets[16] = { # include "CloudShadows/CloudShadows.hlsli" # endif +# if defined(SNOW_COVER) +# undef SNOW +# undef PROJECTED_UV +# undef SPARKLE +# define BASIC_SNOW_COVER +# define SampColorSampler SampDiffuse +# include "SnowCover/SnowCover.hlsli" +# endif + PS_OUTPUT main(PS_INPUT input) { PS_OUTPUT psout; @@ -206,6 +216,14 @@ PS_OUTPUT main(PS_INPUT input) if ((baseColor.w - AlphaTestRefRS) < 0) { discard; } + float3 ddx = ddx_coarse(input.WorldPosition); + float3 ddy = ddy_coarse(input.WorldPosition); + float3 normal = normalize(normalize(cross(ddx, ddy)) + float3(0, 0, 1)); + +# if defined(SNOW_COVER) + if (snowCoverSettings.EnableSnowCover) + ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz, 1); +# endif # if defined(DEFERRED) float3 viewPosition = mul(CameraView[eyeIndex], float4(input.WorldPosition.xyz, 1)).xyz; @@ -235,9 +253,7 @@ PS_OUTPUT main(PS_INPUT input) float3 diffuseColor = DirLightColorShared.xyz * dirShadow; - float3 ddx = ddx_coarse(input.WorldPosition); - float3 ddy = ddy_coarse(input.WorldPosition); - float3 normal = normalize(cross(ddx, ddy)); + # if !defined(SSGI) float3 directionalAmbientColor = mul(DirectionalAmbientShared, float4(normal, 1.0)); @@ -255,9 +271,6 @@ PS_OUTPUT main(PS_INPUT input) psout.Albedo = float4(baseColor.xyz * 0.5, 1); psout.Masks = float4(0, 0, 1, 0); # else - float3 ddx = ddx_coarse(input.WorldPosition); - float3 ddy = ddy_coarse(input.WorldPosition); - float3 normal = normalize(cross(ddx, ddy)); float3 color = baseColor.xyz * (DiffuseColor.xyz + AmbientColor.xyz); psout.Diffuse = float4(color, 1.0); diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 81d8c50df4..aedc3be511 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -26,6 +26,9 @@ # define LOD #endif +#if defined(SKINNED) || defined(SKIN) || defined(EYE) +# undef SNOW_COVER +#endif struct VS_INPUT { float4 Position : POSITION0; @@ -1783,15 +1786,22 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float occlusion = inWorld ? 1 : 0; # endif + + # if defined(SNOW_COVER) +# if !defined(MODELSPACENORMALS) + float3 viewDirTS = normalize(mul(tbnTr, viewDirection)); + viewDirTS.xy /= viewDirTS.z * 0.7 + 0.3; // Fix for objects at extreme viewing angles +# else + float3 viewDirTS = 0; +# endif float snowDispScale = 1.0; # if defined(TRUE_PBR) - float shininess = 100; # if defined(LANDSCAPE) snowDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, - max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, - max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); + max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, + max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); # else snowDispScale = displacementParams.HeightScale; # endif @@ -1800,16 +1810,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace //float3 pos = float3(diffuseUv.x, diffuseUv.y, 0); float3 pos = (input.WorldPosition + CameraPosAdjust[eyeIndex]).xyz; if (snowCoverSettings.EnableSnowCover) -# if defined(TREE_ANIM) - ApplySnowFoliage(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, pos); -# else # if defined(TRUE_PBR) - ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, snowDispScale, pos, occlusion, viewPosition.z); + ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, snowDispScale, pos, occlusion, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); # else - ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, occlusion, viewPosition.z); -# endif -# endif + ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, occlusion, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); glossiness = glossiness.xxxx; +# endif # if !defined(DRAW_IN_WORLDSPACE) // && (defined(SKINNED) || !defined(MODELSPACENORMALS)) [flatten] if (!input.WorldSpace) diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index 0e55746948..e5f0a3aebc 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -398,6 +398,14 @@ cbuffer PerMaterial : register(b1) # include "Common/PBR.hlsli" # endif +# if defined(SNOW_COVER) +# undef SNOW +# undef PROJECTED_UV +# undef SPARKLE +# define BASIC_SNOW_COVER +# include "SnowCover/SnowCover.hlsli" +# endif + PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) { @@ -474,6 +482,24 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace baseColor.xyz *= grassLightingSettings.BasicGrassBrightness; # endif // !TRUE_PBR +# if defined(SKYLIGHTING) +# if defined(VR) + float3 positionMSSkylight = input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz - CameraPosAdjust[0].xyz; +# else + float3 positionMSSkylight = input.WorldPosition.xyz; +# endif + + sh2 skylightingSH = Skylighting::sample(skylightingSettings, SkylightingProbeArray, positionMSSkylight, normal); + + float occlusion = smoothstep(0, 1, (shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? normal : float3(0, 0, 1)))); +# else + float occlusion = 1; +# endif +# if defined(SNOW_COVER) + if (snowCoverSettings.EnableSnowCover) + ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz, occlusion); +# endif + # if defined(TRUE_PBR) float4 rawRMAOS = TexRMAOSSampler.Sample(SampRMAOSSampler, input.TexCoord.xy) * float4(PBRParams1.x, 1, 1, PBRParams1.y); @@ -628,14 +654,8 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if !defined(SSGI) float3 directionalAmbientColor = mul(DirectionalAmbientShared, float4(normal, 1.0)); -# if defined(SKYLIGHTING) -# if defined(VR) - float3 positionMSSkylight = input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz - CameraPosAdjust[0].xyz; -# else - float3 positionMSSkylight = input.WorldPosition.xyz; -# endif - sh2 skylightingSH = Skylighting::sample(skylightingSettings, SkylightingProbeArray, positionMSSkylight, normal); +# if defined(SKYLIGHTING) float skylighting = shFuncProductIntegral(skylightingSH, shEvaluateCosineLobe(skylightingSettings.DirectionalDiffuse ? normal : float3(0, 0, 1))) / shPI; skylighting = Skylighting::mixDiffuse(skylightingSettings, skylighting); diff --git a/src/Features/SnowCover.cpp b/src/Features/SnowCover.cpp index 3050b5611a..5b432338e6 100644 --- a/src/Features/SnowCover.cpp +++ b/src/Features/SnowCover.cpp @@ -49,7 +49,7 @@ void SnowCover::DrawSettings() if (ImGui::TreeNodeEx("Snow Material", ImGuiTreeNodeFlags_DefaultOpen)) { ImGui::SliderFloat("UV Scale", &settings.UVScale, 0.1f, 10.f, "%.1f"); - ImGui::SliderFloat("Parallax Scale", &settings.ParallaxScale, 0.f, 1.f, "%.1f"); + ImGui::SliderFloat("Parallax Scale", &settings.ParallaxScale, 0.f, 2.f, "%.1f"); ImGui::SliderFloat("Screenspace Scale", &settings.screenSpaceScale, 0.f, 3.f, "%.3f"); ImGui::SliderFloat("Log Microfacet Density", &settings.logMicrofacetDensity, 0.f, 40.f, "%.3f"); ImGui::SliderFloat("Microfacet Roughness", &settings.microfacetRoughness, 0.f, 1.f, "%.3f"); @@ -121,6 +121,7 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() if (settings.EnableSnowCover) { if (auto sky = RE::Sky::GetSingleton()) { + data.Sky = static_cast(sky->mode.get()); if (sky->mode.get() == RE::Sky::Mode::kFull) { if (auto currentWeather = sky->currentWeather) { if (currentWeather->precipitationData && currentWeather->data.flags.any(RE::TESWeather::WeatherDataFlag::kSnow)) { @@ -131,7 +132,7 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() currentWeatherID = currentWeather->GetFormID(); if (auto calendar = RE::Calendar::GetSingleton()) { auto time = calendar->GetTime(); - data.Month = static_cast((time.tm_mon + (time.tm_mday + (time.tm_hour + (time.tm_min + time.tm_sec / 61.0) / 60.0) / 24.0) / 32.0) / 12.0); + data.Month = static_cast(time.tm_mon + (time.tm_mday + (time.tm_hour + (time.tm_min + time.tm_sec / 61.0) / 60.0) / 24.0) / 32.0); float currentWeatherWetnessDepth = wetnessDepth; float currentWeatherPuddleDepth = puddleDepth; float currentGameTime = calendar->GetCurrentGameTime() * SECONDS_IN_A_DAY; diff --git a/src/Features/SnowCover.h b/src/Features/SnowCover.h index 373789a7ff..ea3d69aac5 100644 --- a/src/Features/SnowCover.h +++ b/src/Features/SnowCover.h @@ -48,7 +48,7 @@ struct SnowCover : Feature float Month; float TimeSnowing; float SnowAmount; - uint pad[1]; + uint Sky; Settings settings; }; From 8c0ae290cc6525c15b3fc4559cd1dc78144cc521 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Mon, 9 Sep 2024 15:34:30 +0000 Subject: [PATCH 008/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Shaders/SnowCover/SnowCover.hlsli | 58 +++++++++---------- package/Shaders/DistantTree.hlsl | 8 +-- package/Shaders/Lighting.hlsl | 12 ++-- package/Shaders/RunGrass.hlsl | 21 ++++--- 4 files changed, 44 insertions(+), 55 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 95eff2f59b..ce2e93bfa9 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -6,7 +6,6 @@ Texture2D SnowNormal : register(t74); Texture2D SnowRMAOS : register(t75); Texture2D SnowParallax : register(t76); - // https://blog.selfshadow.com/publications/blending-in-detail/ // for when s = (0,0,1) float3 MyReorientNormal(float3 n1, float3 n2) @@ -17,7 +16,6 @@ float3 MyReorientNormal(float3 n1, float3 n2) return n1 * dot(n1, n2) / n1.z - n2; } - // http://chilliant.blogspot.com/2010/11/rgbhsv-in-hlsl.html float3 Hue(float H) { @@ -66,23 +64,20 @@ float GetEnvironmentalMultiplier(float3 p) float maxMonth = max(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); float minMonth = min(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); float summerToWinter; - if(snowCoverSettings.Month > maxMonth){ - summerToWinter = (snowCoverSettings.Month-maxMonth)/(minMonth + 12 - maxMonth); - if(snowCoverSettings.MaxWinterMonth > snowCoverSettings.MaxSummerMonth) + if (snowCoverSettings.Month > maxMonth) { + summerToWinter = (snowCoverSettings.Month - maxMonth) / (minMonth + 12 - maxMonth); + if (snowCoverSettings.MaxWinterMonth > snowCoverSettings.MaxSummerMonth) summerToWinter = 1 - summerToWinter; - } - else if(snowCoverSettings.Month < minMonth){ - summerToWinter = (12 - maxMonth + snowCoverSettings.Month)/(minMonth + 12 - maxMonth); - if(snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) + } else if (snowCoverSettings.Month < minMonth) { + summerToWinter = (12 - maxMonth + snowCoverSettings.Month) / (minMonth + 12 - maxMonth); + if (snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) summerToWinter = 1 - summerToWinter; - } - else{ - summerToWinter = (snowCoverSettings.Month - minMonth)/(maxMonth-minMonth); - if(snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) + } else { + summerToWinter = (snowCoverSettings.Month - minMonth) / (maxMonth - minMonth); + if (snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) summerToWinter = 1 - summerToWinter; } - return (GetHeightMult(p) - lerp(snowCoverSettings.SummerHeightOffset, snowCoverSettings.WinterHeightOffset, summerToWinter)) / 1000; } @@ -102,16 +97,15 @@ void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, float3 p, fl } float2 uv = snowCoverSettings.UVScale * p.xy / 100; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; -#if !defined(TRUE_PBR) - diffuse = pow(LinearToGamma(diffuse)/3.141, 1/1.5); -#endif +# if !defined(TRUE_PBR) + diffuse = pow(LinearToGamma(diffuse) / 3.141, 1 / 1.5); +# endif color = lerp(color, diffuse, mult); - } -#if !defined(BASIC_SNOW_COVER) +# if !defined(BASIC_SNOW_COVER) float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, inout float2 uv, float snowDispScale, float3 p, float skylight, float3 viewPos) { - if(snowCoverSettings.Sky < 3) // 3 = exterior + if (snowCoverSettings.Sky < 3) // 3 = exterior return 0; //float viewDist = max(1, sqrt(viewPos.z) / 512); @@ -119,7 +113,7 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh float env_mult = GetEnvironmentalMultiplier(p) + parallax + sh0 * snowDispScale; float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(env_mult)); uv = snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; -#if defined(TREE_ANIM) +# if defined(TREE_ANIM) if (snowCoverSettings.AffectFoliageColor) { float gmult = saturate(env_mult - snowCoverSettings.FoliageHeightOffset / 1000); float3 hsv = RGBtoHSV(color); @@ -130,19 +124,19 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh //hsv.z = pow(hsv.z, 1+gmult*0.5); color = HSVtoRGB(hsv); } -#endif - if(mult < 0.1) +# endif + if (mult < 0.1) return 0; sh0 = saturate(sh0 + mult * parallax); return mult; } -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos) { float2 uv; float mult = ApplySnowBase(color, worldNormal, sh0, uv, snowDispScale, p, skylight, viewPos); - if(mult <= 0.0) + if (mult <= 0.0) return; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; color = lerp(color, diffuse, mult); @@ -153,26 +147,26 @@ void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::Surfa prop.Roughness = lerp(prop.Roughness, rmaos.x, mult); prop.Metallic = lerp(prop.Metallic, rmaos.y, mult); prop.AO = lerp(prop.AO, rmaos.z, mult); - prop.F0 = lerp(prop.F0, rmaos.w*0.08, mult); + prop.F0 = lerp(prop.F0, rmaos.w * 0.08, mult); prop.GlintScreenSpaceScale = lerp(prop.GlintScreenSpaceScale, snowCoverSettings.Glint.x, mult); prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, snowCoverSettings.Glint.y, mult); prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, snowCoverSettings.Glint.z, mult); prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, snowCoverSettings.Glint.w, mult); } -# else +# else void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos) { float2 uv; //color = sRGB2Lin(color); float mult = ApplySnowBase(color, worldNormal, sh0, uv, snowDispScale, p, skylight, viewPos); - if(mult <= 0.0) + if (mult <= 0.0) return; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; - diffuse = pow(LinearToGamma(diffuse)/PI, 1/1.5); + diffuse = pow(LinearToGamma(diffuse) / PI, 1 / 1.5); float4 rmaos = SnowRMAOS.Sample(SampColorSampler, uv); - glossiness = lerp(glossiness, 1-rmaos.x, mult); // yes these are named wrong not my fault bye - shininess = lerp(shininess, 25*500*rmaos.w, mult); + glossiness = lerp(glossiness, 1 - rmaos.x, mult); // yes these are named wrong not my fault bye + shininess = lerp(shininess, 25 * 500 * rmaos.w, mult); diffuse *= rmaos.z; color = lerp(color, diffuse, mult); float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); @@ -180,6 +174,6 @@ void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossin //glossiness = lerp(glossiness, 0.5 * pow(v * s, 3.0), mult); //shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); } +# endif # endif -#endif #endif \ No newline at end of file diff --git a/package/Shaders/DistantTree.hlsl b/package/Shaders/DistantTree.hlsl index 9e2eeb769a..25cc6e5173 100644 --- a/package/Shaders/DistantTree.hlsl +++ b/package/Shaders/DistantTree.hlsl @@ -1,3 +1,4 @@ +#include "Common/Color.hlsli" #include "Common/Constants.hlsli" #include "Common/FrameBuffer.hlsli" #include "Common/GBuffer.hlsli" @@ -5,7 +6,6 @@ #include "Common/Random.hlsli" #include "Common/SharedData.hlsli" #include "Common/VR.hlsli" -#include "Common/Color.hlsli" struct VS_INPUT { @@ -220,10 +220,10 @@ PS_OUTPUT main(PS_INPUT input) float3 ddy = ddy_coarse(input.WorldPosition); float3 normal = normalize(normalize(cross(ddx, ddy)) + float3(0, 0, 1)); -# if defined(SNOW_COVER) +# if defined(SNOW_COVER) if (snowCoverSettings.EnableSnowCover) ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz, 1); -# endif +# endif # if defined(DEFERRED) float3 viewPosition = mul(CameraView[eyeIndex], float4(input.WorldPosition.xyz, 1)).xyz; @@ -253,8 +253,6 @@ PS_OUTPUT main(PS_INPUT input) float3 diffuseColor = DirLightColorShared.xyz * dirShadow; - - # if !defined(SSGI) float3 directionalAmbientColor = mul(DirectionalAmbientShared, float4(normal, 1.0)); diffuseColor += directionalAmbientColor; diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index aedc3be511..a74fd47154 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1786,8 +1786,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float occlusion = inWorld ? 1 : 0; # endif - - # if defined(SNOW_COVER) # if !defined(MODELSPACENORMALS) float3 viewDirTS = normalize(mul(tbnTr, viewDirection)); @@ -1800,8 +1798,8 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if defined(TRUE_PBR) # if defined(LANDSCAPE) snowDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, - max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, - max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); + max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, + max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); # else snowDispScale = displacementParams.HeightScale; # endif @@ -1810,12 +1808,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace //float3 pos = float3(diffuseUv.x, diffuseUv.y, 0); float3 pos = (input.WorldPosition + CameraPosAdjust[eyeIndex]).xyz; if (snowCoverSettings.EnableSnowCover) -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, snowDispScale, pos, occlusion, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); -# else +# else ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, occlusion, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); glossiness = glossiness.xxxx; -# endif +# endif # if !defined(DRAW_IN_WORLDSPACE) // && (defined(SKINNED) || !defined(MODELSPACENORMALS)) [flatten] if (!input.WorldSpace) diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index e5f0a3aebc..9ef169b45c 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -398,13 +398,13 @@ cbuffer PerMaterial : register(b1) # include "Common/PBR.hlsli" # endif -# if defined(SNOW_COVER) -# undef SNOW -# undef PROJECTED_UV -# undef SPARKLE -# define BASIC_SNOW_COVER -# include "SnowCover/SnowCover.hlsli" -# endif +# if defined(SNOW_COVER) +# undef SNOW +# undef PROJECTED_UV +# undef SPARKLE +# define BASIC_SNOW_COVER +# include "SnowCover/SnowCover.hlsli" +# endif PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) @@ -483,11 +483,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif // !TRUE_PBR # if defined(SKYLIGHTING) -# if defined(VR) +# if defined(VR) float3 positionMSSkylight = input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz - CameraPosAdjust[0].xyz; -# else +# else float3 positionMSSkylight = input.WorldPosition.xyz; -# endif +# endif sh2 skylightingSH = Skylighting::sample(skylightingSettings, SkylightingProbeArray, positionMSSkylight, normal); @@ -654,7 +654,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if !defined(SSGI) float3 directionalAmbientColor = mul(DirectionalAmbientShared, float4(normal, 1.0)); - # if defined(SKYLIGHTING) float skylighting = shFuncProductIntegral(skylightingSH, shEvaluateCosineLobe(skylightingSettings.DirectionalDiffuse ? normal : float3(0, 0, 1))) / shPI; skylighting = Skylighting::mixDiffuse(skylightingSettings, skylighting); From 64f01ade3513bc01d7475723354be024a0b6150d Mon Sep 17 00:00:00 2001 From: Exist Date: Mon, 9 Sep 2024 22:59:17 +0200 Subject: [PATCH 009/131] fade out near water --- .../Shaders/SnowCover/SnowCover.hlsli | 13 +++++++------ package/Shaders/Lighting.hlsl | 19 ++++++++++--------- package/Shaders/RunGrass.hlsl | 7 ++++--- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 95eff2f59b..c492aab3fb 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -109,7 +109,7 @@ void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, float3 p, fl } #if !defined(BASIC_SNOW_COVER) -float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, inout float2 uv, float snowDispScale, float3 p, float skylight, float3 viewPos) +float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, inout float2 uv, float snowDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { if(snowCoverSettings.Sky < 3) // 3 = exterior return 0; @@ -117,7 +117,8 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh float parallax = 0.1 * snowCoverSettings.ParallaxScale * (SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale * p.xy / 100).x - 0.5); float env_mult = GetEnvironmentalMultiplier(p) + parallax + sh0 * snowDispScale; - float mult = smoothstep(0, 1, saturate(pow(worldNormal.z, 2))) * skylight * smoothstep(0, 1, saturate(env_mult)); + waterDist = smoothstep(-32, 8, -waterDist); + float mult = smoothstep(0, 1, pow(worldNormal.z, 2)-waterDist) * skylight * smoothstep(0, 1, env_mult-waterDist); //-smoothstep(-32, 8, -waterDist) uv = snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; #if defined(TREE_ANIM) if (snowCoverSettings.AffectFoliageColor) { @@ -138,10 +139,10 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh } # if defined(TRUE_PBR) -void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos) +void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float snowDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { float2 uv; - float mult = ApplySnowBase(color, worldNormal, sh0, uv, snowDispScale, p, skylight, viewPos); + float mult = ApplySnowBase(color, worldNormal, sh0, uv, snowDispScale, p, skylight, waterDist, viewPos); if(mult <= 0.0) return; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; @@ -161,11 +162,11 @@ void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::Surfa } # else -void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float snowDispScale, float3 p, float skylight, float3 viewPos) +void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float snowDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { float2 uv; //color = sRGB2Lin(color); - float mult = ApplySnowBase(color, worldNormal, sh0, uv, snowDispScale, p, skylight, viewPos); + float mult = ApplySnowBase(color, worldNormal, sh0, uv, snowDispScale, p, skylight, waterDist, viewPos); if(mult <= 0.0) return; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index aedc3be511..d3e93fde0d 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1780,13 +1780,16 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif // defined (HAIR) baseColor.rgb *= vertexColor; + + # if defined(SKYLIGHTING) - float occlusion = inWorld ? smoothstep(0, 1, (shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? worldSpaceNormal : float3(0, 0, 1)))) : 0; + float snowOcclusion = inWorld ? smoothstep(0, 1, (shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? worldSpaceNormal : float3(0, 0, 1)))) : 0; # else - float occlusion = inWorld ? 1 : 0; + float snowOcclusion = inWorld ? 1 : 0; # endif - + float4 waterData = GetWaterData(input.WorldPosition.xyz); + float waterHeight = waterData.w; # if defined(SNOW_COVER) # if !defined(MODELSPACENORMALS) @@ -1796,7 +1799,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 viewDirTS = 0; # endif float snowDispScale = 1.0; - + float3 pos = (input.WorldPosition + CameraPosAdjust[eyeIndex]).xyz; # if defined(TRUE_PBR) # if defined(LANDSCAPE) snowDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, @@ -1808,12 +1811,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif //float3 pos = float3(diffuseUv.x, diffuseUv.y, 0); - float3 pos = (input.WorldPosition + CameraPosAdjust[eyeIndex]).xyz; if (snowCoverSettings.EnableSnowCover) # if defined(TRUE_PBR) - ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, snowDispScale, pos, occlusion, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); + ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, snowDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); # else - ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, occlusion, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); + ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); glossiness = glossiness.xxxx; # endif @@ -1826,8 +1828,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace modelNormal.xyz = normalize(modelNormal.xyz); # endif - float4 waterData = GetWaterData(input.WorldPosition.xyz); - float waterHeight = waterData.w; + float waterRoughnessSpecular = 1; diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index e5f0a3aebc..5dd4e26a84 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -491,13 +491,14 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace sh2 skylightingSH = Skylighting::sample(skylightingSettings, SkylightingProbeArray, positionMSSkylight, normal); - float occlusion = smoothstep(0, 1, (shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? normal : float3(0, 0, 1)))); + float snowOcclusion = smoothstep(0, 1, (shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? normal : float3(0, 0, 1)))); # else - float occlusion = 1; + float snowOcclusion = 1; # endif # if defined(SNOW_COVER) + snowOcclusion *= saturate(input.WorldPosition.z - GetWaterData(input.WorldPosition.xyz).w); if (snowCoverSettings.EnableSnowCover) - ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz, occlusion); + ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz, snowOcclusion); # endif # if defined(TRUE_PBR) From e13038077fe042116b582d807a64422cfb4c855d Mon Sep 17 00:00:00 2001 From: ThePagi Date: Mon, 9 Sep 2024 21:00:51 +0000 Subject: [PATCH 010/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Shaders/SnowCover/SnowCover.hlsli | 60 +++++++++---------- package/Shaders/Lighting.hlsl | 14 ++--- package/Shaders/RunGrass.hlsl | 21 ++++--- 3 files changed, 42 insertions(+), 53 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index c492aab3fb..39d6ea430b 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -6,7 +6,6 @@ Texture2D SnowNormal : register(t74); Texture2D SnowRMAOS : register(t75); Texture2D SnowParallax : register(t76); - // https://blog.selfshadow.com/publications/blending-in-detail/ // for when s = (0,0,1) float3 MyReorientNormal(float3 n1, float3 n2) @@ -17,7 +16,6 @@ float3 MyReorientNormal(float3 n1, float3 n2) return n1 * dot(n1, n2) / n1.z - n2; } - // http://chilliant.blogspot.com/2010/11/rgbhsv-in-hlsl.html float3 Hue(float H) { @@ -66,23 +64,20 @@ float GetEnvironmentalMultiplier(float3 p) float maxMonth = max(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); float minMonth = min(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); float summerToWinter; - if(snowCoverSettings.Month > maxMonth){ - summerToWinter = (snowCoverSettings.Month-maxMonth)/(minMonth + 12 - maxMonth); - if(snowCoverSettings.MaxWinterMonth > snowCoverSettings.MaxSummerMonth) + if (snowCoverSettings.Month > maxMonth) { + summerToWinter = (snowCoverSettings.Month - maxMonth) / (minMonth + 12 - maxMonth); + if (snowCoverSettings.MaxWinterMonth > snowCoverSettings.MaxSummerMonth) summerToWinter = 1 - summerToWinter; - } - else if(snowCoverSettings.Month < minMonth){ - summerToWinter = (12 - maxMonth + snowCoverSettings.Month)/(minMonth + 12 - maxMonth); - if(snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) + } else if (snowCoverSettings.Month < minMonth) { + summerToWinter = (12 - maxMonth + snowCoverSettings.Month) / (minMonth + 12 - maxMonth); + if (snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) summerToWinter = 1 - summerToWinter; - } - else{ - summerToWinter = (snowCoverSettings.Month - minMonth)/(maxMonth-minMonth); - if(snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) + } else { + summerToWinter = (snowCoverSettings.Month - minMonth) / (maxMonth - minMonth); + if (snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) summerToWinter = 1 - summerToWinter; } - return (GetHeightMult(p) - lerp(snowCoverSettings.SummerHeightOffset, snowCoverSettings.WinterHeightOffset, summerToWinter)) / 1000; } @@ -102,25 +97,24 @@ void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, float3 p, fl } float2 uv = snowCoverSettings.UVScale * p.xy / 100; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; -#if !defined(TRUE_PBR) - diffuse = pow(LinearToGamma(diffuse)/3.141, 1/1.5); -#endif +# if !defined(TRUE_PBR) + diffuse = pow(LinearToGamma(diffuse) / 3.141, 1 / 1.5); +# endif color = lerp(color, diffuse, mult); - } -#if !defined(BASIC_SNOW_COVER) +# if !defined(BASIC_SNOW_COVER) float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, inout float2 uv, float snowDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { - if(snowCoverSettings.Sky < 3) // 3 = exterior + if (snowCoverSettings.Sky < 3) // 3 = exterior return 0; //float viewDist = max(1, sqrt(viewPos.z) / 512); float parallax = 0.1 * snowCoverSettings.ParallaxScale * (SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale * p.xy / 100).x - 0.5); float env_mult = GetEnvironmentalMultiplier(p) + parallax + sh0 * snowDispScale; waterDist = smoothstep(-32, 8, -waterDist); - float mult = smoothstep(0, 1, pow(worldNormal.z, 2)-waterDist) * skylight * smoothstep(0, 1, env_mult-waterDist); //-smoothstep(-32, 8, -waterDist) + float mult = smoothstep(0, 1, pow(worldNormal.z, 2) - waterDist) * skylight * smoothstep(0, 1, env_mult - waterDist); //-smoothstep(-32, 8, -waterDist) uv = snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; -#if defined(TREE_ANIM) +# if defined(TREE_ANIM) if (snowCoverSettings.AffectFoliageColor) { float gmult = saturate(env_mult - snowCoverSettings.FoliageHeightOffset / 1000); float3 hsv = RGBtoHSV(color); @@ -131,19 +125,19 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh //hsv.z = pow(hsv.z, 1+gmult*0.5); color = HSVtoRGB(hsv); } -#endif - if(mult < 0.1) +# endif + if (mult < 0.1) return 0; sh0 = saturate(sh0 + mult * parallax); return mult; } -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float snowDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { float2 uv; float mult = ApplySnowBase(color, worldNormal, sh0, uv, snowDispScale, p, skylight, waterDist, viewPos); - if(mult <= 0.0) + if (mult <= 0.0) return; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; color = lerp(color, diffuse, mult); @@ -154,26 +148,26 @@ void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::Surfa prop.Roughness = lerp(prop.Roughness, rmaos.x, mult); prop.Metallic = lerp(prop.Metallic, rmaos.y, mult); prop.AO = lerp(prop.AO, rmaos.z, mult); - prop.F0 = lerp(prop.F0, rmaos.w*0.08, mult); + prop.F0 = lerp(prop.F0, rmaos.w * 0.08, mult); prop.GlintScreenSpaceScale = lerp(prop.GlintScreenSpaceScale, snowCoverSettings.Glint.x, mult); prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, snowCoverSettings.Glint.y, mult); prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, snowCoverSettings.Glint.z, mult); prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, snowCoverSettings.Glint.w, mult); } -# else +# else void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float snowDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { float2 uv; //color = sRGB2Lin(color); float mult = ApplySnowBase(color, worldNormal, sh0, uv, snowDispScale, p, skylight, waterDist, viewPos); - if(mult <= 0.0) + if (mult <= 0.0) return; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; - diffuse = pow(LinearToGamma(diffuse)/PI, 1/1.5); + diffuse = pow(LinearToGamma(diffuse) / PI, 1 / 1.5); float4 rmaos = SnowRMAOS.Sample(SampColorSampler, uv); - glossiness = lerp(glossiness, 1-rmaos.x, mult); // yes these are named wrong not my fault bye - shininess = lerp(shininess, 25*500*rmaos.w, mult); + glossiness = lerp(glossiness, 1 - rmaos.x, mult); // yes these are named wrong not my fault bye + shininess = lerp(shininess, 25 * 500 * rmaos.w, mult); diffuse *= rmaos.z; color = lerp(color, diffuse, mult); float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); @@ -181,6 +175,6 @@ void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossin //glossiness = lerp(glossiness, 0.5 * pow(v * s, 3.0), mult); //shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); } +# endif # endif -#endif #endif \ No newline at end of file diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index d3e93fde0d..849d92ad32 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1780,8 +1780,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif // defined (HAIR) baseColor.rgb *= vertexColor; - - # if defined(SKYLIGHTING) float snowOcclusion = inWorld ? smoothstep(0, 1, (shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? worldSpaceNormal : float3(0, 0, 1)))) : 0; # else @@ -1803,8 +1801,8 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if defined(TRUE_PBR) # if defined(LANDSCAPE) snowDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, - max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, - max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); + max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, + max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); # else snowDispScale = displacementParams.HeightScale; # endif @@ -1812,12 +1810,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace //float3 pos = float3(diffuseUv.x, diffuseUv.y, 0); if (snowCoverSettings.EnableSnowCover) -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, snowDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); -# else +# else ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); glossiness = glossiness.xxxx; -# endif +# endif # if !defined(DRAW_IN_WORLDSPACE) // && (defined(SKINNED) || !defined(MODELSPACENORMALS)) [flatten] if (!input.WorldSpace) @@ -1828,8 +1826,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace modelNormal.xyz = normalize(modelNormal.xyz); # endif - - float waterRoughnessSpecular = 1; # if defined(WETNESS_EFFECTS) diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index 5dd4e26a84..24c383ae14 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -398,13 +398,13 @@ cbuffer PerMaterial : register(b1) # include "Common/PBR.hlsli" # endif -# if defined(SNOW_COVER) -# undef SNOW -# undef PROJECTED_UV -# undef SPARKLE -# define BASIC_SNOW_COVER -# include "SnowCover/SnowCover.hlsli" -# endif +# if defined(SNOW_COVER) +# undef SNOW +# undef PROJECTED_UV +# undef SPARKLE +# define BASIC_SNOW_COVER +# include "SnowCover/SnowCover.hlsli" +# endif PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) @@ -483,11 +483,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif // !TRUE_PBR # if defined(SKYLIGHTING) -# if defined(VR) +# if defined(VR) float3 positionMSSkylight = input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz - CameraPosAdjust[0].xyz; -# else +# else float3 positionMSSkylight = input.WorldPosition.xyz; -# endif +# endif sh2 skylightingSH = Skylighting::sample(skylightingSettings, SkylightingProbeArray, positionMSSkylight, normal); @@ -655,7 +655,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if !defined(SSGI) float3 directionalAmbientColor = mul(DirectionalAmbientShared, float4(normal, 1.0)); - # if defined(SKYLIGHTING) float skylighting = shFuncProductIntegral(skylightingSH, shEvaluateCosineLobe(skylightingSettings.DirectionalDiffuse ? normal : float3(0, 0, 1))) / shPI; skylighting = Skylighting::mixDiffuse(skylightingSettings, skylighting); From 923f76ec9b487133f090a9c7d98920adf13627d4 Mon Sep 17 00:00:00 2001 From: Exist Date: Tue, 10 Sep 2024 16:50:38 +0200 Subject: [PATCH 011/131] fix distant seams due to parallax --- .../Shaders/SnowCover/SnowCover.hlsli | 22 +++++++++++-------- package/Shaders/Lighting.hlsl | 16 +++++++------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index c492aab3fb..3bf8f6a24f 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -109,16 +109,20 @@ void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, float3 p, fl } #if !defined(BASIC_SNOW_COVER) -float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, inout float2 uv, float snowDispScale, float3 p, float skylight, float waterDist, float3 viewPos) +float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, inout float2 uv, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { if(snowCoverSettings.Sky < 3) // 3 = exterior return 0; //float viewDist = max(1, sqrt(viewPos.z) / 512); - +#if defined(TRUE_PBR) && defined(LANDSCAPE) + float disp = sh0; +#else + float disp = sh0 - 0.5; +#endif float parallax = 0.1 * snowCoverSettings.ParallaxScale * (SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale * p.xy / 100).x - 0.5); - float env_mult = GetEnvironmentalMultiplier(p) + parallax + sh0 * snowDispScale; + float env_mult = GetEnvironmentalMultiplier(p) + parallax + disp*underDispScale*0.1; waterDist = smoothstep(-32, 8, -waterDist); - float mult = smoothstep(0, 1, pow(worldNormal.z, 2)-waterDist) * skylight * smoothstep(0, 1, env_mult-waterDist); //-smoothstep(-32, 8, -waterDist) + float mult = smoothstep(0, 1, pow(max(0, worldNormal.z), 2)-waterDist) * skylight * smoothstep(0, 1, env_mult-waterDist); //-smoothstep(-32, 8, -waterDist) uv = snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; #if defined(TREE_ANIM) if (snowCoverSettings.AffectFoliageColor) { @@ -132,17 +136,17 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh color = HSVtoRGB(hsv); } #endif - if(mult < 0.1) + if(mult < 0.01) return 0; sh0 = saturate(sh0 + mult * parallax); return mult; } # if defined(TRUE_PBR) -void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float snowDispScale, float3 p, float skylight, float waterDist, float3 viewPos) +void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { float2 uv; - float mult = ApplySnowBase(color, worldNormal, sh0, uv, snowDispScale, p, skylight, waterDist, viewPos); + float mult = ApplySnowBase(color, worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); if(mult <= 0.0) return; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; @@ -162,11 +166,11 @@ void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::Surfa } # else -void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float snowDispScale, float3 p, float skylight, float waterDist, float3 viewPos) +void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { float2 uv; //color = sRGB2Lin(color); - float mult = ApplySnowBase(color, worldNormal, sh0, uv, snowDispScale, p, skylight, waterDist, viewPos); + float mult = ApplySnowBase(color, worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); if(mult <= 0.0) return; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index d3e93fde0d..227d45f31d 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -26,7 +26,7 @@ # define LOD #endif -#if defined(SKINNED) || defined(SKIN) || defined(EYE) +#if defined(SKINNED) || defined(SKIN) || defined(EYE) || !defined(EXTENDED_MATERIALS) # undef SNOW_COVER #endif struct VS_INPUT @@ -1079,7 +1079,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if defined(LANDSCAPE) float mipLevels[6]; - float sh0 = 0.5; + float sh0 = 0; float pixelOffset; # if defined(EMAT) @@ -1090,7 +1090,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif # else float mipLevel; - float sh0 = 0.5; + float sh0 = 0; float pixelOffset; # if defined(EMAT) @@ -1798,24 +1798,24 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # else float3 viewDirTS = 0; # endif - float snowDispScale = 1.0; + float underDispScale = 1.0; float3 pos = (input.WorldPosition + CameraPosAdjust[eyeIndex]).xyz; # if defined(TRUE_PBR) # if defined(LANDSCAPE) - snowDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, + underDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); # else - snowDispScale = displacementParams.HeightScale; + underDispScale = displacementParams.HeightScale; # endif # endif //float3 pos = float3(diffuseUv.x, diffuseUv.y, 0); if (snowCoverSettings.EnableSnowCover) # if defined(TRUE_PBR) - ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, snowDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); + ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); # else - ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, snowDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); + ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); glossiness = glossiness.xxxx; # endif From 09e6ffc3bf31f333f81d43aacc1f571a8e0281ae Mon Sep 17 00:00:00 2001 From: ThePagi Date: Tue, 10 Sep 2024 14:51:22 +0000 Subject: [PATCH 012/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Shaders/SnowCover/SnowCover.hlsli | 70 +++++++++---------- package/Shaders/Lighting.hlsl | 14 ++-- package/Shaders/RunGrass.hlsl | 21 +++--- 3 files changed, 47 insertions(+), 58 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 3bf8f6a24f..488be3bbbb 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -6,7 +6,6 @@ Texture2D SnowNormal : register(t74); Texture2D SnowRMAOS : register(t75); Texture2D SnowParallax : register(t76); - // https://blog.selfshadow.com/publications/blending-in-detail/ // for when s = (0,0,1) float3 MyReorientNormal(float3 n1, float3 n2) @@ -17,7 +16,6 @@ float3 MyReorientNormal(float3 n1, float3 n2) return n1 * dot(n1, n2) / n1.z - n2; } - // http://chilliant.blogspot.com/2010/11/rgbhsv-in-hlsl.html float3 Hue(float H) { @@ -66,23 +64,20 @@ float GetEnvironmentalMultiplier(float3 p) float maxMonth = max(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); float minMonth = min(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); float summerToWinter; - if(snowCoverSettings.Month > maxMonth){ - summerToWinter = (snowCoverSettings.Month-maxMonth)/(minMonth + 12 - maxMonth); - if(snowCoverSettings.MaxWinterMonth > snowCoverSettings.MaxSummerMonth) + if (snowCoverSettings.Month > maxMonth) { + summerToWinter = (snowCoverSettings.Month - maxMonth) / (minMonth + 12 - maxMonth); + if (snowCoverSettings.MaxWinterMonth > snowCoverSettings.MaxSummerMonth) summerToWinter = 1 - summerToWinter; - } - else if(snowCoverSettings.Month < minMonth){ - summerToWinter = (12 - maxMonth + snowCoverSettings.Month)/(minMonth + 12 - maxMonth); - if(snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) + } else if (snowCoverSettings.Month < minMonth) { + summerToWinter = (12 - maxMonth + snowCoverSettings.Month) / (minMonth + 12 - maxMonth); + if (snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) summerToWinter = 1 - summerToWinter; - } - else{ - summerToWinter = (snowCoverSettings.Month - minMonth)/(maxMonth-minMonth); - if(snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) + } else { + summerToWinter = (snowCoverSettings.Month - minMonth) / (maxMonth - minMonth); + if (snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) summerToWinter = 1 - summerToWinter; } - return (GetHeightMult(p) - lerp(snowCoverSettings.SummerHeightOffset, snowCoverSettings.WinterHeightOffset, summerToWinter)) / 1000; } @@ -102,29 +97,28 @@ void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, float3 p, fl } float2 uv = snowCoverSettings.UVScale * p.xy / 100; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; -#if !defined(TRUE_PBR) - diffuse = pow(LinearToGamma(diffuse)/3.141, 1/1.5); -#endif +# if !defined(TRUE_PBR) + diffuse = pow(LinearToGamma(diffuse) / 3.141, 1 / 1.5); +# endif color = lerp(color, diffuse, mult); - } -#if !defined(BASIC_SNOW_COVER) +# if !defined(BASIC_SNOW_COVER) float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, inout float2 uv, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { - if(snowCoverSettings.Sky < 3) // 3 = exterior + if (snowCoverSettings.Sky < 3) // 3 = exterior return 0; - //float viewDist = max(1, sqrt(viewPos.z) / 512); -#if defined(TRUE_PBR) && defined(LANDSCAPE) + //float viewDist = max(1, sqrt(viewPos.z) / 512); +# if defined(TRUE_PBR) && defined(LANDSCAPE) float disp = sh0; -#else +# else float disp = sh0 - 0.5; -#endif +# endif float parallax = 0.1 * snowCoverSettings.ParallaxScale * (SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale * p.xy / 100).x - 0.5); - float env_mult = GetEnvironmentalMultiplier(p) + parallax + disp*underDispScale*0.1; + float env_mult = GetEnvironmentalMultiplier(p) + parallax + disp * underDispScale * 0.1; waterDist = smoothstep(-32, 8, -waterDist); - float mult = smoothstep(0, 1, pow(max(0, worldNormal.z), 2)-waterDist) * skylight * smoothstep(0, 1, env_mult-waterDist); //-smoothstep(-32, 8, -waterDist) + float mult = smoothstep(0, 1, pow(max(0, worldNormal.z), 2) - waterDist) * skylight * smoothstep(0, 1, env_mult - waterDist); //-smoothstep(-32, 8, -waterDist) uv = snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; -#if defined(TREE_ANIM) +# if defined(TREE_ANIM) if (snowCoverSettings.AffectFoliageColor) { float gmult = saturate(env_mult - snowCoverSettings.FoliageHeightOffset / 1000); float3 hsv = RGBtoHSV(color); @@ -135,19 +129,19 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh //hsv.z = pow(hsv.z, 1+gmult*0.5); color = HSVtoRGB(hsv); } -#endif - if(mult < 0.01) +# endif + if (mult < 0.01) return 0; sh0 = saturate(sh0 + mult * parallax); return mult; } -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { float2 uv; float mult = ApplySnowBase(color, worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); - if(mult <= 0.0) + if (mult <= 0.0) return; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; color = lerp(color, diffuse, mult); @@ -158,26 +152,26 @@ void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::Surfa prop.Roughness = lerp(prop.Roughness, rmaos.x, mult); prop.Metallic = lerp(prop.Metallic, rmaos.y, mult); prop.AO = lerp(prop.AO, rmaos.z, mult); - prop.F0 = lerp(prop.F0, rmaos.w*0.08, mult); + prop.F0 = lerp(prop.F0, rmaos.w * 0.08, mult); prop.GlintScreenSpaceScale = lerp(prop.GlintScreenSpaceScale, snowCoverSettings.Glint.x, mult); prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, snowCoverSettings.Glint.y, mult); prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, snowCoverSettings.Glint.z, mult); prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, snowCoverSettings.Glint.w, mult); } -# else +# else void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { float2 uv; //color = sRGB2Lin(color); float mult = ApplySnowBase(color, worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); - if(mult <= 0.0) + if (mult <= 0.0) return; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; - diffuse = pow(LinearToGamma(diffuse)/PI, 1/1.5); + diffuse = pow(LinearToGamma(diffuse) / PI, 1 / 1.5); float4 rmaos = SnowRMAOS.Sample(SampColorSampler, uv); - glossiness = lerp(glossiness, 1-rmaos.x, mult); // yes these are named wrong not my fault bye - shininess = lerp(shininess, 25*500*rmaos.w, mult); + glossiness = lerp(glossiness, 1 - rmaos.x, mult); // yes these are named wrong not my fault bye + shininess = lerp(shininess, 25 * 500 * rmaos.w, mult); diffuse *= rmaos.z; color = lerp(color, diffuse, mult); float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); @@ -185,6 +179,6 @@ void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossin //glossiness = lerp(glossiness, 0.5 * pow(v * s, 3.0), mult); //shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); } +# endif # endif -#endif #endif \ No newline at end of file diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 227d45f31d..f7a7b67301 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1780,8 +1780,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif // defined (HAIR) baseColor.rgb *= vertexColor; - - # if defined(SKYLIGHTING) float snowOcclusion = inWorld ? smoothstep(0, 1, (shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? worldSpaceNormal : float3(0, 0, 1)))) : 0; # else @@ -1803,8 +1801,8 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if defined(TRUE_PBR) # if defined(LANDSCAPE) underDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, - max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, - max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); + max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, + max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); # else underDispScale = displacementParams.HeightScale; # endif @@ -1812,12 +1810,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace //float3 pos = float3(diffuseUv.x, diffuseUv.y, 0); if (snowCoverSettings.EnableSnowCover) -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); -# else +# else ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); glossiness = glossiness.xxxx; -# endif +# endif # if !defined(DRAW_IN_WORLDSPACE) // && (defined(SKINNED) || !defined(MODELSPACENORMALS)) [flatten] if (!input.WorldSpace) @@ -1828,8 +1826,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace modelNormal.xyz = normalize(modelNormal.xyz); # endif - - float waterRoughnessSpecular = 1; # if defined(WETNESS_EFFECTS) diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index 5dd4e26a84..24c383ae14 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -398,13 +398,13 @@ cbuffer PerMaterial : register(b1) # include "Common/PBR.hlsli" # endif -# if defined(SNOW_COVER) -# undef SNOW -# undef PROJECTED_UV -# undef SPARKLE -# define BASIC_SNOW_COVER -# include "SnowCover/SnowCover.hlsli" -# endif +# if defined(SNOW_COVER) +# undef SNOW +# undef PROJECTED_UV +# undef SPARKLE +# define BASIC_SNOW_COVER +# include "SnowCover/SnowCover.hlsli" +# endif PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) @@ -483,11 +483,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif // !TRUE_PBR # if defined(SKYLIGHTING) -# if defined(VR) +# if defined(VR) float3 positionMSSkylight = input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz - CameraPosAdjust[0].xyz; -# else +# else float3 positionMSSkylight = input.WorldPosition.xyz; -# endif +# endif sh2 skylightingSH = Skylighting::sample(skylightingSettings, SkylightingProbeArray, positionMSSkylight, normal); @@ -655,7 +655,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if !defined(SSGI) float3 directionalAmbientColor = mul(DirectionalAmbientShared, float4(normal, 1.0)); - # if defined(SKYLIGHTING) float skylighting = shFuncProductIntegral(skylightingSH, shEvaluateCosineLobe(skylightingSettings.DirectionalDiffuse ? normal : float3(0, 0, 1))) / shPI; skylighting = Skylighting::mixDiffuse(skylightingSettings, skylighting); From 55dac40a56681bebc63c1c580ecfd1c23cfe0474 Mon Sep 17 00:00:00 2001 From: Exist Date: Sat, 14 Sep 2024 12:57:27 +0200 Subject: [PATCH 013/131] fix FeatureBuffer includes --- src/FeatureBuffer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/FeatureBuffer.cpp b/src/FeatureBuffer.cpp index 6e138ca81c..d6430f2e19 100644 --- a/src/FeatureBuffer.cpp +++ b/src/FeatureBuffer.cpp @@ -6,7 +6,6 @@ #include "Features/LightLimitFix.h" #include "Features/Skylighting.h" #include "Features/SnowCover.h" -#include "Features/TerrainOcclusion.h" #include "Features/TerrainShadows.h" #include "Features/WetnessEffects.h" From ec706b052535d37e745643375888bac2504e3318 Mon Sep 17 00:00:00 2001 From: Exist Date: Sat, 14 Sep 2024 15:40:19 +0200 Subject: [PATCH 014/131] fix removed directionaldiffuse --- package/Shaders/Lighting.hlsl | 2 +- package/Shaders/RunGrass.hlsl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 2f29fd1b12..57ad9c8f57 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1781,7 +1781,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace baseColor.rgb *= vertexColor; # if defined(SKYLIGHTING) - float snowOcclusion = inWorld ? smoothstep(0, 1, (shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? worldSpaceNormal : float3(0, 0, 1)))) : 0; + float snowOcclusion = inWorld ? smoothstep(0, 1, (shUnproject(skylightingSH, float3(0, 0, 1)))) : 0; # else float snowOcclusion = inWorld ? 1 : 0; # endif diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index 715355c577..d44ff6f5cb 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -491,7 +491,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace sh2 skylightingSH = Skylighting::sample(skylightingSettings, SkylightingProbeArray, positionMSSkylight, normal); - float snowOcclusion = smoothstep(0, 1, (shUnproject(skylightingSH, skylightingSettings.DirectionalDiffuse ? normal : float3(0, 0, 1)))); + float snowOcclusion = smoothstep(0, 1, (shUnproject(skylightingSH, float3(0, 0, 1)))); # else float snowOcclusion = 1; # endif From 4097928f5c518614e1458406d0f3c6b517c6be59 Mon Sep 17 00:00:00 2001 From: Exist Date: Sat, 14 Sep 2024 18:23:27 +0200 Subject: [PATCH 015/131] reorder buffers, didnt help --- package/Shaders/Common/SharedData.hlsli | 2 +- src/FeatureBuffer.cpp | 4 ++-- src/Features/SnowCover.h | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package/Shaders/Common/SharedData.hlsli b/package/Shaders/Common/SharedData.hlsli index 3957ff4fd9..4ae4b68658 100644 --- a/package/Shaders/Common/SharedData.hlsli +++ b/package/Shaders/Common/SharedData.hlsli @@ -163,8 +163,8 @@ cbuffer FeatureData : register(b6) WetnessEffectsSettings wetnessEffectsSettings; LightLimitFixSettings lightLimitFixSettings; SkylightingSettings skylightingSettings; - SnowCoverSettings snowCoverSettings; PBRSettings pbrSettings; + SnowCoverSettings snowCoverSettings; }; Texture2D TexDepthSampler : register(t20); diff --git a/src/FeatureBuffer.cpp b/src/FeatureBuffer.cpp index d6430f2e19..e9ce733b92 100644 --- a/src/FeatureBuffer.cpp +++ b/src/FeatureBuffer.cpp @@ -37,6 +37,6 @@ std::pair GetFeatureBufferData() WetnessEffects::GetSingleton()->GetCommonBufferData(), LightLimitFix::GetSingleton()->GetCommonBufferData(), Skylighting::GetSingleton()->cbData, - SnowCover::GetSingleton()->GetCommonBufferData(), - TruePBR::GetSingleton()->settings); + TruePBR::GetSingleton()->settings, + SnowCover::GetSingleton()->GetCommonBufferData()); } \ No newline at end of file diff --git a/src/Features/SnowCover.h b/src/Features/SnowCover.h index ea3d69aac5..d601470c6e 100644 --- a/src/Features/SnowCover.h +++ b/src/Features/SnowCover.h @@ -24,16 +24,16 @@ struct SnowCover : Feature { uint EnableSnowCover = true; uint AffectFoliageColor = true; - float SnowHeightOffset = 0; - float FoliageHeightOffset = -512; + float SnowHeightOffset = 0.0f; + float FoliageHeightOffset = -512.0f; uint MaxSummerMonth = 6; uint MaxWinterMonth = 0; - float SummerHeightOffset = 0; - float WinterHeightOffset = -10000; + float SummerHeightOffset = 0.0f; + float WinterHeightOffset = -10000.0f; float UVScale = 1; - float ParallaxScale = 0.1; + float ParallaxScale = 0.1f; uint pad[2]; //glint float screenSpaceScale = 1.2f; From e7bbd5dfea881559322ea34e0ae5a8026fb59435 Mon Sep 17 00:00:00 2001 From: Exist Date: Sun, 15 Sep 2024 14:30:58 +0200 Subject: [PATCH 016/131] pad wetness, move snow buffer to the beginning --- package/Shaders/Common/SharedData.hlsli | 3 ++- src/FeatureBuffer.cpp | 4 ++-- src/Features/WetnessEffects.h | 6 +++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/package/Shaders/Common/SharedData.hlsli b/package/Shaders/Common/SharedData.hlsli index 4ae4b68658..bfc23558b8 100644 --- a/package/Shaders/Common/SharedData.hlsli +++ b/package/Shaders/Common/SharedData.hlsli @@ -96,6 +96,7 @@ struct WetnessEffectsSettings float ChaoticRippleStrength; float ChaoticRippleScaleRcp; float ChaoticRippleSpeed; + uint2 pad; }; struct LightLimitFixSettings @@ -156,6 +157,7 @@ struct PBRSettings cbuffer FeatureData : register(b6) { + SnowCoverSettings snowCoverSettings; GrassLightingSettings grassLightingSettings; CPMSettings extendedMaterialSettings; CubemapCreatorSettings cubemapCreatorSettings; @@ -164,7 +166,6 @@ cbuffer FeatureData : register(b6) LightLimitFixSettings lightLimitFixSettings; SkylightingSettings skylightingSettings; PBRSettings pbrSettings; - SnowCoverSettings snowCoverSettings; }; Texture2D TexDepthSampler : register(t20); diff --git a/src/FeatureBuffer.cpp b/src/FeatureBuffer.cpp index e9ce733b92..e6bc04d30c 100644 --- a/src/FeatureBuffer.cpp +++ b/src/FeatureBuffer.cpp @@ -30,6 +30,7 @@ std::pair _GetFeatureBufferData(Ts... feat_datas) std::pair GetFeatureBufferData() { return _GetFeatureBufferData( + SnowCover::GetSingleton()->GetCommonBufferData(), GrassLighting::GetSingleton()->settings, ExtendedMaterials::GetSingleton()->settings, DynamicCubemaps::GetSingleton()->settings, @@ -37,6 +38,5 @@ std::pair GetFeatureBufferData() WetnessEffects::GetSingleton()->GetCommonBufferData(), LightLimitFix::GetSingleton()->GetCommonBufferData(), Skylighting::GetSingleton()->cbData, - TruePBR::GetSingleton()->settings, - SnowCover::GetSingleton()->GetCommonBufferData()); + TruePBR::GetSingleton()->settings); } \ No newline at end of file diff --git a/src/Features/WetnessEffects.h b/src/Features/WetnessEffects.h index 51eccc0a89..83005c7863 100644 --- a/src/Features/WetnessEffects.h +++ b/src/Features/WetnessEffects.h @@ -53,8 +53,11 @@ struct WetnessEffects : Feature float ChaoticRippleStrength = .1f; float ChaoticRippleScale = 1.f; float ChaoticRippleSpeed = 20.f; + uint pad0[2]; }; + static_assert(sizeof(Settings) % 16 == 0); + struct alignas(16) PerFrame { float Time; @@ -62,9 +65,10 @@ struct WetnessEffects : Feature float Wetness; float PuddleWetness; Settings settings; - uint pad0[2]; }; + static_assert(sizeof(PerFrame) % 16 == 0); + Settings settings; PerFrame GetCommonBufferData(); From 99db31621c8bf9c8f895e7853f8fe6991b01ace6 Mon Sep 17 00:00:00 2001 From: Exist Date: Sun, 15 Sep 2024 23:22:30 +0200 Subject: [PATCH 017/131] buffer order, lod land noise, lod land blend, lights remove snow --- .../Shaders/SnowCover/FastNoiseLite.hlsl | 2920 ----------------- .../Shaders/SnowCover/SnowCover.hlsli | 10 +- package/Shaders/Lighting.hlsl | 78 +- src/Features/SnowCover.cpp | 65 +- src/Features/SnowCover.h | 5 +- 5 files changed, 102 insertions(+), 2976 deletions(-) delete mode 100644 features/Snow Cover/Shaders/SnowCover/FastNoiseLite.hlsl diff --git a/features/Snow Cover/Shaders/SnowCover/FastNoiseLite.hlsl b/features/Snow Cover/Shaders/SnowCover/FastNoiseLite.hlsl deleted file mode 100644 index adc49c8bc5..0000000000 --- a/features/Snow Cover/Shaders/SnowCover/FastNoiseLite.hlsl +++ /dev/null @@ -1,2920 +0,0 @@ - -// MIT License -// -// Copyright(c) 2023 Jordan Peck (jordan.me2@gmail.com) -// Copyright(c) 2023 Contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files(the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions : -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// .'',;:cldxkO00KKXXNNWWWNNXKOkxdollcc::::::;:::ccllloooolllllllllooollc:,'... ...........',;cldxkO000Okxdlc::;;;,,;;;::cclllllll -// ..',;:ldxO0KXXNNNNNNNNXXK0kxdolcc::::::;;;,,,,,,;;;;;;;;;;:::cclllllc:;'.... ...........',;:ldxO0KXXXK0Okxdolc::;;;;::cllodddddo -// ...',:loxO0KXNNNNNXXKK0Okxdolc::;::::::::;;;,,'''''.....''',;:clllllc:;,'............''''''''',;:loxO0KXNNNNNXK0Okxdollccccllodxxxxxxd -// ....';:ldkO0KXXXKK00Okxdolcc:;;;;;::cclllcc:;;,''..... ....',;clooddolcc:;;;;,,;;;;;::::;;;;;;:cloxk0KXNWWWWWWNXKK0Okxddoooddxxkkkkkxx -// .....';:ldxkOOOOOkxxdolcc:;;;,,,;;:cllooooolcc:;'... ..,:codxkkkxddooollloooooooollcc:::::clodkO0KXNWWWWWWNNXK00Okxxxxxxxxkkkkxxx -// . ....';:cloddddo___________,,,,;;:clooddddoolc:,... ..,:ldx__00OOOkkk___kkkkkkxxdollc::::cclodkO0KXXNNNNNNXXK0OOkxxxxxxxxxxxxddd -// .......',;:cccc:| |,,,;;:cclooddddoll:;'.. ..';cox| \KKK000| |KK00OOkxdocc___;::clldxxkO0KKKKK00Okkxdddddddddddddddoo -// .......'',,,,,''| ________|',,;;::cclloooooolc:;'......___:ldk| \KK000| |XKKK0Okxolc| |;;::cclodxxkkkkxxdoolllcclllooodddooooo -// ''......''''....| | ....'',,,,;;;::cclloooollc:;,''.'| |oxk| \OOO0| |KKK00Oxdoll|___|;;;;;::ccllllllcc::;;,,;;;:cclloooooooo -// ;;,''.......... | |_____',,;;;____:___cllo________.___| |___| \xkk| |KK_______ool___:::;________;;;_______...'',;;:ccclllloo -// c:;,''......... | |:::/ ' |lo/ | | \dx| |0/ \d| |cc/ |'/ \......',,;;:ccllo -// ol:;,'..........| _____|ll/ __ |o/ ______|____ ___| | \o| |/ ___ \| |o/ ______|/ ___ \ .......'',;:clo -// dlc;,...........| |::clooo| / | |x\___ \KXKKK0| |dol| |\ \| | | | | |d\___ \..| | / / ....',:cl -// xoc;'... .....'| |llodddd| \__| |_____\ \KKK0O| |lc:| |'\ | |___| | |_____\ \.| |_/___/... ...',;:c -// dlc;'... ....',;| |oddddddo\ | |Okkx| |::;| |..\ |\ /| | | \ |... ....',;:c -// ol:,'.......',:c|___|xxxddollc\_____,___|_________/ddoll|___|,,,|___|...\_____|:\ ______/l|___|_________/...\________|'........',;::cc -// c:;'.......';:codxxkkkkxxolc::;::clodxkOO0OOkkxdollc::;;,,''''',,,,''''''''''',,'''''',;:loxkkOOkxol:;,'''',,;:ccllcc:;,'''''',;::ccll -// ;,'.......',:codxkOO0OOkxdlc:;,,;;:cldxxkkxxdolc:;;,,''.....'',;;:::;;,,,'''''........,;cldkO0KK0Okdoc::;;::cloodddoolc:;;;;;::ccllooo -// .........',;:lodxOO0000Okdoc:,,',,;:clloddoolc:;,''.......'',;:clooollc:;;,,''.......',:ldkOKXNNXX0Oxdolllloddxxxxxxdolccccccllooodddd -// . .....';:cldxkO0000Okxol:;,''',,;::cccc:;,,'.......'',;:cldxxkkxxdolc:;;,'.......';coxOKXNWWWNXKOkxddddxxkkkkkkxdoollllooddxxxxkkk -// ....',;:codxkO000OOxdoc:;,''',,,;;;;,''.......',,;:clodkO00000Okxolc::;,,''..',;:ldxOKXNWWWNNK0OkkkkkkkkkkkxxddooooodxxkOOOOO000 -// ....',;;clodxkkOOOkkdolc:;,,,,,,,,'..........,;:clodxkO0KKXKK0Okxdolcc::;;,,,;;:codkO0XXNNNNXKK0OOOOOkkkkxxdoollloodxkO0KKKXXXXX -// -// VERSION: 1.1.1 -// https://github.com/Auburn/FastNoiseLite - -// Switch between using floats or doubles for input position -typedef float FNLfloat; -//typedef double FNLfloat; - -// Noise Type -#define FNL_NOISE_OPENSIMPLEX2 0 -#define FNL_NOISE_OPENSIMPLEX2S 1 -#define FNL_NOISE_CELLULAR 2 -#define FNL_NOISE_PERLIN 3 -#define FNL_NOISE_VALUE_CUBIC 4 -#define FNL_NOISE_VALUE 5 -typedef int fnl_noise_type; - -// Rotation types -#define FNL_ROTATION_NONE 0 -#define FNL_ROTATION_IMPROVE_XY_PLANES 1 -#define FNL_ROTATION_IMPROVE_XZ_PLANES 2 -typedef int fnl_rotation_type_3d; - -// Fractal types -#define FNL_FRACTAL_NONE 0 -#define FNL_FRACTAL_FBM 1 -#define FNL_FRACTAL_RIDGED 2 -#define FNL_FRACTAL_PINGPONG 3 -#define FNL_FRACTAL_DOMAIN_WARP_PROGRESSIVE 4 -#define FNL_FRACTAL_DOMAIN_WARP_INDEPENDENT 5 -typedef int fnl_fractal_type; - -#define FNL_CELLULAR_DISTANCE_EUCLIDEAN 0 -#define FNL_CELLULAR_DISTANCE_EUCLIDEANSQ 1 -#define FNL_CELLULAR_DISTANCE_MANHATTAN 2 -#define FNL_CELLULAR_DISTANCE_HYBRID 3 -typedef int fnl_cellular_distance_func; - -#define FNL_CELLULAR_RETURN_TYPE_CELLVALUE 0 -#define FNL_CELLULAR_RETURN_TYPE_DISTANCE 1 -#define FNL_CELLULAR_RETURN_TYPE_DISTANCE2 2 -#define FNL_CELLULAR_RETURN_TYPE_DISTANCE2ADD 3 -#define FNL_CELLULAR_RETURN_TYPE_DISTANCE2SUB 4 -#define FNL_CELLULAR_RETURN_TYPE_DISTANCE2MUL 5 -#define FNL_CELLULAR_RETURN_TYPE_DISTANCE2DIV 6 -typedef int fnl_cellular_return_type; - -#define FNL_DOMAIN_WARP_OPENSIMPLEX2 0 -#define FNL_DOMAIN_WARP_OPENSIMPLEX2_REDUCED 1 -#define FNL_DOMAIN_WARP_BASICGRID 2 -typedef int fnl_domain_warp_type; - -// Removes [0x80004005 - unknown error] 'internal error: no storage type for block output' -#if UNITY_VERSION -# define FNL_FLATTEN [flatten] -# define FNL_UNROLL [unroll(1)] -#else -# define FNL_FLATTEN -# define FNL_UNROLL -#endif - -/** - * Structure containing entire noise system state. - * @note Must only be created using fnlCreateState(optional: seed). To ensure defaults are set. - */ -struct fnl_state -{ - /** - * Seed used for all noise types. - * @remark Default: 1337 - */ - int seed; - - /** - * The frequency for all noise types. - * @remark Default: 0.01 - */ - float frequency; - - /** - * The noise algorithm to be used by GetNoise(...). - * @remark Default: FNL_NOISE_OPENSIMPLEX2 - */ - fnl_noise_type noise_type; - - /** - * Sets noise rotation type for 3D. - * @remark Default: FNL_ROTATION_NONE - */ - fnl_rotation_type_3d rotation_type_3d; - - /** - * The method used for combining octaves for all fractal noise types. - * @remark Default: None - * @remark FNL_FRACTAL_DOMAIN_WARP_... only effects fnlDomainWarp... - */ - fnl_fractal_type fractal_type; - - /** - * The octave count for all fractal noise types. - * @remark Default: 3 - */ - int octaves; - - /** - * The octave lacunarity for all fractal noise types. - * @remark Default: 2.0 - */ - float lacunarity; - - /** - * The octave gain for all fractal noise types. - * @remark Default: 0.5 - */ - float gain; - - /** - * The octave weighting for all none Domaain Warp fractal types. - * @remark Default: 0.0 - * @remark - */ - float weighted_strength; - - /** - * The strength of the fractal ping pong effect. - * @remark Default: 2.0 - */ - float ping_pong_strength; - - /** - * The distance function used in cellular noise calculations. - * @remark Default: FNL_CELLULAR_DISTANCE_EUCLIDEANSQ - */ - fnl_cellular_distance_func cellular_distance_func; - - /** - * The cellular return type from cellular noise calculations. - * @remark Default: FNL_CELLULAR_RETURN_TYPE_DISTANCE - */ - fnl_cellular_return_type cellular_return_type; - - /** - * The maximum distance a cellular point can move from it's grid position. - * @remark Default: 1.0 - * @note Setting this higher than 1 will cause artifacts. - */ - float cellular_jitter_mod; - - /** - * The warp algorithm when using fnlDomainWarp... - * @remark Default: OpenSimplex2 - */ - fnl_domain_warp_type domain_warp_type; - - /** - * The maximum warp distance from original position when using fnlDomainWarp... - * @remark Default: 1.0 - */ - float domain_warp_amp; -}; - -/** - * Creates a noise state with default values. - * @param seed Optionally set the state seed. - */ -fnl_state fnlCreateState(int seed = 1337); - -/** - * 2D noise at given position using the state settings - * @returns Noise output bounded between -1 and 1. - */ -float fnlGetNoise2D(fnl_state state, FNLfloat x, FNLfloat y); - -/** - * 3D noise at given position using the state settings - * @returns Noise output bounded between -1 and 1. - */ -float fnlGetNoise3D(fnl_state state, FNLfloat x, FNLfloat y, FNLfloat z); - -/** - * 2D warps the input position using current domain warp settings. - * - * Example usage with fnlGetNoise2D: - * ``` - * fnlDomainWarp2D(state, x, y); - * noise = fnlGetNoise2D(state, x, y); - * ``` - */ -void fnlDomainWarp2D(fnl_state state, inout FNLfloat x, inout FNLfloat y); - -/** - * 3D warps the input position using current domain warp settings. - * - * Example usage with fnlGetNoise3D: - * ``` - * fnlDomainWarp3D(state, x, y, z); - * noise = fnlGetNoise3D(state, x, y, z); - * ``` - */ -void fnlDomainWarp3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z); - -// From here on, this is private implementation - -// Constants - -static const float GRADIENTS_2D[] = { - 0.130526192220052f, - 0.99144486137381f, - 0.38268343236509f, - 0.923879532511287f, - 0.608761429008721f, - 0.793353340291235f, - 0.793353340291235f, - 0.608761429008721f, - 0.923879532511287f, - 0.38268343236509f, - 0.99144486137381f, - 0.130526192220051f, - 0.99144486137381f, - -0.130526192220051f, - 0.923879532511287f, - -0.38268343236509f, - 0.793353340291235f, - -0.60876142900872f, - 0.608761429008721f, - -0.793353340291235f, - 0.38268343236509f, - -0.923879532511287f, - 0.130526192220052f, - -0.99144486137381f, - -0.130526192220052f, - -0.99144486137381f, - -0.38268343236509f, - -0.923879532511287f, - -0.608761429008721f, - -0.793353340291235f, - -0.793353340291235f, - -0.608761429008721f, - -0.923879532511287f, - -0.38268343236509f, - -0.99144486137381f, - -0.130526192220052f, - -0.99144486137381f, - 0.130526192220051f, - -0.923879532511287f, - 0.38268343236509f, - -0.793353340291235f, - 0.608761429008721f, - -0.608761429008721f, - 0.793353340291235f, - -0.38268343236509f, - 0.923879532511287f, - -0.130526192220052f, - 0.99144486137381f, - 0.130526192220052f, - 0.99144486137381f, - 0.38268343236509f, - 0.923879532511287f, - 0.608761429008721f, - 0.793353340291235f, - 0.793353340291235f, - 0.608761429008721f, - 0.923879532511287f, - 0.38268343236509f, - 0.99144486137381f, - 0.130526192220051f, - 0.99144486137381f, - -0.130526192220051f, - 0.923879532511287f, - -0.38268343236509f, - 0.793353340291235f, - -0.60876142900872f, - 0.608761429008721f, - -0.793353340291235f, - 0.38268343236509f, - -0.923879532511287f, - 0.130526192220052f, - -0.99144486137381f, - -0.130526192220052f, - -0.99144486137381f, - -0.38268343236509f, - -0.923879532511287f, - -0.608761429008721f, - -0.793353340291235f, - -0.793353340291235f, - -0.608761429008721f, - -0.923879532511287f, - -0.38268343236509f, - -0.99144486137381f, - -0.130526192220052f, - -0.99144486137381f, - 0.130526192220051f, - -0.923879532511287f, - 0.38268343236509f, - -0.793353340291235f, - 0.608761429008721f, - -0.608761429008721f, - 0.793353340291235f, - -0.38268343236509f, - 0.923879532511287f, - -0.130526192220052f, - 0.99144486137381f, - 0.130526192220052f, - 0.99144486137381f, - 0.38268343236509f, - 0.923879532511287f, - 0.608761429008721f, - 0.793353340291235f, - 0.793353340291235f, - 0.608761429008721f, - 0.923879532511287f, - 0.38268343236509f, - 0.99144486137381f, - 0.130526192220051f, - 0.99144486137381f, - -0.130526192220051f, - 0.923879532511287f, - -0.38268343236509f, - 0.793353340291235f, - -0.60876142900872f, - 0.608761429008721f, - -0.793353340291235f, - 0.38268343236509f, - -0.923879532511287f, - 0.130526192220052f, - -0.99144486137381f, - -0.130526192220052f, - -0.99144486137381f, - -0.38268343236509f, - -0.923879532511287f, - -0.608761429008721f, - -0.793353340291235f, - -0.793353340291235f, - -0.608761429008721f, - -0.923879532511287f, - -0.38268343236509f, - -0.99144486137381f, - -0.130526192220052f, - -0.99144486137381f, - 0.130526192220051f, - -0.923879532511287f, - 0.38268343236509f, - -0.793353340291235f, - 0.608761429008721f, - -0.608761429008721f, - 0.793353340291235f, - -0.38268343236509f, - 0.923879532511287f, - -0.130526192220052f, - 0.99144486137381f, - 0.130526192220052f, - 0.99144486137381f, - 0.38268343236509f, - 0.923879532511287f, - 0.608761429008721f, - 0.793353340291235f, - 0.793353340291235f, - 0.608761429008721f, - 0.923879532511287f, - 0.38268343236509f, - 0.99144486137381f, - 0.130526192220051f, - 0.99144486137381f, - -0.130526192220051f, - 0.923879532511287f, - -0.38268343236509f, - 0.793353340291235f, - -0.60876142900872f, - 0.608761429008721f, - -0.793353340291235f, - 0.38268343236509f, - -0.923879532511287f, - 0.130526192220052f, - -0.99144486137381f, - -0.130526192220052f, - -0.99144486137381f, - -0.38268343236509f, - -0.923879532511287f, - -0.608761429008721f, - -0.793353340291235f, - -0.793353340291235f, - -0.608761429008721f, - -0.923879532511287f, - -0.38268343236509f, - -0.99144486137381f, - -0.130526192220052f, - -0.99144486137381f, - 0.130526192220051f, - -0.923879532511287f, - 0.38268343236509f, - -0.793353340291235f, - 0.608761429008721f, - -0.608761429008721f, - 0.793353340291235f, - -0.38268343236509f, - 0.923879532511287f, - -0.130526192220052f, - 0.99144486137381f, - 0.130526192220052f, - 0.99144486137381f, - 0.38268343236509f, - 0.923879532511287f, - 0.608761429008721f, - 0.793353340291235f, - 0.793353340291235f, - 0.608761429008721f, - 0.923879532511287f, - 0.38268343236509f, - 0.99144486137381f, - 0.130526192220051f, - 0.99144486137381f, - -0.130526192220051f, - 0.923879532511287f, - -0.38268343236509f, - 0.793353340291235f, - -0.60876142900872f, - 0.608761429008721f, - -0.793353340291235f, - 0.38268343236509f, - -0.923879532511287f, - 0.130526192220052f, - -0.99144486137381f, - -0.130526192220052f, - -0.99144486137381f, - -0.38268343236509f, - -0.923879532511287f, - -0.608761429008721f, - -0.793353340291235f, - -0.793353340291235f, - -0.608761429008721f, - -0.923879532511287f, - -0.38268343236509f, - -0.99144486137381f, - -0.130526192220052f, - -0.99144486137381f, - 0.130526192220051f, - -0.923879532511287f, - 0.38268343236509f, - -0.793353340291235f, - 0.608761429008721f, - -0.608761429008721f, - 0.793353340291235f, - -0.38268343236509f, - 0.923879532511287f, - -0.130526192220052f, - 0.99144486137381f, - 0.38268343236509f, - 0.923879532511287f, - 0.923879532511287f, - 0.38268343236509f, - 0.923879532511287f, - -0.38268343236509f, - 0.38268343236509f, - -0.923879532511287f, - -0.38268343236509f, - -0.923879532511287f, - -0.923879532511287f, - -0.38268343236509f, - -0.923879532511287f, - 0.38268343236509f, - -0.38268343236509f, - 0.923879532511287f, -}; - -static const float RAND_VECS_2D[] = { - -0.2700222198f, - -0.9628540911f, - 0.3863092627f, - -0.9223693152f, - 0.04444859006f, - -0.999011673f, - -0.5992523158f, - -0.8005602176f, - -0.7819280288f, - 0.6233687174f, - 0.9464672271f, - 0.3227999196f, - -0.6514146797f, - -0.7587218957f, - 0.9378472289f, - 0.347048376f, - -0.8497875957f, - -0.5271252623f, - -0.879042592f, - 0.4767432447f, - -0.892300288f, - -0.4514423508f, - -0.379844434f, - -0.9250503802f, - -0.9951650832f, - 0.0982163789f, - 0.7724397808f, - -0.6350880136f, - 0.7573283322f, - -0.6530343002f, - -0.9928004525f, - -0.119780055f, - -0.0532665713f, - 0.9985803285f, - 0.9754253726f, - -0.2203300762f, - -0.7665018163f, - 0.6422421394f, - 0.991636706f, - 0.1290606184f, - -0.994696838f, - 0.1028503788f, - -0.5379205513f, - -0.84299554f, - 0.5022815471f, - -0.8647041387f, - 0.4559821461f, - -0.8899889226f, - -0.8659131224f, - -0.5001944266f, - 0.0879458407f, - -0.9961252577f, - -0.5051684983f, - 0.8630207346f, - 0.7753185226f, - -0.6315704146f, - -0.6921944612f, - 0.7217110418f, - -0.5191659449f, - -0.8546734591f, - 0.8978622882f, - -0.4402764035f, - -0.1706774107f, - 0.9853269617f, - -0.9353430106f, - -0.3537420705f, - -0.9992404798f, - 0.03896746794f, - -0.2882064021f, - -0.9575683108f, - -0.9663811329f, - 0.2571137995f, - -0.8759714238f, - -0.4823630009f, - -0.8303123018f, - -0.5572983775f, - 0.05110133755f, - -0.9986934731f, - -0.8558373281f, - -0.5172450752f, - 0.09887025282f, - 0.9951003332f, - 0.9189016087f, - 0.3944867976f, - -0.2439375892f, - -0.9697909324f, - -0.8121409387f, - -0.5834613061f, - -0.9910431363f, - 0.1335421355f, - 0.8492423985f, - -0.5280031709f, - -0.9717838994f, - -0.2358729591f, - 0.9949457207f, - 0.1004142068f, - 0.6241065508f, - -0.7813392434f, - 0.662910307f, - 0.7486988212f, - -0.7197418176f, - 0.6942418282f, - -0.8143370775f, - -0.5803922158f, - 0.104521054f, - -0.9945226741f, - -0.1065926113f, - -0.9943027784f, - 0.445799684f, - -0.8951327509f, - 0.105547406f, - 0.9944142724f, - -0.992790267f, - 0.1198644477f, - -0.8334366408f, - 0.552615025f, - 0.9115561563f, - -0.4111755999f, - 0.8285544909f, - -0.5599084351f, - 0.7217097654f, - -0.6921957921f, - 0.4940492677f, - -0.8694339084f, - -0.3652321272f, - -0.9309164803f, - -0.9696606758f, - 0.2444548501f, - 0.08925509731f, - -0.996008799f, - 0.5354071276f, - -0.8445941083f, - -0.1053576186f, - 0.9944343981f, - -0.9890284586f, - 0.1477251101f, - 0.004856104961f, - 0.9999882091f, - 0.9885598478f, - 0.1508291331f, - 0.9286129562f, - -0.3710498316f, - -0.5832393863f, - -0.8123003252f, - 0.3015207509f, - 0.9534596146f, - -0.9575110528f, - 0.2883965738f, - 0.9715802154f, - -0.2367105511f, - 0.229981792f, - 0.9731949318f, - 0.955763816f, - -0.2941352207f, - 0.740956116f, - 0.6715534485f, - -0.9971513787f, - -0.07542630764f, - 0.6905710663f, - -0.7232645452f, - -0.290713703f, - -0.9568100872f, - 0.5912777791f, - -0.8064679708f, - -0.9454592212f, - -0.325740481f, - 0.6664455681f, - 0.74555369f, - 0.6236134912f, - 0.7817328275f, - 0.9126993851f, - -0.4086316587f, - -0.8191762011f, - 0.5735419353f, - -0.8812745759f, - -0.4726046147f, - 0.9953313627f, - 0.09651672651f, - 0.9855650846f, - -0.1692969699f, - -0.8495980887f, - 0.5274306472f, - 0.6174853946f, - -0.7865823463f, - 0.8508156371f, - 0.52546432f, - 0.9985032451f, - -0.05469249926f, - 0.1971371563f, - -0.9803759185f, - 0.6607855748f, - -0.7505747292f, - -0.03097494063f, - 0.9995201614f, - -0.6731660801f, - 0.739491331f, - -0.7195018362f, - -0.6944905383f, - 0.9727511689f, - 0.2318515979f, - 0.9997059088f, - -0.0242506907f, - 0.4421787429f, - -0.8969269532f, - 0.9981350961f, - -0.061043673f, - -0.9173660799f, - -0.3980445648f, - -0.8150056635f, - -0.5794529907f, - -0.8789331304f, - 0.4769450202f, - 0.0158605829f, - 0.999874213f, - -0.8095464474f, - 0.5870558317f, - -0.9165898907f, - -0.3998286786f, - -0.8023542565f, - 0.5968480938f, - -0.5176737917f, - 0.8555780767f, - -0.8154407307f, - -0.5788405779f, - 0.4022010347f, - -0.9155513791f, - -0.9052556868f, - -0.4248672045f, - 0.7317445619f, - 0.6815789728f, - -0.5647632201f, - -0.8252529947f, - -0.8403276335f, - -0.5420788397f, - -0.9314281527f, - 0.363925262f, - 0.5238198472f, - 0.8518290719f, - 0.7432803869f, - -0.6689800195f, - -0.985371561f, - -0.1704197369f, - 0.4601468731f, - 0.88784281f, - 0.825855404f, - 0.5638819483f, - 0.6182366099f, - 0.7859920446f, - 0.8331502863f, - -0.553046653f, - 0.1500307506f, - 0.9886813308f, - -0.662330369f, - -0.7492119075f, - -0.668598664f, - 0.743623444f, - 0.7025606278f, - 0.7116238924f, - -0.5419389763f, - -0.8404178401f, - -0.3388616456f, - 0.9408362159f, - 0.8331530315f, - 0.5530425174f, - -0.2989720662f, - -0.9542618632f, - 0.2638522993f, - 0.9645630949f, - 0.124108739f, - -0.9922686234f, - -0.7282649308f, - -0.6852956957f, - 0.6962500149f, - 0.7177993569f, - -0.9183535368f, - 0.3957610156f, - -0.6326102274f, - -0.7744703352f, - -0.9331891859f, - -0.359385508f, - -0.1153779357f, - -0.9933216659f, - 0.9514974788f, - -0.3076565421f, - -0.08987977445f, - -0.9959526224f, - 0.6678496916f, - 0.7442961705f, - 0.7952400393f, - -0.6062947138f, - -0.6462007402f, - -0.7631674805f, - -0.2733598753f, - 0.9619118351f, - 0.9669590226f, - -0.254931851f, - -0.9792894595f, - 0.2024651934f, - -0.5369502995f, - -0.8436138784f, - -0.270036471f, - -0.9628500944f, - -0.6400277131f, - 0.7683518247f, - -0.7854537493f, - -0.6189203566f, - 0.06005905383f, - -0.9981948257f, - -0.02455770378f, - 0.9996984141f, - -0.65983623f, - 0.751409442f, - -0.6253894466f, - -0.7803127835f, - -0.6210408851f, - -0.7837781695f, - 0.8348888491f, - 0.5504185768f, - -0.1592275245f, - 0.9872419133f, - 0.8367622488f, - 0.5475663786f, - -0.8675753916f, - -0.4973056806f, - -0.2022662628f, - -0.9793305667f, - 0.9399189937f, - 0.3413975472f, - 0.9877404807f, - -0.1561049093f, - -0.9034455656f, - 0.4287028224f, - 0.1269804218f, - -0.9919052235f, - -0.3819600854f, - 0.924178821f, - 0.9754625894f, - 0.2201652486f, - -0.3204015856f, - -0.9472818081f, - -0.9874760884f, - 0.1577687387f, - 0.02535348474f, - -0.9996785487f, - 0.4835130794f, - -0.8753371362f, - -0.2850799925f, - -0.9585037287f, - -0.06805516006f, - -0.99768156f, - -0.7885244045f, - -0.6150034663f, - 0.3185392127f, - -0.9479096845f, - 0.8880043089f, - 0.4598351306f, - 0.6476921488f, - -0.7619021462f, - 0.9820241299f, - 0.1887554194f, - 0.9357275128f, - -0.3527237187f, - -0.8894895414f, - 0.4569555293f, - 0.7922791302f, - 0.6101588153f, - 0.7483818261f, - 0.6632681526f, - -0.7288929755f, - -0.6846276581f, - 0.8729032783f, - -0.4878932944f, - 0.8288345784f, - 0.5594937369f, - 0.08074567077f, - 0.9967347374f, - 0.9799148216f, - -0.1994165048f, - -0.580730673f, - -0.8140957471f, - -0.4700049791f, - -0.8826637636f, - 0.2409492979f, - 0.9705377045f, - 0.9437816757f, - -0.3305694308f, - -0.8927998638f, - -0.4504535528f, - -0.8069622304f, - 0.5906030467f, - 0.06258973166f, - 0.9980393407f, - -0.9312597469f, - 0.3643559849f, - 0.5777449785f, - 0.8162173362f, - -0.3360095855f, - -0.941858566f, - 0.697932075f, - -0.7161639607f, - -0.002008157227f, - -0.9999979837f, - -0.1827294312f, - -0.9831632392f, - -0.6523911722f, - 0.7578824173f, - -0.4302626911f, - -0.9027037258f, - -0.9985126289f, - -0.05452091251f, - -0.01028102172f, - -0.9999471489f, - -0.4946071129f, - 0.8691166802f, - -0.2999350194f, - 0.9539596344f, - 0.8165471961f, - 0.5772786819f, - 0.2697460475f, - 0.962931498f, - -0.7306287391f, - -0.6827749597f, - -0.7590952064f, - -0.6509796216f, - -0.907053853f, - 0.4210146171f, - -0.5104861064f, - -0.8598860013f, - 0.8613350597f, - 0.5080373165f, - 0.5007881595f, - -0.8655698812f, - -0.654158152f, - 0.7563577938f, - -0.8382755311f, - -0.545246856f, - 0.6940070834f, - 0.7199681717f, - 0.06950936031f, - 0.9975812994f, - 0.1702942185f, - -0.9853932612f, - 0.2695973274f, - 0.9629731466f, - 0.5519612192f, - -0.8338697815f, - 0.225657487f, - -0.9742067022f, - 0.4215262855f, - -0.9068161835f, - 0.4881873305f, - -0.8727388672f, - -0.3683854996f, - -0.9296731273f, - -0.9825390578f, - 0.1860564427f, - 0.81256471f, - 0.5828709909f, - 0.3196460933f, - -0.9475370046f, - 0.9570913859f, - 0.2897862643f, - -0.6876655497f, - -0.7260276109f, - -0.9988770922f, - -0.047376731f, - -0.1250179027f, - 0.992154486f, - -0.8280133617f, - 0.560708367f, - 0.9324863769f, - -0.3612051451f, - 0.6394653183f, - 0.7688199442f, - -0.01623847064f, - -0.9998681473f, - -0.9955014666f, - -0.09474613458f, - -0.81453315f, - 0.580117012f, - 0.4037327978f, - -0.9148769469f, - 0.9944263371f, - 0.1054336766f, - -0.1624711654f, - 0.9867132919f, - -0.9949487814f, - -0.100383875f, - -0.6995302564f, - 0.7146029809f, - 0.5263414922f, - -0.85027327f, - -0.5395221479f, - 0.841971408f, - 0.6579370318f, - 0.7530729462f, - 0.01426758847f, - -0.9998982128f, - -0.6734383991f, - 0.7392433447f, - 0.639412098f, - -0.7688642071f, - 0.9211571421f, - 0.3891908523f, - -0.146637214f, - -0.9891903394f, - -0.782318098f, - 0.6228791163f, - -0.5039610839f, - -0.8637263605f, - -0.7743120191f, - -0.6328039957f, -}; - -static const float GRADIENTS_3D[] = { - 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, - 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, - 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, - 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, - 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, - 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, - 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, - 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, - 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, - 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, - 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, - 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, - 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, - 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, - 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, - 1, 1, 0, 0, 0, -1, 1, 0, -1, 1, 0, 0, 0, -1, -1, 0 -}; - -static const float RAND_VECS_3D[] = { - -0.7292736885f, -0.6618439697f, 0.1735581948f, 0, 0.790292081f, -0.5480887466f, -0.2739291014f, 0, 0.7217578935f, 0.6226212466f, -0.3023380997f, 0, 0.565683137f, -0.8208298145f, -0.0790000257f, 0, 0.760049034f, -0.5555979497f, -0.3370999617f, 0, 0.3713945616f, 0.5011264475f, 0.7816254623f, 0, -0.1277062463f, -0.4254438999f, -0.8959289049f, 0, -0.2881560924f, -0.5815838982f, 0.7607405838f, 0, - 0.5849561111f, -0.662820239f, -0.4674352136f, 0, 0.3307171178f, 0.0391653737f, 0.94291689f, 0, 0.8712121778f, -0.4113374369f, -0.2679381538f, 0, 0.580981015f, 0.7021915846f, 0.4115677815f, 0, 0.503756873f, 0.6330056931f, -0.5878203852f, 0, 0.4493712205f, 0.601390195f, 0.6606022552f, 0, -0.6878403724f, 0.09018890807f, -0.7202371714f, 0, -0.5958956522f, -0.6469350577f, 0.475797649f, 0, - -0.5127052122f, 0.1946921978f, -0.8361987284f, 0, -0.9911507142f, -0.05410276466f, -0.1212153153f, 0, -0.2149721042f, 0.9720882117f, -0.09397607749f, 0, -0.7518650936f, -0.5428057603f, 0.3742469607f, 0, 0.5237068895f, 0.8516377189f, -0.02107817834f, 0, 0.6333504779f, 0.1926167129f, -0.7495104896f, 0, -0.06788241606f, 0.3998305789f, 0.9140719259f, 0, -0.5538628599f, -0.4729896695f, -0.6852128902f, 0, - -0.7261455366f, -0.5911990757f, 0.3509933228f, 0, -0.9229274737f, -0.1782808786f, 0.3412049336f, 0, -0.6968815002f, 0.6511274338f, 0.3006480328f, 0, 0.9608044783f, -0.2098363234f, -0.1811724921f, 0, 0.06817146062f, -0.9743405129f, 0.2145069156f, 0, -0.3577285196f, -0.6697087264f, -0.6507845481f, 0, -0.1868621131f, 0.7648617052f, -0.6164974636f, 0, -0.6541697588f, 0.3967914832f, 0.6439087246f, 0, - 0.6993340405f, -0.6164538506f, 0.3618239211f, 0, -0.1546665739f, 0.6291283928f, 0.7617583057f, 0, -0.6841612949f, -0.2580482182f, -0.6821542638f, 0, 0.5383980957f, 0.4258654885f, 0.7271630328f, 0, -0.5026987823f, -0.7939832935f, -0.3418836993f, 0, 0.3202971715f, 0.2834415347f, 0.9039195862f, 0, 0.8683227101f, -0.0003762656404f, -0.4959995258f, 0, 0.791120031f, -0.08511045745f, 0.6057105799f, 0, - -0.04011016052f, -0.4397248749f, 0.8972364289f, 0, 0.9145119872f, 0.3579346169f, -0.1885487608f, 0, -0.9612039066f, -0.2756484276f, 0.01024666929f, 0, 0.6510361721f, -0.2877799159f, -0.7023778346f, 0, -0.2041786351f, 0.7365237271f, 0.644859585f, 0, -0.7718263711f, 0.3790626912f, 0.5104855816f, 0, -0.3060082741f, -0.7692987727f, 0.5608371729f, 0, 0.454007341f, -0.5024843065f, 0.7357899537f, 0, - 0.4816795475f, 0.6021208291f, -0.6367380315f, 0, 0.6961980369f, -0.3222197429f, 0.641469197f, 0, -0.6532160499f, -0.6781148932f, 0.3368515753f, 0, 0.5089301236f, -0.6154662304f, -0.6018234363f, 0, -0.1635919754f, -0.9133604627f, -0.372840892f, 0, 0.52408019f, -0.8437664109f, 0.1157505864f, 0, 0.5902587356f, 0.4983817807f, -0.6349883666f, 0, 0.5863227872f, 0.494764745f, 0.6414307729f, 0, - 0.6779335087f, 0.2341345225f, 0.6968408593f, 0, 0.7177054546f, -0.6858979348f, 0.120178631f, 0, -0.5328819713f, -0.5205125012f, 0.6671608058f, 0, -0.8654874251f, -0.0700727088f, -0.4960053754f, 0, -0.2861810166f, 0.7952089234f, 0.5345495242f, 0, -0.04849529634f, 0.9810836427f, -0.1874115585f, 0, -0.6358521667f, 0.6058348682f, 0.4781800233f, 0, 0.6254794696f, -0.2861619734f, 0.7258696564f, 0, - -0.2585259868f, 0.5061949264f, -0.8227581726f, 0, 0.02136306781f, 0.5064016808f, -0.8620330371f, 0, 0.200111773f, 0.8599263484f, 0.4695550591f, 0, 0.4743561372f, 0.6014985084f, -0.6427953014f, 0, 0.6622993731f, -0.5202474575f, -0.5391679918f, 0, 0.08084972818f, -0.6532720452f, 0.7527940996f, 0, -0.6893687501f, 0.0592860349f, 0.7219805347f, 0, -0.1121887082f, -0.9673185067f, 0.2273952515f, 0, - 0.7344116094f, 0.5979668656f, -0.3210532909f, 0, 0.5789393465f, -0.2488849713f, 0.7764570201f, 0, 0.6988182827f, 0.3557169806f, -0.6205791146f, 0, -0.8636845529f, -0.2748771249f, -0.4224826141f, 0, -0.4247027957f, -0.4640880967f, 0.777335046f, 0, 0.5257722489f, -0.8427017621f, 0.1158329937f, 0, 0.9343830603f, 0.316302472f, -0.1639543925f, 0, -0.1016836419f, -0.8057303073f, -0.5834887393f, 0, - -0.6529238969f, 0.50602126f, -0.5635892736f, 0, -0.2465286165f, -0.9668205684f, -0.06694497494f, 0, -0.9776897119f, -0.2099250524f, -0.007368825344f, 0, 0.7736893337f, 0.5734244712f, 0.2694238123f, 0, -0.6095087895f, 0.4995678998f, 0.6155736747f, 0, 0.5794535482f, 0.7434546771f, 0.3339292269f, 0, -0.8226211154f, 0.08142581855f, 0.5627293636f, 0, -0.510385483f, 0.4703667658f, 0.7199039967f, 0, - -0.5764971849f, -0.07231656274f, -0.8138926898f, 0, 0.7250628871f, 0.3949971505f, -0.5641463116f, 0, -0.1525424005f, 0.4860840828f, -0.8604958341f, 0, -0.5550976208f, -0.4957820792f, 0.667882296f, 0, -0.1883614327f, 0.9145869398f, 0.357841725f, 0, 0.7625556724f, -0.5414408243f, -0.3540489801f, 0, -0.5870231946f, -0.3226498013f, -0.7424963803f, 0, 0.3051124198f, 0.2262544068f, -0.9250488391f, 0, - 0.6379576059f, 0.577242424f, -0.5097070502f, 0, -0.5966775796f, 0.1454852398f, -0.7891830656f, 0, -0.658330573f, 0.6555487542f, -0.3699414651f, 0, 0.7434892426f, 0.2351084581f, 0.6260573129f, 0, 0.5562114096f, 0.8264360377f, -0.0873632843f, 0, -0.3028940016f, -0.8251527185f, 0.4768419182f, 0, 0.1129343818f, -0.985888439f, -0.1235710781f, 0, 0.5937652891f, -0.5896813806f, 0.5474656618f, 0, - 0.6757964092f, -0.5835758614f, -0.4502648413f, 0, 0.7242302609f, -0.1152719764f, 0.6798550586f, 0, -0.9511914166f, 0.0753623979f, -0.2992580792f, 0, 0.2539470961f, -0.1886339355f, 0.9486454084f, 0, 0.571433621f, -0.1679450851f, -0.8032795685f, 0, -0.06778234979f, 0.3978269256f, 0.9149531629f, 0, 0.6074972649f, 0.733060024f, -0.3058922593f, 0, -0.5435478392f, 0.1675822484f, 0.8224791405f, 0, - -0.5876678086f, -0.3380045064f, -0.7351186982f, 0, -0.7967562402f, 0.04097822706f, -0.6029098428f, 0, -0.1996350917f, 0.8706294745f, 0.4496111079f, 0, -0.02787660336f, -0.9106232682f, -0.4122962022f, 0, -0.7797625996f, -0.6257634692f, 0.01975775581f, 0, -0.5211232846f, 0.7401644346f, -0.4249554471f, 0, 0.8575424857f, 0.4053272873f, -0.3167501783f, 0, 0.1045223322f, 0.8390195772f, -0.5339674439f, 0, - 0.3501822831f, 0.9242524096f, -0.1520850155f, 0, 0.1987849858f, 0.07647613266f, 0.9770547224f, 0, 0.7845996363f, 0.6066256811f, -0.1280964233f, 0, 0.09006737436f, -0.9750989929f, -0.2026569073f, 0, -0.8274343547f, -0.542299559f, 0.1458203587f, 0, -0.3485797732f, -0.415802277f, 0.840000362f, 0, -0.2471778936f, -0.7304819962f, -0.6366310879f, 0, -0.3700154943f, 0.8577948156f, 0.3567584454f, 0, - 0.5913394901f, -0.548311967f, -0.5913303597f, 0, 0.1204873514f, -0.7626472379f, -0.6354935001f, 0, 0.616959265f, 0.03079647928f, 0.7863922953f, 0, 0.1258156836f, -0.6640829889f, -0.7369967419f, 0, -0.6477565124f, -0.1740147258f, -0.7417077429f, 0, 0.6217889313f, -0.7804430448f, -0.06547655076f, 0, 0.6589943422f, -0.6096987708f, 0.4404473475f, 0, -0.2689837504f, -0.6732403169f, -0.6887635427f, 0, - -0.3849775103f, 0.5676542638f, 0.7277093879f, 0, 0.5754444408f, 0.8110471154f, -0.1051963504f, 0, 0.9141593684f, 0.3832947817f, 0.131900567f, 0, -0.107925319f, 0.9245493968f, 0.3654593525f, 0, 0.377977089f, 0.3043148782f, 0.8743716458f, 0, -0.2142885215f, -0.8259286236f, 0.5214617324f, 0, 0.5802544474f, 0.4148098596f, -0.7008834116f, 0, -0.1982660881f, 0.8567161266f, -0.4761596756f, 0, - -0.03381553704f, 0.3773180787f, -0.9254661404f, 0, -0.6867922841f, -0.6656597827f, 0.2919133642f, 0, 0.7731742607f, -0.2875793547f, -0.5652430251f, 0, -0.09655941928f, 0.9193708367f, -0.3813575004f, 0, 0.2715702457f, -0.9577909544f, -0.09426605581f, 0, 0.2451015704f, -0.6917998565f, -0.6792188003f, 0, 0.977700782f, -0.1753855374f, 0.1155036542f, 0, -0.5224739938f, 0.8521606816f, 0.02903615945f, 0, - -0.7734880599f, -0.5261292347f, 0.3534179531f, 0, -0.7134492443f, -0.269547243f, 0.6467878011f, 0, 0.1644037271f, 0.5105846203f, -0.8439637196f, 0, 0.6494635788f, 0.05585611296f, 0.7583384168f, 0, -0.4711970882f, 0.5017280509f, -0.7254255765f, 0, -0.6335764307f, -0.2381686273f, -0.7361091029f, 0, -0.9021533097f, -0.270947803f, -0.3357181763f, 0, -0.3793711033f, 0.872258117f, 0.3086152025f, 0, - -0.6855598966f, -0.3250143309f, 0.6514394162f, 0, 0.2900942212f, -0.7799057743f, -0.5546100667f, 0, -0.2098319339f, 0.85037073f, 0.4825351604f, 0, -0.4592603758f, 0.6598504336f, -0.5947077538f, 0, 0.8715945488f, 0.09616365406f, -0.4807031248f, 0, -0.6776666319f, 0.7118504878f, -0.1844907016f, 0, 0.7044377633f, 0.312427597f, 0.637304036f, 0, -0.7052318886f, -0.2401093292f, -0.6670798253f, 0, - 0.081921007f, -0.7207336136f, -0.6883545647f, 0, -0.6993680906f, -0.5875763221f, -0.4069869034f, 0, -0.1281454481f, 0.6419895885f, 0.7559286424f, 0, -0.6337388239f, -0.6785471501f, -0.3714146849f, 0, 0.5565051903f, -0.2168887573f, -0.8020356851f, 0, -0.5791554484f, 0.7244372011f, -0.3738578718f, 0, 0.1175779076f, -0.7096451073f, 0.6946792478f, 0, -0.6134619607f, 0.1323631078f, 0.7785527795f, 0, - 0.6984635305f, -0.02980516237f, -0.715024719f, 0, 0.8318082963f, -0.3930171956f, 0.3919597455f, 0, 0.1469576422f, 0.05541651717f, -0.9875892167f, 0, 0.708868575f, -0.2690503865f, 0.6520101478f, 0, 0.2726053183f, 0.67369766f, -0.68688995f, 0, -0.6591295371f, 0.3035458599f, -0.6880466294f, 0, 0.4815131379f, -0.7528270071f, 0.4487723203f, 0, 0.9430009463f, 0.1675647412f, -0.2875261255f, 0, - 0.434802957f, 0.7695304522f, -0.4677277752f, 0, 0.3931996188f, 0.594473625f, 0.7014236729f, 0, 0.7254336655f, -0.603925654f, 0.3301814672f, 0, 0.7590235227f, -0.6506083235f, 0.02433313207f, 0, -0.8552768592f, -0.3430042733f, 0.3883935666f, 0, -0.6139746835f, 0.6981725247f, 0.3682257648f, 0, -0.7465905486f, -0.5752009504f, 0.3342849376f, 0, 0.5730065677f, 0.810555537f, -0.1210916791f, 0, - -0.9225877367f, -0.3475211012f, -0.167514036f, 0, -0.7105816789f, -0.4719692027f, -0.5218416899f, 0, -0.08564609717f, 0.3583001386f, 0.929669703f, 0, -0.8279697606f, -0.2043157126f, 0.5222271202f, 0, 0.427944023f, 0.278165994f, 0.8599346446f, 0, 0.5399079671f, -0.7857120652f, -0.3019204161f, 0, 0.5678404253f, -0.5495413974f, -0.6128307303f, 0, -0.9896071041f, 0.1365639107f, -0.04503418428f, 0, - -0.6154342638f, -0.6440875597f, 0.4543037336f, 0, 0.1074204368f, -0.7946340692f, 0.5975094525f, 0, -0.3595449969f, -0.8885529948f, 0.28495784f, 0, -0.2180405296f, 0.1529888965f, 0.9638738118f, 0, -0.7277432317f, -0.6164050508f, -0.3007234646f, 0, 0.7249729114f, -0.00669719484f, 0.6887448187f, 0, -0.5553659455f, -0.5336586252f, 0.6377908264f, 0, 0.5137558015f, 0.7976208196f, -0.3160000073f, 0, - -0.3794024848f, 0.9245608561f, -0.03522751494f, 0, 0.8229248658f, 0.2745365933f, -0.4974176556f, 0, -0.5404114394f, 0.6091141441f, 0.5804613989f, 0, 0.8036581901f, -0.2703029469f, 0.5301601931f, 0, 0.6044318879f, 0.6832968393f, 0.4095943388f, 0, 0.06389988817f, 0.9658208605f, -0.2512108074f, 0, 0.1087113286f, 0.7402471173f, -0.6634877936f, 0, -0.713427712f, -0.6926784018f, 0.1059128479f, 0, - 0.6458897819f, -0.5724548511f, -0.5050958653f, 0, -0.6553931414f, 0.7381471625f, 0.159995615f, 0, 0.3910961323f, 0.9188871375f, -0.05186755998f, 0, -0.4879022471f, -0.5904376907f, 0.6429111375f, 0, 0.6014790094f, 0.7707441366f, -0.2101820095f, 0, -0.5677173047f, 0.7511360995f, 0.3368851762f, 0, 0.7858573506f, 0.226674665f, 0.5753666838f, 0, -0.4520345543f, -0.604222686f, -0.6561857263f, 0, - 0.002272116345f, 0.4132844051f, -0.9105991643f, 0, -0.5815751419f, -0.5162925989f, 0.6286591339f, 0, -0.03703704785f, 0.8273785755f, 0.5604221175f, 0, -0.5119692504f, 0.7953543429f, -0.3244980058f, 0, -0.2682417366f, -0.9572290247f, -0.1084387619f, 0, -0.2322482736f, -0.9679131102f, -0.09594243324f, 0, 0.3554328906f, -0.8881505545f, 0.2913006227f, 0, 0.7346520519f, -0.4371373164f, 0.5188422971f, 0, - 0.9985120116f, 0.04659011161f, -0.02833944577f, 0, -0.3727687496f, -0.9082481361f, 0.1900757285f, 0, 0.91737377f, -0.3483642108f, 0.1925298489f, 0, 0.2714911074f, 0.4147529736f, -0.8684886582f, 0, 0.5131763485f, -0.7116334161f, 0.4798207128f, 0, -0.8737353606f, 0.18886992f, -0.4482350644f, 0, 0.8460043821f, -0.3725217914f, 0.3814499973f, 0, 0.8978727456f, -0.1780209141f, -0.4026575304f, 0, - 0.2178065647f, -0.9698322841f, -0.1094789531f, 0, -0.1518031304f, -0.7788918132f, -0.6085091231f, 0, -0.2600384876f, -0.4755398075f, -0.8403819825f, 0, 0.572313509f, -0.7474340931f, -0.3373418503f, 0, -0.7174141009f, 0.1699017182f, -0.6756111411f, 0, -0.684180784f, 0.02145707593f, -0.7289967412f, 0, -0.2007447902f, 0.06555605789f, -0.9774476623f, 0, -0.1148803697f, -0.8044887315f, 0.5827524187f, 0, - -0.7870349638f, 0.03447489231f, 0.6159443543f, 0, -0.2015596421f, 0.6859872284f, 0.6991389226f, 0, -0.08581082512f, -0.10920836f, -0.9903080513f, 0, 0.5532693395f, 0.7325250401f, -0.396610771f, 0, -0.1842489331f, -0.9777375055f, -0.1004076743f, 0, 0.0775473789f, -0.9111505856f, 0.4047110257f, 0, 0.1399838409f, 0.7601631212f, -0.6344734459f, 0, 0.4484419361f, -0.845289248f, 0.2904925424f, 0 -}; - -// Utilities - -static inline float _fnlFastMin(float x, float y) { return x < y ? x : y; } - -static inline float _fnlFastMax(float x, float y) { return x > y ? x : y; } - -static inline float _fnlFastAbs(float f) { return f < 0 ? -f : f; } - -static inline float _fnlFastSqrt(float a) { return sqrt(a); } - -static inline int _fnlFastFloor(FNLfloat f) { return (f >= 0 ? (int)f : (int)f - 1); } - -static inline int _fnlFastRound(FNLfloat f) { return (f >= 0) ? (int)(f + 0.5f) : (int)(f - 0.5f); } - -static inline float _fnlLerp(float a, float b, float t) { return a + t * (b - a); } - -static inline float _fnlInterpHermite(float t) { return t * t * (3 - 2 * t); } - -static inline float _fnlInterpQuintic(float t) { return t * t * t * (t * (t * 6 - 15) + 10); } - -static inline float _fnlCubicLerp(float a, float b, float c, float d, float t) -{ - float p = (d - c) - (a - b); - return t * t * t * p + t * t * ((a - b) - p) + t * (c - a) + b; -} - -static inline float _fnlPingPong(float t) -{ - t -= (int)(t * 0.5f) * 2; - return t < 1 ? t : 2 - t; -} - -static float _fnlCalculateFractalBounding(fnl_state state) -{ - float gain = _fnlFastAbs(state.gain); - float amp = gain; - float ampFractal = 1.0f; - for (int i = 1; i < state.octaves; i++) { - ampFractal += amp; - amp *= gain; - } - return 1.0f / ampFractal; -} - -// Hashing - -static const int PRIME_X = 501125321; -static const int PRIME_Y = 1136930381; -static const int PRIME_Z = 1720413743; - -static inline int _fnlHash2D(int seed, int xPrimed, int yPrimed) -{ - int hash = seed ^ xPrimed ^ yPrimed; - - hash *= 0x27d4eb2d; - return hash; -} - -static inline int _fnlHash3D(int seed, int xPrimed, int yPrimed, int zPrimed) -{ - int hash = seed ^ xPrimed ^ yPrimed ^ zPrimed; - - hash *= 0x27d4eb2d; - return hash; -} - -static inline float _fnlValCoord2D(int seed, int xPrimed, int yPrimed) -{ - int hash = _fnlHash2D(seed, xPrimed, yPrimed); - hash *= hash; - hash ^= hash << 19; - return hash * (1 / 2147483648.0f); -} - -static inline float _fnlValCoord3D(int seed, int xPrimed, int yPrimed, int zPrimed) -{ - int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed); - hash *= hash; - hash ^= hash << 19; - return hash * (1 / 2147483648.0f); -} - -static inline float _fnlGradCoord2D(int seed, int xPrimed, int yPrimed, float xd, float yd) -{ - int hash = _fnlHash2D(seed, xPrimed, yPrimed); - hash ^= hash >> 15; - hash &= 127 << 1; - return xd * GRADIENTS_2D[hash] + yd * GRADIENTS_2D[hash | 1]; -} - -static inline float _fnlGradCoord3D(int seed, int xPrimed, int yPrimed, int zPrimed, float xd, float yd, float zd) -{ - int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed); - hash ^= hash >> 15; - hash &= 63 << 2; - return xd * GRADIENTS_3D[hash] + yd * GRADIENTS_3D[hash | 1] + zd * GRADIENTS_3D[hash | 2]; -} - -static inline void _fnlGradCoordOut2D(int seed, int xPrimed, int yPrimed, out float xo, out float yo) -{ - int hash = _fnlHash2D(seed, xPrimed, yPrimed) & (255 << 1); - - xo = RAND_VECS_2D[hash]; - yo = RAND_VECS_2D[hash | 1]; -} - -static inline void _fnlGradCoordOut3D(int seed, int xPrimed, int yPrimed, int zPrimed, out float xo, out float yo, out float zo) -{ - int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed) & (255 << 2); - - xo = RAND_VECS_3D[hash]; - yo = RAND_VECS_3D[hash | 1]; - zo = RAND_VECS_3D[hash | 2]; -} - -static inline void _fnlGradCoordDual2D(int seed, int xPrimed, int yPrimed, float xd, float yd, out float xo, out float yo) -{ - int hash = _fnlHash2D(seed, xPrimed, yPrimed); - int index1 = hash & (127 << 1); - int index2 = (hash >> 7) & (255 << 1); - - float xg = GRADIENTS_2D[index1]; - float yg = GRADIENTS_2D[index1 | 1]; - float value = xd * xg + yd * yg; - - float xgo = RAND_VECS_2D[index2]; - float ygo = RAND_VECS_2D[index2 | 1]; - - xo = value * xgo; - yo = value * ygo; -} - -static inline void _fnlGradCoordDual3D(int seed, int xPrimed, int yPrimed, int zPrimed, float xd, float yd, float zd, out float xo, out float yo, out float zo) -{ - int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed); - int index1 = hash & (63 << 2); - int index2 = (hash >> 6) & (255 << 2); - - float xg = GRADIENTS_3D[index1]; - float yg = GRADIENTS_3D[index1 | 1]; - float zg = GRADIENTS_3D[index1 | 2]; - float value = xd * xg + yd * yg + zd * zg; - - float xgo = RAND_VECS_3D[index2]; - float ygo = RAND_VECS_3D[index2 | 1]; - float zgo = RAND_VECS_3D[index2 | 2]; - - xo = value * xgo; - yo = value * ygo; - zo = value * zgo; -} - -// Generic Noise Gen - -static float _fnlSingleSimplex2D(int seed, FNLfloat x, FNLfloat y); -static float _fnlSingleOpenSimplex23D(int seed, FNLfloat x, FNLfloat y, FNLfloat z); -static float _fnlSingleOpenSimplex2S2D(int seed, FNLfloat x, FNLfloat y); -static float _fnlSingleOpenSimplex2S3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z); -static float _fnlSingleCellular2D(fnl_state state, int seed, FNLfloat x, FNLfloat y); -static float _fnlSingleCellular3D(fnl_state state, int seed, FNLfloat x, FNLfloat y, FNLfloat z); -static float _fnlSinglePerlin2D(int seed, FNLfloat x, FNLfloat y); -static float _fnlSinglePerlin3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z); -static float _fnlSingleValueCubic2D(int seed, FNLfloat x, FNLfloat y); -static float _fnlSingleValueCubic3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z); -static float _fnlSingleValue2D(int seed, FNLfloat x, FNLfloat y); -static float _fnlSingleValue3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z); - -static float _fnlGenNoiseSingle2D(fnl_state state, int seed, FNLfloat x, FNLfloat y) -{ - FNL_FLATTEN switch (state.noise_type) - { - case FNL_NOISE_OPENSIMPLEX2: - return _fnlSingleSimplex2D(seed, x, y); - case FNL_NOISE_OPENSIMPLEX2S: - return _fnlSingleOpenSimplex2S2D(seed, x, y); - case FNL_NOISE_CELLULAR: - return _fnlSingleCellular2D(state, seed, x, y); - case FNL_NOISE_PERLIN: - return _fnlSinglePerlin2D(seed, x, y); - case FNL_NOISE_VALUE_CUBIC: - return _fnlSingleValueCubic2D(seed, x, y); - case FNL_NOISE_VALUE: - return _fnlSingleValue2D(seed, x, y); - default: - return 0; - } -} - -static float _fnlGenNoiseSingle3D(fnl_state state, int seed, FNLfloat x, FNLfloat y, FNLfloat z) -{ - FNL_FLATTEN switch (state.noise_type) - { - case FNL_NOISE_OPENSIMPLEX2: - return _fnlSingleOpenSimplex23D(seed, x, y, z); - case FNL_NOISE_OPENSIMPLEX2S: - return _fnlSingleOpenSimplex2S3D(seed, x, y, z); - case FNL_NOISE_CELLULAR: - return _fnlSingleCellular3D(state, seed, x, y, z); - case FNL_NOISE_PERLIN: - return _fnlSinglePerlin3D(seed, x, y, z); - case FNL_NOISE_VALUE_CUBIC: - return _fnlSingleValueCubic3D(seed, x, y, z); - case FNL_NOISE_VALUE: - return _fnlSingleValue3D(seed, x, y, z); - default: - return 0; - } -} - -// Noise Coordinate Transforms (frequency, and possible skew or rotation) - -static void _fnlTransformNoiseCoordinate2D(fnl_state state, inout FNLfloat x, inout FNLfloat y) -{ - x *= state.frequency; - y *= state.frequency; - - switch (state.noise_type) { - case FNL_NOISE_OPENSIMPLEX2: - case FNL_NOISE_OPENSIMPLEX2S: - { - const FNLfloat SQRT3 = (FNLfloat)1.7320508075688772935274463415059; - const FNLfloat F2 = 0.5f * (SQRT3 - 1); - FNLfloat t = (x + y) * F2; - x += t; - y += t; - } - break; - default: - break; - } -} - -static void _fnlTransformNoiseCoordinate3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z) -{ - x *= state.frequency; - y *= state.frequency; - z *= state.frequency; - - switch (state.rotation_type_3d) { - case FNL_ROTATION_IMPROVE_XY_PLANES: - { - FNLfloat xy = x + y; - FNLfloat s2 = xy * -(FNLfloat)0.211324865405187; - z *= (FNLfloat)0.577350269189626; - x += s2 - z; - y = y + s2 - z; - z += xy * (FNLfloat)0.577350269189626; - } - break; - case FNL_ROTATION_IMPROVE_XZ_PLANES: - { - FNLfloat xz = x + z; - FNLfloat s2 = xz * -(FNLfloat)0.211324865405187; - y *= (FNLfloat)0.577350269189626; - x += s2 - y; - z += s2 - y; - y += xz * (FNLfloat)0.577350269189626; - } - break; - default: - switch (state.noise_type) { - case FNL_NOISE_OPENSIMPLEX2: - case FNL_NOISE_OPENSIMPLEX2S: - { - const FNLfloat R3 = (FNLfloat)(2.0 / 3.0); - FNLfloat r = (x + y + z) * R3; // Rotation, not skew - x = r - x; - y = r - y; - z = r - z; - } - break; - default: - break; - } - break; - } -} - -// Domain Warp Coordinate Transforms - -static void _fnlTransformDomainWarpCoordinate2D(fnl_state state, inout FNLfloat x, inout FNLfloat y) -{ - switch (state.domain_warp_type) { - case FNL_DOMAIN_WARP_OPENSIMPLEX2: - case FNL_DOMAIN_WARP_OPENSIMPLEX2_REDUCED: - { - const FNLfloat SQRT3 = (FNLfloat)1.7320508075688772935274463415059; - const FNLfloat F2 = 0.5f * (SQRT3 - 1); - FNLfloat t = (x + y) * F2; - x += t; - y += t; - } - break; - default: - break; - } -} - -static void _fnlTransformDomainWarpCoordinate3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z) -{ - switch (state.rotation_type_3d) { - case FNL_ROTATION_IMPROVE_XY_PLANES: - { - FNLfloat xy = x + y; - FNLfloat s2 = xy * -(FNLfloat)0.211324865405187; - z *= (FNLfloat)0.577350269189626; - x += s2 - z; - y = y + s2 - z; - z += xy * (FNLfloat)0.577350269189626; - } - break; - case FNL_ROTATION_IMPROVE_XZ_PLANES: - { - FNLfloat xz = x + z; - FNLfloat s2 = xz * -(FNLfloat)0.211324865405187; - y *= (FNLfloat)0.577350269189626; - x += s2 - y; - z += s2 - y; - y += xz * (FNLfloat)0.577350269189626; - } - break; - default: - switch (state.domain_warp_type) { - case FNL_DOMAIN_WARP_OPENSIMPLEX2: - case FNL_DOMAIN_WARP_OPENSIMPLEX2_REDUCED: - { - const FNLfloat R3 = (FNLfloat)(2.0 / 3.0); - FNLfloat r = (x + y + z) * R3; // Rotation, not skew - x = r - x; - y = r - y; - z = r - z; - } - break; - default: - break; - } - break; - } -} - -// Fractal FBm - -static float _fnlGenFractalFBM2D(fnl_state state, FNLfloat x, FNLfloat y) -{ - int seed = state.seed; - float sum = 0; - float amp = _fnlCalculateFractalBounding(state); - - for (int i = 0; i < state.octaves; i++) { - float noise = _fnlGenNoiseSingle2D(state, seed++, x, y); - sum += noise * amp; - amp *= _fnlLerp(1.0f, _fnlFastMin(noise + 1, 2) * 0.5f, state.weighted_strength); - - x *= state.lacunarity; - y *= state.lacunarity; - amp *= state.gain; - } - - return sum; -} - -static float _fnlGenFractalFBM3D(fnl_state state, FNLfloat x, FNLfloat y, FNLfloat z) -{ - int seed = state.seed; - float sum = 0; - float amp = _fnlCalculateFractalBounding(state); - - for (int i = 0; i < state.octaves; i++) { - float noise = _fnlGenNoiseSingle3D(state, seed++, x, y, z); - sum += noise * amp; - amp *= _fnlLerp(1.0f, (noise + 1) * 0.5f, state.weighted_strength); - - x *= state.lacunarity; - y *= state.lacunarity; - z *= state.lacunarity; - amp *= state.gain; - } - - return sum; -} - -// Fractal Ridged - -static float _fnlGenFractalRidged2D(fnl_state state, FNLfloat x, FNLfloat y) -{ - int seed = state.seed; - float sum = 0; - float amp = _fnlCalculateFractalBounding(state); - - for (int i = 0; i < state.octaves; i++) { - float noise = _fnlFastAbs(_fnlGenNoiseSingle2D(state, seed++, x, y)); - sum += (noise * -2 + 1) * amp; - amp *= _fnlLerp(1.0f, 1 - noise, state.weighted_strength); - - x *= state.lacunarity; - y *= state.lacunarity; - amp *= state.gain; - } - - return sum; -} - -static float _fnlGenFractalRidged3D(fnl_state state, FNLfloat x, FNLfloat y, FNLfloat z) -{ - int seed = state.seed; - float sum = 0; - float amp = _fnlCalculateFractalBounding(state); - - for (int i = 0; i < state.octaves; i++) { - float noise = _fnlFastAbs(_fnlGenNoiseSingle3D(state, seed++, x, y, z)); - sum += (noise * -2 + 1) * amp; - amp *= _fnlLerp(1.0f, 1 - noise, state.weighted_strength); - - x *= state.lacunarity; - y *= state.lacunarity; - z *= state.lacunarity; - amp *= state.gain; - } - - return sum; -} - -// Fractal PingPong - -static float _fnlGenFractalPingPong2D(fnl_state state, FNLfloat x, FNLfloat y) -{ - int seed = state.seed; - float sum = 0; - float amp = _fnlCalculateFractalBounding(state); - - for (int i = 0; i < state.octaves; i++) { - float noise = _fnlPingPong((_fnlGenNoiseSingle2D(state, seed++, x, y) + 1) * state.ping_pong_strength); - sum += (noise - 0.5f) * 2 * amp; - amp *= _fnlLerp(1.0f, noise, state.weighted_strength); - - x *= state.lacunarity; - y *= state.lacunarity; - amp *= state.gain; - } - - return sum; -} - -static float _fnlGenFractalPingPong3D(fnl_state state, FNLfloat x, FNLfloat y, FNLfloat z) -{ - int seed = state.seed; - float sum = 0; - float amp = _fnlCalculateFractalBounding(state); - - for (int i = 0; i < state.octaves; i++) { - float noise = _fnlPingPong((_fnlGenNoiseSingle3D(state, seed++, x, y, z) + 1) * state.ping_pong_strength); - sum += (noise - 0.5f) * 2 * amp; - amp *= _fnlLerp(1.0f, noise, state.weighted_strength); - - x *= state.lacunarity; - y *= state.lacunarity; - z *= state.lacunarity; - amp *= state.gain; - } - - return sum; -} - -// Simplex/OpenSimplex2 Noise - -static float _fnlSingleSimplex2D(int seed, FNLfloat x, FNLfloat y) -{ - // 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex. - - const float SQRT3 = 1.7320508075688772935274463415059f; - const float G2 = (3 - SQRT3) / 6; - - /* - * --- Skew moved to TransformNoiseCoordinate method --- - * const FNLfloat F2 = 0.5f * (SQRT3 - 1); - * FNLfloat s = (x + y) * F2; - * x += s; y += s; - */ - - int i = _fnlFastFloor(x); - int j = _fnlFastFloor(y); - float xi = (float)(x - i); - float yi = (float)(y - j); - - float t = (xi + yi) * G2; - float x0 = (float)(xi - t); - float y0 = (float)(yi - t); - - i *= PRIME_X; - j *= PRIME_Y; - - float n0, n1, n2; - - float a = 0.5f - x0 * x0 - y0 * y0; - if (a <= 0) - n0 = 0; - else { - n0 = (a * a) * (a * a) * _fnlGradCoord2D(seed, i, j, x0, y0); - } - - float c = (float)(2 * (1 - 2 * G2) * (1 / G2 - 2)) * t + ((float)(-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); - if (c <= 0) - n2 = 0; - else { - float x2 = x0 + (2 * (float)G2 - 1); - float y2 = y0 + (2 * (float)G2 - 1); - n2 = (c * c) * (c * c) * _fnlGradCoord2D(seed, i + PRIME_X, j + PRIME_Y, x2, y2); - } - - if (y0 > x0) { - float x1 = x0 + (float)G2; - float y1 = y0 + ((float)G2 - 1); - float b = 0.5f - x1 * x1 - y1 * y1; - if (b <= 0) - n1 = 0; - else { - n1 = (b * b) * (b * b) * _fnlGradCoord2D(seed, i, j + PRIME_Y, x1, y1); - } - } else { - float x1 = x0 + ((float)G2 - 1); - float y1 = y0 + (float)G2; - float b = 0.5f - x1 * x1 - y1 * y1; - if (b <= 0) - n1 = 0; - else { - n1 = (b * b) * (b * b) * _fnlGradCoord2D(seed, i + PRIME_X, j, x1, y1); - } - } - - return (n0 + n1 + n2) * 99.83685446303647f; -} - -static float _fnlSingleOpenSimplex23D(int seed, FNLfloat x, FNLfloat y, FNLfloat z) -{ - // 3D OpenSimplex2 case uses two offset rotated cube grids. - - /* - * --- Rotation moved to TransformNoiseCoordinate method --- - * const FNLfloat R3 = (FNLfloat)(2.0 / 3.0); - * FNLfloat r = (x + y + z) * R3; // Rotation, not skew - * x = r - x; y = r - y; z = r - z; - */ - - int i = _fnlFastRound(x); - int j = _fnlFastRound(y); - int k = _fnlFastRound(z); - float x0 = (float)(x - i); - float y0 = (float)(y - j); - float z0 = (float)(z - k); - - int xNSign = (int)(-1.0f - x0) | 1; - int yNSign = (int)(-1.0f - y0) | 1; - int zNSign = (int)(-1.0f - z0) | 1; - - float ax0 = xNSign * -x0; - float ay0 = yNSign * -y0; - float az0 = zNSign * -z0; - - i *= PRIME_X; - j *= PRIME_Y; - k *= PRIME_Z; - - float value = 0; - float a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); - - FNL_UNROLL for (int l = 0;; l++) - { - if (a > 0) { - value += (a * a) * (a * a) * _fnlGradCoord3D(seed, i, j, k, x0, y0, z0); - } - - float b = a + 1; - int i1 = i; - int j1 = j; - int k1 = k; - float x1 = x0; - float y1 = y0; - float z1 = z0; - if (ax0 >= ay0 && ax0 >= az0) { - x1 += xNSign; - b -= xNSign * 2 * x1; - i1 -= xNSign * PRIME_X; - } else if (ay0 > ax0 && ay0 >= az0) { - y1 += yNSign; - b -= yNSign * 2 * y1; - j1 -= yNSign * PRIME_Y; - } else { - z1 += zNSign; - b -= zNSign * 2 * z1; - k1 -= zNSign * PRIME_Z; - } - - if (b > 0) { - value += (b * b) * (b * b) * _fnlGradCoord3D(seed, i1, j1, k1, x1, y1, z1); - } - - if (l == 1) - break; - - ax0 = 0.5f - ax0; - ay0 = 0.5f - ay0; - az0 = 0.5f - az0; - - x0 = xNSign * ax0; - y0 = yNSign * ay0; - z0 = zNSign * az0; - - a += (0.75f - ax0) - (ay0 + az0); - - i += (xNSign >> 1) & PRIME_X; - j += (yNSign >> 1) & PRIME_Y; - k += (zNSign >> 1) & PRIME_Z; - - xNSign = -xNSign; - yNSign = -yNSign; - zNSign = -zNSign; - - seed = ~seed; - } - - return value * 32.69428253173828125f; -} - -// OpenSimplex2S Noise - -static float _fnlSingleOpenSimplex2S2D(int seed, FNLfloat x, FNLfloat y) -{ - // 2D OpenSimplex2S case is a modified 2D simplex noise. - - const FNLfloat SQRT3 = (FNLfloat)1.7320508075688772935274463415059; - const FNLfloat G2 = (3 - SQRT3) / 6; - - /* - * --- Skew moved to TransformNoiseCoordinate method --- - * const FNLfloat F2 = 0.5f * (SQRT3 - 1); - * FNLfloat s = (x + y) * F2; - * x += s; y += s; - */ - - int i = _fnlFastFloor(x); - int j = _fnlFastFloor(y); - float xi = (float)(x - i); - float yi = (float)(y - j); - - i *= PRIME_X; - j *= PRIME_Y; - int i1 = i + PRIME_X; - int j1 = j + PRIME_Y; - - float t = (xi + yi) * (float)G2; - float x0 = xi - t; - float y0 = yi - t; - - int aMask = (int)((xi + yi + 1) * -0.5f); - int bMask = (int)((xi - (aMask + 2)) * 0.5f - yi); - int cMask = (int)((yi - (aMask + 2)) * 0.5f - xi); - - float a0 = (2.0f / 3.0f) - x0 * x0 - y0 * y0; - float value = (a0 * a0) * (a0 * a0) * _fnlGradCoord2D(seed, i, j, x0, y0); - - float a1 = (float)(2 * (1 - 2 * G2) * (1 / G2 - 2)) * t + ((float)(-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a0); - float x1 = x0 - (float)(1 - 2 * G2); - float y1 = y0 - (float)(1 - 2 * G2); - value += (a1 * a1) * (a1 * a1) * _fnlGradCoord2D(seed, i1, j1, x1, y1); - - int di2 = ~(aMask | cMask) | 1; - int ndj2 = (aMask & bMask) << 1; - float t2 = (di2 - ndj2) * (float)G2; - float x2 = x0 - di2 + t2; - float y2 = y0 + ndj2 + t2; - float a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; - if (a2 > 0) { - value += (a2 * a2) * (a2 * a2) * _fnlGradCoord2D(seed, i1 + (di2 & (-PRIME_X << 1)), j + (ndj2 & (PRIME_Y << 1)), x2, y2); - } - - int ndi3 = (aMask & cMask) << 1; - int dj3 = ~(aMask | bMask) | 1; - float t3 = (dj3 - ndi3) * (float)G2; - float x3 = x0 + ndi3 + t3; - float y3 = y0 - dj3 + t3; - float a3 = (2.0f / 3.0f) - x3 * x3 - y3 * y3; - if (a3 > 0) { - value += (a3 * a3) * (a3 * a3) * _fnlGradCoord2D(seed, i + (ndi3 & (PRIME_X << 1)), j1 + (dj3 & (-PRIME_Y << 1)), x3, y3); - } - - return value * 18.24196194486065f; -} - -static float _fnlSingleOpenSimplex2S3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z) -{ - // 3D OpenSimplex2S case uses two offset rotated cube grids. - - /* - * --- Rotation moved to TransformNoiseCoordinate method --- - * const FNLfloat R3 = (FNLfloat)(2.0 / 3.0); - * FNLfloat r = (x + y + z) * R3; // Rotation, not skew - * x = r - x; y = r - y; z = r - z; - */ - - int i = _fnlFastFloor(x); - int j = _fnlFastFloor(y); - int k = _fnlFastFloor(z); - float xi = (float)(x - i); - float yi = (float)(y - j); - float zi = (float)(z - k); - - i *= PRIME_X; - j *= PRIME_Y; - k *= PRIME_Z; - int seed2 = seed + 1293373; - - int xNMask = (int)(-0.5f - xi); - int yNMask = (int)(-0.5f - yi); - int zNMask = (int)(-0.5f - zi); - - float x0 = xi + xNMask; - float y0 = yi + yNMask; - float z0 = zi + zNMask; - float a0 = 0.75f - x0 * x0 - y0 * y0 - z0 * z0; - float value = (a0 * a0) * (a0 * a0) * _fnlGradCoord3D(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x0, y0, z0); - - float x1 = xi - 0.5f; - float y1 = yi - 0.5f; - float z1 = zi - 0.5f; - float a1 = 0.75f - x1 * x1 - y1 * y1 - z1 * z1; - value += (a1 * a1) * (a1 * a1) * _fnlGradCoord3D(seed2, i + PRIME_X, j + PRIME_Y, k + PRIME_Z, x1, y1, z1); - - float xAFlipMask0 = ((xNMask | 1) << 1) * x1; - float yAFlipMask0 = ((yNMask | 1) << 1) * y1; - float zAFlipMask0 = ((zNMask | 1) << 1) * z1; - float xAFlipMask1 = (-2 - (xNMask << 2)) * x1 - 1.0f; - float yAFlipMask1 = (-2 - (yNMask << 2)) * y1 - 1.0f; - float zAFlipMask1 = (-2 - (zNMask << 2)) * z1 - 1.0f; - - bool skip5 = false; - float a2 = xAFlipMask0 + a0; - if (a2 > 0) { - float x2 = x0 - (xNMask | 1); - float y2 = y0; - float z2 = z0; - value += (a2 * a2) * (a2 * a2) * _fnlGradCoord3D(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x2, y2, z2); - } else { - float a3 = yAFlipMask0 + zAFlipMask0 + a0; - if (a3 > 0) { - float x3 = x0; - float y3 = y0 - (yNMask | 1); - float z3 = z0 - (zNMask | 1); - value += (a3 * a3) * (a3 * a3) * _fnlGradCoord3D(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), x3, y3, z3); - } - - float a4 = xAFlipMask1 + a1; - if (a4 > 0) { - float x4 = (xNMask | 1) + x1; - float y4 = y1; - float z4 = z1; - value += (a4 * a4) * (a4 * a4) * _fnlGradCoord3D(seed2, i + (xNMask & (PRIME_X * 2)), j + PRIME_Y, k + PRIME_Z, x4, y4, z4); - skip5 = true; - } - } - - bool skip9 = false; - float a6 = yAFlipMask0 + a0; - if (a6 > 0) { - float x6 = x0; - float y6 = y0 - (yNMask | 1); - float z6 = z0; - value += (a6 * a6) * (a6 * a6) * _fnlGradCoord3D(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x6, y6, z6); - } else { - float a7 = xAFlipMask0 + zAFlipMask0 + a0; - if (a7 > 0) { - float x7 = x0 - (xNMask | 1); - float y7 = y0; - float z7 = z0 - (zNMask | 1); - value += (a7 * a7) * (a7 * a7) * _fnlGradCoord3D(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), x7, y7, z7); - } - - float a8 = yAFlipMask1 + a1; - if (a8 > 0) { - float x8 = x1; - float y8 = (yNMask | 1) + y1; - float z8 = z1; - value += (a8 * a8) * (a8 * a8) * _fnlGradCoord3D(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z, x8, y8, z8); - skip9 = true; - } - } - - bool skipD = false; - float aA = zAFlipMask0 + a0; - if (aA > 0) { - float xA = x0; - float yA = y0; - float zA = z0 - (zNMask | 1); - value += (aA * aA) * (aA * aA) * _fnlGradCoord3D(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), xA, yA, zA); - } else { - float aB = xAFlipMask0 + yAFlipMask0 + a0; - if (aB > 0) { - float xB = x0 - (xNMask | 1); - float yB = y0 - (yNMask | 1); - float zB = z0; - value += (aB * aB) * (aB * aB) * _fnlGradCoord3D(seed, i + (~xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z), xB, yB, zB); - } - - float aC = zAFlipMask1 + a1; - if (aC > 0) { - float xC = x1; - float yC = y1; - float zC = (zNMask | 1) + z1; - value += (aC * aC) * (aC * aC) * _fnlGradCoord3D(seed2, i + PRIME_X, j + PRIME_Y, k + (zNMask & (PRIME_Z << 1)), xC, yC, zC); - skipD = true; - } - } - - if (!skip5) { - float a5 = yAFlipMask1 + zAFlipMask1 + a1; - if (a5 > 0) { - float x5 = x1; - float y5 = (yNMask | 1) + y1; - float z5 = (zNMask | 1) + z1; - value += (a5 * a5) * (a5 * a5) * _fnlGradCoord3D(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + (zNMask & (PRIME_Z << 1)), x5, y5, z5); - } - } - - if (!skip9) { - float a9 = xAFlipMask1 + zAFlipMask1 + a1; - if (a9 > 0) { - float x9 = (xNMask | 1) + x1; - float y9 = y1; - float z9 = (zNMask | 1) + z1; - value += (a9 * a9) * (a9 * a9) * _fnlGradCoord3D(seed2, i + (xNMask & (PRIME_X * 2)), j + PRIME_Y, k + (zNMask & (PRIME_Z << 1)), x9, y9, z9); - } - } - - if (!skipD) { - float aD = xAFlipMask1 + yAFlipMask1 + a1; - if (aD > 0) { - float xD = (xNMask | 1) + x1; - float yD = (yNMask | 1) + y1; - float zD = z1; - value += (aD * aD) * (aD * aD) * _fnlGradCoord3D(seed2, i + (xNMask & (PRIME_X << 1)), j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z, xD, yD, zD); - } - } - - return value * 9.046026385208288f; -} - -// Cellular Noise - -static float _fnlSingleCellular2D(fnl_state state, int seed, FNLfloat x, FNLfloat y) -{ - int xr = _fnlFastRound(x); - int yr = _fnlFastRound(y); - - float distance0 = 1e10f; - float distance1 = 1e10f; - int closestHash = 0; - - float cellularJitter = 0.43701595f * state.cellular_jitter_mod; - - int xPrimed = (xr - 1) * PRIME_X; - int yPrimedBase = (yr - 1) * PRIME_Y; - - FNL_FLATTEN switch (state.cellular_distance_func) - { - default: - case FNL_CELLULAR_DISTANCE_EUCLIDEAN: - case FNL_CELLULAR_DISTANCE_EUCLIDEANSQ: - { - for (int xi = xr - 1; xi <= xr + 1; xi++) { - int yPrimed = yPrimedBase; - - for (int yi = yr - 1; yi <= yr + 1; yi++) { - int hash = _fnlHash2D(seed, xPrimed, yPrimed); - int idx = hash & (255 << 1); - - float vecX = (float)(xi - x) + RAND_VECS_2D[idx] * cellularJitter; - float vecY = (float)(yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; - - float newDistance = vecX * vecX + vecY * vecY; - - distance1 = _fnlFastMax(_fnlFastMin(distance1, newDistance), distance0); - if (newDistance < distance0) { - distance0 = newDistance; - closestHash = hash; - } - yPrimed += PRIME_Y; - } - xPrimed += PRIME_X; - } - break; - } - case FNL_CELLULAR_DISTANCE_MANHATTAN: - { - for (int xi = xr - 1; xi <= xr + 1; xi++) { - int yPrimed = yPrimedBase; - - for (int yi = yr - 1; yi <= yr + 1; yi++) { - int hash = _fnlHash2D(seed, xPrimed, yPrimed); - int idx = hash & (255 << 1); - - float vecX = (float)(xi - x) + RAND_VECS_2D[idx] * cellularJitter; - float vecY = (float)(yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; - - float newDistance = _fnlFastAbs(vecX) + _fnlFastAbs(vecY); - - distance1 = _fnlFastMax(_fnlFastMin(distance1, newDistance), distance0); - if (newDistance < distance0) { - distance0 = newDistance; - closestHash = hash; - } - yPrimed += PRIME_Y; - } - xPrimed += PRIME_X; - } - break; - } - case FNL_CELLULAR_DISTANCE_HYBRID: - { - for (int xi = xr - 1; xi <= xr + 1; xi++) { - int yPrimed = yPrimedBase; - for (int yi = yr - 1; yi <= yr + 1; yi++) { - int hash = _fnlHash2D(seed, xPrimed, yPrimed); - int idx = hash & (255 << 1); - - float vecX = (float)(xi - x) + RAND_VECS_2D[idx] * cellularJitter; - float vecY = (float)(yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; - - float newDistance = (_fnlFastAbs(vecX) + _fnlFastAbs(vecY)) + (vecX * vecX + vecY * vecY); - - distance1 = _fnlFastMax(_fnlFastMin(distance1, newDistance), distance0); - if (newDistance < distance0) { - distance0 = newDistance; - closestHash = hash; - } - yPrimed += PRIME_Y; - } - xPrimed += PRIME_X; - } - break; - } - } - - FNL_FLATTEN if (state.cellular_distance_func == FNL_CELLULAR_DISTANCE_EUCLIDEAN && state.cellular_return_type >= FNL_CELLULAR_RETURN_TYPE_DISTANCE) - { - distance0 = _fnlFastSqrt(distance0); - if (state.cellular_return_type >= FNL_CELLULAR_RETURN_TYPE_DISTANCE2) - distance1 = _fnlFastSqrt(distance1); - } - - switch (state.cellular_return_type) { - case FNL_CELLULAR_RETURN_TYPE_CELLVALUE: - return closestHash * (1 / 2147483648.0f); - case FNL_CELLULAR_RETURN_TYPE_DISTANCE: - return distance0 - 1; - case FNL_CELLULAR_RETURN_TYPE_DISTANCE2: - return distance1 - 1; - case FNL_CELLULAR_RETURN_TYPE_DISTANCE2ADD: - return (distance1 + distance0) * 0.5f - 1; - case FNL_CELLULAR_RETURN_TYPE_DISTANCE2SUB: - return distance1 - distance0 - 1; - case FNL_CELLULAR_RETURN_TYPE_DISTANCE2MUL: - return distance1 * distance0 * 0.5f - 1; - case FNL_CELLULAR_RETURN_TYPE_DISTANCE2DIV: - return distance0 / distance1 - 1; - default: - return 0; - } -} - -static float _fnlSingleCellular3D(fnl_state state, int seed, FNLfloat x, FNLfloat y, FNLfloat z) -{ - int xr = _fnlFastRound(x); - int yr = _fnlFastRound(y); - int zr = _fnlFastRound(z); - - float distance0 = 1e10f; - float distance1 = 1e10f; - int closestHash = 0; - - float cellularJitter = 0.39614353f * state.cellular_jitter_mod; - - int xPrimed = (xr - 1) * PRIME_X; - int yPrimedBase = (yr - 1) * PRIME_Y; - int zPrimedBase = (zr - 1) * PRIME_Z; - - switch (state.cellular_distance_func) { - default: - case FNL_CELLULAR_DISTANCE_EUCLIDEAN: - case FNL_CELLULAR_DISTANCE_EUCLIDEANSQ: - { - for (int xi = xr - 1; xi <= xr + 1; xi++) { - int yPrimed = yPrimedBase; - - for (int yi = yr - 1; yi <= yr + 1; yi++) { - int zPrimed = zPrimedBase; - - for (int zi = zr - 1; zi <= zr + 1; zi++) { - int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed); - int idx = hash & (255 << 2); - - float vecX = (float)(xi - x) + RAND_VECS_3D[idx] * cellularJitter; - float vecY = (float)(yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; - float vecZ = (float)(zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; - - float newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ; - - distance1 = _fnlFastMax(_fnlFastMin(distance1, newDistance), distance0); - if (newDistance < distance0) { - distance0 = newDistance; - closestHash = hash; - } - zPrimed += PRIME_Z; - } - yPrimed += PRIME_Y; - } - xPrimed += PRIME_X; - } - break; - } - case FNL_CELLULAR_DISTANCE_MANHATTAN: - { - for (int xi = xr - 1; xi <= xr + 1; xi++) { - int yPrimed = yPrimedBase; - - for (int yi = yr - 1; yi <= yr + 1; yi++) { - int zPrimed = zPrimedBase; - - for (int zi = zr - 1; zi <= zr + 1; zi++) { - int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed); - int idx = hash & (255 << 2); - - float vecX = (float)(xi - x) + RAND_VECS_3D[idx] * cellularJitter; - float vecY = (float)(yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; - float vecZ = (float)(zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; - - float newDistance = _fnlFastAbs(vecX) + _fnlFastAbs(vecY) + _fnlFastAbs(vecZ); - - distance1 = _fnlFastMax(_fnlFastMin(distance1, newDistance), distance0); - if (newDistance < distance0) { - distance0 = newDistance; - closestHash = hash; - } - zPrimed += PRIME_Z; - } - yPrimed += PRIME_Y; - } - xPrimed += PRIME_X; - } - break; - } - case FNL_CELLULAR_DISTANCE_HYBRID: - { - for (int xi = xr - 1; xi <= xr + 1; xi++) { - int yPrimed = yPrimedBase; - - for (int yi = yr - 1; yi <= yr + 1; yi++) { - int zPrimed = zPrimedBase; - - for (int zi = zr - 1; zi <= zr + 1; zi++) { - int hash = _fnlHash3D(seed, xPrimed, yPrimed, zPrimed); - int idx = hash & (255 << 2); - - float vecX = (float)(xi - x) + RAND_VECS_3D[idx] * cellularJitter; - float vecY = (float)(yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; - float vecZ = (float)(zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; - - float newDistance = (_fnlFastAbs(vecX) + _fnlFastAbs(vecY) + _fnlFastAbs(vecZ)) + (vecX * vecX + vecY * vecY + vecZ * vecZ); - - distance1 = _fnlFastMax(_fnlFastMin(distance1, newDistance), distance0); - if (newDistance < distance0) { - distance0 = newDistance; - closestHash = hash; - } - zPrimed += PRIME_Z; - } - yPrimed += PRIME_Y; - } - xPrimed += PRIME_X; - } - break; - } - } - - if (state.cellular_distance_func == FNL_CELLULAR_DISTANCE_EUCLIDEAN && state.cellular_return_type >= FNL_CELLULAR_RETURN_TYPE_DISTANCE) { - distance0 = _fnlFastSqrt(distance0); - if (state.cellular_return_type >= FNL_CELLULAR_RETURN_TYPE_DISTANCE2) - distance1 = _fnlFastSqrt(distance1); - } - - switch (state.cellular_return_type) { - case FNL_CELLULAR_RETURN_TYPE_CELLVALUE: - return closestHash * (1 / 2147483648.0f); - case FNL_CELLULAR_RETURN_TYPE_DISTANCE: - return distance0 - 1; - case FNL_CELLULAR_RETURN_TYPE_DISTANCE2: - return distance1 - 1; - case FNL_CELLULAR_RETURN_TYPE_DISTANCE2ADD: - return (distance1 + distance0) * 0.5f - 1; - case FNL_CELLULAR_RETURN_TYPE_DISTANCE2SUB: - return distance1 - distance0 - 1; - case FNL_CELLULAR_RETURN_TYPE_DISTANCE2MUL: - return distance1 * distance0 * 0.5f - 1; - case FNL_CELLULAR_RETURN_TYPE_DISTANCE2DIV: - return distance0 / distance1 - 1; - default: - return 0; - } -} - -// Perlin Noise - -static float _fnlSinglePerlin2D(int seed, FNLfloat x, FNLfloat y) -{ - int x0 = _fnlFastFloor(x); - int y0 = _fnlFastFloor(y); - - float xd0 = (float)(x - x0); - float yd0 = (float)(y - y0); - float xd1 = xd0 - 1; - float yd1 = yd0 - 1; - - float xs = _fnlInterpQuintic(xd0); - float ys = _fnlInterpQuintic(yd0); - - x0 *= PRIME_X; - y0 *= PRIME_Y; - int x1 = x0 + PRIME_X; - int y1 = y0 + PRIME_Y; - - float xf0 = _fnlLerp(_fnlGradCoord2D(seed, x0, y0, xd0, yd0), _fnlGradCoord2D(seed, x1, y0, xd1, yd0), xs); - float xf1 = _fnlLerp(_fnlGradCoord2D(seed, x0, y1, xd0, yd1), _fnlGradCoord2D(seed, x1, y1, xd1, yd1), xs); - - return _fnlLerp(xf0, xf1, ys) * 1.4247691104677813f; -} - -static float _fnlSinglePerlin3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z) -{ - int x0 = _fnlFastFloor(x); - int y0 = _fnlFastFloor(y); - int z0 = _fnlFastFloor(z); - - float xd0 = (float)(x - x0); - float yd0 = (float)(y - y0); - float zd0 = (float)(z - z0); - float xd1 = xd0 - 1; - float yd1 = yd0 - 1; - float zd1 = zd0 - 1; - - float xs = _fnlInterpQuintic(xd0); - float ys = _fnlInterpQuintic(yd0); - float zs = _fnlInterpQuintic(zd0); - - x0 *= PRIME_X; - y0 *= PRIME_Y; - z0 *= PRIME_Z; - int x1 = x0 + PRIME_X; - int y1 = y0 + PRIME_Y; - int z1 = z0 + PRIME_Z; - - float xf00 = _fnlLerp(_fnlGradCoord3D(seed, x0, y0, z0, xd0, yd0, zd0), _fnlGradCoord3D(seed, x1, y0, z0, xd1, yd0, zd0), xs); - float xf10 = _fnlLerp(_fnlGradCoord3D(seed, x0, y1, z0, xd0, yd1, zd0), _fnlGradCoord3D(seed, x1, y1, z0, xd1, yd1, zd0), xs); - float xf01 = _fnlLerp(_fnlGradCoord3D(seed, x0, y0, z1, xd0, yd0, zd1), _fnlGradCoord3D(seed, x1, y0, z1, xd1, yd0, zd1), xs); - float xf11 = _fnlLerp(_fnlGradCoord3D(seed, x0, y1, z1, xd0, yd1, zd1), _fnlGradCoord3D(seed, x1, y1, z1, xd1, yd1, zd1), xs); - - float yf0 = _fnlLerp(xf00, xf10, ys); - float yf1 = _fnlLerp(xf01, xf11, ys); - - return _fnlLerp(yf0, yf1, zs) * 0.964921414852142333984375f; -} - -// Value Cubic - -static float _fnlSingleValueCubic2D(int seed, FNLfloat x, FNLfloat y) -{ - int x1 = _fnlFastFloor(x); - int y1 = _fnlFastFloor(y); - - float xs = x - (float)x1; - float ys = y - (float)y1; - - x1 *= PRIME_X; - y1 *= PRIME_Y; - - int x0 = x1 - PRIME_X; - int y0 = y1 - PRIME_Y; - int x2 = x1 + PRIME_X; - int y2 = y1 + PRIME_Y; - int x3 = x1 + PRIME_X * 2; - int y3 = y1 + PRIME_Y * 2; - - return _fnlCubicLerp( - _fnlCubicLerp(_fnlValCoord2D(seed, x0, y0), _fnlValCoord2D(seed, x1, y0), _fnlValCoord2D(seed, x2, y0), _fnlValCoord2D(seed, x3, y0), - xs), - _fnlCubicLerp(_fnlValCoord2D(seed, x0, y1), _fnlValCoord2D(seed, x1, y1), _fnlValCoord2D(seed, x2, y1), _fnlValCoord2D(seed, x3, y1), - xs), - _fnlCubicLerp(_fnlValCoord2D(seed, x0, y2), _fnlValCoord2D(seed, x1, y2), _fnlValCoord2D(seed, x2, y2), _fnlValCoord2D(seed, x3, y2), - xs), - _fnlCubicLerp(_fnlValCoord2D(seed, x0, y3), _fnlValCoord2D(seed, x1, y3), _fnlValCoord2D(seed, x2, y3), _fnlValCoord2D(seed, x3, y3), - xs), - ys) * - (1 / (1.5f * 1.5f)); -} - -static float _fnlSingleValueCubic3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z) -{ - int x1 = _fnlFastFloor(x); - int y1 = _fnlFastFloor(y); - int z1 = _fnlFastFloor(z); - - float xs = x - (float)x1; - float ys = y - (float)y1; - float zs = z - (float)z1; - - x1 *= PRIME_X; - y1 *= PRIME_Y; - z1 *= PRIME_Z; - - int x0 = x1 - PRIME_X; - int y0 = y1 - PRIME_Y; - int z0 = z1 - PRIME_Z; - int x2 = x1 + PRIME_X; - int y2 = y1 + PRIME_Y; - int z2 = z1 + PRIME_Z; - int x3 = x1 + PRIME_X * 2; - int y3 = y1 + PRIME_Y * 2; - int z3 = z1 + PRIME_Z * 2; - - return _fnlCubicLerp( - _fnlCubicLerp( - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y0, z0), _fnlValCoord3D(seed, x1, y0, z0), _fnlValCoord3D(seed, x2, y0, z0), _fnlValCoord3D(seed, x3, y0, z0), xs), - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y1, z0), _fnlValCoord3D(seed, x1, y1, z0), _fnlValCoord3D(seed, x2, y1, z0), _fnlValCoord3D(seed, x3, y1, z0), xs), - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y2, z0), _fnlValCoord3D(seed, x1, y2, z0), _fnlValCoord3D(seed, x2, y2, z0), _fnlValCoord3D(seed, x3, y2, z0), xs), - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y3, z0), _fnlValCoord3D(seed, x1, y3, z0), _fnlValCoord3D(seed, x2, y3, z0), _fnlValCoord3D(seed, x3, y3, z0), xs), - ys), - _fnlCubicLerp( - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y0, z1), _fnlValCoord3D(seed, x1, y0, z1), _fnlValCoord3D(seed, x2, y0, z1), _fnlValCoord3D(seed, x3, y0, z1), xs), - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y1, z1), _fnlValCoord3D(seed, x1, y1, z1), _fnlValCoord3D(seed, x2, y1, z1), _fnlValCoord3D(seed, x3, y1, z1), xs), - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y2, z1), _fnlValCoord3D(seed, x1, y2, z1), _fnlValCoord3D(seed, x2, y2, z1), _fnlValCoord3D(seed, x3, y2, z1), xs), - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y3, z1), _fnlValCoord3D(seed, x1, y3, z1), _fnlValCoord3D(seed, x2, y3, z1), _fnlValCoord3D(seed, x3, y3, z1), xs), - ys), - _fnlCubicLerp( - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y0, z2), _fnlValCoord3D(seed, x1, y0, z2), _fnlValCoord3D(seed, x2, y0, z2), _fnlValCoord3D(seed, x3, y0, z2), xs), - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y1, z2), _fnlValCoord3D(seed, x1, y1, z2), _fnlValCoord3D(seed, x2, y1, z2), _fnlValCoord3D(seed, x3, y1, z2), xs), - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y2, z2), _fnlValCoord3D(seed, x1, y2, z2), _fnlValCoord3D(seed, x2, y2, z2), _fnlValCoord3D(seed, x3, y2, z2), xs), - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y3, z2), _fnlValCoord3D(seed, x1, y3, z2), _fnlValCoord3D(seed, x2, y3, z2), _fnlValCoord3D(seed, x3, y3, z2), xs), - ys), - _fnlCubicLerp( - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y0, z3), _fnlValCoord3D(seed, x1, y0, z3), _fnlValCoord3D(seed, x2, y0, z3), _fnlValCoord3D(seed, x3, y0, z3), xs), - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y1, z3), _fnlValCoord3D(seed, x1, y1, z3), _fnlValCoord3D(seed, x2, y1, z3), _fnlValCoord3D(seed, x3, y1, z3), xs), - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y2, z3), _fnlValCoord3D(seed, x1, y2, z3), _fnlValCoord3D(seed, x2, y2, z3), _fnlValCoord3D(seed, x3, y2, z3), xs), - _fnlCubicLerp(_fnlValCoord3D(seed, x0, y3, z3), _fnlValCoord3D(seed, x1, y3, z3), _fnlValCoord3D(seed, x2, y3, z3), _fnlValCoord3D(seed, x3, y3, z3), xs), - ys), - zs) * - (1 / (1.5f * 1.5f * 1.5f)); -} - -// Value noise - -static float _fnlSingleValue2D(int seed, FNLfloat x, FNLfloat y) -{ - int x0 = _fnlFastFloor(x); - int y0 = _fnlFastFloor(y); - - float xs = _fnlInterpHermite((float)(x - x0)); - float ys = _fnlInterpHermite((float)(y - y0)); - - x0 *= PRIME_X; - y0 *= PRIME_Y; - int x1 = x0 + PRIME_X; - int y1 = y0 + PRIME_Y; - - float xf0 = _fnlLerp(_fnlValCoord2D(seed, x0, y0), _fnlValCoord2D(seed, x1, y0), xs); - float xf1 = _fnlLerp(_fnlValCoord2D(seed, x0, y1), _fnlValCoord2D(seed, x1, y1), xs); - - return _fnlLerp(xf0, xf1, ys); -} - -static float _fnlSingleValue3D(int seed, FNLfloat x, FNLfloat y, FNLfloat z) -{ - int x0 = _fnlFastFloor(x); - int y0 = _fnlFastFloor(y); - int z0 = _fnlFastFloor(z); - - float xs = _fnlInterpHermite((float)(x - x0)); - float ys = _fnlInterpHermite((float)(y - y0)); - float zs = _fnlInterpHermite((float)(z - z0)); - - x0 *= PRIME_X; - y0 *= PRIME_Y; - z0 *= PRIME_Z; - int x1 = x0 + PRIME_X; - int y1 = y0 + PRIME_Y; - int z1 = z0 + PRIME_Z; - - float xf00 = _fnlLerp(_fnlValCoord3D(seed, x0, y0, z0), _fnlValCoord3D(seed, x1, y0, z0), xs); - float xf10 = _fnlLerp(_fnlValCoord3D(seed, x0, y1, z0), _fnlValCoord3D(seed, x1, y1, z0), xs); - float xf01 = _fnlLerp(_fnlValCoord3D(seed, x0, y0, z1), _fnlValCoord3D(seed, x1, y0, z1), xs); - float xf11 = _fnlLerp(_fnlValCoord3D(seed, x0, y1, z1), _fnlValCoord3D(seed, x1, y1, z1), xs); - - float yf0 = _fnlLerp(xf00, xf10, ys); - float yf1 = _fnlLerp(xf01, xf11, ys); - - return _fnlLerp(yf0, yf1, zs); -} - -// Domain Warp - -// Forward declare -static void _fnlSingleDomainWarpBasicGrid2D(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, inout FNLfloat xp, inout FNLfloat yp); -static void _fnlSingleDomainWarpBasicGrid3D(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, FNLfloat z, inout FNLfloat xp, inout FNLfloat yp, inout FNLfloat zp); -static void _fnlSingleDomainWarpSimplexGradient(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, inout FNLfloat xr, inout FNLfloat yr, bool outGradOnly); -static void _fnlSingleDomainWarpOpenSimplex2Gradient(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, FNLfloat z, inout FNLfloat xr, inout FNLfloat yr, inout FNLfloat zr, bool outGradOnly); - -static void _fnlDoSingleDomainWarp2D(fnl_state state, int seed, float amp, float freq, FNLfloat x, FNLfloat y, inout FNLfloat xp, inout FNLfloat yp) -{ - FNL_FLATTEN switch (state.domain_warp_type) - { - case FNL_DOMAIN_WARP_OPENSIMPLEX2: - _fnlSingleDomainWarpSimplexGradient(seed, amp * 38.283687591552734375f, freq, x, y, xp, yp, false); - break; - case FNL_DOMAIN_WARP_OPENSIMPLEX2_REDUCED: - _fnlSingleDomainWarpSimplexGradient(seed, amp * 16.0f, freq, x, y, xp, yp, true); - break; - case FNL_DOMAIN_WARP_BASICGRID: - _fnlSingleDomainWarpBasicGrid2D(seed, amp, freq, x, y, xp, yp); - break; - } -} - -static void _fnlDoSingleDomainWarp3D(fnl_state state, int seed, float amp, float freq, FNLfloat x, FNLfloat y, FNLfloat z, inout FNLfloat xp, inout FNLfloat yp, inout FNLfloat zp) -{ - FNL_FLATTEN switch (state.domain_warp_type) - { - case FNL_DOMAIN_WARP_OPENSIMPLEX2: - _fnlSingleDomainWarpOpenSimplex2Gradient(seed, amp * 32.69428253173828125f, freq, x, y, z, xp, yp, zp, false); - break; - case FNL_DOMAIN_WARP_OPENSIMPLEX2_REDUCED: - _fnlSingleDomainWarpOpenSimplex2Gradient(seed, amp * 7.71604938271605f, freq, x, y, z, xp, yp, zp, true); - break; - case FNL_DOMAIN_WARP_BASICGRID: - _fnlSingleDomainWarpBasicGrid3D(seed, amp, freq, x, y, z, xp, yp, zp); - break; - } -} - -// Domain Warp Single Wrapper - -static void _fnlDomainWarpSingle2D(fnl_state state, inout FNLfloat x, inout FNLfloat y) -{ - int seed = state.seed; - float amp = state.domain_warp_amp * _fnlCalculateFractalBounding(state); - float freq = state.frequency; - - FNLfloat xs = x; - FNLfloat ys = y; - _fnlTransformDomainWarpCoordinate2D(state, xs, ys); - - _fnlDoSingleDomainWarp2D(state, seed, amp, freq, xs, ys, x, y); -} - -static void _fnlDomainWarpSingle3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z) -{ - int seed = state.seed; - float amp = state.domain_warp_amp * _fnlCalculateFractalBounding(state); - float freq = state.frequency; - - FNLfloat xs = x; - FNLfloat ys = y; - FNLfloat zs = z; - _fnlTransformDomainWarpCoordinate3D(state, xs, ys, zs); - - _fnlDoSingleDomainWarp3D(state, seed, amp, freq, xs, ys, zs, x, y, z); -} - -// Domain Warp Fractal Progressive - -static void _fnlDomainWarpFractalProgressive2D(fnl_state state, inout FNLfloat x, inout FNLfloat y) -{ - int seed = state.seed; - float amp = state.domain_warp_amp * _fnlCalculateFractalBounding(state); - float freq = state.frequency; - - for (int i = 0; i < state.octaves; i++) { - FNLfloat xs = x; - FNLfloat ys = y; - _fnlTransformDomainWarpCoordinate2D(state, xs, ys); - - _fnlDoSingleDomainWarp2D(state, seed, amp, freq, xs, ys, x, y); - - seed++; - amp *= state.gain; - freq *= state.lacunarity; - } -} - -static void _fnlDomainWarpFractalProgressive3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z) -{ - int seed = state.seed; - float amp = state.domain_warp_amp * _fnlCalculateFractalBounding(state); - float freq = state.frequency; - - for (int i = 0; i < state.octaves; i++) { - FNLfloat xs = x; - FNLfloat ys = y; - FNLfloat zs = z; - _fnlTransformDomainWarpCoordinate3D(state, xs, ys, zs); - - _fnlDoSingleDomainWarp3D(state, seed, amp, freq, xs, ys, zs, x, y, z); - - seed++; - amp *= state.gain; - freq *= state.lacunarity; - } -} - -// Domain Warp Fractal Independent - -static void _fnlDomainWarpFractalIndependent2D(fnl_state state, inout FNLfloat x, inout FNLfloat y) -{ - FNLfloat xs = x; - FNLfloat ys = y; - _fnlTransformDomainWarpCoordinate2D(state, xs, ys); - - int seed = state.seed; - float amp = state.domain_warp_amp * _fnlCalculateFractalBounding(state); - float freq = state.frequency; - - for (int i = 0; i < state.octaves; i++) { - _fnlDoSingleDomainWarp2D(state, seed, amp, freq, xs, ys, x, y); - - seed++; - amp *= state.gain; - freq *= state.lacunarity; - } -} - -static void _fnlDomainWarpFractalIndependent3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z) -{ - FNLfloat xs = x; - FNLfloat ys = y; - FNLfloat zs = z; - _fnlTransformDomainWarpCoordinate3D(state, xs, ys, zs); - - int seed = state.seed; - float amp = state.domain_warp_amp * _fnlCalculateFractalBounding(state); - float freq = state.frequency; - - for (int i = 0; i < state.octaves; i++) { - _fnlDoSingleDomainWarp3D(state, seed, amp, freq, xs, ys, zs, x, y, z); - - seed++; - amp *= state.gain; - freq *= state.lacunarity; - } -} - -// Domain Warp Basic Grid - -static void _fnlSingleDomainWarpBasicGrid2D(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, inout FNLfloat xp, inout FNLfloat yp) -{ - FNLfloat xf = x * frequency; - FNLfloat yf = y * frequency; - - int x0 = _fnlFastFloor(xf); - int y0 = _fnlFastFloor(yf); - - float xs = _fnlInterpHermite((float)(xf - x0)); - float ys = _fnlInterpHermite((float)(yf - y0)); - - x0 *= PRIME_X; - y0 *= PRIME_Y; - int x1 = x0 + PRIME_X; - int y1 = y0 + PRIME_Y; - - int idx0 = _fnlHash2D(seed, x0, y0) & (255 << 1); - int idx1 = _fnlHash2D(seed, x1, y0) & (255 << 1); - - float lx0x = _fnlLerp(RAND_VECS_2D[idx0], RAND_VECS_2D[idx1], xs); - float ly0x = _fnlLerp(RAND_VECS_2D[idx0 | 1], RAND_VECS_2D[idx1 | 1], xs); - - idx0 = _fnlHash2D(seed, x0, y1) & (255 << 1); - idx1 = _fnlHash2D(seed, x1, y1) & (255 << 1); - - float lx1x = _fnlLerp(RAND_VECS_2D[idx0], RAND_VECS_2D[idx1], xs); - float ly1x = _fnlLerp(RAND_VECS_2D[idx0 | 1], RAND_VECS_2D[idx1 | 1], xs); - - xp += _fnlLerp(lx0x, lx1x, ys) * warpAmp; - yp += _fnlLerp(ly0x, ly1x, ys) * warpAmp; -} - -static void _fnlSingleDomainWarpBasicGrid3D(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, FNLfloat z, inout FNLfloat xp, inout FNLfloat yp, inout FNLfloat zp) -{ - FNLfloat xf = x * frequency; - FNLfloat yf = y * frequency; - FNLfloat zf = z * frequency; - - int x0 = _fnlFastFloor(xf); - int y0 = _fnlFastFloor(yf); - int z0 = _fnlFastFloor(zf); - - float xs = _fnlInterpHermite((float)(xf - x0)); - float ys = _fnlInterpHermite((float)(yf - y0)); - float zs = _fnlInterpHermite((float)(zf - z0)); - - x0 *= PRIME_X; - y0 *= PRIME_Y; - z0 *= PRIME_Z; - int x1 = x0 + PRIME_X; - int y1 = y0 + PRIME_Y; - int z1 = z0 + PRIME_Z; - - int idx0 = _fnlHash3D(seed, x0, y0, z0) & (255 << 2); - int idx1 = _fnlHash3D(seed, x1, y0, z0) & (255 << 2); - - float lx0x = _fnlLerp(RAND_VECS_3D[idx0], RAND_VECS_3D[idx1], xs); - float ly0x = _fnlLerp(RAND_VECS_3D[idx0 | 1], RAND_VECS_3D[idx1 | 1], xs); - float lz0x = _fnlLerp(RAND_VECS_3D[idx0 | 2], RAND_VECS_3D[idx1 | 2], xs); - - idx0 = _fnlHash3D(seed, x0, y1, z0) & (255 << 2); - idx1 = _fnlHash3D(seed, x1, y1, z0) & (255 << 2); - - float lx1x = _fnlLerp(RAND_VECS_3D[idx0], RAND_VECS_3D[idx1], xs); - float ly1x = _fnlLerp(RAND_VECS_3D[idx0 | 1], RAND_VECS_3D[idx1 | 1], xs); - float lz1x = _fnlLerp(RAND_VECS_3D[idx0 | 2], RAND_VECS_3D[idx1 | 2], xs); - - float lx0y = _fnlLerp(lx0x, lx1x, ys); - float ly0y = _fnlLerp(ly0x, ly1x, ys); - float lz0y = _fnlLerp(lz0x, lz1x, ys); - - idx0 = _fnlHash3D(seed, x0, y0, z1) & (255 << 2); - idx1 = _fnlHash3D(seed, x1, y0, z1) & (255 << 2); - - lx0x = _fnlLerp(RAND_VECS_3D[idx0], RAND_VECS_3D[idx1], xs); - ly0x = _fnlLerp(RAND_VECS_3D[idx0 | 1], RAND_VECS_3D[idx1 | 1], xs); - lz0x = _fnlLerp(RAND_VECS_3D[idx0 | 2], RAND_VECS_3D[idx1 | 2], xs); - - idx0 = _fnlHash3D(seed, x0, y1, z1) & (255 << 2); - idx1 = _fnlHash3D(seed, x1, y1, z1) & (255 << 2); - - lx1x = _fnlLerp(RAND_VECS_3D[idx0], RAND_VECS_3D[idx1], xs); - ly1x = _fnlLerp(RAND_VECS_3D[idx0 | 1], RAND_VECS_3D[idx1 | 1], xs); - lz1x = _fnlLerp(RAND_VECS_3D[idx0 | 2], RAND_VECS_3D[idx1 | 2], xs); - - xp += _fnlLerp(lx0y, _fnlLerp(lx0x, lx1x, ys), zs) * warpAmp; - yp += _fnlLerp(ly0y, _fnlLerp(ly0x, ly1x, ys), zs) * warpAmp; - zp += _fnlLerp(lz0y, _fnlLerp(lz0x, lz1x, ys), zs) * warpAmp; -} - -// Domain Warp Simplex/OpenSimplex2 - -static void _fnlSingleDomainWarpSimplexGradient(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, inout FNLfloat xr, inout FNLfloat yr, bool outGradOnly) -{ - const float SQRT3 = 1.7320508075688772935274463415059f; - const float G2 = (3 - SQRT3) / 6; - - x *= frequency; - y *= frequency; - - /* - * --- Skew moved to TransformNoiseCoordinate method --- - * const FNLfloat F2 = 0.5f * (SQRT3 - 1); - * FNLfloat s = (x + y) * F2; - * x += s; y += s; - */ - - int i = _fnlFastFloor(x); - int j = _fnlFastFloor(y); - float xi = (float)(x - i); - float yi = (float)(y - j); - - float t = (xi + yi) * G2; - float x0 = (float)(xi - t); - float y0 = (float)(yi - t); - - i *= PRIME_X; - j *= PRIME_Y; - - float vx, vy; - vx = vy = 0; - - float a = 0.5f - x0 * x0 - y0 * y0; - if (a > 0) { - float aaaa = (a * a) * (a * a); - float xo, yo; - if (outGradOnly) - _fnlGradCoordOut2D(seed, i, j, xo, yo); - else - _fnlGradCoordDual2D(seed, i, j, x0, y0, xo, yo); - vx += aaaa * xo; - vy += aaaa * yo; - } - - float c = (float)(2 * (1 - 2 * G2) * (1 / G2 - 2)) * t + ((float)(-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); - if (c > 0) { - float x2 = x0 + (2 * (float)G2 - 1); - float y2 = y0 + (2 * (float)G2 - 1); - float cccc = (c * c) * (c * c); - float xo, yo; - if (outGradOnly) - _fnlGradCoordOut2D(seed, i + PRIME_X, j + PRIME_Y, xo, yo); - else - _fnlGradCoordDual2D(seed, i + PRIME_X, j + PRIME_Y, x2, y2, xo, yo); - vx += cccc * xo; - vy += cccc * yo; - } - - if (y0 > x0) { - float x1 = x0 + (float)G2; - float y1 = y0 + ((float)G2 - 1); - float b = 0.5f - x1 * x1 - y1 * y1; - if (b > 0) { - float bbbb = (b * b) * (b * b); - float xo, yo; - if (outGradOnly) - _fnlGradCoordOut2D(seed, i, j + PRIME_Y, xo, yo); - else - _fnlGradCoordDual2D(seed, i, j + PRIME_Y, x1, y1, xo, yo); - vx += bbbb * xo; - vy += bbbb * yo; - } - } else { - float x1 = x0 + ((float)G2 - 1); - float y1 = y0 + (float)G2; - float b = 0.5f - x1 * x1 - y1 * y1; - if (b > 0) { - float bbbb = (b * b) * (b * b); - float xo, yo; - if (outGradOnly) - _fnlGradCoordOut2D(seed, i + PRIME_X, j, xo, yo); - else - _fnlGradCoordDual2D(seed, i + PRIME_X, j, x1, y1, xo, yo); - vx += bbbb * xo; - vy += bbbb * yo; - } - } - - xr += vx * warpAmp; - yr += vy * warpAmp; -} - -static void _fnlSingleDomainWarpOpenSimplex2Gradient(int seed, float warpAmp, float frequency, FNLfloat x, FNLfloat y, FNLfloat z, inout FNLfloat xr, inout FNLfloat yr, inout FNLfloat zr, bool outGradOnly) -{ - x *= frequency; - y *= frequency; - z *= frequency; - - /* - * --- Rotation moved to TransformDomainWarpCoordinate method --- - * const FNLfloat R3 = (FNLfloat)(2.0 / 3.0); - * FNLfloat r = (x + y + z) * R3; // Rotation, not skew - * x = r - x; y = r - y; z = r - z; - */ - - int i = _fnlFastRound(x); - int j = _fnlFastRound(y); - int k = _fnlFastRound(z); - float x0 = (float)x - i; - float y0 = (float)y - j; - float z0 = (float)z - k; - - int xNSign = (int)(-x0 - 1.0f) | 1; - int yNSign = (int)(-y0 - 1.0f) | 1; - int zNSign = (int)(-z0 - 1.0f) | 1; - - float ax0 = xNSign * -x0; - float ay0 = yNSign * -y0; - float az0 = zNSign * -z0; - - i *= PRIME_X; - j *= PRIME_Y; - k *= PRIME_Z; - - float vx, vy, vz; - vx = vy = vz = 0; - - float a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); - for (int l = 0; l < 2; l++) { - if (a > 0) { - float aaaa = (a * a) * (a * a); - float xo, yo, zo; - if (outGradOnly) - _fnlGradCoordOut3D(seed, i, j, k, xo, yo, zo); - else - _fnlGradCoordDual3D(seed, i, j, k, x0, y0, z0, xo, yo, zo); - vx += aaaa * xo; - vy += aaaa * yo; - vz += aaaa * zo; - } - - float b = a + 1; - int i1 = i; - int j1 = j; - int k1 = k; - float x1 = x0; - float y1 = y0; - float z1 = z0; - if (ax0 >= ay0 && ax0 >= az0) { - x1 += xNSign; - b -= xNSign * 2 * x1; - i1 -= xNSign * PRIME_X; - } else if (ay0 > ax0 && ay0 >= az0) { - y1 += yNSign; - b -= yNSign * 2 * y1; - j1 -= yNSign * PRIME_Y; - } else { - z1 += zNSign; - b -= zNSign * 2 * z1; - k1 -= zNSign * PRIME_Z; - } - - if (b > 0) { - float bbbb = (b * b) * (b * b); - float xo, yo, zo; - if (outGradOnly) - _fnlGradCoordOut3D(seed, i1, j1, k1, xo, yo, zo); - else - _fnlGradCoordDual3D(seed, i1, j1, k1, x1, y1, z1, xo, yo, zo); - vx += bbbb * xo; - vy += bbbb * yo; - vz += bbbb * zo; - } - - if (l == 1) - break; - - ax0 = 0.5f - ax0; - ay0 = 0.5f - ay0; - az0 = 0.5f - az0; - - x0 = xNSign * ax0; - y0 = yNSign * ay0; - z0 = zNSign * az0; - - a += (0.75f - ax0) - (ay0 + az0); - - i += (xNSign >> 1) & PRIME_X; - j += (yNSign >> 1) & PRIME_Y; - k += (zNSign >> 1) & PRIME_Z; - - xNSign = -xNSign; - yNSign = -yNSign; - zNSign = -zNSign; - - seed += 1293373; - } - - xr += vx * warpAmp; - yr += vy * warpAmp; - zr += vz * warpAmp; -} - -// ==================== -// Public API -// ==================== - -fnl_state fnlCreateState(int seed) -{ - fnl_state newState; - newState.seed = seed; - newState.frequency = 0.01f; - newState.noise_type = FNL_NOISE_OPENSIMPLEX2; - newState.rotation_type_3d = FNL_ROTATION_NONE; - newState.fractal_type = FNL_FRACTAL_NONE; - newState.octaves = 3; - newState.lacunarity = 2.0f; - newState.gain = 0.5f; - newState.weighted_strength = 0.0f; - newState.ping_pong_strength = 2.0f; - newState.cellular_distance_func = FNL_CELLULAR_DISTANCE_EUCLIDEANSQ; - newState.cellular_return_type = FNL_CELLULAR_RETURN_TYPE_DISTANCE; - newState.cellular_jitter_mod = 1.0f; - newState.domain_warp_amp = 30.0f; - newState.domain_warp_type = FNL_DOMAIN_WARP_OPENSIMPLEX2; - return newState; -} - -float fnlGetNoise2D(fnl_state state, FNLfloat x, FNLfloat y) -{ - _fnlTransformNoiseCoordinate2D(state, x, y); - - FNL_FLATTEN switch (state.fractal_type) - { - default: - return _fnlGenNoiseSingle2D(state, state.seed, x, y); - case FNL_FRACTAL_FBM: - return _fnlGenFractalFBM2D(state, x, y); - case FNL_FRACTAL_RIDGED: - return _fnlGenFractalRidged2D(state, x, y); - case FNL_FRACTAL_PINGPONG: - return _fnlGenFractalPingPong2D(state, x, y); - } -} - -float fnlGetNoise3D(fnl_state state, FNLfloat x, FNLfloat y, FNLfloat z) -{ - _fnlTransformNoiseCoordinate3D(state, x, y, z); - - // Select a noise type - FNL_FLATTEN switch (state.fractal_type) - { - default: - return _fnlGenNoiseSingle3D(state, state.seed, x, y, z); - case FNL_FRACTAL_FBM: - return _fnlGenFractalFBM3D(state, x, y, z); - case FNL_FRACTAL_RIDGED: - return _fnlGenFractalRidged3D(state, x, y, z); - case FNL_FRACTAL_PINGPONG: - return _fnlGenFractalPingPong3D(state, x, y, z); - } -} - -void fnlDomainWarp2D(fnl_state state, inout FNLfloat x, inout FNLfloat y) -{ - FNL_FLATTEN switch (state.fractal_type) - { - default: - _fnlDomainWarpSingle2D(state, x, y); - break; - case FNL_FRACTAL_DOMAIN_WARP_PROGRESSIVE: - _fnlDomainWarpFractalProgressive2D(state, x, y); - break; - case FNL_FRACTAL_DOMAIN_WARP_INDEPENDENT: - _fnlDomainWarpFractalIndependent2D(state, x, y); - break; - } -} - -void fnlDomainWarp3D(fnl_state state, inout FNLfloat x, inout FNLfloat y, inout FNLfloat z) -{ - FNL_FLATTEN switch (state.fractal_type) - { - default: - _fnlDomainWarpSingle3D(state, x, y, z); - break; - case FNL_FRACTAL_DOMAIN_WARP_PROGRESSIVE: - _fnlDomainWarpFractalProgressive3D(state, x, y, z); - break; - case FNL_FRACTAL_DOMAIN_WARP_INDEPENDENT: - _fnlDomainWarpFractalIndependent3D(state, x, y, z); - break; - } -} diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 488be3bbbb..83d47f18dd 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -137,12 +137,12 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh } # if defined(TRUE_PBR) -void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) +float ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { float2 uv; float mult = ApplySnowBase(color, worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); if (mult <= 0.0) - return; + return 0; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; color = lerp(color, diffuse, mult); float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); @@ -157,16 +157,17 @@ void ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::Surfa prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, snowCoverSettings.Glint.y, mult); prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, snowCoverSettings.Glint.z, mult); prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, snowCoverSettings.Glint.w, mult); + return mult; } # else -void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) +float ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { float2 uv; //color = sRGB2Lin(color); float mult = ApplySnowBase(color, worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); if (mult <= 0.0) - return; + return 0; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; diffuse = pow(LinearToGamma(diffuse) / PI, 1 / 1.5); float4 rmaos = SnowRMAOS.Sample(SampColorSampler, uv); @@ -178,6 +179,7 @@ void ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossin worldNormal = normalize(lerp(worldNormal, normal, mult)); //glossiness = lerp(glossiness, 0.5 * pow(v * s, 3.0), mult); //shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); + return mult; } # endif # endif diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 57ad9c8f57..565e693578 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -26,7 +26,7 @@ # define LOD #endif -#if defined(SKINNED) || defined(SKIN) || defined(EYE) || !defined(EXTENDED_MATERIALS) +#if defined(SKINNED) || defined(SKIN) || defined(EYE) || defined(HAIR) || !defined(EXTENDED_MATERIALS) # undef SNOW_COVER #endif struct VS_INPUT @@ -959,7 +959,7 @@ float GetSnowParameterY(float texProjTmp, float alpha) # if defined(TRUE_PBR) # if defined(SNOW_COVER) -# define GLINT +# undef GLINT # endif # include "Common/PBR.hlsli" # endif @@ -1009,7 +1009,6 @@ float GetSnowParameterY(float texProjTmp, float alpha) # if defined(SNOW_COVER) # undef SNOW -# undef PROJECTED_UV # undef SPARKLE # include "SnowCover/SnowCover.hlsli" # endif @@ -1780,16 +1779,55 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif // defined (HAIR) baseColor.rgb *= vertexColor; -# if defined(SKYLIGHTING) - float snowOcclusion = inWorld ? smoothstep(0, 1, (shUnproject(skylightingSH, float3(0, 0, 1)))) : 0; -# else - float snowOcclusion = inWorld ? 1 : 0; + +# if defined(LIGHT_LIMIT_FIX) + uint numClusteredLights = 0; + uint totalLightCount = strictLights[0].NumStrictLights; + uint clusterIndex = 0; + uint lightOffset = 0; + if (inWorld && LightLimitFix::GetClusterIndex(screenUV, viewPosition.z, clusterIndex)) { + numClusteredLights = lightGrid[clusterIndex].lightCount; + totalLightCount += numClusteredLights; + lightOffset = lightGrid[clusterIndex].offset; + } # endif float4 waterData = GetWaterData(input.WorldPosition.xyz); float waterHeight = waterData.w; # if defined(SNOW_COVER) +# if defined(SKYLIGHTING) + float snowOcclusion = inWorld ? smoothstep(0, 1, (shUnproject(skylightingSH, float3(0, 0, 1)))) : 0; +# else + float snowOcclusion = inWorld ? 1 : 0; +# endif + +#if defined(LODLANDNOISE) + //snowOcclusion *= 0.8 + noise*0.2; +#endif + +# if defined(LIGHT_LIMIT_FIX) + [loop] for (uint lightIndex = 0; lightIndex < totalLightCount; lightIndex++) + { + StructuredLight light; + if (lightIndex < strictLights[0].NumStrictLights) { + light = strictLights[0].StrictLights[lightIndex]; + } else { + uint clusterIndex = lightList[lightOffset + (lightIndex - strictLights[0].NumStrictLights)]; + light = lights[clusterIndex]; + } + float3 lightDirection = light.positionWS[eyeIndex].xyz - input.WorldPosition.xyz; + float lightDist = dot(lightDirection, lightDirection); + snowOcclusion *= smoothstep(0, 25000, lightDist); + } +# else + [loop] for (uint lightIndex = 0; lightIndex < numShadowLights; lightIndex++) + { + float3 lightDirection = PointLightPosition[eyeIndex * numLights + lightIndex].xyz - input.InputPosition.xyz; + float lightDist = dot(lightDirection, lightDirection); + snowOcclusion *= smoothstep(0, 50000, lightDist); + } +# endif # if !defined(MODELSPACENORMALS) float3 viewDirTS = normalize(mul(tbnTr, viewDirection)); viewDirTS.xy /= viewDirTS.z * 0.7 + 0.3; // Fix for objects at extreme viewing angles @@ -1809,14 +1847,26 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif //float3 pos = float3(diffuseUv.x, diffuseUv.y, 0); + float snowFactor = 0; if (snowCoverSettings.EnableSnowCover) # if defined(TRUE_PBR) - ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); + snowFactor = ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); # else - ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); + snowFactor = ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); glossiness = glossiness.xxxx; # endif +// blend lod blend color to snow color +# if defined(LOD_LAND_BLEND) +# if defined(TRUE_PBR) + // convert linear pbr color to vanilla, ugly but works + lodLandColor.rgb = lerp(lodLandColor.rgb, LinearToGamma(baseColor.xyz), snowFactor); +# else + lodLandColor.rgb = lerp(lodLandColor.rgb, baseColor.xyz, snowFactor); +# endif +# endif + + # if !defined(DRAW_IN_WORLDSPACE) // && (defined(SKINNED) || !defined(MODELSPACENORMALS)) [flatten] if (!input.WorldSpace) modelNormal.xyz = mul(transpose(input.World[eyeIndex]), float4(worldSpaceNormal, 0)); @@ -2151,15 +2201,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace input.TBN2.z = worldSpaceVertexNormal[2]; # endif - uint numClusteredLights = 0; - uint totalLightCount = strictLights[0].NumStrictLights; - uint clusterIndex = 0; - uint lightOffset = 0; - if (inWorld && LightLimitFix::GetClusterIndex(screenUV, viewPosition.z, clusterIndex)) { - numClusteredLights = lightGrid[clusterIndex].lightCount; - totalLightCount += numClusteredLights; - lightOffset = lightGrid[clusterIndex].offset; - } + uint contactShadowSteps = round(4.0 * (1.0 - saturate(viewPosition.z / 1024.0))); diff --git a/src/Features/SnowCover.cpp b/src/Features/SnowCover.cpp index 5b432338e6..f59afc0c0f 100644 --- a/src/Features/SnowCover.cpp +++ b/src/Features/SnowCover.cpp @@ -81,7 +81,7 @@ float SnowCover::CalculateWeatherTransitionPercentage(float skyCurrentWeatherPct return weatherTransitionPercentage; } -void SnowCover::CalculateWetness(RE::TESWeather* weather, RE::Sky* sky, float seconds, float& weatherWetnessDepth, float& weatherPuddleDepth) +void SnowCover::CalculateWetness(RE::TESWeather* weather, RE::Sky* sky, float seconds, float& weatherWetnessDepth) { float wetnessDepthDelta = CLEAR_DAY_DELTA_PER_SECOND * WETNESS_SCALE * seconds; float puddleDepthDelta = CLEAR_DAY_DELTA_PER_SECOND * PUDDLE_SCALE * seconds; @@ -101,7 +101,6 @@ void SnowCover::CalculateWetness(RE::TESWeather* weather, RE::Sky* sky, float se } weatherWetnessDepth = wetnessDepthDelta > 0 ? std::min(weatherWetnessDepth + wetnessDepthDelta, MAX_WETNESS_DEPTH) : std::max(weatherWetnessDepth + wetnessDepthDelta, 0.0f); - weatherPuddleDepth = puddleDepthDelta > 0 ? std::min(weatherPuddleDepth + puddleDepthDelta, MAX_PUDDLE_DEPTH) : std::max(weatherPuddleDepth + puddleDepthDelta, 0.0f); } void SnowCover::Draw(const RE::BSShader*, const uint32_t) @@ -115,8 +114,8 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() currentWeatherID = 0; uint32_t previousLastWeatherID = lastWeatherID; lastWeatherID = 0; - float currentWeatherRaining = 0.0f; - float lastWeatherRaining = 0.0f; + float currentWeatherSnowing = 0.0f; + float lastWeatherSnowing = 0.0f; float weatherTransitionPercentage = previousWeatherTransitionPercentage; if (settings.EnableSnowCover) { @@ -125,16 +124,15 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() if (sky->mode.get() == RE::Sky::Mode::kFull) { if (auto currentWeather = sky->currentWeather) { if (currentWeather->precipitationData && currentWeather->data.flags.any(RE::TESWeather::WeatherDataFlag::kSnow)) { - float rainDensity = currentWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity)].f; - float rainGravity = currentWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kGravityVelocity)].f; - currentWeatherRaining = std::clamp(((rainDensity * rainGravity) / AVERAGE_RAIN_VOLUME), MIN_RAINDROP_CHANCE_MULTIPLIER, MAX_RAINDROP_CHANCE_MULTIPLIER); + float particleDensity = currentWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity)].f; + float particleGravity = currentWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kGravityVelocity)].f; + currentWeatherSnowing = std::clamp(((particleDensity * particleGravity) / AVERAGE_RAIN_VOLUME), MIN_RAINDROP_CHANCE_MULTIPLIER, MAX_RAINDROP_CHANCE_MULTIPLIER); } currentWeatherID = currentWeather->GetFormID(); if (auto calendar = RE::Calendar::GetSingleton()) { auto time = calendar->GetTime(); data.Month = static_cast(time.tm_mon + (time.tm_mday + (time.tm_hour + (time.tm_min + time.tm_sec / 61.0) / 60.0) / 24.0) / 32.0); - float currentWeatherWetnessDepth = wetnessDepth; - float currentWeatherPuddleDepth = puddleDepth; + float currentWeatherWetnessDepth = snowDepth; float currentGameTime = calendar->GetCurrentGameTime() * SECONDS_IN_A_DAY; lastGameTimeValue = lastGameTimeValue == 0 ? currentGameTime : lastGameTimeValue; float seconds = currentGameTime - lastGameTimeValue; @@ -144,28 +142,25 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() // If too much time has passed, snap wetness depths to the current weather. seconds = 0.0f; currentWeatherWetnessDepth = 0.0f; - currentWeatherPuddleDepth = 0.0f; weatherTransitionPercentage = DEFAULT_TRANSITION_PERCENTAGE; - CalculateWetness(currentWeather, sky, 1.0f, currentWeatherWetnessDepth, currentWeatherPuddleDepth); - wetnessDepth = currentWeatherWetnessDepth > 0 ? MAX_WETNESS_DEPTH : 0.0f; - puddleDepth = currentWeatherPuddleDepth > 0 ? MAX_PUDDLE_DEPTH : 0.0f; + CalculateWetness(currentWeather, sky, 1.0f, currentWeatherWetnessDepth); + snowDepth = currentWeatherWetnessDepth > 0 ? MAX_WETNESS_DEPTH : 0.0f; } - if (seconds > 0 || (seconds < 0 && (wetnessDepth > 0 || puddleDepth > 0))) { + if (seconds > 0 || (seconds < 0 && snowDepth > 0)) { weatherTransitionPercentage = DEFAULT_TRANSITION_PERCENTAGE; - float lastWeatherWetnessDepth = wetnessDepth; - float lastWeatherPuddleDepth = puddleDepth; + float lastWeatherWetnessDepth = snowDepth; seconds *= MIN_WEATHER_TRANSITION_SPEED + (MAX_WEATHER_TRANSITION_SPEED - MIN_WEATHER_TRANSITION_SPEED) / 2.0f; - CalculateWetness(currentWeather, sky, seconds, currentWeatherWetnessDepth, currentWeatherPuddleDepth); + CalculateWetness(currentWeather, sky, seconds, currentWeatherWetnessDepth); // If there is a lastWeather, figure out what type it is and set the wetness if (auto lastWeather = sky->lastWeather) { lastWeatherID = lastWeather->GetFormID(); - CalculateWetness(lastWeather, sky, seconds, lastWeatherWetnessDepth, lastWeatherPuddleDepth); + CalculateWetness(lastWeather, sky, seconds, lastWeatherWetnessDepth); // If it was raining, wait to transition until precipitation ends, otherwise use the current weather's fade in if (lastWeather->precipitationData && lastWeather->data.flags.any(RE::TESWeather::WeatherDataFlag::kRainy)) { - float rainDensity = lastWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity)].f; - float rainGravity = lastWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kGravityVelocity)].f; - lastWeatherRaining = std::clamp(((rainDensity * rainGravity) / AVERAGE_RAIN_VOLUME), MIN_RAINDROP_CHANCE_MULTIPLIER, MAX_RAINDROP_CHANCE_MULTIPLIER); + float particleDensity = lastWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity)].f; + float particleGravity = lastWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kGravityVelocity)].f; + lastWeatherSnowing = std::clamp(((particleDensity * particleGravity) / AVERAGE_RAIN_VOLUME), MIN_RAINDROP_CHANCE_MULTIPLIER, MAX_RAINDROP_CHANCE_MULTIPLIER); weatherTransitionPercentage = CalculateWeatherTransitionPercentage(sky->currentWeatherPct, lastWeather->data.precipitationEndFadeOut, false); } else { weatherTransitionPercentage = CalculateWeatherTransitionPercentage(sky->currentWeatherPct, currentWeather->data.precipitationBeginFadeIn, true); @@ -173,14 +168,13 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() } // Transition between CurrentWeather and LastWeather depth values - wetnessDepth = std::lerp(lastWeatherWetnessDepth, currentWeatherWetnessDepth, weatherTransitionPercentage); - puddleDepth = std::lerp(lastWeatherPuddleDepth, currentWeatherPuddleDepth, weatherTransitionPercentage); + snowDepth = std::lerp(lastWeatherWetnessDepth, currentWeatherWetnessDepth, weatherTransitionPercentage); } else { lastWeatherID = previousLastWeatherID; } // Calculate the wetness value from the water depth - data.SnowAmount = std::min(wetnessDepth, MAX_WETNESS); + data.SnowAmount = std::min(snowDepth, MAX_WETNESS); previousWeatherTransitionPercentage = weatherTransitionPercentage; } } @@ -188,10 +182,10 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() } } - static size_t rainTimer = 0; // size_t for precision + static size_t snowTimer = 0; // size_t for precision if (!RE::UI::GetSingleton()->GameIsPaused()) // from lightlimitfix - rainTimer += (size_t)(RE::GetSecondsSinceLastFrame() * 1000); // BSTimer::delta is always 0 for some reason - data.TimeSnowing = rainTimer / 1000.f; + snowTimer += (size_t)(RE::GetSecondsSinceLastFrame() * 1000); // BSTimer::delta is always 0 for some reason + data.TimeSnowing = snowTimer / 1000.f; data.settings = settings; @@ -202,10 +196,19 @@ void SnowCover::SetupResources() { auto& device = State::GetSingleton()->device; auto& context = State::GetSingleton()->context; - DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow.dds", nullptr, &views.at(0)); - DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow_n.dds", nullptr, &views.at(1)); - DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow_rmaos.dds", nullptr, &views.at(2)); - DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow_p.dds", nullptr, &views.at(3)); + HRESULT hr = DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow.dds", nullptr, &views.at(0)); + if (hr != S_OK) + logger::warn("Snow Cover: Error loading diffuse texture: {}", hr); + hr = DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow_n.dds", nullptr, &views.at(1)); + if (hr != S_OK) + logger::warn("Snow Cover: Error loading normal texture: {}", hr); + hr = DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow_rmaos.dds", nullptr, &views.at(2)); + if (hr != S_OK) + logger::warn("Snow Cover: Error loading RMAOS texture: {}", hr); + hr = DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow_p.dds", nullptr, &views.at(3)); + if (hr != S_OK) + logger::warn("Snow Cover: Error loading parallax texture: {}", hr); + } void SnowCover::Prepass() diff --git a/src/Features/SnowCover.h b/src/Features/SnowCover.h index d601470c6e..50beb2a552 100644 --- a/src/Features/SnowCover.h +++ b/src/Features/SnowCover.h @@ -61,8 +61,7 @@ struct SnowCover : Feature std::array views; bool requiresUpdate = true; - float wetnessDepth = 0.0f; - float puddleDepth = 0.0f; + float snowDepth = 0.0f; float lastGameTimeValue = 0.0f; uint32_t currentWeatherID = 0; uint32_t lastWeatherID = 0; @@ -81,7 +80,7 @@ struct SnowCover : Feature virtual void RestoreDefaultSettings(); float CalculateWeatherTransitionPercentage(float skyCurrentWeatherPct, float beginFade, bool fadeIn); - void CalculateWetness(RE::TESWeather* weather, RE::Sky* sky, float seconds, float& wetness, float& puddleWetness); + void CalculateWetness(RE::TESWeather* weather, RE::Sky* sky, float seconds, float& wetness); virtual inline void PostPostLoad() override { Hooks::Install(); } From 8a47c9fe03062e9fceb3108baaac624ee0da07b5 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Sun, 15 Sep 2024 21:23:15 +0000 Subject: [PATCH 018/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package/Shaders/Lighting.hlsl | 16 ++++++---------- src/Features/SnowCover.cpp | 3 +-- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 565e693578..5d2f7a58e9 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1779,7 +1779,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif // defined (HAIR) baseColor.rgb *= vertexColor; - # if defined(LIGHT_LIMIT_FIX) uint numClusteredLights = 0; uint totalLightCount = strictLights[0].NumStrictLights; @@ -1802,9 +1801,9 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float snowOcclusion = inWorld ? 1 : 0; # endif -#if defined(LODLANDNOISE) +# if defined(LODLANDNOISE) //snowOcclusion *= 0.8 + noise*0.2; -#endif +# endif # if defined(LIGHT_LIMIT_FIX) [loop] for (uint lightIndex = 0; lightIndex < totalLightCount; lightIndex++) @@ -1858,15 +1857,14 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace // blend lod blend color to snow color # if defined(LOD_LAND_BLEND) -# if defined(TRUE_PBR) - // convert linear pbr color to vanilla, ugly but works - lodLandColor.rgb = lerp(lodLandColor.rgb, LinearToGamma(baseColor.xyz), snowFactor); +# if defined(TRUE_PBR) + // convert linear pbr color to vanilla, ugly but works + lodLandColor.rgb = lerp(lodLandColor.rgb, LinearToGamma(baseColor.xyz), snowFactor); # else - lodLandColor.rgb = lerp(lodLandColor.rgb, baseColor.xyz, snowFactor); + lodLandColor.rgb = lerp(lodLandColor.rgb, baseColor.xyz, snowFactor); # endif # endif - # if !defined(DRAW_IN_WORLDSPACE) // && (defined(SKINNED) || !defined(MODELSPACENORMALS)) [flatten] if (!input.WorldSpace) modelNormal.xyz = mul(transpose(input.World[eyeIndex]), float4(worldSpaceNormal, 0)); @@ -2201,8 +2199,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace input.TBN2.z = worldSpaceVertexNormal[2]; # endif - - uint contactShadowSteps = round(4.0 * (1.0 - saturate(viewPosition.z / 1024.0))); [loop] for (uint lightIndex = 0; lightIndex < totalLightCount; lightIndex++) diff --git a/src/Features/SnowCover.cpp b/src/Features/SnowCover.cpp index f59afc0c0f..20f091ac74 100644 --- a/src/Features/SnowCover.cpp +++ b/src/Features/SnowCover.cpp @@ -159,7 +159,7 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() // If it was raining, wait to transition until precipitation ends, otherwise use the current weather's fade in if (lastWeather->precipitationData && lastWeather->data.flags.any(RE::TESWeather::WeatherDataFlag::kRainy)) { float particleDensity = lastWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity)].f; - float particleGravity = lastWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kGravityVelocity)].f; + float particleGravity = lastWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kGravityVelocity)].f; lastWeatherSnowing = std::clamp(((particleDensity * particleGravity) / AVERAGE_RAIN_VOLUME), MIN_RAINDROP_CHANCE_MULTIPLIER, MAX_RAINDROP_CHANCE_MULTIPLIER); weatherTransitionPercentage = CalculateWeatherTransitionPercentage(sky->currentWeatherPct, lastWeather->data.precipitationEndFadeOut, false); } else { @@ -208,7 +208,6 @@ void SnowCover::SetupResources() hr = DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow_p.dds", nullptr, &views.at(3)); if (hr != S_OK) logger::warn("Snow Cover: Error loading parallax texture: {}", hr); - } void SnowCover::Prepass() From 500d608ba95a21138612ee10853dc4e7da38214e Mon Sep 17 00:00:00 2001 From: Exist Date: Thu, 19 Sep 2024 12:24:28 +0200 Subject: [PATCH 019/131] make more gradual blending --- .../Shaders/SnowCover/SnowCover.hlsli | 76 +++--- package/Shaders/DistantTree.hlsl | 2 +- package/Shaders/Lighting.hlsl | 226 +++++++++--------- package/Shaders/RunGrass.hlsl | 2 +- 4 files changed, 159 insertions(+), 147 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 83d47f18dd..d5eba2d91c 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -1,6 +1,8 @@ #include "Common/SharedData.hlsli" #if defined(PSHADER) +namespace SnowCover{ + Texture2D SnowDiffuse : register(t73); Texture2D SnowNormal : register(t74); Texture2D SnowRMAOS : register(t75); @@ -78,7 +80,18 @@ float GetEnvironmentalMultiplier(float3 p) summerToWinter = 1 - summerToWinter; } - return (GetHeightMult(p) - lerp(snowCoverSettings.SummerHeightOffset, snowCoverSettings.WinterHeightOffset, summerToWinter)) / 1000; + return (GetHeightMult(p) - lerp(snowCoverSettings.SummerHeightOffset, snowCoverSettings.WinterHeightOffset, summerToWinter)) / 10000; +} + +void ApplyFoliageColor(inout float3 color, float env_mult){ + float gmult = saturate(env_mult - snowCoverSettings.FoliageHeightOffset / 1000); + float3 hsv = RGBtoHSV(color); + if (hsv.x > 0.5625) + hsv.x = frac(lerp(hsv.x, 1.125, gmult)); + else + hsv.x = lerp(hsv.x, 0.125, gmult); + //hsv.z = pow(hsv.z, 1+gmult*0.5); + color = HSVtoRGB(hsv); } void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, float3 p, float skylight) @@ -86,14 +99,7 @@ void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, float3 p, fl float env_mult = GetEnvironmentalMultiplier(p); float mult = saturate(pow(abs(worldNormal.z), 1)) * saturate(env_mult) * skylight; if (snowCoverSettings.AffectFoliageColor) { - float gmult = saturate(env_mult - snowCoverSettings.FoliageHeightOffset / 1000); - float3 hsv = RGBtoHSV(color); - if (hsv.x > 0.5625) - hsv.x = frac(lerp(hsv.x, 1.125, gmult)); - else - hsv.x = lerp(hsv.x, 0.125, gmult); - //hsv.z = pow(hsv.z, 1+gmult*0.5); - color = HSVtoRGB(hsv); + ApplyFoliageColor(color, env_mult); } float2 uv = snowCoverSettings.UVScale * p.xy / 100; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; @@ -102,8 +108,10 @@ void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, float3 p, fl # endif color = lerp(color, diffuse, mult); } + + # if !defined(BASIC_SNOW_COVER) -float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh0, inout float2 uv, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) +float ApplySnowBase(inout float3 worldNormal, inout float sh0, inout float2 uv, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { if (snowCoverSettings.Sky < 3) // 3 = exterior return 0; @@ -113,23 +121,17 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh # else float disp = sh0 - 0.5; # endif - float parallax = 0.1 * snowCoverSettings.ParallaxScale * (SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale * p.xy / 100).x - 0.5); + float raw_p = SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale * p.xy / 1000).x; + float parallax = 0.1 * snowCoverSettings.ParallaxScale * (raw_p - 0.5); float env_mult = GetEnvironmentalMultiplier(p) + parallax + disp * underDispScale * 0.1; - waterDist = smoothstep(-32, 8, -waterDist); - float mult = smoothstep(0, 1, pow(max(0, worldNormal.z), 2) - waterDist) * skylight * smoothstep(0, 1, env_mult - waterDist); //-smoothstep(-32, 8, -waterDist) + waterDist = smoothstep(-64, 8, -waterDist); + float disp_factor = 0; +#if defined(TRUE_PBR) + if(extendedMaterialSettings.ExtendShadows) + disp_factor = - disp * underDispScale; +#endif // + float mult = skylight * (smoothstep(0.3, 0.5, (pow(max(0, worldNormal.z), 2)+disp_factor) *(max(0, env_mult - waterDist)*(0.5+0.5*raw_p + disp_factor) + snowCoverSettings.SnowAmount))); //-smoothstep(-32, 8, -waterDist) uv = snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; -# if defined(TREE_ANIM) - if (snowCoverSettings.AffectFoliageColor) { - float gmult = saturate(env_mult - snowCoverSettings.FoliageHeightOffset / 1000); - float3 hsv = RGBtoHSV(color); - if (hsv.x > 0.5625) - hsv.x = frac(lerp(hsv.x, 1.125, gmult)); - else - hsv.x = lerp(hsv.x, 0.125, gmult); - //hsv.z = pow(hsv.z, 1+gmult*0.5); - color = HSVtoRGB(hsv); - } -# endif if (mult < 0.01) return 0; sh0 = saturate(sh0 + mult * parallax); @@ -137,14 +139,14 @@ float ApplySnowBase(inout float3 color, inout float3 worldNormal, inout float sh } # if defined(TRUE_PBR) -float ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) +float ApplySnowPBR(inout float3 diffuse, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { float2 uv; - float mult = ApplySnowBase(color, worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); + float mult = ApplySnowBase(worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); if (mult <= 0.0) return 0; - float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; - color = lerp(color, diffuse, mult); + diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; + //diffuse = frac(float3(uv.x, uv.y, 0)); float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); //worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normal), mult)); worldNormal = normalize(lerp(worldNormal, normal, mult)); @@ -161,20 +163,20 @@ float ApplySnowPBR(inout float3 color, inout float3 worldNormal, inout PBR::Surf } # else -float ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) +float ApplySnow(inout float3 diffuse, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { float2 uv; - //color = sRGB2Lin(color); - float mult = ApplySnowBase(color, worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); + float mult = ApplySnowBase(worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); if (mult <= 0.0) return 0; - float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; - diffuse = pow(LinearToGamma(diffuse) / PI, 1 / 1.5); + // apparently LOD landscape color sampler clamps uvs + diffuse = SnowDiffuse.Sample(SampColorSampler, frac(uv)).rgb; + //diffuse = frac(float3(uv.x, uv.y, 0)); + diffuse = pow(LinearToGamma(diffuse) / PI, 1/1.5); float4 rmaos = SnowRMAOS.Sample(SampColorSampler, uv); glossiness = lerp(glossiness, 1 - rmaos.x, mult); // yes these are named wrong not my fault bye shininess = lerp(shininess, 25 * 500 * rmaos.w, mult); diffuse *= rmaos.z; - color = lerp(color, diffuse, mult); float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); worldNormal = normalize(lerp(worldNormal, normal, mult)); //glossiness = lerp(glossiness, 0.5 * pow(v * s, 3.0), mult); @@ -183,4 +185,6 @@ float ApplySnow(inout float3 color, inout float3 worldNormal, inout float glossi } # endif # endif -#endif \ No newline at end of file + +} +#endif diff --git a/package/Shaders/DistantTree.hlsl b/package/Shaders/DistantTree.hlsl index 47cff731dc..9f72176e56 100644 --- a/package/Shaders/DistantTree.hlsl +++ b/package/Shaders/DistantTree.hlsl @@ -222,7 +222,7 @@ PS_OUTPUT main(PS_INPUT input) # if defined(SNOW_COVER) if (snowCoverSettings.EnableSnowCover) - ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz, 1); + SnowCover::ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz, 1); # endif # if defined(DEFERRED) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 5d2f7a58e9..19f9efe96d 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1009,7 +1009,7 @@ float GetSnowParameterY(float texProjTmp, float alpha) # if defined(SNOW_COVER) # undef SNOW -# undef SPARKLE +//# undef SPARKLE # include "SnowCover/SnowCover.hlsli" # endif @@ -1078,7 +1078,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if defined(LANDSCAPE) float mipLevels[6]; - float sh0 = 0; + float sh0 = 0.5; float pixelOffset; # if defined(EMAT) @@ -1089,7 +1089,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif # else float mipLevel; - float sh0 = 0; + float sh0 = 0.5; float pixelOffset; # if defined(EMAT) @@ -1503,21 +1503,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace baseColor += input.LandBlendWeights2.yyyy * landColor6; } -# if defined(LOD_LAND_BLEND) - float4 lodLandColor = TexLandLodBlend1Sampler.Sample(SampLandLodBlend1Sampler, input.TexCoord0.zw); - float lodBlendParameter = GetLodLandBlendParameter(lodLandColor.xyz); - float lodBlendMask = TexLandLodBlend2Sampler.Sample(SampLandLodBlend2Sampler, 3.0.xx * input.TexCoord0.zw).x; - float lodLandFadeFactor = GetLodLandBlendMultiplier(lodBlendParameter, lodBlendMask); - float lodLandBlendFactor = LODTexParams.z * input.LandBlendWeights2.w; - normal.xyz = lerp(normal.xyz, float3(0, 0, 1), lodLandBlendFactor); - -# if !defined(TRUE_PBR) - baseColor.w = 0; - baseColor = lerp(baseColor, lodLandColor * lodLandFadeFactor, lodLandBlendFactor); - glossiness = lerp(glossiness, 0, lodLandBlendFactor); -# endif -# endif // LOD_LAND_BLEND # if defined(SNOW) && !defined(TRUE_PBR) useSnowSpecular = landSnowMask != 0.0; @@ -1560,86 +1546,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace shadowColor = TexShadowMaskSampler.Sample(SampShadowMaskSampler, shadowUV); } - float projectedMaterialWeight = 0; - float projWeight = 0; - -# if defined(PROJECTED_UV) - float2 projNoiseUv = ProjectedUVParams.zz * input.TexCoord0.zw; - float projNoise = TexCharacterLightProjNoiseSampler.Sample(SampCharacterLightProjNoiseSampler, projNoiseUv).x; - float3 texProj = normalize(input.TexProj); -# if defined(TREE_ANIM) || defined(LODOBJECTSHD) - float vertexAlpha = 1; -# else - float vertexAlpha = input.Color.w; -# endif // defined (TREE_ANIM) || defined (LODOBJECTSHD) - projWeight = -ProjectedUVParams.x * projNoise + (dot(modelNormal.xyz, texProj) * vertexAlpha - ProjectedUVParams.w); -# if defined(LODOBJECTSHD) - projWeight += (-0.5 + input.Color.w) * 2.5; -# endif // LODOBJECTSHD -# if defined(SPARKLE) - if (projWeight < 0) - discard; - - modelNormal.xyz = projectedNormal; -# if defined(SNOW) - psout.Parameters.y = 1; -# endif // SNOW -# elif !defined(FACEGEN) && !defined(PARALLAX) && !defined(SPARKLE) - if (ProjectedUVParams3.w > 0.5) { - float2 projNormalDiffuseUv = ProjectedUVParams3.x * projNoiseUv; - float3 projNormal = TransformNormal(TexProjNormalSampler.Sample(SampProjNormalSampler, projNormalDiffuseUv).xyz); - float2 projDetailNormalUv = ProjectedUVParams3.y * projNoiseUv; - float3 projDetailNormal = TexProjDetail.Sample(SampProjDetailSampler, projDetailNormalUv).xyz; - float3 finalProjNormal = normalize(TransformNormal(projDetailNormal) * float3(1, 1, projNormal.z) + float3(projNormal.xy, 0)); - float3 projBaseColor = TexProjDiffuseSampler.Sample(SampProjDiffuseSampler, projNormalDiffuseUv).xyz * ProjectedUVParams2.xyz; - projectedMaterialWeight = smoothstep(0, 1, 5 * (0.1 + projWeight)); -# if defined(TRUE_PBR) - projBaseColor = saturate(EnvmapData.xyz * projBaseColor); - rawRMAOS.xyw = lerp(rawRMAOS.xyw, float3(ParallaxOccData.x, 0, ParallaxOccData.y), projectedMaterialWeight); - float4 projectedGlintParameters = 0; - if ((PBRFlags & TruePBR_ProjectedGlint) != 0) { - projectedGlintParameters = SparkleParams; - } - glintParameters = lerp(glintParameters, projectedGlintParameters, projectedMaterialWeight); -# endif - normal.xyz = lerp(normal.xyz, finalProjNormal, projectedMaterialWeight); - baseColor.xyz = lerp(baseColor.xyz, projBaseColor, projectedMaterialWeight); - -# if defined(SNOW) - useSnowDecalSpecular = true; - psout.Parameters.y = GetSnowParameterY(projectedMaterialWeight, baseColor.w); -# endif // SNOW - } else { - if (projWeight > 0) { - baseColor.xyz = ProjectedUVParams2.xyz; -# if defined(SNOW) - useSnowDecalSpecular = true; - psout.Parameters.y = GetSnowParameterY(projWeight, baseColor.w); -# endif // SNOW - } else { -# if defined(SNOW) - psout.Parameters.y = 0; -# endif // SNOW - } - } - -# if defined(SPECULAR) - useSnowSpecular = useSnowDecalSpecular; -# endif // SPECULAR -# endif // SPARKLE - -# elif defined(SNOW) -# if defined(LANDSCAPE) - psout.Parameters.y = landSnowMask; -# else - psout.Parameters.y = baseColor.w; -# endif // LANDSCAPE -# endif - -# if defined(WORLD_MAP) - baseColor.xyz = GetWorldMapBaseColor(rawBaseColor.xyz, baseColor.xyz, projWeight); -# endif // WORLD_MAP float3 worldSpaceNormal = modelNormal; @@ -1681,7 +1588,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace pbrSurfaceProperties.SubsurfaceColor *= sampledSubsurfaceProperties.xyz; pbrSurfaceProperties.Thickness *= sampledSubsurfaceProperties.w; } - pbrSurfaceProperties.Thickness = lerp(pbrSurfaceProperties.Thickness, 1, projectedMaterialWeight); } else if ((PBRFlags & TruePBR_TwoLayer) != 0) { @@ -1717,7 +1623,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } # endif } - pbrSurfaceProperties.CoatStrength = lerp(pbrSurfaceProperties.CoatStrength, 0, projectedMaterialWeight); } [branch] if ((PBRFlags & TruePBR_Fuzz) != 0) @@ -1730,7 +1635,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace pbrSurfaceProperties.FuzzColor *= sampledFuzzProperties.xyz; pbrSurfaceProperties.FuzzWeight *= sampledFuzzProperties.w; } - pbrSurfaceProperties.FuzzWeight = lerp(pbrSurfaceProperties.FuzzWeight, 0, projectedMaterialWeight); } # endif @@ -1802,7 +1706,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif # if defined(LODLANDNOISE) - //snowOcclusion *= 0.8 + noise*0.2; + snowOcclusion *= 0.9 + noise*0.1; # endif # if defined(LIGHT_LIMIT_FIX) @@ -1835,7 +1739,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif float underDispScale = 1.0; float3 pos = (input.WorldPosition + CameraPosAdjust[eyeIndex]).xyz; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) && defined(EMAT) # if defined(LANDSCAPE) underDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, @@ -1847,23 +1751,41 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace //float3 pos = float3(diffuseUv.x, diffuseUv.y, 0); float snowFactor = 0; + float3 snowDiffuse = baseColor.rgb; if (snowCoverSettings.EnableSnowCover) # if defined(TRUE_PBR) - snowFactor = ApplySnowPBR(baseColor.xyz, worldSpaceNormal, pbrSurfaceProperties, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); + snowFactor = SnowCover::ApplySnowPBR(snowDiffuse, worldSpaceNormal, pbrSurfaceProperties, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); # else - snowFactor = ApplySnow(baseColor.xyz, worldSpaceNormal, glossiness.x, shininess, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); + snowFactor = SnowCover::ApplySnow(snowDiffuse, worldSpaceNormal, glossiness.x, shininess, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); glossiness = glossiness.xxxx; # endif -// blend lod blend color to snow color +# if defined(TREE_ANIM) + SnowCover::ApplyFoliageColor(baseColor.rgb, SnowCover::GetEnvironmentalMultiplier(pos)); +# endif + baseColor.rgb = lerp(baseColor.rgb, snowDiffuse, snowFactor); + # if defined(LOD_LAND_BLEND) + float4 lodLandColor = TexLandLodBlend1Sampler.Sample(SampLandLodBlend1Sampler, input.TexCoord0.zw); # if defined(TRUE_PBR) - // convert linear pbr color to vanilla, ugly but works - lodLandColor.rgb = lerp(lodLandColor.rgb, LinearToGamma(baseColor.xyz), snowFactor); + // this should probably be converted from linear but it just works + lodLandColor.rgb = lerp(lodLandColor.rgb, snowDiffuse, snowFactor); # else - lodLandColor.rgb = lerp(lodLandColor.rgb, baseColor.xyz, snowFactor); + lodLandColor.rgb = lerp(lodLandColor.rgb, snowDiffuse, snowFactor); # endif -# endif + float lodBlendParameter = GetLodLandBlendParameter(lodLandColor.xyz); + float lodBlendMask = TexLandLodBlend2Sampler.Sample(SampLandLodBlend2Sampler, 3.0.xx * input.TexCoord0.zw).x; + float lodLandFadeFactor = GetLodLandBlendMultiplier(lodBlendParameter, lodBlendMask); + float lodLandBlendFactor = LODTexParams.z * input.LandBlendWeights2.w; + //lodLandBlendFactor = lerp(lodLandBlendFactor, 0, snowFactor); + normal.xyz = lerp(normal.xyz, float3(0, 0, 1), lodLandBlendFactor); + +# if !defined(TRUE_PBR) + baseColor.w = 0; + baseColor = lerp(baseColor, lodLandColor * lodLandFadeFactor, lodLandBlendFactor); + glossiness = lerp(glossiness, 0, lodLandBlendFactor); +# endif +# endif // LOD_LAND_BLEND # if !defined(DRAW_IN_WORLDSPACE) // && (defined(SKINNED) || !defined(MODELSPACENORMALS)) [flatten] if (!input.WorldSpace) @@ -1872,10 +1794,96 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif modelNormal.xyz = worldSpaceNormal; modelNormal.xyz = normalize(modelNormal.xyz); +# endif // SNOW_COVER + + float projectedMaterialWeight = 0; + float projWeight = 0; +# if defined(PROJECTED_UV) + float2 projNoiseUv = ProjectedUVParams.zz * input.TexCoord0.zw; + float projNoise = TexCharacterLightProjNoiseSampler.Sample(SampCharacterLightProjNoiseSampler, projNoiseUv).x; + float3 texProj = normalize(input.TexProj); +# if defined(TREE_ANIM) || defined(LODOBJECTSHD) + float vertexAlpha = 1; +# else + float vertexAlpha = input.Color.w; +# endif // defined (TREE_ANIM) || defined (LODOBJECTSHD) + projWeight = -ProjectedUVParams.x * projNoise + (dot(modelNormal.xyz, texProj) * vertexAlpha - ProjectedUVParams.w); +# if defined(LODOBJECTSHD) + projWeight += (-0.5 + input.Color.w) * 2.5; +# endif // LODOBJECTSHD +# if defined(SPARKLE) + if (projWeight < 0) + discard; + + modelNormal.xyz = projectedNormal; +# if defined(SNOW) + psout.Parameters.y = 1; +# endif // SNOW +# elif !defined(FACEGEN) && !defined(PARALLAX) && !defined(SPARKLE) && !defined(MULTI_LAYER_PARALLAX) && !defined(LANDSCAPE) + if (ProjectedUVParams3.w > 0.5) { + float2 projNormalDiffuseUv = ProjectedUVParams3.x * projNoiseUv; + float3 projNormal = TransformNormal(TexProjNormalSampler.Sample(SampProjNormalSampler, projNormalDiffuseUv).xyz); + float2 projDetailNormalUv = ProjectedUVParams3.y * projNoiseUv; + float3 projDetailNormal = TexProjDetail.Sample(SampProjDetailSampler, projDetailNormalUv).xyz; + float3 finalProjNormal = normalize(TransformNormal(projDetailNormal) * float3(1, 1, projNormal.z) + float3(projNormal.xy, 0)); + float3 projBaseColor = TexProjDiffuseSampler.Sample(SampProjDiffuseSampler, projNormalDiffuseUv).xyz * ProjectedUVParams2.xyz; + projectedMaterialWeight = smoothstep(0, 1, 5 * (0.1 + projWeight)); +# if defined(SNOW_COVER) + if(snowCoverSettings.EnableSnowCover) + projectedMaterialWeight *= saturate(1 - SnowCover::GetEnvironmentalMultiplier(pos)); + +# endif +# if defined(TRUE_PBR) + pbrSurfaceProperties.Thickness = lerp(pbrSurfaceProperties.Thickness, 1, projectedMaterialWeight); + pbrSurfaceProperties.CoatStrength = lerp(pbrSurfaceProperties.CoatStrength, 0, projectedMaterialWeight); + pbrSurfaceProperties.FuzzWeight = lerp(pbrSurfaceProperties.FuzzWeight, 0, projectedMaterialWeight); + projBaseColor = saturate(EnvmapData.xyz * projBaseColor); + rawRMAOS.xyw = lerp(rawRMAOS.xyw, float3(ParallaxOccData.x, 0, ParallaxOccData.y), projectedMaterialWeight); + float4 projectedGlintParameters = 0; + if ((PBRFlags & TruePBR_ProjectedGlint) != 0) { + projectedGlintParameters = SparkleParams; + } + glintParameters = lerp(glintParameters, projectedGlintParameters, projectedMaterialWeight); +# endif + normal.xyz = lerp(normal.xyz, finalProjNormal, projectedMaterialWeight); + baseColor.xyz = lerp(baseColor.xyz, projBaseColor, projectedMaterialWeight); + +# if defined(SNOW) + useSnowDecalSpecular = true; + psout.Parameters.y = GetSnowParameterY(projectedMaterialWeight, baseColor.w); +# endif // SNOW + } else { + if (projWeight > 0) { + baseColor.xyz = ProjectedUVParams2.xyz; +# if defined(SNOW) + useSnowDecalSpecular = true; + psout.Parameters.y = GetSnowParameterY(projWeight, baseColor.w); +# endif // SNOW + } else { +# if defined(SNOW) + psout.Parameters.y = 0; +# endif // SNOW + } + } + +# if defined(SPECULAR) + useSnowSpecular = useSnowDecalSpecular; +# endif // SPECULAR +# endif // SPARKLE + +# elif defined(SNOW) +# if defined(LANDSCAPE) + psout.Parameters.y = landSnowMask; +# else + psout.Parameters.y = baseColor.w; +# endif // LANDSCAPE # endif +# if defined(WORLD_MAP) + baseColor.xyz = GetWorldMapBaseColor(rawBaseColor.xyz, baseColor.xyz, projWeight); +# endif // WORLD_MAP - float waterRoughnessSpecular = 1; + float waterRoughnessSpecular = 1; # if defined(WETNESS_EFFECTS) float wetness = 0.0; diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index d44ff6f5cb..dade287f31 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -498,7 +498,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if defined(SNOW_COVER) snowOcclusion *= saturate(input.WorldPosition.z - GetWaterData(input.WorldPosition.xyz).w); if (snowCoverSettings.EnableSnowCover) - ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz, snowOcclusion); + SnowCover::ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz, snowOcclusion); # endif # if defined(TRUE_PBR) From 6640fe5dfe09a4304342005a6193562993b72916 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Thu, 19 Sep 2024 10:25:10 +0000 Subject: [PATCH 020/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Shaders/SnowCover/SnowCover.hlsli | 317 +++++++++--------- package/Shaders/Lighting.hlsl | 15 +- 2 files changed, 164 insertions(+), 168 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index d5eba2d91c..5d4047e7cc 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -1,188 +1,189 @@ #include "Common/SharedData.hlsli" #if defined(PSHADER) -namespace SnowCover{ - -Texture2D SnowDiffuse : register(t73); -Texture2D SnowNormal : register(t74); -Texture2D SnowRMAOS : register(t75); -Texture2D SnowParallax : register(t76); - -// https://blog.selfshadow.com/publications/blending-in-detail/ -// for when s = (0,0,1) -float3 MyReorientNormal(float3 n1, float3 n2) +namespace SnowCover { - n1 += float3(0, 0, 1); - n2 *= float3(-1, -1, 1); - return n1 * dot(n1, n2) / n1.z - n2; -} + Texture2D SnowDiffuse : register(t73); + Texture2D SnowNormal : register(t74); + Texture2D SnowRMAOS : register(t75); + Texture2D SnowParallax : register(t76); -// http://chilliant.blogspot.com/2010/11/rgbhsv-in-hlsl.html -float3 Hue(float H) -{ - float R = abs(H * 6 - 3) - 1; - float G = 2 - abs(H * 6 - 2); - float B = 2 - abs(H * 6 - 4); - return saturate(float3(R, G, B)); -} + // https://blog.selfshadow.com/publications/blending-in-detail/ + // for when s = (0,0,1) + float3 MyReorientNormal(float3 n1, float3 n2) + { + n1 += float3(0, 0, 1); + n2 *= float3(-1, -1, 1); -float3 HSVtoRGB(in float3 HSV) -{ - return ((Hue(HSV.x) - 1) * HSV.y + 1) * HSV.z; -} + return n1 * dot(n1, n2) / n1.z - n2; + } -float3 RGBtoHSV(in float3 RGB) -{ - float3 HSV = 0; - HSV.z = max(RGB.r, max(RGB.g, RGB.b)); - float M = min(RGB.r, min(RGB.g, RGB.b)); - float C = HSV.z - M; - - if (C != 0) { - HSV.y = C / HSV.z; - float3 Delta = (HSV.z - RGB) / C; - Delta.rgb -= Delta.brg; - Delta.rg += float2(2, 4); - if (RGB.r >= HSV.z) - HSV.x = Delta.b; - else if (RGB.g >= HSV.z) - HSV.x = Delta.r; - else - HSV.x = Delta.g; - HSV.x = frac(HSV.x / 6); + // http://chilliant.blogspot.com/2010/11/rgbhsv-in-hlsl.html + float3 Hue(float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); } - return HSV; -} -float GetHeightMult(float3 p) -{ - float height_tresh = p.z - snowCoverSettings.SnowHeightOffset - (p.x * 0.010569460362286 - p.y * 0.165389061732133 - p.x * p.x * 0.000000034552775 - p.x * p.y * 0.000000572526633 - p.y * p.y * 0.000000272913055 - p.x * p.x * p.x * 0.000000000001466 + p.x * p.x * p.y * 0.000000000000441 + p.x * p.y * p.y * 0.000000000003507 + p.y * p.y * p.y * 0.000000000006575); - return height_tresh; -} + float3 HSVtoRGB(in float3 HSV) + { + return ((Hue(HSV.x) - 1) * HSV.y + 1) * HSV.z; + } -float GetEnvironmentalMultiplier(float3 p) -{ - float maxMonth = max(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); - float minMonth = min(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); - float summerToWinter; - if (snowCoverSettings.Month > maxMonth) { - summerToWinter = (snowCoverSettings.Month - maxMonth) / (minMonth + 12 - maxMonth); - if (snowCoverSettings.MaxWinterMonth > snowCoverSettings.MaxSummerMonth) - summerToWinter = 1 - summerToWinter; - } else if (snowCoverSettings.Month < minMonth) { - summerToWinter = (12 - maxMonth + snowCoverSettings.Month) / (minMonth + 12 - maxMonth); - if (snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) - summerToWinter = 1 - summerToWinter; - } else { - summerToWinter = (snowCoverSettings.Month - minMonth) / (maxMonth - minMonth); - if (snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) - summerToWinter = 1 - summerToWinter; + float3 RGBtoHSV(in float3 RGB) + { + float3 HSV = 0; + HSV.z = max(RGB.r, max(RGB.g, RGB.b)); + float M = min(RGB.r, min(RGB.g, RGB.b)); + float C = HSV.z - M; + + if (C != 0) { + HSV.y = C / HSV.z; + float3 Delta = (HSV.z - RGB) / C; + Delta.rgb -= Delta.brg; + Delta.rg += float2(2, 4); + if (RGB.r >= HSV.z) + HSV.x = Delta.b; + else if (RGB.g >= HSV.z) + HSV.x = Delta.r; + else + HSV.x = Delta.g; + HSV.x = frac(HSV.x / 6); + } + return HSV; } - return (GetHeightMult(p) - lerp(snowCoverSettings.SummerHeightOffset, snowCoverSettings.WinterHeightOffset, summerToWinter)) / 10000; -} + float GetHeightMult(float3 p) + { + float height_tresh = p.z - snowCoverSettings.SnowHeightOffset - (p.x * 0.010569460362286 - p.y * 0.165389061732133 - p.x * p.x * 0.000000034552775 - p.x * p.y * 0.000000572526633 - p.y * p.y * 0.000000272913055 - p.x * p.x * p.x * 0.000000000001466 + p.x * p.x * p.y * 0.000000000000441 + p.x * p.y * p.y * 0.000000000003507 + p.y * p.y * p.y * 0.000000000006575); + return height_tresh; + } -void ApplyFoliageColor(inout float3 color, float env_mult){ - float gmult = saturate(env_mult - snowCoverSettings.FoliageHeightOffset / 1000); - float3 hsv = RGBtoHSV(color); - if (hsv.x > 0.5625) - hsv.x = frac(lerp(hsv.x, 1.125, gmult)); - else - hsv.x = lerp(hsv.x, 0.125, gmult); - //hsv.z = pow(hsv.z, 1+gmult*0.5); - color = HSVtoRGB(hsv); -} + float GetEnvironmentalMultiplier(float3 p) + { + float maxMonth = max(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); + float minMonth = min(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); + float summerToWinter; + if (snowCoverSettings.Month > maxMonth) { + summerToWinter = (snowCoverSettings.Month - maxMonth) / (minMonth + 12 - maxMonth); + if (snowCoverSettings.MaxWinterMonth > snowCoverSettings.MaxSummerMonth) + summerToWinter = 1 - summerToWinter; + } else if (snowCoverSettings.Month < minMonth) { + summerToWinter = (12 - maxMonth + snowCoverSettings.Month) / (minMonth + 12 - maxMonth); + if (snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) + summerToWinter = 1 - summerToWinter; + } else { + summerToWinter = (snowCoverSettings.Month - minMonth) / (maxMonth - minMonth); + if (snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) + summerToWinter = 1 - summerToWinter; + } + + return (GetHeightMult(p) - lerp(snowCoverSettings.SummerHeightOffset, snowCoverSettings.WinterHeightOffset, summerToWinter)) / 10000; + } -void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, float3 p, float skylight) -{ - float env_mult = GetEnvironmentalMultiplier(p); - float mult = saturate(pow(abs(worldNormal.z), 1)) * saturate(env_mult) * skylight; - if (snowCoverSettings.AffectFoliageColor) { - ApplyFoliageColor(color, env_mult); + void ApplyFoliageColor(inout float3 color, float env_mult) + { + float gmult = saturate(env_mult - snowCoverSettings.FoliageHeightOffset / 1000); + float3 hsv = RGBtoHSV(color); + if (hsv.x > 0.5625) + hsv.x = frac(lerp(hsv.x, 1.125, gmult)); + else + hsv.x = lerp(hsv.x, 0.125, gmult); + //hsv.z = pow(hsv.z, 1+gmult*0.5); + color = HSVtoRGB(hsv); } - float2 uv = snowCoverSettings.UVScale * p.xy / 100; - float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; + + void ApplySnowFoliage(inout float3 color, inout float3 worldNormal, float3 p, float skylight) + { + float env_mult = GetEnvironmentalMultiplier(p); + float mult = saturate(pow(abs(worldNormal.z), 1)) * saturate(env_mult) * skylight; + if (snowCoverSettings.AffectFoliageColor) { + ApplyFoliageColor(color, env_mult); + } + float2 uv = snowCoverSettings.UVScale * p.xy / 100; + float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; # if !defined(TRUE_PBR) - diffuse = pow(LinearToGamma(diffuse) / 3.141, 1 / 1.5); + diffuse = pow(LinearToGamma(diffuse) / 3.141, 1 / 1.5); # endif - color = lerp(color, diffuse, mult); -} - + color = lerp(color, diffuse, mult); + } # if !defined(BASIC_SNOW_COVER) -float ApplySnowBase(inout float3 worldNormal, inout float sh0, inout float2 uv, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) -{ - if (snowCoverSettings.Sky < 3) // 3 = exterior - return 0; - //float viewDist = max(1, sqrt(viewPos.z) / 512); + float ApplySnowBase(inout float3 worldNormal, inout float sh0, inout float2 uv, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) + { + if (snowCoverSettings.Sky < 3) // 3 = exterior + return 0; + //float viewDist = max(1, sqrt(viewPos.z) / 512); # if defined(TRUE_PBR) && defined(LANDSCAPE) - float disp = sh0; + float disp = sh0; # else - float disp = sh0 - 0.5; + float disp = sh0 - 0.5; # endif - float raw_p = SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale * p.xy / 1000).x; - float parallax = 0.1 * snowCoverSettings.ParallaxScale * (raw_p - 0.5); - float env_mult = GetEnvironmentalMultiplier(p) + parallax + disp * underDispScale * 0.1; - waterDist = smoothstep(-64, 8, -waterDist); - float disp_factor = 0; -#if defined(TRUE_PBR) - if(extendedMaterialSettings.ExtendShadows) - disp_factor = - disp * underDispScale; -#endif // - float mult = skylight * (smoothstep(0.3, 0.5, (pow(max(0, worldNormal.z), 2)+disp_factor) *(max(0, env_mult - waterDist)*(0.5+0.5*raw_p + disp_factor) + snowCoverSettings.SnowAmount))); //-smoothstep(-32, 8, -waterDist) - uv = snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; - if (mult < 0.01) - return 0; - sh0 = saturate(sh0 + mult * parallax); - return mult; -} + float raw_p = SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale * p.xy / 1000).x; + float parallax = 0.1 * snowCoverSettings.ParallaxScale * (raw_p - 0.5); + float env_mult = GetEnvironmentalMultiplier(p) + parallax + disp * underDispScale * 0.1; + waterDist = smoothstep(-64, 8, -waterDist); + float disp_factor = 0; +# if defined(TRUE_PBR) + if (extendedMaterialSettings.ExtendShadows) + disp_factor = -disp * underDispScale; +# endif // + float mult = skylight * (smoothstep(0.3, 0.5, (pow(max(0, worldNormal.z), 2) + disp_factor) * (max(0, env_mult - waterDist) * (0.5 + 0.5 * raw_p + disp_factor) + snowCoverSettings.SnowAmount))); //-smoothstep(-32, 8, -waterDist) + uv = snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; + if (mult < 0.01) + return 0; + sh0 = saturate(sh0 + mult * parallax); + return mult; + } # if defined(TRUE_PBR) -float ApplySnowPBR(inout float3 diffuse, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) -{ - float2 uv; - float mult = ApplySnowBase(worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); - if (mult <= 0.0) - return 0; - diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; - //diffuse = frac(float3(uv.x, uv.y, 0)); - float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); - //worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normal), mult)); - worldNormal = normalize(lerp(worldNormal, normal, mult)); - float4 rmaos = SnowRMAOS.Sample(SampRMAOSSampler, uv); - prop.Roughness = lerp(prop.Roughness, rmaos.x, mult); - prop.Metallic = lerp(prop.Metallic, rmaos.y, mult); - prop.AO = lerp(prop.AO, rmaos.z, mult); - prop.F0 = lerp(prop.F0, rmaos.w * 0.08, mult); - prop.GlintScreenSpaceScale = lerp(prop.GlintScreenSpaceScale, snowCoverSettings.Glint.x, mult); - prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, snowCoverSettings.Glint.y, mult); - prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, snowCoverSettings.Glint.z, mult); - prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, snowCoverSettings.Glint.w, mult); - return mult; -} + float ApplySnowPBR(inout float3 diffuse, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) + { + float2 uv; + float mult = ApplySnowBase(worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); + if (mult <= 0.0) + return 0; + diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; + //diffuse = frac(float3(uv.x, uv.y, 0)); + float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); + //worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normal), mult)); + worldNormal = normalize(lerp(worldNormal, normal, mult)); + float4 rmaos = SnowRMAOS.Sample(SampRMAOSSampler, uv); + prop.Roughness = lerp(prop.Roughness, rmaos.x, mult); + prop.Metallic = lerp(prop.Metallic, rmaos.y, mult); + prop.AO = lerp(prop.AO, rmaos.z, mult); + prop.F0 = lerp(prop.F0, rmaos.w * 0.08, mult); + prop.GlintScreenSpaceScale = lerp(prop.GlintScreenSpaceScale, snowCoverSettings.Glint.x, mult); + prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, snowCoverSettings.Glint.y, mult); + prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, snowCoverSettings.Glint.z, mult); + prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, snowCoverSettings.Glint.w, mult); + return mult; + } # else -float ApplySnow(inout float3 diffuse, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) -{ - float2 uv; - float mult = ApplySnowBase(worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); - if (mult <= 0.0) - return 0; - // apparently LOD landscape color sampler clamps uvs - diffuse = SnowDiffuse.Sample(SampColorSampler, frac(uv)).rgb; - //diffuse = frac(float3(uv.x, uv.y, 0)); - diffuse = pow(LinearToGamma(diffuse) / PI, 1/1.5); - float4 rmaos = SnowRMAOS.Sample(SampColorSampler, uv); - glossiness = lerp(glossiness, 1 - rmaos.x, mult); // yes these are named wrong not my fault bye - shininess = lerp(shininess, 25 * 500 * rmaos.w, mult); - diffuse *= rmaos.z; - float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); - worldNormal = normalize(lerp(worldNormal, normal, mult)); - //glossiness = lerp(glossiness, 0.5 * pow(v * s, 3.0), mult); - //shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); - return mult; -} + float ApplySnow(inout float3 diffuse, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) + { + float2 uv; + float mult = ApplySnowBase(worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); + if (mult <= 0.0) + return 0; + // apparently LOD landscape color sampler clamps uvs + diffuse = SnowDiffuse.Sample(SampColorSampler, frac(uv)).rgb; + //diffuse = frac(float3(uv.x, uv.y, 0)); + diffuse = pow(LinearToGamma(diffuse) / PI, 1 / 1.5); + float4 rmaos = SnowRMAOS.Sample(SampColorSampler, uv); + glossiness = lerp(glossiness, 1 - rmaos.x, mult); // yes these are named wrong not my fault bye + shininess = lerp(shininess, 25 * 500 * rmaos.w, mult); + diffuse *= rmaos.z; + float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); + worldNormal = normalize(lerp(worldNormal, normal, mult)); + //glossiness = lerp(glossiness, 0.5 * pow(v * s, 3.0), mult); + //shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); + return mult; + } # endif # endif diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 19f9efe96d..1ff5708aa3 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1503,8 +1503,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace baseColor += input.LandBlendWeights2.yyyy * landColor6; } - - # if defined(SNOW) && !defined(TRUE_PBR) useSnowSpecular = landSnowMask != 0.0; # endif // SNOW @@ -1546,8 +1544,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace shadowColor = TexShadowMaskSampler.Sample(SampShadowMaskSampler, shadowUV); } - - float3 worldSpaceNormal = modelNormal; # if !defined(DRAW_IN_WORLDSPACE) @@ -1706,7 +1702,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif # if defined(LODLANDNOISE) - snowOcclusion *= 0.9 + noise*0.1; + snowOcclusion *= 0.9 + noise * 0.1; # endif # if defined(LIGHT_LIMIT_FIX) @@ -1761,7 +1757,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif # if defined(TREE_ANIM) - SnowCover::ApplyFoliageColor(baseColor.rgb, SnowCover::GetEnvironmentalMultiplier(pos)); + SnowCover::ApplyFoliageColor(baseColor.rgb, SnowCover::GetEnvironmentalMultiplier(pos)); # endif baseColor.rgb = lerp(baseColor.rgb, snowDiffuse, snowFactor); @@ -1794,7 +1790,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif modelNormal.xyz = worldSpaceNormal; modelNormal.xyz = normalize(modelNormal.xyz); -# endif // SNOW_COVER +# endif // SNOW_COVER float projectedMaterialWeight = 0; float projWeight = 0; @@ -1829,9 +1825,9 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 projBaseColor = TexProjDiffuseSampler.Sample(SampProjDiffuseSampler, projNormalDiffuseUv).xyz * ProjectedUVParams2.xyz; projectedMaterialWeight = smoothstep(0, 1, 5 * (0.1 + projWeight)); # if defined(SNOW_COVER) - if(snowCoverSettings.EnableSnowCover) + if (snowCoverSettings.EnableSnowCover) projectedMaterialWeight *= saturate(1 - SnowCover::GetEnvironmentalMultiplier(pos)); - + # endif # if defined(TRUE_PBR) pbrSurfaceProperties.Thickness = lerp(pbrSurfaceProperties.Thickness, 1, projectedMaterialWeight); @@ -1882,7 +1878,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace baseColor.xyz = GetWorldMapBaseColor(rawBaseColor.xyz, baseColor.xyz, projWeight); # endif // WORLD_MAP - float waterRoughnessSpecular = 1; # if defined(WETNESS_EFFECTS) float wetness = 0.0; From 418c4bf0e2ff73616bc96311c1b537ced93e79d7 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Sun, 23 Feb 2025 20:26:54 +0000 Subject: [PATCH 021/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/FeatureBuffer.cpp | 1 - src/Globals.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/FeatureBuffer.cpp b/src/FeatureBuffer.cpp index fa4925f73d..8cd9f86cea 100644 --- a/src/FeatureBuffer.cpp +++ b/src/FeatureBuffer.cpp @@ -9,7 +9,6 @@ #include "Features/SnowCover.h" #include "Features/TerrainShadows.h" #include "Features/WetnessEffects.h" -#include "Features/SnowCover.h" #include "TruePBR.h" diff --git a/src/Globals.cpp b/src/Globals.cpp index 720b5d15b1..4e36c1e0ba 100644 --- a/src/Globals.cpp +++ b/src/Globals.cpp @@ -18,13 +18,13 @@ #include "Features/ScreenSpaceGI.h" #include "Features/ScreenSpaceShadows.h" #include "Features/Skylighting.h" +#include "Features/SnowCover.h" #include "Features/SubsurfaceScattering.h" #include "Features/TerrainBlending.h" #include "Features/TerrainShadows.h" #include "Features/VolumetricLighting.h" #include "Features/WaterEffects.h" #include "Features/WetnessEffects.h" -#include "Features/SnowCover.h" #include "Features/LightLimitFix/ParticleLights.h" From adb0758f7cfdbe2908344a19d430becde5770c79 Mon Sep 17 00:00:00 2001 From: Exist Date: Sun, 23 Feb 2025 22:51:17 +0100 Subject: [PATCH 022/131] merge fixes --- package/Shaders/Lighting.hlsl | 219 +++++----------------------------- 1 file changed, 29 insertions(+), 190 deletions(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index b1116318a1..4c13d6ee66 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -961,9 +961,6 @@ float GetSnowParameterY(float texProjTmp, float alpha) # endif # if defined(TRUE_PBR) -# if defined(SNOW_COVER) -# undef GLINT -# endif # include "Common/PBR.hlsli" # endif @@ -1005,8 +1002,6 @@ float GetSnowParameterY(float texProjTmp, float alpha) # if defined(SKYLIGHTING) # include "Skylighting/Skylighting.hlsli" -# endif - # if defined(SNOW_COVER) # undef SNOW //# undef SPARKLE @@ -1548,6 +1543,22 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace baseColor += input.LandBlendWeights2.yyyy * landColor6; } +# if defined(LOD_LAND_BLEND) + float4 lodLandColor = TexLandLodBlend1Sampler.Sample(SampLandLodBlend1Sampler, input.TexCoord0.zw); + float lodBlendParameter = GetLodLandBlendParameter(lodLandColor.xyz); + float lodBlendMask = TexLandLodBlend2Sampler.Sample(SampLandLodBlend2Sampler, 3.0.xx * input.TexCoord0.zw).x; + float lodLandFadeFactor = GetLodLandBlendMultiplier(lodBlendParameter, lodBlendMask); + float lodLandBlendFactor = LODTexParams.z * input.LandBlendWeights2.w; + + normal.xyz = lerp(normal.xyz, float3(0, 0, 1), lodLandBlendFactor); + +# if !defined(TRUE_PBR) + baseColor.w = 0; + baseColor = lerp(baseColor, lodLandColor * lodLandFadeFactor, lodLandBlendFactor); + glossiness = lerp(glossiness, 0, lodLandBlendFactor); +# endif +# endif // LOD_LAND_BLEND + # if defined(SNOW) && !defined(TRUE_PBR) useSnowSpecular = landSnowMask != 0.0; # endif // SNOW @@ -1721,6 +1732,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace pbrSurfaceProperties.SubsurfaceColor *= Color::Diffuse(sampledSubsurfaceProperties.xyz); pbrSurfaceProperties.Thickness *= sampledSubsurfaceProperties.w; } + pbrSurfaceProperties.Thickness = lerp(pbrSurfaceProperties.Thickness, 1, projectedMaterialWeight); } else if ((PBRFlags & PBR::Flags::TwoLayer) != 0) { @@ -1750,6 +1762,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } # endif } + pbrSurfaceProperties.CoatStrength = lerp(pbrSurfaceProperties.CoatStrength, 0, projectedMaterialWeight); } [branch] if ((PBRFlags & PBR::Flags::Fuzz) != 0) @@ -1762,6 +1775,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace pbrSurfaceProperties.FuzzColor *= Color::Diffuse(sampledFuzzProperties.xyz); pbrSurfaceProperties.FuzzWeight *= sampledFuzzProperties.w; } + pbrSurfaceProperties.FuzzWeight = lerp(pbrSurfaceProperties.FuzzWeight, 0, projectedMaterialWeight); } # endif @@ -1792,191 +1806,8 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float4 waterData = SharedData::GetWaterData(input.WorldPosition.xyz); float waterHeight = waterData.w; -# if defined(SNOW_COVER) -# if defined(SKYLIGHTING) - float snowOcclusion = inWorld ? smoothstep(0, 1, (shUnproject(skylightingSH, float3(0, 0, 1)))) : 0; -# else - float snowOcclusion = inWorld ? 1 : 0; -# endif - -# if defined(LODLANDNOISE) - snowOcclusion *= 0.9 + noise * 0.1; -# endif - -# if defined(LIGHT_LIMIT_FIX) - [loop] for (uint lightIndex = 0; lightIndex < totalLightCount; lightIndex++) - { - StructuredLight light; - if (lightIndex < strictLights[0].NumStrictLights) { - light = strictLights[0].StrictLights[lightIndex]; - } else { - uint clusterIndex = lightList[lightOffset + (lightIndex - strictLights[0].NumStrictLights)]; - light = lights[clusterIndex]; - } - float3 lightDirection = light.positionWS[eyeIndex].xyz - input.WorldPosition.xyz; - float lightDist = dot(lightDirection, lightDirection); - snowOcclusion *= smoothstep(0, 25000, lightDist); - } -# else - [loop] for (uint lightIndex = 0; lightIndex < numShadowLights; lightIndex++) - { - float3 lightDirection = PointLightPosition[eyeIndex * numLights + lightIndex].xyz - input.InputPosition.xyz; - float lightDist = dot(lightDirection, lightDirection); - snowOcclusion *= smoothstep(0, 50000, lightDist); - } -# endif -# if !defined(MODELSPACENORMALS) - float3 viewDirTS = normalize(mul(tbnTr, viewDirection)); - viewDirTS.xy /= viewDirTS.z * 0.7 + 0.3; // Fix for objects at extreme viewing angles -# else - float3 viewDirTS = 0; -# endif - float underDispScale = 1.0; - float3 pos = (input.WorldPosition + CameraPosAdjust[eyeIndex]).xyz; -# if defined(TRUE_PBR) && defined(EMAT) -# if defined(LANDSCAPE) - underDispScale = max(displacementParams[0].HeightScale * input.LandBlendWeights1.x, max(displacementParams[1].HeightScale * input.LandBlendWeights1.y, - max(displacementParams[2].HeightScale * input.LandBlendWeights1.z, max(displacementParams[3].HeightScale * input.LandBlendWeights1.w, - max(displacementParams[4].HeightScale * input.LandBlendWeights2.x, displacementParams[5].HeightScale * input.LandBlendWeights2.y))))); -# else - underDispScale = displacementParams.HeightScale; -# endif -# endif - - //float3 pos = float3(diffuseUv.x, diffuseUv.y, 0); - float snowFactor = 0; - float3 snowDiffuse = baseColor.rgb; - if (snowCoverSettings.EnableSnowCover) -# if defined(TRUE_PBR) - snowFactor = SnowCover::ApplySnowPBR(snowDiffuse, worldSpaceNormal, pbrSurfaceProperties, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); -# else - snowFactor = SnowCover::ApplySnow(snowDiffuse, worldSpaceNormal, glossiness.x, shininess, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); - glossiness = glossiness.xxxx; -# endif - -# if defined(TREE_ANIM) - SnowCover::ApplyFoliageColor(baseColor.rgb, SnowCover::GetEnvironmentalMultiplier(pos)); -# endif - baseColor.rgb = lerp(baseColor.rgb, snowDiffuse, snowFactor); - -# if defined(LOD_LAND_BLEND) - float4 lodLandColor = TexLandLodBlend1Sampler.Sample(SampLandLodBlend1Sampler, input.TexCoord0.zw); -# if defined(TRUE_PBR) - // this should probably be converted from linear but it just works - lodLandColor.rgb = lerp(lodLandColor.rgb, snowDiffuse, snowFactor); -# else - lodLandColor.rgb = lerp(lodLandColor.rgb, snowDiffuse, snowFactor); -# endif - float lodBlendParameter = GetLodLandBlendParameter(lodLandColor.xyz); - float lodBlendMask = TexLandLodBlend2Sampler.Sample(SampLandLodBlend2Sampler, 3.0.xx * input.TexCoord0.zw).x; - float lodLandFadeFactor = GetLodLandBlendMultiplier(lodBlendParameter, lodBlendMask); - float lodLandBlendFactor = LODTexParams.z * input.LandBlendWeights2.w; - //lodLandBlendFactor = lerp(lodLandBlendFactor, 0, snowFactor); - normal.xyz = lerp(normal.xyz, float3(0, 0, 1), lodLandBlendFactor); - -# if !defined(TRUE_PBR) - baseColor.w = 0; - baseColor = lerp(baseColor, lodLandColor * lodLandFadeFactor, lodLandBlendFactor); - glossiness = lerp(glossiness, 0, lodLandBlendFactor); -# endif -# endif // LOD_LAND_BLEND - -# if !defined(DRAW_IN_WORLDSPACE) // && (defined(SKINNED) || !defined(MODELSPACENORMALS)) - [flatten] if (!input.WorldSpace) - modelNormal.xyz = mul(transpose(input.World[eyeIndex]), float4(worldSpaceNormal, 0)); - else -# endif - modelNormal.xyz = worldSpaceNormal; - modelNormal.xyz = normalize(modelNormal.xyz); -# endif // SNOW_COVER - - float projectedMaterialWeight = 0; - float projWeight = 0; -# if defined(PROJECTED_UV) - float2 projNoiseUv = ProjectedUVParams.zz * input.TexCoord0.zw; - float projNoise = TexCharacterLightProjNoiseSampler.Sample(SampCharacterLightProjNoiseSampler, projNoiseUv).x; - float3 texProj = normalize(input.TexProj); -# if defined(TREE_ANIM) || defined(LODOBJECTSHD) - float vertexAlpha = 1; -# else - float vertexAlpha = input.Color.w; -# endif // defined (TREE_ANIM) || defined (LODOBJECTSHD) - projWeight = -ProjectedUVParams.x * projNoise + (dot(modelNormal.xyz, texProj) * vertexAlpha - ProjectedUVParams.w); -# if defined(LODOBJECTSHD) - projWeight += (-0.5 + input.Color.w) * 2.5; -# endif // LODOBJECTSHD -# if defined(SPARKLE) - if (projWeight < 0) - discard; - - modelNormal.xyz = projectedNormal; -# if defined(SNOW) - psout.Parameters.y = 1; -# endif // SNOW -# elif !defined(FACEGEN) && !defined(PARALLAX) && !defined(SPARKLE) && !defined(MULTI_LAYER_PARALLAX) && !defined(LANDSCAPE) - if (ProjectedUVParams3.w > 0.5) { - float2 projNormalDiffuseUv = ProjectedUVParams3.x * projNoiseUv; - float3 projNormal = TransformNormal(TexProjNormalSampler.Sample(SampProjNormalSampler, projNormalDiffuseUv).xyz); - float2 projDetailNormalUv = ProjectedUVParams3.y * projNoiseUv; - float3 projDetailNormal = TexProjDetail.Sample(SampProjDetailSampler, projDetailNormalUv).xyz; - float3 finalProjNormal = normalize(TransformNormal(projDetailNormal) * float3(1, 1, projNormal.z) + float3(projNormal.xy, 0)); - float3 projBaseColor = TexProjDiffuseSampler.Sample(SampProjDiffuseSampler, projNormalDiffuseUv).xyz * ProjectedUVParams2.xyz; - projectedMaterialWeight = smoothstep(0, 1, 5 * (0.1 + projWeight)); -# if defined(SNOW_COVER) - if (snowCoverSettings.EnableSnowCover) - projectedMaterialWeight *= saturate(1 - SnowCover::GetEnvironmentalMultiplier(pos)); - -# endif -# if defined(TRUE_PBR) - pbrSurfaceProperties.Thickness = lerp(pbrSurfaceProperties.Thickness, 1, projectedMaterialWeight); - pbrSurfaceProperties.CoatStrength = lerp(pbrSurfaceProperties.CoatStrength, 0, projectedMaterialWeight); - pbrSurfaceProperties.FuzzWeight = lerp(pbrSurfaceProperties.FuzzWeight, 0, projectedMaterialWeight); - projBaseColor = saturate(EnvmapData.xyz * projBaseColor); - rawRMAOS.xyw = lerp(rawRMAOS.xyw, float3(ParallaxOccData.x, 0, ParallaxOccData.y), projectedMaterialWeight); - float4 projectedGlintParameters = 0; - if ((PBRFlags & TruePBR_ProjectedGlint) != 0) { - projectedGlintParameters = SparkleParams; - } - glintParameters = lerp(glintParameters, projectedGlintParameters, projectedMaterialWeight); -# endif - normal.xyz = lerp(normal.xyz, finalProjNormal, projectedMaterialWeight); - baseColor.xyz = lerp(baseColor.xyz, projBaseColor, projectedMaterialWeight); - -# if defined(SNOW) - useSnowDecalSpecular = true; - psout.Parameters.y = GetSnowParameterY(projectedMaterialWeight, baseColor.w); -# endif // SNOW - } else { - if (projWeight > 0) { - baseColor.xyz = ProjectedUVParams2.xyz; -# if defined(SNOW) - useSnowDecalSpecular = true; - psout.Parameters.y = GetSnowParameterY(projWeight, baseColor.w); -# endif // SNOW - } else { -# if defined(SNOW) - psout.Parameters.y = 0; -# endif // SNOW - } - } - -# if defined(SPECULAR) - useSnowSpecular = useSnowDecalSpecular; -# endif // SPECULAR -# endif // SPARKLE - -# elif defined(SNOW) -# if defined(LANDSCAPE) - psout.Parameters.y = landSnowMask; -# else - psout.Parameters.y = baseColor.w; -# endif // LANDSCAPE -# endif -# if defined(WORLD_MAP) - baseColor.xyz = GetWorldMapBaseColor(rawBaseColor.xyz, baseColor.xyz, projWeight); -# endif // WORLD_MAP - float waterRoughnessSpecular = 1; + # if defined(WETNESS_EFFECTS) float wetness = 0.0; @@ -2607,6 +2438,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif # endif +# if defined(HAIR) + float3 vertexColor = lerp(1, TintColor.xyz, input.Color.y); +# else + float3 vertexColor = input.Color.xyz; +# endif // defined (HAIR) + float4 color = 0; # if defined(TRUE_PBR) @@ -2655,6 +2492,8 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace color.xyz += diffuseColor * baseColor.xyz; # endif + color.xyz *= vertexColor; + # if defined(MULTI_LAYER_PARALLAX) float layerValue = MultiLayerParallaxData.x * TexLayerSampler.Sample(SampLayerSampler, uv).w; float3 tangentViewDirection = mul(viewDirection, tbn); @@ -2935,4 +2774,4 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace return psout; } -#endif // PSHADER +#endif // PSHADER \ No newline at end of file From 200c08d9236bd29bef39992d2d4d14219702edf3 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Sun, 23 Feb 2025 21:52:49 +0000 Subject: [PATCH 023/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package/Shaders/Lighting.hlsl | 862 +++++++++++++++++----------------- src/FeatureBuffer.cpp | 1 - src/Globals.cpp | 2 +- 3 files changed, 432 insertions(+), 433 deletions(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 4c13d6ee66..ec1df50b33 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1002,15 +1002,15 @@ float GetSnowParameterY(float texProjTmp, float alpha) # if defined(SKYLIGHTING) # include "Skylighting/Skylighting.hlsli" -# if defined(SNOW_COVER) -# undef SNOW +# if defined(SNOW_COVER) +# undef SNOW //# undef SPARKLE -# include "SnowCover/SnowCover.hlsli" -# endif +# include "SnowCover/SnowCover.hlsli" +# endif -# define LinearSampler SampColorSampler +# define LinearSampler SampColorSampler -# include "Common/ShadowSampling.hlsli" +# include "Common/ShadowSampling.hlsli" PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) @@ -1022,36 +1022,36 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float2 screenUV = FrameBuffer::ViewToUV(viewPosition, true, eyeIndex); float screenNoise = Random::InterleavedGradientNoise(input.Position.xy, SharedData::FrameCount); -# if defined(DEFERRED) +# if defined(DEFERRED) const bool inWorld = true; -# else +# else const bool inWorld = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InWorld); -# endif +# endif float nearFactor = smoothstep(4096.0 * 2.5, 0.0, viewPosition.z); -# if defined(SKINNED) || !defined(MODELSPACENORMALS) +# if defined(SKINNED) || !defined(MODELSPACENORMALS) float3x3 tbn = float3x3(input.TBN0.xyz, input.TBN1.xyz, input.TBN2.xyz); -# if !defined(TREE_ANIM) && !defined(LOD) +# if !defined(TREE_ANIM) && !defined(LOD) // Fix incorrect vertex normals on double-sided meshes if (!frontFace) tbn = lerp(tbn, -tbn, nearFactor); -# endif +# endif float3x3 tbnTr = transpose(tbn); -# endif // defined (SKINNED) || !defined (MODELSPACENORMALS) +# endif // defined (SKINNED) || !defined (MODELSPACENORMALS) -# if !defined(TRUE_PBR) -# if defined(LANDSCAPE) +# if !defined(TRUE_PBR) +# if defined(LANDSCAPE) float shininess = dot(input.LandBlendWeights1, LandscapeTexture1to4IsSpecPower) + input.LandBlendWeights2.x * LandscapeTexture5to6IsSpecPower.x + input.LandBlendWeights2.y * LandscapeTexture5to6IsSpecPower.y; -# else +# else float shininess = SpecularColor.w; -# endif // defined (LANDSCAPE) -# endif +# endif // defined (LANDSCAPE) +# endif -# if defined(TERRAIN_BLENDING) +# if defined(TERRAIN_BLENDING) float depthSampled = TerrainBlending::TerrainBlendingMaskTexture[input.Position.xy]; float depthSampledLinear = SharedData::GetScreenDepth(depthSampled); @@ -1063,7 +1063,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace blendFactorTerrain = 1; blendFactorTerrain = saturate(blendFactorTerrain); -# endif +# endif float3 viewDirection = normalize(input.ViewVector.xyz); float3 worldSpaceViewDirection = -normalize(input.WorldPosition.xyz); @@ -1071,47 +1071,47 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float2 uv = input.TexCoord0.xy; float2 uvOriginal = uv; -# if defined(EMAT) +# if defined(EMAT) float parallaxShadowQuality = sqrt(1.0 - saturate(viewPosition.z / 2048.0)); -# endif +# endif -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) float mipLevels[6]; -# else +# else float mipLevel = 0; -# endif // LANDSCAPE +# endif // LANDSCAPE float sh0 = 0; float pixelOffset = 0; -# if defined(EMAT) -# if defined(LANDSCAPE) +# if defined(EMAT) +# if defined(LANDSCAPE) DisplacementParams displacementParams[6]; displacementParams[0].DisplacementScale = 1.f; displacementParams[0].DisplacementOffset = 0.f; displacementParams[0].HeightScale = 1; displacementParams[0].FlattenAmount = 0; -# else +# else DisplacementParams displacementParams; displacementParams.DisplacementScale = 1.f; displacementParams.DisplacementOffset = 0.f; displacementParams.HeightScale = 1; displacementParams.FlattenAmount = 0; -# endif +# endif -# endif +# endif float curvature = 0; float normalSmoothness = 0; -# if !defined(MODELSPACENORMALS) +# if !defined(MODELSPACENORMALS) float3 vertexNormal = tbnTr[2]; float3 worldSpaceVertexNormal = vertexNormal; -# if !defined(DRAW_IN_WORLDSPACE) +# if !defined(DRAW_IN_WORLDSPACE) [flatten] if (!input.WorldSpace) worldSpaceVertexNormal = normalize(mul(input.World[eyeIndex], float4(worldSpaceVertexNormal, 0))); -# endif -# if defined(EMAT) +# endif +# if defined(EMAT) if (SharedData::extendedMaterialSettings.EnableParallaxWarpingFix) { float3 ndx = ddx(worldSpaceVertexNormal); @@ -1122,16 +1122,16 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace curvature = pow(length(max(abs(ndx), abs(ndy))) * fragSize, 0.5); float3 flatWorldNormal = normalize(-cross(ddx(input.WorldPosition.xyz), ddy(input.WorldPosition.xyz))); normalSmoothness = (1 - dot(worldSpaceVertexNormal, flatWorldNormal)); -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) displacementParams[0].HeightScale = saturate(1 - curvature); displacementParams[0].FlattenAmount = (normalSmoothness + curvature); -# else +# else displacementParams.HeightScale = saturate(1 - curvature); displacementParams.FlattenAmount = (normalSmoothness + curvature); -# endif +# endif } +# endif # endif -# endif float3 entryNormal = 0; float3 entryNormalTS = 0; @@ -1140,21 +1140,21 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 refractedViewDirectionWS = worldSpaceViewDirection; float4 sampledCoatColor = PBRParams2; -# if defined(EMAT) -# if defined(PARALLAX) +# if defined(EMAT) +# if defined(PARALLAX) if (SharedData::extendedMaterialSettings.EnableParallax) { mipLevel = ExtendedMaterials::GetMipLevel(uv, TexParallaxSampler); uv = ExtendedMaterials::GetParallaxCoords(viewPosition.z, uv, mipLevel, viewDirection, tbnTr, screenNoise, TexParallaxSampler, SampParallaxSampler, 0, displacementParams, pixelOffset); if (SharedData::extendedMaterialSettings.EnableShadows && (parallaxShadowQuality > 0.0f || SharedData::extendedMaterialSettings.ExtendShadows)) sh0 = TexParallaxSampler.SampleLevel(SampParallaxSampler, uv, mipLevel).x; } -# endif // PARALLAX +# endif // PARALLAX bool complexMaterial = false; bool complexMaterialParallax = false; float4 complexMaterialColor = 1.0; -# if defined(EMAT_ENVMAP) +# if defined(EMAT_ENVMAP) if (SharedData::extendedMaterialSettings.EnableComplexMaterial) { float envMaskTest = TexEnvMaskSampler.SampleLevel(SampEnvMaskSampler, uv, 15).w; @@ -1173,9 +1173,9 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } } -# endif // ENVMAP +# endif // ENVMAP -# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) bool PBRParallax = false; [branch] if ((PBRFlags & PBR::Flags::HasFeatureTexture0) != 0) { @@ -1216,29 +1216,29 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace if (SharedData::extendedMaterialSettings.EnableShadows && (parallaxShadowQuality > 0.0f || SharedData::extendedMaterialSettings.ExtendShadows)) sh0 = TexParallaxSampler.SampleLevel(SampParallaxSampler, uv, mipLevel).x; } -# endif // TRUE_PBR +# endif // TRUE_PBR -# endif // EMAT +# endif // EMAT -# if defined(SNOW) +# if defined(SNOW) bool useSnowSpecular = true; -# else +# else bool useSnowSpecular = false; -# endif // SNOW +# endif // SNOW -# if defined(SPARKLE) || !defined(PROJECTED_UV) +# if defined(SPARKLE) || !defined(PROJECTED_UV) bool useSnowDecalSpecular = true; -# else +# else bool useSnowDecalSpecular = false; -# endif // defined(SPARKLE) || !defined(PROJECTED_UV) +# endif // defined(SPARKLE) || !defined(PROJECTED_UV) float2 diffuseUv = uv; -# if defined(SPARKLE) +# if defined(SPARKLE) diffuseUv = ProjectedUVParams2.yy * input.TexCoord0.zw; -# endif // SPARKLE +# endif // SPARKLE -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) // Normalize blend weights float landBlendWeights = 0.0; landBlendWeights += input.LandBlendWeights1.x; @@ -1252,7 +1252,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace input.LandBlendWeights1.z /= landBlendWeights; input.LandBlendWeights1.w /= landBlendWeights; input.LandBlendWeights1.x /= landBlendWeights; -# if defined(EMAT) +# if defined(EMAT) if (SharedData::extendedMaterialSettings.EnableTerrainParallax) { mipLevels[0] = ExtendedMaterials::GetMipLevel(uv, TexColorSampler); mipLevels[1] = ExtendedMaterials::GetMipLevel(uv, TexLandColor2Sampler); @@ -1266,14 +1266,14 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace displacementParams[3] = displacementParams[0]; displacementParams[4] = displacementParams[0]; displacementParams[5] = displacementParams[0]; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) displacementParams[0].HeightScale *= PBRParams1.y; displacementParams[1].HeightScale *= LandscapeTexture2PBRParams.y; displacementParams[2].HeightScale *= LandscapeTexture3PBRParams.y; displacementParams[3].HeightScale *= LandscapeTexture4PBRParams.y; displacementParams[4].HeightScale *= LandscapeTexture5PBRParams.y; displacementParams[5].HeightScale *= LandscapeTexture6PBRParams.y; -# endif +# endif float weights[6]; uv = ExtendedMaterials::GetParallaxCoords(input, viewPosition.z, uv, mipLevels, viewDirection, tbnTr, screenNoise, displacementParams, pixelOffset, weights); @@ -1289,14 +1289,14 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace sh0 = ExtendedMaterials::GetTerrainHeight(input, uv, mipLevels, displacementParams, parallaxShadowQuality, input.LandBlendWeights1, input.LandBlendWeights2.xy, weights); } } -# endif // EMAT -# endif // LANDSCAPE +# endif // EMAT +# endif // LANDSCAPE -# if defined(SPARKLE) +# if defined(SPARKLE) diffuseUv = ProjectedUVParams2.yy * (input.TexCoord0.zw + (uv - uvOriginal)); -# else +# else diffuseUv = uv; -# endif // SPARKLE +# endif // SPARKLE float4 baseColor = 0; float4 normal = 0; @@ -1306,25 +1306,25 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float4 glintParameters = 0; -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) if (input.LandBlendWeights1.x > 0.0) { -# endif // LANDSCAPE +# endif // LANDSCAPE float4 rawBaseColor = TexColorSampler.SampleBias(SampColorSampler, diffuseUv, SharedData::MipBias); -# if defined(TRUE_PBR) && defined(LANDSCAPE) +# if defined(TRUE_PBR) && defined(LANDSCAPE) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile0PBR) == 0) { // relevant for linear only } -# endif +# endif baseColor = float4(Color::Diffuse(rawBaseColor.rgb), rawBaseColor.a); float landSnowMask1 = GetLandSnowMaskValue(baseColor.w); float4 normalColor = TexNormalSampler.SampleBias(SampNormalSampler, uv, SharedData::MipBias); normal = normalColor; -# if defined(MODELSPACENORMALS) -# if defined(LODLANDNOISE) +# if defined(MODELSPACENORMALS) +# if defined(LODLANDNOISE) normal.xyz = normal.xzy - 0.5.xxx; float lodLandNoiseParameter = GetLodLandBlendParameter(baseColor.xyz); float noise = TexLandLodNoiseSampler.Sample(SampLandLodNoiseSampler, uv * 3.0.xx).x; @@ -1333,31 +1333,31 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace normal.xyz *= 2; normal.w = 1; glossiness = 0; -# elif defined(LODLANDSCAPE) +# elif defined(LODLANDSCAPE) normal.xyz = 2.0.xxx * (-0.5.xxx + normal.xzy); normal.w = 1; glossiness = 0; -# else +# else normal.xyz = normal.xzy * 2.0.xxx + -1.0.xxx; normal.w = 1; glossiness = TexSpecularSampler.Sample(SampSpecularSampler, uv).x; -# endif // LODLANDNOISE -# elif (defined(SNOW) && defined(LANDSCAPE)) +# endif // LODLANDNOISE +# elif (defined(SNOW) && defined(LANDSCAPE)) normal.xyz = GetLandNormal(landSnowMask1, normal.xyz, uv, SampNormalSampler, TexNormalSampler); glossiness = normal.w; -# else +# else normal.xyz = TransformNormal(normal.xyz); glossiness = normal.w; -# endif // MODELSPACENORMALS +# endif // MODELSPACENORMALS -# if defined(WORLD_MAP) +# if defined(WORLD_MAP) normal.xyz = GetWorldMapNormal(input, normal.xyz, rawBaseColor.xyz); -# endif // WORLD_MAP +# endif // WORLD_MAP -# if defined(TRUE_PBR) -# if defined(LODLANDNOISE) +# if defined(TRUE_PBR) +# if defined(LODLANDNOISE) rawRMAOS = float4(1, 0, 1, 0); -# elif defined(LANDSCAPE) +# elif defined(LANDSCAPE) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile0PBR) != 0) { rawRMAOS = input.LandBlendWeights1.x * TexRMAOSSampler.SampleBias(SampRMAOSSampler, diffuseUv, SharedData::MipBias) * float4(PBRParams1.x, 1, 1, PBRParams1.z); @@ -1369,39 +1369,39 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS = input.LandBlendWeights1.x * float4(1 - glossiness.x, 0, 1, 0); } -# else +# else rawRMAOS = TexRMAOSSampler.SampleBias(SampRMAOSSampler, diffuseUv, SharedData::MipBias) * float4(PBRParams1.x, 1, 1, PBRParams1.z); if ((PBRFlags & PBR::Flags::Glint) != 0) { glintParameters = MultiLayerParallaxData; } +# endif # endif -# endif -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) baseColor *= input.LandBlendWeights1.x; normal *= input.LandBlendWeights1.x; glossiness *= input.LandBlendWeights1.x; } -# endif // LANDSCAPE +# endif // LANDSCAPE -# if defined(EMAT_ENVMAP) +# if defined(EMAT_ENVMAP) complexMaterial = complexMaterial && complexMaterialColor.y > (4.0 / 255.0) && (complexMaterialColor.y < (1.0 - (4.0 / 255.0))); shininess = lerp(shininess, shininess * complexMaterialColor.y, complexMaterial); float3 complexSpecular = lerp(1.0, lerp(1.0, baseColor.xyz, complexMaterialColor.z), complexMaterial); baseColor.xyz = lerp(baseColor.xyz, lerp(baseColor.xyz, 0.0, complexMaterialColor.z), complexMaterial); -# endif // defined (EMAT) && defined(ENVMAP) +# endif // defined (EMAT) && defined(ENVMAP) -# if defined(FACEGEN) +# if defined(FACEGEN) baseColor.xyz = GetFacegenBaseColor(baseColor.xyz, uv); -# elif defined(FACEGEN_RGB_TINT) +# elif defined(FACEGEN_RGB_TINT) baseColor.xyz = GetFacegenRGBTintBaseColor(baseColor.xyz, uv); -# endif // FACEGEN +# endif // FACEGEN -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) float landSnowMask = LandscapeTexture1to4IsSnow.x * input.LandBlendWeights1.x; -# endif // SNOW +# endif // SNOW if (input.LandBlendWeights1.y > 0.0) { float4 landColor2 = TexLandColor2Sampler.SampleBias(SampLandColor2Sampler, uv, SharedData::MipBias); @@ -1411,11 +1411,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal2.xyz = GetLandNormal(landSnowMask2, landNormal2.xyz, uv, SampLandNormal2Sampler, TexLandNormal2Sampler); normal.xyz += input.LandBlendWeights1.yyy * landNormal2.xyz; glossiness += input.LandBlendWeights1.y * landNormal2.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture1to4IsSnow.y * input.LandBlendWeights1.y * landSnowMask2; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile1PBR) != 0) { rawRMAOS += input.LandBlendWeights1.y * TexLandRMAOS2Sampler.SampleBias(SampLandRMAOS2Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture2PBRParams.x, 1, 1, LandscapeTexture2PBRParams.z); @@ -1427,7 +1427,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights1.y * float4(1 - landNormal2.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights1.yyyy * landColor2; } @@ -1439,11 +1439,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal3.xyz = GetLandNormal(landSnowMask3, landNormal3.xyz, uv, SampLandNormal3Sampler, TexLandNormal3Sampler); normal.xyz += input.LandBlendWeights1.zzz * landNormal3.xyz; glossiness += input.LandBlendWeights1.z * landNormal3.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture1to4IsSnow.z * input.LandBlendWeights1.z * landSnowMask3; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile2PBR) != 0) { rawRMAOS += input.LandBlendWeights1.z * TexLandRMAOS3Sampler.SampleBias(SampLandRMAOS3Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture3PBRParams.x, 1, 1, LandscapeTexture3PBRParams.z); @@ -1455,7 +1455,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights1.z * float4(1 - landNormal3.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights1.zzzz * landColor3; } @@ -1467,11 +1467,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal4.xyz = GetLandNormal(landSnowMask4, landNormal4.xyz, uv, SampLandNormal4Sampler, TexLandNormal4Sampler); normal.xyz += input.LandBlendWeights1.www * landNormal4.xyz; glossiness += input.LandBlendWeights1.w * landNormal4.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture1to4IsSnow.w * input.LandBlendWeights1.w * landSnowMask4; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile3PBR) != 0) { rawRMAOS += input.LandBlendWeights1.w * TexLandRMAOS4Sampler.SampleBias(SampLandRMAOS4Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture4PBRParams.x, 1, 1, LandscapeTexture4PBRParams.z); @@ -1483,7 +1483,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights1.w * float4(1 - landNormal4.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights1.wwww * landColor4; } @@ -1495,11 +1495,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal5.xyz = GetLandNormal(landSnowMask5, landNormal5.xyz, uv, SampLandNormal5Sampler, TexLandNormal5Sampler); normal.xyz += input.LandBlendWeights2.xxx * landNormal5.xyz; glossiness += input.LandBlendWeights2.x * landNormal5.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture5to6IsSnow.x * input.LandBlendWeights2.x * landSnowMask5; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile4PBR) != 0) { rawRMAOS += input.LandBlendWeights2.x * TexLandRMAOS5Sampler.SampleBias(SampLandRMAOS5Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture5PBRParams.x, 1, 1, LandscapeTexture5PBRParams.z); @@ -1511,7 +1511,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights2.x * float4(1 - landNormal5.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights2.xxxx * landColor5; } @@ -1523,11 +1523,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal6.xyz = GetLandNormal(landSnowMask6, landNormal6.xyz, uv, SampLandNormal6Sampler, TexLandNormal6Sampler); normal.xyz += input.LandBlendWeights2.yyy * landNormal6.xyz; glossiness += input.LandBlendWeights2.y * landNormal6.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture5to6IsSnow.y * input.LandBlendWeights2.y * landSnowMask6; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile5PBR) != 0) { rawRMAOS += input.LandBlendWeights2.y * TexLandRMAOS6Sampler.SampleBias(SampLandRMAOS6Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture6PBRParams.x, 1, 1, LandscapeTexture6PBRParams.z); @@ -1539,11 +1539,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights2.y * float4(1 - landNormal6.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights2.yyyy * landColor6; } -# if defined(LOD_LAND_BLEND) +# if defined(LOD_LAND_BLEND) float4 lodLandColor = TexLandLodBlend1Sampler.Sample(SampLandLodBlend1Sampler, input.TexCoord0.zw); float lodBlendParameter = GetLodLandBlendParameter(lodLandColor.xyz); float lodBlendMask = TexLandLodBlend2Sampler.Sample(SampLandLodBlend2Sampler, 3.0.xx * input.TexCoord0.zw).x; @@ -1552,44 +1552,44 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace normal.xyz = lerp(normal.xyz, float3(0, 0, 1), lodLandBlendFactor); -# if !defined(TRUE_PBR) +# if !defined(TRUE_PBR) baseColor.w = 0; baseColor = lerp(baseColor, lodLandColor * lodLandFadeFactor, lodLandBlendFactor); glossiness = lerp(glossiness, 0, lodLandBlendFactor); -# endif -# endif // LOD_LAND_BLEND +# endif +# endif // LOD_LAND_BLEND -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) useSnowSpecular = landSnowMask != 0.0; -# endif // SNOW -# endif // LANDSCAPE +# endif // SNOW +# endif // LANDSCAPE -# if defined(BACK_LIGHTING) +# if defined(BACK_LIGHTING) float4 backLightColor = TexBackLightSampler.Sample(SampBackLightSampler, uv); -# endif // BACK_LIGHTING +# endif // BACK_LIGHTING -# if defined(RIM_LIGHTING) || defined(SOFT_LIGHTING) || defined(LOAD_SOFT_LIGHTING) +# if defined(RIM_LIGHTING) || defined(SOFT_LIGHTING) || defined(LOAD_SOFT_LIGHTING) float4 rimSoftLightColor = TexRimSoftLightWorldMapOverlaySampler.Sample(SampRimSoftLightWorldMapOverlaySampler, uv); -# endif // RIM_LIGHTING || SOFT_LIGHTING +# endif // RIM_LIGHTING || SOFT_LIGHTING uint numLights = min(7, uint(NumLightNumShadowLight.x)); uint numShadowLights = min(4, uint(NumLightNumShadowLight.y)); -# if defined(TRUE_PBR) && !defined(MODELSPACENORMALS) +# if defined(TRUE_PBR) && !defined(MODELSPACENORMALS) if (!frontFace) { normal.xyz *= -1; } -# endif +# endif -# if defined(MODELSPACENORMALS) && !defined(SKINNED) +# if defined(MODELSPACENORMALS) && !defined(SKINNED) float4 modelNormal = normal; -# else +# else float4 modelNormal = float4(normalize(mul(tbn, normal.xyz)), 1); -# if defined(SPARKLE) +# if defined(SPARKLE) float3 projectedNormal = normalize(mul(tbn, float3(ProjectedUVParams2.xx * normal.xy, normal.z))); -# endif // SPARKLE -# endif // defined (MODELSPACENORMALS) && !defined (SKINNED) +# endif // SPARKLE +# endif // defined (MODELSPACENORMALS) && !defined (SKINNED) float2 baseShadowUV = 1.0.xx; float4 shadowColor = 1.0; @@ -1604,28 +1604,28 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float projWeight = 0; -# if defined(PROJECTED_UV) +# if defined(PROJECTED_UV) float2 projNoiseUv = ProjectedUVParams.zz * input.TexCoord0.zw; float projNoise = TexCharacterLightProjNoiseSampler.Sample(SampCharacterLightProjNoiseSampler, projNoiseUv).x; float3 texProj = normalize(input.TexProj); -# if defined(TREE_ANIM) || defined(LODOBJECTSHD) +# if defined(TREE_ANIM) || defined(LODOBJECTSHD) float vertexAlpha = 1; -# else +# else float vertexAlpha = input.Color.w; -# endif // defined (TREE_ANIM) || defined (LODOBJECTSHD) +# endif // defined (TREE_ANIM) || defined (LODOBJECTSHD) projWeight = -ProjectedUVParams.x * projNoise + (dot(modelNormal.xyz, texProj) * vertexAlpha - ProjectedUVParams.w); -# if defined(LODOBJECTSHD) +# if defined(LODOBJECTSHD) projWeight += (-0.5 + input.Color.w) * 2.5; -# endif // LODOBJECTSHD -# if defined(SPARKLE) +# endif // LODOBJECTSHD +# if defined(SPARKLE) if (projWeight < 0) discard; modelNormal.xyz = projectedNormal; -# if defined(SNOW) +# if defined(SNOW) psout.Parameters.y = 1; -# endif // SNOW -# elif !defined(FACEGEN) && !defined(MULTI_LAYER_PARALLAX) && !defined(PARALLAX) && !defined(SPARKLE) +# endif // SNOW +# elif !defined(FACEGEN) && !defined(MULTI_LAYER_PARALLAX) && !defined(PARALLAX) && !defined(SPARKLE) if (ProjectedUVParams3.w > 0.5) { float2 projNormalDiffuseUv = ProjectedUVParams3.x * projNoiseUv; float3 projNormal = TransformNormal(TexProjNormalSampler.Sample(SampProjNormalSampler, projNormalDiffuseUv).xyz); @@ -1634,7 +1634,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 finalProjNormal = normalize(TransformNormal(projDetailNormal) * float3(1, 1, projNormal.z) + float3(projNormal.xy, 0)); float3 projBaseColor = TexProjDiffuseSampler.Sample(SampProjDiffuseSampler, projNormalDiffuseUv).xyz * ProjectedUVParams2.xyz; projectedMaterialWeight = smoothstep(0, 1, 5 * (0.1 + projWeight)); -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) projBaseColor = saturate(EnvmapData.xyz * projBaseColor); rawRMAOS.xyw = lerp(rawRMAOS.xyw, float3(ParallaxOccData.x, 0, ParallaxOccData.y), projectedMaterialWeight); float4 projectedGlintParameters = 0; @@ -1642,59 +1642,59 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace projectedGlintParameters = SparkleParams; } glintParameters = lerp(glintParameters, projectedGlintParameters, projectedMaterialWeight); -# endif // TRUE_PBR +# endif // TRUE_PBR normal.xyz = lerp(normal.xyz, finalProjNormal, projectedMaterialWeight); baseColor.xyz = lerp(baseColor.xyz, projBaseColor, projectedMaterialWeight); -# if defined(SNOW) +# if defined(SNOW) useSnowDecalSpecular = true; psout.Parameters.y = GetSnowParameterY(projectedMaterialWeight, baseColor.w); -# endif // SNOW +# endif // SNOW } else { if (projWeight > 0) { baseColor.xyz = ProjectedUVParams2.xyz; -# if defined(SNOW) +# if defined(SNOW) useSnowDecalSpecular = true; psout.Parameters.y = GetSnowParameterY(projWeight, baseColor.w); -# endif // SNOW +# endif // SNOW } else { -# if defined(SNOW) +# if defined(SNOW) psout.Parameters.y = 0; -# endif // SNOW +# endif // SNOW } } -# if defined(SPECULAR) +# if defined(SPECULAR) useSnowSpecular = useSnowDecalSpecular; -# endif // SPECULAR -# endif // SPARKLE +# endif // SPECULAR +# endif // SPARKLE -# elif defined(SNOW) -# if defined(LANDSCAPE) +# elif defined(SNOW) +# if defined(LANDSCAPE) psout.Parameters.y = landSnowMask; -# else +# else psout.Parameters.y = baseColor.w; -# endif // LANDSCAPE -# endif // SNOW +# endif // LANDSCAPE +# endif // SNOW -# if defined(WORLD_MAP) +# if defined(WORLD_MAP) baseColor.xyz = GetWorldMapBaseColor(rawBaseColor.xyz, baseColor.xyz, projWeight); -# endif // WORLD_MAP +# endif // WORLD_MAP float3 worldSpaceNormal = modelNormal.xyz; -# if !defined(DRAW_IN_WORLDSPACE) +# if !defined(DRAW_IN_WORLDSPACE) [flatten] if (!input.WorldSpace) worldSpaceNormal = normalize(mul(input.World[eyeIndex], float4(worldSpaceNormal, 0))); -# endif +# endif -# if defined(MODELSPACENORMALS) +# if defined(MODELSPACENORMALS) float3 worldSpaceVertexNormal = worldSpaceNormal; -# endif +# endif float3 screenSpaceNormal = normalize(FrameBuffer::WorldToView(worldSpaceNormal, false, eyeIndex)); -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) PBR::SurfaceProperties pbrSurfaceProperties = PBR::InitSurfaceProperties(); pbrSurfaceProperties.Noise = screenNoise; @@ -1709,10 +1709,10 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace pbrSurfaceProperties.GlintMicrofacetRoughness = clamp(glintParameters.z, 0.005, 0.3); pbrSurfaceProperties.GlintDensityRandomization = clamp(glintParameters.w, 0, 5); -# if defined(GLINT) +# if defined(GLINT) float glintNoise = Random::R1Modified(SharedData::FrameCount, Random::pcg2d(uint2(input.Position.xy)) / 4294967296.0); PBR::Glints::PrecomputeGlints(glintNoise, uvOriginal, ddx(uvOriginal), ddy(uvOriginal), pbrSurfaceProperties.GlintScreenSpaceScale, pbrSurfaceProperties.GlintCache); -# endif +# endif baseColor.xyz *= 1 - pbrSurfaceProperties.Metallic; @@ -1721,7 +1721,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 coatModelNormal = modelNormal.xyz; float3 coatWorldNormal = worldSpaceNormal; -# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::Subsurface) != 0) { pbrSurfaceProperties.SubsurfaceColor = PBRParams2.xyz; @@ -1755,12 +1755,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace coatModelNormal = normalize(mul(tbn, TransformNormal(sampledCoatProperties.xyz))); } -# if !defined(DRAW_IN_WORLDSPACE) +# if !defined(DRAW_IN_WORLDSPACE) [flatten] if (!input.WorldSpace) { coatWorldNormal = normalize(mul(input.World[eyeIndex], float4(coatModelNormal, 0))); } -# endif +# endif } pbrSurfaceProperties.CoatStrength = lerp(pbrSurfaceProperties.CoatStrength, 0, projectedMaterialWeight); } @@ -1777,38 +1777,38 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } pbrSurfaceProperties.FuzzWeight = lerp(pbrSurfaceProperties.FuzzWeight, 0, projectedMaterialWeight); } -# endif +# endif float3 specularColorPBR = 0; float3 transmissionColor = 0; float pbrWeight = 1; float pbrGlossiness = 1 - pbrSurfaceProperties.Roughness; -# endif // TRUE_PBR +# endif // TRUE_PBR float porosity = 1.0; -# if defined(SKYLIGHTING) -# if defined(VR) +# if defined(SKYLIGHTING) +# if defined(VR) float3 positionMSSkylight = input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; -# else +# else float3 positionMSSkylight = input.WorldPosition.xyz; -# endif +# endif -# if defined(DEFERRED) +# if defined(DEFERRED) sh2 skylightingSH = Skylighting::sample(SharedData::skylightingSettings, Skylighting::SkylightingProbeArray, Skylighting::stbn_vec3_2Dx1D_128x128x64, input.Position.xy, positionMSSkylight, worldSpaceNormal); -# else +# else sh2 skylightingSH = inWorld ? Skylighting::sample(SharedData::skylightingSettings, Skylighting::SkylightingProbeArray, Skylighting::stbn_vec3_2Dx1D_128x128x64, input.Position.xy, positionMSSkylight, worldSpaceNormal) : float4(sqrt(4.0 * Math::PI), 0, 0, 0); -# endif +# endif -# endif +# endif float4 waterData = SharedData::GetWaterData(input.WorldPosition.xyz); float waterHeight = waterData.w; float waterRoughnessSpecular = 1; -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) float wetness = 0.0; float wetnessDistToWater = abs(input.WorldPosition.z - waterHeight); @@ -1823,11 +1823,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float maxOcclusion = 1; float minWetnessAngle = 0; minWetnessAngle = saturate(max(minWetnessValue, worldSpaceNormal.z)); -# if defined(SKYLIGHTING) +# if defined(SKYLIGHTING) float wetnessOcclusion = inWorld ? pow(saturate(SphericalHarmonics::Unproject(skylightingSH, float3(0, 0, 1))), 2) : 0; -# else +# else float wetnessOcclusion = inWorld; -# endif +# endif float4 raindropInfo = float4(0, 0, 1, 0); if (worldSpaceNormal.z > 0 && SharedData::wetnessEffectsSettings.Raining > 0.0f && SharedData::wetnessEffectsSettings.EnableRaindropFx) { @@ -1839,13 +1839,13 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float precipOcclusionZ = WetnessEffects::TexPrecipOcclusion.SampleLevel(SampColorSampler, precipOcclusionUV, 0).x; if (precipOcclusionTexCoord.z < precipOcclusionZ + 0.1) -# if defined(SKINNED) +# if defined(SKINNED) raindropInfo = WetnessEffects::GetRainDrops(input.ModelPosition.xyz, SharedData::wetnessEffectsSettings.Time, worldSpaceNormal); -# elif defined(DEFERRED) +# elif defined(DEFERRED) raindropInfo = WetnessEffects::GetRainDrops(input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz, SharedData::wetnessEffectsSettings.Time, worldSpaceNormal); -# else +# else raindropInfo = WetnessEffects::GetRainDrops(!FrameBuffer::FrameParams.y ? input.ModelPosition.xyz : input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz, SharedData::wetnessEffectsSettings.Time, worldSpaceNormal); -# endif +# endif } } @@ -1853,12 +1853,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace rainWetness = max(rainWetness, raindropInfo.w); float puddleWetness = SharedData::wetnessEffectsSettings.PuddleWetness * minWetnessAngle; -# if defined(SKIN) +# if defined(SKIN) rainWetness = SharedData::wetnessEffectsSettings.SkinWetness * SharedData::wetnessEffectsSettings.Wetness; -# endif -# if defined(HAIR) +# endif +# if defined(HAIR) rainWetness = SharedData::wetnessEffectsSettings.SkinWetness * SharedData::wetnessEffectsSettings.Wetness * 0.8f; -# endif +# endif rainWetness *= wetnessOcclusion; puddleWetness *= wetnessOcclusion; @@ -1870,11 +1870,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 puddleCoords = ((input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz) * 0.5 + 0.5) * 0.01 / SharedData::wetnessEffectsSettings.PuddleRadius; float puddle = wetness; if (wetness > 0.0 || puddleWetness > 0) { -# if !defined(SKINNED) +# if !defined(SKINNED) puddle = Random::perlinNoise(puddleCoords) * .5 + .5; puddle = puddle * ((minWetnessAngle / SharedData::wetnessEffectsSettings.PuddleMaxAngle) * SharedData::wetnessEffectsSettings.MaxPuddleWetness * 0.25) + 0.5; wetness = lerp(wetness, puddleWetness, saturate(puddle - 0.25)); -# endif +# endif puddle *= wetness; } @@ -1898,49 +1898,49 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace wetnessNormal = WetnessEffects::ReorientNormal(rippleNormal, wetnessNormal); waterRoughnessSpecular = 1.0 - wetnessGlossinessSpecular * 0.9; -# endif +# endif float3 dirLightColor = Color::Light(DirLightColor.xyz); float3 dirLightColorMultiplier = 1; -# if defined(WATER_EFFECTS) +# if defined(WATER_EFFECTS) dirLightColorMultiplier *= WaterEffects::ComputeCaustics(waterData, input.WorldPosition.xyz, worldSpaceNormal); -# endif +# endif float selfShadowFactor = 1.0f; float3 normalizedDirLightDirectionWS = DirLightDirection; -# if !defined(DRAW_IN_WORLDSPACE) +# if !defined(DRAW_IN_WORLDSPACE) [flatten] if (!input.WorldSpace) normalizedDirLightDirectionWS = normalize(mul(input.World[eyeIndex], float4(DirLightDirection.xyz, 0))); -# endif +# endif float dirLightAngle = dot(modelNormal.xyz, DirLightDirection.xyz); if ((Permutation::PixelShaderDescriptor & Permutation::LightingFlags::DefShadow) && (Permutation::PixelShaderDescriptor & Permutation::LightingFlags::ShadowDir)) { dirLightColorMultiplier *= shadowColor.x; } -# if !defined(DEFERRED) +# if !defined(DEFERRED) else if (!SharedData::InInterior && inWorld) { dirLightColorMultiplier *= ShadowSampling::GetLightingShadow(screenNoise, input.WorldPosition.xyz, eyeIndex); } -# endif +# endif -# if defined(SOFT_LIGHTING) || defined(BACK_LIGHTING) || defined(RIM_LIGHTING) +# if defined(SOFT_LIGHTING) || defined(BACK_LIGHTING) || defined(RIM_LIGHTING) bool inDirShadow = ((Permutation::PixelShaderDescriptor & Permutation::LightingFlags::DefShadow) && (Permutation::PixelShaderDescriptor & Permutation::LightingFlags::ShadowDir) && shadowColor.x == 0); -# else +# else bool inDirShadow = ((Permutation::PixelShaderDescriptor & Permutation::LightingFlags::DefShadow) && (Permutation::PixelShaderDescriptor & Permutation::LightingFlags::ShadowDir) && shadowColor.x == 0) && dirLightAngle > 0.0; -# endif +# endif float3 refractedDirLightDirection = DirLightDirection; -# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::InterlayerParallax) != 0) { if (dot(DirLightDirection, coatModelNormal) > 0) refractedDirLightDirection = -refract(-DirLightDirection, coatModelNormal, eta); } -# endif +# endif float dirDetailShadow = 1.0; float dirShadow = 1.0; @@ -1948,41 +1948,41 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace bool inReflection = Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InReflection; -# if defined(SCREEN_SPACE_SHADOWS) -# if defined(DEFERRED) +# if defined(SCREEN_SPACE_SHADOWS) +# if defined(DEFERRED) bool useScreenSpaceShadows = true; -# else +# else bool useScreenSpaceShadows = inWorld && !SharedData::InInterior && Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::IsDecal; -# endif +# endif if (useScreenSpaceShadows) { dirDetailShadow = ScreenSpaceShadows::GetScreenSpaceShadow(input.Position.xyz, screenUV, screenNoise, eyeIndex); -# if defined(TREE_ANIM) +# if defined(TREE_ANIM) ShadowSampling::ShadowData sD = ShadowSampling::SharedShadowData[0]; dirDetailShadow = lerp(1.0, dirDetailShadow, saturate(viewPosition.z / sqrt(sD.ShadowLightParam.z))); -# endif +# endif } -# endif +# endif -# if defined(EMAT) && (defined(SKINNED) || !defined(MODELSPACENORMALS)) +# if defined(EMAT) && (defined(SKINNED) || !defined(MODELSPACENORMALS)) [branch] if (inWorld && SharedData::extendedMaterialSettings.EnableShadows) { float3 dirLightDirectionTS = mul(refractedDirLightDirection, tbn).xyz; -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) [branch] if (SharedData::extendedMaterialSettings.EnableTerrainParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplierTerrain(input, uv, mipLevels, dirLightDirectionTS, sh0, parallaxShadowQuality, screenNoise, displacementParams); -# elif defined(PARALLAX) +# elif defined(PARALLAX) [branch] if (SharedData::extendedMaterialSettings.EnableParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, dirLightDirectionTS, sh0, TexParallaxSampler, SampParallaxSampler, 0, lerp(parallaxShadowQuality, 1.0, SharedData::extendedMaterialSettings.ExtendShadows), screenNoise, displacementParams); -# elif defined(EMAT_ENVMAP) +# elif defined(EMAT_ENVMAP) [branch] if (complexMaterialParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, dirLightDirectionTS, sh0, TexEnvMaskSampler, SampEnvMaskSampler, 3, lerp(parallaxShadowQuality, 1.0, SharedData::extendedMaterialSettings.ExtendShadows), screenNoise, displacementParams); -# elif defined(TRUE_PBR) && !defined(LODLANDSCAPE) +# elif defined(TRUE_PBR) && !defined(LODLANDSCAPE) [branch] if (PBRParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, dirLightDirectionTS, sh0, TexParallaxSampler, SampParallaxSampler, 0, lerp(parallaxShadowQuality, 1.0, SharedData::extendedMaterialSettings.ExtendShadows), screenNoise, displacementParams); -# endif // LANDSCAPE +# endif // LANDSCAPE } -# endif // defined(EMAT) && (defined (SKINNED) || !defined \ +# endif // defined(EMAT) && (defined (SKINNED) || !defined \ // (MODELSPACENORMALS)) if (dirShadow != 0.0 && (inWorld || inReflection)) @@ -1999,7 +1999,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 lodLandDiffuseColor = 0; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) { PBR::LightProperties lightProperties = PBR::InitLightProperties(dirLightColor, dirLightColorMultiplier * dirDetailShadow, parallaxShadow); float3 dirDiffuseColor, coatDirDiffuseColor, dirTransmissionColor, dirSpecularColor; @@ -2008,51 +2008,51 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace coatLightsDiffuseColor += coatDirDiffuseColor; transmissionColor += dirTransmissionColor; specularColorPBR += dirSpecularColor * !SharedData::InInterior; -# if defined(LOD_LAND_BLEND) +# if defined(LOD_LAND_BLEND) lodLandDiffuseColor += dirLightColor / Math::PI * saturate(dirLightAngle) * dirLightColorMultiplier * dirDetailShadow * parallaxShadow; -# endif -# if defined(WETNESS_EFFECTS) +# endif +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) specularColorPBR += PBR::GetWetnessDirectLightSpecularInput(wetnessNormal, worldSpaceViewDirection, normalizedDirLightDirectionWS, lightProperties.CoatLightColor, waterRoughnessSpecular) * wetnessGlossinessSpecular; -# endif +# endif } -# else +# else dirDetailShadow *= parallaxShadow; dirLightColor *= dirLightColorMultiplier; float3 dirDiffuseColor = dirLightColor * saturate(dirLightAngle) * dirDetailShadow; -# if defined(SOFT_LIGHTING) +# if defined(SOFT_LIGHTING) lightsDiffuseColor += dirLightColor * GetSoftLightMultiplier(dirLightAngle) * rimSoftLightColor.xyz; -# endif +# endif -# if defined(RIM_LIGHTING) +# if defined(RIM_LIGHTING) lightsDiffuseColor += dirLightColor * GetRimLightMultiplier(DirLightDirection, viewDirection, modelNormal.xyz) * rimSoftLightColor.xyz; -# endif +# endif -# if defined(BACK_LIGHTING) +# if defined(BACK_LIGHTING) lightsDiffuseColor += dirLightColor * saturate(-dirLightAngle) * backLightColor.xyz; -# endif +# endif if (useSnowSpecular && useSnowDecalSpecular) { -# if defined(SNOW) +# if defined(SNOW) lightsSpecularColor += GetSnowSpecularColor(input, modelNormal.xyz, viewDirection); -# endif +# endif } else { -# if defined(SPECULAR) || defined(SPARKLE) +# if defined(SPECULAR) || defined(SPARKLE) lightsSpecularColor = GetLightSpecularInput(input, DirLightDirection, viewDirection, modelNormal.xyz, dirLightColor.xyz * dirDetailShadow, shininess, uv); -# endif +# endif } lightsDiffuseColor += dirDiffuseColor; -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) wetnessSpecular += WetnessEffects::GetWetnessSpecular(wetnessNormal, normalizedDirLightDirectionWS, worldSpaceViewDirection, dirLightColor * dirDetailShadow, waterRoughnessSpecular); +# endif # endif -# endif -# if !defined(LOD) -# if !defined(LIGHT_LIMIT_FIX) +# if !defined(LOD) +# if !defined(LIGHT_LIMIT_FIX) [loop] for (uint lightIndex = 0; lightIndex < numLights; lightIndex++) { float3 lightDirection = PointLightPosition[eyeIndex * numLights + lightIndex].xyz - input.InputPosition.xyz; @@ -2072,17 +2072,17 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 normalizedLightDirection = normalize(lightDirection); -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) { float3 pointDiffuseColor, coatPointDiffuseColor, pointTransmissionColor, pointSpecularColor; float3 refractedLightDirection = normalizedLightDirection; -# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::InterlayerParallax) != 0) { if (dot(normalizedLightDirection, coatModelNormal) > 0) refractedLightDirection = -refract(-normalizedLightDirection, coatModelNormal, eta); } -# endif +# endif PBR::LightProperties lightProperties = PBR::InitLightProperties(lightColor, lightShadow, 1); PBR::GetDirectLightInput(pointDiffuseColor, coatPointDiffuseColor, pointTransmissionColor, pointSpecularColor, modelNormal.xyz, coatModelNormal, refractedViewDirection, viewDirection, refractedLightDirection, normalizedLightDirection, lightProperties, pbrSurfaceProperties, tbnTr, uvOriginal); lightsDiffuseColor += pointDiffuseColor; @@ -2090,38 +2090,38 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace transmissionColor += pointTransmissionColor; specularColorPBR += pointSpecularColor; } -# else +# else lightColor *= lightShadow; float lightAngle = dot(modelNormal.xyz, normalizedLightDirection.xyz); float3 lightDiffuseColor = lightColor * saturate(lightAngle.xxx); -# if defined(SOFT_LIGHTING) +# if defined(SOFT_LIGHTING) lightDiffuseColor += lightColor * GetSoftLightMultiplier(lightAngle) * rimSoftLightColor.xyz; -# endif // SOFT_LIGHTING +# endif // SOFT_LIGHTING -# if defined(RIM_LIGHTING) +# if defined(RIM_LIGHTING) lightDiffuseColor += lightColor * GetRimLightMultiplier(normalizedLightDirection, viewDirection, modelNormal.xyz) * rimSoftLightColor.xyz; -# endif // RIM_LIGHTING +# endif // RIM_LIGHTING -# if defined(BACK_LIGHTING) +# if defined(BACK_LIGHTING) lightDiffuseColor += lightColor * saturate(-lightAngle) * backLightColor.xyz; -# endif // BACK_LIGHTING +# endif // BACK_LIGHTING -# if defined(SPECULAR) || (defined(SPARKLE) && !defined(SNOW)) +# if defined(SPECULAR) || (defined(SPARKLE) && !defined(SNOW)) lightsSpecularColor += GetLightSpecularInput(input, normalizedLightDirection, viewDirection, modelNormal.xyz, lightColor, shininess, uv); -# endif // defined (SPECULAR) || (defined (SPARKLE) && !defined(SNOW)) +# endif // defined (SPECULAR) || (defined (SPARKLE) && !defined(SNOW)) lightsDiffuseColor += lightDiffuseColor; -# endif +# endif } -# else +# else -# if defined(ANISO_LIGHTING) +# if defined(ANISO_LIGHTING) input.TBN0.z = worldSpaceVertexNormal[0]; input.TBN1.z = worldSpaceVertexNormal[1]; input.TBN2.z = worldSpaceVertexNormal[2]; -# endif +# endif uint numClusteredLights = 0; uint totalLightCount = LightLimitFix::NumStrictLights; @@ -2181,17 +2181,17 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } float3 refractedLightDirection = normalizedLightDirection; -# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::InterlayerParallax) != 0) { if (dot(normalizedLightDirection, coatWorldNormal) > 0) refractedLightDirection = -refract(-normalizedLightDirection, coatWorldNormal, eta); } -# endif +# endif float parallaxShadow = 1; -# if defined(EMAT) +# if defined(EMAT) [branch] if ( SharedData::extendedMaterialSettings.EnableShadows && !(light.lightFlags & LightLimitFix::LightFlags::Simple) && @@ -2200,23 +2200,23 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace contactShadow != 0.0) { float3 lightDirectionTS = normalize(mul(refractedLightDirection, tbn).xyz); -# if defined(PARALLAX) +# if defined(PARALLAX) [branch] if (SharedData::extendedMaterialSettings.EnableParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, lightDirectionTS, sh0, TexParallaxSampler, SampParallaxSampler, 0, parallaxShadowQuality, screenNoise, displacementParams); -# elif defined(LANDSCAPE) +# elif defined(LANDSCAPE) [branch] if (SharedData::extendedMaterialSettings.EnableTerrainParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplierTerrain(input, uv, mipLevels, lightDirectionTS, sh0, parallaxShadowQuality, screenNoise, displacementParams); -# elif defined(EMAT_ENVMAP) +# elif defined(EMAT_ENVMAP) [branch] if (complexMaterialParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, lightDirectionTS, sh0, TexEnvMaskSampler, SampEnvMaskSampler, 3, parallaxShadowQuality, screenNoise, displacementParams); -# elif defined(TRUE_PBR) && !defined(LODLANDSCAPE) +# elif defined(TRUE_PBR) && !defined(LODLANDSCAPE) [branch] if (PBRParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, lightDirectionTS, sh0, TexParallaxSampler, SampParallaxSampler, 0, parallaxShadowQuality, screenNoise, displacementParams); -# endif +# endif } -# endif +# endif -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) { PBR::LightProperties lightProperties = PBR::InitLightProperties(lightColor, lightShadow * contactShadow, parallaxShadow); float3 pointDiffuseColor, coatPointDiffuseColor, pointTransmissionColor, pointSpecularColor; @@ -2225,97 +2225,97 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace coatLightsDiffuseColor += coatPointDiffuseColor; transmissionColor += pointTransmissionColor; specularColorPBR += pointSpecularColor; -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) specularColorPBR += PBR::GetWetnessDirectLightSpecularInput(wetnessNormal, worldSpaceViewDirection, normalizedLightDirection, lightProperties.CoatLightColor, waterRoughnessSpecular) * wetnessGlossinessSpecular; -# endif +# endif } -# else +# else lightColor *= lightShadow; float3 lightDiffuseColor = lightColor * contactShadow * parallaxShadow * saturate(lightAngle.xxx); -# if defined(SOFT_LIGHTING) +# if defined(SOFT_LIGHTING) lightDiffuseColor += lightColor * GetSoftLightMultiplier(lightAngle) * rimSoftLightColor.xyz; -# endif +# endif -# if defined(RIM_LIGHTING) +# if defined(RIM_LIGHTING) lightDiffuseColor += lightColor * GetRimLightMultiplier(normalizedLightDirection, worldSpaceViewDirection, worldSpaceNormal.xyz) * rimSoftLightColor.xyz; -# endif +# endif -# if defined(BACK_LIGHTING) +# if defined(BACK_LIGHTING) lightDiffuseColor += lightColor * saturate(-lightAngle) * backLightColor.xyz; -# endif +# endif -# if defined(SPECULAR) || (defined(SPARKLE) && !defined(SNOW)) +# if defined(SPECULAR) || (defined(SPARKLE) && !defined(SNOW)) lightsSpecularColor += GetLightSpecularInput(input, normalizedLightDirection, worldSpaceViewDirection, worldSpaceNormal.xyz, lightColor, shininess, uv); -# endif +# endif lightsDiffuseColor += lightDiffuseColor; -# endif +# endif -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) wetnessSpecular += WetnessEffects::GetWetnessSpecular(wetnessNormal, normalizedLightDirection, worldSpaceViewDirection, lightColor, waterRoughnessSpecular); -# endif +# endif } +# endif # endif -# endif diffuseColor += lightsDiffuseColor; specularColor += lightsSpecularColor; -# if !defined(LANDSCAPE) +# if !defined(LANDSCAPE) if (Permutation::PixelShaderDescriptor & Permutation::LightingFlags::CharacterLight) { float charLightMul = saturate(dot(worldSpaceViewDirection, worldSpaceNormal.xyz)) * CharacterLightParams.x + CharacterLightParams.y * saturate(dot(float2(0.164398998, -0.986393988), worldSpaceNormal.yz)); float charLightColor = min(CharacterLightParams.w, max(0, CharacterLightParams.z * TexCharacterLightProjNoiseSampler.Sample(SampCharacterLightProjNoiseSampler, baseShadowUV).x)); diffuseColor += (charLightMul * charLightColor).xxx; } -# endif +# endif -# if defined(EYE) +# if defined(EYE) modelNormal.xyz = input.EyeNormal; -# endif // EYE +# endif // EYE float3 emitColor = EmitColor; -# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) bool hasEmissive = (0x3F & (Permutation::PixelShaderDescriptor >> 24)) == Permutation::LightingTechnique::Glowmap; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) hasEmissive = hasEmissive || (PBRFlags & PBR::Flags::HasEmissive != 0); -# endif +# endif [branch] if (hasEmissive) { float3 glowColor = Color::Diffuse(TexGlowSampler.Sample(SampGlowSampler, uv).xyz); emitColor *= glowColor; } -# endif +# endif -# if !defined(TRUE_PBR) +# if !defined(TRUE_PBR) diffuseColor += emitColor.xyz; -# endif +# endif float3 directionalAmbientColor = mul(DirectionalAmbient, modelNormal); float3 reflectionDiffuseColor = diffuseColor + directionalAmbientColor; -# if defined(SKYLIGHTING) +# if defined(SKYLIGHTING) float skylightingDiffuse = SphericalHarmonics::FuncProductIntegral(skylightingSH, SphericalHarmonics::EvaluateCosineLobe(float3(worldSpaceNormal.xy, worldSpaceNormal.z * 0.5 + 0.5))) / Math::PI; skylightingDiffuse = lerp(1.0, skylightingDiffuse, Skylighting::getFadeOutFactor(input.WorldPosition.xyz)); skylightingDiffuse = Skylighting::mixDiffuse(SharedData::skylightingSettings, skylightingDiffuse); directionalAmbientColor = Color::GammaToLinear(directionalAmbientColor); directionalAmbientColor *= skylightingDiffuse; directionalAmbientColor = Color::LinearToGamma(directionalAmbientColor); -# endif +# endif -# if defined(TRUE_PBR) && defined(LOD_LAND_BLEND) && !defined(DEFERRED) +# if defined(TRUE_PBR) && defined(LOD_LAND_BLEND) && !defined(DEFERRED) lodLandDiffuseColor += directionalAmbientColor; -# endif +# endif -# if !(defined(DEFERRED) && defined(SSGI)) && !defined(TRUE_PBR) +# if !(defined(DEFERRED) && defined(SSGI)) && !defined(TRUE_PBR) diffuseColor += directionalAmbientColor; -# endif +# endif -# if defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE) +# if defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE) float envMask = EnvmapData.x * MaterialData.x; float viewNormalAngle = dot(worldSpaceNormal.xyz, viewDirection); @@ -2332,38 +2332,38 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 envColor = 0.0; bool dynamicCubemap = false; -# if defined(DYNAMIC_CUBEMAPS) +# if defined(DYNAMIC_CUBEMAPS) float3 F0 = 0.0; float envRoughness = 1.0; -# endif +# endif if (envMask > 0.0) { -# if defined(DYNAMIC_CUBEMAPS) +# if defined(DYNAMIC_CUBEMAPS) uint2 envSize; TexEnvSampler.GetDimensions(envSize.x, envSize.y); -# if defined(EMAT) +# if defined(EMAT) if (envSize.x == 1 && envSize.y == 1 || complexMaterial) { -# else +# else if (envSize.x == 1 && envSize.y == 1) { -# endif +# endif dynamicCubemap = true; -# if defined(EMAT) +# if defined(EMAT) if (!complexMaterial) -# endif +# endif { // Dynamic Cubemap Creator sets this value to black, if it is anything but black it is wrong float3 envColorTest = TexEnvSampler.SampleLevel(SampEnvSampler, float3(0.0, 1.0, 0.0), 15); dynamicCubemap = all(envColorTest == 0.0); } -# if defined(CREATOR) +# if defined(CREATOR) if (SharedData::cubemapCreatorSettings.Enabled) { dynamicCubemap = true; } -# endif +# endif if (dynamicCubemap) { float4 envColorBase = TexEnvSampler.SampleLevel(SampEnvSampler, float3(1.0, 0.0, 0.0), 15); @@ -2376,30 +2376,30 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace envRoughness = 1.0 / 7.0; } -# if defined(CREATOR) +# if defined(CREATOR) if (SharedData::cubemapCreatorSettings.Enabled) { F0 = SharedData::cubemapCreatorSettings.CubemapColor.rgb; envRoughness = SharedData::cubemapCreatorSettings.CubemapColor.a; } -# endif +# endif -# if defined(EMAT) +# if defined(EMAT) float complexMaterialRoughness = 1.0 - complexMaterialColor.y; envRoughness = lerp(envRoughness, pow(complexMaterialRoughness, 1.5), complexMaterial); F0 = lerp(F0, Color::GammaToLinear(complexSpecular), complexMaterial); -# endif +# endif if (any(F0 > 0.0)) -# if defined(SKYLIGHTING) +# if defined(SKYLIGHTING) envColor = DynamicCubemaps::GetDynamicCubemap(worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, envRoughness, F0, skylightingSH) * envMask; -# else +# else envColor = DynamicCubemaps::GetDynamicCubemap(worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, envRoughness, F0, ) * envMask; -# endif +# endif else envColor = 0.0; } } -# endif +# endif if (!dynamicCubemap) { float3 envColorBase = TexEnvSampler.Sample(SampEnvSampler, envSamplingPoint); @@ -2407,46 +2407,46 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } } -# endif // defined (ENVMAP) || defined (MULTI_LAYER_PARALLAX) || defined(EYE) +# endif // defined (ENVMAP) || defined (MULTI_LAYER_PARALLAX) || defined(EYE) float2 screenMotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, eyeIndex); -# if defined(WETNESS_EFFECTS) -# if !(defined(FACEGEN) || defined(FACEGEN_RGB_TINT) || defined(EYE)) || defined(TREE_ANIM) -# if defined(TRUE_PBR) -# if !defined(LANDSCAPE) +# if defined(WETNESS_EFFECTS) +# if !(defined(FACEGEN) || defined(FACEGEN_RGB_TINT) || defined(EYE)) || defined(TREE_ANIM) +# if defined(TRUE_PBR) +# if !defined(LANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::TwoLayer) != 0) { porosity = 0; } else -# endif +# endif { porosity = lerp(porosity, 0.0, saturate(sqrt(pbrSurfaceProperties.Metallic))); } -# elif defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) +# elif defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) porosity = lerp(porosity, 0.0, saturate(sqrt(envMask))); -# endif +# endif float wetnessDarkeningAmount = porosity * wetnessGlossinessAlbedo; baseColor.xyz = lerp(baseColor.xyz, pow(baseColor.xyz, 1.0 + wetnessDarkeningAmount), 0.8); -# endif +# endif float3 wetnessReflectance = WetnessEffects::GetWetnessAmbientSpecular(screenUV, wetnessNormal, worldSpaceVertexNormal, worldSpaceViewDirection, waterRoughnessSpecular) * wetnessGlossinessSpecular; -# if !defined(DEFERRED) +# if !defined(DEFERRED) wetnessSpecular += wetnessReflectance; +# endif # endif -# endif -# if defined(HAIR) +# if defined(HAIR) float3 vertexColor = lerp(1, TintColor.xyz, input.Color.y); -# else +# else float3 vertexColor = input.Color.xyz; -# endif // defined (HAIR) +# endif // defined (HAIR) float4 color = 0; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) { float3 directLightsDiffuseInput = diffuseColor * baseColor.xyz; [branch] if ((PBRFlags & PBR::Flags::ColoredCoat) != 0) @@ -2459,28 +2459,28 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 indirectDiffuseLobeWeight, indirectSpecularLobeWeight; PBR::GetIndirectLobeWeights(indirectDiffuseLobeWeight, indirectSpecularLobeWeight, worldSpaceNormal.xyz, worldSpaceViewDirection, worldSpaceVertexNormal, baseColor.xyz, pbrSurfaceProperties); -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) indirectSpecularLobeWeight += PBR::GetWetnessIndirectSpecularLobeWeight(wetnessNormal, worldSpaceViewDirection, worldSpaceVertexNormal, waterRoughnessSpecular) * wetnessGlossinessSpecular; -# endif +# endif -# if !(defined(DEFERRED) && defined(SSGI)) +# if !(defined(DEFERRED) && defined(SSGI)) color.xyz += indirectDiffuseLobeWeight * directionalAmbientColor; -# endif +# endif -# if !defined(DEFERRED) -# if defined(DYNAMIC_CUBEMAPS) -# if defined(SKYLIGHTING) +# if !defined(DEFERRED) +# if defined(DYNAMIC_CUBEMAPS) +# if defined(SKYLIGHTING) specularColorPBR += indirectSpecularLobeWeight * DynamicCubemaps::GetDynamicCubemapSpecularIrradiance(screenUV, worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, pbrSurfaceProperties.Roughness, skylightingSH); -# else +# else specularColorPBR += indirectSpecularLobeWeight * DynamicCubemaps::GetDynamicCubemapSpecularIrradiance(screenUV, worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, pbrSurfaceProperties.Roughness); +# endif +# else + specularColorPBR += indirectSpecularLobeWeight * directionalAmbientColor; # endif # else - specularColorPBR += indirectSpecularLobeWeight * directionalAmbientColor; -# endif -# else indirectDiffuseLobeWeight *= vertexColor; -# endif +# endif // Fixes white items in UI for VR [branch] if ((PBRFlags & PBR::Flags::HasEmissive) != 0) @@ -2488,13 +2488,13 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace color.xyz += emitColor.xyz; } color.xyz += transmissionColor; -# else +# else color.xyz += diffuseColor * baseColor.xyz; -# endif +# endif color.xyz *= vertexColor; -# if defined(MULTI_LAYER_PARALLAX) +# if defined(MULTI_LAYER_PARALLAX) float layerValue = MultiLayerParallaxData.x * TexLayerSampler.Sample(SampLayerSampler, uv).w; float3 tangentViewDirection = mul(viewDirection, tbn); float3 layerNormal = MultiLayerParallaxData.yyy * (normalColor.xyz * 2.0.xxx + float3(-1, -1, -2)) + float3(0, 0, 1); @@ -2506,59 +2506,59 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float mlpBlendFactor = saturate(viewNormalAngle) * (1.0 - baseColor.w); -# if defined(DEFERRED) && defined(SSGI) +# if defined(DEFERRED) && defined(SSGI) color.xyz = lerp(color.xyz, (diffuseColor + directionalAmbientColor) * vertexColor * layerColor, mlpBlendFactor); -# else +# else color.xyz = lerp(color.xyz, diffuseColor * vertexColor * layerColor, mlpBlendFactor); -# endif +# endif -# if defined(DEFERRED) +# if defined(DEFERRED) baseColor.xyz *= 1.0 - mlpBlendFactor; -# endif -# endif // MULTI_LAYER_PARALLAX +# endif +# endif // MULTI_LAYER_PARALLAX -# if defined(SPECULAR) -# if defined(EMAT_ENVMAP) +# if defined(SPECULAR) +# if defined(EMAT_ENVMAP) specularColor = (specularColor * glossiness * MaterialData.yyy) * lerp(SpecularColor.xyz, complexSpecular, complexMaterial); -# else +# else specularColor = (specularColor * glossiness * MaterialData.yyy) * SpecularColor.xyz; -# endif -# elif defined(SPARKLE) +# endif +# elif defined(SPARKLE) specularColor *= glossiness; -# endif // SPECULAR +# endif // SPECULAR -# if defined(SNOW) +# if defined(SNOW) if (useSnowSpecular) specularColor = 0; -# endif +# endif diffuseColor = reflectionDiffuseColor; -# if (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) -# if defined(DYNAMIC_CUBEMAPS) +# if (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) +# if defined(DYNAMIC_CUBEMAPS) if (!dynamicCubemap) -# endif +# endif specularColor += envColor * diffuseColor; -# endif +# endif -# if defined(EMAT_ENVMAP) +# if defined(EMAT_ENVMAP) specularColor *= complexSpecular; -# endif // defined (EMAT) && defined(ENVMAP) +# endif // defined (EMAT) && defined(ENVMAP) -# if !defined(TRUE_PBR) +# if !defined(TRUE_PBR) specularColor = Color::GammaToLinear(specularColor); -# endif +# endif -# if !defined(DEFERRED) && defined(DYNAMIC_CUBEMAPS) && (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) +# if !defined(DEFERRED) && defined(DYNAMIC_CUBEMAPS) && (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) if (dynamicCubemap) specularColor += envColor; -# endif +# endif -# if defined(WETNESS_EFFECTS) && !defined(TRUE_PBR) +# if defined(WETNESS_EFFECTS) && !defined(TRUE_PBR) specularColor += wetnessSpecular * wetnessGlossinessSpecular; -# endif +# endif -# if defined(LOD_LAND_BLEND) && defined(TRUE_PBR) +# if defined(LOD_LAND_BLEND) && defined(TRUE_PBR) { pbrWeight = 1 - lodLandBlendFactor; @@ -2570,21 +2570,21 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace indirectSpecularLobeWeight = lerp(indirectSpecularLobeWeight, 0, lodLandBlendFactor); pbrGlossiness = lerp(pbrGlossiness, 0, lodLandBlendFactor); } -# endif // defined(LOD_LAND_BLEND) && defined(TRUE_PBR) +# endif // defined(LOD_LAND_BLEND) && defined(TRUE_PBR) -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) color.xyz *= Color::PBRLightingScale; specularColorPBR *= Color::PBRLightingScale; specularColor += specularColorPBR; -# endif +# endif -# if !defined(DEFERRED) +# if !defined(DEFERRED) color.xyz = Color::LinearToGamma(Color::GammaToLinear(color.xyz) + specularColor); if (FrameBuffer::FrameParams.y && FrameBuffer::FrameParams.z) color.xyz = lerp(color.xyz, input.FogParam.xyz, input.FogParam.w); -# endif +# endif -# if defined(TESTCUBEMAP) && defined(ENVMAP) && defined(DYNAMIC_CUBEMAPS) +# if defined(TESTCUBEMAP) && defined(ENVMAP) && defined(DYNAMIC_CUBEMAPS) baseColor.xyz = 0.0; specularColor = 0.0; diffuseColor = 0.0; @@ -2592,23 +2592,23 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace envColor = 1.0; envRoughness = 0.0; color.xyz = 0; -# endif +# endif -# if defined(LANDSCAPE) && !defined(LOD_LAND_BLEND) +# if defined(LANDSCAPE) && !defined(LOD_LAND_BLEND) psout.Diffuse.w = 0; -# else +# else float alpha = baseColor.w; -# if defined(EMAT) && !defined(LANDSCAPE) -# if defined(PARALLAX) +# if defined(EMAT) && !defined(LANDSCAPE) +# if defined(PARALLAX) alpha = TexColorSampler.SampleBias(SampColorSampler, uvOriginal, SharedData::MipBias).w; -# elif defined(TRUE_PBR) +# elif defined(TRUE_PBR) [branch] if (PBRParallax) { alpha = TexColorSampler.SampleBias(SampColorSampler, uvOriginal, SharedData::MipBias).w; } +# endif # endif -# endif -# if defined(DO_ALPHA_TEST) +# if defined(DO_ALPHA_TEST) [branch] if ((Permutation::PixelShaderDescriptor & Permutation::LightingFlags::AdditionalAlphaMask) != 0) { uint2 alphaMask = input.Position.xy; @@ -2639,28 +2639,28 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } } else -# endif // defined(DO_ALPHA_TEST) +# endif // defined(DO_ALPHA_TEST) { alpha *= MaterialData.z; } -# if !(defined(TREE_ANIM) || defined(LODOBJECTSHD) || defined(LODOBJECTS)) +# if !(defined(TREE_ANIM) || defined(LODOBJECTSHD) || defined(LODOBJECTS)) alpha *= input.Color.w; -# endif // !(defined(TREE_ANIM) || defined(LODOBJECTSHD) || defined(LODOBJECTS)) -# if defined(DO_ALPHA_TEST) -# if defined(DEPTH_WRITE_DECALS) +# endif // !(defined(TREE_ANIM) || defined(LODOBJECTSHD) || defined(LODOBJECTS)) +# if defined(DO_ALPHA_TEST) +# if defined(DEPTH_WRITE_DECALS) if (alpha - 0.0156862754 < 0) { discard; } alpha = saturate(1.05 * alpha); -# endif // DEPTH_WRITE_DECALS +# endif // DEPTH_WRITE_DECALS if (alpha - AlphaTestRefRS < 0) { discard; } -# endif // DO_ALPHA_TEST +# endif // DO_ALPHA_TEST psout.Diffuse.w = alpha; -# endif -# if defined(LIGHT_LIMIT_FIX) && defined(LLFDEBUG) +# endif +# if defined(LIGHT_LIMIT_FIX) && defined(LLFDEBUG) if (SharedData::lightLimitFixSettings.EnableLightsVisualisation) { if (SharedData::lightLimitFixSettings.LightsVisualisationMode == 0) { psout.Diffuse.xyz = LightLimitFix::TurboColormap(LightLimitFix::NumStrictLights >= 7.0); @@ -2675,27 +2675,27 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } else { psout.Diffuse.xyz = color.xyz; } -# else +# else psout.Diffuse.xyz = color.xyz; -# endif // defined(LIGHT_LIMIT_FIX) +# endif // defined(LIGHT_LIMIT_FIX) -# if defined(SNOW) -# if defined(TRUE_PBR) +# if defined(SNOW) +# if defined(TRUE_PBR) psout.Parameters.x = Color::RGBToLuminanceAlternative(specularColor); psout.Parameters.y = 0; -# else +# else psout.Parameters.x = Color::RGBToLuminanceAlternative(lightsSpecularColor); -# endif -# endif // SNOW && !PBR +# endif +# endif // SNOW && !PBR psout.MotionVectors.xy = SSRParams.z > 1e-5 ? float2(1, 0) : screenMotionVector.xy; psout.MotionVectors.zw = float2(0, 1); -# if !defined(DEFERRED) +# if !defined(DEFERRED) float ssrMask = glossiness; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) ssrMask = Color::RGBToLuminanceAlternative(pbrSurfaceProperties.F0); -# endif +# endif psout.ScreenSpaceNormals.w = smoothstep(-1e-5 + SSRParams.x, SSRParams.y, ssrMask) * SSRParams.w; // Green reflections fix @@ -2707,71 +2707,71 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace psout.ScreenSpaceNormals.xy = screenSpaceNormal.xy + 0.5.xx; psout.ScreenSpaceNormals.z = 0; -# else +# else -# if defined(TERRAIN_BLENDING) +# if defined(TERRAIN_BLENDING) psout.Diffuse.w = blendFactorTerrain; -# endif +# endif psout.MotionVectors.zw = float2(0.0, psout.Diffuse.w); psout.Specular = float4(specularColor, psout.Diffuse.w); float3 outputAlbedo = baseColor.xyz * vertexColor; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) outputAlbedo = indirectDiffuseLobeWeight; -# endif +# endif psout.Albedo = float4(outputAlbedo, psout.Diffuse.w); const float wetnessGlossinessGain = 0.65; float outGlossiness = saturate(glossiness * SSRParams.w); -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) psout.Reflectance = float4(indirectSpecularLobeWeight, psout.Diffuse.w); -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), lerp(pbrGlossiness, saturate(pbrGlossiness + wetnessGlossinessGain), wetnessGlossinessSpecular), psout.Diffuse.w); -# else +# else psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), pbrGlossiness, psout.Diffuse.w); -# endif -# elif defined(WETNESS_EFFECTS) +# endif +# elif defined(WETNESS_EFFECTS) psout.Reflectance = float4(wetnessReflectance, psout.Diffuse.w); psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), lerp(outGlossiness, saturate(outGlossiness + wetnessGlossinessGain), wetnessGlossinessSpecular), psout.Diffuse.w); -# else +# else psout.Reflectance = float4(0.0.xxx, psout.Diffuse.w); psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), outGlossiness, psout.Diffuse.w); -# endif +# endif -# if defined(TERRAIN_BLENDING) +# if defined(TERRAIN_BLENDING) psout.NormalGlossiness.w = 1; -# endif +# endif -# if defined(SNOW) +# if defined(SNOW) psout.Parameters.w = psout.Diffuse.w; -# endif +# endif -# if (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) -# if defined(DYNAMIC_CUBEMAPS) +# if (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) +# if defined(DYNAMIC_CUBEMAPS) if (dynamicCubemap) { -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) psout.Reflectance.xyz = max(envColor, wetnessReflectance); psout.NormalGlossiness.z = lerp(1.0 - envRoughness, saturate(1.0 - envRoughness + wetnessGlossinessGain), wetnessGlossinessSpecular); -# else +# else psout.Reflectance.xyz = envColor; psout.NormalGlossiness.z = 1.0 - envRoughness; -# endif +# endif } +# endif # endif -# endif -# if defined(SSS) && defined(SKIN) +# if defined(SSS) && defined(SKIN) psout.Masks = float4(saturate(baseColor.a), !(Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::IsBeastRace), 0, psout.Diffuse.w); -# elif defined(WETNESS_EFFECTS) +# elif defined(WETNESS_EFFECTS) float wetnessNormalAmount = saturate(dot(float3(0, 0, 1), wetnessNormal) * saturate(flatnessAmount)); psout.Masks = float4(0, 0, wetnessNormalAmount, psout.Diffuse.w); -# else +# else psout.Masks = float4(0, 0, 0, psout.Diffuse.w); +# endif # endif -# endif return psout; } -#endif // PSHADER \ No newline at end of file +# endif // PSHADER \ No newline at end of file diff --git a/src/FeatureBuffer.cpp b/src/FeatureBuffer.cpp index fa4925f73d..8cd9f86cea 100644 --- a/src/FeatureBuffer.cpp +++ b/src/FeatureBuffer.cpp @@ -9,7 +9,6 @@ #include "Features/SnowCover.h" #include "Features/TerrainShadows.h" #include "Features/WetnessEffects.h" -#include "Features/SnowCover.h" #include "TruePBR.h" diff --git a/src/Globals.cpp b/src/Globals.cpp index 720b5d15b1..4e36c1e0ba 100644 --- a/src/Globals.cpp +++ b/src/Globals.cpp @@ -18,13 +18,13 @@ #include "Features/ScreenSpaceGI.h" #include "Features/ScreenSpaceShadows.h" #include "Features/Skylighting.h" +#include "Features/SnowCover.h" #include "Features/SubsurfaceScattering.h" #include "Features/TerrainBlending.h" #include "Features/TerrainShadows.h" #include "Features/VolumetricLighting.h" #include "Features/WaterEffects.h" #include "Features/WetnessEffects.h" -#include "Features/SnowCover.h" #include "Features/LightLimitFix/ParticleLights.h" From 4248c54ab9826f5366ea39335fc7fd588d3abbeb Mon Sep 17 00:00:00 2001 From: Exist Date: Sun, 23 Feb 2025 22:53:30 +0100 Subject: [PATCH 024/131] commonlib call fix --- src/Features/SnowCover.cpp | 14 +++++++------- src/Features/WetnessEffects.h | 6 +----- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/Features/SnowCover.cpp b/src/Features/SnowCover.cpp index 20f091ac74..a3caead6b9 100644 --- a/src/Features/SnowCover.cpp +++ b/src/Features/SnowCover.cpp @@ -124,8 +124,8 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() if (sky->mode.get() == RE::Sky::Mode::kFull) { if (auto currentWeather = sky->currentWeather) { if (currentWeather->precipitationData && currentWeather->data.flags.any(RE::TESWeather::WeatherDataFlag::kSnow)) { - float particleDensity = currentWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity)].f; - float particleGravity = currentWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kGravityVelocity)].f; + float particleDensity = currentWeather->precipitationData->GetSettingValue(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity).f; + float particleGravity = currentWeather->precipitationData->GetSettingValue(RE::BGSShaderParticleGeometryData::DataID::kGravityVelocity).f; currentWeatherSnowing = std::clamp(((particleDensity * particleGravity) / AVERAGE_RAIN_VOLUME), MIN_RAINDROP_CHANCE_MULTIPLIER, MAX_RAINDROP_CHANCE_MULTIPLIER); } currentWeatherID = currentWeather->GetFormID(); @@ -158,8 +158,8 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() CalculateWetness(lastWeather, sky, seconds, lastWeatherWetnessDepth); // If it was raining, wait to transition until precipitation ends, otherwise use the current weather's fade in if (lastWeather->precipitationData && lastWeather->data.flags.any(RE::TESWeather::WeatherDataFlag::kRainy)) { - float particleDensity = lastWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity)].f; - float particleGravity = lastWeather->precipitationData->data[static_cast(RE::BGSShaderParticleGeometryData::DataID::kGravityVelocity)].f; + float particleDensity = currentWeather->precipitationData->GetSettingValue(RE::BGSShaderParticleGeometryData::DataID::kParticleDensity).f; + float particleGravity = currentWeather->precipitationData->GetSettingValue(RE::BGSShaderParticleGeometryData::DataID::kGravityVelocity).f; lastWeatherSnowing = std::clamp(((particleDensity * particleGravity) / AVERAGE_RAIN_VOLUME), MIN_RAINDROP_CHANCE_MULTIPLIER, MAX_RAINDROP_CHANCE_MULTIPLIER); weatherTransitionPercentage = CalculateWeatherTransitionPercentage(sky->currentWeatherPct, lastWeather->data.precipitationEndFadeOut, false); } else { @@ -194,8 +194,8 @@ SnowCover::PerFrame SnowCover::GetCommonBufferData() void SnowCover::SetupResources() { - auto& device = State::GetSingleton()->device; - auto& context = State::GetSingleton()->context; + auto device = globals::d3d::device; + auto context = globals::d3d::context; HRESULT hr = DirectX::CreateDDSTextureFromFile(device, context, L"Data\\Shaders\\SnowCover\\snow.dds", nullptr, &views.at(0)); if (hr != S_OK) logger::warn("Snow Cover: Error loading diffuse texture: {}", hr); @@ -212,7 +212,7 @@ void SnowCover::SetupResources() void SnowCover::Prepass() { - auto& context = State::GetSingleton()->context; + auto context = globals::d3d::context; context->PSSetShaderResources(73, (uint)views.size(), views.data()); } diff --git a/src/Features/WetnessEffects.h b/src/Features/WetnessEffects.h index 38b30c8d90..06ac6a26c9 100644 --- a/src/Features/WetnessEffects.h +++ b/src/Features/WetnessEffects.h @@ -46,8 +46,6 @@ struct WetnessEffects : Feature float RippleLifetime = .15f; }; - static_assert(sizeof(Settings) % 16 == 0); - struct alignas(16) PerFrame { REX::W32::XMFLOAT4X4 OcclusionViewProj; @@ -59,8 +57,6 @@ struct WetnessEffects : Feature uint pad0[3]; }; - static_assert(sizeof(PerFrame) % 16 == 0); - Settings settings; PerFrame GetCommonBufferData(); @@ -75,4 +71,4 @@ struct WetnessEffects : Feature virtual void RestoreDefaultSettings() override; virtual bool SupportsVR() override { return true; }; -}; +}; \ No newline at end of file From 0fc47a854565c6521d66f121c5659c1d6545a846 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Sun, 23 Feb 2025 21:54:16 +0000 Subject: [PATCH 025/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package/Shaders/Lighting.hlsl | 862 +++++++++++++++++----------------- src/FeatureBuffer.cpp | 1 - src/Globals.cpp | 2 +- 3 files changed, 432 insertions(+), 433 deletions(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 4c13d6ee66..ec1df50b33 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1002,15 +1002,15 @@ float GetSnowParameterY(float texProjTmp, float alpha) # if defined(SKYLIGHTING) # include "Skylighting/Skylighting.hlsli" -# if defined(SNOW_COVER) -# undef SNOW +# if defined(SNOW_COVER) +# undef SNOW //# undef SPARKLE -# include "SnowCover/SnowCover.hlsli" -# endif +# include "SnowCover/SnowCover.hlsli" +# endif -# define LinearSampler SampColorSampler +# define LinearSampler SampColorSampler -# include "Common/ShadowSampling.hlsli" +# include "Common/ShadowSampling.hlsli" PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) @@ -1022,36 +1022,36 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float2 screenUV = FrameBuffer::ViewToUV(viewPosition, true, eyeIndex); float screenNoise = Random::InterleavedGradientNoise(input.Position.xy, SharedData::FrameCount); -# if defined(DEFERRED) +# if defined(DEFERRED) const bool inWorld = true; -# else +# else const bool inWorld = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InWorld); -# endif +# endif float nearFactor = smoothstep(4096.0 * 2.5, 0.0, viewPosition.z); -# if defined(SKINNED) || !defined(MODELSPACENORMALS) +# if defined(SKINNED) || !defined(MODELSPACENORMALS) float3x3 tbn = float3x3(input.TBN0.xyz, input.TBN1.xyz, input.TBN2.xyz); -# if !defined(TREE_ANIM) && !defined(LOD) +# if !defined(TREE_ANIM) && !defined(LOD) // Fix incorrect vertex normals on double-sided meshes if (!frontFace) tbn = lerp(tbn, -tbn, nearFactor); -# endif +# endif float3x3 tbnTr = transpose(tbn); -# endif // defined (SKINNED) || !defined (MODELSPACENORMALS) +# endif // defined (SKINNED) || !defined (MODELSPACENORMALS) -# if !defined(TRUE_PBR) -# if defined(LANDSCAPE) +# if !defined(TRUE_PBR) +# if defined(LANDSCAPE) float shininess = dot(input.LandBlendWeights1, LandscapeTexture1to4IsSpecPower) + input.LandBlendWeights2.x * LandscapeTexture5to6IsSpecPower.x + input.LandBlendWeights2.y * LandscapeTexture5to6IsSpecPower.y; -# else +# else float shininess = SpecularColor.w; -# endif // defined (LANDSCAPE) -# endif +# endif // defined (LANDSCAPE) +# endif -# if defined(TERRAIN_BLENDING) +# if defined(TERRAIN_BLENDING) float depthSampled = TerrainBlending::TerrainBlendingMaskTexture[input.Position.xy]; float depthSampledLinear = SharedData::GetScreenDepth(depthSampled); @@ -1063,7 +1063,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace blendFactorTerrain = 1; blendFactorTerrain = saturate(blendFactorTerrain); -# endif +# endif float3 viewDirection = normalize(input.ViewVector.xyz); float3 worldSpaceViewDirection = -normalize(input.WorldPosition.xyz); @@ -1071,47 +1071,47 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float2 uv = input.TexCoord0.xy; float2 uvOriginal = uv; -# if defined(EMAT) +# if defined(EMAT) float parallaxShadowQuality = sqrt(1.0 - saturate(viewPosition.z / 2048.0)); -# endif +# endif -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) float mipLevels[6]; -# else +# else float mipLevel = 0; -# endif // LANDSCAPE +# endif // LANDSCAPE float sh0 = 0; float pixelOffset = 0; -# if defined(EMAT) -# if defined(LANDSCAPE) +# if defined(EMAT) +# if defined(LANDSCAPE) DisplacementParams displacementParams[6]; displacementParams[0].DisplacementScale = 1.f; displacementParams[0].DisplacementOffset = 0.f; displacementParams[0].HeightScale = 1; displacementParams[0].FlattenAmount = 0; -# else +# else DisplacementParams displacementParams; displacementParams.DisplacementScale = 1.f; displacementParams.DisplacementOffset = 0.f; displacementParams.HeightScale = 1; displacementParams.FlattenAmount = 0; -# endif +# endif -# endif +# endif float curvature = 0; float normalSmoothness = 0; -# if !defined(MODELSPACENORMALS) +# if !defined(MODELSPACENORMALS) float3 vertexNormal = tbnTr[2]; float3 worldSpaceVertexNormal = vertexNormal; -# if !defined(DRAW_IN_WORLDSPACE) +# if !defined(DRAW_IN_WORLDSPACE) [flatten] if (!input.WorldSpace) worldSpaceVertexNormal = normalize(mul(input.World[eyeIndex], float4(worldSpaceVertexNormal, 0))); -# endif -# if defined(EMAT) +# endif +# if defined(EMAT) if (SharedData::extendedMaterialSettings.EnableParallaxWarpingFix) { float3 ndx = ddx(worldSpaceVertexNormal); @@ -1122,16 +1122,16 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace curvature = pow(length(max(abs(ndx), abs(ndy))) * fragSize, 0.5); float3 flatWorldNormal = normalize(-cross(ddx(input.WorldPosition.xyz), ddy(input.WorldPosition.xyz))); normalSmoothness = (1 - dot(worldSpaceVertexNormal, flatWorldNormal)); -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) displacementParams[0].HeightScale = saturate(1 - curvature); displacementParams[0].FlattenAmount = (normalSmoothness + curvature); -# else +# else displacementParams.HeightScale = saturate(1 - curvature); displacementParams.FlattenAmount = (normalSmoothness + curvature); -# endif +# endif } +# endif # endif -# endif float3 entryNormal = 0; float3 entryNormalTS = 0; @@ -1140,21 +1140,21 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 refractedViewDirectionWS = worldSpaceViewDirection; float4 sampledCoatColor = PBRParams2; -# if defined(EMAT) -# if defined(PARALLAX) +# if defined(EMAT) +# if defined(PARALLAX) if (SharedData::extendedMaterialSettings.EnableParallax) { mipLevel = ExtendedMaterials::GetMipLevel(uv, TexParallaxSampler); uv = ExtendedMaterials::GetParallaxCoords(viewPosition.z, uv, mipLevel, viewDirection, tbnTr, screenNoise, TexParallaxSampler, SampParallaxSampler, 0, displacementParams, pixelOffset); if (SharedData::extendedMaterialSettings.EnableShadows && (parallaxShadowQuality > 0.0f || SharedData::extendedMaterialSettings.ExtendShadows)) sh0 = TexParallaxSampler.SampleLevel(SampParallaxSampler, uv, mipLevel).x; } -# endif // PARALLAX +# endif // PARALLAX bool complexMaterial = false; bool complexMaterialParallax = false; float4 complexMaterialColor = 1.0; -# if defined(EMAT_ENVMAP) +# if defined(EMAT_ENVMAP) if (SharedData::extendedMaterialSettings.EnableComplexMaterial) { float envMaskTest = TexEnvMaskSampler.SampleLevel(SampEnvMaskSampler, uv, 15).w; @@ -1173,9 +1173,9 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } } -# endif // ENVMAP +# endif // ENVMAP -# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) bool PBRParallax = false; [branch] if ((PBRFlags & PBR::Flags::HasFeatureTexture0) != 0) { @@ -1216,29 +1216,29 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace if (SharedData::extendedMaterialSettings.EnableShadows && (parallaxShadowQuality > 0.0f || SharedData::extendedMaterialSettings.ExtendShadows)) sh0 = TexParallaxSampler.SampleLevel(SampParallaxSampler, uv, mipLevel).x; } -# endif // TRUE_PBR +# endif // TRUE_PBR -# endif // EMAT +# endif // EMAT -# if defined(SNOW) +# if defined(SNOW) bool useSnowSpecular = true; -# else +# else bool useSnowSpecular = false; -# endif // SNOW +# endif // SNOW -# if defined(SPARKLE) || !defined(PROJECTED_UV) +# if defined(SPARKLE) || !defined(PROJECTED_UV) bool useSnowDecalSpecular = true; -# else +# else bool useSnowDecalSpecular = false; -# endif // defined(SPARKLE) || !defined(PROJECTED_UV) +# endif // defined(SPARKLE) || !defined(PROJECTED_UV) float2 diffuseUv = uv; -# if defined(SPARKLE) +# if defined(SPARKLE) diffuseUv = ProjectedUVParams2.yy * input.TexCoord0.zw; -# endif // SPARKLE +# endif // SPARKLE -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) // Normalize blend weights float landBlendWeights = 0.0; landBlendWeights += input.LandBlendWeights1.x; @@ -1252,7 +1252,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace input.LandBlendWeights1.z /= landBlendWeights; input.LandBlendWeights1.w /= landBlendWeights; input.LandBlendWeights1.x /= landBlendWeights; -# if defined(EMAT) +# if defined(EMAT) if (SharedData::extendedMaterialSettings.EnableTerrainParallax) { mipLevels[0] = ExtendedMaterials::GetMipLevel(uv, TexColorSampler); mipLevels[1] = ExtendedMaterials::GetMipLevel(uv, TexLandColor2Sampler); @@ -1266,14 +1266,14 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace displacementParams[3] = displacementParams[0]; displacementParams[4] = displacementParams[0]; displacementParams[5] = displacementParams[0]; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) displacementParams[0].HeightScale *= PBRParams1.y; displacementParams[1].HeightScale *= LandscapeTexture2PBRParams.y; displacementParams[2].HeightScale *= LandscapeTexture3PBRParams.y; displacementParams[3].HeightScale *= LandscapeTexture4PBRParams.y; displacementParams[4].HeightScale *= LandscapeTexture5PBRParams.y; displacementParams[5].HeightScale *= LandscapeTexture6PBRParams.y; -# endif +# endif float weights[6]; uv = ExtendedMaterials::GetParallaxCoords(input, viewPosition.z, uv, mipLevels, viewDirection, tbnTr, screenNoise, displacementParams, pixelOffset, weights); @@ -1289,14 +1289,14 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace sh0 = ExtendedMaterials::GetTerrainHeight(input, uv, mipLevels, displacementParams, parallaxShadowQuality, input.LandBlendWeights1, input.LandBlendWeights2.xy, weights); } } -# endif // EMAT -# endif // LANDSCAPE +# endif // EMAT +# endif // LANDSCAPE -# if defined(SPARKLE) +# if defined(SPARKLE) diffuseUv = ProjectedUVParams2.yy * (input.TexCoord0.zw + (uv - uvOriginal)); -# else +# else diffuseUv = uv; -# endif // SPARKLE +# endif // SPARKLE float4 baseColor = 0; float4 normal = 0; @@ -1306,25 +1306,25 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float4 glintParameters = 0; -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) if (input.LandBlendWeights1.x > 0.0) { -# endif // LANDSCAPE +# endif // LANDSCAPE float4 rawBaseColor = TexColorSampler.SampleBias(SampColorSampler, diffuseUv, SharedData::MipBias); -# if defined(TRUE_PBR) && defined(LANDSCAPE) +# if defined(TRUE_PBR) && defined(LANDSCAPE) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile0PBR) == 0) { // relevant for linear only } -# endif +# endif baseColor = float4(Color::Diffuse(rawBaseColor.rgb), rawBaseColor.a); float landSnowMask1 = GetLandSnowMaskValue(baseColor.w); float4 normalColor = TexNormalSampler.SampleBias(SampNormalSampler, uv, SharedData::MipBias); normal = normalColor; -# if defined(MODELSPACENORMALS) -# if defined(LODLANDNOISE) +# if defined(MODELSPACENORMALS) +# if defined(LODLANDNOISE) normal.xyz = normal.xzy - 0.5.xxx; float lodLandNoiseParameter = GetLodLandBlendParameter(baseColor.xyz); float noise = TexLandLodNoiseSampler.Sample(SampLandLodNoiseSampler, uv * 3.0.xx).x; @@ -1333,31 +1333,31 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace normal.xyz *= 2; normal.w = 1; glossiness = 0; -# elif defined(LODLANDSCAPE) +# elif defined(LODLANDSCAPE) normal.xyz = 2.0.xxx * (-0.5.xxx + normal.xzy); normal.w = 1; glossiness = 0; -# else +# else normal.xyz = normal.xzy * 2.0.xxx + -1.0.xxx; normal.w = 1; glossiness = TexSpecularSampler.Sample(SampSpecularSampler, uv).x; -# endif // LODLANDNOISE -# elif (defined(SNOW) && defined(LANDSCAPE)) +# endif // LODLANDNOISE +# elif (defined(SNOW) && defined(LANDSCAPE)) normal.xyz = GetLandNormal(landSnowMask1, normal.xyz, uv, SampNormalSampler, TexNormalSampler); glossiness = normal.w; -# else +# else normal.xyz = TransformNormal(normal.xyz); glossiness = normal.w; -# endif // MODELSPACENORMALS +# endif // MODELSPACENORMALS -# if defined(WORLD_MAP) +# if defined(WORLD_MAP) normal.xyz = GetWorldMapNormal(input, normal.xyz, rawBaseColor.xyz); -# endif // WORLD_MAP +# endif // WORLD_MAP -# if defined(TRUE_PBR) -# if defined(LODLANDNOISE) +# if defined(TRUE_PBR) +# if defined(LODLANDNOISE) rawRMAOS = float4(1, 0, 1, 0); -# elif defined(LANDSCAPE) +# elif defined(LANDSCAPE) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile0PBR) != 0) { rawRMAOS = input.LandBlendWeights1.x * TexRMAOSSampler.SampleBias(SampRMAOSSampler, diffuseUv, SharedData::MipBias) * float4(PBRParams1.x, 1, 1, PBRParams1.z); @@ -1369,39 +1369,39 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS = input.LandBlendWeights1.x * float4(1 - glossiness.x, 0, 1, 0); } -# else +# else rawRMAOS = TexRMAOSSampler.SampleBias(SampRMAOSSampler, diffuseUv, SharedData::MipBias) * float4(PBRParams1.x, 1, 1, PBRParams1.z); if ((PBRFlags & PBR::Flags::Glint) != 0) { glintParameters = MultiLayerParallaxData; } +# endif # endif -# endif -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) baseColor *= input.LandBlendWeights1.x; normal *= input.LandBlendWeights1.x; glossiness *= input.LandBlendWeights1.x; } -# endif // LANDSCAPE +# endif // LANDSCAPE -# if defined(EMAT_ENVMAP) +# if defined(EMAT_ENVMAP) complexMaterial = complexMaterial && complexMaterialColor.y > (4.0 / 255.0) && (complexMaterialColor.y < (1.0 - (4.0 / 255.0))); shininess = lerp(shininess, shininess * complexMaterialColor.y, complexMaterial); float3 complexSpecular = lerp(1.0, lerp(1.0, baseColor.xyz, complexMaterialColor.z), complexMaterial); baseColor.xyz = lerp(baseColor.xyz, lerp(baseColor.xyz, 0.0, complexMaterialColor.z), complexMaterial); -# endif // defined (EMAT) && defined(ENVMAP) +# endif // defined (EMAT) && defined(ENVMAP) -# if defined(FACEGEN) +# if defined(FACEGEN) baseColor.xyz = GetFacegenBaseColor(baseColor.xyz, uv); -# elif defined(FACEGEN_RGB_TINT) +# elif defined(FACEGEN_RGB_TINT) baseColor.xyz = GetFacegenRGBTintBaseColor(baseColor.xyz, uv); -# endif // FACEGEN +# endif // FACEGEN -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) float landSnowMask = LandscapeTexture1to4IsSnow.x * input.LandBlendWeights1.x; -# endif // SNOW +# endif // SNOW if (input.LandBlendWeights1.y > 0.0) { float4 landColor2 = TexLandColor2Sampler.SampleBias(SampLandColor2Sampler, uv, SharedData::MipBias); @@ -1411,11 +1411,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal2.xyz = GetLandNormal(landSnowMask2, landNormal2.xyz, uv, SampLandNormal2Sampler, TexLandNormal2Sampler); normal.xyz += input.LandBlendWeights1.yyy * landNormal2.xyz; glossiness += input.LandBlendWeights1.y * landNormal2.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture1to4IsSnow.y * input.LandBlendWeights1.y * landSnowMask2; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile1PBR) != 0) { rawRMAOS += input.LandBlendWeights1.y * TexLandRMAOS2Sampler.SampleBias(SampLandRMAOS2Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture2PBRParams.x, 1, 1, LandscapeTexture2PBRParams.z); @@ -1427,7 +1427,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights1.y * float4(1 - landNormal2.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights1.yyyy * landColor2; } @@ -1439,11 +1439,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal3.xyz = GetLandNormal(landSnowMask3, landNormal3.xyz, uv, SampLandNormal3Sampler, TexLandNormal3Sampler); normal.xyz += input.LandBlendWeights1.zzz * landNormal3.xyz; glossiness += input.LandBlendWeights1.z * landNormal3.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture1to4IsSnow.z * input.LandBlendWeights1.z * landSnowMask3; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile2PBR) != 0) { rawRMAOS += input.LandBlendWeights1.z * TexLandRMAOS3Sampler.SampleBias(SampLandRMAOS3Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture3PBRParams.x, 1, 1, LandscapeTexture3PBRParams.z); @@ -1455,7 +1455,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights1.z * float4(1 - landNormal3.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights1.zzzz * landColor3; } @@ -1467,11 +1467,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal4.xyz = GetLandNormal(landSnowMask4, landNormal4.xyz, uv, SampLandNormal4Sampler, TexLandNormal4Sampler); normal.xyz += input.LandBlendWeights1.www * landNormal4.xyz; glossiness += input.LandBlendWeights1.w * landNormal4.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture1to4IsSnow.w * input.LandBlendWeights1.w * landSnowMask4; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile3PBR) != 0) { rawRMAOS += input.LandBlendWeights1.w * TexLandRMAOS4Sampler.SampleBias(SampLandRMAOS4Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture4PBRParams.x, 1, 1, LandscapeTexture4PBRParams.z); @@ -1483,7 +1483,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights1.w * float4(1 - landNormal4.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights1.wwww * landColor4; } @@ -1495,11 +1495,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal5.xyz = GetLandNormal(landSnowMask5, landNormal5.xyz, uv, SampLandNormal5Sampler, TexLandNormal5Sampler); normal.xyz += input.LandBlendWeights2.xxx * landNormal5.xyz; glossiness += input.LandBlendWeights2.x * landNormal5.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture5to6IsSnow.x * input.LandBlendWeights2.x * landSnowMask5; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile4PBR) != 0) { rawRMAOS += input.LandBlendWeights2.x * TexLandRMAOS5Sampler.SampleBias(SampLandRMAOS5Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture5PBRParams.x, 1, 1, LandscapeTexture5PBRParams.z); @@ -1511,7 +1511,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights2.x * float4(1 - landNormal5.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights2.xxxx * landColor5; } @@ -1523,11 +1523,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal6.xyz = GetLandNormal(landSnowMask6, landNormal6.xyz, uv, SampLandNormal6Sampler, TexLandNormal6Sampler); normal.xyz += input.LandBlendWeights2.yyy * landNormal6.xyz; glossiness += input.LandBlendWeights2.y * landNormal6.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture5to6IsSnow.y * input.LandBlendWeights2.y * landSnowMask6; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile5PBR) != 0) { rawRMAOS += input.LandBlendWeights2.y * TexLandRMAOS6Sampler.SampleBias(SampLandRMAOS6Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture6PBRParams.x, 1, 1, LandscapeTexture6PBRParams.z); @@ -1539,11 +1539,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights2.y * float4(1 - landNormal6.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights2.yyyy * landColor6; } -# if defined(LOD_LAND_BLEND) +# if defined(LOD_LAND_BLEND) float4 lodLandColor = TexLandLodBlend1Sampler.Sample(SampLandLodBlend1Sampler, input.TexCoord0.zw); float lodBlendParameter = GetLodLandBlendParameter(lodLandColor.xyz); float lodBlendMask = TexLandLodBlend2Sampler.Sample(SampLandLodBlend2Sampler, 3.0.xx * input.TexCoord0.zw).x; @@ -1552,44 +1552,44 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace normal.xyz = lerp(normal.xyz, float3(0, 0, 1), lodLandBlendFactor); -# if !defined(TRUE_PBR) +# if !defined(TRUE_PBR) baseColor.w = 0; baseColor = lerp(baseColor, lodLandColor * lodLandFadeFactor, lodLandBlendFactor); glossiness = lerp(glossiness, 0, lodLandBlendFactor); -# endif -# endif // LOD_LAND_BLEND +# endif +# endif // LOD_LAND_BLEND -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) useSnowSpecular = landSnowMask != 0.0; -# endif // SNOW -# endif // LANDSCAPE +# endif // SNOW +# endif // LANDSCAPE -# if defined(BACK_LIGHTING) +# if defined(BACK_LIGHTING) float4 backLightColor = TexBackLightSampler.Sample(SampBackLightSampler, uv); -# endif // BACK_LIGHTING +# endif // BACK_LIGHTING -# if defined(RIM_LIGHTING) || defined(SOFT_LIGHTING) || defined(LOAD_SOFT_LIGHTING) +# if defined(RIM_LIGHTING) || defined(SOFT_LIGHTING) || defined(LOAD_SOFT_LIGHTING) float4 rimSoftLightColor = TexRimSoftLightWorldMapOverlaySampler.Sample(SampRimSoftLightWorldMapOverlaySampler, uv); -# endif // RIM_LIGHTING || SOFT_LIGHTING +# endif // RIM_LIGHTING || SOFT_LIGHTING uint numLights = min(7, uint(NumLightNumShadowLight.x)); uint numShadowLights = min(4, uint(NumLightNumShadowLight.y)); -# if defined(TRUE_PBR) && !defined(MODELSPACENORMALS) +# if defined(TRUE_PBR) && !defined(MODELSPACENORMALS) if (!frontFace) { normal.xyz *= -1; } -# endif +# endif -# if defined(MODELSPACENORMALS) && !defined(SKINNED) +# if defined(MODELSPACENORMALS) && !defined(SKINNED) float4 modelNormal = normal; -# else +# else float4 modelNormal = float4(normalize(mul(tbn, normal.xyz)), 1); -# if defined(SPARKLE) +# if defined(SPARKLE) float3 projectedNormal = normalize(mul(tbn, float3(ProjectedUVParams2.xx * normal.xy, normal.z))); -# endif // SPARKLE -# endif // defined (MODELSPACENORMALS) && !defined (SKINNED) +# endif // SPARKLE +# endif // defined (MODELSPACENORMALS) && !defined (SKINNED) float2 baseShadowUV = 1.0.xx; float4 shadowColor = 1.0; @@ -1604,28 +1604,28 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float projWeight = 0; -# if defined(PROJECTED_UV) +# if defined(PROJECTED_UV) float2 projNoiseUv = ProjectedUVParams.zz * input.TexCoord0.zw; float projNoise = TexCharacterLightProjNoiseSampler.Sample(SampCharacterLightProjNoiseSampler, projNoiseUv).x; float3 texProj = normalize(input.TexProj); -# if defined(TREE_ANIM) || defined(LODOBJECTSHD) +# if defined(TREE_ANIM) || defined(LODOBJECTSHD) float vertexAlpha = 1; -# else +# else float vertexAlpha = input.Color.w; -# endif // defined (TREE_ANIM) || defined (LODOBJECTSHD) +# endif // defined (TREE_ANIM) || defined (LODOBJECTSHD) projWeight = -ProjectedUVParams.x * projNoise + (dot(modelNormal.xyz, texProj) * vertexAlpha - ProjectedUVParams.w); -# if defined(LODOBJECTSHD) +# if defined(LODOBJECTSHD) projWeight += (-0.5 + input.Color.w) * 2.5; -# endif // LODOBJECTSHD -# if defined(SPARKLE) +# endif // LODOBJECTSHD +# if defined(SPARKLE) if (projWeight < 0) discard; modelNormal.xyz = projectedNormal; -# if defined(SNOW) +# if defined(SNOW) psout.Parameters.y = 1; -# endif // SNOW -# elif !defined(FACEGEN) && !defined(MULTI_LAYER_PARALLAX) && !defined(PARALLAX) && !defined(SPARKLE) +# endif // SNOW +# elif !defined(FACEGEN) && !defined(MULTI_LAYER_PARALLAX) && !defined(PARALLAX) && !defined(SPARKLE) if (ProjectedUVParams3.w > 0.5) { float2 projNormalDiffuseUv = ProjectedUVParams3.x * projNoiseUv; float3 projNormal = TransformNormal(TexProjNormalSampler.Sample(SampProjNormalSampler, projNormalDiffuseUv).xyz); @@ -1634,7 +1634,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 finalProjNormal = normalize(TransformNormal(projDetailNormal) * float3(1, 1, projNormal.z) + float3(projNormal.xy, 0)); float3 projBaseColor = TexProjDiffuseSampler.Sample(SampProjDiffuseSampler, projNormalDiffuseUv).xyz * ProjectedUVParams2.xyz; projectedMaterialWeight = smoothstep(0, 1, 5 * (0.1 + projWeight)); -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) projBaseColor = saturate(EnvmapData.xyz * projBaseColor); rawRMAOS.xyw = lerp(rawRMAOS.xyw, float3(ParallaxOccData.x, 0, ParallaxOccData.y), projectedMaterialWeight); float4 projectedGlintParameters = 0; @@ -1642,59 +1642,59 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace projectedGlintParameters = SparkleParams; } glintParameters = lerp(glintParameters, projectedGlintParameters, projectedMaterialWeight); -# endif // TRUE_PBR +# endif // TRUE_PBR normal.xyz = lerp(normal.xyz, finalProjNormal, projectedMaterialWeight); baseColor.xyz = lerp(baseColor.xyz, projBaseColor, projectedMaterialWeight); -# if defined(SNOW) +# if defined(SNOW) useSnowDecalSpecular = true; psout.Parameters.y = GetSnowParameterY(projectedMaterialWeight, baseColor.w); -# endif // SNOW +# endif // SNOW } else { if (projWeight > 0) { baseColor.xyz = ProjectedUVParams2.xyz; -# if defined(SNOW) +# if defined(SNOW) useSnowDecalSpecular = true; psout.Parameters.y = GetSnowParameterY(projWeight, baseColor.w); -# endif // SNOW +# endif // SNOW } else { -# if defined(SNOW) +# if defined(SNOW) psout.Parameters.y = 0; -# endif // SNOW +# endif // SNOW } } -# if defined(SPECULAR) +# if defined(SPECULAR) useSnowSpecular = useSnowDecalSpecular; -# endif // SPECULAR -# endif // SPARKLE +# endif // SPECULAR +# endif // SPARKLE -# elif defined(SNOW) -# if defined(LANDSCAPE) +# elif defined(SNOW) +# if defined(LANDSCAPE) psout.Parameters.y = landSnowMask; -# else +# else psout.Parameters.y = baseColor.w; -# endif // LANDSCAPE -# endif // SNOW +# endif // LANDSCAPE +# endif // SNOW -# if defined(WORLD_MAP) +# if defined(WORLD_MAP) baseColor.xyz = GetWorldMapBaseColor(rawBaseColor.xyz, baseColor.xyz, projWeight); -# endif // WORLD_MAP +# endif // WORLD_MAP float3 worldSpaceNormal = modelNormal.xyz; -# if !defined(DRAW_IN_WORLDSPACE) +# if !defined(DRAW_IN_WORLDSPACE) [flatten] if (!input.WorldSpace) worldSpaceNormal = normalize(mul(input.World[eyeIndex], float4(worldSpaceNormal, 0))); -# endif +# endif -# if defined(MODELSPACENORMALS) +# if defined(MODELSPACENORMALS) float3 worldSpaceVertexNormal = worldSpaceNormal; -# endif +# endif float3 screenSpaceNormal = normalize(FrameBuffer::WorldToView(worldSpaceNormal, false, eyeIndex)); -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) PBR::SurfaceProperties pbrSurfaceProperties = PBR::InitSurfaceProperties(); pbrSurfaceProperties.Noise = screenNoise; @@ -1709,10 +1709,10 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace pbrSurfaceProperties.GlintMicrofacetRoughness = clamp(glintParameters.z, 0.005, 0.3); pbrSurfaceProperties.GlintDensityRandomization = clamp(glintParameters.w, 0, 5); -# if defined(GLINT) +# if defined(GLINT) float glintNoise = Random::R1Modified(SharedData::FrameCount, Random::pcg2d(uint2(input.Position.xy)) / 4294967296.0); PBR::Glints::PrecomputeGlints(glintNoise, uvOriginal, ddx(uvOriginal), ddy(uvOriginal), pbrSurfaceProperties.GlintScreenSpaceScale, pbrSurfaceProperties.GlintCache); -# endif +# endif baseColor.xyz *= 1 - pbrSurfaceProperties.Metallic; @@ -1721,7 +1721,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 coatModelNormal = modelNormal.xyz; float3 coatWorldNormal = worldSpaceNormal; -# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::Subsurface) != 0) { pbrSurfaceProperties.SubsurfaceColor = PBRParams2.xyz; @@ -1755,12 +1755,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace coatModelNormal = normalize(mul(tbn, TransformNormal(sampledCoatProperties.xyz))); } -# if !defined(DRAW_IN_WORLDSPACE) +# if !defined(DRAW_IN_WORLDSPACE) [flatten] if (!input.WorldSpace) { coatWorldNormal = normalize(mul(input.World[eyeIndex], float4(coatModelNormal, 0))); } -# endif +# endif } pbrSurfaceProperties.CoatStrength = lerp(pbrSurfaceProperties.CoatStrength, 0, projectedMaterialWeight); } @@ -1777,38 +1777,38 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } pbrSurfaceProperties.FuzzWeight = lerp(pbrSurfaceProperties.FuzzWeight, 0, projectedMaterialWeight); } -# endif +# endif float3 specularColorPBR = 0; float3 transmissionColor = 0; float pbrWeight = 1; float pbrGlossiness = 1 - pbrSurfaceProperties.Roughness; -# endif // TRUE_PBR +# endif // TRUE_PBR float porosity = 1.0; -# if defined(SKYLIGHTING) -# if defined(VR) +# if defined(SKYLIGHTING) +# if defined(VR) float3 positionMSSkylight = input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; -# else +# else float3 positionMSSkylight = input.WorldPosition.xyz; -# endif +# endif -# if defined(DEFERRED) +# if defined(DEFERRED) sh2 skylightingSH = Skylighting::sample(SharedData::skylightingSettings, Skylighting::SkylightingProbeArray, Skylighting::stbn_vec3_2Dx1D_128x128x64, input.Position.xy, positionMSSkylight, worldSpaceNormal); -# else +# else sh2 skylightingSH = inWorld ? Skylighting::sample(SharedData::skylightingSettings, Skylighting::SkylightingProbeArray, Skylighting::stbn_vec3_2Dx1D_128x128x64, input.Position.xy, positionMSSkylight, worldSpaceNormal) : float4(sqrt(4.0 * Math::PI), 0, 0, 0); -# endif +# endif -# endif +# endif float4 waterData = SharedData::GetWaterData(input.WorldPosition.xyz); float waterHeight = waterData.w; float waterRoughnessSpecular = 1; -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) float wetness = 0.0; float wetnessDistToWater = abs(input.WorldPosition.z - waterHeight); @@ -1823,11 +1823,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float maxOcclusion = 1; float minWetnessAngle = 0; minWetnessAngle = saturate(max(minWetnessValue, worldSpaceNormal.z)); -# if defined(SKYLIGHTING) +# if defined(SKYLIGHTING) float wetnessOcclusion = inWorld ? pow(saturate(SphericalHarmonics::Unproject(skylightingSH, float3(0, 0, 1))), 2) : 0; -# else +# else float wetnessOcclusion = inWorld; -# endif +# endif float4 raindropInfo = float4(0, 0, 1, 0); if (worldSpaceNormal.z > 0 && SharedData::wetnessEffectsSettings.Raining > 0.0f && SharedData::wetnessEffectsSettings.EnableRaindropFx) { @@ -1839,13 +1839,13 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float precipOcclusionZ = WetnessEffects::TexPrecipOcclusion.SampleLevel(SampColorSampler, precipOcclusionUV, 0).x; if (precipOcclusionTexCoord.z < precipOcclusionZ + 0.1) -# if defined(SKINNED) +# if defined(SKINNED) raindropInfo = WetnessEffects::GetRainDrops(input.ModelPosition.xyz, SharedData::wetnessEffectsSettings.Time, worldSpaceNormal); -# elif defined(DEFERRED) +# elif defined(DEFERRED) raindropInfo = WetnessEffects::GetRainDrops(input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz, SharedData::wetnessEffectsSettings.Time, worldSpaceNormal); -# else +# else raindropInfo = WetnessEffects::GetRainDrops(!FrameBuffer::FrameParams.y ? input.ModelPosition.xyz : input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz, SharedData::wetnessEffectsSettings.Time, worldSpaceNormal); -# endif +# endif } } @@ -1853,12 +1853,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace rainWetness = max(rainWetness, raindropInfo.w); float puddleWetness = SharedData::wetnessEffectsSettings.PuddleWetness * minWetnessAngle; -# if defined(SKIN) +# if defined(SKIN) rainWetness = SharedData::wetnessEffectsSettings.SkinWetness * SharedData::wetnessEffectsSettings.Wetness; -# endif -# if defined(HAIR) +# endif +# if defined(HAIR) rainWetness = SharedData::wetnessEffectsSettings.SkinWetness * SharedData::wetnessEffectsSettings.Wetness * 0.8f; -# endif +# endif rainWetness *= wetnessOcclusion; puddleWetness *= wetnessOcclusion; @@ -1870,11 +1870,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 puddleCoords = ((input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz) * 0.5 + 0.5) * 0.01 / SharedData::wetnessEffectsSettings.PuddleRadius; float puddle = wetness; if (wetness > 0.0 || puddleWetness > 0) { -# if !defined(SKINNED) +# if !defined(SKINNED) puddle = Random::perlinNoise(puddleCoords) * .5 + .5; puddle = puddle * ((minWetnessAngle / SharedData::wetnessEffectsSettings.PuddleMaxAngle) * SharedData::wetnessEffectsSettings.MaxPuddleWetness * 0.25) + 0.5; wetness = lerp(wetness, puddleWetness, saturate(puddle - 0.25)); -# endif +# endif puddle *= wetness; } @@ -1898,49 +1898,49 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace wetnessNormal = WetnessEffects::ReorientNormal(rippleNormal, wetnessNormal); waterRoughnessSpecular = 1.0 - wetnessGlossinessSpecular * 0.9; -# endif +# endif float3 dirLightColor = Color::Light(DirLightColor.xyz); float3 dirLightColorMultiplier = 1; -# if defined(WATER_EFFECTS) +# if defined(WATER_EFFECTS) dirLightColorMultiplier *= WaterEffects::ComputeCaustics(waterData, input.WorldPosition.xyz, worldSpaceNormal); -# endif +# endif float selfShadowFactor = 1.0f; float3 normalizedDirLightDirectionWS = DirLightDirection; -# if !defined(DRAW_IN_WORLDSPACE) +# if !defined(DRAW_IN_WORLDSPACE) [flatten] if (!input.WorldSpace) normalizedDirLightDirectionWS = normalize(mul(input.World[eyeIndex], float4(DirLightDirection.xyz, 0))); -# endif +# endif float dirLightAngle = dot(modelNormal.xyz, DirLightDirection.xyz); if ((Permutation::PixelShaderDescriptor & Permutation::LightingFlags::DefShadow) && (Permutation::PixelShaderDescriptor & Permutation::LightingFlags::ShadowDir)) { dirLightColorMultiplier *= shadowColor.x; } -# if !defined(DEFERRED) +# if !defined(DEFERRED) else if (!SharedData::InInterior && inWorld) { dirLightColorMultiplier *= ShadowSampling::GetLightingShadow(screenNoise, input.WorldPosition.xyz, eyeIndex); } -# endif +# endif -# if defined(SOFT_LIGHTING) || defined(BACK_LIGHTING) || defined(RIM_LIGHTING) +# if defined(SOFT_LIGHTING) || defined(BACK_LIGHTING) || defined(RIM_LIGHTING) bool inDirShadow = ((Permutation::PixelShaderDescriptor & Permutation::LightingFlags::DefShadow) && (Permutation::PixelShaderDescriptor & Permutation::LightingFlags::ShadowDir) && shadowColor.x == 0); -# else +# else bool inDirShadow = ((Permutation::PixelShaderDescriptor & Permutation::LightingFlags::DefShadow) && (Permutation::PixelShaderDescriptor & Permutation::LightingFlags::ShadowDir) && shadowColor.x == 0) && dirLightAngle > 0.0; -# endif +# endif float3 refractedDirLightDirection = DirLightDirection; -# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::InterlayerParallax) != 0) { if (dot(DirLightDirection, coatModelNormal) > 0) refractedDirLightDirection = -refract(-DirLightDirection, coatModelNormal, eta); } -# endif +# endif float dirDetailShadow = 1.0; float dirShadow = 1.0; @@ -1948,41 +1948,41 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace bool inReflection = Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InReflection; -# if defined(SCREEN_SPACE_SHADOWS) -# if defined(DEFERRED) +# if defined(SCREEN_SPACE_SHADOWS) +# if defined(DEFERRED) bool useScreenSpaceShadows = true; -# else +# else bool useScreenSpaceShadows = inWorld && !SharedData::InInterior && Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::IsDecal; -# endif +# endif if (useScreenSpaceShadows) { dirDetailShadow = ScreenSpaceShadows::GetScreenSpaceShadow(input.Position.xyz, screenUV, screenNoise, eyeIndex); -# if defined(TREE_ANIM) +# if defined(TREE_ANIM) ShadowSampling::ShadowData sD = ShadowSampling::SharedShadowData[0]; dirDetailShadow = lerp(1.0, dirDetailShadow, saturate(viewPosition.z / sqrt(sD.ShadowLightParam.z))); -# endif +# endif } -# endif +# endif -# if defined(EMAT) && (defined(SKINNED) || !defined(MODELSPACENORMALS)) +# if defined(EMAT) && (defined(SKINNED) || !defined(MODELSPACENORMALS)) [branch] if (inWorld && SharedData::extendedMaterialSettings.EnableShadows) { float3 dirLightDirectionTS = mul(refractedDirLightDirection, tbn).xyz; -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) [branch] if (SharedData::extendedMaterialSettings.EnableTerrainParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplierTerrain(input, uv, mipLevels, dirLightDirectionTS, sh0, parallaxShadowQuality, screenNoise, displacementParams); -# elif defined(PARALLAX) +# elif defined(PARALLAX) [branch] if (SharedData::extendedMaterialSettings.EnableParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, dirLightDirectionTS, sh0, TexParallaxSampler, SampParallaxSampler, 0, lerp(parallaxShadowQuality, 1.0, SharedData::extendedMaterialSettings.ExtendShadows), screenNoise, displacementParams); -# elif defined(EMAT_ENVMAP) +# elif defined(EMAT_ENVMAP) [branch] if (complexMaterialParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, dirLightDirectionTS, sh0, TexEnvMaskSampler, SampEnvMaskSampler, 3, lerp(parallaxShadowQuality, 1.0, SharedData::extendedMaterialSettings.ExtendShadows), screenNoise, displacementParams); -# elif defined(TRUE_PBR) && !defined(LODLANDSCAPE) +# elif defined(TRUE_PBR) && !defined(LODLANDSCAPE) [branch] if (PBRParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, dirLightDirectionTS, sh0, TexParallaxSampler, SampParallaxSampler, 0, lerp(parallaxShadowQuality, 1.0, SharedData::extendedMaterialSettings.ExtendShadows), screenNoise, displacementParams); -# endif // LANDSCAPE +# endif // LANDSCAPE } -# endif // defined(EMAT) && (defined (SKINNED) || !defined \ +# endif // defined(EMAT) && (defined (SKINNED) || !defined \ // (MODELSPACENORMALS)) if (dirShadow != 0.0 && (inWorld || inReflection)) @@ -1999,7 +1999,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 lodLandDiffuseColor = 0; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) { PBR::LightProperties lightProperties = PBR::InitLightProperties(dirLightColor, dirLightColorMultiplier * dirDetailShadow, parallaxShadow); float3 dirDiffuseColor, coatDirDiffuseColor, dirTransmissionColor, dirSpecularColor; @@ -2008,51 +2008,51 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace coatLightsDiffuseColor += coatDirDiffuseColor; transmissionColor += dirTransmissionColor; specularColorPBR += dirSpecularColor * !SharedData::InInterior; -# if defined(LOD_LAND_BLEND) +# if defined(LOD_LAND_BLEND) lodLandDiffuseColor += dirLightColor / Math::PI * saturate(dirLightAngle) * dirLightColorMultiplier * dirDetailShadow * parallaxShadow; -# endif -# if defined(WETNESS_EFFECTS) +# endif +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) specularColorPBR += PBR::GetWetnessDirectLightSpecularInput(wetnessNormal, worldSpaceViewDirection, normalizedDirLightDirectionWS, lightProperties.CoatLightColor, waterRoughnessSpecular) * wetnessGlossinessSpecular; -# endif +# endif } -# else +# else dirDetailShadow *= parallaxShadow; dirLightColor *= dirLightColorMultiplier; float3 dirDiffuseColor = dirLightColor * saturate(dirLightAngle) * dirDetailShadow; -# if defined(SOFT_LIGHTING) +# if defined(SOFT_LIGHTING) lightsDiffuseColor += dirLightColor * GetSoftLightMultiplier(dirLightAngle) * rimSoftLightColor.xyz; -# endif +# endif -# if defined(RIM_LIGHTING) +# if defined(RIM_LIGHTING) lightsDiffuseColor += dirLightColor * GetRimLightMultiplier(DirLightDirection, viewDirection, modelNormal.xyz) * rimSoftLightColor.xyz; -# endif +# endif -# if defined(BACK_LIGHTING) +# if defined(BACK_LIGHTING) lightsDiffuseColor += dirLightColor * saturate(-dirLightAngle) * backLightColor.xyz; -# endif +# endif if (useSnowSpecular && useSnowDecalSpecular) { -# if defined(SNOW) +# if defined(SNOW) lightsSpecularColor += GetSnowSpecularColor(input, modelNormal.xyz, viewDirection); -# endif +# endif } else { -# if defined(SPECULAR) || defined(SPARKLE) +# if defined(SPECULAR) || defined(SPARKLE) lightsSpecularColor = GetLightSpecularInput(input, DirLightDirection, viewDirection, modelNormal.xyz, dirLightColor.xyz * dirDetailShadow, shininess, uv); -# endif +# endif } lightsDiffuseColor += dirDiffuseColor; -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) wetnessSpecular += WetnessEffects::GetWetnessSpecular(wetnessNormal, normalizedDirLightDirectionWS, worldSpaceViewDirection, dirLightColor * dirDetailShadow, waterRoughnessSpecular); +# endif # endif -# endif -# if !defined(LOD) -# if !defined(LIGHT_LIMIT_FIX) +# if !defined(LOD) +# if !defined(LIGHT_LIMIT_FIX) [loop] for (uint lightIndex = 0; lightIndex < numLights; lightIndex++) { float3 lightDirection = PointLightPosition[eyeIndex * numLights + lightIndex].xyz - input.InputPosition.xyz; @@ -2072,17 +2072,17 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 normalizedLightDirection = normalize(lightDirection); -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) { float3 pointDiffuseColor, coatPointDiffuseColor, pointTransmissionColor, pointSpecularColor; float3 refractedLightDirection = normalizedLightDirection; -# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::InterlayerParallax) != 0) { if (dot(normalizedLightDirection, coatModelNormal) > 0) refractedLightDirection = -refract(-normalizedLightDirection, coatModelNormal, eta); } -# endif +# endif PBR::LightProperties lightProperties = PBR::InitLightProperties(lightColor, lightShadow, 1); PBR::GetDirectLightInput(pointDiffuseColor, coatPointDiffuseColor, pointTransmissionColor, pointSpecularColor, modelNormal.xyz, coatModelNormal, refractedViewDirection, viewDirection, refractedLightDirection, normalizedLightDirection, lightProperties, pbrSurfaceProperties, tbnTr, uvOriginal); lightsDiffuseColor += pointDiffuseColor; @@ -2090,38 +2090,38 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace transmissionColor += pointTransmissionColor; specularColorPBR += pointSpecularColor; } -# else +# else lightColor *= lightShadow; float lightAngle = dot(modelNormal.xyz, normalizedLightDirection.xyz); float3 lightDiffuseColor = lightColor * saturate(lightAngle.xxx); -# if defined(SOFT_LIGHTING) +# if defined(SOFT_LIGHTING) lightDiffuseColor += lightColor * GetSoftLightMultiplier(lightAngle) * rimSoftLightColor.xyz; -# endif // SOFT_LIGHTING +# endif // SOFT_LIGHTING -# if defined(RIM_LIGHTING) +# if defined(RIM_LIGHTING) lightDiffuseColor += lightColor * GetRimLightMultiplier(normalizedLightDirection, viewDirection, modelNormal.xyz) * rimSoftLightColor.xyz; -# endif // RIM_LIGHTING +# endif // RIM_LIGHTING -# if defined(BACK_LIGHTING) +# if defined(BACK_LIGHTING) lightDiffuseColor += lightColor * saturate(-lightAngle) * backLightColor.xyz; -# endif // BACK_LIGHTING +# endif // BACK_LIGHTING -# if defined(SPECULAR) || (defined(SPARKLE) && !defined(SNOW)) +# if defined(SPECULAR) || (defined(SPARKLE) && !defined(SNOW)) lightsSpecularColor += GetLightSpecularInput(input, normalizedLightDirection, viewDirection, modelNormal.xyz, lightColor, shininess, uv); -# endif // defined (SPECULAR) || (defined (SPARKLE) && !defined(SNOW)) +# endif // defined (SPECULAR) || (defined (SPARKLE) && !defined(SNOW)) lightsDiffuseColor += lightDiffuseColor; -# endif +# endif } -# else +# else -# if defined(ANISO_LIGHTING) +# if defined(ANISO_LIGHTING) input.TBN0.z = worldSpaceVertexNormal[0]; input.TBN1.z = worldSpaceVertexNormal[1]; input.TBN2.z = worldSpaceVertexNormal[2]; -# endif +# endif uint numClusteredLights = 0; uint totalLightCount = LightLimitFix::NumStrictLights; @@ -2181,17 +2181,17 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } float3 refractedLightDirection = normalizedLightDirection; -# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::InterlayerParallax) != 0) { if (dot(normalizedLightDirection, coatWorldNormal) > 0) refractedLightDirection = -refract(-normalizedLightDirection, coatWorldNormal, eta); } -# endif +# endif float parallaxShadow = 1; -# if defined(EMAT) +# if defined(EMAT) [branch] if ( SharedData::extendedMaterialSettings.EnableShadows && !(light.lightFlags & LightLimitFix::LightFlags::Simple) && @@ -2200,23 +2200,23 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace contactShadow != 0.0) { float3 lightDirectionTS = normalize(mul(refractedLightDirection, tbn).xyz); -# if defined(PARALLAX) +# if defined(PARALLAX) [branch] if (SharedData::extendedMaterialSettings.EnableParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, lightDirectionTS, sh0, TexParallaxSampler, SampParallaxSampler, 0, parallaxShadowQuality, screenNoise, displacementParams); -# elif defined(LANDSCAPE) +# elif defined(LANDSCAPE) [branch] if (SharedData::extendedMaterialSettings.EnableTerrainParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplierTerrain(input, uv, mipLevels, lightDirectionTS, sh0, parallaxShadowQuality, screenNoise, displacementParams); -# elif defined(EMAT_ENVMAP) +# elif defined(EMAT_ENVMAP) [branch] if (complexMaterialParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, lightDirectionTS, sh0, TexEnvMaskSampler, SampEnvMaskSampler, 3, parallaxShadowQuality, screenNoise, displacementParams); -# elif defined(TRUE_PBR) && !defined(LODLANDSCAPE) +# elif defined(TRUE_PBR) && !defined(LODLANDSCAPE) [branch] if (PBRParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, lightDirectionTS, sh0, TexParallaxSampler, SampParallaxSampler, 0, parallaxShadowQuality, screenNoise, displacementParams); -# endif +# endif } -# endif +# endif -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) { PBR::LightProperties lightProperties = PBR::InitLightProperties(lightColor, lightShadow * contactShadow, parallaxShadow); float3 pointDiffuseColor, coatPointDiffuseColor, pointTransmissionColor, pointSpecularColor; @@ -2225,97 +2225,97 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace coatLightsDiffuseColor += coatPointDiffuseColor; transmissionColor += pointTransmissionColor; specularColorPBR += pointSpecularColor; -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) specularColorPBR += PBR::GetWetnessDirectLightSpecularInput(wetnessNormal, worldSpaceViewDirection, normalizedLightDirection, lightProperties.CoatLightColor, waterRoughnessSpecular) * wetnessGlossinessSpecular; -# endif +# endif } -# else +# else lightColor *= lightShadow; float3 lightDiffuseColor = lightColor * contactShadow * parallaxShadow * saturate(lightAngle.xxx); -# if defined(SOFT_LIGHTING) +# if defined(SOFT_LIGHTING) lightDiffuseColor += lightColor * GetSoftLightMultiplier(lightAngle) * rimSoftLightColor.xyz; -# endif +# endif -# if defined(RIM_LIGHTING) +# if defined(RIM_LIGHTING) lightDiffuseColor += lightColor * GetRimLightMultiplier(normalizedLightDirection, worldSpaceViewDirection, worldSpaceNormal.xyz) * rimSoftLightColor.xyz; -# endif +# endif -# if defined(BACK_LIGHTING) +# if defined(BACK_LIGHTING) lightDiffuseColor += lightColor * saturate(-lightAngle) * backLightColor.xyz; -# endif +# endif -# if defined(SPECULAR) || (defined(SPARKLE) && !defined(SNOW)) +# if defined(SPECULAR) || (defined(SPARKLE) && !defined(SNOW)) lightsSpecularColor += GetLightSpecularInput(input, normalizedLightDirection, worldSpaceViewDirection, worldSpaceNormal.xyz, lightColor, shininess, uv); -# endif +# endif lightsDiffuseColor += lightDiffuseColor; -# endif +# endif -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) wetnessSpecular += WetnessEffects::GetWetnessSpecular(wetnessNormal, normalizedLightDirection, worldSpaceViewDirection, lightColor, waterRoughnessSpecular); -# endif +# endif } +# endif # endif -# endif diffuseColor += lightsDiffuseColor; specularColor += lightsSpecularColor; -# if !defined(LANDSCAPE) +# if !defined(LANDSCAPE) if (Permutation::PixelShaderDescriptor & Permutation::LightingFlags::CharacterLight) { float charLightMul = saturate(dot(worldSpaceViewDirection, worldSpaceNormal.xyz)) * CharacterLightParams.x + CharacterLightParams.y * saturate(dot(float2(0.164398998, -0.986393988), worldSpaceNormal.yz)); float charLightColor = min(CharacterLightParams.w, max(0, CharacterLightParams.z * TexCharacterLightProjNoiseSampler.Sample(SampCharacterLightProjNoiseSampler, baseShadowUV).x)); diffuseColor += (charLightMul * charLightColor).xxx; } -# endif +# endif -# if defined(EYE) +# if defined(EYE) modelNormal.xyz = input.EyeNormal; -# endif // EYE +# endif // EYE float3 emitColor = EmitColor; -# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) bool hasEmissive = (0x3F & (Permutation::PixelShaderDescriptor >> 24)) == Permutation::LightingTechnique::Glowmap; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) hasEmissive = hasEmissive || (PBRFlags & PBR::Flags::HasEmissive != 0); -# endif +# endif [branch] if (hasEmissive) { float3 glowColor = Color::Diffuse(TexGlowSampler.Sample(SampGlowSampler, uv).xyz); emitColor *= glowColor; } -# endif +# endif -# if !defined(TRUE_PBR) +# if !defined(TRUE_PBR) diffuseColor += emitColor.xyz; -# endif +# endif float3 directionalAmbientColor = mul(DirectionalAmbient, modelNormal); float3 reflectionDiffuseColor = diffuseColor + directionalAmbientColor; -# if defined(SKYLIGHTING) +# if defined(SKYLIGHTING) float skylightingDiffuse = SphericalHarmonics::FuncProductIntegral(skylightingSH, SphericalHarmonics::EvaluateCosineLobe(float3(worldSpaceNormal.xy, worldSpaceNormal.z * 0.5 + 0.5))) / Math::PI; skylightingDiffuse = lerp(1.0, skylightingDiffuse, Skylighting::getFadeOutFactor(input.WorldPosition.xyz)); skylightingDiffuse = Skylighting::mixDiffuse(SharedData::skylightingSettings, skylightingDiffuse); directionalAmbientColor = Color::GammaToLinear(directionalAmbientColor); directionalAmbientColor *= skylightingDiffuse; directionalAmbientColor = Color::LinearToGamma(directionalAmbientColor); -# endif +# endif -# if defined(TRUE_PBR) && defined(LOD_LAND_BLEND) && !defined(DEFERRED) +# if defined(TRUE_PBR) && defined(LOD_LAND_BLEND) && !defined(DEFERRED) lodLandDiffuseColor += directionalAmbientColor; -# endif +# endif -# if !(defined(DEFERRED) && defined(SSGI)) && !defined(TRUE_PBR) +# if !(defined(DEFERRED) && defined(SSGI)) && !defined(TRUE_PBR) diffuseColor += directionalAmbientColor; -# endif +# endif -# if defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE) +# if defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE) float envMask = EnvmapData.x * MaterialData.x; float viewNormalAngle = dot(worldSpaceNormal.xyz, viewDirection); @@ -2332,38 +2332,38 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 envColor = 0.0; bool dynamicCubemap = false; -# if defined(DYNAMIC_CUBEMAPS) +# if defined(DYNAMIC_CUBEMAPS) float3 F0 = 0.0; float envRoughness = 1.0; -# endif +# endif if (envMask > 0.0) { -# if defined(DYNAMIC_CUBEMAPS) +# if defined(DYNAMIC_CUBEMAPS) uint2 envSize; TexEnvSampler.GetDimensions(envSize.x, envSize.y); -# if defined(EMAT) +# if defined(EMAT) if (envSize.x == 1 && envSize.y == 1 || complexMaterial) { -# else +# else if (envSize.x == 1 && envSize.y == 1) { -# endif +# endif dynamicCubemap = true; -# if defined(EMAT) +# if defined(EMAT) if (!complexMaterial) -# endif +# endif { // Dynamic Cubemap Creator sets this value to black, if it is anything but black it is wrong float3 envColorTest = TexEnvSampler.SampleLevel(SampEnvSampler, float3(0.0, 1.0, 0.0), 15); dynamicCubemap = all(envColorTest == 0.0); } -# if defined(CREATOR) +# if defined(CREATOR) if (SharedData::cubemapCreatorSettings.Enabled) { dynamicCubemap = true; } -# endif +# endif if (dynamicCubemap) { float4 envColorBase = TexEnvSampler.SampleLevel(SampEnvSampler, float3(1.0, 0.0, 0.0), 15); @@ -2376,30 +2376,30 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace envRoughness = 1.0 / 7.0; } -# if defined(CREATOR) +# if defined(CREATOR) if (SharedData::cubemapCreatorSettings.Enabled) { F0 = SharedData::cubemapCreatorSettings.CubemapColor.rgb; envRoughness = SharedData::cubemapCreatorSettings.CubemapColor.a; } -# endif +# endif -# if defined(EMAT) +# if defined(EMAT) float complexMaterialRoughness = 1.0 - complexMaterialColor.y; envRoughness = lerp(envRoughness, pow(complexMaterialRoughness, 1.5), complexMaterial); F0 = lerp(F0, Color::GammaToLinear(complexSpecular), complexMaterial); -# endif +# endif if (any(F0 > 0.0)) -# if defined(SKYLIGHTING) +# if defined(SKYLIGHTING) envColor = DynamicCubemaps::GetDynamicCubemap(worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, envRoughness, F0, skylightingSH) * envMask; -# else +# else envColor = DynamicCubemaps::GetDynamicCubemap(worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, envRoughness, F0, ) * envMask; -# endif +# endif else envColor = 0.0; } } -# endif +# endif if (!dynamicCubemap) { float3 envColorBase = TexEnvSampler.Sample(SampEnvSampler, envSamplingPoint); @@ -2407,46 +2407,46 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } } -# endif // defined (ENVMAP) || defined (MULTI_LAYER_PARALLAX) || defined(EYE) +# endif // defined (ENVMAP) || defined (MULTI_LAYER_PARALLAX) || defined(EYE) float2 screenMotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, eyeIndex); -# if defined(WETNESS_EFFECTS) -# if !(defined(FACEGEN) || defined(FACEGEN_RGB_TINT) || defined(EYE)) || defined(TREE_ANIM) -# if defined(TRUE_PBR) -# if !defined(LANDSCAPE) +# if defined(WETNESS_EFFECTS) +# if !(defined(FACEGEN) || defined(FACEGEN_RGB_TINT) || defined(EYE)) || defined(TREE_ANIM) +# if defined(TRUE_PBR) +# if !defined(LANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::TwoLayer) != 0) { porosity = 0; } else -# endif +# endif { porosity = lerp(porosity, 0.0, saturate(sqrt(pbrSurfaceProperties.Metallic))); } -# elif defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) +# elif defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) porosity = lerp(porosity, 0.0, saturate(sqrt(envMask))); -# endif +# endif float wetnessDarkeningAmount = porosity * wetnessGlossinessAlbedo; baseColor.xyz = lerp(baseColor.xyz, pow(baseColor.xyz, 1.0 + wetnessDarkeningAmount), 0.8); -# endif +# endif float3 wetnessReflectance = WetnessEffects::GetWetnessAmbientSpecular(screenUV, wetnessNormal, worldSpaceVertexNormal, worldSpaceViewDirection, waterRoughnessSpecular) * wetnessGlossinessSpecular; -# if !defined(DEFERRED) +# if !defined(DEFERRED) wetnessSpecular += wetnessReflectance; +# endif # endif -# endif -# if defined(HAIR) +# if defined(HAIR) float3 vertexColor = lerp(1, TintColor.xyz, input.Color.y); -# else +# else float3 vertexColor = input.Color.xyz; -# endif // defined (HAIR) +# endif // defined (HAIR) float4 color = 0; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) { float3 directLightsDiffuseInput = diffuseColor * baseColor.xyz; [branch] if ((PBRFlags & PBR::Flags::ColoredCoat) != 0) @@ -2459,28 +2459,28 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 indirectDiffuseLobeWeight, indirectSpecularLobeWeight; PBR::GetIndirectLobeWeights(indirectDiffuseLobeWeight, indirectSpecularLobeWeight, worldSpaceNormal.xyz, worldSpaceViewDirection, worldSpaceVertexNormal, baseColor.xyz, pbrSurfaceProperties); -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) indirectSpecularLobeWeight += PBR::GetWetnessIndirectSpecularLobeWeight(wetnessNormal, worldSpaceViewDirection, worldSpaceVertexNormal, waterRoughnessSpecular) * wetnessGlossinessSpecular; -# endif +# endif -# if !(defined(DEFERRED) && defined(SSGI)) +# if !(defined(DEFERRED) && defined(SSGI)) color.xyz += indirectDiffuseLobeWeight * directionalAmbientColor; -# endif +# endif -# if !defined(DEFERRED) -# if defined(DYNAMIC_CUBEMAPS) -# if defined(SKYLIGHTING) +# if !defined(DEFERRED) +# if defined(DYNAMIC_CUBEMAPS) +# if defined(SKYLIGHTING) specularColorPBR += indirectSpecularLobeWeight * DynamicCubemaps::GetDynamicCubemapSpecularIrradiance(screenUV, worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, pbrSurfaceProperties.Roughness, skylightingSH); -# else +# else specularColorPBR += indirectSpecularLobeWeight * DynamicCubemaps::GetDynamicCubemapSpecularIrradiance(screenUV, worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, pbrSurfaceProperties.Roughness); +# endif +# else + specularColorPBR += indirectSpecularLobeWeight * directionalAmbientColor; # endif # else - specularColorPBR += indirectSpecularLobeWeight * directionalAmbientColor; -# endif -# else indirectDiffuseLobeWeight *= vertexColor; -# endif +# endif // Fixes white items in UI for VR [branch] if ((PBRFlags & PBR::Flags::HasEmissive) != 0) @@ -2488,13 +2488,13 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace color.xyz += emitColor.xyz; } color.xyz += transmissionColor; -# else +# else color.xyz += diffuseColor * baseColor.xyz; -# endif +# endif color.xyz *= vertexColor; -# if defined(MULTI_LAYER_PARALLAX) +# if defined(MULTI_LAYER_PARALLAX) float layerValue = MultiLayerParallaxData.x * TexLayerSampler.Sample(SampLayerSampler, uv).w; float3 tangentViewDirection = mul(viewDirection, tbn); float3 layerNormal = MultiLayerParallaxData.yyy * (normalColor.xyz * 2.0.xxx + float3(-1, -1, -2)) + float3(0, 0, 1); @@ -2506,59 +2506,59 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float mlpBlendFactor = saturate(viewNormalAngle) * (1.0 - baseColor.w); -# if defined(DEFERRED) && defined(SSGI) +# if defined(DEFERRED) && defined(SSGI) color.xyz = lerp(color.xyz, (diffuseColor + directionalAmbientColor) * vertexColor * layerColor, mlpBlendFactor); -# else +# else color.xyz = lerp(color.xyz, diffuseColor * vertexColor * layerColor, mlpBlendFactor); -# endif +# endif -# if defined(DEFERRED) +# if defined(DEFERRED) baseColor.xyz *= 1.0 - mlpBlendFactor; -# endif -# endif // MULTI_LAYER_PARALLAX +# endif +# endif // MULTI_LAYER_PARALLAX -# if defined(SPECULAR) -# if defined(EMAT_ENVMAP) +# if defined(SPECULAR) +# if defined(EMAT_ENVMAP) specularColor = (specularColor * glossiness * MaterialData.yyy) * lerp(SpecularColor.xyz, complexSpecular, complexMaterial); -# else +# else specularColor = (specularColor * glossiness * MaterialData.yyy) * SpecularColor.xyz; -# endif -# elif defined(SPARKLE) +# endif +# elif defined(SPARKLE) specularColor *= glossiness; -# endif // SPECULAR +# endif // SPECULAR -# if defined(SNOW) +# if defined(SNOW) if (useSnowSpecular) specularColor = 0; -# endif +# endif diffuseColor = reflectionDiffuseColor; -# if (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) -# if defined(DYNAMIC_CUBEMAPS) +# if (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) +# if defined(DYNAMIC_CUBEMAPS) if (!dynamicCubemap) -# endif +# endif specularColor += envColor * diffuseColor; -# endif +# endif -# if defined(EMAT_ENVMAP) +# if defined(EMAT_ENVMAP) specularColor *= complexSpecular; -# endif // defined (EMAT) && defined(ENVMAP) +# endif // defined (EMAT) && defined(ENVMAP) -# if !defined(TRUE_PBR) +# if !defined(TRUE_PBR) specularColor = Color::GammaToLinear(specularColor); -# endif +# endif -# if !defined(DEFERRED) && defined(DYNAMIC_CUBEMAPS) && (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) +# if !defined(DEFERRED) && defined(DYNAMIC_CUBEMAPS) && (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) if (dynamicCubemap) specularColor += envColor; -# endif +# endif -# if defined(WETNESS_EFFECTS) && !defined(TRUE_PBR) +# if defined(WETNESS_EFFECTS) && !defined(TRUE_PBR) specularColor += wetnessSpecular * wetnessGlossinessSpecular; -# endif +# endif -# if defined(LOD_LAND_BLEND) && defined(TRUE_PBR) +# if defined(LOD_LAND_BLEND) && defined(TRUE_PBR) { pbrWeight = 1 - lodLandBlendFactor; @@ -2570,21 +2570,21 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace indirectSpecularLobeWeight = lerp(indirectSpecularLobeWeight, 0, lodLandBlendFactor); pbrGlossiness = lerp(pbrGlossiness, 0, lodLandBlendFactor); } -# endif // defined(LOD_LAND_BLEND) && defined(TRUE_PBR) +# endif // defined(LOD_LAND_BLEND) && defined(TRUE_PBR) -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) color.xyz *= Color::PBRLightingScale; specularColorPBR *= Color::PBRLightingScale; specularColor += specularColorPBR; -# endif +# endif -# if !defined(DEFERRED) +# if !defined(DEFERRED) color.xyz = Color::LinearToGamma(Color::GammaToLinear(color.xyz) + specularColor); if (FrameBuffer::FrameParams.y && FrameBuffer::FrameParams.z) color.xyz = lerp(color.xyz, input.FogParam.xyz, input.FogParam.w); -# endif +# endif -# if defined(TESTCUBEMAP) && defined(ENVMAP) && defined(DYNAMIC_CUBEMAPS) +# if defined(TESTCUBEMAP) && defined(ENVMAP) && defined(DYNAMIC_CUBEMAPS) baseColor.xyz = 0.0; specularColor = 0.0; diffuseColor = 0.0; @@ -2592,23 +2592,23 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace envColor = 1.0; envRoughness = 0.0; color.xyz = 0; -# endif +# endif -# if defined(LANDSCAPE) && !defined(LOD_LAND_BLEND) +# if defined(LANDSCAPE) && !defined(LOD_LAND_BLEND) psout.Diffuse.w = 0; -# else +# else float alpha = baseColor.w; -# if defined(EMAT) && !defined(LANDSCAPE) -# if defined(PARALLAX) +# if defined(EMAT) && !defined(LANDSCAPE) +# if defined(PARALLAX) alpha = TexColorSampler.SampleBias(SampColorSampler, uvOriginal, SharedData::MipBias).w; -# elif defined(TRUE_PBR) +# elif defined(TRUE_PBR) [branch] if (PBRParallax) { alpha = TexColorSampler.SampleBias(SampColorSampler, uvOriginal, SharedData::MipBias).w; } +# endif # endif -# endif -# if defined(DO_ALPHA_TEST) +# if defined(DO_ALPHA_TEST) [branch] if ((Permutation::PixelShaderDescriptor & Permutation::LightingFlags::AdditionalAlphaMask) != 0) { uint2 alphaMask = input.Position.xy; @@ -2639,28 +2639,28 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } } else -# endif // defined(DO_ALPHA_TEST) +# endif // defined(DO_ALPHA_TEST) { alpha *= MaterialData.z; } -# if !(defined(TREE_ANIM) || defined(LODOBJECTSHD) || defined(LODOBJECTS)) +# if !(defined(TREE_ANIM) || defined(LODOBJECTSHD) || defined(LODOBJECTS)) alpha *= input.Color.w; -# endif // !(defined(TREE_ANIM) || defined(LODOBJECTSHD) || defined(LODOBJECTS)) -# if defined(DO_ALPHA_TEST) -# if defined(DEPTH_WRITE_DECALS) +# endif // !(defined(TREE_ANIM) || defined(LODOBJECTSHD) || defined(LODOBJECTS)) +# if defined(DO_ALPHA_TEST) +# if defined(DEPTH_WRITE_DECALS) if (alpha - 0.0156862754 < 0) { discard; } alpha = saturate(1.05 * alpha); -# endif // DEPTH_WRITE_DECALS +# endif // DEPTH_WRITE_DECALS if (alpha - AlphaTestRefRS < 0) { discard; } -# endif // DO_ALPHA_TEST +# endif // DO_ALPHA_TEST psout.Diffuse.w = alpha; -# endif -# if defined(LIGHT_LIMIT_FIX) && defined(LLFDEBUG) +# endif +# if defined(LIGHT_LIMIT_FIX) && defined(LLFDEBUG) if (SharedData::lightLimitFixSettings.EnableLightsVisualisation) { if (SharedData::lightLimitFixSettings.LightsVisualisationMode == 0) { psout.Diffuse.xyz = LightLimitFix::TurboColormap(LightLimitFix::NumStrictLights >= 7.0); @@ -2675,27 +2675,27 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } else { psout.Diffuse.xyz = color.xyz; } -# else +# else psout.Diffuse.xyz = color.xyz; -# endif // defined(LIGHT_LIMIT_FIX) +# endif // defined(LIGHT_LIMIT_FIX) -# if defined(SNOW) -# if defined(TRUE_PBR) +# if defined(SNOW) +# if defined(TRUE_PBR) psout.Parameters.x = Color::RGBToLuminanceAlternative(specularColor); psout.Parameters.y = 0; -# else +# else psout.Parameters.x = Color::RGBToLuminanceAlternative(lightsSpecularColor); -# endif -# endif // SNOW && !PBR +# endif +# endif // SNOW && !PBR psout.MotionVectors.xy = SSRParams.z > 1e-5 ? float2(1, 0) : screenMotionVector.xy; psout.MotionVectors.zw = float2(0, 1); -# if !defined(DEFERRED) +# if !defined(DEFERRED) float ssrMask = glossiness; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) ssrMask = Color::RGBToLuminanceAlternative(pbrSurfaceProperties.F0); -# endif +# endif psout.ScreenSpaceNormals.w = smoothstep(-1e-5 + SSRParams.x, SSRParams.y, ssrMask) * SSRParams.w; // Green reflections fix @@ -2707,71 +2707,71 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace psout.ScreenSpaceNormals.xy = screenSpaceNormal.xy + 0.5.xx; psout.ScreenSpaceNormals.z = 0; -# else +# else -# if defined(TERRAIN_BLENDING) +# if defined(TERRAIN_BLENDING) psout.Diffuse.w = blendFactorTerrain; -# endif +# endif psout.MotionVectors.zw = float2(0.0, psout.Diffuse.w); psout.Specular = float4(specularColor, psout.Diffuse.w); float3 outputAlbedo = baseColor.xyz * vertexColor; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) outputAlbedo = indirectDiffuseLobeWeight; -# endif +# endif psout.Albedo = float4(outputAlbedo, psout.Diffuse.w); const float wetnessGlossinessGain = 0.65; float outGlossiness = saturate(glossiness * SSRParams.w); -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) psout.Reflectance = float4(indirectSpecularLobeWeight, psout.Diffuse.w); -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), lerp(pbrGlossiness, saturate(pbrGlossiness + wetnessGlossinessGain), wetnessGlossinessSpecular), psout.Diffuse.w); -# else +# else psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), pbrGlossiness, psout.Diffuse.w); -# endif -# elif defined(WETNESS_EFFECTS) +# endif +# elif defined(WETNESS_EFFECTS) psout.Reflectance = float4(wetnessReflectance, psout.Diffuse.w); psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), lerp(outGlossiness, saturate(outGlossiness + wetnessGlossinessGain), wetnessGlossinessSpecular), psout.Diffuse.w); -# else +# else psout.Reflectance = float4(0.0.xxx, psout.Diffuse.w); psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), outGlossiness, psout.Diffuse.w); -# endif +# endif -# if defined(TERRAIN_BLENDING) +# if defined(TERRAIN_BLENDING) psout.NormalGlossiness.w = 1; -# endif +# endif -# if defined(SNOW) +# if defined(SNOW) psout.Parameters.w = psout.Diffuse.w; -# endif +# endif -# if (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) -# if defined(DYNAMIC_CUBEMAPS) +# if (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) +# if defined(DYNAMIC_CUBEMAPS) if (dynamicCubemap) { -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) psout.Reflectance.xyz = max(envColor, wetnessReflectance); psout.NormalGlossiness.z = lerp(1.0 - envRoughness, saturate(1.0 - envRoughness + wetnessGlossinessGain), wetnessGlossinessSpecular); -# else +# else psout.Reflectance.xyz = envColor; psout.NormalGlossiness.z = 1.0 - envRoughness; -# endif +# endif } +# endif # endif -# endif -# if defined(SSS) && defined(SKIN) +# if defined(SSS) && defined(SKIN) psout.Masks = float4(saturate(baseColor.a), !(Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::IsBeastRace), 0, psout.Diffuse.w); -# elif defined(WETNESS_EFFECTS) +# elif defined(WETNESS_EFFECTS) float wetnessNormalAmount = saturate(dot(float3(0, 0, 1), wetnessNormal) * saturate(flatnessAmount)); psout.Masks = float4(0, 0, wetnessNormalAmount, psout.Diffuse.w); -# else +# else psout.Masks = float4(0, 0, 0, psout.Diffuse.w); +# endif # endif -# endif return psout; } -#endif // PSHADER \ No newline at end of file +# endif // PSHADER \ No newline at end of file diff --git a/src/FeatureBuffer.cpp b/src/FeatureBuffer.cpp index fa4925f73d..8cd9f86cea 100644 --- a/src/FeatureBuffer.cpp +++ b/src/FeatureBuffer.cpp @@ -9,7 +9,6 @@ #include "Features/SnowCover.h" #include "Features/TerrainShadows.h" #include "Features/WetnessEffects.h" -#include "Features/SnowCover.h" #include "TruePBR.h" diff --git a/src/Globals.cpp b/src/Globals.cpp index 720b5d15b1..4e36c1e0ba 100644 --- a/src/Globals.cpp +++ b/src/Globals.cpp @@ -18,13 +18,13 @@ #include "Features/ScreenSpaceGI.h" #include "Features/ScreenSpaceShadows.h" #include "Features/Skylighting.h" +#include "Features/SnowCover.h" #include "Features/SubsurfaceScattering.h" #include "Features/TerrainBlending.h" #include "Features/TerrainShadows.h" #include "Features/VolumetricLighting.h" #include "Features/WaterEffects.h" #include "Features/WetnessEffects.h" -#include "Features/SnowCover.h" #include "Features/LightLimitFix/ParticleLights.h" From 4cb571427ea7fde0ddd765f92407fc021db94bb5 Mon Sep 17 00:00:00 2001 From: ThePagi <32794457+ThePagi@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:26:15 +0100 Subject: [PATCH 026/131] fixed merge --- .../Shaders/SnowCover/SnowCover.hlsli | 53 +- package/Shaders/DistantTree.hlsl | 11 +- package/Shaders/Lighting.hlsl | 863 +++++++++--------- package/Shaders/RunGrass.hlsl | 26 +- 4 files changed, 467 insertions(+), 486 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 5d4047e7cc..297b0e4d0e 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -1,4 +1,5 @@ #include "Common/SharedData.hlsli" +#include "Common/Color.hlsli" #if defined(PSHADER) namespace SnowCover @@ -58,35 +59,35 @@ namespace SnowCover float GetHeightMult(float3 p) { - float height_tresh = p.z - snowCoverSettings.SnowHeightOffset - (p.x * 0.010569460362286 - p.y * 0.165389061732133 - p.x * p.x * 0.000000034552775 - p.x * p.y * 0.000000572526633 - p.y * p.y * 0.000000272913055 - p.x * p.x * p.x * 0.000000000001466 + p.x * p.x * p.y * 0.000000000000441 + p.x * p.y * p.y * 0.000000000003507 + p.y * p.y * p.y * 0.000000000006575); + float height_tresh = p.z - SharedData::snowCoverSettings.SnowHeightOffset - (p.x * 0.010569460362286 - p.y * 0.165389061732133 - p.x * p.x * 0.000000034552775 - p.x * p.y * 0.000000572526633 - p.y * p.y * 0.000000272913055 - p.x * p.x * p.x * 0.000000000001466 + p.x * p.x * p.y * 0.000000000000441 + p.x * p.y * p.y * 0.000000000003507 + p.y * p.y * p.y * 0.000000000006575); return height_tresh; } float GetEnvironmentalMultiplier(float3 p) { - float maxMonth = max(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); - float minMonth = min(snowCoverSettings.MaxSummerMonth, snowCoverSettings.MaxWinterMonth); + float maxMonth = max(SharedData::snowCoverSettings.MaxSummerMonth, SharedData::snowCoverSettings.MaxWinterMonth); + float minMonth = min(SharedData::snowCoverSettings.MaxSummerMonth, SharedData::snowCoverSettings.MaxWinterMonth); float summerToWinter; - if (snowCoverSettings.Month > maxMonth) { - summerToWinter = (snowCoverSettings.Month - maxMonth) / (minMonth + 12 - maxMonth); - if (snowCoverSettings.MaxWinterMonth > snowCoverSettings.MaxSummerMonth) + if (SharedData::snowCoverSettings.Month > maxMonth) { + summerToWinter = (SharedData::snowCoverSettings.Month - maxMonth) / (minMonth + 12 - maxMonth); + if (SharedData::snowCoverSettings.MaxWinterMonth > SharedData::snowCoverSettings.MaxSummerMonth) summerToWinter = 1 - summerToWinter; - } else if (snowCoverSettings.Month < minMonth) { - summerToWinter = (12 - maxMonth + snowCoverSettings.Month) / (minMonth + 12 - maxMonth); - if (snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) + } else if (SharedData::snowCoverSettings.Month < minMonth) { + summerToWinter = (12 - maxMonth + SharedData::snowCoverSettings.Month) / (minMonth + 12 - maxMonth); + if (SharedData::snowCoverSettings.MaxSummerMonth > SharedData::snowCoverSettings.MaxWinterMonth) summerToWinter = 1 - summerToWinter; } else { - summerToWinter = (snowCoverSettings.Month - minMonth) / (maxMonth - minMonth); - if (snowCoverSettings.MaxSummerMonth > snowCoverSettings.MaxWinterMonth) + summerToWinter = (SharedData::snowCoverSettings.Month - minMonth) / (maxMonth - minMonth); + if (SharedData::snowCoverSettings.MaxSummerMonth > SharedData::snowCoverSettings.MaxWinterMonth) summerToWinter = 1 - summerToWinter; } - return (GetHeightMult(p) - lerp(snowCoverSettings.SummerHeightOffset, snowCoverSettings.WinterHeightOffset, summerToWinter)) / 10000; + return (GetHeightMult(p) - lerp(SharedData::snowCoverSettings.SummerHeightOffset, SharedData::snowCoverSettings.WinterHeightOffset, summerToWinter)) / 10000; } void ApplyFoliageColor(inout float3 color, float env_mult) { - float gmult = saturate(env_mult - snowCoverSettings.FoliageHeightOffset / 1000); + float gmult = saturate(env_mult - SharedData::snowCoverSettings.FoliageHeightOffset / 1000); float3 hsv = RGBtoHSV(color); if (hsv.x > 0.5625) hsv.x = frac(lerp(hsv.x, 1.125, gmult)); @@ -100,13 +101,13 @@ namespace SnowCover { float env_mult = GetEnvironmentalMultiplier(p); float mult = saturate(pow(abs(worldNormal.z), 1)) * saturate(env_mult) * skylight; - if (snowCoverSettings.AffectFoliageColor) { + if (SharedData::snowCoverSettings.AffectFoliageColor) { ApplyFoliageColor(color, env_mult); } - float2 uv = snowCoverSettings.UVScale * p.xy / 100; + float2 uv = SharedData::snowCoverSettings.UVScale * p.xy / 100; float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; # if !defined(TRUE_PBR) - diffuse = pow(LinearToGamma(diffuse) / 3.141, 1 / 1.5); + diffuse = pow(Color::LinearToGamma(diffuse) / 3.141, 1 / 1.5); # endif color = lerp(color, diffuse, mult); } @@ -114,7 +115,7 @@ namespace SnowCover # if !defined(BASIC_SNOW_COVER) float ApplySnowBase(inout float3 worldNormal, inout float sh0, inout float2 uv, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) { - if (snowCoverSettings.Sky < 3) // 3 = exterior + if (SharedData::snowCoverSettings.Sky < 3) // 3 = exterior return 0; //float viewDist = max(1, sqrt(viewPos.z) / 512); # if defined(TRUE_PBR) && defined(LANDSCAPE) @@ -122,8 +123,8 @@ namespace SnowCover # else float disp = sh0 - 0.5; # endif - float raw_p = SnowParallax.Sample(SampColorSampler, snowCoverSettings.UVScale * p.xy / 1000).x; - float parallax = 0.1 * snowCoverSettings.ParallaxScale * (raw_p - 0.5); + float raw_p = SnowParallax.Sample(SampColorSampler, SharedData::snowCoverSettings.UVScale * p.xy / 1000).x; + float parallax = 0.1 * SharedData::snowCoverSettings.ParallaxScale * (raw_p - 0.5); float env_mult = GetEnvironmentalMultiplier(p) + parallax + disp * underDispScale * 0.1; waterDist = smoothstep(-64, 8, -waterDist); float disp_factor = 0; @@ -131,8 +132,8 @@ namespace SnowCover if (extendedMaterialSettings.ExtendShadows) disp_factor = -disp * underDispScale; # endif // - float mult = skylight * (smoothstep(0.3, 0.5, (pow(max(0, worldNormal.z), 2) + disp_factor) * (max(0, env_mult - waterDist) * (0.5 + 0.5 * raw_p + disp_factor) + snowCoverSettings.SnowAmount))); //-smoothstep(-32, 8, -waterDist) - uv = snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; + float mult = skylight * (smoothstep(0.3, 0.5, (pow(max(0, worldNormal.z), 2) + disp_factor) * (max(0, env_mult - waterDist) * (0.5 + 0.5 * raw_p + disp_factor) + SharedData::snowCoverSettings.SnowAmount))); //-smoothstep(-32, 8, -waterDist) + uv = SharedData::snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; if (mult < 0.01) return 0; sh0 = saturate(sh0 + mult * parallax); @@ -156,10 +157,10 @@ namespace SnowCover prop.Metallic = lerp(prop.Metallic, rmaos.y, mult); prop.AO = lerp(prop.AO, rmaos.z, mult); prop.F0 = lerp(prop.F0, rmaos.w * 0.08, mult); - prop.GlintScreenSpaceScale = lerp(prop.GlintScreenSpaceScale, snowCoverSettings.Glint.x, mult); - prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, snowCoverSettings.Glint.y, mult); - prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, snowCoverSettings.Glint.z, mult); - prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, snowCoverSettings.Glint.w, mult); + prop.GlintScreenSpaceScale = lerp(prop.GlintScreenSpaceScale, SharedData::snowCoverSettings.Glint.x, mult); + prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, SharedData::snowCoverSettings.Glint.y, mult); + prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, SharedData::snowCoverSettings.Glint.z, mult); + prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, SharedData::snowCoverSettings.Glint.w, mult); return mult; } # else @@ -173,7 +174,7 @@ namespace SnowCover // apparently LOD landscape color sampler clamps uvs diffuse = SnowDiffuse.Sample(SampColorSampler, frac(uv)).rgb; //diffuse = frac(float3(uv.x, uv.y, 0)); - diffuse = pow(LinearToGamma(diffuse) / PI, 1 / 1.5); + diffuse = pow(Color::LinearToGamma(diffuse) / PI, 1 / 1.5); float4 rmaos = SnowRMAOS.Sample(SampColorSampler, uv); glossiness = lerp(glossiness, 1 - rmaos.x, mult); // yes these are named wrong not my fault bye shininess = lerp(shininess, 25 * 500 * rmaos.w, mult); diff --git a/package/Shaders/DistantTree.hlsl b/package/Shaders/DistantTree.hlsl index 05e6f3d3af..c28d7786f1 100644 --- a/package/Shaders/DistantTree.hlsl +++ b/package/Shaders/DistantTree.hlsl @@ -222,8 +222,8 @@ PS_OUTPUT main(PS_INPUT input) float3 normal = normalize(normalize(cross(ddx, ddy)) + float3(0, 0, 1)); # if defined(SNOW_COVER) - if (snowCoverSettings.EnableSnowCover) - SnowCover::ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz, 1); + if (SharedData::snowCoverSettings.EnableSnowCover) + SnowCover::ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz, 1); # endif # if defined(DEFERRED) @@ -242,10 +242,6 @@ PS_OUTPUT main(PS_INPUT input) float3 diffuseColor = SharedData::DirLightColor.xyz * dirShadow * 0.5; - float3 ddx = ddx_coarse(input.WorldPosition.xyz); - float3 ddy = ddy_coarse(input.WorldPosition.xyz); - float3 normal = normalize(cross(ddx, ddy)); - # if !defined(SSGI) float3 directionalAmbientColor = mul(SharedData::DirectionalAmbient, float4(normal, 1.0)); diffuseColor += directionalAmbientColor; @@ -266,9 +262,6 @@ PS_OUTPUT main(PS_INPUT input) float3 diffuseColor = SharedData::DirLightColor.xyz * dirShadow * 0.5; - float3 ddx = ddx_coarse(input.WorldPosition.xyz); - float3 ddy = ddy_coarse(input.WorldPosition.xyz); - float3 normal = normalize(cross(ddx, ddy)); float3 directionalAmbientColor = mul(SharedData::DirectionalAmbient, float4(normal, 1.0)); diffuseColor += directionalAmbientColor; diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index ec1df50b33..2d57f82006 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -27,9 +27,6 @@ # define LOD #endif -#if defined(SKINNED) || defined(SKIN) || defined(EYE) || defined(HAIR) || !defined(EXTENDED_MATERIALS) -# undef SNOW_COVER -#endif struct VS_INPUT { float4 Position : POSITION0; @@ -1002,15 +999,11 @@ float GetSnowParameterY(float texProjTmp, float alpha) # if defined(SKYLIGHTING) # include "Skylighting/Skylighting.hlsli" -# if defined(SNOW_COVER) -# undef SNOW -//# undef SPARKLE -# include "SnowCover/SnowCover.hlsli" -# endif +# endif -# define LinearSampler SampColorSampler +# define LinearSampler SampColorSampler -# include "Common/ShadowSampling.hlsli" +# include "Common/ShadowSampling.hlsli" PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) @@ -1022,36 +1015,36 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float2 screenUV = FrameBuffer::ViewToUV(viewPosition, true, eyeIndex); float screenNoise = Random::InterleavedGradientNoise(input.Position.xy, SharedData::FrameCount); -# if defined(DEFERRED) +# if defined(DEFERRED) const bool inWorld = true; -# else +# else const bool inWorld = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InWorld); -# endif +# endif float nearFactor = smoothstep(4096.0 * 2.5, 0.0, viewPosition.z); -# if defined(SKINNED) || !defined(MODELSPACENORMALS) +# if defined(SKINNED) || !defined(MODELSPACENORMALS) float3x3 tbn = float3x3(input.TBN0.xyz, input.TBN1.xyz, input.TBN2.xyz); -# if !defined(TREE_ANIM) && !defined(LOD) +# if !defined(TREE_ANIM) && !defined(LOD) // Fix incorrect vertex normals on double-sided meshes if (!frontFace) tbn = lerp(tbn, -tbn, nearFactor); -# endif +# endif float3x3 tbnTr = transpose(tbn); -# endif // defined (SKINNED) || !defined (MODELSPACENORMALS) +# endif // defined (SKINNED) || !defined (MODELSPACENORMALS) -# if !defined(TRUE_PBR) -# if defined(LANDSCAPE) +# if !defined(TRUE_PBR) +# if defined(LANDSCAPE) float shininess = dot(input.LandBlendWeights1, LandscapeTexture1to4IsSpecPower) + input.LandBlendWeights2.x * LandscapeTexture5to6IsSpecPower.x + input.LandBlendWeights2.y * LandscapeTexture5to6IsSpecPower.y; -# else +# else float shininess = SpecularColor.w; -# endif // defined (LANDSCAPE) -# endif +# endif // defined (LANDSCAPE) +# endif -# if defined(TERRAIN_BLENDING) +# if defined(TERRAIN_BLENDING) float depthSampled = TerrainBlending::TerrainBlendingMaskTexture[input.Position.xy]; float depthSampledLinear = SharedData::GetScreenDepth(depthSampled); @@ -1063,7 +1056,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace blendFactorTerrain = 1; blendFactorTerrain = saturate(blendFactorTerrain); -# endif +# endif float3 viewDirection = normalize(input.ViewVector.xyz); float3 worldSpaceViewDirection = -normalize(input.WorldPosition.xyz); @@ -1071,47 +1064,47 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float2 uv = input.TexCoord0.xy; float2 uvOriginal = uv; -# if defined(EMAT) +# if defined(EMAT) float parallaxShadowQuality = sqrt(1.0 - saturate(viewPosition.z / 2048.0)); -# endif +# endif -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) float mipLevels[6]; -# else +# else float mipLevel = 0; -# endif // LANDSCAPE +# endif // LANDSCAPE float sh0 = 0; float pixelOffset = 0; -# if defined(EMAT) -# if defined(LANDSCAPE) +# if defined(EMAT) +# if defined(LANDSCAPE) DisplacementParams displacementParams[6]; displacementParams[0].DisplacementScale = 1.f; displacementParams[0].DisplacementOffset = 0.f; displacementParams[0].HeightScale = 1; displacementParams[0].FlattenAmount = 0; -# else +# else DisplacementParams displacementParams; displacementParams.DisplacementScale = 1.f; displacementParams.DisplacementOffset = 0.f; displacementParams.HeightScale = 1; displacementParams.FlattenAmount = 0; -# endif - # endif +# endif + float curvature = 0; float normalSmoothness = 0; -# if !defined(MODELSPACENORMALS) +# if !defined(MODELSPACENORMALS) float3 vertexNormal = tbnTr[2]; float3 worldSpaceVertexNormal = vertexNormal; -# if !defined(DRAW_IN_WORLDSPACE) +# if !defined(DRAW_IN_WORLDSPACE) [flatten] if (!input.WorldSpace) worldSpaceVertexNormal = normalize(mul(input.World[eyeIndex], float4(worldSpaceVertexNormal, 0))); -# endif -# if defined(EMAT) +# endif +# if defined(EMAT) if (SharedData::extendedMaterialSettings.EnableParallaxWarpingFix) { float3 ndx = ddx(worldSpaceVertexNormal); @@ -1122,16 +1115,16 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace curvature = pow(length(max(abs(ndx), abs(ndy))) * fragSize, 0.5); float3 flatWorldNormal = normalize(-cross(ddx(input.WorldPosition.xyz), ddy(input.WorldPosition.xyz))); normalSmoothness = (1 - dot(worldSpaceVertexNormal, flatWorldNormal)); -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) displacementParams[0].HeightScale = saturate(1 - curvature); displacementParams[0].FlattenAmount = (normalSmoothness + curvature); -# else +# else displacementParams.HeightScale = saturate(1 - curvature); displacementParams.FlattenAmount = (normalSmoothness + curvature); -# endif - } # endif + } # endif +# endif float3 entryNormal = 0; float3 entryNormalTS = 0; @@ -1140,21 +1133,21 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 refractedViewDirectionWS = worldSpaceViewDirection; float4 sampledCoatColor = PBRParams2; -# if defined(EMAT) -# if defined(PARALLAX) +# if defined(EMAT) +# if defined(PARALLAX) if (SharedData::extendedMaterialSettings.EnableParallax) { mipLevel = ExtendedMaterials::GetMipLevel(uv, TexParallaxSampler); uv = ExtendedMaterials::GetParallaxCoords(viewPosition.z, uv, mipLevel, viewDirection, tbnTr, screenNoise, TexParallaxSampler, SampParallaxSampler, 0, displacementParams, pixelOffset); if (SharedData::extendedMaterialSettings.EnableShadows && (parallaxShadowQuality > 0.0f || SharedData::extendedMaterialSettings.ExtendShadows)) sh0 = TexParallaxSampler.SampleLevel(SampParallaxSampler, uv, mipLevel).x; } -# endif // PARALLAX +# endif // PARALLAX bool complexMaterial = false; bool complexMaterialParallax = false; float4 complexMaterialColor = 1.0; -# if defined(EMAT_ENVMAP) +# if defined(EMAT_ENVMAP) if (SharedData::extendedMaterialSettings.EnableComplexMaterial) { float envMaskTest = TexEnvMaskSampler.SampleLevel(SampEnvMaskSampler, uv, 15).w; @@ -1173,9 +1166,9 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } } -# endif // ENVMAP +# endif // ENVMAP -# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) bool PBRParallax = false; [branch] if ((PBRFlags & PBR::Flags::HasFeatureTexture0) != 0) { @@ -1216,29 +1209,29 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace if (SharedData::extendedMaterialSettings.EnableShadows && (parallaxShadowQuality > 0.0f || SharedData::extendedMaterialSettings.ExtendShadows)) sh0 = TexParallaxSampler.SampleLevel(SampParallaxSampler, uv, mipLevel).x; } -# endif // TRUE_PBR +# endif // TRUE_PBR -# endif // EMAT +# endif // EMAT -# if defined(SNOW) +# if defined(SNOW) bool useSnowSpecular = true; -# else +# else bool useSnowSpecular = false; -# endif // SNOW +# endif // SNOW -# if defined(SPARKLE) || !defined(PROJECTED_UV) +# if defined(SPARKLE) || !defined(PROJECTED_UV) bool useSnowDecalSpecular = true; -# else +# else bool useSnowDecalSpecular = false; -# endif // defined(SPARKLE) || !defined(PROJECTED_UV) +# endif // defined(SPARKLE) || !defined(PROJECTED_UV) float2 diffuseUv = uv; -# if defined(SPARKLE) +# if defined(SPARKLE) diffuseUv = ProjectedUVParams2.yy * input.TexCoord0.zw; -# endif // SPARKLE +# endif // SPARKLE -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) // Normalize blend weights float landBlendWeights = 0.0; landBlendWeights += input.LandBlendWeights1.x; @@ -1252,7 +1245,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace input.LandBlendWeights1.z /= landBlendWeights; input.LandBlendWeights1.w /= landBlendWeights; input.LandBlendWeights1.x /= landBlendWeights; -# if defined(EMAT) +# if defined(EMAT) if (SharedData::extendedMaterialSettings.EnableTerrainParallax) { mipLevels[0] = ExtendedMaterials::GetMipLevel(uv, TexColorSampler); mipLevels[1] = ExtendedMaterials::GetMipLevel(uv, TexLandColor2Sampler); @@ -1266,14 +1259,14 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace displacementParams[3] = displacementParams[0]; displacementParams[4] = displacementParams[0]; displacementParams[5] = displacementParams[0]; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) displacementParams[0].HeightScale *= PBRParams1.y; displacementParams[1].HeightScale *= LandscapeTexture2PBRParams.y; displacementParams[2].HeightScale *= LandscapeTexture3PBRParams.y; displacementParams[3].HeightScale *= LandscapeTexture4PBRParams.y; displacementParams[4].HeightScale *= LandscapeTexture5PBRParams.y; displacementParams[5].HeightScale *= LandscapeTexture6PBRParams.y; -# endif +# endif float weights[6]; uv = ExtendedMaterials::GetParallaxCoords(input, viewPosition.z, uv, mipLevels, viewDirection, tbnTr, screenNoise, displacementParams, pixelOffset, weights); @@ -1289,14 +1282,14 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace sh0 = ExtendedMaterials::GetTerrainHeight(input, uv, mipLevels, displacementParams, parallaxShadowQuality, input.LandBlendWeights1, input.LandBlendWeights2.xy, weights); } } -# endif // EMAT -# endif // LANDSCAPE +# endif // EMAT +# endif // LANDSCAPE -# if defined(SPARKLE) +# if defined(SPARKLE) diffuseUv = ProjectedUVParams2.yy * (input.TexCoord0.zw + (uv - uvOriginal)); -# else +# else diffuseUv = uv; -# endif // SPARKLE +# endif // SPARKLE float4 baseColor = 0; float4 normal = 0; @@ -1306,25 +1299,25 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float4 glintParameters = 0; -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) if (input.LandBlendWeights1.x > 0.0) { -# endif // LANDSCAPE +# endif // LANDSCAPE float4 rawBaseColor = TexColorSampler.SampleBias(SampColorSampler, diffuseUv, SharedData::MipBias); -# if defined(TRUE_PBR) && defined(LANDSCAPE) +# if defined(TRUE_PBR) && defined(LANDSCAPE) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile0PBR) == 0) { // relevant for linear only } -# endif +# endif baseColor = float4(Color::Diffuse(rawBaseColor.rgb), rawBaseColor.a); float landSnowMask1 = GetLandSnowMaskValue(baseColor.w); float4 normalColor = TexNormalSampler.SampleBias(SampNormalSampler, uv, SharedData::MipBias); normal = normalColor; -# if defined(MODELSPACENORMALS) -# if defined(LODLANDNOISE) +# if defined(MODELSPACENORMALS) +# if defined(LODLANDNOISE) normal.xyz = normal.xzy - 0.5.xxx; float lodLandNoiseParameter = GetLodLandBlendParameter(baseColor.xyz); float noise = TexLandLodNoiseSampler.Sample(SampLandLodNoiseSampler, uv * 3.0.xx).x; @@ -1333,31 +1326,31 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace normal.xyz *= 2; normal.w = 1; glossiness = 0; -# elif defined(LODLANDSCAPE) +# elif defined(LODLANDSCAPE) normal.xyz = 2.0.xxx * (-0.5.xxx + normal.xzy); normal.w = 1; glossiness = 0; -# else +# else normal.xyz = normal.xzy * 2.0.xxx + -1.0.xxx; normal.w = 1; glossiness = TexSpecularSampler.Sample(SampSpecularSampler, uv).x; -# endif // LODLANDNOISE -# elif (defined(SNOW) && defined(LANDSCAPE)) +# endif // LODLANDNOISE +# elif (defined(SNOW) && defined(LANDSCAPE)) normal.xyz = GetLandNormal(landSnowMask1, normal.xyz, uv, SampNormalSampler, TexNormalSampler); glossiness = normal.w; -# else +# else normal.xyz = TransformNormal(normal.xyz); glossiness = normal.w; -# endif // MODELSPACENORMALS +# endif // MODELSPACENORMALS -# if defined(WORLD_MAP) +# if defined(WORLD_MAP) normal.xyz = GetWorldMapNormal(input, normal.xyz, rawBaseColor.xyz); -# endif // WORLD_MAP +# endif // WORLD_MAP -# if defined(TRUE_PBR) -# if defined(LODLANDNOISE) +# if defined(TRUE_PBR) +# if defined(LODLANDNOISE) rawRMAOS = float4(1, 0, 1, 0); -# elif defined(LANDSCAPE) +# elif defined(LANDSCAPE) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile0PBR) != 0) { rawRMAOS = input.LandBlendWeights1.x * TexRMAOSSampler.SampleBias(SampRMAOSSampler, diffuseUv, SharedData::MipBias) * float4(PBRParams1.x, 1, 1, PBRParams1.z); @@ -1369,39 +1362,39 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS = input.LandBlendWeights1.x * float4(1 - glossiness.x, 0, 1, 0); } -# else +# else rawRMAOS = TexRMAOSSampler.SampleBias(SampRMAOSSampler, diffuseUv, SharedData::MipBias) * float4(PBRParams1.x, 1, 1, PBRParams1.z); if ((PBRFlags & PBR::Flags::Glint) != 0) { glintParameters = MultiLayerParallaxData; } -# endif # endif +# endif -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) baseColor *= input.LandBlendWeights1.x; normal *= input.LandBlendWeights1.x; glossiness *= input.LandBlendWeights1.x; } -# endif // LANDSCAPE +# endif // LANDSCAPE -# if defined(EMAT_ENVMAP) +# if defined(EMAT_ENVMAP) complexMaterial = complexMaterial && complexMaterialColor.y > (4.0 / 255.0) && (complexMaterialColor.y < (1.0 - (4.0 / 255.0))); shininess = lerp(shininess, shininess * complexMaterialColor.y, complexMaterial); float3 complexSpecular = lerp(1.0, lerp(1.0, baseColor.xyz, complexMaterialColor.z), complexMaterial); baseColor.xyz = lerp(baseColor.xyz, lerp(baseColor.xyz, 0.0, complexMaterialColor.z), complexMaterial); -# endif // defined (EMAT) && defined(ENVMAP) +# endif // defined (EMAT) && defined(ENVMAP) -# if defined(FACEGEN) +# if defined(FACEGEN) baseColor.xyz = GetFacegenBaseColor(baseColor.xyz, uv); -# elif defined(FACEGEN_RGB_TINT) +# elif defined(FACEGEN_RGB_TINT) baseColor.xyz = GetFacegenRGBTintBaseColor(baseColor.xyz, uv); -# endif // FACEGEN +# endif // FACEGEN -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) float landSnowMask = LandscapeTexture1to4IsSnow.x * input.LandBlendWeights1.x; -# endif // SNOW +# endif // SNOW if (input.LandBlendWeights1.y > 0.0) { float4 landColor2 = TexLandColor2Sampler.SampleBias(SampLandColor2Sampler, uv, SharedData::MipBias); @@ -1411,11 +1404,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal2.xyz = GetLandNormal(landSnowMask2, landNormal2.xyz, uv, SampLandNormal2Sampler, TexLandNormal2Sampler); normal.xyz += input.LandBlendWeights1.yyy * landNormal2.xyz; glossiness += input.LandBlendWeights1.y * landNormal2.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture1to4IsSnow.y * input.LandBlendWeights1.y * landSnowMask2; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile1PBR) != 0) { rawRMAOS += input.LandBlendWeights1.y * TexLandRMAOS2Sampler.SampleBias(SampLandRMAOS2Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture2PBRParams.x, 1, 1, LandscapeTexture2PBRParams.z); @@ -1427,7 +1420,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights1.y * float4(1 - landNormal2.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights1.yyyy * landColor2; } @@ -1439,11 +1432,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal3.xyz = GetLandNormal(landSnowMask3, landNormal3.xyz, uv, SampLandNormal3Sampler, TexLandNormal3Sampler); normal.xyz += input.LandBlendWeights1.zzz * landNormal3.xyz; glossiness += input.LandBlendWeights1.z * landNormal3.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture1to4IsSnow.z * input.LandBlendWeights1.z * landSnowMask3; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile2PBR) != 0) { rawRMAOS += input.LandBlendWeights1.z * TexLandRMAOS3Sampler.SampleBias(SampLandRMAOS3Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture3PBRParams.x, 1, 1, LandscapeTexture3PBRParams.z); @@ -1455,7 +1448,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights1.z * float4(1 - landNormal3.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights1.zzzz * landColor3; } @@ -1467,11 +1460,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal4.xyz = GetLandNormal(landSnowMask4, landNormal4.xyz, uv, SampLandNormal4Sampler, TexLandNormal4Sampler); normal.xyz += input.LandBlendWeights1.www * landNormal4.xyz; glossiness += input.LandBlendWeights1.w * landNormal4.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture1to4IsSnow.w * input.LandBlendWeights1.w * landSnowMask4; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile3PBR) != 0) { rawRMAOS += input.LandBlendWeights1.w * TexLandRMAOS4Sampler.SampleBias(SampLandRMAOS4Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture4PBRParams.x, 1, 1, LandscapeTexture4PBRParams.z); @@ -1483,7 +1476,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights1.w * float4(1 - landNormal4.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights1.wwww * landColor4; } @@ -1495,11 +1488,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal5.xyz = GetLandNormal(landSnowMask5, landNormal5.xyz, uv, SampLandNormal5Sampler, TexLandNormal5Sampler); normal.xyz += input.LandBlendWeights2.xxx * landNormal5.xyz; glossiness += input.LandBlendWeights2.x * landNormal5.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture5to6IsSnow.x * input.LandBlendWeights2.x * landSnowMask5; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile4PBR) != 0) { rawRMAOS += input.LandBlendWeights2.x * TexLandRMAOS5Sampler.SampleBias(SampLandRMAOS5Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture5PBRParams.x, 1, 1, LandscapeTexture5PBRParams.z); @@ -1511,7 +1504,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights2.x * float4(1 - landNormal5.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights2.xxxx * landColor5; } @@ -1523,11 +1516,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace landNormal6.xyz = GetLandNormal(landSnowMask6, landNormal6.xyz, uv, SampLandNormal6Sampler, TexLandNormal6Sampler); normal.xyz += input.LandBlendWeights2.yyy * landNormal6.xyz; glossiness += input.LandBlendWeights2.y * landNormal6.w; -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) landSnowMask += LandscapeTexture5to6IsSnow.y * input.LandBlendWeights2.y * landSnowMask6; -# endif // SNOW +# endif // SNOW -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile5PBR) != 0) { rawRMAOS += input.LandBlendWeights2.y * TexLandRMAOS6Sampler.SampleBias(SampLandRMAOS6Sampler, uv, SharedData::MipBias) * float4(LandscapeTexture6PBRParams.x, 1, 1, LandscapeTexture6PBRParams.z); @@ -1539,11 +1532,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace { rawRMAOS += input.LandBlendWeights2.y * float4(1 - landNormal6.w, 0, 1, 0); } -# endif +# endif baseColor += input.LandBlendWeights2.yyyy * landColor6; } -# if defined(LOD_LAND_BLEND) +# if defined(LOD_LAND_BLEND) float4 lodLandColor = TexLandLodBlend1Sampler.Sample(SampLandLodBlend1Sampler, input.TexCoord0.zw); float lodBlendParameter = GetLodLandBlendParameter(lodLandColor.xyz); float lodBlendMask = TexLandLodBlend2Sampler.Sample(SampLandLodBlend2Sampler, 3.0.xx * input.TexCoord0.zw).x; @@ -1552,44 +1545,44 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace normal.xyz = lerp(normal.xyz, float3(0, 0, 1), lodLandBlendFactor); -# if !defined(TRUE_PBR) +# if !defined(TRUE_PBR) baseColor.w = 0; baseColor = lerp(baseColor, lodLandColor * lodLandFadeFactor, lodLandBlendFactor); glossiness = lerp(glossiness, 0, lodLandBlendFactor); -# endif -# endif // LOD_LAND_BLEND +# endif +# endif // LOD_LAND_BLEND -# if defined(SNOW) && !defined(TRUE_PBR) +# if defined(SNOW) && !defined(TRUE_PBR) useSnowSpecular = landSnowMask != 0.0; -# endif // SNOW -# endif // LANDSCAPE +# endif // SNOW +# endif // LANDSCAPE -# if defined(BACK_LIGHTING) +# if defined(BACK_LIGHTING) float4 backLightColor = TexBackLightSampler.Sample(SampBackLightSampler, uv); -# endif // BACK_LIGHTING +# endif // BACK_LIGHTING -# if defined(RIM_LIGHTING) || defined(SOFT_LIGHTING) || defined(LOAD_SOFT_LIGHTING) +# if defined(RIM_LIGHTING) || defined(SOFT_LIGHTING) || defined(LOAD_SOFT_LIGHTING) float4 rimSoftLightColor = TexRimSoftLightWorldMapOverlaySampler.Sample(SampRimSoftLightWorldMapOverlaySampler, uv); -# endif // RIM_LIGHTING || SOFT_LIGHTING +# endif // RIM_LIGHTING || SOFT_LIGHTING uint numLights = min(7, uint(NumLightNumShadowLight.x)); uint numShadowLights = min(4, uint(NumLightNumShadowLight.y)); -# if defined(TRUE_PBR) && !defined(MODELSPACENORMALS) +# if defined(TRUE_PBR) && !defined(MODELSPACENORMALS) if (!frontFace) { normal.xyz *= -1; } -# endif +# endif -# if defined(MODELSPACENORMALS) && !defined(SKINNED) +# if defined(MODELSPACENORMALS) && !defined(SKINNED) float4 modelNormal = normal; -# else +# else float4 modelNormal = float4(normalize(mul(tbn, normal.xyz)), 1); -# if defined(SPARKLE) +# if defined(SPARKLE) float3 projectedNormal = normalize(mul(tbn, float3(ProjectedUVParams2.xx * normal.xy, normal.z))); -# endif // SPARKLE -# endif // defined (MODELSPACENORMALS) && !defined (SKINNED) +# endif // SPARKLE +# endif // defined (MODELSPACENORMALS) && !defined (SKINNED) float2 baseShadowUV = 1.0.xx; float4 shadowColor = 1.0; @@ -1604,28 +1597,28 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float projWeight = 0; -# if defined(PROJECTED_UV) +# if defined(PROJECTED_UV) float2 projNoiseUv = ProjectedUVParams.zz * input.TexCoord0.zw; float projNoise = TexCharacterLightProjNoiseSampler.Sample(SampCharacterLightProjNoiseSampler, projNoiseUv).x; float3 texProj = normalize(input.TexProj); -# if defined(TREE_ANIM) || defined(LODOBJECTSHD) +# if defined(TREE_ANIM) || defined(LODOBJECTSHD) float vertexAlpha = 1; -# else +# else float vertexAlpha = input.Color.w; -# endif // defined (TREE_ANIM) || defined (LODOBJECTSHD) +# endif // defined (TREE_ANIM) || defined (LODOBJECTSHD) projWeight = -ProjectedUVParams.x * projNoise + (dot(modelNormal.xyz, texProj) * vertexAlpha - ProjectedUVParams.w); -# if defined(LODOBJECTSHD) +# if defined(LODOBJECTSHD) projWeight += (-0.5 + input.Color.w) * 2.5; -# endif // LODOBJECTSHD -# if defined(SPARKLE) +# endif // LODOBJECTSHD +# if defined(SPARKLE) if (projWeight < 0) discard; modelNormal.xyz = projectedNormal; -# if defined(SNOW) +# if defined(SNOW) psout.Parameters.y = 1; -# endif // SNOW -# elif !defined(FACEGEN) && !defined(MULTI_LAYER_PARALLAX) && !defined(PARALLAX) && !defined(SPARKLE) +# endif // SNOW +# elif !defined(FACEGEN) && !defined(MULTI_LAYER_PARALLAX) && !defined(PARALLAX) && !defined(SPARKLE) if (ProjectedUVParams3.w > 0.5) { float2 projNormalDiffuseUv = ProjectedUVParams3.x * projNoiseUv; float3 projNormal = TransformNormal(TexProjNormalSampler.Sample(SampProjNormalSampler, projNormalDiffuseUv).xyz); @@ -1634,7 +1627,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 finalProjNormal = normalize(TransformNormal(projDetailNormal) * float3(1, 1, projNormal.z) + float3(projNormal.xy, 0)); float3 projBaseColor = TexProjDiffuseSampler.Sample(SampProjDiffuseSampler, projNormalDiffuseUv).xyz * ProjectedUVParams2.xyz; projectedMaterialWeight = smoothstep(0, 1, 5 * (0.1 + projWeight)); -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) projBaseColor = saturate(EnvmapData.xyz * projBaseColor); rawRMAOS.xyw = lerp(rawRMAOS.xyw, float3(ParallaxOccData.x, 0, ParallaxOccData.y), projectedMaterialWeight); float4 projectedGlintParameters = 0; @@ -1642,59 +1635,59 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace projectedGlintParameters = SparkleParams; } glintParameters = lerp(glintParameters, projectedGlintParameters, projectedMaterialWeight); -# endif // TRUE_PBR +# endif // TRUE_PBR normal.xyz = lerp(normal.xyz, finalProjNormal, projectedMaterialWeight); baseColor.xyz = lerp(baseColor.xyz, projBaseColor, projectedMaterialWeight); -# if defined(SNOW) +# if defined(SNOW) useSnowDecalSpecular = true; psout.Parameters.y = GetSnowParameterY(projectedMaterialWeight, baseColor.w); -# endif // SNOW +# endif // SNOW } else { if (projWeight > 0) { baseColor.xyz = ProjectedUVParams2.xyz; -# if defined(SNOW) +# if defined(SNOW) useSnowDecalSpecular = true; psout.Parameters.y = GetSnowParameterY(projWeight, baseColor.w); -# endif // SNOW +# endif // SNOW } else { -# if defined(SNOW) +# if defined(SNOW) psout.Parameters.y = 0; -# endif // SNOW +# endif // SNOW } } -# if defined(SPECULAR) +# if defined(SPECULAR) useSnowSpecular = useSnowDecalSpecular; -# endif // SPECULAR -# endif // SPARKLE +# endif // SPECULAR +# endif // SPARKLE -# elif defined(SNOW) -# if defined(LANDSCAPE) +# elif defined(SNOW) +# if defined(LANDSCAPE) psout.Parameters.y = landSnowMask; -# else +# else psout.Parameters.y = baseColor.w; -# endif // LANDSCAPE -# endif // SNOW +# endif // LANDSCAPE +# endif // SNOW -# if defined(WORLD_MAP) +# if defined(WORLD_MAP) baseColor.xyz = GetWorldMapBaseColor(rawBaseColor.xyz, baseColor.xyz, projWeight); -# endif // WORLD_MAP +# endif // WORLD_MAP float3 worldSpaceNormal = modelNormal.xyz; -# if !defined(DRAW_IN_WORLDSPACE) +# if !defined(DRAW_IN_WORLDSPACE) [flatten] if (!input.WorldSpace) worldSpaceNormal = normalize(mul(input.World[eyeIndex], float4(worldSpaceNormal, 0))); -# endif +# endif -# if defined(MODELSPACENORMALS) +# if defined(MODELSPACENORMALS) float3 worldSpaceVertexNormal = worldSpaceNormal; -# endif +# endif float3 screenSpaceNormal = normalize(FrameBuffer::WorldToView(worldSpaceNormal, false, eyeIndex)); -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) PBR::SurfaceProperties pbrSurfaceProperties = PBR::InitSurfaceProperties(); pbrSurfaceProperties.Noise = screenNoise; @@ -1709,10 +1702,10 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace pbrSurfaceProperties.GlintMicrofacetRoughness = clamp(glintParameters.z, 0.005, 0.3); pbrSurfaceProperties.GlintDensityRandomization = clamp(glintParameters.w, 0, 5); -# if defined(GLINT) +# if defined(GLINT) float glintNoise = Random::R1Modified(SharedData::FrameCount, Random::pcg2d(uint2(input.Position.xy)) / 4294967296.0); PBR::Glints::PrecomputeGlints(glintNoise, uvOriginal, ddx(uvOriginal), ddy(uvOriginal), pbrSurfaceProperties.GlintScreenSpaceScale, pbrSurfaceProperties.GlintCache); -# endif +# endif baseColor.xyz *= 1 - pbrSurfaceProperties.Metallic; @@ -1721,7 +1714,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 coatModelNormal = modelNormal.xyz; float3 coatWorldNormal = worldSpaceNormal; -# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::Subsurface) != 0) { pbrSurfaceProperties.SubsurfaceColor = PBRParams2.xyz; @@ -1755,12 +1748,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace coatModelNormal = normalize(mul(tbn, TransformNormal(sampledCoatProperties.xyz))); } -# if !defined(DRAW_IN_WORLDSPACE) +# if !defined(DRAW_IN_WORLDSPACE) [flatten] if (!input.WorldSpace) { coatWorldNormal = normalize(mul(input.World[eyeIndex], float4(coatModelNormal, 0))); } -# endif +# endif } pbrSurfaceProperties.CoatStrength = lerp(pbrSurfaceProperties.CoatStrength, 0, projectedMaterialWeight); } @@ -1777,38 +1770,38 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } pbrSurfaceProperties.FuzzWeight = lerp(pbrSurfaceProperties.FuzzWeight, 0, projectedMaterialWeight); } -# endif +# endif float3 specularColorPBR = 0; float3 transmissionColor = 0; float pbrWeight = 1; float pbrGlossiness = 1 - pbrSurfaceProperties.Roughness; -# endif // TRUE_PBR +# endif // TRUE_PBR float porosity = 1.0; -# if defined(SKYLIGHTING) -# if defined(VR) +# if defined(SKYLIGHTING) +# if defined(VR) float3 positionMSSkylight = input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; -# else +# else float3 positionMSSkylight = input.WorldPosition.xyz; -# endif +# endif -# if defined(DEFERRED) +# if defined(DEFERRED) sh2 skylightingSH = Skylighting::sample(SharedData::skylightingSettings, Skylighting::SkylightingProbeArray, Skylighting::stbn_vec3_2Dx1D_128x128x64, input.Position.xy, positionMSSkylight, worldSpaceNormal); -# else +# else sh2 skylightingSH = inWorld ? Skylighting::sample(SharedData::skylightingSettings, Skylighting::SkylightingProbeArray, Skylighting::stbn_vec3_2Dx1D_128x128x64, input.Position.xy, positionMSSkylight, worldSpaceNormal) : float4(sqrt(4.0 * Math::PI), 0, 0, 0); -# endif - # endif +# endif + float4 waterData = SharedData::GetWaterData(input.WorldPosition.xyz); float waterHeight = waterData.w; float waterRoughnessSpecular = 1; -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) float wetness = 0.0; float wetnessDistToWater = abs(input.WorldPosition.z - waterHeight); @@ -1823,11 +1816,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float maxOcclusion = 1; float minWetnessAngle = 0; minWetnessAngle = saturate(max(minWetnessValue, worldSpaceNormal.z)); -# if defined(SKYLIGHTING) +# if defined(SKYLIGHTING) float wetnessOcclusion = inWorld ? pow(saturate(SphericalHarmonics::Unproject(skylightingSH, float3(0, 0, 1))), 2) : 0; -# else +# else float wetnessOcclusion = inWorld; -# endif +# endif float4 raindropInfo = float4(0, 0, 1, 0); if (worldSpaceNormal.z > 0 && SharedData::wetnessEffectsSettings.Raining > 0.0f && SharedData::wetnessEffectsSettings.EnableRaindropFx) { @@ -1839,13 +1832,13 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float precipOcclusionZ = WetnessEffects::TexPrecipOcclusion.SampleLevel(SampColorSampler, precipOcclusionUV, 0).x; if (precipOcclusionTexCoord.z < precipOcclusionZ + 0.1) -# if defined(SKINNED) +# if defined(SKINNED) raindropInfo = WetnessEffects::GetRainDrops(input.ModelPosition.xyz, SharedData::wetnessEffectsSettings.Time, worldSpaceNormal); -# elif defined(DEFERRED) +# elif defined(DEFERRED) raindropInfo = WetnessEffects::GetRainDrops(input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz, SharedData::wetnessEffectsSettings.Time, worldSpaceNormal); -# else +# else raindropInfo = WetnessEffects::GetRainDrops(!FrameBuffer::FrameParams.y ? input.ModelPosition.xyz : input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz, SharedData::wetnessEffectsSettings.Time, worldSpaceNormal); -# endif +# endif } } @@ -1853,12 +1846,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace rainWetness = max(rainWetness, raindropInfo.w); float puddleWetness = SharedData::wetnessEffectsSettings.PuddleWetness * minWetnessAngle; -# if defined(SKIN) +# if defined(SKIN) rainWetness = SharedData::wetnessEffectsSettings.SkinWetness * SharedData::wetnessEffectsSettings.Wetness; -# endif -# if defined(HAIR) +# endif +# if defined(HAIR) rainWetness = SharedData::wetnessEffectsSettings.SkinWetness * SharedData::wetnessEffectsSettings.Wetness * 0.8f; -# endif +# endif rainWetness *= wetnessOcclusion; puddleWetness *= wetnessOcclusion; @@ -1870,11 +1863,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 puddleCoords = ((input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz) * 0.5 + 0.5) * 0.01 / SharedData::wetnessEffectsSettings.PuddleRadius; float puddle = wetness; if (wetness > 0.0 || puddleWetness > 0) { -# if !defined(SKINNED) +# if !defined(SKINNED) puddle = Random::perlinNoise(puddleCoords) * .5 + .5; puddle = puddle * ((minWetnessAngle / SharedData::wetnessEffectsSettings.PuddleMaxAngle) * SharedData::wetnessEffectsSettings.MaxPuddleWetness * 0.25) + 0.5; wetness = lerp(wetness, puddleWetness, saturate(puddle - 0.25)); -# endif +# endif puddle *= wetness; } @@ -1898,49 +1891,49 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace wetnessNormal = WetnessEffects::ReorientNormal(rippleNormal, wetnessNormal); waterRoughnessSpecular = 1.0 - wetnessGlossinessSpecular * 0.9; -# endif +# endif float3 dirLightColor = Color::Light(DirLightColor.xyz); float3 dirLightColorMultiplier = 1; -# if defined(WATER_EFFECTS) +# if defined(WATER_EFFECTS) dirLightColorMultiplier *= WaterEffects::ComputeCaustics(waterData, input.WorldPosition.xyz, worldSpaceNormal); -# endif +# endif float selfShadowFactor = 1.0f; float3 normalizedDirLightDirectionWS = DirLightDirection; -# if !defined(DRAW_IN_WORLDSPACE) +# if !defined(DRAW_IN_WORLDSPACE) [flatten] if (!input.WorldSpace) normalizedDirLightDirectionWS = normalize(mul(input.World[eyeIndex], float4(DirLightDirection.xyz, 0))); -# endif +# endif float dirLightAngle = dot(modelNormal.xyz, DirLightDirection.xyz); if ((Permutation::PixelShaderDescriptor & Permutation::LightingFlags::DefShadow) && (Permutation::PixelShaderDescriptor & Permutation::LightingFlags::ShadowDir)) { dirLightColorMultiplier *= shadowColor.x; } -# if !defined(DEFERRED) +# if !defined(DEFERRED) else if (!SharedData::InInterior && inWorld) { dirLightColorMultiplier *= ShadowSampling::GetLightingShadow(screenNoise, input.WorldPosition.xyz, eyeIndex); } -# endif +# endif -# if defined(SOFT_LIGHTING) || defined(BACK_LIGHTING) || defined(RIM_LIGHTING) +# if defined(SOFT_LIGHTING) || defined(BACK_LIGHTING) || defined(RIM_LIGHTING) bool inDirShadow = ((Permutation::PixelShaderDescriptor & Permutation::LightingFlags::DefShadow) && (Permutation::PixelShaderDescriptor & Permutation::LightingFlags::ShadowDir) && shadowColor.x == 0); -# else +# else bool inDirShadow = ((Permutation::PixelShaderDescriptor & Permutation::LightingFlags::DefShadow) && (Permutation::PixelShaderDescriptor & Permutation::LightingFlags::ShadowDir) && shadowColor.x == 0) && dirLightAngle > 0.0; -# endif +# endif float3 refractedDirLightDirection = DirLightDirection; -# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::InterlayerParallax) != 0) { if (dot(DirLightDirection, coatModelNormal) > 0) refractedDirLightDirection = -refract(-DirLightDirection, coatModelNormal, eta); } -# endif +# endif float dirDetailShadow = 1.0; float dirShadow = 1.0; @@ -1948,41 +1941,41 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace bool inReflection = Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InReflection; -# if defined(SCREEN_SPACE_SHADOWS) -# if defined(DEFERRED) +# if defined(SCREEN_SPACE_SHADOWS) +# if defined(DEFERRED) bool useScreenSpaceShadows = true; -# else +# else bool useScreenSpaceShadows = inWorld && !SharedData::InInterior && Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::IsDecal; -# endif +# endif if (useScreenSpaceShadows) { dirDetailShadow = ScreenSpaceShadows::GetScreenSpaceShadow(input.Position.xyz, screenUV, screenNoise, eyeIndex); -# if defined(TREE_ANIM) +# if defined(TREE_ANIM) ShadowSampling::ShadowData sD = ShadowSampling::SharedShadowData[0]; dirDetailShadow = lerp(1.0, dirDetailShadow, saturate(viewPosition.z / sqrt(sD.ShadowLightParam.z))); -# endif - } # endif + } +# endif -# if defined(EMAT) && (defined(SKINNED) || !defined(MODELSPACENORMALS)) +# if defined(EMAT) && (defined(SKINNED) || !defined(MODELSPACENORMALS)) [branch] if (inWorld && SharedData::extendedMaterialSettings.EnableShadows) { float3 dirLightDirectionTS = mul(refractedDirLightDirection, tbn).xyz; -# if defined(LANDSCAPE) +# if defined(LANDSCAPE) [branch] if (SharedData::extendedMaterialSettings.EnableTerrainParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplierTerrain(input, uv, mipLevels, dirLightDirectionTS, sh0, parallaxShadowQuality, screenNoise, displacementParams); -# elif defined(PARALLAX) +# elif defined(PARALLAX) [branch] if (SharedData::extendedMaterialSettings.EnableParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, dirLightDirectionTS, sh0, TexParallaxSampler, SampParallaxSampler, 0, lerp(parallaxShadowQuality, 1.0, SharedData::extendedMaterialSettings.ExtendShadows), screenNoise, displacementParams); -# elif defined(EMAT_ENVMAP) +# elif defined(EMAT_ENVMAP) [branch] if (complexMaterialParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, dirLightDirectionTS, sh0, TexEnvMaskSampler, SampEnvMaskSampler, 3, lerp(parallaxShadowQuality, 1.0, SharedData::extendedMaterialSettings.ExtendShadows), screenNoise, displacementParams); -# elif defined(TRUE_PBR) && !defined(LODLANDSCAPE) +# elif defined(TRUE_PBR) && !defined(LODLANDSCAPE) [branch] if (PBRParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, dirLightDirectionTS, sh0, TexParallaxSampler, SampParallaxSampler, 0, lerp(parallaxShadowQuality, 1.0, SharedData::extendedMaterialSettings.ExtendShadows), screenNoise, displacementParams); -# endif // LANDSCAPE +# endif // LANDSCAPE } -# endif // defined(EMAT) && (defined (SKINNED) || !defined \ +# endif // defined(EMAT) && (defined (SKINNED) || !defined \ // (MODELSPACENORMALS)) if (dirShadow != 0.0 && (inWorld || inReflection)) @@ -1999,7 +1992,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 lodLandDiffuseColor = 0; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) { PBR::LightProperties lightProperties = PBR::InitLightProperties(dirLightColor, dirLightColorMultiplier * dirDetailShadow, parallaxShadow); float3 dirDiffuseColor, coatDirDiffuseColor, dirTransmissionColor, dirSpecularColor; @@ -2008,51 +2001,51 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace coatLightsDiffuseColor += coatDirDiffuseColor; transmissionColor += dirTransmissionColor; specularColorPBR += dirSpecularColor * !SharedData::InInterior; -# if defined(LOD_LAND_BLEND) +# if defined(LOD_LAND_BLEND) lodLandDiffuseColor += dirLightColor / Math::PI * saturate(dirLightAngle) * dirLightColorMultiplier * dirDetailShadow * parallaxShadow; -# endif -# if defined(WETNESS_EFFECTS) +# endif +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) specularColorPBR += PBR::GetWetnessDirectLightSpecularInput(wetnessNormal, worldSpaceViewDirection, normalizedDirLightDirectionWS, lightProperties.CoatLightColor, waterRoughnessSpecular) * wetnessGlossinessSpecular; -# endif +# endif } -# else +# else dirDetailShadow *= parallaxShadow; dirLightColor *= dirLightColorMultiplier; float3 dirDiffuseColor = dirLightColor * saturate(dirLightAngle) * dirDetailShadow; -# if defined(SOFT_LIGHTING) +# if defined(SOFT_LIGHTING) lightsDiffuseColor += dirLightColor * GetSoftLightMultiplier(dirLightAngle) * rimSoftLightColor.xyz; -# endif +# endif -# if defined(RIM_LIGHTING) +# if defined(RIM_LIGHTING) lightsDiffuseColor += dirLightColor * GetRimLightMultiplier(DirLightDirection, viewDirection, modelNormal.xyz) * rimSoftLightColor.xyz; -# endif +# endif -# if defined(BACK_LIGHTING) +# if defined(BACK_LIGHTING) lightsDiffuseColor += dirLightColor * saturate(-dirLightAngle) * backLightColor.xyz; -# endif +# endif if (useSnowSpecular && useSnowDecalSpecular) { -# if defined(SNOW) +# if defined(SNOW) lightsSpecularColor += GetSnowSpecularColor(input, modelNormal.xyz, viewDirection); -# endif +# endif } else { -# if defined(SPECULAR) || defined(SPARKLE) +# if defined(SPECULAR) || defined(SPARKLE) lightsSpecularColor = GetLightSpecularInput(input, DirLightDirection, viewDirection, modelNormal.xyz, dirLightColor.xyz * dirDetailShadow, shininess, uv); -# endif +# endif } lightsDiffuseColor += dirDiffuseColor; -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) wetnessSpecular += WetnessEffects::GetWetnessSpecular(wetnessNormal, normalizedDirLightDirectionWS, worldSpaceViewDirection, dirLightColor * dirDetailShadow, waterRoughnessSpecular); -# endif # endif +# endif -# if !defined(LOD) -# if !defined(LIGHT_LIMIT_FIX) +# if !defined(LOD) +# if !defined(LIGHT_LIMIT_FIX) [loop] for (uint lightIndex = 0; lightIndex < numLights; lightIndex++) { float3 lightDirection = PointLightPosition[eyeIndex * numLights + lightIndex].xyz - input.InputPosition.xyz; @@ -2072,17 +2065,17 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 normalizedLightDirection = normalize(lightDirection); -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) { float3 pointDiffuseColor, coatPointDiffuseColor, pointTransmissionColor, pointSpecularColor; float3 refractedLightDirection = normalizedLightDirection; -# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::InterlayerParallax) != 0) { if (dot(normalizedLightDirection, coatModelNormal) > 0) refractedLightDirection = -refract(-normalizedLightDirection, coatModelNormal, eta); } -# endif +# endif PBR::LightProperties lightProperties = PBR::InitLightProperties(lightColor, lightShadow, 1); PBR::GetDirectLightInput(pointDiffuseColor, coatPointDiffuseColor, pointTransmissionColor, pointSpecularColor, modelNormal.xyz, coatModelNormal, refractedViewDirection, viewDirection, refractedLightDirection, normalizedLightDirection, lightProperties, pbrSurfaceProperties, tbnTr, uvOriginal); lightsDiffuseColor += pointDiffuseColor; @@ -2090,38 +2083,38 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace transmissionColor += pointTransmissionColor; specularColorPBR += pointSpecularColor; } -# else +# else lightColor *= lightShadow; float lightAngle = dot(modelNormal.xyz, normalizedLightDirection.xyz); float3 lightDiffuseColor = lightColor * saturate(lightAngle.xxx); -# if defined(SOFT_LIGHTING) +# if defined(SOFT_LIGHTING) lightDiffuseColor += lightColor * GetSoftLightMultiplier(lightAngle) * rimSoftLightColor.xyz; -# endif // SOFT_LIGHTING +# endif // SOFT_LIGHTING -# if defined(RIM_LIGHTING) +# if defined(RIM_LIGHTING) lightDiffuseColor += lightColor * GetRimLightMultiplier(normalizedLightDirection, viewDirection, modelNormal.xyz) * rimSoftLightColor.xyz; -# endif // RIM_LIGHTING +# endif // RIM_LIGHTING -# if defined(BACK_LIGHTING) +# if defined(BACK_LIGHTING) lightDiffuseColor += lightColor * saturate(-lightAngle) * backLightColor.xyz; -# endif // BACK_LIGHTING +# endif // BACK_LIGHTING -# if defined(SPECULAR) || (defined(SPARKLE) && !defined(SNOW)) +# if defined(SPECULAR) || (defined(SPARKLE) && !defined(SNOW)) lightsSpecularColor += GetLightSpecularInput(input, normalizedLightDirection, viewDirection, modelNormal.xyz, lightColor, shininess, uv); -# endif // defined (SPECULAR) || (defined (SPARKLE) && !defined(SNOW)) +# endif // defined (SPECULAR) || (defined (SPARKLE) && !defined(SNOW)) lightsDiffuseColor += lightDiffuseColor; -# endif +# endif } -# else +# else -# if defined(ANISO_LIGHTING) +# if defined(ANISO_LIGHTING) input.TBN0.z = worldSpaceVertexNormal[0]; input.TBN1.z = worldSpaceVertexNormal[1]; input.TBN2.z = worldSpaceVertexNormal[2]; -# endif +# endif uint numClusteredLights = 0; uint totalLightCount = LightLimitFix::NumStrictLights; @@ -2181,17 +2174,17 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } float3 refractedLightDirection = normalizedLightDirection; -# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if defined(TRUE_PBR) && !defined(LANDSCAPE) && !defined(LODLANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::InterlayerParallax) != 0) { if (dot(normalizedLightDirection, coatWorldNormal) > 0) refractedLightDirection = -refract(-normalizedLightDirection, coatWorldNormal, eta); } -# endif +# endif float parallaxShadow = 1; -# if defined(EMAT) +# if defined(EMAT) [branch] if ( SharedData::extendedMaterialSettings.EnableShadows && !(light.lightFlags & LightLimitFix::LightFlags::Simple) && @@ -2200,23 +2193,23 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace contactShadow != 0.0) { float3 lightDirectionTS = normalize(mul(refractedLightDirection, tbn).xyz); -# if defined(PARALLAX) +# if defined(PARALLAX) [branch] if (SharedData::extendedMaterialSettings.EnableParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, lightDirectionTS, sh0, TexParallaxSampler, SampParallaxSampler, 0, parallaxShadowQuality, screenNoise, displacementParams); -# elif defined(LANDSCAPE) +# elif defined(LANDSCAPE) [branch] if (SharedData::extendedMaterialSettings.EnableTerrainParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplierTerrain(input, uv, mipLevels, lightDirectionTS, sh0, parallaxShadowQuality, screenNoise, displacementParams); -# elif defined(EMAT_ENVMAP) +# elif defined(EMAT_ENVMAP) [branch] if (complexMaterialParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, lightDirectionTS, sh0, TexEnvMaskSampler, SampEnvMaskSampler, 3, parallaxShadowQuality, screenNoise, displacementParams); -# elif defined(TRUE_PBR) && !defined(LODLANDSCAPE) +# elif defined(TRUE_PBR) && !defined(LODLANDSCAPE) [branch] if (PBRParallax) parallaxShadow = ExtendedMaterials::GetParallaxSoftShadowMultiplier(uv, mipLevel, lightDirectionTS, sh0, TexParallaxSampler, SampParallaxSampler, 0, parallaxShadowQuality, screenNoise, displacementParams); -# endif - } # endif + } +# endif -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) { PBR::LightProperties lightProperties = PBR::InitLightProperties(lightColor, lightShadow * contactShadow, parallaxShadow); float3 pointDiffuseColor, coatPointDiffuseColor, pointTransmissionColor, pointSpecularColor; @@ -2225,97 +2218,97 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace coatLightsDiffuseColor += coatPointDiffuseColor; transmissionColor += pointTransmissionColor; specularColorPBR += pointSpecularColor; -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) specularColorPBR += PBR::GetWetnessDirectLightSpecularInput(wetnessNormal, worldSpaceViewDirection, normalizedLightDirection, lightProperties.CoatLightColor, waterRoughnessSpecular) * wetnessGlossinessSpecular; -# endif +# endif } -# else +# else lightColor *= lightShadow; float3 lightDiffuseColor = lightColor * contactShadow * parallaxShadow * saturate(lightAngle.xxx); -# if defined(SOFT_LIGHTING) +# if defined(SOFT_LIGHTING) lightDiffuseColor += lightColor * GetSoftLightMultiplier(lightAngle) * rimSoftLightColor.xyz; -# endif +# endif -# if defined(RIM_LIGHTING) +# if defined(RIM_LIGHTING) lightDiffuseColor += lightColor * GetRimLightMultiplier(normalizedLightDirection, worldSpaceViewDirection, worldSpaceNormal.xyz) * rimSoftLightColor.xyz; -# endif +# endif -# if defined(BACK_LIGHTING) +# if defined(BACK_LIGHTING) lightDiffuseColor += lightColor * saturate(-lightAngle) * backLightColor.xyz; -# endif +# endif -# if defined(SPECULAR) || (defined(SPARKLE) && !defined(SNOW)) +# if defined(SPECULAR) || (defined(SPARKLE) && !defined(SNOW)) lightsSpecularColor += GetLightSpecularInput(input, normalizedLightDirection, worldSpaceViewDirection, worldSpaceNormal.xyz, lightColor, shininess, uv); -# endif +# endif lightsDiffuseColor += lightDiffuseColor; -# endif +# endif -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) wetnessSpecular += WetnessEffects::GetWetnessSpecular(wetnessNormal, normalizedLightDirection, worldSpaceViewDirection, lightColor, waterRoughnessSpecular); -# endif - } # endif + } # endif +# endif diffuseColor += lightsDiffuseColor; specularColor += lightsSpecularColor; -# if !defined(LANDSCAPE) +# if !defined(LANDSCAPE) if (Permutation::PixelShaderDescriptor & Permutation::LightingFlags::CharacterLight) { float charLightMul = saturate(dot(worldSpaceViewDirection, worldSpaceNormal.xyz)) * CharacterLightParams.x + CharacterLightParams.y * saturate(dot(float2(0.164398998, -0.986393988), worldSpaceNormal.yz)); float charLightColor = min(CharacterLightParams.w, max(0, CharacterLightParams.z * TexCharacterLightProjNoiseSampler.Sample(SampCharacterLightProjNoiseSampler, baseShadowUV).x)); diffuseColor += (charLightMul * charLightColor).xxx; } -# endif +# endif -# if defined(EYE) +# if defined(EYE) modelNormal.xyz = input.EyeNormal; -# endif // EYE +# endif // EYE float3 emitColor = EmitColor; -# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) +# if !defined(LANDSCAPE) && !defined(LODLANDSCAPE) bool hasEmissive = (0x3F & (Permutation::PixelShaderDescriptor >> 24)) == Permutation::LightingTechnique::Glowmap; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) hasEmissive = hasEmissive || (PBRFlags & PBR::Flags::HasEmissive != 0); -# endif +# endif [branch] if (hasEmissive) { float3 glowColor = Color::Diffuse(TexGlowSampler.Sample(SampGlowSampler, uv).xyz); emitColor *= glowColor; } -# endif +# endif -# if !defined(TRUE_PBR) +# if !defined(TRUE_PBR) diffuseColor += emitColor.xyz; -# endif +# endif float3 directionalAmbientColor = mul(DirectionalAmbient, modelNormal); float3 reflectionDiffuseColor = diffuseColor + directionalAmbientColor; -# if defined(SKYLIGHTING) +# if defined(SKYLIGHTING) float skylightingDiffuse = SphericalHarmonics::FuncProductIntegral(skylightingSH, SphericalHarmonics::EvaluateCosineLobe(float3(worldSpaceNormal.xy, worldSpaceNormal.z * 0.5 + 0.5))) / Math::PI; skylightingDiffuse = lerp(1.0, skylightingDiffuse, Skylighting::getFadeOutFactor(input.WorldPosition.xyz)); skylightingDiffuse = Skylighting::mixDiffuse(SharedData::skylightingSettings, skylightingDiffuse); directionalAmbientColor = Color::GammaToLinear(directionalAmbientColor); directionalAmbientColor *= skylightingDiffuse; directionalAmbientColor = Color::LinearToGamma(directionalAmbientColor); -# endif +# endif -# if defined(TRUE_PBR) && defined(LOD_LAND_BLEND) && !defined(DEFERRED) +# if defined(TRUE_PBR) && defined(LOD_LAND_BLEND) && !defined(DEFERRED) lodLandDiffuseColor += directionalAmbientColor; -# endif +# endif -# if !(defined(DEFERRED) && defined(SSGI)) && !defined(TRUE_PBR) +# if !(defined(DEFERRED) && defined(SSGI)) && !defined(TRUE_PBR) diffuseColor += directionalAmbientColor; -# endif +# endif -# if defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE) +# if defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE) float envMask = EnvmapData.x * MaterialData.x; float viewNormalAngle = dot(worldSpaceNormal.xyz, viewDirection); @@ -2332,38 +2325,38 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 envColor = 0.0; bool dynamicCubemap = false; -# if defined(DYNAMIC_CUBEMAPS) +# if defined(DYNAMIC_CUBEMAPS) float3 F0 = 0.0; float envRoughness = 1.0; -# endif +# endif if (envMask > 0.0) { -# if defined(DYNAMIC_CUBEMAPS) +# if defined(DYNAMIC_CUBEMAPS) uint2 envSize; TexEnvSampler.GetDimensions(envSize.x, envSize.y); -# if defined(EMAT) +# if defined(EMAT) if (envSize.x == 1 && envSize.y == 1 || complexMaterial) { -# else +# else if (envSize.x == 1 && envSize.y == 1) { -# endif +# endif dynamicCubemap = true; -# if defined(EMAT) +# if defined(EMAT) if (!complexMaterial) -# endif +# endif { // Dynamic Cubemap Creator sets this value to black, if it is anything but black it is wrong float3 envColorTest = TexEnvSampler.SampleLevel(SampEnvSampler, float3(0.0, 1.0, 0.0), 15); dynamicCubemap = all(envColorTest == 0.0); } -# if defined(CREATOR) +# if defined(CREATOR) if (SharedData::cubemapCreatorSettings.Enabled) { dynamicCubemap = true; } -# endif +# endif if (dynamicCubemap) { float4 envColorBase = TexEnvSampler.SampleLevel(SampEnvSampler, float3(1.0, 0.0, 0.0), 15); @@ -2376,30 +2369,30 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace envRoughness = 1.0 / 7.0; } -# if defined(CREATOR) +# if defined(CREATOR) if (SharedData::cubemapCreatorSettings.Enabled) { F0 = SharedData::cubemapCreatorSettings.CubemapColor.rgb; envRoughness = SharedData::cubemapCreatorSettings.CubemapColor.a; } -# endif +# endif -# if defined(EMAT) +# if defined(EMAT) float complexMaterialRoughness = 1.0 - complexMaterialColor.y; envRoughness = lerp(envRoughness, pow(complexMaterialRoughness, 1.5), complexMaterial); F0 = lerp(F0, Color::GammaToLinear(complexSpecular), complexMaterial); -# endif +# endif if (any(F0 > 0.0)) -# if defined(SKYLIGHTING) +# if defined(SKYLIGHTING) envColor = DynamicCubemaps::GetDynamicCubemap(worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, envRoughness, F0, skylightingSH) * envMask; -# else +# else envColor = DynamicCubemaps::GetDynamicCubemap(worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, envRoughness, F0, ) * envMask; -# endif +# endif else envColor = 0.0; } } -# endif +# endif if (!dynamicCubemap) { float3 envColorBase = TexEnvSampler.Sample(SampEnvSampler, envSamplingPoint); @@ -2407,46 +2400,46 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } } -# endif // defined (ENVMAP) || defined (MULTI_LAYER_PARALLAX) || defined(EYE) +# endif // defined (ENVMAP) || defined (MULTI_LAYER_PARALLAX) || defined(EYE) float2 screenMotionVector = MotionBlur::GetSSMotionVector(input.WorldPosition, input.PreviousWorldPosition, eyeIndex); -# if defined(WETNESS_EFFECTS) -# if !(defined(FACEGEN) || defined(FACEGEN_RGB_TINT) || defined(EYE)) || defined(TREE_ANIM) -# if defined(TRUE_PBR) -# if !defined(LANDSCAPE) +# if defined(WETNESS_EFFECTS) +# if !(defined(FACEGEN) || defined(FACEGEN_RGB_TINT) || defined(EYE)) || defined(TREE_ANIM) +# if defined(TRUE_PBR) +# if !defined(LANDSCAPE) [branch] if ((PBRFlags & PBR::Flags::TwoLayer) != 0) { porosity = 0; } else -# endif +# endif { porosity = lerp(porosity, 0.0, saturate(sqrt(pbrSurfaceProperties.Metallic))); } -# elif defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) +# elif defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) porosity = lerp(porosity, 0.0, saturate(sqrt(envMask))); -# endif +# endif float wetnessDarkeningAmount = porosity * wetnessGlossinessAlbedo; baseColor.xyz = lerp(baseColor.xyz, pow(baseColor.xyz, 1.0 + wetnessDarkeningAmount), 0.8); -# endif +# endif float3 wetnessReflectance = WetnessEffects::GetWetnessAmbientSpecular(screenUV, wetnessNormal, worldSpaceVertexNormal, worldSpaceViewDirection, waterRoughnessSpecular) * wetnessGlossinessSpecular; -# if !defined(DEFERRED) +# if !defined(DEFERRED) wetnessSpecular += wetnessReflectance; -# endif # endif +# endif -# if defined(HAIR) +# if defined(HAIR) float3 vertexColor = lerp(1, TintColor.xyz, input.Color.y); -# else +# else float3 vertexColor = input.Color.xyz; -# endif // defined (HAIR) +# endif // defined (HAIR) float4 color = 0; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) { float3 directLightsDiffuseInput = diffuseColor * baseColor.xyz; [branch] if ((PBRFlags & PBR::Flags::ColoredCoat) != 0) @@ -2459,28 +2452,28 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 indirectDiffuseLobeWeight, indirectSpecularLobeWeight; PBR::GetIndirectLobeWeights(indirectDiffuseLobeWeight, indirectSpecularLobeWeight, worldSpaceNormal.xyz, worldSpaceViewDirection, worldSpaceVertexNormal, baseColor.xyz, pbrSurfaceProperties); -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) if (waterRoughnessSpecular < 1.0) indirectSpecularLobeWeight += PBR::GetWetnessIndirectSpecularLobeWeight(wetnessNormal, worldSpaceViewDirection, worldSpaceVertexNormal, waterRoughnessSpecular) * wetnessGlossinessSpecular; -# endif +# endif -# if !(defined(DEFERRED) && defined(SSGI)) +# if !(defined(DEFERRED) && defined(SSGI)) color.xyz += indirectDiffuseLobeWeight * directionalAmbientColor; -# endif +# endif -# if !defined(DEFERRED) -# if defined(DYNAMIC_CUBEMAPS) -# if defined(SKYLIGHTING) +# if !defined(DEFERRED) +# if defined(DYNAMIC_CUBEMAPS) +# if defined(SKYLIGHTING) specularColorPBR += indirectSpecularLobeWeight * DynamicCubemaps::GetDynamicCubemapSpecularIrradiance(screenUV, worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, pbrSurfaceProperties.Roughness, skylightingSH); -# else - specularColorPBR += indirectSpecularLobeWeight * DynamicCubemaps::GetDynamicCubemapSpecularIrradiance(screenUV, worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, pbrSurfaceProperties.Roughness); -# endif # else - specularColorPBR += indirectSpecularLobeWeight * directionalAmbientColor; + specularColorPBR += indirectSpecularLobeWeight * DynamicCubemaps::GetDynamicCubemapSpecularIrradiance(screenUV, worldSpaceNormal, worldSpaceVertexNormal, worldSpaceViewDirection, pbrSurfaceProperties.Roughness); # endif # else - indirectDiffuseLobeWeight *= vertexColor; + specularColorPBR += indirectSpecularLobeWeight * directionalAmbientColor; # endif +# else + indirectDiffuseLobeWeight *= vertexColor; +# endif // Fixes white items in UI for VR [branch] if ((PBRFlags & PBR::Flags::HasEmissive) != 0) @@ -2488,13 +2481,13 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace color.xyz += emitColor.xyz; } color.xyz += transmissionColor; -# else +# else color.xyz += diffuseColor * baseColor.xyz; -# endif +# endif color.xyz *= vertexColor; -# if defined(MULTI_LAYER_PARALLAX) +# if defined(MULTI_LAYER_PARALLAX) float layerValue = MultiLayerParallaxData.x * TexLayerSampler.Sample(SampLayerSampler, uv).w; float3 tangentViewDirection = mul(viewDirection, tbn); float3 layerNormal = MultiLayerParallaxData.yyy * (normalColor.xyz * 2.0.xxx + float3(-1, -1, -2)) + float3(0, 0, 1); @@ -2506,59 +2499,59 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float mlpBlendFactor = saturate(viewNormalAngle) * (1.0 - baseColor.w); -# if defined(DEFERRED) && defined(SSGI) +# if defined(DEFERRED) && defined(SSGI) color.xyz = lerp(color.xyz, (diffuseColor + directionalAmbientColor) * vertexColor * layerColor, mlpBlendFactor); -# else +# else color.xyz = lerp(color.xyz, diffuseColor * vertexColor * layerColor, mlpBlendFactor); -# endif +# endif -# if defined(DEFERRED) +# if defined(DEFERRED) baseColor.xyz *= 1.0 - mlpBlendFactor; -# endif -# endif // MULTI_LAYER_PARALLAX +# endif +# endif // MULTI_LAYER_PARALLAX -# if defined(SPECULAR) -# if defined(EMAT_ENVMAP) +# if defined(SPECULAR) +# if defined(EMAT_ENVMAP) specularColor = (specularColor * glossiness * MaterialData.yyy) * lerp(SpecularColor.xyz, complexSpecular, complexMaterial); -# else +# else specularColor = (specularColor * glossiness * MaterialData.yyy) * SpecularColor.xyz; -# endif -# elif defined(SPARKLE) +# endif +# elif defined(SPARKLE) specularColor *= glossiness; -# endif // SPECULAR +# endif // SPECULAR -# if defined(SNOW) +# if defined(SNOW) if (useSnowSpecular) specularColor = 0; -# endif +# endif diffuseColor = reflectionDiffuseColor; -# if (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) -# if defined(DYNAMIC_CUBEMAPS) +# if (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) +# if defined(DYNAMIC_CUBEMAPS) if (!dynamicCubemap) -# endif - specularColor += envColor * diffuseColor; # endif + specularColor += envColor * diffuseColor; +# endif -# if defined(EMAT_ENVMAP) +# if defined(EMAT_ENVMAP) specularColor *= complexSpecular; -# endif // defined (EMAT) && defined(ENVMAP) +# endif // defined (EMAT) && defined(ENVMAP) -# if !defined(TRUE_PBR) +# if !defined(TRUE_PBR) specularColor = Color::GammaToLinear(specularColor); -# endif +# endif -# if !defined(DEFERRED) && defined(DYNAMIC_CUBEMAPS) && (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) +# if !defined(DEFERRED) && defined(DYNAMIC_CUBEMAPS) && (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) if (dynamicCubemap) specularColor += envColor; -# endif +# endif -# if defined(WETNESS_EFFECTS) && !defined(TRUE_PBR) +# if defined(WETNESS_EFFECTS) && !defined(TRUE_PBR) specularColor += wetnessSpecular * wetnessGlossinessSpecular; -# endif +# endif -# if defined(LOD_LAND_BLEND) && defined(TRUE_PBR) +# if defined(LOD_LAND_BLEND) && defined(TRUE_PBR) { pbrWeight = 1 - lodLandBlendFactor; @@ -2570,21 +2563,21 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace indirectSpecularLobeWeight = lerp(indirectSpecularLobeWeight, 0, lodLandBlendFactor); pbrGlossiness = lerp(pbrGlossiness, 0, lodLandBlendFactor); } -# endif // defined(LOD_LAND_BLEND) && defined(TRUE_PBR) +# endif // defined(LOD_LAND_BLEND) && defined(TRUE_PBR) -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) color.xyz *= Color::PBRLightingScale; specularColorPBR *= Color::PBRLightingScale; specularColor += specularColorPBR; -# endif +# endif -# if !defined(DEFERRED) +# if !defined(DEFERRED) color.xyz = Color::LinearToGamma(Color::GammaToLinear(color.xyz) + specularColor); if (FrameBuffer::FrameParams.y && FrameBuffer::FrameParams.z) color.xyz = lerp(color.xyz, input.FogParam.xyz, input.FogParam.w); -# endif +# endif -# if defined(TESTCUBEMAP) && defined(ENVMAP) && defined(DYNAMIC_CUBEMAPS) +# if defined(TESTCUBEMAP) && defined(ENVMAP) && defined(DYNAMIC_CUBEMAPS) baseColor.xyz = 0.0; specularColor = 0.0; diffuseColor = 0.0; @@ -2592,23 +2585,23 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace envColor = 1.0; envRoughness = 0.0; color.xyz = 0; -# endif +# endif -# if defined(LANDSCAPE) && !defined(LOD_LAND_BLEND) +# if defined(LANDSCAPE) && !defined(LOD_LAND_BLEND) psout.Diffuse.w = 0; -# else +# else float alpha = baseColor.w; -# if defined(EMAT) && !defined(LANDSCAPE) -# if defined(PARALLAX) +# if defined(EMAT) && !defined(LANDSCAPE) +# if defined(PARALLAX) alpha = TexColorSampler.SampleBias(SampColorSampler, uvOriginal, SharedData::MipBias).w; -# elif defined(TRUE_PBR) +# elif defined(TRUE_PBR) [branch] if (PBRParallax) { alpha = TexColorSampler.SampleBias(SampColorSampler, uvOriginal, SharedData::MipBias).w; } -# endif # endif -# if defined(DO_ALPHA_TEST) +# endif +# if defined(DO_ALPHA_TEST) [branch] if ((Permutation::PixelShaderDescriptor & Permutation::LightingFlags::AdditionalAlphaMask) != 0) { uint2 alphaMask = input.Position.xy; @@ -2639,28 +2632,28 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } } else -# endif // defined(DO_ALPHA_TEST) +# endif // defined(DO_ALPHA_TEST) { alpha *= MaterialData.z; } -# if !(defined(TREE_ANIM) || defined(LODOBJECTSHD) || defined(LODOBJECTS)) +# if !(defined(TREE_ANIM) || defined(LODOBJECTSHD) || defined(LODOBJECTS)) alpha *= input.Color.w; -# endif // !(defined(TREE_ANIM) || defined(LODOBJECTSHD) || defined(LODOBJECTS)) -# if defined(DO_ALPHA_TEST) -# if defined(DEPTH_WRITE_DECALS) +# endif // !(defined(TREE_ANIM) || defined(LODOBJECTSHD) || defined(LODOBJECTS)) +# if defined(DO_ALPHA_TEST) +# if defined(DEPTH_WRITE_DECALS) if (alpha - 0.0156862754 < 0) { discard; } alpha = saturate(1.05 * alpha); -# endif // DEPTH_WRITE_DECALS +# endif // DEPTH_WRITE_DECALS if (alpha - AlphaTestRefRS < 0) { discard; } -# endif // DO_ALPHA_TEST +# endif // DO_ALPHA_TEST psout.Diffuse.w = alpha; -# endif -# if defined(LIGHT_LIMIT_FIX) && defined(LLFDEBUG) +# endif +# if defined(LIGHT_LIMIT_FIX) && defined(LLFDEBUG) if (SharedData::lightLimitFixSettings.EnableLightsVisualisation) { if (SharedData::lightLimitFixSettings.LightsVisualisationMode == 0) { psout.Diffuse.xyz = LightLimitFix::TurboColormap(LightLimitFix::NumStrictLights >= 7.0); @@ -2675,27 +2668,27 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace } else { psout.Diffuse.xyz = color.xyz; } -# else +# else psout.Diffuse.xyz = color.xyz; -# endif // defined(LIGHT_LIMIT_FIX) +# endif // defined(LIGHT_LIMIT_FIX) -# if defined(SNOW) -# if defined(TRUE_PBR) +# if defined(SNOW) +# if defined(TRUE_PBR) psout.Parameters.x = Color::RGBToLuminanceAlternative(specularColor); psout.Parameters.y = 0; -# else +# else psout.Parameters.x = Color::RGBToLuminanceAlternative(lightsSpecularColor); -# endif -# endif // SNOW && !PBR +# endif +# endif // SNOW && !PBR psout.MotionVectors.xy = SSRParams.z > 1e-5 ? float2(1, 0) : screenMotionVector.xy; psout.MotionVectors.zw = float2(0, 1); -# if !defined(DEFERRED) +# if !defined(DEFERRED) float ssrMask = glossiness; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) ssrMask = Color::RGBToLuminanceAlternative(pbrSurfaceProperties.F0); -# endif +# endif psout.ScreenSpaceNormals.w = smoothstep(-1e-5 + SSRParams.x, SSRParams.y, ssrMask) * SSRParams.w; // Green reflections fix @@ -2707,71 +2700,71 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace psout.ScreenSpaceNormals.xy = screenSpaceNormal.xy + 0.5.xx; psout.ScreenSpaceNormals.z = 0; -# else +# else -# if defined(TERRAIN_BLENDING) +# if defined(TERRAIN_BLENDING) psout.Diffuse.w = blendFactorTerrain; -# endif +# endif psout.MotionVectors.zw = float2(0.0, psout.Diffuse.w); psout.Specular = float4(specularColor, psout.Diffuse.w); float3 outputAlbedo = baseColor.xyz * vertexColor; -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) outputAlbedo = indirectDiffuseLobeWeight; -# endif +# endif psout.Albedo = float4(outputAlbedo, psout.Diffuse.w); const float wetnessGlossinessGain = 0.65; float outGlossiness = saturate(glossiness * SSRParams.w); -# if defined(TRUE_PBR) +# if defined(TRUE_PBR) psout.Reflectance = float4(indirectSpecularLobeWeight, psout.Diffuse.w); -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), lerp(pbrGlossiness, saturate(pbrGlossiness + wetnessGlossinessGain), wetnessGlossinessSpecular), psout.Diffuse.w); -# else +# else psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), pbrGlossiness, psout.Diffuse.w); -# endif -# elif defined(WETNESS_EFFECTS) +# endif +# elif defined(WETNESS_EFFECTS) psout.Reflectance = float4(wetnessReflectance, psout.Diffuse.w); psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), lerp(outGlossiness, saturate(outGlossiness + wetnessGlossinessGain), wetnessGlossinessSpecular), psout.Diffuse.w); -# else +# else psout.Reflectance = float4(0.0.xxx, psout.Diffuse.w); psout.NormalGlossiness = float4(GBuffer::EncodeNormal(screenSpaceNormal), outGlossiness, psout.Diffuse.w); -# endif +# endif -# if defined(TERRAIN_BLENDING) +# if defined(TERRAIN_BLENDING) psout.NormalGlossiness.w = 1; -# endif +# endif -# if defined(SNOW) +# if defined(SNOW) psout.Parameters.w = psout.Diffuse.w; -# endif +# endif -# if (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) -# if defined(DYNAMIC_CUBEMAPS) +# if (defined(ENVMAP) || defined(MULTI_LAYER_PARALLAX) || defined(EYE)) +# if defined(DYNAMIC_CUBEMAPS) if (dynamicCubemap) { -# if defined(WETNESS_EFFECTS) +# if defined(WETNESS_EFFECTS) psout.Reflectance.xyz = max(envColor, wetnessReflectance); psout.NormalGlossiness.z = lerp(1.0 - envRoughness, saturate(1.0 - envRoughness + wetnessGlossinessGain), wetnessGlossinessSpecular); -# else +# else psout.Reflectance.xyz = envColor; psout.NormalGlossiness.z = 1.0 - envRoughness; -# endif - } # endif + } # endif +# endif -# if defined(SSS) && defined(SKIN) +# if defined(SSS) && defined(SKIN) psout.Masks = float4(saturate(baseColor.a), !(Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::IsBeastRace), 0, psout.Diffuse.w); -# elif defined(WETNESS_EFFECTS) +# elif defined(WETNESS_EFFECTS) float wetnessNormalAmount = saturate(dot(float3(0, 0, 1), wetnessNormal) * saturate(flatnessAmount)); psout.Masks = float4(0, 0, wetnessNormalAmount, psout.Diffuse.w); -# else +# else psout.Masks = float4(0, 0, 0, psout.Diffuse.w); -# endif # endif +# endif return psout; } -# endif // PSHADER \ No newline at end of file +#endif // PSHADER \ No newline at end of file diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index db37032d2a..ef254cb603 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -519,21 +519,25 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # if defined(SKYLIGHTING) # if defined(VR) - float3 positionMSSkylight = input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz - CameraPosAdjust[0].xyz; + float3 positionMSSkylight = input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; # else float3 positionMSSkylight = input.WorldPosition.xyz; # endif - sh2 skylightingSH = Skylighting::sample(skylightingSettings, SkylightingProbeArray, positionMSSkylight, normal); - float snowOcclusion = smoothstep(0, 1, (shUnproject(skylightingSH, float3(0, 0, 1)))); + sh2 skylightingSH = Skylighting::sample(SharedData::skylightingSettings, Skylighting::SkylightingProbeArray, Skylighting::stbn_vec3_2Dx1D_128x128x64, input.HPosition.xy, positionMSSkylight, normal); + float skylighting = SphericalHarmonics::FuncProductIntegral(skylightingSH, SphericalHarmonics::EvaluateCosineLobe(float3(normal.xy, normal.z * 0.5 + 0.5))) / Math::PI; + skylighting = lerp(1.0, skylighting, Skylighting::getFadeOutFactor(input.WorldPosition)); + skylighting = Skylighting::mixDiffuse(SharedData::skylightingSettings, skylighting); + + float snowOcclusion = smoothstep(0, 1, SphericalHarmonics::Unproject(skylightingSH, float3(0, 0, 1))); # else float snowOcclusion = 1; # endif # if defined(SNOW_COVER) - snowOcclusion *= saturate(input.WorldPosition.z - GetWaterData(input.WorldPosition.xyz).w); - if (snowCoverSettings.EnableSnowCover) - SnowCover::ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + CameraPosAdjust[eyeIndex].xyz, snowOcclusion); + snowOcclusion *= saturate(input.WorldPosition.z - SharedData::GetWaterData(input.WorldPosition.xyz).w); + if (SharedData::snowCoverSettings.EnableSnowCover) + SnowCover::ApplySnowFoliage(baseColor.xyz, normal, input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz, snowOcclusion); # endif # if defined(TRUE_PBR) @@ -698,16 +702,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 directionalAmbientColor = mul(SharedData::DirectionalAmbient, float4(normal, 1.0)); # if defined(SKYLIGHTING) -# if defined(VR) - float3 positionMSSkylight = input.WorldPosition.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; -# else - float3 positionMSSkylight = input.WorldPosition.xyz; -# endif - - sh2 skylightingSH = Skylighting::sample(SharedData::skylightingSettings, Skylighting::SkylightingProbeArray, Skylighting::stbn_vec3_2Dx1D_128x128x64, input.HPosition.xy, positionMSSkylight, normal); - float skylighting = SphericalHarmonics::FuncProductIntegral(skylightingSH, SphericalHarmonics::EvaluateCosineLobe(float3(normal.xy, normal.z * 0.5 + 0.5))) / Math::PI; - skylighting = lerp(1.0, skylighting, Skylighting::getFadeOutFactor(input.WorldPosition)); - skylighting = Skylighting::mixDiffuse(SharedData::skylightingSettings, skylighting); directionalAmbientColor = Color::GammaToLinear(directionalAmbientColor); directionalAmbientColor *= skylighting; From 4e73185121367416b0c090279a55e1d7e6b57b09 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Tue, 25 Feb 2025 17:26:16 +0000 Subject: [PATCH 027/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli | 4 ++-- package/Shaders/DistantTree.hlsl | 1 - package/Shaders/RunGrass.hlsl | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 297b0e4d0e..68d9cbdb1f 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -1,5 +1,5 @@ -#include "Common/SharedData.hlsli" #include "Common/Color.hlsli" +#include "Common/SharedData.hlsli" #if defined(PSHADER) namespace SnowCover @@ -131,7 +131,7 @@ namespace SnowCover # if defined(TRUE_PBR) if (extendedMaterialSettings.ExtendShadows) disp_factor = -disp * underDispScale; -# endif // +# endif // float mult = skylight * (smoothstep(0.3, 0.5, (pow(max(0, worldNormal.z), 2) + disp_factor) * (max(0, env_mult - waterDist) * (0.5 + 0.5 * raw_p + disp_factor) + SharedData::snowCoverSettings.SnowAmount))); //-smoothstep(-32, 8, -waterDist) uv = SharedData::snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; if (mult < 0.01) diff --git a/package/Shaders/DistantTree.hlsl b/package/Shaders/DistantTree.hlsl index c28d7786f1..9add501f25 100644 --- a/package/Shaders/DistantTree.hlsl +++ b/package/Shaders/DistantTree.hlsl @@ -262,7 +262,6 @@ PS_OUTPUT main(PS_INPUT input) float3 diffuseColor = SharedData::DirLightColor.xyz * dirShadow * 0.5; - float3 directionalAmbientColor = mul(SharedData::DirectionalAmbient, float4(normal, 1.0)); diffuseColor += directionalAmbientColor; diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index ef254cb603..64b5749368 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -524,7 +524,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float3 positionMSSkylight = input.WorldPosition.xyz; # endif - sh2 skylightingSH = Skylighting::sample(SharedData::skylightingSettings, Skylighting::SkylightingProbeArray, Skylighting::stbn_vec3_2Dx1D_128x128x64, input.HPosition.xy, positionMSSkylight, normal); float skylighting = SphericalHarmonics::FuncProductIntegral(skylightingSH, SphericalHarmonics::EvaluateCosineLobe(float3(normal.xy, normal.z * 0.5 + 0.5))) / Math::PI; skylighting = lerp(1.0, skylighting, Skylighting::getFadeOutFactor(input.WorldPosition)); From c94d021a9d52d6e8eaea894787af3ffa44a59f1a Mon Sep 17 00:00:00 2001 From: ThePagi <32794457+ThePagi@users.noreply.github.com> Date: Wed, 26 Feb 2025 18:42:41 +0100 Subject: [PATCH 028/131] basic snow is back --- package/Shaders/Lighting.hlsl | 58 +++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 2d57f82006..0f51ec4671 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -27,6 +27,10 @@ # define LOD #endif +#if defined(SKINNED) || defined(SKIN) || defined(EYE) || defined(HAIR) || !defined(EXTENDED_MATERIALS) +# undef SNOW_COVER +#endif + struct VS_INPUT { float4 Position : POSITION0; @@ -1001,6 +1005,12 @@ float GetSnowParameterY(float texProjTmp, float alpha) # include "Skylighting/Skylighting.hlsli" # endif +# if defined(SNOW_COVER) +# undef SNOW +# undef SPARKLE +# include "SnowCover/SnowCover.hlsli" +# endif + # define LinearSampler SampColorSampler # include "Common/ShadowSampling.hlsli" @@ -1799,6 +1809,54 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float4 waterData = SharedData::GetWaterData(input.WorldPosition.xyz); float waterHeight = waterData.w; +# if defined(SNOW_COVER) +# if defined(SKYLIGHTING) + float snowOcclusion = inWorld ? pow(saturate(SphericalHarmonics::Unproject(skylightingSH, float3(0, 0, 1))), 2) : 0; +# else + float snowOcclusion = inWorld; +# endif +# if defined(LODLANDNOISE) + snowOcclusion *= 0.9 + noise*0.1; +# endif + +# if !defined(MODELSPACENORMALS) + float3 viewDirTS = normalize(mul(tbnTr, viewDirection)); + viewDirTS.xy /= viewDirTS.z * 0.7 + 0.3; // Fix for objects at extreme viewing angles +# else + float3 viewDirTS = 0; +# endif + float underDispScale = 1.0; + float3 pos = (input.WorldPosition + FrameBuffer::CameraPosAdjust[eyeIndex]).xyz; + + float snowFactor = 0; + float3 snowDiffuse = baseColor.rgb; + if (SharedData::snowCoverSettings.EnableSnowCover) +# if defined(TRUE_PBR) + snowFactor = SnowCover::ApplySnowPBR(snowDiffuse, worldSpaceNormal, pbrSurfaceProperties, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); +# else + snowFactor = SnowCover::ApplySnow(snowDiffuse, worldSpaceNormal, glossiness.x, shininess, sh0, underDispScale, pos, snowOcclusion, input.WorldPosition.z - waterHeight, float3(viewDirTS.x, viewDirTS.y, viewPosition.z)); + glossiness = glossiness.xxxx; +# endif + +# if defined(TREE_ANIM) + SnowCover::ApplyFoliageColor(baseColor.rgb, SnowCover::GetEnvironmentalMultiplier(pos)); +# endif + baseColor.rgb = lerp(baseColor.rgb, snowDiffuse, snowFactor); + +# if defined(LOD_LAND_BLEND) + lodLandColor.rgb = lerp(lodLandColor.rgb, snowDiffuse, snowFactor); + +# endif // LOD_LAND_BLEND + +# if !defined(DRAW_IN_WORLDSPACE) // && (defined(SKINNED) || !defined(MODELSPACENORMALS)) + [flatten] if (!input.WorldSpace) + modelNormal.xyz = mul(transpose(input.World[eyeIndex]), float4(worldSpaceNormal, 0)); + else +# endif + modelNormal.xyz = worldSpaceNormal; + modelNormal.xyz = normalize(modelNormal.xyz); +# endif // SNOW_COVER + float waterRoughnessSpecular = 1; # if defined(WETNESS_EFFECTS) From 6388e2ec153bb52191b69d8e0b26440cd16d3424 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Wed, 26 Feb 2025 17:42:59 +0000 Subject: [PATCH 029/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package/Shaders/Lighting.hlsl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 0f51ec4671..74839055b8 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1816,7 +1816,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace float snowOcclusion = inWorld; # endif # if defined(LODLANDNOISE) - snowOcclusion *= 0.9 + noise*0.1; + snowOcclusion *= 0.9 + noise * 0.1; # endif # if !defined(MODELSPACENORMALS) @@ -1839,7 +1839,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif # if defined(TREE_ANIM) - SnowCover::ApplyFoliageColor(baseColor.rgb, SnowCover::GetEnvironmentalMultiplier(pos)); + SnowCover::ApplyFoliageColor(baseColor.rgb, SnowCover::GetEnvironmentalMultiplier(pos)); # endif baseColor.rgb = lerp(baseColor.rgb, snowDiffuse, snowFactor); @@ -1855,7 +1855,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif modelNormal.xyz = worldSpaceNormal; modelNormal.xyz = normalize(modelNormal.xyz); -# endif // SNOW_COVER +# endif // SNOW_COVER float waterRoughnessSpecular = 1; From a6bcc28293d940eb3f7c3f226dba149b7fa39ff2 Mon Sep 17 00:00:00 2001 From: ThePagi <32794457+ThePagi@users.noreply.github.com> Date: Thu, 27 Feb 2025 23:16:04 +0100 Subject: [PATCH 030/131] flag movable objects --- .../Snow Cover/Shaders/SnowCover/SnowCover.hlsli | 2 +- package/Shaders/Common/Permutation.hlsli | 1 + package/Shaders/Lighting.hlsl | 3 ++- src/Features/SnowCover.cpp | 16 ++++++++++++++++ src/Features/SnowCover.h | 10 ++++++++++ src/State.h | 3 ++- 6 files changed, 32 insertions(+), 3 deletions(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 68d9cbdb1f..e2b18489a5 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -174,7 +174,7 @@ namespace SnowCover // apparently LOD landscape color sampler clamps uvs diffuse = SnowDiffuse.Sample(SampColorSampler, frac(uv)).rgb; //diffuse = frac(float3(uv.x, uv.y, 0)); - diffuse = pow(Color::LinearToGamma(diffuse) / PI, 1 / 1.5); + diffuse = pow(Color::LinearToGamma(diffuse) / 3.14, 1 / 1.5); float4 rmaos = SnowRMAOS.Sample(SampColorSampler, uv); glossiness = lerp(glossiness, 1 - rmaos.x, mult); // yes these are named wrong not my fault bye shininess = lerp(shininess, 25 * 500 * rmaos.w, mult); diff --git a/package/Shaders/Common/Permutation.hlsli b/package/Shaders/Common/Permutation.hlsli index a3c6f4793c..c7508dad34 100644 --- a/package/Shaders/Common/Permutation.hlsli +++ b/package/Shaders/Common/Permutation.hlsli @@ -61,6 +61,7 @@ namespace Permutation static const uint IsBeastRace = (1 << 2); static const uint EffectShadows = (1 << 3); static const uint IsDecal = (1 << 4); + static const uint IsMobile = (1 << 5); } cbuffer PerShader : register(b4) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 74839055b8..fb54c2f151 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1856,7 +1856,8 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace modelNormal.xyz = worldSpaceNormal; modelNormal.xyz = normalize(modelNormal.xyz); # endif // SNOW_COVER - + if (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::IsMobile) // TESTING TODO REMOVE + baseColor.rgb = float3(1, 0, 0); float waterRoughnessSpecular = 1; # if defined(WETNESS_EFFECTS) diff --git a/src/Features/SnowCover.cpp b/src/Features/SnowCover.cpp index a3caead6b9..f6bdb7d44c 100644 --- a/src/Features/SnowCover.cpp +++ b/src/Features/SnowCover.cpp @@ -234,4 +234,20 @@ void SnowCover::Save(json& o_json) void SnowCover::RestoreDefaultSettings() { settings = {}; +} + +void SnowCover::Hooks::BSLightingShader_SetupGeometry::thunk(RE::BSShader* This, RE::BSRenderPass* Pass, uint32_t RenderFlags) +{ + globals::features::snowCover->BSLightingShader_Setup(Pass); + func(This, Pass, RenderFlags); +} + +void SnowCover::BSLightingShader_Setup(RE::BSRenderPass* a_pass) +{ + auto state = globals::state; + auto userData = a_pass->geometry->GetUserData(); + if (!userData) + return; + if (userData && userData->CanBeMoved() && !userData->As()) + state->currentExtraDescriptor |= (uint)State::ExtraShaderDescriptors::IsMobile; } \ No newline at end of file diff --git a/src/Features/SnowCover.h b/src/Features/SnowCover.h index 50beb2a552..6ebfef8406 100644 --- a/src/Features/SnowCover.h +++ b/src/Features/SnowCover.h @@ -84,10 +84,20 @@ struct SnowCover : Feature virtual inline void PostPostLoad() override { Hooks::Install(); } + void BSLightingShader_Setup(RE::BSRenderPass* Pass); + struct Hooks { + struct BSLightingShader_SetupGeometry + { + static void thunk(RE::BSShader* This, RE::BSRenderPass* Pass, uint32_t RenderFlags); + static inline REL::Relocation func; + }; + static void Install() { + stl::write_vfunc<0x6, BSLightingShader_SetupGeometry>(RE::VTABLE_BSLightingShader[0]); + logger::info("[SnowCover] Installed hooks"); } }; diff --git a/src/State.h b/src/State.h index 68f5538c8f..f32e2675dd 100644 --- a/src/State.h +++ b/src/State.h @@ -123,7 +123,8 @@ class State IsReflections = 1 << 1, IsBeastRace = 1 << 2, EffectShadows = 1 << 3, - IsDecal = 1 << 4 + IsDecal = 1 << 4, + IsMobile = 1 << 5, }; void UpdateSharedData(bool a_inWorld, bool a_prepass); From a83ccb17494696729b4aec509ac1dbd52775c394 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Thu, 27 Feb 2025 22:16:30 +0000 Subject: [PATCH 031/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package/Shaders/Lighting.hlsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index fb54c2f151..e9aa321f78 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1855,8 +1855,8 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace # endif modelNormal.xyz = worldSpaceNormal; modelNormal.xyz = normalize(modelNormal.xyz); -# endif // SNOW_COVER - if (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::IsMobile) // TESTING TODO REMOVE +# endif // SNOW_COVER + if (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::IsMobile) // TESTING TODO REMOVE baseColor.rgb = float3(1, 0, 0); float waterRoughnessSpecular = 1; From 8e27ed79110e1632a775869f197cad98e5a5826d Mon Sep 17 00:00:00 2001 From: ThePagi <32794457+ThePagi@users.noreply.github.com> Date: Fri, 28 Feb 2025 10:17:33 +0100 Subject: [PATCH 032/131] missing namespace --- features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index e2b18489a5..1fa4a6eea3 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -129,7 +129,7 @@ namespace SnowCover waterDist = smoothstep(-64, 8, -waterDist); float disp_factor = 0; # if defined(TRUE_PBR) - if (extendedMaterialSettings.ExtendShadows) + if (SharedData::extendedMaterialSettings.ExtendShadows) disp_factor = -disp * underDispScale; # endif // float mult = skylight * (smoothstep(0.3, 0.5, (pow(max(0, worldNormal.z), 2) + disp_factor) * (max(0, env_mult - waterDist) * (0.5 + 0.5 * raw_p + disp_factor) + SharedData::snowCoverSettings.SnowAmount))); //-smoothstep(-32, 8, -waterDist) From a287f259958e7f636b579c0810f9474b17d6922b Mon Sep 17 00:00:00 2001 From: ThePagi Date: Fri, 14 Mar 2025 20:11:11 +0000 Subject: [PATCH 033/131] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-f?= =?UTF-8?q?ormat=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/State.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/State.h b/src/State.h index 9b904cda26..94e3104d45 100644 --- a/src/State.h +++ b/src/State.h @@ -129,8 +129,7 @@ class State IsBeastRace = 1 << 2, EffectShadows = 1 << 3, IsDecal = 1 << 4, - IsTree = 1 << 5 - IsMobile = 1 << 6, + IsTree = 1 << 5 IsMobile = 1 << 6, }; void UpdateSharedData(bool a_inWorld, bool a_prepass); From 49b9bbbda8003e2e1d5b94615dc8c571cd3ddd14 Mon Sep 17 00:00:00 2001 From: Exist Date: Sat, 15 Mar 2025 21:31:02 +0100 Subject: [PATCH 034/131] fixes --- .../Shaders/SnowCover/SnowCover.hlsli | 64 ++++--- .../Snow Cover/Shaders/SnowCover/ice_n.dds | Bin 0 -> 1398276 bytes .../Snow Cover/Shaders/SnowCover/ice_rdao.dds | Bin 0 -> 699212 bytes .../Snow Cover/Shaders/SnowCover/snow_n.dds | Bin 0 -> 1398276 bytes .../Shaders/SnowCover/snow_rdao.dds | Bin 0 -> 699212 bytes package/Shaders/Common/SharedData.hlsli | 16 +- package/Shaders/Lighting.hlsl | 9 +- src/Features/SnowCover.cpp | 175 ++++++++++++++---- src/Features/SnowCover.h | 40 ++-- src/State.h | 4 +- 10 files changed, 216 insertions(+), 92 deletions(-) create mode 100644 features/Snow Cover/Shaders/SnowCover/ice_n.dds create mode 100644 features/Snow Cover/Shaders/SnowCover/ice_rdao.dds create mode 100644 features/Snow Cover/Shaders/SnowCover/snow_n.dds create mode 100644 features/Snow Cover/Shaders/SnowCover/snow_rdao.dds diff --git a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli index 1fa4a6eea3..17606c178d 100644 --- a/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli +++ b/features/Snow Cover/Shaders/SnowCover/SnowCover.hlsli @@ -5,10 +5,10 @@ namespace SnowCover { - Texture2D SnowDiffuse : register(t73); - Texture2D SnowNormal : register(t74); - Texture2D SnowRMAOS : register(t75); - Texture2D SnowParallax : register(t76); + Texture2D SnowRDAO : register(t73); //snow_rdao + Texture2D SnowNormal : register(t74); //snow_n + Texture2D IceRDAO : register(t75); //ice_rdao + Texture2D IceNormal : register(t76); //ice_n // https://blog.selfshadow.com/publications/blending-in-detail/ // for when s = (0,0,1) @@ -105,7 +105,8 @@ namespace SnowCover ApplyFoliageColor(color, env_mult); } float2 uv = SharedData::snowCoverSettings.UVScale * p.xy / 100; - float3 diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; + float3 rdao = SnowRDAO.Sample(SampColorSampler, uv).rgb; + float3 diffuse = rdao.yyy; # if !defined(TRUE_PBR) diffuse = pow(Color::LinearToGamma(diffuse) / 3.141, 1 / 1.5); # endif @@ -123,64 +124,61 @@ namespace SnowCover # else float disp = sh0 - 0.5; # endif - float raw_p = SnowParallax.Sample(SampColorSampler, SharedData::snowCoverSettings.UVScale * p.xy / 1000).x; - float parallax = 0.1 * SharedData::snowCoverSettings.ParallaxScale * (raw_p - 0.5); - float env_mult = GetEnvironmentalMultiplier(p) + parallax + disp * underDispScale * 0.1; + + float env_mult = GetEnvironmentalMultiplier(p) - disp * underDispScale * 0.1; waterDist = smoothstep(-64, 8, -waterDist); float disp_factor = 0; # if defined(TRUE_PBR) if (SharedData::extendedMaterialSettings.ExtendShadows) - disp_factor = -disp * underDispScale; + disp_factor = disp * underDispScale; # endif // - float mult = skylight * (smoothstep(0.3, 0.5, (pow(max(0, worldNormal.z), 2) + disp_factor) * (max(0, env_mult - waterDist) * (0.5 + 0.5 * raw_p + disp_factor) + SharedData::snowCoverSettings.SnowAmount))); //-smoothstep(-32, 8, -waterDist) - uv = SharedData::snowCoverSettings.UVScale * p.xy / 100 + parallax * viewPos.xy; + float mult = skylight * (smoothstep(0.3, 0.5, (pow(max(0, worldNormal.z), 2) + disp_factor) * (max(0, env_mult - waterDist) * (0.5 + disp_factor) + SharedData::snowCoverSettings.SnowAmount))); //-smoothstep(-32, 8, -waterDist) + uv = SharedData::snowCoverSettings.UVScale * (uv + p.xy / 100); if (mult < 0.01) return 0; - sh0 = saturate(sh0 + mult * parallax); + //sh0 = saturate(sh0 + mult * parallax); return mult; } # if defined(TRUE_PBR) - float ApplySnowPBR(inout float3 diffuse, inout float3 worldNormal, inout PBR::SurfaceProperties prop, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) + PBR::SurfaceProperties ApplySnowPBR(inout float3 diffuse, inout float3 worldNormal, inout float sh0, out float mult, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos, PBR::SurfaceProperties prop, float2 uv) { - float2 uv; - float mult = ApplySnowBase(worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); + mult = max(0.0, ApplySnowBase(worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos)); if (mult <= 0.0) - return 0; - diffuse = SnowDiffuse.Sample(SampColorSampler, uv).rgb; + return prop; + float3 rdao = SnowRDAO.Sample(SampColorSampler, uv).rgb; + diffuse = rdao.yyy*0.66; //diffuse = frac(float3(uv.x, uv.y, 0)); float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); - //worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normal), mult)); - worldNormal = normalize(lerp(worldNormal, normal, mult)); - float4 rmaos = SnowRMAOS.Sample(SampRMAOSSampler, uv); - prop.Roughness = lerp(prop.Roughness, rmaos.x, mult); - prop.Metallic = lerp(prop.Metallic, rmaos.y, mult); - prop.AO = lerp(prop.AO, rmaos.z, mult); - prop.F0 = lerp(prop.F0, rmaos.w * 0.08, mult); + worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normal), mult)); + //worldNormal = normalize(lerp(worldNormal, normal, mult)); + prop.Roughness = lerp(prop.Roughness, rdao.x, mult); + prop.Metallic = lerp(prop.Metallic, 0, mult); + prop.AO = lerp(prop.AO, rdao.z, mult); + prop.F0 = lerp(prop.F0, 0.02, mult); prop.GlintScreenSpaceScale = lerp(prop.GlintScreenSpaceScale, SharedData::snowCoverSettings.Glint.x, mult); prop.GlintLogMicrofacetDensity = lerp(prop.GlintLogMicrofacetDensity, SharedData::snowCoverSettings.Glint.y, mult); prop.GlintMicrofacetRoughness = lerp(prop.GlintMicrofacetRoughness, SharedData::snowCoverSettings.Glint.z, mult); prop.GlintDensityRandomization = lerp(prop.GlintDensityRandomization, SharedData::snowCoverSettings.Glint.w, mult); - return mult; + return prop; } # else - float ApplySnow(inout float3 diffuse, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos) + float ApplySnow(inout float3 diffuse, inout float3 worldNormal, inout float glossiness, inout float shininess, inout float sh0, float underDispScale, float3 p, float skylight, float waterDist, float3 viewPos, float2 uv) { - float2 uv; float mult = ApplySnowBase(worldNormal, sh0, uv, underDispScale, p, skylight, waterDist, viewPos); if (mult <= 0.0) return 0; // apparently LOD landscape color sampler clamps uvs - diffuse = SnowDiffuse.Sample(SampColorSampler, frac(uv)).rgb; + float3 rdao = SnowRDAO.Sample(SampColorSampler, frac(uv)).rgb; + diffuse = rdao.yyy; //diffuse = frac(float3(uv.x, uv.y, 0)); diffuse = pow(Color::LinearToGamma(diffuse) / 3.14, 1 / 1.5); - float4 rmaos = SnowRMAOS.Sample(SampColorSampler, uv); - glossiness = lerp(glossiness, 1 - rmaos.x, mult); // yes these are named wrong not my fault bye - shininess = lerp(shininess, 25 * 500 * rmaos.w, mult); - diffuse *= rmaos.z; + glossiness = lerp(glossiness, 1 - rdao.x, mult); // yes these are named wrong not my fault bye + shininess = lerp(shininess, 25 * 500 * 0.02, mult); + diffuse *= rdao.z; float3 normal = TransformNormal(SnowNormal.Sample(SampNormalSampler, uv).rgb); - worldNormal = normalize(lerp(worldNormal, normal, mult)); + worldNormal = normalize(lerp(worldNormal, MyReorientNormal(worldNormal, normal), mult)); //glossiness = lerp(glossiness, 0.5 * pow(v * s, 3.0), mult); //shininess = lerp(shininess, max(1, pow(1 - v, 3.0) * 100), mult); return mult; diff --git a/features/Snow Cover/Shaders/SnowCover/ice_n.dds b/features/Snow Cover/Shaders/SnowCover/ice_n.dds new file mode 100644 index 0000000000000000000000000000000000000000..8fa49034f1b602c9d18e062ae398a2c7b461c264 GIT binary patch literal 1398276 zcmb4rd0bN28@HKhT3VS&d+sQTnJHA}Q04}TxuNA!GmV*ASX$cDWRz*6rcRPeW{ctu zVrqg*8Lb8)g$Raw`(R~@rD-#D-*Ya%|K9hXcRruy)9v1S&U2pU`+T3}oQu1AkjV)R z4Go=zdKwy9;4kox#zKu*;Q#aBU;jV;GXc-S*WGulbNGL~Hh1Bc|LdRkfPb0&zkh{u z!oN2lH>VjoW+tYyfd=m&CvNt!`72Px!NBN)sfpq+}D>YR^vEmPMX}W(C zxNh63&=()Na$)yIolCjBmX43jkhYKV0|Pd{fWV* z>+52Zuv`pAPlU1&WQn;r`f;mX;6NFlGZE2M>g3^S{+00dsR8zqZk{-zyI3j zfC#1;tv13sgRqkGy7Q(Q5b=~Cy6+JA#!te92YwmQJ_4alZGGKHGj;fxAG{{ba2F^( zFOj5w4cPu`O$KKNa09aopmBVtrP*^Y|+y>@(x&bGk7{dJ6FnFM=^=y#Y>`#S{x&p!|n z_QUTwi##j zUsud3^Pv9-T63~xty(rYIP53XUsbEP!;^!&MU%}_KtJCE)3Y=hHYZ?iCckSz@vEv# z%U51}(m3AAhxZveBWx?2eKF61Ty*?*os%qVB7z_S(rwNK`GEb$#YjEhPID*c!=-``Y*(HOwAjD!HSm8;Q1LwG=Ec*cYkeCs4y1t4TIRH zN2Sv?M4!DyNAcb2d`?_f(b*z)GeFlLYUuogZGxYo*#Q51G=1^Q;F6oI`?`4)81 zT9@Ji{M(Kn3imuG~w7k-eXTVnTz6XeL;()wp zqWXHaVW$VTE{t}}2I38j&&K_|y~6I3;VcJa8{h}7BVJ?IlY)^Qbx@xSrKRX?S6EZu zN*i6kXOlld-<(O)OIu54T99$WbB`;Rh5bbS-JaWtu?djUe||)&>e+RPBLw=t1i=4Z zQyrmIW@h%33isZxv8a5QDlwH7em$>;ovFrm2=&LvLQCD?=5Yt4WsH<;;B%PMjr+8c zoT!#hm&1N{&LZai<&FkmKL&=GAv`h2cP=b7l>+}FwNaD)o!fO)y7IN>&uhZGQPpX% z=6})*x?>kN0RJYnX5zBncky%guJJ(QNvn;cz2^msoV=r<;QnMv@?%@Qx-G`SEYfbk z50fcXm+HINorNdyUYQNR-w~{4`Ie&m6df(VD$f%D>_|?so0R4?r>n!|4TRT=VZ0zm;`BkS-PbRqD1 zd^hax+J63@fIKSa-S_eT?1;@?2=oc#Z>7FO&foa&K&w8K4{4=+q0Cz#$@ydwi1PK^ z51+cZf7QiYsEC37B+&gn^8@)|M9<9kmV)s})8ww^jD;>)C60b5zNZy|hkxv;&MS9s z1orwyQr&el=D)~EQnX9peFT%$WJDXc&JtyK|B5g^e?xReY~=F3883{^{=* z6|4#87pQ1HX9ZE!txr7@;rt{FPQOrw85MH+nW+327E89dL@PP`>EQ-wAB?QwR#%0^ zg`pTvwSJQKkI5>+V(n&o!ud!-1Q#s0Ggo&qDn$l&)+_KsYw+)q@NuAA+@ylhqkq?;h*~ ze7gnj{5noL%lWHB*n`8Ow^v!+&_l{dlx81 zLIO*FfqXlAxxMqq&>o&Y8Qw=QkLfLh0{^{=$2^E%M2AA)>76z5zU0~Dfa2N4+Q~_V zIT==)skT=q*KXEro5PwWR8-$eZeYZ{l^ffuT0P+U7}$Cl#pl|C*cCo1s2_na$I&oj z^fs53i9zL4MFy3NNsIri54Mu7h4T0G+OuC~R2YgWkS_(Tc)fOZbamp;R66uG1Y>+V zwI(xW&1Z!-_DSvhAuKd5x(g}#~O7`*fYgQ;$rW{1& z$JTG&`zT_?rHd{KwSH+6U2Lneysk|^UJyU0sX@;8AFKN6-UUge5dYM7wl0O%l(==k zo*=)d;RQL`{k=A?*hm-JADMPtx89;Shrj+N+uU>9D89whxrwvRCrJRzUr^P54BOzdPM1L)6MPg9vkk9eOua=eziXn zO!7z(m3hQfTKn^(VBgzrVf)!Xa&6lZ8=!xv^hM6UjkyFK2}RWQU^g{q$CWe=A4!k` zyfdaN+0DVjgxGvHKehhqQynAMj5c2PY(n!hZ`SG4r>I+jvijeNeEO_&WAM{6tFw%`4{^sV+y&)6OzDTP=LBqcZD`5}2 zp!vPm&p&$o$l(Spp8$Wj%pezSYPtAP;t?@FR?UZzVmJ1)uKMvfz&{{9WBarMVy|`3 z_ni0EzO*BG)iIDS{!4i}Vsi)w>n&1DoKIBwPvaj7E4K||>VxH8U~y~)3%(}%x{4Fs^s3Wo;Bpg%(MFq`ZFS| zEsepg=Hx{^U7(KN_(0jM!nHkSG*6U2l$plslU`r-=#g{L`Gu7k^My;6Y$sbh@b3Zh z5vO>xZA%0_rqy}s_s41)Y|h-mcXyuH0hX7AgNCqwG z%ef(f-$e5YfQMF(U~z2rZ4E;$y-z4#3W$%1qd#-}JYKQ_9Du$MtNPku~xFS!w;_&w>Y97=#2|Fbk`uS=g^V%H{KS6%%^*GD!$J3evSDxXaegz@P!Dq5Y ztUfU}$3lEDl;axN2kdUxSq1s|13pHqt}>e(`}^wSCG7yuQ=p!<4R^)vzhiYHx@^{yt`1_>#HL@AoTw>tOb8s_DjWI6nV>p^O$K}pyp`Q8@1 z-~AiG`n-}qdvmS!39`5vsJ{Dcwj6&N-8^U89uxHbJ~lhIVizH1MSl_Sml=j~av-e0 zz&fVa`y7ft;#ukOkKgX)%qFwpeF0_9Biuae+0YEi3+t`}<@_PFlXcb~BvlN|tm zFrquD9YZ5?ukN&wK)fQ#S!`JnM(DZsR*?UNABc-iH3eiOORO_3QNAFJ(WH0Ga+H~f z_f3@F_xWu$Y?9mCcr(2LKHnngXWM0LC8off81GL9_DkloIBetK_*X6oaC`waWRk|~ zn{uB`0R92;g&J-a%QX1B^_J8VaQ!5qX)4~d$_)2HCjhRO)W*$slB8hx!pm}$|COt} z(>Fbc@eFna_VNPt9JllZE+j-|Uh4?28CcKRFMr$Zdf2Wky8*c|Bgl}b*m`dodKL@v z03XdD{bY`2UHpOp`Z&-($Y(GiK?y#JzC#xl`at}WRIBQQx|FHyY?z`saDzsQjFoR*_@W_~cg5Ma-mBq~CUPE}cHqIgy27=CWr(J;C4W-Rni z#EPBj%)%0$uHLB)`9PrTNRxdxa4~+lVFtvX8OA>QmGjNa9>o_CfIh%Amg2*S8Er}E zwThA+0{s(ZrCGDg=d94%$O7sEN#-lr?71TPN6*~SThBp!z!jiC|+i7mI9?6rDW0R2IL^%LX5E|#9bHcqsmG&C*0GH`F1+NEcdcnnSQkgxQ#I=Asb2#*WEX(rFVAJJm3zQ*6Z zdt?3sX)zbP5Bc7?oQwNbWL+WT!F&estf$=XEhLmh4Kjdzrw}VYircv>4M}^S>6tRI!%qd0_+d_rFgQBPDvHr zibnfcpFq8A@1bMqcp^QTumUs;`d^ zq0cfr5sfEG{Zu>N`EWw@yF&h*`y>kae+>a|(h ze821n*28*Sg7Ji;jC3yd{vAt=eVqyK3v?V$*lKqO*p(K*9ssXGt~@y4&f3PT+9R<3 zWavD$_xbzbKaoq2Sakl@%D?UIxjB;S9?tk51oMUd(uBk9(z>z;69f2kjPZTee14z~ zyki*$17-VLGvDeOFqOeW=zkr?p~B1tS2v-xd{SY1A0kjx9j_Z5r>)?!IGKu{pF3 z#!r$`L8%QqNao84i-7(?|HtEZuD#5g>GWt0if1nZeHf>-id*5c3yrtfuFx;svv$Q< zx<4VmGWJ>Fc4vj<)@E)7<1NA(v)vz zTG4q7JU>Mu-b-b(|9Wz&q%#KfPvTikYvpAls+CqViYF|kt9x^mTS6Z{mr`1k$C^q3 zYr43!rsyI|W1^Sh+ex;>5wRgLD*n9F&zE;ir z$5!1r7WmpJ3tl6bsk_&m4_oG^|91|KC%}vZmTRv3tN6S=h#&U>pCug{3}4f>_{1az z#ls94Pi!%Gmq#4tqw-?w<&??`76FDE$4XrwzpfZiB!&epp|$LV&kKlgH&sDvD>KhL zK;x%?STB0Mo3bUg+4X1xkWZi!Qhm>VsM%x%@fwPMowt)ijtl(vMvwv_ei33HCE%$% zBVfh8AT*xzE0!#1&gaKe$QGmP!#qBI<8)T7A3wPS;tj#})iq*eTz({RSkTeB;;z!jJ-@6+qbW6fOrD^mf)d*2h>q- zOXyz=FRS%U_ri7Qv)=&!fc#f$7dSZE%Z3;_2=xj2bEY{Z*1m8(h>9!iws-c* zOLc7wS-mtqQuidVDMAhkEKPy&QJ|`IlEjTR(Jy6FQ`e~S!e`RK?Q6Pa$@jw4`c}yH z?0*x%zEG%-K98NS=8pIk3Ip@$XnZGxjEUc7^yPdEzl7#L*!tAE5G>iR{zVhyBZOF= zUC7R|in{P%G0F$Z=k`~_t_4QDj`>rKcf1Ja^OvJviDnR7k3hJyzdwBNX3h{F@Eh1a z(~-$cikG`It%m(h(7&hMW~Z`N&TIc&GKKaJTWw4^1BOYFk3H5&ojc4cm(kuKr@~|9u;vX@;~fiv{_HF^%ss<31RPm3J$ke4t-K zvEjTe9geh(QD4_;8aPQG#0-B;R?92lid6X)hC$mF0Df%vh9Jwd^>CXtv@uqo-?R`E zkRQg21e0rG3z-eTy2w9wpLwg|carxGUWN0KRF*#TmiO_S;uLh0|CJKkT0ML7q)V0{ zp8(Id_Foi_uUep3x`dAAKSw{%oN?I>&oY?J=;F-buQpI$f|^QPILX*5Rvxbn^4X6_dcB#5d$sV_s4?K5D4tZQ z?Poh|o~0@v-w22XY+4XeKZoyx%12Vte92$j=GzIg`Ws+B9ZTUh)opD~t19+}@`8Sy za)i6oHl8~T@;BiB*iIIwiM3EamcxYjAk~fq9iF$UdGF$z@1gz#s`OjCuK%?Clc0~* zr-)b8?A|)N^Cu`?o=`ssCfD~cCoX4@L;9}P=jfte2yeHSRa87f{mr^Qo2~cu9(9|h zHS}MSwf)4pStAb2S0RUCeufaMJ~TP5>}U+Aro#P~9~Wa)W-Lw7)|X}{{H0)gB^5L? z)~suH^s<8bN3aBo8`jyYI(AwQ!)pPSZ*MM>YuFIBxR>4?2EKq9(XFemNh?@{_5%f2 z14A*_ey?c6AJ`Y72rw@FaZLQ#X5Uiu)&vW082Az0b=nwhN)6*yE-Rli= z;vaoi`$tl*$=wm-&;K#DL;ny6Yh_Kc@|FZ$LNuD6s&c*)SXG98fx7E~eP%#?!VH!? zVGDIJH4aeT){Vi6(7m))Z`b$IM4%tfdOh3i+g7xSTMj_|2#9_>W}V;0ivG@kdViBiOybbB{wDLc?41$ zeaYkj0fG6zdJf9pB4>Q8&o!rqy`3a9UuvzbnJ`;honTochxsZA+jTgBhIJXBi}s@W zRVI9yc$?auR}#Gz^%rI39ah$2EdSTP70~{S)&S17vRut|N2pV1KOw|%=CG|dfqpRb zFlsNM=&h3(cKgxcz*uN+L2FVM&NgY*)k_`enruk`wKT)vkW+9MEr6A(;wx6gB$aOV6T1Vg8&_Omp6?KinF-Wn#B9 z0OpUlx4tbG&Rd^8LWlB@`b8AH!_PMQ(57q{?-)utUY==`e?WKTuMiK6HdpQ$lTWsn z%$(!ldXZ4RQ=+YVjsM%?bg(`kFEwj^?NiEU3oip0PY_~US=PYCfttVn@Idv0t*SFB zFmR|VcyEj9Lz#r*+K=CyTv>7+U7yeu&x(c}!gz~daq|t88b%gXOq5R;s>pjjwr|_6zG?-02=aYQy+!chmp)7` zS(aKcb^3Wr0pNuCJn7~Gz~4cCL&ttBFgT~)IxipW?}2(jSQ~*euYSng3mgA~ zKz||j8#FXc$bSELCN=>6WnijU5t4IJS$c+ZU_2%f0~G{$AHjQBQ9tUBLP^tYmX(dL z-1#g{`oB!h;ud-pH@mJN;r1@7t>G{j#cz{pfU%!oc+pO6hVz;dY>W@J@dEAML zaT|Ww0sI-9|7f*wVdFk_P-izKK=}|QFJy^r(X#%!NDR6jPnOv`*=n-h2i0fDKMZ1s zs9dJkOt-2A&x3rrRq|C_%QhukGV%cVzzm5Pw&~0kzwy1ZUFi;xFIzndZgp+3H!U}z zNPWTkZCq0Y|6+%SyoL__SAfwBG(#1*&Y{iBS7^CPXpm3B8e`R}i^!trJhuhdO?8p{ToE08{ctbE&cbc3g{WZ0mC@B7v`d_T|R+%S!F^LE30r~aWz>bK^ zwjrz*kpIDJw^(w}1q-Ha3pzf6O-xV}dQ=29ngRX7dex?!WmnMbD9tETkEaOhu86?X zR~hNU{=2~HI}J2U-X5*+%vJMa4$dXZn0)({)hq|7f2`&f$?h{t<5*WNf%!nao+UFf z%JOXb%BQ32n-<9?0!xe%JoH}%rq9QN%evn0jh6(jntO70 zYbq$=T+F}spX~wXmBs{YXD<)MffPRe?QxjD3A|VX&1~=5gpw(BKX|&J-8&X+A4Sp! zQNF-F7E`%}_F5WeL4N|~>sH}U?OqfYS`<@ZzJauIv$IsG8*J8p$@K^LxT$#Dv}t5y zL&5;&qQ4CARn>9*-V=|+^ol06{51u+-m$ZpvEmU>Pk?xXt=GFty&}2Bpru3qVW>>E z9c{UCH2#fhFSIwP$F1d+bC!88vUrd3yK+oCzKzBw$9t8)`iO+}E7N29-b*&W`4#0S zRgW$4=$X0hi=PDozL_HFggoE>=b)L*3a9Pxc?Q->6!ayZ)e(h{Lg&NQPlcN=y>4#*7m=Wu$V*UNB&knA3toa_?4Krf8%X6|2uCEq;i+U z`cB)!{DOgr_t}PDZ4&*WQ+?hGds1}&LDU>xX7EpVpM;I;E!65AD*4a{@C4$8Y8)r_ zzBZ;9Z`SuWg!0|{kdksGkrFvK3f&(vHnWZN{qxwiDEbs!AL4bkv@}3J-#vrBLv8P= zBim--iz7|3!2cnB`U+3Yeg9(C{HVQsoT!Ggm zv_6~8Nuz8VE&cU$cTVY+5x}*xm)Bcy8y0TcyHt%&#l!$Jx`STsWC`)WXid+^{#tF6 zV3<>i@(V@VsxuVDP-ZnC>;Y)mcoLj428Cl0G?%`sewUQ+|) zW9(y&Xj5jYMhIaqns5H~AuIJ%R+`E?-vX{5>8C!ybDu@_#nW5h{0z)4pZz}7we3qc zf_x0{Bj$F~Dcohz9HX6&)%=hcURJqCGH2w~C6r%;BALHQzHPGk!+FquLH*7=f2vu$ z-Dcl@wZ1$G?YKy)U!Zp{dLQt8^VRpAWUHuj6tCFSj7>5Nvfm5itLprc65yOUf9(KX z)DNE*C?Coe&;NDVRTh~K@q}PQHtK0GJpx}h(_y}Y2zzj6IIEYn4R-wo?JH1L#&Od| zy!pp7^VIS(BTks)8|PekJ_6Li>_<-MuY>|o0avNq`?QM7;>~A{P z*$-w27injp_#@Wy*je@cmsZ`StItb>2!2t_aWvV{dlOwB)^FHwxgS46ro4^vB{nta zx%fg=Lxm>;UC(q%IXgR|V^aQs3!fKE*Shv9zG3ouFX9{E{Hnb{C!AJp*~)x11LXn! zy}8@&WB;P7Ax)_My<{MMbX8zqvUE{?QCiw|YmIvjyfijN?S(ywJiQ^`l-*qq?FI5f zI(ua7`e6TCos*?EVSnVCY2Q$=ygn>c7v3jfw9g^mR`aR7-Hp&c1g&IFGn=YR`zE@n zj*q!AGJdEqCsqdoc#6B`J zY*{1vyjMtAFwfU6wkv-NT%SPbT;N1=HT4?=d=AEAO!E#Xf>w28ypUc)@qy7coYyB; z)(4vYEWJMr);qeaOGao3@hm(J#-9=pyV&jQ+~}Oae6+uaU|(#f(XP*1d?#N6%}-T$ z7HjtN$lKiAAK^6v8^UXHdh-V}M;q`B;8WEPU(Q1#GgBiP$Pa+MF!da^qk-ty3frr& zUSNbi{=(67DyfgD4nh6j%f7mTecrl+_$L$QBcxWYH~ZX+{1YN05RZxP7}Zs{!yJQ! z?tfbNfbnL)`NMiPyZyWc*%0_6h_5@A)|$ zJ=_j>{-NU!F2}n@xH?j=r5)IJ@<+0^@R#&Y{{-aeFktrn$@x;2q!_6VmeaHSVvxf|wBKuM7de*OqP2hn}AzEj7?6P5t#z-`;R0 zS}zc_mm8%%vu3{OqyLH^YeB@iQ)70E6MiZ6?C=!>OWC*?z6WX zX~0AMGL)u1BKfYH$2esKh-Xk=Z@V$I*QYW>stfxkKUyWt?=7;;XUV^)`NpTHuBMY z(zE_fOn6{}zR|sLH2>O{>Ne)R%_u`8!+`xQz!x@uS4ht`=WXr>`5xF`SI*)cr|oVF zJdmk?@(F}Vyk@&wyD?X5eNp{erRuH5ZBgz$*#FdDAK16`2XD>wc`oluZUTIJf&K3K zv=+O6+Ng^ifWN_f9zW)DVKu4Hd|N!ImnVP3NbYgmR}(VzMvp^&Aqjc^S;;H3@{Iq@ zLHVi`KezC|ZUTML`V|mA45GdGe!ARh-SRUjaD5CfO1N!~P?gxy9FOu-YkH}icO=xn zui`goUjgx6gPDQShEj4q2bEVi>6BK3`Q|uu))(Rh=-T*=}vAPlG;;cMMSy`AcwPk%m!IqXVd?e}p_v&A#Qk@%%q` z7DGN`c(SZnn1eRC6K8Kj{R^=5bGZlBJhP#CTS9#?h*sB|gye48`!V0%l^9E7@ntv^%XLP*ALyT^CYu`kgKjoB~3<~ zln(2|MeiX#5Me?J4ZqJdKH?6&0p=${k;a+0IV-$*rL(~I2PzPslzN8l^qVK)_YmOx ztPZO$Vpr*vEfh06yf3J+v^6i!d(zH(2lAz$$&_k?4Yf7WBO#U@V7$<;E|1t|xXe*4 z`n6U*+z%DBmH7v4AC^(CgTxEwYZyvyzSD&en}ebOs83|NZ0y$NCB)>fGBSF82m4D` zNS10Tb-*eN^=Gf|vaYw$DTm#o(epO~ud4icv!6=18CIE68u0&pSv4AO4a6lDow22@ z|A2k~Qc%UgWi3zE(t!R=>L&+LiKidX|6ADu@yk%Av$;(p{Me{z6wf4U)^Uwffnxeq zPkYGs;5_E%FW4s=m_#BU@)Lq#otFwT7G@6ldctc^@6Nly&c2<-s`?emFCg}PXr7de2|F?QOIAGpwAqzHc#SA)gJ}vgeg5y;`H+tguiX1zBnynj2i&QEk7vO7 zfmB=aGoSdc?!aGRzb}1aVq*1`hCz4@?)N8=eS-4p>hditVg5wwr;$RRlAUrde{X{L zB`GWCC%Rp*XzW$#sq?F3TEdrV+xR?|FO(O=t1RwhXel|vZZE`>K)JOh&wq7hVL3cs z3a&AInx!{9S_%sVr=hgP)S&97h3cVH0oqamMF=GL(ZwK)$u>8SmL zb8s$BePP`Ej4L3XT%Sh1t;;p3&vx7DwFF&{4m-Q-2c2NVZZD&r1jrXiYuVg(@24vI ztJEA+-x$A^I{l(f?hBDF$`{zILwgu*{BDk`KnnGT&6?kQB(F)=!Y4=y-e(BY>ziw& zCc2J`9br5mwa(IeOBvzozv}#e`ai}1CkFAvz0WfiuAiaose5v`qB!5eD;JKBU_8&5 z=oM`V{POp|4iJCDd*041Ru2u1cmRBW{8LGNP9KgFF^iNj@O?zbF9@Of=bTZja}KgOHPhZ9)xIbbC_pTedNgNASoPwZl|{bDRb>uu`w6b&$J{+LF;d29_R=C zVSwMKTo*^TDvwJMJJ9_yhE7O;*kZdpkK3u<@5S~VCb3sLX8t}dP>+w>&uvcK9KT#A z53QG~Q%`G@`d;LLN=VpT&@2k%3A%gsH8}Khn7sqE6a|ow#>8Ss<;+Je1D$S%{l5aun zr^J7ze9OF6Z0GzZw6~xY98GANy58va$rO$U=AWS4t!hZ>U-2Ei*5>Qs!ZSBCeTc?E z`54hzo9yJujfq1}WYpeXU9v3a;lf!jq7l^I!gQ9mXpm(v>NrR05Awf#Y#h5QvQ%%= zB0UEfZ?LzGxG@hme;!ft)OfU#1O^cU;_Bb*LGj>q(kC(^YwGy&Y7=#Rlw+nq2+!vw zy_gO0O7d@JZ;e;Cn%yTz=Vg+Vbab;C&GP{TAcS6Tmq_(mK?L#+LJfC^;(vo_Qx9b@H1X`lJ(MW zL-|3xl(u&D8j*uuf$^cdY*5~IZ)!|a`hn-cc?5h`mO0JLl1Uf`XWEBchG(s$XD+6b+QNZqQ`DS`4}piPYkz=>;8E-GzeXdG#l$9hgrj5>DuicyhBhgZ(}b@A@sv>o)ndG)g(yXgt8$rxTL4b{u%;-URha z+F`(=@$_=tGgw-vzEzQwF3qh>YDB-f-k(nTbF0|csj!aPgyL1jH7hp>dO%;bAA#4P zzffB0c3o0<$LI~-u-gtcGSL@R2G$Y$%V2i5&a%QfOYGgFx-X7d--*- zdcDSa8WMNywt-ZjzirdY+e|a<;h<;lXNL z=7Lk_W4Ka#=Y2Qj@-8OiBZN>-DJo<-xaUy*_3r`tBT$~3<(y|8SduaYy`$f@dV3eaRax@ax3QL!u2v*PnTN9oMUFocFjTKFZOY84{f+gchw~DcX&SGVU8ni zUg(DoaRT&r2C?eTq{u6u;#Zb+U{2jKh+KO(m z*KRkhE>$BR~tFP-u{G-l?XJ%=b$xA=}Qz|B`>-$Ja?tmcm@zQ;oFrtb%iT8NLU`<07-QpdK~6z#JI z@ftpFmRd&%+0W++FO=RL0sRwdE)sQMxQfBh_Wk2UYkS*`bd?Qs2||6h}Bou-{- z2hTeIf5tra6+8AlX0p5%2bxwTnP8X#1Tnp=>bmq5=I^eTxOIO&@aSY-A1?s<7!wpe zUjN)S=zI**nBm_9`T=h}d~)O-E`LV(O!-d${d-Y@7;6<#9(M~1AbvqU*F3?F*vK^` z&uaklk#tUWJ-x178hu;R1m_nhEw`^flRKRLDz3@_elON)Q^V$`{gQs+jk^Q1uUF@S zQ2DKeG?A5-Kd=u%c--Lq=ja1o*n(J;--&*fkxxs4_Y$iUz<$2;8}d=NK08>#i*1W3 z-3s-w_$Q4gQ>~`GJc!zBdX{w4>EMctQ+mE?{7w#hkMJ&CM31GQ@mr|d)K$)`h?!?x z4Ce#q^UBvBUUT0gg$e8f;_*ex-u0SGORli0dFc6nWqMP`yR^(-&pW0-`vX3`k=s<4 z7VwfEgz^V=m+zOvzwYg_=N*Fg85r5ECAGU`R=Zx10X}CCVVSB_?`MN#NGXK-wcz}K z$J6dT+vy{n>ho=?A2{E7O)}r2zXZj*j%-N&ZrF;Q&)*3BgG6N6%}@06j2Soc@dx!Y zsg}x3wOr6JSx2=6@q3bVmKDd&+Qp~4KcNHr%`h_Yb?n}yEi*5}qCtOren0Xth2j&+ zaa$7{jPgkhwcOizPAPp%$w1{*^6LENdHqcrv{u0Q%xGPg(!pQ#Xp`=G7r38-5OOQN zI_@GoFlzBY&lh4tvK;o4v)xk-OQAfB^WQwZ@2-lr1f7RBc)Ll|hjMr57JvX@&}20ohu z?THXizGKZ#oFhL~5Ar#XpR_5Y`^)cLq`&5`N99)?SM|Sq0Qds#XL7wcAw1_o z-6zN3_~5*=dEyDY$KhS8z;^tDRb+XwSma9%`y z#OA>(t<+{MXb*uhhn>iY@Y=otlZVD%CH;$kxYLro-Ob)G9|7mN^5p}&oZC-r@POaT z3PiN$G~2P-9ML89`Qo<9TfrV@yy?n~c#toE`ptCC_^B#p_N!4`fZjY5Lv z{XpgM(oVB;&UDnRs)$m{r)V}du55%BsCR*XC}|jpY)YPR z--rhBEx4FK$u5mta=zz!540btzvqiNRk0)fmDXqUe1ejC=g?N{yG!(WGW31bRvzyD z_|6ue9b^=L;CnQ)++cE|Q`tIjf6A3;U+e#`naCreGzj&7CEhkEWw}jH*E{t5EBM}N z{&nIKbH9o;84gH`O2DfkV&p%!+!(r@1Ao7O5gORZ4D3tB4OM8s^Gc*gl-`Nv^IG2I zJ6IGi{k-fExvxEw(|if~14)!1b{tCc#)SocL-SjaL?azHs(m2*RpLm+(|B9&lMLj` ziuOF;A5Z^>@A7kYRsM+=&+*WB9lGb4N!fpHJ$WlN;CKw8Ydp!l+? z@*m(|t8KgGz5sn5%kB!kaqa=Nx;6vESF}Go?08v|8!_mo=6{NHUG5v~4LU~)jYk;v zW14v|F2TFHp#jDNRT3?NPhm&RUzP*$Drl8}cxJhF?Vzv`+K++#1;=(8)+YD9B18Wc zB=;S%<)(SYyS602dIt0p#KFN&3RBE1sc1b?%X6$_|C5&Raw8L6A68pE-_y|d4vDCKu$|QVisj2+B|TLL&)#JrFp*0Q+II z4p-Bp z<3UTzbD})^)b@YujW-OjpiDMzRi8)u7a!k?vzgO(J^(%szMpemv*u&-xwL9uG=Ejr zQqJhfJITd7fESS8>v;NvDkhU>6;>6%^&^;ip8We<`JS~wA&|cited5+IBaeX8PA(* zbmsOmhq++a1ra3lG;fCUgM89kEdIwc@NxyPH<+(gfB9UE5n+)J{9Xg#T{TG&;}kWG zGHZAATB*o3%DznPVQPbV2h@|woHejsI`MHXZfZzP?mdpC?8vT}kpC%}HVpp_=6lp!r&Wd{$Iv~Vvir-h``Rd(CY&E>>9NMCLI|?kyi2e@LfV&WGUxACkqK^& zVEjklNW}P-x~x;V@0GW>Xn#WKY}R#VXAyO2L8Jq)57IhI!wx^nk1aXd4X+tqI1_`W zd_#9i)mndmH^!KRlVv?>{o0~m7ru{p-5aCf3C{M#*153WLFWF_ZeMwDZKKLLNbS!j zgDUO!R_5y;i--CniOAs;TMR#EUz+}(9kl`Ve^fN(B6V+8*VdI;gg%S&>HeJV%+EJ#Lo6!O%LD${{#GGZ+qQtgg+hL%xd%ywOPsvS_)o87_ zexo80@)yG^eIX3Db}%;3-cF7MkP*s$+u8NF4~IrUs`9e z+M7P`=`&TRzcW;G%-D5?cWnBsGBkJpbNczWOpwof+_CEWb5DpblIZRjjh3=;>luC? znh#*K3xj)!vjQ^CW=N&Le#$u-TgD#Fm1bnmq(;3-FKa0V?{EHF>3XOS-JcLzat8Eb zhyzLA&YsoQcGS050>GyL&q7NOFv?~p)(6L{`STa~ zr@(>cqj7pkaQzHoZqp|DNUN#b@hYk>Oxzc_y!lE3vkAmk;ICeqc9Z*yOOk&p2K5~5 zw`A&V?OiE(AGY8-x*nxS#5ufot#{BuZRux#7af9P@??eUf>$x1e<+>;=a0yD$IkNU z^hosgKfw2?3LeYKr*G8?^!x<_({*B0o~+MII)?UB7}Mlb*80N1%a#u~Aio3p_WO7{ z3{&lLzH}D!C*WVa&6L-L#e<&z+pnbC;;~!pxRp2QD4%3VD7Fhm2=RwOf6Wg*pL(Qs zxVwfr9F>dOSJiVr>BwuoiBCledhJQDEyow|O)gYjf%*|lyEf|HwV@wwd5eBOPf|%( zoEzskF-B%v)$v4;ILCfTOU?Z^==aT}X$5yXmGSS5-G3RV`AlCDR9j^ccxbVU1H_B= zrwn&`q-`HMzlyr1`|&MNVRjYhKf!*1 zJ>JoZeb|;JwU(0nf5iXM5$YC4f7}0BCDW4pC!TM53YQ8 z{yF8W-+hiZvrV$7(7OTb|EK(=jhnwIu)!ka0f>L#dkQbU_h;b%-|r=V80r_C_o`=F z?~DB)*tr7kKZEaaxy@m_!t1|9>o`EZwX!#_%(;5EarijM-)_z@l5+`;?DpD(iZ{Q3 zYjD0BC$`{TD_vLNFs#NyV8WoIW>diJv0NZO=>JygEmw`yOUhWa8++pIsHG}=tQ z932Pz1>_Ih=I+<&oAi4c$Iy6*G4mIHwphXG4FmB6_zPC=Gh$|i&FRXLqW8TB77KEN ze<91v)Oeo0Tk$ezKsROi4JpJAh<6(Jqt{&9h8no=d~(OW`uAO@2FjNNlplieO`zKP z?gWu{^xXVqAl`ud1rxIFv|hE8($Ng&1O2(yRgJ;6i*Dpy;`c!Q5-8_noeG<46ENaP zf%Za(zo_n1eLp#56J>bvwjrEYEGh0<7H ze^AdQC~iqd-0j0}jl+J3tCISwOAe);e96uO{NC9|QkJv%O{bSPGb7USq>I3L$qeod ze^#Iw9TTkW?+5DBE*cxx=XsO2_TP4YJdmfK{M&PzvW?7Pznd@~fchZ#iEZe+h$tT> zJa37#aX-cRJnS0Bi=EN_gH_-9-jJ)olxr`v0Y0WdKZ4y9He%7^zyAyLUj~s7D<+(H z#4P-;4)%ADP%~U_ru>F;S4NC_|DMOYQDMSqT=i!?To3rZvn%HLHHWovMF8JmJfS7; zh%@aEgGhxCjR!>Va{{vb5X;y343v+RD6Jg*zIrE}l+f?_ZMYeyUIf`B0$J z4dJn?oU|vN;UFFu%F`MWZsGOn?|12Zb)+ z_YJ}Rtb{e-&=ZnHY%7NT0?t?b7%vYda98tps`=Kh?3R-y=BnNAOw|9C66O$x`A4Ch zP7&mPL{+(e|Kw>;bJ~~$)hD*E%A)N5uymYZO z?tS!~^F|eMs{O^^;{{AL-^g*;k3B2OsDoziZTt6b$VKOec|)CnP6K59?s?P5{$!`d zgZ*h&y~wmI1JN&=pmqP=+Mrvqr_BY)#ff{vEq{gjWUn6ytcW(CcgTOqBhn2YHQF7! z$MFSwn%%;&JJpDnd@yC2WQUaHYS^vU+j)FA5qTh3WhN5l9NXO_o0 zqh-M?xOTZc9sYkUvyqz&{pRKkV6UP05Q*P8xa*YLQm4b{{E#0BID4hkWS?wiKl10; z6(pW-+*UJA{~Zggo;yWgUCn)PZ9x_u?A_~q5<1hOn|XBu6~8SGZJ`7F!f1fPM#hnECwef}d(HHQql#(I^1IK#9&KMUX{-jpQ{m+sfx9oW8x*e-e2)8RJcqu|3E*zLp)PgBgM5x2gxh;jAMzW zZ8?on>J^0K0mQ%JJ(+|JaVxZcMfERiPrDY9jsME+sb&_ipU=wAg3RPOXGXre!?%tMvsvI2Vs^rMuscI|lD>6{B|buf4<++8~8H+OpD2n!IsDeEL(lPc5I^8K;?1g!ONN{Z1@1 z4!r9wsyvG3F)C9@B{r>NHzUo-F$mw_j|sVEtEs6W9bs=0=J$uXC~>1b|ILRL==pZd>t;r|KEvc2K^W2cLvLH;pw%JOd6|hp+hjyJep4qp zAM|fndC$GvZEENM`WC+ba8HC)$}TfTwskbxKec{}^KxwG9Or=2gR1#(%G)P5vjiKN z@(xTtJ3WwY?)NdSi`Xy5^sQ$LWjiSzr+e`n340&Z(z%hmI5qa!^nQD^eqHo@vZ0n6 zEgc_>&LdG=r8^1&hxWgEREYKq{k>F5adJ6+>BIM`{R+}TTmSJ%TO$)=@_k&;8N6Ws z>A;U<*dM@$kX&1{_pwDAM&Fni5OC~EIqYmSz#`+$0Sa~G>56jE10%r1uFVnxX`#IznGD-c^ttL{0mWNSHh-&m@tr! zARiQE=5)p%8dgiKdk}qt{>sVV-dYkR??>_;`d3y}6}7ijn!w!a1XopfKw0MgH^EGS|&SLOCASCk4b1hHrdn8x+*ZX<9 zg02@zq9@`oeso%B=s-^Q@E$aI4e*$jT$CF_>(kiDH&!6;kbD<3F zTH3#(Xr2u`J89W&PR_*BmR{8b@K zbJ)G@cGaLb7K2y)g4^l~^lR~f$w|pLorK*HF(6dJVy{=7EkgdP(n+1v!&3V(ugp`@ z4)R5*h^$Pj*|mPObv+iJX3s1rBnRyIJ$E@zj=@XeLN-!cVqr5_1@sU5BlxK6vHx(W zz2>?GUlZrA!L6c3XmMsbt5$=PrH^W59PK7snQ z?LE6pZf5PL_h9yM_#^Yms!QduifbIizsmZs8op?_W$1|(@GqQS!SRj%)a>>CSw9w! zg#Hb4Ugxr#f;ZpyVEjCuWaHmb`bR`TX&vHUHjcO{Xh*f<0Fl%Q`vZM&rFq~?ZG|^| z`8f<7~xNnXm_1xweezfpDWlqP>-pIWq;aT*t+JaaR9Oh zsLhkXIun#%&O--YLNNbw>W-NPteWSn$9O z?O%!0>i*bu;E08R5%@!Z5AD~j+qww%vxL!!$o>a=J1rsp!wK>eRsS1Xn>fFPiK7bR z(qoW)=3F=C`t58am0zAeZ4t(6`}d2aUWG4jF2DFx zu~!y3RrNe(9MwYl2rTAN-ukST4eXilBS{`hOAbm>vIlk<@cG7gusa zgmV{f$L!Sx2Cmv_nkY}XTO^bGa=BW+fOf9hIubTRolKGah@ zM{fA;X*gytL;M`y6;Mm^8*W+v{0sBddN!vO=Pk)nKtD5*H=aJ#<6JKz-w^U#B(Gtf zw@$EC>$#!xQFD=fJgbP0&;8g#NOD)r(V$l!Vx;FoFVizM}^p|KjyK)nI-pV^g+b^iAa9Na%{sz&gZ zG%)0M(t5@#LOHWo{HvbC32mGf8TSXO+oODXs%(I7wwmC-<^cztpX&L@mh?ZPqx-Ll z_F(kj(IdJOFFG=kYF2E}vIuzx@^J>{nK^g} zR$FscC+7hEre~XHqnfq{{gnMAh2snTaFV06YOe_wOFUs6#518jz23CCmb*;bFXVkB zoDb&ByABldmb7L*7c=2}pOhYyWJ`wr{G>wiVTgY~{KAj;H}?wvyQfn49>|XdX3)Pu z&#m*8gou1^0DK#6gsz%=BDu*FZ-w)Hl6dsU1jH2+f|Wn}VEUj>2Kl&fiTH-$mJFF=Vo{%<5l)Gkz?1rgf1ZMRQ1!>->V?r8e8u+{3p~O zBKt?nA&|a*Q-^_f7QzqAQ*j8KdTn%U=Z0g*K7sS+4|o19w*DpPIKnTrPnIDLT}_iE z`a?Vo^Z!iJ`n_rn{V}SK*(Zdt7ceWfv9R)YJkmGpdbvqRiMa%Se~#E5<&&I_DM{AP zrnL%+N$7jf-%1Lr9v<@$pm;g*_XXDEHpgxDuF&eewC7f zgKPSiGIX*{5WOb##b*r<1O6`3v>DM5epnTVwXOaSJo3Ht@1n#{)PI z(4VD0os>T&A0G`OoJkQN>O2$Lt{H#%QV>2Gk?$87|D1^dw=V7L5KBS(K}GlC!c0>dVQ zYj~ZMispfX{eGaB(q?=7w3T176(*k)uZk=9=dz`_4``TtoYB!O7L7li7BH}Rx5@)# zZZSTg*o2mi#j}*2F#!|DLvxjDtlkbZ#3FqS`H${+hT2?@H-hZv+kl{gl!`&)i6cd)$H z7vd!_pTqmUO|N**sK>9EepWbg&F0ciM0ef-`2+d~_h^z&dRBC?vS+S#b?-7rjbDa)h4>BhU7D3b!_4CiJ{IT^>UFLL z`>%_!={YYZBKrpV88aPZIkN)^5RXIW(H`!R|2zI@Y-9(}6WF))juoc!rRM`(Ha5{EM(~Dy-=f8L z#s=^Fa-h0Oxoyf>J0U0tr=~t!M~H|=FV)w>}{%oA*jt; zWiGD$F&~5HxWIYvW8VWYUIz3E@i9eMz`A=E`*IRnd(nBRxJOs5=UiM~mbTs+?HA^k zyL1iJU6iNK!{QO(|8#BPZ(n`olD!GCpJBdDrfo+{Iiq^3r)oWc>;2RR`?8dQ{q35AmW zJp*|d{~DK3*CtX?^a&2xeH-?lE7A+c$W;T8mMs;8aJ=ayARe=O08MD)fUkN!(% zduGRHeerkb8S1}u!+w4}mN%9oK-!1D?%~!y6)~sQcnC%!e%){U_POACXGUi4+wvm=Rlik;+r24eZag3Gx7G^(fyZcPiP-tF1=+Vx=h%NtnzV?&u-7P!^KPe*MtIzL-_xvH3V{)p+moJhn^P_J~A9E!`o z_`Qv=3h94>kZZfprzp$Tk%*mNaavc*l8YJ)F5|KPD+FC#+!Zex6D@Qw`&FAbEBW^J z=I|X~k1{~fua+88}6A3AoucyY?o?R@D@;77>M`uFt@AG)1j_$d>uPo0UU zGXv;8mZtWr(0bHyj&1KZrZs1%WeEMAI#Zi*=0pau_Q+=}9|iUMOh>Yzb6jV!hCPxe z+TzAmQ}f6(mMC5U_F28fCL3rXIh?UTt~uU@_= z+KlEgeqDO3OWb9&yYefF2T;9qBe+E#J2Ho)s{AD(>abjW$<4Uw_60?fA^5$)`^wDB zd6#0${Ly|T1n+@NhYOWiW~o(}yu%qA>KVHhs}&QcFn*PC@NM7s-m2{IPDS{p5~e3; zU0Q+O{N7>2k8CG(!REnLiPm;bVk~|$W4$J~-HeeR5GKOx8z+%JSyXgAtFYS&^A~5_ znf+G&YvOgwBHyp-JNd&nn$N@j=Tf;f*jvz_NJwD5)0lt4B-Qd~gkPA?J1_IlrHZO2 z{%a6FL;Rt#-R`nDwbiZ-)pM}xBV)gQxb|_oo+byu6Xf?`+uf~#x5od~i!0XB%vOD8 zu`u?8ZaaoA3-VhT41+bASgyifWWZtCwiEl*e)_L|Pu$WHI5MEmtIJ0E4e}rS_njjY z9ShnQWZy_2J|nJRHR-%bUWfRFI^%AZQE{knI;sxj6O!M40d!(O$i~vDldAh$zJA9F z=90O>Wokl`Pe+Sz32@%!7x@N{Z)5uJo%r`Y7tqP~b zg+;`u?sxd`9qV11c<)ZZfC^uyYjjQW16`KaTC3iF{chprZm+Mo9D&Rw4RQ2!h*MER!|nl{H}SQjkoY>I#=ewx1&*{RQ_i99~y- zLhGlFWuQ;1CnR37@#0gfvbMK8x(n+~-|n|qkWPk)Tpf(tD8D-^CFyaeUaw?b(Eb(W z@0^d({BIJ6w4z>4gMI`5f#9=KRFl%2H_H{buK{|;QJA$G&t3hl{r5JsAF3kyG?$#! z-7)3{{0#c3KFnC1>{jq{StWL#0+rCSc}wrreE(o%pKgNvo04ppXLoZi{F031Ar;q| zM%;Fwb!wl5Ba+8T%Y=0`-KREZ40Nus2me@7=3{gA(l8}1*!nFdZ)f6}n%DISjPr4j zABOMYCYw8A4HoMdgk&OkzQv=_l?qa8Yiw5Ox#g|L(D&E`Z(pnL zS1r~2F6a}+pY;}ul5J~lFl=7|ze2qOK}ZRe6yzQn=<)MK`hgp2c*O5b)gt24b4fb(7T7Z@rrCj;C);iAz7NS$Nzio1;+zY=@A}{Y zjc0&gPhmW%DCS}8g`16NeRkgj(VsuZgA=n8nppV$8_9l;Jp&bg=5UfW;IV%H zdb!s-BFuYU{y7MKKjnN(CTcNX?dX50Wi>V*pVeg3U#|Einb0gp{_$*r?is#l&Zd~@ zpU*=)=Z(_wSNUn%HQ{GVFZ}BZ`=>Ve&9<6<$J@WVU3LC&yGvx^l9K4v1F?WFh}S&o z7n!{AxS>d|sY3Y)9MqN#8L!@-maOw%ys!1fVD@^)!ut%29u;e)-n_Lgl=*&|NPoe3 ze@QCA6DW#8kZ&NL>S_Lg@?Og$%{V^{e&di|eOJCAyXfW>Rs7}=9NqB6o>4s3FUFRZ zEvjyNX_jZW1N=$wuc7{_TU@iWlfSPLoZa_ir8%U28N6iY1s(-&()ax(g(sznO) z4fda>mN$3KkSJPBfZ6vFDKoTo`|d3F6*DUP#go`tSF`X!;T|Stk5T)KLitWvbS|F) zzeoQ6lnqaBc)pBQj`{QKzM)EJ0 zE1hrYh`Y58=)V>8@j`xHHtUEe@iFkns`JlY4;$%Sob{U0iTFp-a6{KVYOcv!<WE+_~Nppe55}?{xh|&w|B?I=-lxI`FcBV%OsaOZC|kbdNfwwQZJJd zZ^j&nPFsTMABke;FLc^vvdiF+xOO6Tonr=ViuwxzQf22>Y z&Y54m?3yg>PhDe^@vKm6-ms`_(G@E%Og||Y2RYnPd(H|OR{sL^ilo}_3C}YxdS(H= zeNsL*%`7@y)I^haWBoX6!h;Mx_l#A($oU(}Ege^IS;$%b=0 zyy9vu_p9DJn#3!wJbHKV@c|59imNv_nq+^UcF4IOJwt!#{LEEi!r^lo`_O*Do*3BJ zo@1yRIwnN+9>fz*@*IRa)0cZcK=KFX@o*QX1%z)2F=;YYZE2r%NU+hFXzL4u<=2iHfRt5Dd z5=$+C5!1r#o!_ZbC?0tGjH^w6^OfmTgS==&Uu@$?oh`}NUp3YRLOcofFI~_WRbttE zBYfU@6pxo!vMl7GP#>eHjY9MU_nqDHk7VbjzLKi$v%(n*ql zA*&$Y55bT6$?xfe-oH-EcaQYJerBkjIy!o%XuJ#yYL9OR@H50mjqA*6^UW@1Ao&H~ zANL{OJMB*C8jY&zFA3iH_*U6nTH)qKq;HgjU%g_T;|%=twAx|6 zpg)U$AnIvIvdn|L!5@ct*Ym$|4$aE@o;3*Cf&Qs8YA2G3%uSpwn71N9>(76GRch7T zQKp%N!5g=*e}MUvm&*fwf%8KC&^*6J*cb7K$9eQ#NqE4^wzaj${*EWZ;HRLOzxcGu z`u#tD1Y`06_xc^PSHCPya2%^YWaFkqwtp=z+!=-XKdQ&s*S2ue(q8sx+XjiNKtDnL zio2K2_`&j<;Q(eIU#MMHJt-7HoouHVD0 zF2S4N`|yl=@1Unq;JT)~n`XCi=IHL3B>2zoEB2ThuU7dVv`?hD!qKy=hFh5Y!1>VQ zYacme{~KMXg8w5M8S|vA`ylkgEJXArZzZkdJEw-;U5w@533fWf9J@6_!_OVSUyxt( z9}(C&9_8cT#KHa{{%(0e#QmEPH~KxM|CEY%Lp8*FL$CiGMeia06n}KS$L4L>#XE-) zykXv_p0Im6o{_VUuDXwF?rRc}JeS3_c0li`a9>RkepRL4-lc#Kus^iL{+({uqaV{5aAAa5bwu27qk(zuM4iJy3f=mq9E@dt_hdAEfOMit_JLitu+ zNp^eovUEIVU)NWv<*qa2q%mfShhl4thtJUWkr(8A-U;h)9f&9Qnsm@iEGP%%heu;S)B1RsbuGj|6G zYAA2E`XKov>1&n-I$a--yAORv_*UYy40A;Mr9Dsn?J2rD479FX>bkD;{hzMhnnhIf zynNb}M&pitzJ49;M_Kn5k7U$zCdHT2hMh-SG_dQhvNZzprJX8zWBh27>RzO2Aan=( zP2K)H`z&edJj{=(p&@>R{1d9*#Y>SmXE2~IhHK7;>jlhf4Kjs6)W zlr&)S9hVTWy)~a((b5R|8u_0O)b*XI`J0~L6EOHHldoPT zRwna5qWb`qMcr>QpD*RfTZ5Ser^LK;L zGutykmZ>+iq%ABA{7cx6)cQmbW50vt>-Wcy{*fq7zi+eYZQCE67mL}eeN3C~?kTce zb)`3XPF<$3s=F~4>L)h{Rs$tS#nCRUH|hk)Nfe&L98 zf!^gES#x)S{s#CcqN{C1S{nDv`(hEjDJw`ug2{d{cn3C!A0XdDzQ5@C-qzyMwJQF# zwrcCHBik9c+oAZ0q<(_i|7}^xvL_-OCO^i*vPIJ8Rc@DuUn6~t`VZ%Io)FP2AA&rA z`n6ua%|t=b&g@c!5aCOrh@Wjq_IBow0tt{GgMQd3gD$UYE`{N{d$IU~lUC2TZK$B# z)-wpLPo0pl!p=os51`AsAEE+Zbr10WueYHi1<@Q_q3Z?HrC z(d>k%$jH`HqXkJj5Bq|DPR)PM&)~wS>H%Xf^m{6+c$d8M?`;X8D4yapsT3FY)U;nX z8{1r-0{+j0q<~>wE1!P4OxPr9w+DOcA`|S9a~gKfoZgy&{dvZ24`{#SccAqo ztZy}Zubcs&rkEHcU%($$J4v}xjK7G3_dp*C*-rs;Q*FKL@9seMpVH$@a$vlRBzCmC z7Rg`m-<`?4(#q(NeKA!CzuIxKmE6Mm!-pnP5PYch0-|Xwi5{JN3E~wXUvM!4_W6xC zohN~{Kp)_5iplceRqJCMjc;T0SuqsnSLS(SYIG$!zW^ z;=q-Zv3))WzifrPo22>FJId*Q;NQXeijKP^s+D_f{`xrdtQ?oQEC2mYHs_DKd04%8 zA4A~8ek5%t{9J7h`-Of-frFlUb96i97}C$|@rj9!diVOZQI6RC?GVr7@m;mE-EwYW z^VgN0#+LU^Y_2F>=8mlo_w8~WG7UHEX{%2{=Vfaz9O`B+YO-GL`6I$N)ce}TaaXzP z+HR1k;;a6*@v`hc)fSfT!}voHHnjCqR`cC#TMTBWG8MOs-+@1pEJ8#6Ki; z()WZ6Or9y^ulz{7(-eKq5d;tAIEP$v_wVJlSi4#vU=Q(nr?*N)oyCWc`>(@!W}6w7wEIxxhKNMbCS&HZ~7q)-%rQ zYVzXW#!u+Fq5Dk36Xh-zNv)r(?o9aZr9N&I4{tL!rGLyn{fHuqEQd5 zKAHwmz2cM*@giSa;KwsP4hs%Hb6D72|E~QPWg$I9T7LWVJ#MaR_J7NEpt{_(A70v zhd!S)>AMU=ZBDjee}-ucAz)hSbw+o z2M5c4&P1x@wa|vh`*J?J;FvdhW)r>~qtgz^GM{;T2mCPQEEVu{|MbenXUClZdGYaf zq<~A|=NQsP531$u*JPDY!r97Ce@y)T(s;iwlCR;rVrsd==XCnJ!TyH%sTHwu8{WJQ zpUscOC(6(7*eHFegkLFd+gtH~-ag*;v|H9h}izdie2pWm&mHb#{09cZMA9vVzt8M&Yq<@&EUdOE^xqY*7(36+NI}I$ zeol?or#zUye*fd9YusY*M(-lLj_4(NKE6S~Eq*zt3QrrGg6~Z^J8AK_hrFuXKPnQd zlwDIvVi>>tWKeuV7{d4UpH+U{DI*t^8@lL_jvNE|^6_RLjX6?%UY(X|`PN=3nR1R$ zOC~Pd?&jq=ipTihbFw%kttIc2i(RR2Ht46L@-4zP%EbBYT2?6jEUD=5qtSNPM68gW zNBj!;1{c!p+B5qDDh>nur>UO8WZOo(TxVd~$F6@o{>sdLpoTvfUE!tms{4gMsM&RR z$-aJTh5dv7^ND$B%Q0ho3fxu<{SM&YKG*cVZt8eK_?MRCcUH|o{H>f}xQ96&EOt3-T;!QSUCODife zJPTkv(dsHz-Z(^ozE+f%dQLebsz* zUWS`b^h91e;@^3~A}eL|HSUW)F?(7vPn|xZBy?D3TVni5wR%q%5Qiq#=q{dveh>Yd z{1YdF%ChunxKdV$lzdXMQVPqTDx6HBbopCiNe1NY}K7vzfF zOONbU!Had>c9)uQQRq+V7{14^+Bj~uBor*q1^t1}GbtBm;(0!!4z!{z!vLSJOD835 zR<2Cur0Twdkp;V=(0 zLE`=7Z`tr}h0MA=3+Rd9Q>U(;Sq{YxKEQv|%5Y)Y#uNK^A zB}U(8UpP&)JMUkt;eF;$v>x<>5d9}CqpQnJbJ6#pzD+>>-l#IZE5{oB9_DA3X?FGC z-Sv-nWBj7Hs#{^d@0wR2O^oU1nO8k|N5Y8)&-*?idxEXFT0u@)elgpe`X1Rc(EoCG zd>!Xhh6ygj9^!%QaP>ywoWD2t{q z`I91(E$6!3Vk~qKJRx7q5j8H}z_D4wK=uaoPu`0kdEM)yMXAK>)p43lP+JUr|ESvt z_WN-GG0b^%v$)7T28$OfYNcHMRqHHQ=UNOuGk;a-Z*NZV%UX~9AMj^T{r1|{0E3YZ zv>ufZBd2hd<h=+pJ5R&Y}n;?Q%; z85IP4hApJxPZ2Qh0QV9^GFzfDW)QK?;84Z>x1vRF@C@;ta&Bd!LZY> zbwlzlDadZNr8J?+#u^uk$pxvYI{o;93 zYVjix#%~IS#mH{@!-%>EbI|_SI95%gcyp>r!4sfApnrwngnre+$I-M`MHoFR1Y7TK z`=CiNtNlU6|H;Q^HPlH7qd%u&`CtVz;CSbj2A36ti`ad5Kl@0{)iQ&52Oc;6TKp-C zptve|qny7#x?1yJbbjUd#4MS{TA*pXClA>}RHuYGy@_n~+z)|^F!_mN`SormFjBpn zvoQQP6?1>nZkdacV9X%vR^K)h&DLX(-b z_79hr+1`4F{3}T+jUKX&{*!p+{5hEaa?LK6rQGscYRWAJ;PW%Jl2&;qFkAe?rE`Tv zEnttl`Qzw=9Xr|s)Goeh4*>h@dsAY+`YM9m#Utj(9=u)e7}w(VTgBGtmYX1Nr=5Ri zx%^%;SQ9~iujPyAiDFmlYklBigv&llEFUJ7+3?iEC4vF1XnW;jn3qb~#$-=42+WbZ zhUah}bEi*z4>JbD44~f$NkZo4_f|Wt-_93X!}p;6&$2`)N|r`Hr(pC*#o3wDYeReU z33R@S-)4Vx%I8>~qjToi13p21r4yy2<jl0Tsv)hrK|}nb#JR??)XLmw*~{Vgz)ys45w*1r-(|R#MxgIg zwR>U%;;Y4+bbYMfjjEX1({*R7XhD4$6aEkI@+qn1t~hTJ@;xRWBo`PQij%V`{b}(b z@J}Y$QDrru0VC6UM%QyNc|l-VlO7G%#I0KpiOvu6L7i+)4lax4`~>nE)fe@=fBRD# zB`drS>~V~UX|7Tx~I-9Y;OQ|UMaKHzvz+GyRu)BvGpf( zTBlhD9_lld4e)*{=|TC%mWn%gt4T|N%HH#_nEKlHecT)UNVGoOztY>S-)SXF)4=8{ zC~+HWG&EyqYs^dXF!?2An4kS6T)+?i`!M2XiNg7pBQDo}(BGHZq2m9t9x?ah{6EZ` zauNMXDyICsTZeLDn^%ux&lFZ=u`s+YVN2?rDnw7(qH%^JXZ@RXMr$$nB^DET8#A`h z^m9xw{;ZEQQP&s~ceLgpdiX@0IN9D!-t)L8rd6zhXUyUBG|S312&rN4#yyc4bzP|s z2@L}K5bm?b`Jb@cSRoVt_yWEM`V_~CYPA)$HX4QrAU+87@I5UNUBi@!{s({`z<+oq zT-d$pT9(25UlF}g;eJ!I)~6!t?VHmu`QpSC=cTo66quG7VD<{3sg1=wp=Y!)=Xk z%%rg2Ddz)e(9oWct91^=%K?4|9+jAwHFZS~Qd|*y*$PemYnz ziU2sZFimb~gpS5Be9kMW-w9Y)14Y-#85ZGnL*vxLiHK@_;uc zpQJkTDkjr%_H}N7_n^<6i2368`S!HZy;#2xn_!%5HSgP@OoK8vMyIBhy&P5J*06(vpfPO$9W?1ir(<>hU{0M#2D9u_X zQ+r43pa=LD)zFW=_DhZU!Sg-?)Q=DI@tR+G(V3dH(Np3zpl{wN8&>uNI^N$UjNU1R z^`SmQ&|bXol0AP%)Ltw;o*+Ejn|G<9dr{TMxaQ2uJ`AFcA4nt}7e?=K44?-XS=`Un$}A-*!@oEjF&%@}KrT<(yK>8l6< z+$T9`96eC82;mR>Pg|S~)6Ba&Aq72C6{KRbxyXF6rRP;y$A7+wJgI}$&(fO$=kileo@(<$_asub@fbH zSr&#*Tycd1?|?gtTfG!LOSFZ9fjbD-#C~=DjU&&Kik_bYdi&tb+e@cn@>K!xnkwC* z?a#*2s^IrZZ6T3tJG7p*|M^$da|>BlBM=`MocKv4k4foiC$?MBo_rms0{I8_SwMWc z@d=ZyRyWXjz+d5WLj&hE3yxs^Iklcimkp>F;lDc_immrN_UB`h`v=61^f%c4a9V4w zw}sU%u-S7RolgSw_NVmtZuGS`DzNp&r(WD|XZRDJ=5-)=!~Nu@HoGrx^$`&YRNwPH zsm|HEph$PC8hTHaUgZw*yZQ3-9zcJ956~}(vjIywmR`$3^e<6Zw~BmM>%=YFa93rY zF+Y@LKDUf*^&xHtKAjhTZuF7=?=`jt7ChuL-l`|El-bur`aa5 zs?dI&gxpD8+0WURihe-&qbg)khhrJST0!eq1TUyx&J*cHw|@DJY=WMle)mMO@zyzW zjGpMC-%GTw6jex#Xqf{-z#puqVA6TID@DI zn>9h+A$vr;UDWd=Fz&0dmI|KSWS&}%_hBP%eT@HctA^C|uKDVYQNTW>LjCLz4T9>x4) z=%)(l`^88xQa20qj{F6N{H*QB_|2E%Lr5M=JYp_84xP7;+y5BzUnPqD<~F+r!XueA z;O|gDKDT%?!;J1^`#Me|ctHKUyw*R@A-78?MgG0=0?D*wVPH?}@ze-xed#N|mXscA zpF>FggS|W9J~WuHa%_*md3yv8367XSY_`0o-WrjK*;DoLJlzkgofZwQ???UuL!aPP{^T1SI~mh!50m~yg1NO z8R#?;^VKkWgkX1%5wyUN!w<H;mCUX$Poc(%}aUG<5z?DgQ|$%V`HE#UP!JJq5Uf#T9~Kbr7bqe z)>xyGCw4BTYDaWL*~0>~9?S<6zBhAk@`Bb&4}0XcDVRK%5tRKF89l`$W(0d2=#02|H z|3(r+5pve@XdKelaNl@q!Pxo7{VI)Q<||L6*?))Ozy8(1P4$L< zdELJP`3;C)2HELuG%QVUmm6a7BKC|tC(SUF*WR@;O$8qk-%vWJnEXc1Mf}9pZen!X zuJk-D3=OM>}1Xg`Ew{w#X_ zvY(zc|BBgD7lw4zxe18}a-uvC{Gk5%f7?i1_AwSiU=IPjrM3FHFW;oyc;Af86Jir~ zeNeu7_@I-Lq=osLiqxvmHS$%W{VXo}J(cj<*zd*q-{RG-i?RPJDi_wo{lyYEx&yzV z_vDRS?*k8`b}2yLAbMc>Z**l3WEIpos_3gyI^XKdMt^+COElj=>Ctk?iFd{RIM3lA zCco>;D%uWzSNwk2CanL2`nhAsAzsJXRM%`D%C{&R_6H=@vDD*k55yt)rX25M3jXjG z@3E;119-e)*HJRO1C$o-v~m-eFY<=^h1tTmu6SIa8=|Tg?MsErBtPuDQF!KPJJhpK zk7_#fM~tk`=IY#r^`>SO@*`7}PAz<4C*^ z;R8NkzMSBeKWD}7Zp)g^V)@WM$5|+7UUF)=<}0utVP2({&EcUHIx`_?-Xq9QDJk@D z*^$Z~g~c`U90$L!EtV+WM!jao-)Lo-o;5gw<)f+1 z0*9W?!E0Hq4?y3*{w~r4!GXI&lAk$TLGf46A8$*OUu)!^V1WJWIenY(C?ltZUg}o3 zcNZp~ad9Q0z^l(cTF?rxc$joSM_g@BdB;;I%tiCg4p>%hw8iUO!8gQW`>h{(KV{T8 zw*SZ;eUL}fN~ac+>->!3eg4S-*m{IVw$!?&;S7$*PsOi~OhdXY6I~e(YLR?_dcnV5 zi|3!VO7|K^^e*vq9qI0|qK~Z9K7{y(>SgxQ(LjCAzPYw;z8%0XQki))lTox!n&+(g z|4tf%$u?MKVS(8{Y+O&UcYvv2PmY-*de2t8qFWPRTQ(Pns^GjxKXn`lU2s4d%EO~) zkQZikHJ##fm&Jwc@O`)+c9N{W%lS@CvmJ`JQyT=j-8~*YnIX+`;6JD@CdJ+>ZhsK{ z%{2hyZ-rnp&rO~~bJ2@N`EjuCXuLbiEaGDGvk<=7eHOfKmi)pyzZ@%&52#;9kHT29 z>0s&uFHC-l&kQ!E{p;}K#Jofd--=3IQV06e@OS??;XeXBfU`}eB_^OLF?@agVm3g%I)9jh_; zr?}H>es^7L@xPoM2>(=quqJBT{^sm|XfFYt)8KFT9hP0Tq&1mg@<&-8dC;5mtj6uW z_%ixF%xkOP$~*TUrQFyX$wR7CmTJ{$Ksfe48PFs6rvwVIu|j>6(XL@th2VwrIUMVK zGsmP*gw1P)`$miGEAUg1Yu&!SU^E{N?i*;)4PM>g|DyZ}vcGQc zlvP}^8WzXCK>bDAKHiMfY0KnyHZF3TgGc9q{(iGsuGJmRQ)zS+%I92|C{E^PFMgR* zJ_q&hK>cZ@F4J^pzji-zKi(4C#&>N@XsM$4D6$|*^#}1!5YS5g9=nw8cv?&S9p~RWvIzaxy{5I3# z%<;O&$W)m@g0)vq}TL*3_FZ1aC+`70J5 z_4pRiEIl>D_;tf|^na>TlbXIL5m?p%~H)==4suN|;dk-T->>c#Y-_+6%^B zB6|Vi8~(jj$u9%#LhR?G_ew=G&w+2bZTHg)r$Bzf{8RBgb92qO=wd?)B#)93dx+k= zJvs?}e^f#J`y1--<&J|DmrmuT$1QAs2kYa!gLZ5i`nkgH_&v0Ls8^nC`wixC6Sk6& z{Q=LLzs&x)R%AQWi0oZz#YA^b%Zd$)3Tq3vxVyIc(0cFG{nzJ&$w1@@*^Jz z*kre(|IcXZl3#wP6oxIgoQpj&%_qo{pW*aKB?pFwMQ9l{XZ!JDI^Ez;cm<;wR=yL*Dz%APC=Dlh<5}lt~ zsriDz+gGYglpD>FAGIq-@TE-jJADp$UspR*4R6YXYk!}xf%o*! z4HEwfB#*~NnrVVskMp9qHh?!}!oWe#DqN(OQ8)#|2VStF`AweL@8(wEFM_?Ttv99l zy9+Pf%-InApN-dC^6`(Z?9`r+EH%6nPn`a%*phxWc^77%;>oQ2UumYgndYtN`x5P< zawpa03Zt|MdIfw>rJdr>_;|Me`#c^WJrDh>S$I)}7^grl_afMfAT^+g5i;CWd`Cj|zPL{5*^UR{u@*!xpObYn=r+N>f zXNb3u$Tp+vRJ_BV)bHPEt^ZGMv)Q;+BTINC)a3gEP9La`+hx*bgrVvrbkFb_rd;a zBHr-HK6@2kiSf6!^;LPNzF5vf{S?99P_TaTw@QDjTIikX59?>2YabQ)2hA|`$(@Gu zi3C?VZEcEFCDwak-6n3!aCDqSh?!{_b(<{ zTS!Mj7KXri74WmP#PWnFUleV1fQZpEjuz0d%I9)-5h)kNN7%|wfh~9CYsz zcdTzYUk%?8nu$2u(s7Qq4JJaTR0E?ASrY9 zy?b|{c8+hj=@JzTQ4kf`cHEjft$|C;L-vwtqSEpH+V02g^Z8YXKVaUI|BR&4!^_7- z=}W-AR9Ta=E$@=sQw9_n82@-1rv1U_Vw^MLg=6+mjjd4kc+4U*z17i(KB2!Izw4ht zvPa2-G0YxG;y3e)e8g$^oKD2wZ0{YXaXSM=F^zUgjQ$nWAF`fIN_-K}OB>KLp6o!R z9`8J`3qKS6pMn!sOyNg--s!yIllu9WZ(@6Mr$%pico2)9DcoKM^5<&D9`*+QK=jXI z78VBiCWqR9JcjobRNfBaaH&qF2M5!)_(VPPs#1PiD8CQkPvSBj5+XlkWU%*->j=JV z@32F7;&CT>pVKAmKE6woBP#ZpKJDrkB(GHpE1rq-5&X?$BJ2mPZ+tm{7qn>|Nrug% zXTy9I3liS8DQl@7_S|C+Xwbn;?%PLNUxNO+eFcrzj`fYw3$0) zu(Ds8u>{5My!_HS$FwEU8=TeW%`VRk^a%wu?-qCi{=mL=FUge7tBXfWlUQ?;qwvM8*n~kQz*?K#J{xIjLr)sUR{iT z0v9DGy%^3y{uZE>4dn$2FpGsOECEg z`Cu*3@UGKf$mcP7U*f{`5tsXI*#99U9m_Asd+y9~cC9Svg?T$rzra2<+DRzye7^U> z3B)guUvA~R?Taj1x8UPU^gqh}u08@s(GvbDA{O0ed&N4pHWyT!o`v#Vy`g^AmS{D- zv@z;>el5}u6nuK;_gJ?FhR)xB9)aF#=@b#+i8Ado(L)W-@iTO{(95ay-avoge|Q(2 z(7W(9n^9N`_6O)Ie5q#g$M?&`4cQQ%0Dl(e_xaJTXI`1}*6+piiNdPfk3Lu`%|QKw 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%0DhYDawD5i0k*N=^j({yL6JS{ji*l zx3}@|;M^>XqTL030p?dRTA;S>HT_2My`w;%CK;vtbfX_Gb=e=E@Nsz(>dpIGeX+B# zZnHxEeBp&=q9%1<)rVexT>mGVH~yM3eFXNMqBNX;c5;g(0auzRdpDTj`nHP7JetKP zHCgWtL&R@|x47!1pWYZzuI)=k`Qm>t6mIuJ|i9GHWyKG&R_dY}2hiV9(fPc5=q~zp$QzwJIdS{X$nlj^B zw_HwpFZV|AEK_uEVlFMsF7!~*9H7s`!T_kwD6aCn)UycaC5o3_{&J7+Kx!5-P!Ih- z$e)cIj#;--jHDaK4|$T3mi=j+nYWyepm<+lZt;tzN}WXwUHK6{aR0HRhJ&1FXYdEDK7Vz z$vsr`KA{}s1EK26r;^d-trB5hcI@84Gx`C?u>nlKDALvtr{8t^33nz^`UPr1(c$6w z!&m5~Q6PU9>mHUnZ^Y*#kwTL!R9;o=8*9b)Bj;CHF;lZ6jLcy@un%`B$FoNbtTKa$ zQlS5l5FcUKZ^+;r3=10udJguUUk-0ewXKV4SUIpCpjRcD4rN|N26^`RNFHM3R`|57 zn^~3m!!ZEp1=QQ;s*AgM{HX5zMu2~i|MDSCZ~V`u)(A>I%m?r_f4eaGbz`7JvJ~gv zcO`9Z0RyCntjRs_oCo#57slUba|6uYt0Q@hao+NY$Y73+OCG9!cn|zVmcyif9;REe zDnmhD{z*3LZZ38>V4%AABIs+#9>Wjp5k1sNpvHFN@{yeK&4}~V!u3C$D1`r*O5s<6 z!c(HZiFq{IAGxy_+ogWay`WQ14)hV?$?e2q$70gUZZo`IJ0|B-KbD#~EO<|X{|Eju z979jjzV_HAX8XVjI3GqQWh;e#MwCW!%SHSY(~0!du-|w0QC-~ zcUK$CW z!Y0m-J(Xwl_>=>^yqv%?FkHT;-)glO{V&uTwX?8l&dmJt<5jdCR&7|ow(Z+ivFyY0 z>Hn?Fd111yDL&X=0PY>%E<0?I1hlwuxx9e z-;K%>Jp#pldxqn#-%0@bWoz*w&n+6{hY4(mRa02ipQ)DeHVXC=0sWi%;+n3r!(L~v zgK-)tFv|Pe9J0gLMSwmkOoM!Nv1OWf%q{;QPyBpzqkGob^Hv}IG#G;L0o2bGc7;1~ zBQEtnn#Ld1#)|tv4SKFR0l58P;?;Fogy$2^!GNu>zHF+xpp<=3@nV>`Y}%iC{>2zpw9z&KEK7<84^a zMm{kx?|GU3b^pM6kdMirZ+9$Y&-kw}#Q#tTP7h@f8b2&jv?UqZBk&yHKcMNq(Kh0w zfeOUmBYQy8PvTj2ZDjUUH5hw!V4Qgm%7|)Oddu+m-XUy(luNiho0*%_gUfq05!bog z&t|fC1Arf@XNNuFHxRN;C?$Ra_y9hApz_>zr}7??($HLR61z6m~Q z8!>^tAH)V05*~dtpK2i*QHrI6VVB0Ytr*CE~-#j|(Jds$p|$6vWZZw10H7QHWK z$Ih>H9BY)jtbd1_tA5# zUQMZ;G+>dg$884w0P&5@!!*iSZA#%}4w4sv9uyE{Th@q8dioLnBfF1#5{>2?Saq4q z!08k4kE!p9S)qOJPcq$K11_p|TN?9!ClrrJ5&r`Dg-s|h*J$n3tVQ2rgRIK-fL*jr za|VHbpne?DPCNLsox(B&AuYry?4Ay<$lr47dEX6oD$Mc$Yyf*TMe+4*+PGZ<_!ID7 z)z9Nu>6?lO_HG%>d#K*PfEq7eQ88rXHwX1E0C_+vwc*`hUDQGPQ^XMVUDJrmBkj3g za}3wNha~LLMosg58D;tC{}~f5maDAktSj%Hf_wz^U(C%mehVDjc6dh#*vrBGCL+!z zSl!H%%qLz!>tjQvDv5d*Ov3s?K|TR^4AWDz*u6Qa?_9Uw_gR%U>+GF;ab%eg5;SyU zm#dxtnCRLZBu^ZkzMntc2?{$e9pY`laQIBf8ed5Ij55UQl5qJ+$J@C0!BWeJg|DaM z1#%t4p(B(+YMti>#E&6fxK>)2&Q5FT0s02=%`nCH2tCA8y6;{Zf-hOOgx%dfJEcy; zDFW>W@^{qL*)h7x3Q8MVY~g=(y*ZH3o7^(%-Z_{L?0u~hi~z0^Hk|f*`hR5O(QR4w z(eE2u0Utj@zRz3bMme@nd#eP8m#R@y^vYMlzK`6KXnw5YTU+?b%NBlZSBIzVgV^1q z(5cxa|AwpJ&j%a6e?Q%75>@>Jl%aY6Wo-J*LsE$Fb z)xIi~MES4}`HO*`V#Gv9XE<7w6OR5@=$1cTM(`3=7_*{qd&5M1fgxv$qwWZM@wB}n zw~NRcuJq4fN22@#4DuNyP!MW&ao}Q?tA|79TSUXD)3TNAG_aTJBM3 zP^O}@aqcDN6R?*|4(`vP4(v~z#F^~B%@5jI z;^$YoNAXPQ#e8Qd+c!WsGrQSjassIE65iRUtU;Hnp`<#BnjM$=7V}mBX%>= z^gk4WeP($#QTIWkv#&nzPvB3T+!yS1=hj8Pd*_SvrMjbIGy?nYUAEUBZcqO}ita5z z^;qqe$K1JB0sQud6ZA*ouTK}mjIIWG59*T~AXP?hJh(9Tbqds@6aI)}H3y0-1D6ne zzY+jHp#GwAmDuWCnq)`MRs8+CmZO0hJ9kB{i-LGCvYdP%*&smZbK}tF=TyXRgpS@X z9@ukJ)BhZT`wRXHS1qI020K{(ODLa^JwoV6>picjD=;=S!{gZ)gK0Y?jj2@rY)_y+ z@ILetI^x?mGa|{^7Re*R!6`#eYOjHJw^OVSjLDam*%?{&CDQkP>_PGeW03kPM_Y|j z25n~0ePhTi-Jdk|TZHU$%t!J!c|u~vA;eYpo;ha<_Xqsb;*$>a1p#f_vw;2pK6lCF z%|vFb|2`~ zok^j8qVEx3P4h{UyGKxcJ916TN)6&-Puq9ffIgyl1nEdyKj|KChCS$`;139R>6_cX z+%eWN`OH zpXeja^d|z&cLB&JKrg!*+Sj3w!_$DYp6zZ=&P>C zDL6mSm)&%%WfN_t(I##$5d9PmCwUFLnpp2`d^8iz_ouKXt(4upsd!P)%~gnBLw$d) z(J#~BXKGfpID9*&2+*lhv%=5M7x8Dt<$^*suhHIl%iJ(DA48Y7y_wfy5_V4s;0^2P zdN(KRTKFuh__-%epF0aA_uQLB-t)o|;k;4)Now*_sxVaVl0U#>l0kZDcgDTQL1$k* z?tdi*kd`!j`}#0#p=}znUtl%GN}LxHGq1jF;^Y5gE^jO>+oAg(wXPh8hpxW|HQo5${*uhz34o}>N*Ty~X* z1--$9TnXm|`LR-;Ew;;_h2JOP{$pW{=4^Jif1=A!RTz@5u};%8JI$kNkv+!%eqdkF zO^hr^wzj2*FT9HW5Bhc9`ZV^YCdbA++UFv`lLg%g*w-FN-#^q`0q4gEAe5e7voqRq zj)5}%{=}P%9d-MQa}Ey7L;HjLfCx_M#TAqc_c73qA^yGMj^B&Oq1fU{pbxOW8v5EQ zuPv*1oa%W9-x&eYlO4fBJZA+Zu(yDIt3oiX`;l2~y3Z&YmE}U<`dew4()w zmq-?UTr!u^@!%xbr{VqcE{wka8fM9SEL>oHS)G}nmTA1ap|-^g)dL0lkNB%Ko93os z6Cp=qOr?=fZSNiL`#l)&5BO7!%S}z?G(l7E=M#ISC+NViXG^v`H>AMtKwoy`3EY!cP_k`5sNn1Az8v|rvwC@VxSA=_ zzp?t_#+!bpb3z;QQ}Oth^McGZRvp7zmnc`F_#okB`ZwRU3$>K8qdn+-Cz1y@p-`lG z=%#ohz+X0%MDOx4Zr&em>*o#phYIlxgCC5Ri>v$t|3>r>>_fhq{9eI=cR6@GvrtNu zBzy_X+s}P5h0aGf$ZF$g=9qBZc_6QVzq~VyGHVmDK`Zht+z-%~@1~WGdmX-4Y5j2y ze*aYpvGq6>r&m4{PrB^Kc$u4<4bLnmWB-C)s=q&);VZ(urGd zzN(tHK#+p3=O|?ptirvccX*^H?hFmr7KKb#d_y_g}yEf~l4nYWQ=0jJg zf7kmw82F8j*|*Nz7@+r)*nahBZhWGb$I#O-B=3+1`9=Z3dDX;Sn{uGv!xyp&uhWj* z!o6Zbfp`Q4=ri9PURphA)Uga%&2&QXj<@=VQNDHm+ZU#YX0OZp{UpUSFniG_2?e zFRqqRaQ#?i)8psPOB?zm@!+3E{fW3msrS2G!M>OS@C5x%_iaO!Hz#P@zVd1Q+oS1E z3^P9Xay!yDUxNQbZmBN#F7z%EPWP{B;})2lxAeTi7U24Ob%N@^l&3Jms2cpCD4ugh zzhTCIhi>n3;xg|ce=et)dXs2%{&uYkemk;H8!?(h@Qxyp01~mc&nkpWb2Vr z%%2HMj-qkbU*r?sKUG-8b;38*2FV--}xC{2ct>><+AFVTqU1 zoy^dX0H)I$_`e&iM2X1qgG5;ym){3X4GMYsYsFnE#A$h2(o)Lq555zTh5QkCJij8L z*Na~?QvuEo`6oZxI?~q@ZszfUK28WHzI8m%&s2?WSP_BbcVTs~)r^7=wFkxxc)c5J zkdkq=PjFK@O5&9x`$DI~^}pll*2-r#gZ_l#{fFk6aeMz(-WU*u=o7?urlb)ENm_Zf zVE})~k3VDa%fGkuTTt9%R8I+0Cipr8&ATCO6##y~c?=g2+9YeY%Mb1vD4mRbxb$Ug z-qaLB_^?^L2KEp0e^f4E6DYfOEeV2gI^akDv$P=k^8F?3MY7XEgJ!ck$UnB0OIJqu zMj)?NG*g<`?-hNtk^b*=)WNg8UBf0M!zip}Hmsj$+U)0V>Ue~qAwcJe)tf4MQf#}9 z4Axu(`X+PIC3#d*Gzu+57a!sKS21Ic+nayvQ)z(v3G$r|$(S#-(T!O8!wB{R{%{gmOP>O~4t*H9CyOvHKK&zG zmXF&9M0C#h_uJ+%H;pcU{0{#A0ZqXM#*}Mz)%M9Br#Ies;eQF$S8s}w>;Qa-1pDA( zDO;&&=*`xRh@J^^iA`zhuS-vK>HhnhSzpjwoFx2$nQuA1!0F%oAd3^*>LY+@JgN?U zboWk63($+9h!OW$JbU&mO@Kexk95UtGP}<;g1^VC;Cy9u)qgA%7j-9wUK*s}^fkA+ zvaB$dw(`0P><`&zW<0kv(s-h%m@@?X^+xsMOsm=%jygIg!VN9rcRt?(`iO!!!W{CG zK;OpX1?BFP0k(MLdMjEV>IwPD9JD$zZw-31l*98}Vrl8=CFbGQZfg<$#BOy}ve_-2 z5sqOUczwRhnryMBNJW(S;9E;1*pJQFjkJ#wdkI5Erhvbbn7sMO$}{RLA{1!B_0I{H zwe$TYCX|I{A-KLTB8Ck=^xE>R=&23j$H4!I3~JkC_|fVL{Qgu+W`8YJueLdHkTeZ8~U`$zf54?l^boUcO48Xngn>mctTMrKmRl1)W^1Rh@K!1vz{aqid0P$mEb-je~r(qRfB%w9{U|B)3-VNKf&YX4 zmX-GOHhpg+ha|+`7^?qPl~uOSN*#-<#>W%i8n*I-x3u2I@Ook7;YaZnD+ce6-tnl# zzn|c8PV}}i=|+F7MDQYmd^qy$1ts#3O7wL8pXyuco&R~>yXc}<4)PqcYMrmV zDNBUYb91voLdW$S);vua^54P!8^+rmx2rETk3slNR*jShQo9LH=LdoO0q3nEkD{Je zC|9oDkO%k+{i>Cel6OQbJ|VjOZ3WUN0%)x}cI|S^b^103`GYW5n@1F@AqU!Kk~8k_ z>fGqzUa>ouW{m1JJ(<8JSx>!Qh!^AjY}gC|3&qTENujh zEHNt|^jnBmn00FEWNZExDWhvYdLMI4_hYoRm$o#mN-9V9(PGqK^VtLbclgbfJ}Us8 zL)ii*Q~mYEC3b2e<@1{jZK_ed1v0OwR>E|71N`F^ml{yrH|Xc%Go7z+=NYl8GI@T; z?c2;Jh~Eo~TSf5(hjwq63G@o=UB-i4bvAoz%WJ47DSQF^bAMqAeU1xd=k^o(FNfzHJdg} z>16``K|QL=ykWM{?7I;^NWdRZJcNd;jeT36>Ovj;>3T~2@eQTgWuNrw_pCtrT9@+G zg*wN^_uJT+;rjLg$%@CO!FM)%2nYEJ=#i`cO`_y$Lrn2gfG_lG-2dDwIM`GzKjSX& zSKA@5M?U%IahJ*eZbLs1Z-AFn^Y$$lf z{eVSPIPEo-AgpJ9*bP)GH)2rMsmQ=y`&=5AT*ru`3>h+neAxK`sYN!w6 zHO3OJUvl~$4W`Nfxe@7Wp)l*TzIEv&A#dTqwGZAY{FEm zt(xxdteRd@$V_yzHGbyGbbSrHqlKV-? z-Vm(=s?8vOkB}WlQ~Cs12APL;!Tl4Cf&6>MpOajt6QF$&m;Xg+zv&#Qc810>8LFqx zxJ<0j4~c>FNKTu$TLxd;yD6}lt(0Q5~l=rg^S`F>G1 ze*TkDo)Y&(yM7&_;$z0ot&*K_*AK?WejM=mAJDTJMWw5SUMm!LmewKqjCE?Z9icp# zRaF$p!Tr^cpVhx%AaE@3N*T-t{_Xxi_C~e(u>7~NAdiE6Q+y|Z;Cy=iOF8I6pii5t z2No!_)Tw_Wbs&1kFt_O>CaIc_w-N2rhgrjX6num3hCg8Sh)A*|U-AMktCC@?*kj`suaqDn_qWd+W$}wic6h!)O>>!1Q?`9K z|F|WRpP_#F*RoBFV#!uZ@DE{Mz&|w=7GP{?{+b<+J?o)=z7rzmO{M`+Q!)@nFYiomTh!<^%DYj6nyp6s7&g z@;(Fz1bfX-PK8o{SX@i3UeQ(nbhY>h0$j>*IMtd65g<-t; z^H%`Baf&TuzSS{vOlw>9Nu_9EbBrt3IiIElUmbSybO>L3c5M)mp<1`wQvgjKRCZKOVfj zV@a+0fBW*UWuIxj*`IRO48r?fKyQhpl)_IXQVFUL{)K!jhDZ-qZOX9So{RQ3W!^YN ze>G>W0j0DS@e{KA4fDb*eaaZk%n;58`n~dttStAsre`%|O!ss8=h;SrYxBMEFQ5-2 zdOl%lL*yA940fe^8>z-$lcV!V*1agwIzBDGe{qWa$kpDz?{NTHuMXlJw95Px3?9Fy z0DXdd06}Ro-7w-859+@FJz)%5(r>H3v`Fgo0(#CFCLeuCc+`+D*wZ6|cmkvk^eiOY z^y(ul*`k@TE&NNy%HxbIR^U$ zcnlfxPVKTPUA*0`9NA+g<2=7arEM_XXcvg|WpXut_G5yLg#F$>V7gvr9!+ZF)I!%pmfv4jixt&>u^z~cK4y|m` zH+tSeT%H~@W$CY@=eSQ90lYz<)P0#+mbE$4q`OoC@Bw+ptn>$a=bG@vYBKmgO~@~O zY1yOY$SJDg;^#f_PelQzxUJ_(NTr3s+4Tm^uAu+^#uN=bivhpD9x^e{zv&}oM*N$f z2!4#}f>~_&XMXKlVvf>{j+muG$Y0c^7r|drz3S&NVZPQaJb$15q1+jr57f_9V2F1H2}Mq~xcc?0294IlScRH2sN&hDwV#&3wiH>=)!i?2+YP8Zp_D zcDluI?AqOj0-9vlZ{edJL6L<5qi%rfe-G-Dk^ivXHVfVdf7V1FpAgMaGWg$V<^$Bv z?)DW$WQP+pVa41Zl52&_TRH@*=(xU@Y9^KyE0FwjA&p%*ZvABI+}t>PT*`Gnc=oMQ zU3}?2pf`hLsP9Xc4DRHmZ*vBI1o`G%YxU6F2jyq)x8m^!&(by=!GZ*P)Km8XeTV)} zHdenrs>eIG9lHek1N)AKxY%yTKyL95h&Mp_=mU${E#txTz(`~dLt|4OA*WsZ=+PPY z|5T7y=kXp|ww-PL@d5EO;a!QZBrBe|Pf_cbPbBaoSN452d-4ad*977d$S)yZd3|AN z70GRTpL7Mt+hC6a|LqcDx+Q-B&c9XF<-A!N)vDanvVA_oeG_%nT_+ci$4#~){}klY zZRA)g?oI2;6iSdh$+%@07PehK)4)#-^Q{DZy0FxvW0}>}w>s-_dMi2;Z?IXh(0S`5 z;0xGysvFwMxXZVy>l-K_e$7y|iC?i}nFfDeT>`471OBPk_(I2s?aPUmLF0b>uKtbpnT6t72m(@HohN zcy7ACfbCn;*@^9JUWpIPHz}-EW|jxcGdhsGlo>{D5$($ZPaG2zoi5@8+56_8^%$z&M?8&V5{@roQE_;f6WVSn z1{Yd(n_NNbW4h9+`#ajZS>zz!>9Ie(<9C38W$-xYACTXnYQs?~^{!wjCe3ew^~u9w zH>LfjXF6{x;ZBbw$&WuCV4biw48!Gj#fZ$iF~_?vA6Q>V@ycHb`ESJ2kQhRq6g@!6L|40C@!b$2KGh zqdI!=+E!eCbt|Mv%UU@656=<519`ldD)U>uSYqU;h5v6SH>b=wp=4jDcLN@;n82&j zvd%Ga?iN+!@Cy+4$1A;Wx4eP!BSD@sH%sv;FENVIyPM2>2>LkKdsy>N$Cpv_2J!#5 zfId7P>4J@q^CJ*H1^vi9%rMm=tlQNQ_zT24C^b$^WS3PemCZ-;1Jo}j=vqrmob|f$ zaD8LQ(x~`%hih71Xc+M83C1h}K`VWOlF6q3ooJsPCHAnkv`Cq z5$slBa-r)lqp+=sATN-qo!H6W-248iiQ7L2(EY{&)GPnS@)qa3{hA5#(lF!Lrh*G+ zq?yVeCu@N|dCR{n3A7uvX2q5SY{ccE^BYrq3>L4xxOrS*TApy?5^N|b5p#)^h`vC* z;fqQI{ch3j^}$FUg?c#U|7&&ra>?WXoF~YCBGwC@hp+F3rV|ifhV)mf?qXUW%ay*# z7ttf3o1m1%(W>0AbmUh#t`CP(&sV2+R`rV%aed-^>kCu*epZ+HXbGH$tge9=?i;hv zGN)$cB}DJ*YFOfPX9u>a>@7t6K|bYbvyq^+y*gycFDja^F5q!N@~o25-6?;8dQrCS2a`Z^kcApKz)Ty#g%>C)@rgq?pCDlW2DB$>Id^lm)_OK;PPZmgoCcfa`UHe za{d5&1Z0Cz?y0MHNslg3+5qSIqpp-PVwF8xK#b<6m81C0ngZG;`;;c!m-!O`S&jq-*}C&~qovns+T9P(DF4~f0DeUImp04&rVBk~Z&3di>|h5r@P|$5CHf5IV)3;6>L3a)Ufi&= zuZIQakLq{WsoX#077)HV3#Sj&F+tH52lkx!+?fOW1$iylkN8T{z%WmM(-YyX?C$6S zJ;St+#{gfjr#hDGcHVYYc%_g7@IdiBq)-X%hF8bIXVdoUYGP*ZA&FqjOF+T(2NkhB zuW{e%!@kq{IOKZvQ~u?nbMvDncN*!lLPwjQ0w+pU z%&F=sv_8Z?%;|Wj6&CW{`6YfohZ~FrzF)t2vG-!q3Pg|1c7a>2)<5c8nk_#A*$XhUogQoH2Nu)yRIj7; zFclT0d^_Ia8?X5=sfi)T)#8tt)s>0`q}+3%|v6N znIMp0ylXD?ZBRFw5AyRUDI{IFDZg?b+Aro>vVz6&vI|Wn-2nX&BReK{U?`7Xyl!Ku1Ci_UC~&m!i#TA^INUiW-*5BUE~o5;!XN;-HeEzX*fNX_suAi zdOzQA!0!^mXQ7Bb`;GC81qrXwsw+N{q$dSK0Txrtykx$L{NC>wKhYv zYb%m>$a3x|t<8IV#G9ELVSO9Z_B7L~yI^XY;jmC#lwlLqJA?(XC@0%;9KA+j(r zrZ+YY8^B7=^og%!ApMD<@}P=MSTscOt5g7dlsTz-8+!&f2_pLT!+9h9?BhZ+e$}af z7W&2M{oTuU=&oWH>Y?~s&=>!uxQw;``SC1v2;#*ZfBXutNiG|woSvzu#DMz&@`3~B zNZ6lqKeVwgj6?kI)$BbGZ}8vaEVHo9VBZIO{a}Lz=eO!ks{k>Yk8vfYK_lh!J#I_Q zR)8<)e^w>R>dEU>7whW581g}vd{&z|+m2US8n|fYnGFSLBo35kBA;KPv0#;2+{0be zM9xp}r>pz4gZ&AE^Z3 z_mI6wS%EEDvaDjBRW{tmVWEq3ow{O>W0t}9)$8eNb&LI7{l-8NI$_ooOyUy zH@@T|e+2vus9zcA*Yhthj|I{XvRF$jiaSs|3H7;9z5WSP4^K(k#=s!3FCzP(?zmyw-*MktvjKh}pNlkS#W#Kt z#Qt~&`JO2LeED0M1^wu~Vjr;IApFNnd4=)q%Xdb!qx*}=6K*CaC>2(`a~r_vw~CEJ z@sR}?rVF%O5WmO#ACwlB`b>mmt3;F|`tL}fgwflqx%aK|T#XiGGCPg~JTqC6o=v3d)KOBu&fhhiup(532K9#pz8d6;g=Z)gS6=;%ciAh)fc18F=F69a~%-Daj zT&Jl5*)zx!&wBrs9A2AqC9ezdXW(a6PkfhErUi0aK_2{xsf@GPW!evY54rg>*FwET zOyjK~Yj{>|-F=h(-s&^UyHLL_Rd!2J(p7-p?P2WKbzQnrhojXs7?8+ zAq|bmiwFw4EjJWWt?Ri+{|9~DppCxurkY14o-aY}qX?a;{KOEYwVb%4Wb9tDR|WT< z9nc~aG=02#s<2ua@WHzaOZlCYT2jU=%DIj9gPF%3`Q>|li)6=1fFH=8<|^#arrB04 z^A{{Z^E1p{o4Tt?_U+B_gZl&Ztj)*mI{bFkg&I2mK7c%_+uvSlwArjO$cl>eAI9*b zJuC0%Z#iM4cmc;Ra}Uj+Zylpyl?s*!U$CL11)*p1&BF9daeI(((vpxx7%-{GJCD~h z6q*M?XB*lk*tA=dW5*KgpSn>{5GMA_~Jc^3HBi1L^p zdtF7ylDnXPfImz3Io*MN-fj;!4DKJuum0hln)GFsU)xCDus%;VWYtKaS0{%@p#G&u zei>Tk{j;L5?6WI{R4s;2l@f}Pp9VN zQTE==c74e}uj=J>=LPe7*;<{{9h_y;`g4-zKb0|_Il5{;@c09Bv(HAsH!U8uJ|Kep z5Bk$HQz9*IdGwMC(X@Q`l0FggPc2zGyD-2E&Qr4sn>g;h(sr{h!TZqke41&rBOlCK z)yZ%kC?A2xF65fj_nTH5BK=M{89~)Gd9!P*WGoNSPpFqvyD4Nb^-OTM9Is#R=Aq7B z#}q}Gzr*VYEdst;D5nC z-${{aP$C4r?JecFKH5Mjw({(_m%8{Vz#H^=o!DT9>_I`xeA_?p`VRYfg*2z7=P$nb z(;L|z$af{BI%U%L0iQ_c@OX7|*Iy?ZU2k``izxVdB6`vvUm{qocA727o`AV}Jo?qW zw50M~SOywHKE%OqS^a_kKDZf#{ueV}!?r8eU#Qi+PX+lipuXVm*pWY*5}jN8H-T{q$N{2c|Q%?C1+?a$10M)(KuHRUPs7RE>JOQI2ekacYcHjm^bE@zFb zaeT|wWE%9iJ~wE%7Q6!fkF4_2EW72hTl05$4(`u4r)g-W^tT*-A9xYq1N8}bktW4G zRa=95`hB1tHDkZG=ac6A$9oQ~-njzs6|4Ey7SNjS^mSQSGrnI@+*Qq#g{+I+&&Lw= zRd*Vo{_VeXXI?d0e;>h*EHZs*vogObA}=}|?H8+|chEfBRq zWU~P6mkjlq#;s4?rS+P$Bm9N>oqR3o@{Ys3gfbjo&0?dT&|moNaV@>mP#rXslG5WuM?Xyb(Vyd2wKH>p9zevy*I; zA0U)B`^6-rnNjqr-^2OK)>0^=ceV6yRg@3qZdx|WLq`5lC@mWXNMUF1mf<;t&1WSmz;$CPGD{)?pQZoElCS7p`tOPCN0^+vrnM0#{~EV z(q|Wl3o5rZxF!bpBl;zja-)7!`E9)WejV7GARfwGYa78TuU9xHy70}uS*asRktDi4Xdf6*|D_(?~HxC0q=u;{)$MDDf26Ho+15d0y~hN z{Fmph!qZ+qOpyFRzI9#y!N#SDziu?+|l<3`pwXUdM|@6J)u86b}n=&$8L6E#olkMI5P!N|2d|^`Vimn-J!qq z9GhL069)7h>dUmb?EF}il~eVG9>44Im0Y}D!D^ot2j5<%b3e$}O=*%fWmVxSSHb@X z`t}!HDfLd1mGk157=Rz}XQNq}Dy}uD?~D52ydl1uODj;!vUAyS(FyQ*f_z}SU{+vy zx#hJV$}Olr?skPw4vb1TUEJGuPp=>R;6gB!%bgQe0O15z$OGqKx3?o@)s5Cc~22Gb?#@Jg$d&*YV zo!@g_zxnTc-gnM>&U2pg>`S(3mv2QdxyGm+><>u)StueF*PKjy=%0b$MZy=Q*hU&J z=e6H2hW%7Qyt#f-k}qx1B5l8FI8T!Df78}GpB&KKd=14Xr+~h>>T_FCDm#n_@M0VT z`+`09yzBn$u^lw*Jf%eU0JocU4zD(BMe{>Ek}BcDDz%)7Ta@_0Bl%Ywqaf+pJVDx; z4fqHA^ctsJ5G7QiuV@X%=ylnps_f$*Vh*6(rDmsVF0{;*;o+R z71cft^Q!?qF^9Rg*la7_kxU%W%Ucru;rLeutPp0$p-+91A?0(|O38rFK|ADQJ6&P@ z&qg3Wy3mYL6n8080`Q!$cX=)_OHR*tBcJ7p#xZsZ>Z*|!c2FXwdfFOV>OZ~01{)$h zJAnS!x;Z(xH>!}SS|(`B&!(NI-73IQ>Yl=VLGc6c6pL&%6)Y@%1N#Mv=kJ*{HWs?q zm*nJ#_V&c&Wg-97=<{6~s%`K-= zEtAE59kGSEgKSVZ}6I@hJ?Q(&BF#51k_q zuAQrw?Dw4YLZ$0B(VGt*|4(1pJE0y7Pp=>A_sG}jd;gfd*e>H$HyQI^=sdS7wSK-V zAN7@f@Ps?T!sj()-_iY;eZj>- z{7FCClCp}2<$Lm7;%+I^u8QXOGW*ZAV9V?UlL2R_H>s@1SQ zzOq|aH#IYZ-sc;J<_G;h%#V58F5;Q1N5LbYzp`J8Jlx$wy=dVsbMXK&MT5*DlZAfr z&#I95MF(XAKANGUJ16M)4mvzJ~KT8kjy0BMa#gX{@4X9oMQD?k6RvXFZvIb&n#EE&=o=G?C!tRG3b+eB3 z*v34IvDWx=%4a?|pleqT7wun$pA-c@d)K_JZ+tEwuJKrD{sfbDV?s0$;zLGuw+@KS@CT0Q<YE*oj>I2aD4O|=m(RtS&@&-XoD5UEFRN=e@-)Igf&^B9@jJ@ zmxZujsE^Acv?r@(9LzhQ2>&0I#mAQi@|Gkv9pxeZG0`+uSlKq(w&~mB`+y(YCu0(A zvPE$}t0_g+SiC<&+qS)n{FlJFbfXdcAL7ZI8&Y=U)USQLDG~8!nX~WO%z^7BOjY|) z_}(N*#n+}*Dzzl~Yy|xm=9fZ!|B5$Cis{^MNFL@-a-N5=cJ6RlSz~M|!;dn~)cZUY zuIAC+pni0aPbww$AAOy>B=+|6T13wQ9_9C~hZp3IO{Yfos>JzcCjwG99L@GwLPYif z)Zg1Rbl8;czyb-@a+uVZL%XqAB6~S2r0xhDYwA6N@;uz6!4~#TE1T$?5Olv}aQ<#~YdYww+8e?D4)Ya(G4kT> ztGr)75x$XnFI84{U%j4~mT|<>1NiyjGZF1IanX_1*>Jv~|4!Rb&6*VKLl2ZiBYV57 zfviyzcsnP{@bFR09^yico7GakoDzq{M^hCkU9t&cCglzD$^?eYh@LMKZ^ziiw3?yMSp8u|T0Hb&pU zUskR65BthCjVp*=LO-;-MI{4SHrHzRS0j3Ija78ZQguBk&{Uw10*;CmiZMg~4A5k^yxnMH!1@YS8;KrL9FL2X)FWdeWT%U#A(ksz3_u#nZ?Y zS8163-m0h(_+DpB<$(?CAM81QczL@FW^j*CeinlKG{$%G@b3D$+MYMhE)2yp@&y#L zg>}zyM-r?d9tGaVwVWL+T5vh$V>%i1AHa{nCC5HJNv+$nu@dX2o@3u7H1GQuYb1?SPwck1s`jbGuiugX{cbBKVK>j|&pSf&WP%-76Q9~{EzTI=R z_V+$DJDq|kXg-->DZ9CSX!k?Nr$YAw>@gcnsY?lMm2{vFz|WQA!9F!Cw z$ENlD+LTh)PV28&KcmnRg8S{E=329Xzp7=VADgeeWmyxph{>+E90b8&yqj>grrWQ># z1t&wDeG&g=T<&BSRje%g<7(W+xWVa5x~F15=1n!-aw$5o%>Z~xc~S-Z7!axR6U{mR6`F4_~^?ZgC=cohG@7!g-h7XMsA_F6JmUq!o$ zP|=*Y+DSEC4*n1N9)5&rW@z;zlva-D52-vq>;s!J@Q~{lFxTI@i^=i7`^@)Xru$qy zg7$o|NTf-ty7LO)$AtYGm)@_A^Ko)^LH}n=a@bZ@A*4fjw%ob?@&DXmRSMK{dJmcd z{KFw0K*iQ?M$ zfWW4oU9_*C8!f1T?`yz%RUWt+a(rEAK6CK^d=|x!Hn=0S9`Hv-hkWVx57(QyFEuKu zF4#5<`fFKQ>$or~yNa+3!ZpkRdf72kGbqMMd^lHRVZUk$et>Vy035}suew_ic@9`Xm23TpzH z!}~6#13sbnk9iL`Y|FxcJ-TbO_V(-#$b$UvUl|KjuAFgup5K$0c^TFJ=W9r-r=){zSllu*yV*$h zFAbesPB^DKMf*?oE2q}s&Bl)y{cz#d_)LfwB)UhFG5Rx-IWBnC^<4M{`cHMheHv*c zkDa*P=qi%_1o{p3s|Q=u3x-S*{Z)Dae$%p31adpe(IB)lw+XvHN8CcaJ!RdAv;`Dw zJf>mz>rcO&x=uR3$9CwxlFIe{+Y1x8DT6z6FnlkMI<t+s!DN!-+L8;ZsZ9fAXm ze0aWJz34dbC!n|W_iG3e_pi?W4}rgc{a^fdLXnFVxd>N?J=f8!kyKviQkEBHqvwn% z&dxLJSJIl-3z&ePkpFG0N&O?G+_>Zo@E_2(8tj`K+jVSCSU%l__~R@-RX$1Xk>*7Q zIZL0VGb z2>7GsD`_vhr4z<~fZz}P3R1Y-^bFrnMGEW}zRz+M^aYmC(+PT*{-!LcOtsYv5EpM! z!1OyEU-7^n@&@vCM!5xl55wHbpE>`^{64U?=fim+|3|Dk+lP~|vOXHwuNk9-#XdoU z&g2`u;c(x;9`NgvMz=WX*1hEg*!PqT^i92jT=++Wve5jDXW2m-MP3HVxk#U9On>vXG5f1DCE(ti{;Csw;)M6{d*JVN zottm*f2|#^W@Sz{_;c?os;jH2J5lKU-vR%RPs?PzlnTQ~|0{8F?&tvg)lo9AUZ3w6 zdc!#kgNHPBw@=wZbBAr49T0zz*@64({bPhvWi=Ck$gtN`wE)fbF?-twsFGpQFVML#MU={JCyef>;)j73f48RUGLGC^m?fc z=Ko+Z;|l-xrYXxVqzcKKGUqnewU-?4hMnsHd5<*1*qv%+HIQMJ=DLIe@R;UL8=se# zJHPQ@vI&f_c-DDwcYRyPYeH}cKV|s%^GA%2ez8+ur-$?bsJHfE;)I_Ub?Yt>c7N^S z6Y3tOxG6>e2&#~jr(U1y!Z=(i52Fz*50`K=#C}2F9OQ?2h@ed1qwtV z@Y@+uJkC9UHk^=uv@sH$4`XzZT=Be@mhpsp9Z0?+_13f9E=9i$w|Ki4eINSA@$TQ9 zZ@u55|Nr9`lGxo0TGPaVg)`XvQjIpZiqK1YcAL^seE^2t>K7O0tG7Fy?9D~;f^3vR zsTalhrqN?~Xuo_N3-)f$!omMDO=_(76|oab>93Z9{Ksd{6(W0!X( zVEkTbYaM|o*4m@n3j6@%V|;wwd$$bA*QK|kVZFfLS4avID);*D@!yEayHG!V=i1eN zJ;eSD^nZqSyn0p9koAII?roGmOj6b~_u#D7DZH{_6Tlbl!`Pn0qW5x(qe`*-e_7e3 zN)hW|PR1ia6oO}rUATL)-O_qtzlkE?|0HR5o0YkZyq4=1SF<<48l zQIMaeWruws++m4<#rGnL=OXxCLxk{&&AcKxQOzDS=1Vy(#5KB`Q!D*$fcyab&?Cy2 zXgo}?T^EGt4a0BTTv6=5T>3^rNBTO$CH??QHQFI;Web8Q_-k3sZMA(hDnaJo0AFWh zrxa4|nv5jeS#b)pCorTB`}`l~C}sxx$Ai8E^GA2GgT!V!uS}5s0`|Aa^+xS4-OU2# zpGNnUq|-d=XQr&w_up6~&?AWd4Zo#V6o~&sO_u|GVN_CeP5kO!iA#XamA|!iU{AKevR9SnBkVtKs!O#;J`~)f|X1VE0ZcNKv27Mps$@9@R zc6=%Qr!B;vZJ%s9z0~S%(&}BT{OCe}&kX4lF1tOF@7ZDjj8p&N?&7R%Q|2Y3=ei0C)ktf4Z(Z&gS5^s;Z#7p8o@Vp;h?ajjFUa_xD;wG{3CD z#=+~?kEfBr)kH*}7=E^d_W2A+;?-)vw|fxZ=;8jY`+;plmys(vFZ;;}&pN`(WjkW) zwxaq24CgarC+PEhYGlW~QM~}Zt*z_Hb|V|xNwq#SKOaXBKTxkru6YxQ>xh7Op+-~M zmdcY)*EhXVK=aLB(>J3``OFV}x$+R=cMSYit%_5*#ST}evHFNW-*$Ib4mFAlcbEeF zK>iEw8LGc2An0r}MfeH+9roR%H%byV&e78X_(4O-g*b(vynSzck0W?7u00_?>hdr$ zzLEj>`*f02E*x)T4Ky(GB0bRhpngX8CNqw*N5DZQl7}IlB+xug%JNvH=YZ^IP(MGZ z&es3()UV@Ue*yftW=dc`IEi0xz3vpUSIw#rD!9SJM$~@o7oOF?Z*so*JE=S}BE}vs z>hOZ+e>m~j?B+exfjSD@2e22k7|+vLmPsww2}bmQube6{*Sub;5_b*wIqXj=EOc{w zVNTAd2}SE6HBiVE_b0ibG?c%$d0M7ZRHV3^rsqLT`vLcVl))>ls>`5W{xh*`H{#!< zcNzu!)z`{8N$PC#7_z>?etsc>#A3F;ETvUJD zaNLwaVFWl_SON1v{?e?kPQ9i}cX&VWABgvA=4xc$p0Otyzx$0M2_K6G{sj6u z{}a0^OF?Dy`eX z&vNjY8&^D;I45k|o?A61KT1m6P0g-aYYcWn{D2JjJ=BX5K+!i=1r5&coot54^zr*1 zG&(`$Blyegs@ymm_TEc-C((fKr6B!XKj}>CgP)s9QT`$HQ{2z_!t@Epy8u7o{g|Cx z8Y#@zuq29^ z-QR>o4VHz)?aWmYu!pZ5g?d^|ca!v3IcvVB1O0(|uLchdT(AD7r*LqaCF=L&RF!0P z0?*5Q^ni|@L%o2mzM2uEQ=@MT(D{%?qKG!?+i)zy#+h=JsC%nDaIYc1pTRV3c(PSb zC-O!~5a{QZDY~KjQ~oa`mwGcI7&6(FsJtDKjQ}51KmQ5G;1VuF+!niOuO#$ZCheST zYT~&!*H{bW5q0Qq|BY4d)+Ht*D1HSdy56iuCD1j&=}$okLby{{YL3DXIiZp zyR=Fg1NcE5OQ}4lis2WpvuGY+;bY^jO-#g}`DKNIHqVz~{k;4vLh!Pr+#dA))s3_F zPPt<8x?eEVs}tyW^?^MM(Gz76+1))>>*W$FkpF;w2{=AoLizY3MP+H#pdZM3LQiyA zB{-(r2y?5EzG7EYuJ?#sw9VW4Q-KiT<-dH0(CqRGIvk_~^a7saZ5s%K3F+Ikcz5UO zso5!Pt?lU6)hfM>*;|z-9cV+v6&JVfh{V>9Pi?cv?w()W><0P<==)Ny?HrBoruAK} z4nVJ=URr77omrWG*+&z&@1UPcHR=d^7ZDTF%LV9sWG-zLY(cm^Czq=N`EB6;_4lsW zxo3=f@BCl{@T6pw+u2zgyowtrtQ@Po=Yey$9kveWs!6l|Q-iF?I@I|(7(P3c|9;r!=n~%maystZFC-X7+bwelI$NzynVUdD-g{BgXxZDz(U!Kht zh3y)DE1R0@C%AAtrjA?LDUJ@t<{LfTUg1uwXiznf2mFEjeds@ZVU00atLD($_c)c6 z)*~WC`XtzAkUfKFMkJOrn0I#{K>G)NOE6<;S3JAA=?HqxSB@Tc)i-W8t?B^z0PG9O zZH0s|@wJkV{{#F5{KB`@{Q4=n*!gB}9;Q!?8j~k{Rqp*)x2p%^zoVR@DsF}mIg?80 z!1hZl8Q7hc>WPTie?d zE`0BJv?B%Vv5m7d;gaXMmCZM*vHab`zU_~;zfR1_aVY4QM(0g0 z{?#(|0^lu^(N^w*{3^JAI#rv`&C+j)ZAhtTy?i^uJfhiEA>9tqOQ?q>P>kEBFx1j% z#QXpH)FteyW>o{@&Wt7`pF+OKhw;AaMot+gPZT%|!OZh?tIX7saD@ke-obMLXS6Lt zvyuL*nvUoJX+|+I>7thluYMS-Un>LuS(U*}t%w(P*%*9WBZ(Dy2P-e76B03fsdta7 zyZc|<{cqeP=sxnL@^Ntm?nb6mTg<;r60B1-+Hzg;(8t*r#UDex{JZ7bdbzGHwn^yx zz(2B(FFW^0we*K8Ca*QjEO9T4zfbu|twHxo7Gm}NmV)w^Oyiy!Y`-(#0&hoNuBONA zf#;wf2nve?`tC(~twn3l`H*%)e-2GmAK$Xm^~k=%kPbenBrYPRzjSj(@(*8HxZt<) zY-!?A@>ZZHll%}#9`~`L{T-=YYDYTAd*wn^qU=)X#W=!OpwE+^NvXg(jR z<5YbG{DuDQy@$LX#jJT3UGY~RoDbM1I^7l;zLoyR!kH~lqM2&Hy#~;DPJ!Nds%sw+p{w&qqF;)sXb{ z=bprCWAbSN(}b-hwe=Wo>qPpuY~-c#13BrIm!H<$!{o(=s349({*GO^zl{+-F?K6# zqM97w)OXt&BmT*s)}Wn8j9aPYeI57<@Ke_+Rnv)L$8guRixEDOu5t7#x!jHEM$5q- z1OEPL`qlJjgvE>Bn1DYI#xAzPc9w(^UECL2;P3|BSCPJ1O6j(~MtwA&%+8{#LNBN; z6t^y{8qKfb+wbutsM728;W>M4gGRymM@*B@5AWTu{oo~kSNzyvfa{$dLg&GdeyjTT zMC-vlQS(YLdItGT=Cr0&VRDue7<~~?$T}U}cX^99rl9vp`0;M)*RAdA)U!h|_(}(> zj99;^Nk7`o)q|0$jK!Vz*i9etWOaDJ{C-u7*=^UH=sp|h$Un>I6&I_E_f(w5JDr95 zJMrss2x~#yplM-imM13f%+R{tM|fosxho`|!01Ui#MY%X-BP}8rXJ9z$)-zOt!cTe z`&qe{2Y|j#@>x;CDJJ_{y)&WS0(_5T*JkZUEAv##YX<&yZ-&%M(eHZjo0-!MXFBq) zks5`C<$r^6-2b2+&g(tjd7MV;2^qWBZ>tFFfqvzmRf`ICX6!J0cM9P@)W0mOu>R5H zr0$qrE!#E8!2P%Lf|tw2!8aRl=>9TXd_A*jEZoOe=4c>zknn5@jb~*UhTl&``l*bk zQBYN`#r@pZ@*7$o-!3v@ebP1~)6yD!B(KY)t&zeMg?kjUHQ|^&ktL?~FUFtBU8!*h z@N*jCcL+^&*U#JZjVogEtl#skZVMOI(EHsn|24yIT+O^~MdH`jPfmk;4Dk%DG(X~+ zr^kNdT=LD8Mg+S?0?ufBBJ1SGqWv*&kl$!-L_C)K_a4uqD4xH0dqvU?XU4tlS?GKK z-V4q9QvY_co{B{Kmqp)5Pl^*ohrh+?qxxv}P`|KJut#yv?!{Y?eqrBgoSba_-<9=a z%F!M@qY=S>gn>SCyEF3h(EbkKXHZYU%$!@=e)ra2VmJ>JA6N0{2Tmuf@}w=`>x@jh z)O8=n(fXM6Qt)5Gb33>AKv^#p!d++1Ae|}*0 zLT8EV9`8#t}bN_yB-sUD&*LH?j_xt;gtjSya0m^YezzzXbcy{p4qJmWYos*5+B;0sY@RNg6X1 zdY6ay&jxMQLG}!pi$TAts(s)Q!)K%WT|8JIIi)KyQOnCY9g4qL{8_ zipl$v%x6D@#>+q5ay{dz3H#BG_IupQx0ZLarXzoMj8b|RH$~fEo5PJmP_K8C6iPHR zJc`eWc=HwL7vu|uRO!`nwTtOvd*V=V0>UJKE15L)7!8 z?)G30!1^JKPnep<{&|e^9_~B%6P|R_Xdl)zC1&h^{r@;yrbO6uB<-1AvbY0p66jar(*vck{QGLPZQ?d`Umnws0p{Gl_G5u$XWo4yK zZSRYY`GxMg>?y^YCAZSf&e|KRUoI=tAaXABms0#Sz`l*-4TVAiSGQo}GL^)RZ@~Yi z^e?bIl8uagYupN&Ujc9ESF{b>(p{QS{1d}poi>L%p2>-jDo5ARwh|3zP~hsW&QhuH#?%BUqFtt&yF*gnIzV=K&8 z_^)6w-zgH|uWZ3qjqV?-Og&CGP_gynHC20#rIhRWRwn?x1$(|nZJ;&un!I{#0Mn;j zGy{c$slsmojX7xj`~~mtJ`n3LKbMBJB7VVlZrZA&@QWB`w;ABy~3oq*{yEf zFGn$a+z=VyEl%q-fe>+!zu`Vv9Q*#YS-r9q7mCJwouUn$FO_{uRz_-8gSI2X`xD73 z#SQvij%Ts+l1_Y!Fq3zr*c!V5|A78ExMYr7E1@G#Hw;^^fO5Mz`5cS)Q|D&KI^c)B zHk-QdiVPfTiq-;un1T3g_Iv%kH=iXYRa(m2XJ-G9)QH;7JzP<<$W|&B%GFyOy7MR0 zhxGckP$HEcsSm7i-2!92UOR1QLHEH8x{FNa|D0vW+|I;wq4SU_X>u5|H{^D_m!q#$My^_61zeV=w;$R)KRDs4ffDib$N<^q)8pcZh#Tz{@V$h5qiJ58r9aaGd<`ak3&c=Ni4HgE?ekRK$2_=0!x zZrxm)v#Z0nfZu35EA-)O-X|V%!0@5R)YEjH&kp?{XEzMrrTY4{)ciMx@{3)Od}`cZb&s=}MQx5!*FOq`C z!w8>$w$hK@$tXSZpn(4p#%m^LHAL3$e3sG>elqZJ3V)Aw@33NQe~!tYqeMqT*77p? zv#=6OeshL?yS$O=2gUqQO#XL~gw12`ka%qALHrNmRc#iuof0oQvwRU5wD9in34gpP4WkdEoL19XfeGEf2D6XI@KiCUpwfBQN2@t|c|&U? zJHel45%c%BXDzHR+M_G5`35&uYI_6le@Ye-{IIz4RwB^jRJ0yOW1-plOP6gEUmrY& z{P&Dr`iah3ocloD6c3#j!|rorGNG&XhQ;muu-<7#FA+afC%w!3(w&9v=MSR$+j^h# zrioe~k-kD=efsb_N4uIHHIoJR75ry~MNHK<%Z`hTb|QNVBZO_v_35$wU!M!`S2*9x z7I>>RpKT60bw+dYyoFKykyRUw?VaZ8tu;EW@1YDQ(xYlJQ9n06)Y~gkdHWPvt~H_c zLO<#H;kp-(`=k05fxpb~LzK>R#dVZYZXX1B5B&G|)td^L9it+idky+OqtS*H7URWx zrc2==d0uAAwmRAF!&T9({fXdDYISgb_%-mnUf!FCGr>}3fFK6W{PI7I0bV#vU*K`H zs*;Zw``wzq8r}!{#Y3l?o06ONrH-Uy&$C%Y#|$;A_9dB^BKb$AR8vXd{aYaa+R+Wk zD}0>fe~;ED;r4%Y&c)<+Tg}QgvnK>nUxNnbe^ugIFMPiHl_FIO^exaY%Yq1n`mcUF zoil$Q@N1CQm>K^~>>`Ojovycp@00NHZ9lrT@jq7Xnakgq{6>EGaGPgRo@7nICgeZL zd-;Uu?w-d9c?t9g;_Zwt5sogbrYs(;0(ecz1hd^)TMs{3yb_;==(~*fFsPo(A`TNb zr=#_gl&Y)-PQF%dTG;^dF3PVkXm8cSHALYzo<(E6lyxyMAaUq?3CKTaf0HE^1OJk4 z)n~N8dBFEv3?A|Hj?{;)Sau5gzYAgT&%l><_3yY2==%)3=B{2j;uI~Z8KYJz)&u>5`VlS)xLC6upM7`6G5otmBxZAkwh3a}f3SQM zo)dF}9xmtfA|l8;0H57eMuk^LN_Q-KbfX&R2h{6SGjTO(j12mRiR$ZL)g$EGWlZ!v#%P39lBLlT3!~6T&vC$aX~eIAiG!_qw(a{6enNizt)T6A zqtumW)936TOzJmPk?PmC{tK&7{IcN5`}y9%mP}j>z#H_r-qwUVZ6g)t3R4k$e?sOf zAtbLKtm*CURzdec)*vR_C!DH3>q$vM&+YqY?uYFC9FtyUsbS|SWg7KxMFGrrA8P=A zzwmis_2%_|mY9;`cEA|)XG%pe#6(_GdkFLk{38t%_liv!&7D(2R)`)moN*^ODZ%$R zkDjN2z6bfTF&*U@t2-4>x?BZ#&+rAOY3J^rq3`%RE<5{3@!g-WKJvdQd)X@cplCV_zmuPm36bE`q&BH4HU1> zZzw75Q(fs2ZiwoozVuJ#Lyz1Ruw7%H|xSg)J-r{GS<%u1;kiEmgI9qku#z>nU zKd}D*yziDLu+`V)jC{cCBP2Vn=%?$jcICyBC(wN)DMtr%3NxF@`5|sd-eTye`ka)< zhlZE_P>o-mkeN4%==qvMD^zrUVfG7`qFXiTL(=_w+fu65^rhwZTmqmQD(1Y`*@O5y zso@g4P*2;`f>w}>?wbtf=6<`I9$3hRajvt8(O_WY^NX=z>l{X=j2>2Yf|MCy*Bdg{9(E{z`eKBr%hy(+BR z`l+incLIDT8P_gpT!}nyM9Yim7dWiZ}HTedbGIh;2V1JYDq&$nQ`eQNUW@ zYVi)|R#>ct!DDi^jh$4jwV#|?j_`*+$xDf7a-{$Cr0JMIY zbkNbPeVO6Up>jH=UyOvh<9W+kM~%a7Vf$+k77-q;;-?was-Q7nU_<1{_dM`=m2eQj z2kLdsyr=%YT$V4)Lh>L($*Sw2%gy;a10=^=a%U2CvG{%9s0Zu3(EgjGP;OmQrO5c$ zfkov%&Tr2rW<&jZhU_wDQyqdY^gmTw>BG2}r{9{2&R;gdNlIO!^{IOm7yR8a@1_oMbCBmIGv8_0edb6V`p)WmgWpKAsB zhveI=EyUY;yp2aTcVYBjs_!kPc@rhvPyH}I==VLd;_tKv=@Si^fIm<_w|~)OD>3=! z6)$9ef$?IIqU|~Fd&QYFbiUw!>v`FZr}1x*Kpuzn>pU+%pSrT*tGtc)~B;GR_~LG19_bHBc@gHt3a>Wt?$_GUnt&? z;X)wO#bvALZrTZmpU0F7X+EL_D&G=H;eMldMox-$P=YmO>TxQp|0CqPN30eU)H-Xd z0{jAh3Epb6ctN`&QOidWqbDQ8HZ!w>ir><%M_8hIPN7Z}1EP`1{e!MtMBkcd=h{tG zN9yU#xu8FR{U+xdjX}FAof-R_DBkv{M+nW$r&brp| z58&_92}e~0xr?EO_wHGue4id+MVI%bp$XX#2jKVRo$Q|yv9KaJqp_)^fQ$0KUoT>t znzj4gu2RJ6r|68kyFX-*!!xv95&eL8qPDggtz>3yhAA4$dM?Syt2iW7x3PsF4?z5s zLdThL)%<6%E9dfiq!Vm4HPW5+wS}AD`;hM%OW>LhJ0J9C^}+dozaZU}yj_F9%HFXH z;B|XiX84o*UF_uGkd}w;56MJx>(GB!anu9GRCM1+CWQCaJy&tzA9v@%_s1BAJ$^;m zEMfiWZ}$h1&mlk1yK|re`kR--bI^~ciPlY?#`h-F_g+Bsgg-rYR?NYXcP1#I|3iOY z@lj6TQG4dw-H2YyFm(LugZIAO(Ir|2=Lzw?ql?@*1OM4Y`qUUBdLWass$EZS&pHwq z0PqCCf{A;j29Sb*~v7l;7|KnenePFDFlGhiaZEA2>gzg(@=Ap?vHF8D-J?7V3yuvSi z-zU2$__5qvOuokZYD7hqS$ou0d!Y3&uB~gcQteR6@zJ4oteur@{-ekr{LjDP&T1KB z@{6mI?2P^OwKI!WFgq3leORt(O`G+wJ(NFE1MP@WW}SM@Dx4 zUUswIGg(|<3-u!4d^EVWsy$aSKtBL~fHFa!JlI{HP(;S;cl>EidwGF(LFn&I%#N>s zf76`%%?97jW|f%mkUr0V`fbARb~e#JI^+RgAm72EotreW!Oy6cUeNRcX#YH25BuV} zH~#W<*m;eXd>c&h`CD!=r60Y|klv}O(vCcQb#j{p;4k>|rjpG$R77~3e^|T_oj`FWg>dg0rla=N>pw3?m5y>g3UiA zrkMSyxvN+ym<8t#_&yoA);rP1J=*Ld8k45!4i8f-o}|TbLH|eNPU?W|>)m8^V;XjT zqZFDAF`w)4_GCFGzuPIDFEHEw+lvJYdog`*rlhkeW~o~L#FrWDdpcV`9AoBR?`$() z2lxQ=*6XzUZ4sAg>w?8c@ud?*mx2OVbwMEpmKc61jjz++rqft*RD%4$q|=uK-fAhO z%pXs(JP|+f)m%_DH2+G%zJGoqeSjZbWnCESYDC7p<0F4QBih31=eC=5ij}SZd47j+ z$fQ|e+fp^=>pwtVXrBUo+sys6yMeJR`YKwl%%!Hhz5OjE?@gV4oWE(@zTL=w6Xdb> z&WRW3zVQXZq9twJrAMd*Bt+k37U8j=qh$IZH>#B&l?<&e#(#b z4XmkI;>`U-nadZRX>y&|d+4s9wioV$3+PY6+M>3>$ENNZ?jd-}M&+#rin7w{Ptn7% z`_@3==(O*(QWaf479X_y+#1ZEwDc`?ME*6B|45A`mD-g!ySxEyOg`f`C>F7k6*e;; zZHYzlv8?wFRV)^6pzEpu{6T)sW~*!aEG^!dTeq;lZ7yEOR&%ZJciX@a&uS#^Ds?_| z{GIApAJh;01>$|GI;#Ucmk^JI-b4Hi?BUgDMTUiMc=Y0t{it3a z2_HEA0) zq5sQ#!%DOll-8|X@dWWhsHZ@0Z_?Y#Iq$k)H=;KrDa~#@^|$rJdBYBv{)Mlq>$3_@ zX7-N){e*ajh9-Ye<$T_;6?I^51pY2iv2HJvXodQupT^{&p3Vl75+fHkI`q3h^EK4B z3D@sza80cDMDLUETKA&;@>kafK7}#x?*@7CEI>2s3@+e$HMuFnvHta?yN( zd^5wSo`UhCsik$FcG>Jv#km9^{?3=S7S-KI-@)EI zSbb8G$EJ_E?wGzR)2=GnQS=)zBrw_y@CW!sWRFv!`4!c^$EVTxfWBXN-siU3#0t|+ z>^|BCcTvoS^`d@n;&gz%4)&Vv9?mgKHS0^6)qsDD8M;B+mN?Pp5N#&}pBPn-P6c*3 zg%|x{5|i%}Ovl}lC8hM*Y9d-MW4GqILS`xd;%lWdo?7U8r)$a!2AmyBN2thtK$3RW zD0q9?xh={OBmJAv5Zbkby?XtM)o))QdIkD>?H2Y*gQz#thtOE&HXf7bIJ7^>aD=%bEf;daR7zZc#A z2E$)FNn0k@Q%ara7oz9owSxX2{);Ni8C zkJn@PD;55Tvhih|eDehOfjiV6ERD0Mg!(k*J-;yc;;P)f39i}V(u3FA1SEY+!eeS=o7@}OS;QB7G-h+lQJ|W**+hwvToVn zcGiW9><1+02h)LyH=8)?f24MpfxWrW=BlP}p+@%#GVmkN*Biuthdu1w8rg3|!R*@t z)_L{xB%>Xx8^_`MUl^@V)M}}_?(eVk{14T~ljVLAF7e3@dGW?IU3cZ()B0m5Uzs$f z)xmAS>>)1fngIoavfQ^jKp%v7jB-wf`d=3<=%Qj%6psP*64)sjnOqCP;;)`*pnpSr z_`PbJi)j9Ppr=oNG~p&)e`_Z@?mwsJR4v0xNw~?>ikLFQx@2L7I6A2-1n%2W;`B3_zw9a_DSqF zp&q{4`#Qj1$H#9axUoFfJh-;16Zp?4|E~{*wawG z0ACLEtFu+ox!(U!y*S3fdbA=P>UeUD)`Bq(A#zH#c;A|m?FP%gC;{dngbmTr@V z>G#UbV^yM*x?D4IHM&o*|63IX@66~_13Hp_Ws^*~iZ)4u#^ei-|9~Gg=$8}JaCWCV z6H>GeDn$q54}ibFUF9|Jgdw7LjKftpt1CV=+x+TWG5Kp!yp`Zu;pDNxNFJl_<>E|k z_vc4B>b!$!KAE$^xJYjPKWUI33i=-Kzp71ya%m$y;4uN=`|J_Za)I73bjRGRg84^A zC|xzF-5Fk`mR{KXf@tw(PRspjH!kY`q9&Dn_lorMqb09iste;v=od6pQWG?RcToj= z0sF)BH=E(f!%Zn~>NX*H9OB(>b)RHy4ExwpgXl5DAJnM}74@#vvP`k{kIeq5MoT8U z>6%b2;W?>+ldQ^iT=2J-K_{#i@~e`p&(>d2PG7{s>OGRKd} zZ&s-kZSi;7xg5rplVAG1xOLBxvkIO#!5HcRe}M`oM+>X+>x&S)_}Q1(rAt;nr3XhJ zMfaODQpi0=YYjW({TChCOBuN5HP_WG^n;!~PVxLO`-Ok4p6ngOw_7-9O-A%prp;#G zmR#Zeub)dt=g)`ym%y0)^eWI7JVD==NeZc5Uc*Nc2d9Bw06d?P!^X=Klqj#b%mts% z*xv}}Vf%k33Tp@a{5(1J=%qZny?vfvfFJDF1IAIW0=P2-L8>>>;)u~qIt1|oXq(NaiJa6upWH4-UZIp zrHyVkD}g?Md_<10_sg-qvy*%d;0gW$T+{Wof=g!-P0B5iK0R7OAXXV!=cHwrApB=+ zkP!54Y3y)V{eLW7c_38l`;W2~72=i_`!I}LS=vV>W-+o2mDH^(p|lX)>T0CTHe#}r zHjO1Sj2LDtEz_zQni|8{mu^W^THI{iZ_V#{kKdoi9Ot~}d7tO=?9Zzn3H&rgBo#Lj z0=z7mOP-(fX$F4o{9W$H_gTpQSQmlyBM#9w?7xuG%KVq)IPFge{7Sb!enB&T{y_E( z@CPT4wk-YI=4WVB1BO4=DR$NY^UN&grAAEa%i^-WfZU^M1MbuPhvN8eO@x__D&r5Y zBRmq75HwTpOXg|Gg=3gMbD2gXcCu7`?g1Keb z`X}k%TF%Tk>*XAa&Eq5fmYDGUXDDa>^=g>+rJM)#_ru$4Thl^!C^k;l|Ld!o$=DXJ z1$69r#3B0FEzQ=Km7z^>6)1k9A(zX?&RCG&lH@YLAELEcuTb^!ec=t#bbTk(hsKA5 z*b2=%BeDIQB-m1IXIK6%Q7@DMy@`_??)H$HHKMZKnxx4S_xirHgI5NFXUpfJ^J-tA zd4ePDzhs&6HWrfCNoC8FiYaBs+kcvK(Ef;w60J}EoR^yI-wVGpVE*9DH?&f>SQR&e zwdi+72S@(H^k#jUo|X)|96iKedeJuk;O8lp zN5S5O_yq2t!o`Vc_J?222k*384`+*Aa&QS^V zjx6v;`Jw;v-TQ&^xL@=m5&K(mlw4#F5UtlIesH=Fauex@NKQx^~X%$)aEV%J+{9a;!1? zK(z0{+A_*NHhxqW8fIVB_HxOXLGKHP<7!N>Wg1? zmF#{_O4w8$iu9|fPEoVG^=S$7(_jtSZ{igNFvWgqI;hdd+<2STEM$k)zxgyI%cdOAUuqVfr9({5=^K)93RwvkhV1JcV8aRJ! z)AJpj5ry!TQS1AyjC*5OOxYg?G5zLQ+~vp>OS9iLL^vRSUQCY{q;we?xjf_`{8w5T zt{5Wi+BWjm1^ffZKO45SMo;-x_#Tra0sle&(@y>1@6|*|B!FFC#0AQgjOekUMPOBKIO$v{|hHa2FXRgFrK2kIEM#1;ub+(lJnv1ljgS-`_})OnzGvzjp04Pz z%6V;@Q-SOiSBf;CV1wR_Wc6=IUn(!ytYA$B6vZap19_=}^LWQwRxqRTb??6MM)3hr z?(ZD``5Rk9jYsyPe1>wL{k>M#D4mqtMfU#kM&js;15DQP*8dG_L=*VqxK&4K=y&C zLqYLs4=tSE8g?F|uV*=%H%o>iz{mm&4>|>;UYD(_#;b$RqvwJCfBWdpiZhwnCk`Ti zj~J$I@_Gi;6I#@LL-A9Fr(cVZE4IUzxk#}0*Y?slt(*DQ#&x;C?_)owq#u_#-&8%c z$lMgkH`tF?9Pw9H2^Z5?NdAa*BQuLyb}ZvvlUX8r9p=CF)C?|5&FE}>fbd%6s;+jC z(?cRxC8Z#KQV!XOc98G5j-5NeMBmR46WH9UgH8Np?Rtn_B2PAVCB9Xie{~S#3GmND zJG!|g{L$((9am3HeV% z3H=stt=H?SkH%Lpd=L}-qVXXH6pB#?sz>hg$#J^vns%YeTdSMM-h}vUT!9Jx z(ZP3<6s&$#5|1x<)bFCUxaJ#nK5~f^&*GA^Y-UzJ1bG?z`IlP0_(Pvdl!fw^%n|bI z`x2|TWmaG1JyvAYU-9!Vfg!(f+%;;WMHHe3!?kUQyYWg%$@NwCX#b#o)0W$~Op$y` z0QW{uF;~FTj38s>~!#(@3_m|M=tpUB+l`JcDga;x| zzr7>zS_0oY9UR2J%DRwnh11__SkPaNzIWZRmv6YyuZrWVoq->qp1|m(Up^tXA(SAQ zem{#+E@I-Biu|3*F`IF<%@JW1q8T?*(r>lEF8?Sb`-L%)sR(AJxT zxRF64Y(Hy%X6qiSd3q=`MTXw5ypY}McT_Vst?AxbWPgcjlKF~bp-b8#<_diPpNN-z z`5!*@wMPA|6^gEvH4C_uh<-Cer`r*L-{T@&Lz7$7! z2;YeBCFP5+trTSIts*1)SNYs|PJ1A|#^;mcuKXw6P#+WwXx&{f!)=vwt@(RU&?Wwd^`2fzj?|-Coy^^Nx2E92iUsZF0lR; z!;G-v#_GPboKBNfdr>?=bj30#gf5-jeZ3(H?T^UgGi4?%WZ`$Y3l`rY)>@WUJ1*ST z5A*uK{{Au!=i8~%CISODpNI9`1^h8}6v8At|Gxa*)(6`v&~+UQlLVUMTJ2uIr!tiSqxqk^jqZ+8Lic z`6Iz?*TLJU>Ps|nDP%ABCojj96TQ9c1hYU&>%9C2h`x9K(K5Yd6XYHk1p77ibAi2W zge~;%ymiTNK=u4N>8o4u&8t}5Lf{{$2e@Eg=G_ulZ4o%S5%Hg>gFxAT_eSGL5m^uL z8tMz3_3SE*);vo&h5mn7nPop4|9w!%dt{%4=%Xxgc5d7GuWR&>;XzEEjCTI3scE*V z&HoP6`w@L6CjR9yomTTBt&B8~zazroBTnvm=3ZYd&4J&yz$c?Gn&;sSu1kWACG*ku5Qo=w${#lbgd2L8qWdAg>8F^JtLZzl?l`(8 zYL$D?@9*?H7FK%@%U7)2SxU10TqZEC0z88F=G3!S^mWaK(Oga&!e3Nfgfw$K@2-br40X;eucv)je>6PG%|HJghko1U}sbVO)cb*+~ zziYZ9bwXD1Vz*8pS`U$=ZKip+n?-(;bq(kZ`JDI|s?GbeY4fAvkpD+qx!u>-_l%S8 zNFMaF5S!6Fxo=IRgdanlpdV5Fg|5-)#Jia7#o9goKA%0#F z=C}RFkAT9VLNqV5U+I|`_`ee^3B#Nj5Fh_S6!wU^ZNbsV{3mF?jK-xu{`!{Xv*0Gi4;|#+V+B^v z$L%B_Um!0yJn5PFO!Yqs!s3vAAr7C*=bk$&tc(vniPlS$=xEo9uYG65Tp(fgvsfn~ zNt|r3SztN*T z!Ay2dHqb!g>2)*L6{BxQ5drUW``MKz)=~%feyF!8>S@&@MukNQfxhGMb&6=)*}3i> z_ubMle()%_qlYW6WF`pHWHG3}RnQ}xvBOqqu>33NJE+g6-8oB9yB%)#9;^Qp)y6tM zVaijox?ftN{}+{z1I`Bd3bTrHEs%Xr3ypK8%wGyBZdCBP-W@Tx4f+}8 zHPmhX=ucdj9Q)ssJoNuWoV~3Ef!X10o;r@~9Z_v_%+!v)dzofqu>Y`roT{Ng;;DC) zH^a^%eMb}%I4edd^T==SjR1c@|7Jb^$*D-%!XtO_k z*B4THu{>h>`SflJ-m(eSfh3eam>?RJHVMrVLK3Kn_LK>!VeCzEa2+yHD+qXAB;!5^KWzNR_U<@2S*I5EUk33O;pT=>;w^9tf z`1hzH#NSE}zcoG8+FoH-YkECyyA~JTJ}&yAT>SCP%+<|^|3t^^rS{womUXxA7}&$Z zqT3$42LWNXPmztw(Ek1mYV!*ToSEfD86{)*L^9Ml`7f^9eyyM#$v;se(D`Cd#&6_; zjSw&Ng!xl`^dLriwKXAP0-LXi`)t}IJin*A`a0|f#Dg>`XN<-S$r9zDF^b_+GKb;oGeE7TDFFgkda>kk{<7G~JZ$X|`-7ns*8C@-GU z1Hu5Wfu5f7uUxM7{utu(-C%!0yiUFK`_InO4q5=Zt^@=@L#p&2}Cv8K^|173X2R#kP{An?54aNC#ME61HCxCpgsFTKY5~)&~ z2fG5HJ`3h$!o2vgoUQl0uWh?R@?0e>U^tbtt0ExYWtVHBG$O7z_G zgssqZJXF1=58;W@qphbbWd~XNi$fRMFQrwWtMpdaEW#T4bbo+naZ!`~LUvY*zz@+Y zzJxa?vdX(KRFf4yyu=9mHfBdh;Fgwh@$RrB0eRZ8QJzL9exj`91=Lvg7#v)@ z5AY1~*Cm2_6C7zfP^^57I<`HtEWMzo37}Cul5(^w};5^f~aOt2`u# zK3r2{(OvI=;#-r_c`IViRhVpi@f5=|5+#ve^*-D#dqxDB-^r+TcJlIC%A{rZJV5vd z_3~u@!Y-j3_4*h_f0w`>q1~2w;qy3oh(5&OUQz^YJ}38pQ~=)#_MmQo$z`9?vW&Zx zSbfCMFx9*)?>EVg|A0Ti{xb?J<2H2U+AJAeB3Aw<-3)&$<`kl{cs_T27e>|Bi1ITJpSNi$lTu4i^Ugk z-l_aDR>ijYcPf!Q!+A(vd-99l(GLZ^#OxCzvlP`?zuC~1OQz>1cRXs;)O;$Izb)25 z@BKb(!yy&(Dvfp?)EVH{f&$W6{*YZ^o;zc@IR8|5WblyUcD4fCO_|JaU^DWnfX zR`QijZY0vNwg%uwz>C@_lTy5J9ml^IqHbo)_b%B?`JPdh`+ zFngkA9bG|Ii%P#){0TizslIX3l%L-Dqn|pVUKsR+YhY1z^xL{9ywM5d|1vsgsxPEh zG%Njx$(VoMDV3TNde1U@Cd1MGD-H2AT(imj-Q)Z3V)oJH?ECkn;dNCl4KxR!hbZaU zhZO}~^L9VHVc~%EF{ii7UMIvgdqaFX79W853cU7&@-%n38x{{SEZ5~xY92>DSs4ZR z1^o=PRJ{a?XE}?H?~%zsJ_gCsT_-PH{hC)Ci{Y=hceS6-nH%oSdZ4dSe(0s`Or4T7 zqkDT{KcHT{mWQ_~*ub~A3b<|3er}f#ou4jxy62)9E_$hET+e&d?{Vq)w$8mz5x)>8 zPOq@n?P2sgyFz^PF68rdO2>{@b|0%*y#@LIjEUjbgq9$a12?@dV)W6_ZA@8jcsFXR z#y7M+;`?u<8g~K~WXVbCSpV%rd!kc&m-B$+BXFS)Lp<0?-O~2$0`BbIugmOYf zTM;m3yS1YFxBn6z?DEFq0mK8FPn08hVbt)r`7>`+=oCJ71pRt&d_puuThnyw485on z@_{g)NW;F-mgjZ+@9+T7m+zJJ!Diq?mh~70kiZpv*`Dh6N_#f&Y zCWc|4%Bw%(LNCxTdUb^Ow^*ynVSf0A>3(C4Hxfycvr5DR4)Xs+IQxRqCsd1M7PlGW zH_t|rzkh1A@OwYtHS*U~(u92nnSxB~DC~K^l~=d6ewGQoC?{lJfu6sqs&f1Gt;+ec zGaFqqG=+9|=FDuZhE!*6X|4sPz`lLqUEao~?6{u9c8( z;cKEbtuLjwssbK-PlE-y>1{{yQZtnKBq z*rDB#ML$ks`mlo@NnLTKJgM2m9{GdNf5hD3yo4G?piUrqC|%7=X8iIqIg$YLF+raY zNiQv#6;FLfc#|xQUQ@&OD!9Tv_WH)#=y%bi3fC@Z_Y(eFiUOVw{;K_szMXsdb_I`M zeV$;C+w+s37+KfNU+DgLU-j{~?N^9jl!v_bQtNKy-|YhbKS+1{M>Hugv$?GT-p`o$ zY18z%*(CUXo>%jqLww+i{;9Yog4*4&{DAx#@c-ZMbCJuoI@J5ncjj03Lv2rxu6+~r zjF6s{1^Na011wk1nUi;2=qlk)pRYdCK1JL5R$=*vFl28LS9-U!l-_CQ_nz0B<`?BV z=Pd;73>B6T$(LyIw3#CIc2j2eQ!?QDglK}t|KHNH?qr3bAb(vyV1vfzq7=^5j2T+X zrtABaTB>Gzd@k-|F}fd)cj2U@EcRr5a*|{FH{r}poo}1rwS3jGdy+m^hPDcQQed_;D;#@PL&*DC$|0>t1w0M2YTb_)b8!= z`$m+AUc?T9IJ(NqT`n9sInCdjO|>i1g~s{$Uv`ZR=Z74rE- zGp?6#ko+i(blGgjc{YL@*51?gH1AE*B@dIkB8ov@!}B#F|E;2CKTQiAISKj*)mMD< z^RbwpZ1)Q4J)yp|7N!gKUgvvBw6CFSm?tdsm~qyOz#fQ#?*o5S-XW7ERa^USEbyrW ze&Og)o3hi_j~;M_`KBVBE@exEeF;9ucy>7##jlisqan7b^Y*Ry^6-Sr5B%RG9XwZG zwlq28ypN0t_EfH}kXtr+#n-$&8}uFUd*qQOZjwiIjf92rt1wSf`uBpFStcrTNZ9v> z8Fo(!zMN0$hVz>dzq(QsLq7V2Hbw0}kpBYb57M_-wp(Nk+)qLB!3Yv^)e~Q+AJJ=% zLFInDZ{_Os@t>?rtGIXPh9ec|glZt_O-BzBU6#eUKOf|hC=>Q4ZB zkL&oML3pJ11qa!qaDH}^_S&ecpJpD)LG`}S&+Ryd*L`iGt%vn9LBBM&F>u+H44L*Q ziuZ^*crVHmddvXV3d@nh>VGUc(<#{*f%%6X>iN+jy{xo9kELVyh;w{UHY-Dz@_sND@fY+jueuuUdq1xC zLj>qss27Ze0}*}&s-LU`dLsLRmzFM1bn$X|atPJ)GCXs<6kGI4-lfW&QT$fv@iMI> zdVcS>^)(RhUNNlPn|?Hwe(u2w{Z&k4?-Fr-0GN@-r#*eb(a?Rj{>l+#?}$1Ca!2u|3JY7CTufgZrOSP7;&3d}HNNP3 zKtCwf@1PXBz1w;dyB}voKSI+l&9dKC1@Zy%b-oe{sd+vcv6xnbC z?B5s0hoAdf{DxPhzeDHQKzw|NKo9)B*Tkl5Upr>s4M_zYe0WdX?Ir~#Z&vC0XEt^Y zvG%R2MD`tH*q8czi~f?YPY&Ed{HatAj13}|T^H4>xnkE=_S$|Q`z`WS?!kUO8UHy& zaQv{z=&FrxwLbC}h+4%vS~>Zmao27d^0$fm>;w9$uO*L?-ArX;C_kzyY4ui@m%!%aK2^Pb^}en#J)xM5&elU&)i_W zf|Ou5%0Tf);_w(3&PQt?Sha(EgM3agqjy#9yfZfNcovdprOWv=CvIVWHt!H0`(BUF z{j-@YD{ag7Kp&{D_M|X&+0vZ|Sqm2-`<3BZEbhnpp9$=LpOm<9y>E?dj( zS#$)wAI|g1*VkFP*8AOr0P!>9cJYC+*0l>vQ>&6O`nwA2x9jl#Q18+ue9_(h+i}9CsOkF$ZMyetHa%5v?+AvU zwH)r*AAN3LyH`%f6Nir5aVZCN{#U-Q#>WTn{`SHAL{+)LCzV1qY#vDvx7sOnw`i=0 zCdA~sgf=U+O>ela&nFVqPcb}It9O+4Z67sGtpxmq`Uzo&30bQtVmY-P@iS4wrRf9MFE(o#XC|HKn%g9T`FR zArcGNsXluPc(E>q2(K7*w5qlEWuBseVzA#JzA!%K)Yr9SWpdA(Xc_rezbNiyk5kdR zy138^1K{7Wla_MTs*nXi@#%>sKGwhbm4VT8I$i%t`+yq@J)bBc$P&M%&C>Z_)J3fR z;0kYT8JESOEin9s^{c5z20*>ERaDD(vJcebiaJALj`&X$=Ni*Uh~5mb;)Rsd6RzG_ zv=QTn;ajr}SsC2Z_L4jYWM8a2B~mASR@4|6L%bO9#X7R!&vmEuY;HXDszCdtL0N0k{K2kdFiVXWvVFY2jo2 z-?gipu=-=y4^(Q^r3E(0tSk(#hfGP(M>Zh+ zrW6ynj@+f54=n0-BYi;ZFfF1ydMBXoedLS2m#9%Liy2c~Zas2cf$?kYg6$=mMh<=j z_n8hTpDm%!WJcpS2Y$ZB)day4+UpGlklo3$D+GoF5(ZU&uj5w zoO?QcR3yNj*XhiB5csI}+&Ihw2Yyu67RBsxZYrCKd(R>|4??dtSrawo&o7WnXg^Hb0kGJLbn)d&x+*U}FmK3&e*kIo~gGCG}&y zT?lWK&v$2+7d?20-|OU!UDt&0XO-RvGt06dAbw!D?ldO^NlIf21CJp5CgR%G7MAoZ z<^Q7<3;wJ(^iL1+K9Fr09K~tGpAb*dPq9AlsIO;YiQ;8&z7D&!@z`&1r&qcmdNMQ& zdjqRqUv0%pB9Xr-su4U+xMkqDaYNE~w4X2!)+zhMGnZu7+gj*%#>6d&UJ|iW!RBz9sSsXiv?Vrb>oi<+g@o;ysHL?d7wUU-nGgE4} zunF)U_QweNr;EB*MwgQ|V$ZL+HKXEc=!I?DC4jG}|Bu(Wd|7MB5q9?UeDN9;e9zxT z8#e^GV|WMirBj_+Ssj}P1CF8i0C6H&+wz!{Pyc+h8|)Q`AN+%#SKZ(k%G5dv{`$-D zi3ur3zCk5mTP@7LC#H{2%pN4H<>v=_YIy#plI-@6PA*m-e?am5`&PC1C;9fdXg+{Q zJoB_QS|4#jt=u#6@|c%y8m_x_ANQyi6dJ_N}Z$dgGy z;2lmz+IbtGALQe`Rc5p@OOi6}A`t#4aen0GM`q@eTS)@yG>Dc=; zi|uQg`l_Q!-SLQjM3X#dnDTN|3Hiew^Z%{SsY!})sEG~hqzf97$k8yD7Oic@0| z{=@MJ;>5-PzM6%k3(2Q)QXzaBQS@x}-{OvII}-$vJF+%3~~*TwjINYLeEr@Ji- z7rMa*@qduL^TsDk6PN04KGN?nueZR?&$VUuh)WFU*D2*Nr}aC1+mfqgyI%Of^F^M4 z(vWXDe7P4L>`{mhyB>@n6D|(soVuHX;Wf_Nw19f+%JDp_y_mgGa!a-3Ymh^Fu&5IB z1=x3yO?UWtbbZ`nUKmqoGrE_K4O8s8IK=UkO{dtY?}{GH$WeJQFcm81x}Z@ zNOyQRg1rOtp`*;tx`ptWb*T5VGHh zB`WwGb~_y{$rnK10G^6f%u@LCj9(3FbC5iXCeLx5csrdQ`K~4V=tBSh70!^jq%qgs z&j9HY(9hoFQtiba?cWI?A1MCdqB7%Fs)fQ2>i^;SO3-hkeh*o`vBUlObsZ27_?Ijf zKQjG~Q&gBQK=lAPKbM{z)x{;;gYdnRFwf-mx6+B_-P`6?V*E4dYisxY(k$zTv#w0f zD=`1HnHuBYT@)ig5iGtpWK+qPZEdO_ z|H4D_EFiz%+e<2iY3J{Ju=teNCe3LK>M;vVpnhKo{rmkt6;yykdLR|}59DK`zczkg zgh8||#{B!qBL3eWZicCj6wopL*D!n?&%|xkdSP9T_)j!+niNCLb~$MGe0p9buCWoH zuAXDl?FR8hpl^p-TD`*!!wOa7hv@$q8ZT{4C1Jt;3D;Qye?Y&=Zt7c$_QC&LX7jN9 z=@3wgV*4#30zEb$dO-a$`v5)Lkr3cF3+*T9!&s`u#w?2>zaT^p2Ci*%Mb!;?rX?>5 zvzLu1-T0>8>JBcKcB1Di4ZYQvlBZ2&=6VFAj~K2lG48$RyORH2Q;+O5qNg|YdF$fm z;g`mDqx_pv^Kq6flh_g+<$MD17wD@G1v)p}t?D!H!+wv8JXN{Xgk@wFPLT-sF{M23 zvZC31nbYpYN3~^_z`oBdPF3X^T5R}p;558{{O1LBeoF0(YSPWD%?M9KL)ndyl>>$P zx00BMe;Bw^+1fn~>zntNZpZTflUg%`jXP~B{X@#I`^9u~yI#pm1^0yyCTGCc+Pfgkzu^d%L|xjt@t8Aqs0S3GQ8_QP&0Y1~9yM zSrZV_I&fpRmLJGJ^uI`osGCMAj$Bn8?tz#?Z}!oL=T2bT#JC*iytOG zRe^fwkBr;p9VLmft*kE|(OA9hlrLRMr&>hF&wu?KntSDshHQwDtvR@F-ji_*KkM#u zOQg)0;I8RjK4Q)0&as+$Y9L?Zrx{>O4VQf{^7 z&rw}8e;fS&(ylpe^)z`>9pXP?9eLBo);zw=`woa-0R3xkZD`W|RAAp>6^+UF(6?Bs zvuE4yv3qk7-a@~oZOiu#tGogt3*i&dsG+q-v26At#kd0FXEB}URGnE89wx~~{Gv28 zJ8EJU^2#qPYXx>c&gEZPk#1Ah_ohC09^{{B{Iz8tL^*NC?;v_Ij6N6GDLw|r?TrF_ z1^cK&WmcPB;r05{qHIjwI(T;bW7(Q#wR4S;y$t7X2X8U68czQlri*>AM|tDRv^J~E zC+p=%U%~u|5}Ie;s?098BZxnUxP!bLH~*orUpyA@6U0AsInhBy70jruTQK>@8S=`x zJyyRT2yU5vpCVwn{~QOaU{5T+1LxuW!=atYJ76|@6x;uO_D2;d0}iy#j(UVIqDjv7 zkHg`dz3n?%(C;vBf$kEtZ}akN;!N!K61C#9;^q>jBt?eyLsY_(-%IJM&Ggf`fz~6! z#l^a=TjILqgQE??ZJAwWTfw)9(v9jvDMvAFCN5V^jK(5Am5qGB3dbDE}rP>{aF47v$h%CPt@`w^9;A}X^snzp!X>~%kjLmJ%v%hK68E0 zeqZKsQ~LZWXdka9qj`nO%PKQwY)=%DzXXmWdqyPQZOXBhotU; zj{9HV(3S=7{p55E{DonLRUGjmk9SvB|M55EZ!&@!%j{dvwq-KburU9rBzCy+M7PK1 zENCc0`~aQLe){hh3Q9KRP51MJ*xAl~|J1b9Via8~ljw6@73CHz)hP>%e_aDv+|91P z@3|9BK=D0BCw*p6Z}O|MYlTeYuQNEj#_*=WhGWL)d}Zi2Nj^PqYv9u7nPKBFug!Hz z3G+MrXv+}l0sn!1u;MqDB+j7Ok9_sV^b^cqDNJuo;sqX$M)p0i)7ftaMXhf9YDW?B zmzBx?P<8xquEPT^>JVS~qRe4Cwwd(b%$)t02KxceYh0gROMz7G>0Q@=@A7+oA-IiAprQd%Pn+I4oCeSJWd^}0tIU3Ph zWJ!q+p{LFfGLF|HJZ99{P-Ff3h1tPP`iQ@kxr8xWo0|@n#^}6IxK?jG*-e*aMaAvA zi{caUx62!EamVYJS3Nec_BO=-Ie81}VN}139XMZs$wvpzE57K~Rti+HA^#8RQN&)Z z%d?L@x+g>W3G!>BlU*KX-G>4(`anOf*h@iJLr#0W8SyjNv$sm>lN>Gg=~*IvT9>5j zh@a78oik(u>w);kLbgr!!+mS&vx-AyGI+j5x>;=LcaH?~w;=x6OrmN(j4-zRhS{4#&Z={y&v?H+ZUOxT@r@D=zPxpo?GlanlOd+JaT8Um%e0pJPRn!RsFU3t%BJKk z{V2XCk~DLNDDPifnpl;Au9YqnTdE+!qdfNK1K^)w<@v~nQm*Q7%(@z|XF=Xwxf`GH zwwnj2MV&_S#K75qceK%5!jm_IWAY`Y2hc+nI33VpqWC_{SEhYCa-3Xzbl@Wwt1q}r zz}GwCN|}WN8?fiWd}2y~2BBw(%?;oum>=|^jLTizxha$!i13P`@n%z0i^4)}FjRro zuY9g>Oie1@ICntqnD6!$?B8}3c4Ildy=dEl>HAgZ7D(ni&v8QiAWxvaBaHXpKf{?^)TwXTvCr14f`=Zh(y-?DoW^Ja4%FDzx+-&a{_;u5v0bmF@=;#Z}5 zTZvgv?rNDAemA0za-1%BrYv$wUNpN7;Uy85Xhy!3?ecQ_N-YdON+Kd!@cr(O{IsX% zC*T_QFk54)m;-GPAKf%gtSw@4`F(merxSOe^@wUM>Aii08aE(Y?!88=Iy@if|D3SA z+d9$D`@2;-x?fZym6+OC5_p?_bJJ8yeza>O4(1;!Mc$Hpm@md4zFXvV})bsxnlLa5D#hWI=YaVye($t*A9=O-}!4p)u#7hGno zimb8+e1&;wRy2h|LoO6WwSzwh_A@(B(Qka0X?k)|LH#8i{7VnO@x8KXSR43>^H}*HMwO!j~ftvi2HMp zJS$xT|Erqes1fI*1NI-fws&-~yWwubGU!A2p&UA`nm8wiPp<9-c>;f6h!En^qA6)B zLjCs;KQxMbcCv;S5SIR%1;*ddFAe==RMsc{31rW~ydx^%)m)p5#ZwRug8!fVhf1>T zE~I7hgD`zN#Z+q&chdBnJ%PW$zaN&m7e8K_IL?T$^8tAw4%7Wkj5d_inSVs~E9BR6 zoZ9i09A8tTlRmJF@yReTxgA#Ws{~^k6&kXZ!vYlQ0A=_=*o;*#-t@dFuFVBN( z@Gp#hblaMTxOosi3LQ|rL9XEkilE^^;TywDG_Qz(8}}_J5MI2$UCKlHNc2OJ-PWej zPYdnjBfPv{9LTP=P439Pvxbl2*YRBfC%e(nLp5iLEwTE`u;NFy)T<9|dg8EnJj3(B z-?=WNcG`dw*aNUXwUV_4>c3eoUz%fqeczNKhWziYZvJd(Bo*vE@W+kpkNiiz=oGcn zNf*PP=QbRYzlsT|FwfQkMx@e$1U5TMZXejZVc-~`avp&^Wh9O z=!BKXfS+Mr;t7?rvR8rYwSp1;h&0TKVq-Gba0;vsIKcfNPp|3sy)Q>sDEy}7L1$Lc zmjz~ju-5mZ^)ZG7GLx3YZV!0IG<3hHgZ{{R&Vvp9#;(AB$e%wF64IpL9~|5Y_CLhm z#murFt&Nwzv!&XYK7x8^!p*<{K8}j*FQYSxY{O~n&?(h$w>;+F~cS$Wf7Pz4MG{zr64Ri8IN)MKW>0a313DK~Y z$@w|gs5zwzvoL#QUwLYZT)cGe_H;a&cctviF6pq|8M9&}NrCzsl}WcE{n%l5vV$u& zL%d-8{`q2j6ZO)5f!t-lCkocXp$|*x-y&{!rR)ZM1N}+2to4KC=cDH5g8c~bFVFHh zjelLe+Nrwy7>a*@KUn>}=|*7W=YU&iJ;bf5c4a22^Je%)+hF+vPy15aGvf5KT4(G@eDI+_lzDG3Ks%7NZs-*~>3EWUu{%-s#TOzMhBfhxtdkFWA4_BNDAF zG5f58V?hfF5iIyJSc&jW@`fPZXqqMoy`@5Kd1Nbu)`%%c%t--EwWqm%fdq%}uv zK->xZITjzG<29w3Q*xmDyDIX3;CzI%wcLy~QH3_3pHTl6ZGR+H-|gTak&ogbFfXC) zwfW74y9L4Sh+h~T1QPktW~*nRNoj~aP=Dzk<3D$gzXe%_*vG6Ucrm@ z4DNcczg-6V1@mjy3uE@xcr!_WUr7JbclI{EppnA@E}`FvI11fJ@GwW#-GI&WVBkJC zxh%W<`0R6`4d6HQ6WZ=MsDDYjKr#6f;;Hr>O5&*$uRXSO-vz6%`eax2zCb~bakHKt z>>uFc!p2qs+wv-F`Mz`+s$bUV>b)~3XduSFcGv;Q-_#QACl6Vr>v!v8=V37F#x9&8 z_S%kx3}|`pT77;O=>#yHPGk12wWdC!Aio_)f=T4=eU3SXr!fASx}Rn6Ag_UT-6#~~ zWBg}Wbki)mLpI-Md$u7wg7del4{!Kl96oCR{OK(azmk4%)ZRgiKJW;Orzs891CKiY zqk4$HFCB}g8@^=w*fv{O60W{O@<>cla~jRJvdQ!xfccqVzvI+P`8@{il;sosfH!EK zWGTg5r-IfqKJDMuoomcb^}88<70w@xhJ5y3`xT9i%Ume$-af$aG1i;{bEZ#grxZ4D-NC zhZz^vUt=ek3@0zMi3NKF>d)hxc~6BgbN3I!^PqpriZ36o3eeM$i^VA3pu9X5%var2 zr*kJT-G>SIz8&13l63XZ1KqjEULjtg5t?k66;YOT?dbp4#l6J0d=)#9kIHRia6TXL zgkndO`Lf*X4C8MIKLNiei6#CfFPiEj(0(Z|pEh%?-+8(7Z3N)^iYd?!)h^s$B4Mvf zD59_Oc2wzEw&EdSp#B>+-yZOSztq<N5G z@h88!Ya{eA|E+dihPCY$-8hR%Z2qPa$4;|y_Wi1|!9)}2Jte9c&Yz(vI5S^fXzBp+ z0P(`o0QpwVb(tMghVX8ZR#W};{TrLrrbbAfh*PnLtN49g-=0i*qx)f=hg*>%jGS@t z#U8XDP%pxb=5!U0ycL7}0{oBTvdgvgT73P^51?y?Sla56EAz-*T6W+4m6@e7ZO>_I zH;O5a74mXSpDB$3`^Ws}xcQA!|9{?dIrkF2=*p38xExHrNpZLGD|$%$om=64I6t~W zv4cCB6_sA}1@n)Tn&rA#r^oRc8aH3`oAP2o!JKN zXg}{?u=o40!RX=qw;ZN}QUvua_W5b)iG2Hd6E&F({xhT{>lFfC03KRu9Ys0od5M?I@;`m!6)|cKC8x$ z^q6k1?mu01vHNQ!1S7k(C62A3L5N>q{);6~cwUqd3iEg1{UR$aJ8`jWrSRrtgbbbs z^K)?(3`R{rKLdXk zP5k}xeY7ckT!O8?R+@FMX{)8RN2n>{AEKCc3qRIlLG~JSL-qgzr>AXQk#1DSLiq*A z-y600_wHQWM$lGQ1N{s3w$##=Id4^_^u<}k4^U4#?C+)T0s38z{3&Hz`G?2sS+97D zZE|ENUgIfWSz3MBnPyx=!{isIZSU2xkHtX=a#NKLx5BeMU z^?XY8&f6C|=Up8G|DOi)8-Kw78{WUM#T+D`Fi&C5?2uj;KlZXV^#2SJe+NSl#t|&B zC1d{1*0$K6Q~QElOEWdmeu*Y&|Hd>w)NI~rD@6RM#97VvhyGx9xpf!VJCM&SraKGB z3C^ATW`tkRj?MNndRcrR_!u62A91Cl0pICaK-&XjGI}1-TBx4Iy}ovMeNa2#4bOlfpH2qfQ|nwtDP3x_ zJ8vKc*)JloT8iWExAl_c>uHI7;w!;ZOvrzg>ewECwG?}wxTr+_!uM>3<^KJ^A5bqN zY$TT&3il4QV)+BcFx|_p(X{CJweEP}&k30Cqwdu-yPZt<7x)G6qQjZ%^e4??b88>@ z)UFSiONP)qS7Y-(#2=TUcpIE|c8(IfjBbAj_2&a#i!Dpp?B%=SUTmyK`z3O1D_7l` zIDTlJkruZ8js+D?PG{YPya>>*fHy|zdTV>Ws~ums4y!LxdN#=aZdyu(_M@`(xK?doQfS}S~!0NY>a7q4+@-$k+5bP27O*jdyxys7`%i@}B< zgcn55XvGf001?5iayPO!i5#-;*H*iU=*0`uFniduaZ)Z05%EI5^iL zf$@WAKOo=3e{GQAn)mU=AqT|I7d(>l?#-SV?~_}G`7>f(#ZZ30Dpp~`T-47G!E;j& z$8x*ElB;xd-s8Hz*rvDgQ?drg=iO!6U_X)0r`bRHx~89_(+AIoe5&_;TZ(4RfzJAG z7=DJcNk_(XeEeMAuR#1wOtNq7aY`grh7Duq1B-^3+}54Eo4>vhmHB+^Jb+)OrBBQ+ z4VHdD`~dmvXn%T)P2a*)8o~=@`|ocHEY2>fw_cTp$=f(hx?|@On+MUf3rLyu_v^J+h+`lxP~S58Pt$1fg|ig)Pjsy` z!dJ1jE#7-rFF^&{UmUl@+8p1!GEzR3CSnas}Hx?zdVs%*pQ6q z$>=!uu(9OcrY+YBkD&L7I)3V@_?vFy8gCiJ=4ZHm=$?ONajDiN$8Q+FyN>n*NDLMY zbo~~N{PUleC5Qd-3UA?vgEz7d@5h#hOV~XRqeF?&u)kBpeQigb(;fyT>*~<`K5Vt0_kY=Ss&k4)dLjJdMa?Ga^KT)hJFZOkS_%<<5I;ZS=KZ$wo zA3XNEXYt1Saxd*uL4O{>;!}AX`2otl?(w%m9iYbtWs%kHX8idF-}kovA4}IB&-DKP zOQjH%#OWs2jWJ1V)k!M}+nU@qa;tMHp(uoJb+l51P~;Nbze!N zbVKQ)kj|<7Uhj|JpL=ZkTwd?j>-oCBUdUdUtj~Q&YaM>Q!L#tO4(LnRcTX!VP1S0$ z2q90Ep?r?#7A;lt(aD9aPoyp#aNeE*1N}#Do=0X_89yn(#on49AW|q8PxK03fd2^m zJN$UNduOS&@mqV)*HF(MV4?Krk)JKA&oWUMGFMFB8P|?!MkKz)ZQ*&}Z|%!ij^TsnmbRo+ zySJv~M*@_up*Y6xjO@Oq+~q5YMEoR@fBAi!xMx@TO2a>p{l}ixZ=UL2)$^rbO%=jd z3Q4KPXyM0dtBFglP_Hlo{?bu*<{Y!THq+IZeb3?hj<Q7pkP`_LzQ|9y4_B ze&=Yh>M;@FnF6<^&V_IJ%9x@HU``<=o8eHHEBs7{;Jp!x_jeN%zmn2xYzqSrAOv(97pjZn0K(=`tTb=(&h9W z*!$~5?djt5q*lH1OV6`@3FkQ!H(I4_vvxU?iR?R=-_f;2yH3bzh~xr&U>}=$O585b zq0rZp^RfTqqZXCspCh>u+n1Ih{Hh6Q_wo`i+n8=|hw&F#!{?i<&7gf>?kt2aY&>_g zl^oD{;`)6Frf>09iNa^h;o!?3@=*N?8=rMJgc-8KqDu;R0r?BDG2N`Wd4eYS5!n0jb{F9xXs8lF^qaC8jpXuM%*0@WcyyRqZ z_yg#E5RWX8vaY9V4;p!6^uJ;=+OYyxo7TKVi1C-_$4-G?<~h^f?g74oy+KkUOb}$7 zK6lkXJq*0xK?g}VvAeibq6+5?_5W7{9o*R08DUO0LqL8eZ8r(%oc0!zAnD&kL@#!r zGe33k(_7W6D835%KG351#6*A7obFj6h<_BG&OyA*^BLLyzR$J<`G$EM=DgWkvp%TI zH3I){l>Jm#S59biNPp*m#Y5ON#F8z-E@9Z~fUOw4uvR2+=w5zGbVxZ*^3y1mqie+rx<>_OZ#QPC)j&K1^nIX`lguKRch(tnC!8`0VUcLVCmX+;^(Pw|vv;+{XtDCBkU1%w|^-xBG* zKy_u8_r?$uzotm|dEZ(xEa$oDeZcJBgLNBPoNq-Qv3NZX=}(FzgidWVI(XvU6@B0@ zsNcph{h0Wx1FH|EBm0fAAy)6z)*lt?BX)p(hv$>KxMD>rp?DOs#K4)!?MKl8(bs;n~?t6KXA{=fdyl;$krYL|LDV!y}BtSYR% zJdRj3hoJi@bOiJX{ezC7g&PjEA^rMY-y_of-Byjh{4zuzkv1!2b}UyV*PWh)@Q_U= zxVKvWS>N%yjvIDfDuRX3q`503oy0)rDf<3%ypt$-Hhb)IRvCO!RCCTQ)LbkX^D)6; z?_c}afL@i7;AGe{1o8&)Hj8D157%=dx1|;#eXY>Ob@uo7X|swZ6VYcje!RwUy*lnXK_`}Pn-LJy$rwq9%;Zk zr`4qL!RRvP56YLE<8=*9#7BOWdVVhy)>WYlg;XJa(?CTH~K$i zc!2nD{mT7Gue8e%zf)@Tc?P$o`Li_nbFus5S>IxY`1>+nC0}s?|3H+(TIj!{a9bkrn{kVj+X)U{|&KXC)3@DIR+b};r*c=NLlI@(aHUM zwZ0wG_rtdglFb8FbGBv}VfqcP#P#@@ma%vC$}x;Tovg+qn6t_g_~BmCKC#qS8Sgz~3VXVrNg*{Q0VK z0OI}S->1|ZM#-H)2ebXQV)l?qu^OZEx^}BH`5XKm{FAB@r9tP(Km6Q`vFE|Nxr<2D zuB%nQ^8pVb-z+0i%ymtTI-Z3*^2ov3d`oHd5ej#i&L%I99+zj^98_I~o# zq2$fujEK&;U{8QN9;ERFm6J`22vx)xdkk0gpWE4%{hGg*A$wKCDas!=8LXTzB&&k{ znTk2jiY_Y2xMlhFu`kj`kdK>{*VwKbqPYz48Pz*;O0C+fZC`99rK9V?{8-Np!riN> z-c1g`uh1W#UmAY&pxLw!72D@a5lbR$^KaOnp{)|2?_s|qaXbC?UIPBHH>Ph$u)pnW zlSNt*&K~(s(Emj=HhZJq8&qA4_=_^#+Dtc$!mka=GeGjIsOkP^?|SYs#?Hwz7(O`S zCVn1QTa=Y^59Tgfz4HR79oZeZXgdZ-=MX*h}f5vvif)m z;x7fxP1;C&YAdjoVDSvLN^h9W`;{gi-}l|Xo|in?V$OZi@F6xATr&j9+ZW2$B?HZ3=-Z$?sKtA;m*wZn}+T=S=HCJ8zg7B4%|K(d+$|@<#H^chJp?}(7 z#P51mikF!Wst17n-PA_CiKwqn^W4NpO0xX_0+?&^*d)BJZWamkj=cW zJ~%*Hwe3C^e`5Ma%wR;ccbRmj6T!cR_@$1+dj(~+nvBbvK==ano^H)NR@c_h{TAr_ z*mx_-o(TL%`XfOp_J4Vt9-*>-Rf~LXU>V|v`QtS8!E1wS-}B^{y}coS>*W=0tLt9! zs*pTD{I1i3tGn^nr@BCNaGYh(6jr=faJN?o_^=6(lSQB2S8Ag_~@9toW~ z@({DD;}Zl0}d67B1Qc(>y-?#_Z{VbF(rcagkM9A#}1YYUsG*xt|ntEW?5 zii;o~xao+$f1w2NtH_g^*W$MWm#BHC9nKHt*NrsJniVxWthW&G9_T0jd7QV=`lNAYbiW zQ`*2Vw(ke(FVY5^VQBKH5wQ25{#ZpyCMOqfy~;%MAb~%{rfwu_zw04+u|}9Y*39FM zN;BeHdTVC(Bh?m}A9G(M4tgga&TAcj`XTmcJB`^{u$%i4>V_3!X{1rtz6{bU%<+rtsMzQPZ>L z-YDQl$oE&75=!;Yric?WF?op+1_a&e&m)@oO}T(QLBT&0k_dmB=i(;9F}x!Q0^OVM zzX;!n{7ujoxEnipv)$_oJ2rjB{H1AAzlct=Y@xZ&3m2qcNrIzP)5pS;|D4Lv^+od8 zvpHqCWjXz3X&C*LN9SlAOWVaE9=ey;gz)3tHX&Ds{H~a_9N7yLd~w18PrsX4oMlnS z9#!Cq8;|+D8IIQxC!&14f+g(TX(p$J8ds;G{GKgYz-0zr%~n})ITJk(^d~Uxb|v=k zeMH@uJV|WG7is60XXHD2qVt7(^=@8CBc3R5%R>G>oBXUz#ro~yv2Ev)5r4Bu-jDv; z_wq^Db)8>OzX|p+i~fo)Bf=FdD=&G;!unL$-jsk+}u^!Vt+E`o(j6Z0w?pe_Q--}&zkPM4bVUJ?)@!d zM>svrqag^{zl!Vu)wy$C#2??wNk#OdOw|@Dof&kR=u3VL@ql5<0gVgv_pFkZ#v5&z ze^pY%bF1W9o!~Wsyn?;yWTjnF+1n9vthLh;!vh?kbPm0@baynCAHHy=WZY?J!+0Os z-;VsHU#*Pe&A0>|BR#~AKjY)M$CA2C5~T}1=RJdX@zguhXNE)~=XDm;b19z5fx-fo zS&Ak{2KFzU$8xK6kqXM^R`2Nz=lwp8y;hq0pzvjaGgMDDi>iisW!62y5>mF7w zAeS_sj9I?XSkRP>o*(vkMHZNQCwxdOu}AV%pWPwmN#B~?b+Hb``2Ap3?;+OmWK3cfZwQZR&dNLz^q`m*eD4 zL$f8>ff9?oAde#=E?-ZYCG%SU8njPY34e|{0E`)YwI+Oi*4IKiA zzwm}B(K0`#I&XbbeLk_R6y@Kk#?{~C%?Tma5$N}nDD95JjPoD=Wb+b~8j`1&^HISB&dDXm+Y*mL{Noc_YD~P}d-KO1AIsNa@qqx44>x@9_?oRVcN6(>bJI~KNTml zoJTvjzsgA7wYdlc$bdrb<`jdz3`U5oq=ip1EM+OA6q-iI3t&rylmvmq2P z%JdJFLTU?=UrMctx45LEIB-Qd=5Mme0_#&>J*lqtJK_9LJgl)?$X!ve^o=kC^EW(; zk5#F*%)Q!I$*=@GhW^L)sxIZHr}p=xAb%X?ab6 zTmM|N5Pkj`t)Xh&pxwb(iwFG<@wH+8s8qFun0YVF3X9i9PbSYQxnc69w|K4#$W#4! z=^~!nd54b8IdjWUd?%sk7MD9X+3{N281%y@(d`BkRn>(@o%=GJFuZpV91Yr*=p`h3 zRwKNE`fBm`4tN6jebbnT;h1a=c9KOtX6PBCT7uEpk6 z!n{Y0iC%13TZS+Z;WMSyly_$|)P`F5nSjw}xX1cmH@qgb@JImm{Bo+(#lS`X7^jyU zZUg>h55H0G-aI*LQ-}T%;4i4JBMk{Xa;VN%HL2)*6go=V-tVGoC9Vi^L!V(EDuMn8 z|1RBdSqc_Ez!#gD5$0B&FtiCPL;6}i(Cd-uHyI>W3t!9Y7D5NA>JZoqycIGXa5)NWP%oqNm(rHQ89x z@)?THu^q#k=@IHr4i%oSLceFrr8 z`S+9!Tyx6LC9#pE3=ZhC#Ul_uncPgi72t5W6N{fXk-A2@)wJ>~7{X0?!-+=AbAdl9 zYrlHW{sY+g$eG>d7j~1v-mdKfJOX__>9Z$j*Zf?qej?(3kf(@t>vLAFk#D9@ ze^PykzSA&a_3g0tR*SHFi99mGM(1ObMt$4Nd_lZ&inaMi)68@SQ=sQGg(V2w#%XFO zHH45a;*XJTyIn(9R`xveO-1^V&E+d4f5Yz%{`ilYe_(N3VRQ=Q+dl3Izf1VN%^mPQ zkwY*S_TT@~p&Hnh^lM1;IM##hS8!qa*1b%GpQ0X4lJGCQTKkySB*GWK$6>=|+ns2e zwr8R9W%so5%#&Ig@-l)Y2u~@sRp%PlkDcDXI1%#u@VO^tm9Itp<4j!=4)}ALEx&ck zOmegGkB{~X5#A_~6{Kesbe@NRGyi@es@DX0AawpUkUH@jrNi0(F;m|mfUTI)(JZ0f0e%Jl!Bf@Q z-egqS{p9fqgwJeNk_n6(uu^ZTg!nY*`y5lVZq_r4bK7!TkiAbKvr-bC{ij6ZXs6G} z`zjC>8U2O-w zZ0`2;8_@g@+rUj$ix&qN%>R+M2=kxtzdV_yOXi*UtUiRvpOeA1hx$~5sQl$=@@2>G zzw8hv|N0rDD2myVrMyQL6ku`+G?^QO@ zeGf1D)`#_%z`VqT*37uA)HnZF0e=G?sxFwtyN-LXax)hHSHL{)zUn<`m%~f5B{5|KhC&p4YaEz`+%x*$aSDiWJEfBTkgo!Y~Nd@0mZvx>RQ zpEt4wE-h!ab;0@OFiTVObbXEt(2_ykCStNeo0F1^HhyR}PlWe{`!T-!-Z3b>5yIJu z>EnEQ28i;%jid>ZI8&7Nj-Z)?^(zq2>$GA55CL4Nts<-hM(yJIH)gfDK6i8+|m zlXfx~%P%-aN!XQdiL;XoI1s;@7CAm~@7{X5xp%-z74a8)*wpF*iTju=*d31IXClWa zdPP#Ql(o44&J*HQ-)+{P!(DnGHsqD&0(h>F6J3K!G&X*DZLf;tiJev4J?OFQLVXu5 z4e`I|yQ>Y6mYS7NxZe$vhws#2x7lN?P#?84jDMkD_=1^B_Fs|}7FfNj1MZ@m_?*4| zHml^ez#?a7Wr&(E%HCAdcHX$>lRkO}$(_94ca zSdrddNV{ZD1^qb1z9KQ)m#1XmDp}!-`Qx60l`dgpPo2&<1S9%EKgW-qtvl-zKMEOu zkDn;LVf7h=r<>Y89J(6+w`2HAWh6fMJl1S~}WUx>ED^3~XKgV?1h>5SXe{)KEz^3Rg~czFi?6OawtCke zMh{P6_+2tUzrAHZyTl{P0i7qz3vrK2cC-DUf)By`Nk;)GHCDM<{@N!R;aNTTS-INT z{uN_at{5Y{ua63NTw0mX)w-5Zj?P!q6H~P?c|pqOr6`{Q_K%paktFW=_@lwG+Y;et zO}CNvf3F*q;JdOmtBL`#n*jmNIW>uxF{xY?R*>MLWZMm{pEeqw|uHe+~1g zmaY5sR#faM%q5L=g^_jp}l>h$88t0dC{cYP;+NQLP!v0|SM#EQ{nrdm6 zH%%ZsQFsQ&ayvB7^B1V6ApT6E<`0N;bX!aa657p?3NUWY&2ltm^qMI8ec&&ncuR|MfEBVd%ULi~9qKW<= z6~@z>O5mjZJO%Ou_D<+NW>tVg_J2C5*t}ea_~d?%HUH|bUmuS2pQ2_Wd`F^%%J)X! z*BHMJuWP%NdzzJ0XFy+znafhJD!sflF?{!a|o zwtVOFE79@$eZmnv6_V~jBc5?gtVeO03laDs`p4IY*1F-&{35_(sPE!1W}8GwHXLZS z{D%4wV&d%#o5Ni0p>ymY)-MqMq?y>Q)pWJO_J9jqzn-J+ zRyo>ple0_?=ka`^KHdVCa>9RoBFRAm!xzc!^_5;~EBGW8z%z&s^hgYO_kBfoZ^-Q0 zRDfT&(0pwj;5VxKBOKkIox^C~SXt8K_c1dCi$^dCdBG{cWNqc@F|5BVKAu)>o|G_V zzT>bZ=%1LRdih_6mh>bZ48URdDL1VY6!&jQl+N9W=JhEOspG+hYk4^mvo=(pZ_E1g z)jx$6w^BMk3o3r=19d9;l9K! z49{vLTyCJpCHqe2FoX{f@8EJj)6$*NF75|@pQMnLW^GZE)r9n2I*G{xSzth|Uid1v zNOfx&vUlglb7fsOmWOTCv`7A#==(!jqpG9J-pWj5#Mo|d; zUYiEeCk#Ro$#}=zT%IfX9_np^FKFLn(f)g|1KBSyU%M}ucdhVn?k6thUyG~G>5aQ( z%<8M(kLCZPWxfU6E1ZztCO4%2VBb$n;F!m+N(%vpy1uc)pa6diHZ za$JgQMenO1KMC&aiobT_7XC8ke|QRxad$qpNL*TzfbyY~X&a`%W8hwv*YY&rFUZf> zn8kDnNa6e5&nZLtT1;H+-L&G(S&nw0Bx5`%qIWd9)hNGZ?jIL%j{i1fK)xI2=cw8}JbF+V7eg6etklcqeq zY*uw4k{95gG0)77($?P#sWOlU;1}XDx3T%QIsGGDnEyKL$GQ>k;ZfVSAPVCL9a8@> zvs*er*PFnfNAYgK0_p3^TR1dY7#6?N5jxR5L+-UNp{F4Iz$SCKmBPU?=O0ZBOut4q zlqZQ-C8o5kG)4SE={fVKa;o;7kRCn2QwsR^{-P(%`=+QnG9t0}(_v-W@ai(0mmLU4 z@;xLCD?^Ifl~>CBM8JE*K;tc~X$IVSTMuj<t()>VBg^?+v`I#0HoYF4PxCJR4ogY~0RrX#Z}4O=(gtzueX_QC(+?`LsaOT($@ zSbdT={rV<=kaZ`6= zsPJmpO#DavtVe<7Tyd;w0v2y^9JC;wePEb*sPzZB9_Zf+E^Rl*?BkCgnE&Z%(do9? zU(fiB@4wjnYKW2&-_ni{4ZAojpI4hH+qsOPsj}a8JWupi@m!(Ebl|88>ViCGq4+|~ zZ4K@t`heMqUORn|hf(&A9S=Jv1}4kbK2<^WtT9r)$6r$ad(+oQ%2<6t52KZDrJK|H zH${f7Pl;9M_*XknIsC|MIm{F zd7yL7a#Skr77rR@`966_s~Ta@dfU)=kR{+1+aaIpZ)0?~!I~O@@Jy7`>eN~F%P8DC z9jm`*b8NWxNxE+s*HkA^K3fF)P56Vp?#?5I3`9>+LR@k%eJuwj8d+fRb{1}%`#^P- z#lv(Hz@I6$#KyFJn>wx}t>Ny>erN8wB#&FmPY^Z=k-bo#&`KMY>OQ6Z(**T~5I_8$ zINmtNb@SMSfd%q^C~|e(ey8mH;U5yQdSuGTNFa3`Z8P`h*FBhhH#}fvVzQqn)aS$? zd4c?DWJR)6d)Ws!$bW!6E3VqSI7y?>{?F%j8046?&I5UbdbY?QQ(jc< zw93V@JbRRXdd^Huw$NZ{@2GaUgzSyg!zNN?&(u}T4OsqJCwTfnp03%K)7JvAcmP=z z$s`DFru93yA^t}7b<926E_vVY!S;(#rhk6vq%&p4cP52-)yV(Xp@p6tSvx!6$a0kb zSKuugG7JhSS?cxE82-%1QEgh3)H5Hf8piVb_=d0l+x@G_ITO`KLcC&fV3c<8)UvF( zW3t%3;Y5FVB4D1jc5THG3rwF3$8l*tc0xIKcs24@DYZ7G=AJs`afJE?%wM{~?4;^H z5+8Wm6h4!Gl=gcNN0vtyZb--Yg(UN>p5FWGT z4=27>rh1nj=mdKn>^)qT2Tb^*w{>ss!0I0ZWabuT{!2I^uh70R_`iJJX+rgl z>JZh%rieda9^5ipih~oiKmR1Ezxi1!aY~{6b}#%+AK(|%!;qDU1%I;g794vKisf?> z^|}4!tEjuiqQG8;eNWNaUH0Ah#OwQ-`PluZM|kV0iA~`lKV>uc%c9booBS*KNK|A$ zDH7GWqqOdtvA!DEC!iqqC_Wt*IJJ}PTvh_!0)Jkyaic#RC^VJa*o)>}{EQcDHZNVM ze4qg4MFG7jo?NS8vt^A|WB2Z2{Ol-n`;pXwJN)6#gBTv;wKs4DZjK$~p_%y>o&uqj z)~{w^pBDH-C|+>p)=pB+hTJ#z?_!_vO3Qo|x4URoMFfn#iRwwgk9@0_9;ya?3-s#w z8Q!e%ajs?J!Vd@!*wF&-D%FJ6yQ`^*=sejy>IB-Wbv8FEt50C~N{-s&(Y4?v<3gc5 zh99*9mHG4`Kr z@6yp{h)*5bmRU^B+P)LwFDRePVj34vc3(JP9|rmb&8z21nsux~a)lA-d7=K-yUiE+ zjXRCP(D^EG{^>_uhaT`dPYKZdz+Z$C?Mh*!60drx$7MXN6(bwL!=}r{vgl{O6%%Hg2?0 z#S-X4@$??Ck2_bRa->Wh;Ty~cHf%l;xi-~f>pF}cHO4`G4IjJaJ$urP=m&V%>szV4 zk#XqT8T3BTUvnZz@=vQ%#wDarQ2k&A_u;Fi@*~e>GxQIp^2XP!J>nJ+h5ddyGh_3_ zyKt+hyX*3tUP66`VN^JSKjd-Z$Z~|o(4Rwa%WGS~_qslT;v4nnIpNKlr5Ry)ahXV7 zC?&-A-PJcdXciHtkbe|Yq!FIC;D%-RJ_^te;v?}~g3x2vXR2zx9^msN8>f^PPW?&^ zUu9NS2KCO@)%f~`7{MMFAw01H!wT=b9c7c9KQT7vJRewOfe*(V+`ExN( z@{rUs5BfK>#%>96f%c-56!`TxU#a!k zWEF8`8On!#oBYH(@Ro1me($M2&E*iBKZm)NNOqEZ@x5<}{8ihe9hurDly#nF5?Ao2 zhuJ+752536QTxDs8QN#3=!shx&U75e^m_sJF8JF)#$4;vQ(gga2S6WGjIgtxd3D(3 z5Yu&=l-n*q{Xm`RoGO{!&C;vZRx|aRkztQ^JpHz#*vJ{;9iK#5#p-5U67a#v1d;W{rhj@|)&$J-r#{NERKBz)IvF>umFS*M43Jt&;m{&xr zv37rH6iT!$vqbhH%=55dFIx1)Xm>cWXB1b8^0~Gzw5eB?Pon$(42Uls^tf5J!|Jjp z`V8?D?)}X-YJ$=ro^==aZ93)DfE6dFA+Sn_**CTA<8zhH<{ediaSGW(Fuy*gsde{s zY7y=Q@~1@K!x&Vxez)F$PkNFWeL!SwIcF{y+CNxV}QiZXIK-r+oze zoHl0v%fp(bZteL5{VLBkcpk+&qMlRVEJ_DI<^{IDSur$EbwiokdG5r4nfy4bAZ1}E zZbI{_6Bd7UR7!qkbDl-q^ZF0;d?I{mvDj%fE*uIEBN?OY}a91$NB~g@>po5B;7F^Z@@|GMhw5P}-Vg zAja_E3SWyGZ*YqkDTU`j^ljwE3X~QHuG;t!!*6lxw^FN6QMy)V8hT#^Ie$U936nOf zVIyni_s;Zer$mnlV;fcUeiV7@)?3LpF6>Wwg6;1RefRUbkiVbK_wD(B_>JxP(T-5( zFMi2%!uEeC90Z$6clKDPuMxRn@gvX1%N9KI?Q56bti|x9&L;d(^IJWC&D}{@yhi@m zI$}bPclYC`Tof;*)Dj=;UC=KMu_^$2AMA~q6z*piT}RbIVY?;JpFQ7scICoiO9x!l zRxCcz!?d+ATw0qZuSNPF=8wdemQXXjg73E?d4YPsd17XlZ>{h<-W{{ghgZU*~CU?&&4#t1mG#qQ^$f} zQ{A;8g&6?!hxm)mk5Xj|*9+f$Zr7sgLww|GTvxwuaAz6Z|2g1WD^Hc%D~wq_Kkdic zWv2`rPlyzXwMx_bp0Y6h!pr>jy!&JqdhDe?I)4S(S#p-kdSG=Q?+Vw4coWmFyK&GY zbk$}Wrf+pLmeonk&R@FxBMGx7$&G>3g5OL+i=T#J{)?l-*u?!C4@@&l;C+BzI)VnF zO9zh?Ta3-$fp|y0#}9+Gfw~VI(EUV?f@_xUX_rkhysEJC*I`|xn>p@Ld?kSW1@lj8 zBob=aO)CcR9oQ@Id48jsVe?nA=^Xns(62C$%AnY4{a$?5KAm<;ln-<)R$Vsmw#j1u z1n5hM=gaSkcfNU*zof^s6~znKI>C=xy9T;k7h2EE^L7e1H0#Qkvigl!faHhb)JRaZ z*xPElbg={Cf3{aDf%%liwx2k$C;Jt9b75 z2dk<$n}1BRMZq6>#asT7#l8Lw)f=2!mosO2H9RlGmyL;gY_p>N@Mi@hdMUoE$8IUt z!c97vt;6KaX>>S2ImN^@v=Q(U;tjZG|N46L+&NVd2=(spe@7gLIdCJncl6$Iz|#?t zlvyQAm2F7q^uCALFJ7c^m&yh`+|qj>f8alggDjm?HLP35R%88LFt6nOY|Ve_!pp16 zf!|?1p1~6O+Olm~QTOVw^HWjI@9LVJK9R2gdLw=;CN_sLEsbq18@Uyphxv2G;3Jx@ z=)Lb#j^%Hr*IjtlY8KJ_2GzU5Jn5d4@>5f*-&XUO{|h zq^Nsv=XJHL71sMP{O(D~~__KuJ<3=3HY1ZO9LK9`{E#e4EeMxvn4#!?b`et(KPrApA$WG|NTzn zc_@F9{UXt^^Hs>Hoi=72bJO#(BQbqOer7)5ua$qeuwG$rD1_h{IR1qH~wz9o?J^MQy>iO1>Dxw9$Nl8tl(BH`*-%yXFB2CItycGRc zQr`>bKSlYiQ5h$VqXn(1xMd0WOmS3J^Vr(F;=>u}#{zz1_k>lYdhj<^FHp%q`M94B z1ik|^8y8X-@F&7&iiy&kBt7|)us^9eh<*yZ0l%s;!zZp#7CJ+})NgKPb8qS`t=xw6 z1=Q<5bno21Bi{dt3x*FIz5&y3O*LbUuoV3t^h46lzm`2uF`mjn`a(hGmS~Zb3aQ>j zmdKw}u%7Xks>R%4#C;NAmXP?^5p~eng$@JwU0v>U_?!7ny`1%y;p*766 zeIz1i#3-bq}I^^7>1c%V6LJYqY;#*CXW>jjJPfHP!4^aYj+pRQ>c&A=# zej(Zr2@PkrgJV*AIj;XQ5 zS9J{kYq~q6b5!pn^u#hjzk~jG!|d!gno8MekTydP60hKc#^o?;N5Eg`r>p4>=gnPl z$ZAS273G&H|D)v<*6n1e1scxGizA0i7MdT*KI)x)9E;EPoQdUnw!O8mzu4Q>+PKy!Qvm38k>!Wc%Ci?0-BtWy}{P8OX=u;TY00Gw++3o zLOb*jF|N}(ggI0O@v=`7pT4HWspeY{*%~q`RZtG37OJ$4!n6D@R{^{Mu8{fHm*B>j%RhYe+ z_3M5HD`D^2=+-La?@; zL_c9xd354Vb^QOnN=dsnw_FM4?c1Sx<4JZ8KQ*he;fkQKai=BX_mNgY67%L&n%?dP zOB65QJm#q_6k6T;n&OJlt5{g4c{V{?|80~I{a!I0*O1Z0x6Kwy$54ELtu13^a&@?tev z5^loUwEpzF@P1&Q#g&Bc-%=NKHU%O3jvalwPl?2)d*aQ8^!>Y* zAb(vn{c`&Yy3bh3flp6RzCcvMjL=tGxjtyqLvP@(AEF+KO?KN`^ZmKyq3FEX=e_IQ z`m`;=(l2er^5Ifup~0cF`l|Y-c@W*fHeNt57itR=`@=2J zygo&|DyLtll{jF=0sW2UcZ7X!F~4BJo4{Q{^(6{U6*E$@cx~w7+GJ$^|BUqCeds_m zK39IP3(W_Q3HoEN#A#5#=z#iDz;_YLDgw3-)CEm3@iox?OXt61_h4G;T3 z&ERF{`k2GVS6)#4LO=-7_61Ons zAv|KwSK3~nVO&kU765n(`cuyA)O&pAK~|(^@Qi+YW~OG~a(yu8P8zaDL<ZqY2W}RIe=VdTc~K}khZhuRJU>HxJTqTgTVUe(70)pqd#!L0fc%tj zB-A}OJe;d8wB%Kw{L7riiARRagRV3zKfzYsvYXD6+X@fcmIMESKRp@AnAe?gRCAXb z=0D04Pka1(Su^p$D&TjprvhSU{bsT-&i9KJ;2X%7m^h%7Z16((>o&GuT!EMVimEzr zvD*u`7v*Ou)28}oPkWS8U&~}zzIH*pft57N$f@r~D4I9*vliz2=M6%BK&TG%gLt-f zMlsbG|3~NBI(UDWC&e(Gbviw3zxbLHmY?b25H=B-j-{LDVE#SD>myf5DMPc>sZbBY zPqNe_l9?T8_1ffa8G2sj)Zn$u9oEkXoG^4fw%kv^HPNJsEXGcvc#v%pf0V$*QPR`P zLfQad6nNE2S*h=5Q+EUGydWO`Z-27CsQlZ09N;Cy3k6$8xI67itD0x_i#W&;K6`G}9N`i}Bh*~{`debqDm{JM>V-SM5SS8+kWe~=F#8S?rEHwpi4#rpje z_;Tnk$$GN0H)n5~20Wh*E_ZXxD|(g|BOU1r*w4ewhkaFl^liumd4}g{b@BFaf0}FU z1MvxnAAFy%W$HlnoNy!7U#7r6+38M~6rVeDBXCmpN@njgdLEHZ^6fkpM-vUN7?3vJb81- zdbv&-xbgY^uT!af8P!uM0`XcoPI*R<)^>)-T&UnZemO6r_>!(g7>hPQ|x6`s9&y4{FX1fOuQ zcR}CbLzz_?t2eG)X}KeBGvr4UzyIRv>9F2p`v6{{ed#pnoFWf9+I?KD3!?Wlf9r@; zPB@}gZi0R9XhBaAdXU_D6K3W?c|{#|kJ$6FXR?8b{0GX0XS|HRe6Du;{w_p#AnGx8 zr#CMX8v95Zuy}sYSm(l0Z!+ajP6*&5#3$wv{!^F|-F+Rq!QL7baUxwM?syS@B{W{7 z!Fl#Xwkmb_I^gJ8FVXK6SD4X;#5KlYE2C%ZF|tfuKkl*fP$3=U59B#OkT+WDeLJkf zWEk#_VLyC=@bJtSK>WeG!w@P_Rf^;K%3 zn-}6PYDM;q;(JJhPhLic3ON9`RfOr+TIEk)G+rMq03)XMScFa%cV!o=2TjSt>{C`SG>cVD=p=GL< z;!TkJu$?sB)Xj>!2p+L*7@msHOgcB-S)8`}`UJ*5(0}57Il<^|7wpFh1$=eFmES*= zR(!XBH<)J){r{g78{>uk6Wdwdd(ihk$VMFH^pD6fNw4$7Y0cRdg?eQuKCS$umAq%^ zvWB*dKy4;N&xvID!Hn9q&Z@O7&=MFo8b`V#LP$>0|^23?=rf#KJ% zE2UDLAWW+_>s0n%kaTlFD#G&x!OVhHK!3p7cGxfc(28N?2zcxW`!FMagnxng>!pzaKvY7`veJ9$|)cy7f4u2aNr2u>|~_&J28zbkwf8NYM-S z`xgjE|2ShlAkBT#oq_13klVP^A3g8o@WnDr9!R+E6Ru0t{p6s;|{(- zpXSz8Qz7X2*)?a9O8!a63hZxiL;9H=rD67Ht*rQgVf87OuRy;mUzm}fUKWO|sXmU* zm%?H8b)0JxhI|sj^CEru@YVwEirt=-ihmJ(*`9(_gJvP_z{9NLi2fqH@KzKtbGh3> zY6p^UMNM4c=2Z=r9iyWXC2k#2XR&J@Ktn&0L;JEX^_wt1&FGWdrQH7{toy9 z<*Q_UtCdz7=rh~lNhN;|zc|!L~YQEF3Y@8?i!#*Fq^p!b1%iX+`LXM5<_ zh9G2bDU`J@`VDr~m|A$AKzI$`ckXd_o8Qo1)rEd9a`@G4U~=bR#HW01OE`bq?9{oq zB$_hgYR4{1B%h8-TaL}qeJcFSAJ3!xjr6mUoqMyyJ)?INormZOwb|YErLdv!HWkZn z;Vn!L`HeB|zMK#8jK!nkjQDD6%Gt+L(esN)@m6xK?)hsTq*NDV|2U)`eHF2*dMxq+ z&=dUCgBA~ic!C_9yD$Oa6{W||o$*+^;moRXD$r|`?U<`)Xk!0Q$SMvIJs$-(K6hJQ z@j#@t<7aF?04x5U2G^JJeG?GZSM(bf>84LG;w~ z(@G_GS#nf*B(B4@JwC_#{d%9D_ggw>zW~X1 zN@1n>m11H4i7NJYi1$OkPGjZ(_Z_ajSD2W6bXQ!~kqCk8M>)UJHgFoV&#H-p5-Sa2 zV5^}EvM+!3B!20z-cICY=Y*hq0$EM70g<_It>|Dyc&W^wmvV-;`C*6J)4)j)%opkp zq`Q7~=Q*Vx75J0`{=)hGEri9*oznbUxZ}WY@PBZafwFQT{q+LKcYysO@A0c}?%eF4 zY`MP_$)8<=3|>O6X)+^m9^fz3+lc0hsZUampO-(2>|-`nN#w4C35#*DxG0jHcuT-lWTMf@o)&)dyd$R)if&*gf5Pb{0ORTI0gDL#hMf)vK zJ+=(hUf(CH$t;}-&{u$797y6~{tXLy=L`$^Q|f|@CX3CE++$s{U|Gl>j0jSl$DicH zMYw*DkHEg~=vqSZcIwJ7rdDC=mB9?RR(;Q1`}2`I+HdwL?tjhOoa=XZSt%fW1?u~B zaI%Oa4)@-j$MD2~6li8PYXQ8QCTEEV-v&E`B3z^vn`wa1} zdEGltlDC6C@*fILS4zH!FG?q0+q=3Ue{O_YM}Nod#gf-fK|mjHzSHRP=KmW03^;WF z{5?=_As{c?T&l8;sxz?@`6F#FONGRHZ`O8Rs7C8C%I3?L6mxzVla?WGB9{f)cV*Pu3orfo0})Z8QyPcrAIJ`S?Jg{K zBQwmZPD$Lr-*8&bOx)qKtY*ap6L=o_5i;+7WEzP=)++Ik{vi94CvLy<$v-vI`7l;L zAl<0Te}lC8@EVt3I(<-Skd=!ofNj$WzFl zT4wc~`qre(kgkmA8}`5An@Oq_)qwm3))UolQ&&-0PU9H&!1_WwyNYMIvE0`vf{{bb zsvUxFZPI)m&aC|QH>Vc(8S*9Osc+PeOFiy>IUPMu>85U{(oWElJnVs9V7;b!HdXz0 z+XDH`oVk4PLZP!T!9mKWr=n}`IHyu{-F6mPZ02j!m8tshQf^=K)( zyv`Nkt_oNwc`zQ(KZkcPJ3F@@SJ*0t<#$tN{UeFi$$PJ`0x7KuecXP6~4#ND`DNZ?=K6KDz&SLt=aI2NT&;KGd)?Os}0{AzRxab1O z&}rliS0Y&q6IgUeTdk)O~?`ru_EC3SfP_i?X|+4Fx-LZ_gZ4!pjG}7?-Uy)%s$Z4KNqFyx1wfHcplT| z@QSqcmHjKrZoV_c^ox9>?Xl?cM8qi$(6fp zo6&rs|4qE1)lmPnK*fASuQG2h+8u81?L?dw=x6ABw?c^}_tblJE9-S=KPXDSJbv{i ztYh>#9mskz0PBPQ?(XsPd&%2;8p1-CV zllP)#Uop3T14}(G5b47Ze=WaAT4Q>qs7Mj$6Y}-tquTriE>`wB27`P-{a>9r^%71h zdFUI-5B-^x_2(JzH+HH=RC1nT{%ogUnx6a`g*eHL@zH-*oIMzb&i|w(YpWcMM)ok} z&!8cGv2WukPw01g59U8h)Xyfwr!IIU1$&)>@>MjF@~@kSS6E~HUV;BAijNxo2)N?+ z9R1Jk<~^a|51Ns-Hnaj>0Ul+amFZboF8*L2itYcdP@AnP+n1DOyu)=A@`X#Jr7-reW~XU*fQ zk5wUhgLJnKStJ~E2TGcfPO$f67j~US0&t3hV-FrDVCpq zgqu@b-uRo#!KL zTZseX1^=7EgbVpDKGaen6z~GY2R{(3);`=*STDfy?%X13VEj(%jfPmXzHt8AXWY_>QnqToDdGmXQ}HvemF-RW&9K3#sd9vc(T8vc#-1|f$AmHKco)&$NtX)Uv-o=Wta7^ z3*?pZb7q~Nt;wOkypjB->|%^Nol&~ixq{M$`G1abX_0#T6DNG~uVel!@|oYWx!p0v zyMKWELG&-;Rg_0i0^{XC9|nJo))s~;4|nyDVPF^L&mspE5x6SZ1qY8k!2TEV#5To` zyoQ2n?9qBcep?+WJ*{49v{&BN$_eO@z{>yop9Dkqm^HwbvP z_`7=}&0|N#$YBeR$Kc;&c15tvP8}N$0{WP&(-LzxFPN{dyH(y6;lFHQ3z4a!Wy@>%X+PV-+-THa>aTV7Wv-!wEk2n$QPLwW4^W4O+(W| z)L4Xf&>!c@e{~%-CS%pDXn&ypd7*r9RjXH>Xp4#qWwcHUrxJCdh@YE|7h z{-C{UyZu_sJ{@UYR_Xbo{?f_~9N=H@*NKj{ix;hBExHQhf%tC(A--aC(1G*RH4w%( z#g1haaUKpmU#u^pB6}O+Q}^L~^o7jc^;ArM>7FDc`n|r{?>AJ7@D2Q>og^&{n-YW1 zy_o$@mbwz-RkS2gw=SZ1giMq4D*e{vTwzME7iXYjN zun)Vokw&T93$ECf!nHE^>$RJ4ADaJ%Ln>-$iFI3>b?Ky(_-5K+Cx`Fuk1hDeBDhC(E|ocE#dhond6?~ ziHBmVP#dZM=_}xWDH62uQuyL2V+)9f3ltl^DaWk3`K67UQHuOa)s;G14IJf6LyA~v zy#(p8d&2Z|7AN;Pa}fWt9cwK&m#^DU?(`1MTS2|V&&pAGZ8q(Wc85!__)$Tbczg4X z@+)fs!WH@)giZ+&?e=nMK8 zj?kG#eS_apZ!HYL@Wb2Y&f~Ix#v3V$y2zfU#B@3(S|;rZt5Z&pEQRr;TUVT9?&TG? zuLAy~!FhC2`TueQYTUcE$Km}@uZ(MNgOi%1YLBa;^?-UdaTY#Z-fHB-Ix%tZ9bmW1T7ZF)(f)kL%N{!gK> z-cP3LW)llESFI{N^9pZ{=mYWxokkRfp2q&H#(_S^>XF5d5(A4=NY|5-G5WZ~4JyhS zd=zp>kPP$*`RToW|D0_69!oO@`x4?^g>+~pBrq$!=76(+dQh?(iRPywyWXfBIS}jy z$YFcKzq?!`x>4!p)BEUoL9eNDiEBEsa*WxF#>e)~D@Z80T~7R)u^6tQ-)IA2EGJz# z)NMr>S|8iE#85FVe^cszrI>$T*0bN8lQ5{E_HFn(S}&Q(Vg1sCn%F z(ERm3XO6rH9L)C)xDyc!{uc$MUaM)qd)Ut-z4O;rzR6oBym=br8T4Cz?%wz%`00Vy zLeTe$V0^6YJahL4b$}aa*bDgx4%x}zhNB(+QAQieXe>3IyIUGRy zOG#Dx!0J*d|G2t`=oSk58+3{LYWtdn7YAFKG5hS@nG&n+<+3!>H%mm@Dt0_X)gPXhm^xDQ61P&Z=d-JN#DbEZlQ$UPVCE zYDp{1Z+1tAzqOJ36~kQz(0pWFiR7~<2i6C5Sl&SVL0K44)IoHwlPnT71Ak1*yr#Gb z&WDX=ZZ?)7{fvSi^)QP!USFuaw+hK?sK+i>d~|J()FA#k>X#%Ke*3lZoWE7dO|h-YuK(uqxm`s5g1cJmnRM(y1-?=4qzY{s{>nM50a{^O1GpPG>O zu16)<`@4zzi{LZ`bsOI!%5duRE5{%K)cZ>s`tRd8g#XYliE*89FL2#k8{i-0k8m$e zok-Cyn{o(q?ia?cn!NiurrATqpPb-t2s)DX1Ck zj||@sD<9SW$eZ+_)&kxK^`#1mKeqISbhMy)2@nsF4dhl-Hhghdz5;z8>;ZzMrTYAk zRx2zX&mQJw6N#{XCh#mxR9zLkuaKnL!=^uzb1$agAe;)o8gqt^pQ9iNEA&*;L zs-qOFcPbR&FT}6f8QJr6cZiJthxA*hC%GV;GM_PzkO%oTu;2JS1f11MB0W~0iqYF} z^MeVGr3-(Tb8$uM%kEYZW?2{8MPH|WLiR-6k&v_LT*>&GM*{&_6j_qf5At2n?HSWh97KHK|=7`^K4tvUTRe70Pgkovo! zs1Bny{2rcyo^tHfESoFX{t7FXoe>Y-YQ@FPaA*Mf(vkN?VTdzvP=?rW=W{I7}&TBFjym{9L^9TEH^#PY*+g8S@x1s2LAU~Pz z%-F4QhBVon{{!lml*?t&-$bM#{}*M%{pIWNn9baS8!&rZ=16+PTdHOpeP^8;rVsWg zP%8($qAN|WeFVIk6$F%@4Ahl+1?6@aVD#gtW}d*GqE4TeH$nOY)CcnZ>FM#(uszxY z?T;)y_QF!%l)SM;n=YaAg`ltYatoGkD0wdg`2+qPd{W1}d4sO|wKrhrhh>gpUSzoP z3xzGF$o>I*br|p~>Q>nJ)-wpZ#@i%FX#zuINWnn-Njb9Z1C2J{D(M%EgXoLxNXn&I z-|XXj+6eLm^tb9~6%RZ1yvs7!)QjnJ_$1H1nb(;iqCCJO@Fy6T@UA>dC65_206v3$ z-!sr=F%VE?G$HnusHI{b(L&m+7ev^aM)IIVf_ zB!~7}X5(CyRFULRT0iyx?GNPF7C9Mse_`2BgJHhVuj$iv5#z`MR>H<6kaw_O%)4fd z%QvOsnZc-DB_);M;U~1E>SK!HSU#DD+!}vE z{!dc`egR0{>HXZSgHE&2FZ)KUKu)U&DzAl4pO3 zuJ}SnR{b$e+|j5T*)+B2lNE;tuVKswq$T>|0Ns1Z-{5b z@Ki#%{f6TlV+FKdwgq0ywLJMH_KVBqV0>lMvNeMux_R5X!=9eleAh>8mzO&b|3w?+ zhXKEk#b2C>Pf7wmSi$?i|J2P}pa;cKsOO6#kiSXb=-d9ZErwX)v*8qq*UM(^kO(Rl zy*R`Vz+YhB%Vk>VH39~-_hmIwYGSWm404+g*f`FVNBZ-(`h;e&#H zG$ku0_t`6B@v{uo>{p|QOub%PHeq-X;T6bwp(v0TGy=asyhTV%6q~bb9&`AJzCfRd zzR%@$H)V80>tgsnqj00m@c647$D8f5QUrY(>SxpM7F7sqj}LVN zy+J+gLJ@r@`-tQ5TPOD;`DpvyeG{{bnQ~Nl(J-9<0ev^TJ;8i!n#3m;&I5uxt|l%@ zFy5wX%2Nr%g+br?=+Qo~aU;FVrtj#GMftQ)5&9 z+=kUR8D?HckSdiL(fBWczNRQzpID3U4^=1VYyf*{6VzYX@-zRAw3gL>@fN24F0}bz zn5R=ZPvM(9(#HhpoeY9yi;dCEFG(mq&361%?-lMX`P`=h>k0XG)uwjDdlI*HY3~h8 zUyP`4c;f!AmhTPz4zTy2U+Ry{d2tqBJsKoC5S|Gf)XICEU&rzKXM&MGgIzrkBiD5M zW}R>0X*55mcbM1_HY8?^?PH_&Lw*^V{v)Vo`g3#r9DRT4h~wC7TH9yYhS}fUOtZA4 zOcPzZ01qU;Af8ne#oe=g{P129@XNg(S(th%zp3CA>(?mY_mr*UgxQ5fy{nsAt1qPTsJ2dEUO%^{-{J5Kg>>cRm)J~_<^LF~3 zvqAoA3O?e=eYbr_%7T|;^(SSHzp@{F_}{YIo7at_^$<9e#~EH(K=D1eVW$OJf6ZSW zcg2J88B5<d61`V2=Wf%-a6Z&h{W4+cePt^og+Z2gMAs{XyS=gx|x z{udb_W8O@6l`PQ%`U3eA;7^m>g%j_SX#BR9InJ*M`PwTx2;VS!GsgII5zfiVeeJR~z@sVK z@3y{9cUz>7Po-k^Ph`G+Q2RB%XDs{ri?AQ+)9LGR+yQ#?6!jKXPtP`@9c$@N}MZ zlH6d0&Y>fzfG4AZpw2cfes%m$=fXskFThR}`@6jK@jNp$91QmJXG)c8<$au+rs;{U zV3eN_8L{Vy!SxA+Pz~W>B>$m5(?nygL>x$luz+=yi%|H{uxEe6{g z-L3?Ze1hP6s2?nI=lo|aG2+onFg`dx7Ex2l6W>mFWDTSGl|h=Ko^S zHn6oI>%ztL#yK_=(0?Z*b6p>s@!r)WFHJ9i`=MSs(Y(0i(7oi=I0?`r)JNJuUz?ke zdhLYcbyUBAl9p#y)TWagDbiSg=_ll9`NscnW~?~#F|6MInH_}Uq<3zA{f}3IjW?sS zLsQ>-sC-`R-Nh9%bw<<#V>Q&v^K)%;BPZ~AGzY8WSu(0^uNZ{!&y2_^X!>>Hxez1R= zFX$SLt(2Rm595Jr{3j7_`|Ae@zg1C@{z4&>=rl-8W*wu0eF=Ceq>Jvi#XOGo&shxLP!tu(HjV5n=%H4F1>BA3xBw&8$qj z5X-No%*@l}>hDiedD}H*f$TSY@Oe4azRZD@jUuFPK|emH5I1{5ar{xNz8uA*yv`S| zu_ACZIt-I9-E>-|=K_lxD+^6P{v!XzZ(&_2SDmyeMC^Tz+`b{^KYt#^MN<)eK)kn5 zF1ty1{BO^FX#Hf}3Pn*&e9w0yM+Gz=%KB~84fC9%R8sYgu=fk$JZ`^KBk{KySTFSc z@+@b&G*Y0Q6}%7Ziz-oLdxtv5XWwNywjaZlHVNgN=dG+dI(lAaT=In*MSfP+h{gl@ zn$T3-#1t@ZA5bdC^vM}Io!O!>qL)$;Qi}f968m{jP4P+iu@EF*pkD~q|2$c{DiO&S z*{L&3I$e;b=gwIqf$_6vM#ehpZ<~lb@)CibQGK2M-t57GF~4{FCsqrSwK4nu-8!$q z9MGRZ9+OEto8moB?QT6?i|xm7WF)g0yw0yr)S_!aH%m2b*%3OQ_+;_idJr}b!eBmTw`OA!b|ocfLtBeo8{?3;85f;~j(fs_yC_pTHjJdc3dnYR*wk zfEngLqO4c*9XIHBF3f!%is{Ge2hDM~h~3BftPa6=Tc^Qa)TtWp?3&sdg`O8^dHJhq zxOI?%-*%$)XX6#Qp<$~Nn?$=v7@o|A+Z81gU%x6|?~bkoj*3kG@ck=leb>&}*CYRi zwf7EdSspw{Li#ABM~`OP@g}-fn|c`0C!CicE+qbKpKnBai0P{i>Sh-V@@+W9v+5{* zEpy}!Kebv?$g;Tb`yBq6>e37}_@dxrHrV*^#vPemmsCnJy~ zSq#r>MR=3Fi)c&7+QKbhK9p*DTY1qc{f{w*Ms5f{97k7k#odo0@H;u^f5_i0B=a<` z98b1l8S9K(I*grPi8#?DrvUmU@VkRoSP^$2In!VR)-PKI{<-74q~%W=G+i+L)p2m* znEQiN|AOuCJ;2ZE)>Nt8-xjJ?t;dmkhx`ggGjo?}TV`_`!XGy3U+28TfkS-efsIcq z+vG#ov*M;zwtr#Y(+?Y`g2LjF-I;2)e1J<8bSh7;x`PETEvfc?duHf_9L;98O3Op&5^tn5WIF5Yd) zRcd@!BE~=XPj}?xmMAy7EubR)6ligl<0`dz?ro2hki7x*SS=$vbE-nkM%1u;9d9*8 zb0H_!CnL%U8$Y>)oqO)xch2KHI)*3dzwi0xBA3_coa2P_KT5S-B~Fz3E@9QeShyeh z)A0Jcg>HXWDuF+&6!7H$_nUr&htaj}-qyh>-slWD-~{=pvReOrS{!SH5A21;a>`x{zHMFnhuj=K zC~+C#nYwx%9Y!d>L@-RO@Qi#*@AaFjw*&F>j<$}x26w(=D55vn!qhC?I~5mWd!J+H z(*!etMFrd>LTr2W7{X7%LSqAi`F2-zuPQ?P1?;b3UX#_vtrtz=+%nMj*u(SMdYd{F zS%;o)1H71m`Y)s0xIr6M1BnOp3i)HN=PAl_3vZ+zc#rOv;Yo4Dp{wy6gY7^MPo^Lr zB~&zTusU(Gdm8qB?-F5g4$IKwsevg*U)|JBQei?~L7xs4<43$yS5;tK$(YTbt4HjW zXLzht%TcY^WDLcJA)nOc$|y%9SzQx0Hy&d`5KpI;mnjDQ7vzBwms8w5%<4O2+l$tR zGOTyb9r7tbcqza~)5PZV!jx8x z5JW$a|MuOIn`$q;nF-hM{BZNwc5%u_>0t#U%wI~*-qWei-PEho6Y>3RZsdXdWWi_I z?&nMUti2Fkv&nqF_`8N9`;9z9fL_46PwBNQG zm-KQ5)nk4C%tL-F4!fT$T@=T!u+aa*aL4!I$xC-m-GTS-e7^W~Wyl;pC{FztS@>&s z!LcN?z5-!kfpbv2x*;_w3-e!e^9ZRGnubQSZxGJ||8LFP2AtfM$B7>uFnyUF5VXBW zMazEeM=dXu56bo;`Bj+v6ejO|lZfzDfY)gqo?dfmvSSeg@q-MX{p3gM&`Sbuc_L5s@{~Xo9Cr7OUynO-hH#XzB zzFmL#TIpJ(KSMnoL&?ztfqk#70RQ8ui)+1rR*#>+LKBYXk> z!8TI+*=Omu?L#e)eu5`4@2dD-PjA?gI7ffR`E`EFFZ$S7n_&3XW2F1Y<7KzIP2gt~ zuM~Jq?6Ed8&RyD|8>|=P?~e=# zz8;8AJGdLjadAzM|Dg745atW&t{MbD89&ckcRj_R$al;o&tJ7_^Q^{yC^_){O}Q1EFYjCw}8uEo?jWn z!}?c1{OU}%rRVC#K+`O^i%Mt3%Q@6ub(OD4FeyZB@^jK4CR4-;Jmz^ z*|DP58X`eY?Dr=v#&3AZW*72z^Rt555ntu(+a$WU`99VtZXJsCMluk7FGc@TYW#QJbqbnSJMIksqx>CSA>-TAl+12ER=;0%m`_S9 zz9psJ^9TF5eKInQE3D_{g$DOWWA(NvB4%y`^YM#_*Zkj6JlnQ+z|Wd&|1@~oF&V9I zU8*8(=9fZ)9!K*d%J*k;$6lLx=bGgzpIldp@Xv;1UJ|#9A9%#$2D1MtqGt_img@FA z{9h-K{}Rq0xwMB}lGJQzgz-WC#3gRU9_gD+z3okU+p@ZHhnT4UlloT0tf0RUf60vV z%*7wQZ4?Z?9z%F#d-+qb+OkFWic|6evHbpw=1ynaOVcey)~C>ZMc!yGxYZ$-$Y}i& z_8;Zv?Qw3b&Dv1)t{3nV?1^_h-aq#!@XS9r(UHINXMh@4%yT2wFRcrdK)-QW+7^-6 z>gG@WgYAHS9+S4t#I;xWtElX|3&Ebij|k5242c6rHgv8%qAKFvmCL3(Se+EStjO6z zEY~ps`~`XV;!+gX&s8Jv;NBKQ-?FJ@59`Hv+fYW79EP{Tz_5XYj`f>A|$Rq@I5o=wq5< zGgy&bERCt#y_wE8qk4|D)a)7wwaG z#%+ab$}D9e$-0*@M7-|YumjyMOH;TIV-lk|9GmKd;j>oW$~fFB2hNGzoH=`uP~kPP zq9#Az9U5tpka?vU+%T=e~{V4tZ?L@%zp&nJMhqbhF*)*cx*{cz;e`aOm7z#Y@?cY;8SH)NZ{@`>GeBZ`sUwIr-?tbs=}x{)z2J^)h+F z=2aU`eU$tK`!U7VYO$*5m|tj&M3{TX4WCz*d3 znz%VT%=2E~3`(MILF=U@AKc8aW?sraGRLp;2dT}x;)wHCf!+}Q=mp6~^_o*T7F0Apib;~G zo}9hJkZ~2x&r(WZJ!Wk?x%yHcySe@yOuOQDS&CPo*uV741L7*R4G#G%J<9raPnkmUR~r$W?9cVp5-j zd;orRBt2|8_*>@FxLX~Ve|dKDgs0&BieM9iU`(HKv?<9cxJntUjI5fo?-&1y&E1A8 z*VsLU;UT%ikI^Q~oT1gC_|G5Hvad#J^3n>vT_v-b-o_q!b_;2$Nz`-PnoQRi-$%`zyh7(R9znNmfGd1b-Pe54;!M3-+8muE1%v3@Ry|MCLc&#B+56`VdXXWx#u|LknF zi7-F%*PQ*YP@FAWyFvQWl!)wqs8`3e`Vg-XXlPoG@k_b_ZpomVx~V&9uAT{5Uu5E& zNusXM2l_|$*8UKPjMjy{j%H!^FBGp+#!X2qgFVz>d^7CnW~B=kT^E?THx8olQMyg3 zRK3ai*z;CK*!LFV2qc>uImu7`IH+F}MXRO#%ZD}6&|lsHv_8-;w#bZjqUOw~Rw~+G z$~&W?qQ?E}_EtU!$toL^4ar`Ikocsbg239@tg;T-(9ot)-gl>UFFg+zxS{@2`J}sM zMH&xTud7(de?XZnYcn%rS?#nrd;+8Q;lO8pZs!-6s4v9wr`TFa1iJV8MS-t&4NAVi z{WF)c&rI$$;}dA92yZFF3US5eYmDe^ib8CEgw3PQ^y>s_|D)ZApD5Kef6(FrcIM@j zT4MSczT8WTk@|^u(cvj(&p`hK{l6(9{yvrI2~yS z(qGxJ;nOxMT~}S)ZNHbI_)B_27PlKh)bA9N(EA0|x#Eh!lycpaH&jesIC|aTGAfmB z7@+=!AdeP}jVk9ftAKtX|7T1kDkiDq%WJL?(x0FnTHnT; zUYk^%KO4Y48KGRx3))@zG{su~E>@pP7C^XS6!v1n^{EM%59k}B%5U`T|JHsor?o-+ z3+g5Ovc{kK{5(us;Wqj{rKhv=p!J%|#P*|Yh#pWrS&?~GW167nrUml%rdwP6lr2+# zqlEMgh_5;DcXtx39)x0|Gh>}7V1b*|Vww9Y}7iZI&v!Thu@R2 z=N0opkDXe)qO`a%6~nJWe*=#&qczDM`@DcYAU`2I%tXagHKcqiybtoj(v_kfw{H8} zXSYQHHl8CT^|+{tR-(sMLkZv?yL(yob0W`lqg99*I$z87@(KyFR>1Q%d7nW10q1F- zY~^+3hb&FqitJUWuXKRco}NV?@-4^qgUpwD+&T9~>9rFFjSuQQ78NSJ>YsQ^0Qv{{ z9l-7F;C5&7Uac=g`6QH)J9KOE8r9Z#70{2WrYY%xi&gT3Cate*2a$eOXJbRME`E2( zNtE*kwtrKQ{BDX{lx zH2?lb)IHCSVER!yvq{b9y79J@@pkgreVVuB3zd#pwA z$-0cmuf&SmdHgea3{;;@#^<*2irpGQ1P`!&ak7~3#){!cqgYOqn;Y2s?0k~AGDX8A zajY@~=zUb+UF$RQ&$Hg0ooyt*Kd}FaYq`TVJG-7aRHEz1bhVO>pc^)f z`}RQpV1L)p3vgaT`iuW#h|&LbBSe~k;{}J{2o~T6)KB=cem1P{tqFlO=8Ro`Z!Pz8 zyX|m;xB4ZTzwOHMrYFUt0nsm&uEBW0-p@N(chRqgg*c_>1H$Q z;w78TU(<(t52!~FL$Z++lw>B*UYVB4wolqRk+KrDP~~)K-(1oDQbsxt(8>SiXLO9V zN?^a(Gj}Gaw3aQ&t2WH#f0B)Pe*ashogv;x#PGAbu)w@G!qn*RLkd7|5YG&?%&G9& z`PO6k$5I%Npj)B!XrVE6s?QSW1NhZZzG$#5IFfKporUBLn@kc}hW1k1*?kdMzPUI5 z+cziwC|+yQA6UJ;OWW?&@7cRrkR|vy=O5^7U@q1a2=f2@LKD6tnx_O6PE;Zet>e>>qj|3 z=oCzT3-ki^@F{6gfgHWm$gquu{F4;NJiTR}Zyuh{JjBMvUqBTV(eW=W`GP6%FF^f0 z*H)pLtb?_^umJuCdJuiHZ|rywtIh%c1Na9br2X}pIW=jvU3Lgx*p6Pz@kdS>r3~s$ z6kqsxB=}BIjPIIQMzj+~&$Z*GdUsM6xAs)W!uy~eW2Y~}eV~S=jpDK3U#zBwU8xu} zw(k>yz6ADlnu3Y%qEri|*Txfb`5wV~W@c@Kk(dH|R9}pJqwt|u&SGbJb`|VDWt4LH z)wr9+l8g$6uE!3C#K2Db9AwOC$jDxk?jUuNvz$L3^x_vm;61R&EA4dcJt&G zApW8Bo~H3scg9@xKhcHwT_Ch8>USHAK7C_1;1R@+3MO%}LY1|XBJjtQ!u~o&b^Ij0 z-QjA0&WFJN)#H}Dj=0*RDG_%N{>g^#q)5jW(^)HDVDD$mAD*}9CAV3_ z{x?IgPe30vZfOi0VH&y!H=jcOgu2Uwty`T_Z`&)Sx}a-;(jGtG&<{K7$3}za?7vBw zr}vPeQlH#kh<{{@N_L!*?KBZ_OhS;qgF+@KUx*8M#QFRW<}Z-pTMD`29Ae_fH)=?p zK>bP@?OAJz)5@wy?ET~h-E(qK|Bs_#I(J@QPc!w==z_$SpfW69dDw2gX`9552#WGHxA8M zHW(+{Ns|+)Wg)M$J!OGKgefMXxIx9tJj8s>4)AWBrf;Aio-b2mtj3*Bg`k> z%pD(UgU3KW+YbBZx}D|`6J?0YhW$hFL^@X`FNgkPRbPx7;FG{%qF1bse-V7|xgDbS zI>*s{PHwVNlJ>H2ghw*(2AcOke^I#7b;G&+SM`|elB6H+<&PsgVw0s@?w@`9kZI#2 zG+yvGB$v(LiVia#?tt&Zb+(}q?;j1h!)~S^zrp@%rbSp^_2Tk+|G}=c^!u_rcT>w> zZ#2X7F?^ec`_3!+apQ(a-b20#;Y?TMd#ml=96-N@=er}foC+Bj?fidcOLffhl*sK{>(zuqYT@O+xBNqR$9R&2gF<_GmC!QU_B ztz!~<-Y09k$wB@<0a?x2@*)4l7LubE!b6#jrl}%fkEDK#5A^;3{F$yrmi^mGPZ#kH zBmXb^vUKwPMK>!(y{H`Zo0X9x!g5P)PmrpXC`AwWoYjkk{#iek@%Zw$8?gI(={x8} zSB+WyP80P7UT5+a!uc%O16E|@H~lQT_p%|`kNr~Cd<+_j+miR`s)U@yMZ{;eYYuy^>sg(E1BzCQY-gQtj6st6YYzAwGG@ zrAVT=GpmAz(d$fev~s(>pz_B0&{DWtfG2TXhF9Se8#Y^F_Dr{^0H>0Zr(9%1$LxVc zQ!g!xZ*D2CDBxPa{S@+)j&1uFa;W;IB!mY7yk$z$naMG{ z_Qn+94<)_%ZsW6ga=Ok3K;EMDgZ9PSuGuFoH3WGA{<`<)A01^bu$(-QuVjJff1#qe zvpcg?EwUBp9qxzvO`b)#TTYDZMVP%TEnoS2Lot+ z>?x*nYPWZd-NynCB;P2;B(t>4KQh9Ks#>xC3+P-8ogvGRrxDlDeAv_0jZbCnYsMLL zET0PE*O50X4)SgoZkj;fXLny(yza}%!rNCfE9b7Q2}aDx=rBtv9~)nHE3nLh zLHz62`SOtBd}7u^L|@8;3A1>w-6y=~q5WVFH_w~5&Tq9yDMt^(gQH@}HkAMi=db!6 zZZLmYT5GFMqiA_Op@@p`ovjGT>I89&i-8Yz9*HefEw1>V)<2?H&5Kzjy>K32&8tf- zQ@^}4_XHO__AI$pc4WcSY-FABVXiFe-hgZf`k6M1L?S!p8JI8Zrxu?eFURG{zTT_F z=%Je`I!f(}{)pEMwg_{EX%U`F47CcPcoV^j8&`n0&+s(aeR{~UZvicMv}jtKK-i?MuR zM>X*tK}<#2y*|u;2lYFF}+)X1L+F1=24g&UEq#?{}TJ^~DtF zyX@FbUl-!QvHLdFRKW8o+f#XKZP)i3U)mG}@fgqtd!Bhdh%;2$-87?%l|VZ6r*e zkC1-Xztrt8@5I#z^u5Sar2cPD`j(LXt;)sh(e6tHZKrNR{=%1i2%q45^1Ay3eSAb% z*KZOIyuYB(WVNSymHX~#m_PVC$fRMH;=zW{`8^WQXW=|>;QU4v75rB9ijU}85YWPm zXG}j|)>kls?7_N-mN>#kL%gNQy0h4P((T&!?7;uce}xMH`+0`q;L57Hb;ESyu&4~f zKfFGw(lviG`(kv>jQl&(u;=vAg_Ykz_JA^(r$GH6BBlxuJU{Sw*hq9+QCF5TC3 zR~)qf`=8=S`qu1u-MnPfMh(SV>r$mE9{qdhtbj+ruRw1BZP5f%g|W`|dOG6QxkC=oyV3mX{wy>RetCs=)qMf+%k5DACR6@&^T%J+LWBrdg41pBa;@`DNiYUPH&F?8Mt>_su% z>`KQcn}kmhS75y%zRyc&AI*z8F8>qsL8zxul|+a%)6!`6oC19n?El*E`xTl)6>3{* zSZKU;-^&J>-Uk#9c~^xYdzO+$2=!KdUhn*o5r{p{&(NOn>Y*jI4a2ZHMpRn z5lZk|2zUwk2ucy-AG)+J8E%^h1pN`>7sicNUo;X~=e;6;-lix$laSs&e;?tS4Fjz| zrBI>B@FcZ7S$ho&!{an*s9F5G(&R_C7hvlVO^UBSd!BFqSr>=KXS-fr4%h3H?!BD3oMiLDCeM*1b9&z@< z!D|llP`!N$w^`Y&KfpVvzD*tBzo6PQyVqqkC9o|T<_mZc9pqj~zhm}AiFXv}^V_C8 zR}V(Ni4q>Y?>x+jw1S6Dyh0$?viHBa|Ky?jM(-ri>%*y}-{? zvI2V1|4doSmVQ346XVC~^TQo!7jGqgNZAPZ4E~mudk?=GR$Zt5wG8yz@yX9Gl(M-l z_da-WeB5Gw4GFFrKk;DxQ`_?;1Ly zTU08x+R8Z?Mv|dRL%9Yc*NmKPt%PEuXsgwfO32tKByG8kVWcrLsMT~gLsR1z#@)6Z zC>_exel@@M=kfdVF^}i@JfF||c)i~5_vif)#aldkaB>9MXOi&NY1g*g^OTF}=iqx$ zKRNMZo$F@VR%rhR+OPA3LbT0a7V>l9S!Ayvzd#F=tmE0g*FRB@;(@Z!Hg>^vl0@lA zW<7d-Q=WZoE#4t=L9y~YzgDTX_{X)sFR}&j72r`-+M2DDMVrTsz4}1jA%EA7cRtOu zIjG-x1Km&8S28jX4PSO8?k6I?NWa2f*b+i<+jnh31>s4+x0+

+(3?A{Zaw1E%Te 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

u2E| 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

|0$4EN&`bq?JvHbsd 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ⅈ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�G|}5B@F{B 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 Oz>*_D@@m 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