#version 460 compatibility
#define COMP 1
#extension GL_KHR_shader_subgroup_basic : enable
/*
    References:
        [HIL16] Hillaire, Sébastien. "Physically Based Sky, Atmosphere and Cloud Rendering in Frostbite".
            SIGGRAPH 2016. 2016.
            https:
        [SCH15] Schneider, Andrew. "The Real-Time Volumetric Cloudscapes Of Horizon: Zero Dawn"
            SIGGRAPH 2015. 2015.
            https:
        [SCH16] Schneider, Andrew. "Real-Time Volumetric Cloudscapes"
            GPU Pro 7. 2016.
        [SCH17] Schneider, Andrew. "Nubis: Authoring Real-Time Volumetric Cloudscapes with the Decima Engine"
            SIGGRAPH 17. 2017.
            https:
        [QIU25] QiuTang98. "Flower Engine"
            MIT License. Copyright (c) 2025 QiuTang98.
            https:
        [QIU23] QiuTang98. "实时体积云渲染的光照细节". 2023
            https:
        [WDT22] Wo De Tian (oh my god). "一个简单的体积云多重散射近似方法" (A Simple Multiple Scattering Approximation for Volumetric Clouds). 2022.
            https:

        You can find full license texts in /licenses
*/
/*
    References:
        [GEI05] GEISA. "The Database and Associated Software OPAC". 2005. https:
*/
/*
    References:
        [ERI07] Ericson, Christer. "Converting RGB to LogLuv in a fragment shader". 2007.
            https:
        [ITU11] ITU. "Recommendation ITU-R BT.601-7". 2011.
            https:
        [ITU15] ITU. "Recommendation ITU-R BT.709-6". 2015.
            https:
        [KAR13] Karis, Brian. "Tone mapping". Graphic Rants. 2013.
            https:
        [LAR98] Wikipedia. "The LogLuv Encoding for Full Gamut, High Dynamic Range Images". 1998.
            http:
        [LOT16] Lottes, Timothy. "Optimized Reversible Tonemapper for Resolve". 2016.
            https:
        [ROS18] Rosseaux, Benjamin. "Matrix-based RGB from/to YCoCg color space conversion". 2018.
            CC0 License (Public Domain).
            https:
        [WIK25a] Wikipedia. "Rec. 601". 2025.
            https:
        [WIK25b] Wikipedia. "Rec. 709". 2025.
            https:
        [WIK25c] Wikipedia. "sRGB". 2025.
            https:
        [WIK26a] Wikipedia. "CIELUV". 2026.
            https:

*/
// This file is generated by options.main.kts. Do not edit this file manually.
#define TITLE_VERSION 3//[0 1 2 3 4 5]
#define SETTING_SHADOW_MAP_RESOLUTION 2048//[1024 2048 3072 4096]
const float shadowDistance = 512.0;//[64.0 128.0 192.0 256.0 384.0 512.0]
#define SETTING_ATM_ALT_SCALE 1000//[1 2 3 4 5 6 7 8 9 10 10 20 30 40 50 60 70 80 90 100 100 200 300 400 500 600 700 800 900 1000 1000]
#define SETTING_ATM_D_SCALE 1000//[1 2 3 4 5 6 7 8 9 10 10 20 30 40 50 60 70 80 90 100 100 200 300 400 500 600 700 800 900 1000 1000]
#define SETTING_ATM_GROUND_ALBEDO_R 45//[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255]
#define SETTING_ATM_GROUND_ALBEDO_G 89//[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255]
#define SETTING_ATM_GROUND_ALBEDO_B 82//[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255]
#define SETTING_EPIPOLAR_SLICES 1024//[256 512 1024 2048]
#define SETTING_SLICE_SAMPLES 512//[128 256 512 1024]
#define SETTING_ATM_MIE_SCT_MUL 1.0//[0.0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1.0 1.05 1.1 1.15 1.2 1.25 1.3 1.35 1.4 1.45 1.5 1.55 1.6 1.65 1.7 1.75 1.8 1.85 1.9 1.95 2.0 2.05 2.1 2.15 2.2 2.25 2.3 2.35 2.4 2.45 2.5 2.55 2.6 2.65 2.7 2.75 2.8 2.85 2.9 2.95 3.0 3.05 3.1 3.15 3.2 3.25 3.3 3.35 3.4 3.45 3.5 3.55 3.6 3.65 3.7 3.75 3.8 3.85 3.9 3.95 4.0 4.05 4.1 4.15 4.2 4.25 4.3 4.35 4.4 4.45 4.5 4.55 4.6 4.65 4.7 4.75 4.8 4.85 4.9 4.95 5.0]
#define SETTING_ATM_MIE_ABS_MUL 0.1//[0.0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.0 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 1.2 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.28 1.29 1.3 1.31 1.32 1.33 1.34 1.35 1.36 1.37 1.38 1.39 1.4 1.41 1.42 1.43 1.44 1.45 1.46 1.47 1.48 1.49 1.5 1.51 1.52 1.53 1.54 1.55 1.56 1.57 1.58 1.59 1.6 1.61 1.62 1.63 1.64 1.65 1.66 1.67 1.68 1.69 1.7 1.71 1.72 1.73 1.74 1.75 1.76 1.77 1.78 1.79 1.8 1.81 1.82 1.83 1.84 1.85 1.86 1.87 1.88 1.89 1.9 1.91 1.92 1.93 1.94 1.95 1.96 1.97 1.98 1.99 2.0]
#define SETTING_ATM_RAY_SCT_MUL 1.0//[0.0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1.0 1.05 1.1 1.15 1.2 1.25 1.3 1.35 1.4 1.45 1.5 1.55 1.6 1.65 1.7 1.75 1.8 1.85 1.9 1.95 2.0 2.05 2.1 2.15 2.2 2.25 2.3 2.35 2.4 2.45 2.5 2.55 2.6 2.65 2.7 2.75 2.8 2.85 2.9 2.95 3.0 3.05 3.1 3.15 3.2 3.25 3.3 3.35 3.4 3.45 3.5 3.55 3.6 3.65 3.7 3.75 3.8 3.85 3.9 3.95 4.0 4.05 4.1 4.15 4.2 4.25 4.3 4.35 4.4 4.45 4.5 4.55 4.6 4.65 4.7 4.75 4.8 4.85 4.9 4.95 5.0]
#define SETTING_ATM_OZO_ABS_MUL 1.0//[0.0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1.0 1.05 1.1 1.15 1.2 1.25 1.3 1.35 1.4 1.45 1.5 1.55 1.6 1.65 1.7 1.75 1.8 1.85 1.9 1.95 2.0 2.05 2.1 2.15 2.2 2.25 2.3 2.35 2.4 2.45 2.5 2.55 2.6 2.65 2.7 2.75 2.8 2.85 2.9 2.95 3.0 3.05 3.1 3.15 3.2 3.25 3.3 3.35 3.4 3.45 3.5 3.55 3.6 3.65 3.7 3.75 3.8 3.85 3.9 3.95 4.0 4.05 4.1 4.15 4.2 4.25 4.3 4.35 4.4 4.45 4.5 4.55 4.6 4.65 4.7 4.75 4.8 4.85 4.9 4.95 5.0]
#define SETTING_SKYVIEW_RES 256//[128 256 512 1024]
#define SETTING_CLOUDS_MS_RADIUS -2.5//[-5.0 -4.75 -4.5 -4.25 -4.0 -3.75 -3.5 -3.25 -3.0 -2.75 -2.5 -2.25 -2.0 -1.75 -1.5 -1.25 -1.0 -0.75 -0.5 -0.25 0.0]
#define SETTING_CLOUDS_LOW_UPSCALE_FACTOR 2//[0 1 2 3 4 5 6]
#define SETTING_CLOUDS_LOW_MAX_ACCUM 16//[4 6 8 12 16 24 32 48 64 96 128]
#define SETTING_CLOUDS_LOW_STEP_MIN 48//[16 24 32 40 48 56 64 72 80 88 96 104 112 120 128]
#define SETTING_CLOUDS_LOW_STEP_MAX 128//[32 40 48 56 64 72 80 88 96 104 112 120 128 136 144 152 160 168 176 184 192 200 208 216 224 232 240 248 256]
#define SETTING_CLOUDS_CU_HEIGHT 1.0//[0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.0 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.0 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8.0]
#define SETTING_CLOUDS_CU_THICKNESS 2.0//[0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0]
#define SETTING_CLOUDS_CU_DENSITY 1.0//[0.0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1.0 1.05 1.1 1.15 1.2 1.25 1.3 1.35 1.4 1.45 1.5 1.55 1.6 1.65 1.7 1.75 1.8 1.85 1.9 1.95 2.0 2.05 2.1 2.15 2.2 2.25 2.3 2.35 2.4 2.45 2.5 2.55 2.6 2.65 2.7 2.75 2.8 2.85 2.9 2.95 3.0 3.05 3.1 3.15 3.2 3.25 3.3 3.35 3.4 3.45 3.5 3.55 3.6 3.65 3.7 3.75 3.8 3.85 3.9 3.95 4.0]
#define SETTING_CLOUDS_CU_COVERAGE 0.5//[0.0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1.0]
#define SETTING_CLOUDS_CU_PHASE_RATIO 0.9//[0.0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1.0]
#define SETTING_CLOUDS_CU_WIND
#ifdef SETTING_CLOUDS_CU_WIND
#endif
#define SETTING_CLOUDS_LOW_CONE_FACTOR 0.5//[0.0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1.0]
#define SETTING_CLOUDS_LOW_TOP_CURVE_FACTOR 48//[16 24 32 48 64 96 128 192 256 384 512 768 1024]
#define SETTING_CLOUDS_LOW_BOTTOM_CURVE_FACTOR 128//[16 24 32 48 64 96 128 192 256 384 512 768 1024]
#define SETTING_CLOUDS_LOW_BASE_FREQ 0.0//[-4.0 -3.9 -3.8 -3.7 -3.6 -3.5 -3.4 -3.3 -3.2 -3.1 -3.0 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0]
#define SETTING_CLOUDS_LOW_CURL_FREQ 0.0//[-4.0 -3.9 -3.8 -3.7 -3.6 -3.5 -3.4 -3.3 -3.2 -3.1 -3.0 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0]
#define SETTING_CLOUDS_LOW_BILLOWY_FREQ 0.0//[-4.0 -3.9 -3.8 -3.7 -3.6 -3.5 -3.4 -3.3 -3.2 -3.1 -3.0 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0]
#define SETTING_CLOUDS_LOW_BILLOWY_CURL_STR 0.0//[-4.0 -3.9 -3.8 -3.7 -3.6 -3.5 -3.4 -3.3 -3.2 -3.1 -3.0 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0]
#define SETTING_CLOUDS_HIGH_BILLOWY_FREQ 0.0//[-4.0 -3.9 -3.8 -3.7 -3.6 -3.5 -3.4 -3.3 -3.2 -3.1 -3.0 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0]
#define SETTING_CLOUDS_HIGH_BILLOWY_CURL_STR 0.0//[-4.0 -3.9 -3.8 -3.7 -3.6 -3.5 -3.4 -3.3 -3.2 -3.1 -3.0 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0]
#define SETTING_CLOUDS_LOW_WISPS_FREQ 0.0//[-4.0 -3.9 -3.8 -3.7 -3.6 -3.5 -3.4 -3.3 -3.2 -3.1 -3.0 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0]
#define SETTING_CLOUDS_LOW_WISPS_CURL_STR 0.0//[-4.0 -3.9 -3.8 -3.7 -3.6 -3.5 -3.4 -3.3 -3.2 -3.1 -3.0 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0]
#define SETTING_SUN_RADIUS 1.0//[0.0078125 0.015625 0.03125 0.0625 0.125 0.25 0.5 1.0 2.0 4.0 8.0 16.0 32.0 64.0 128.0 256.0 512.0 1024.0]
#define SETTING_SUN_DISTANCE 1.0//[0.0078125 0.015625 0.03125 0.0625 0.125 0.25 0.5 1.0 2.0 4.0 8.0 16.0 32.0 64.0 128.0 256.0 512.0 1024.0]
const float sunPathRotation = -20.0;//[-90.0 -89.0 -88.0 -87.0 -86.0 -85.0 -84.0 -83.0 -82.0 -81.0 -80.0 -79.0 -78.0 -77.0 -76.0 -75.0 -74.0 -73.0 -72.0 -71.0 -70.0 -69.0 -68.0 -67.0 -66.0 -65.0 -64.0 -63.0 -62.0 -61.0 -60.0 -59.0 -58.0 -57.0 -56.0 -55.0 -54.0 -53.0 -52.0 -51.0 -50.0 -49.0 -48.0 -47.0 -46.0 -45.0 -44.0 -43.0 -42.0 -41.0 -40.0 -39.0 -38.0 -37.0 -36.0 -35.0 -34.0 -33.0 -32.0 -31.0 -30.0 -29.0 -28.0 -27.0 -26.0 -25.0 -24.0 -23.0 -22.0 -21.0 -20.0 -19.0 -18.0 -17.0 -16.0 -15.0 -14.0 -13.0 -12.0 -11.0 -10.0 -9.0 -8.0 -7.0 -6.0 -5.0 -4.0 -3.0 -2.0 -1.0 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0 26.0 27.0 28.0 29.0 30.0 31.0 32.0 33.0 34.0 35.0 36.0 37.0 38.0 39.0 40.0 41.0 42.0 43.0 44.0 45.0 46.0 47.0 48.0 49.0 50.0 51.0 52.0 53.0 54.0 55.0 56.0 57.0 58.0 59.0 60.0 61.0 62.0 63.0 64.0 65.0 66.0 67.0 68.0 69.0 70.0 71.0 72.0 73.0 74.0 75.0 76.0 77.0 78.0 79.0 80.0 81.0 82.0 83.0 84.0 85.0 86.0 87.0 88.0 89.0 90.0]
#define SETTING_REAL_SUN_TEMPERATURE
#ifdef SETTING_REAL_SUN_TEMPERATURE
#endif
#define SETTING_SUN_TEMPERATURE 5700//[1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000 3100 3200 3300 3400 3500 3600 3700 3800 3900 4000 4100 4200 4300 4400 4500 4600 4700 4800 4900 5000 5100 5200 5300 5400 5500 5600 5700 5800 5900 6000 6100 6200 6300 6400 6500 6600 6700 6800 6900 7000 7100 7200 7300 7400 7500 7600 7700 7800 7900 8000 8100 8200 8300 8400 8500 8600 8700 8800 8900 9000 9100 9200 9300 9400 9500 9600 9700 9800 9900 10000 11000 12000 13000 14000 15000 16000 17000 18000 19000 20000 21000 22000 23000 24000 25000 26000 27000 28000 29000 30000 31000 32000 33000 34000 35000 36000 37000 38000 39000 40000 41000 42000 43000 44000 45000 46000 47000 48000 49000 50000]
#define SETTING_MOON_RADIUS 1.0//[0.0078125 0.015625 0.03125 0.0625 0.125 0.25 0.5 1.0 2.0 4.0 8.0 16.0 32.0 64.0 128.0 256.0 512.0 1024.0]
#define SETTING_MOON_DISTANCE 1.0//[0.0078125 0.015625 0.03125 0.0625 0.125 0.25 0.5 1.0 2.0 4.0 8.0 16.0 32.0 64.0 128.0 256.0 512.0 1024.0]
#define SETTING_MOON_ALBEDO 0.12//[0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.0]
#define SETTING_MOON_COLOR_R 0.8//[0.0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.0]
#define SETTING_MOON_COLOR_G 0.9//[0.0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.0]
#define SETTING_MOON_COLOR_B 1.0//[0.0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.0]
#define SETTING_MATERIAL_COLOR_SPACE 1//[0 1 2 3 4 5 6 7 8]
#define SETTING_MATERIAL_TRANSFER_FUNC 3//[0 1 2 3 4 5 6 7]
#define SETTING_WORKING_COLOR_SPACE 8//[0 1 2 3 4 5 6 7 8]
#define SETTING_DRT_WORKING_COLOR_SPACE 1//[0 1 2 3 4 5 6 7 8]
//#define SETTING_SCREENSHOT_MODE
#ifdef SETTING_SCREENSHOT_MODE
#endif
//#define SETTING_ASSUME_NVIDIA_GPU
#ifdef SETTING_ASSUME_NVIDIA_GPU
#endif
//#define SETTING_DEBUG_AE
#ifdef SETTING_DEBUG_AE
#endif
#if SETTING_SHADOW_MAP_RESOLUTION == 1024
#define SHADOW_MAP_SIZE_D16 64
const int shadowMapResolution = 1024;
#elif SETTING_SHADOW_MAP_RESOLUTION == 2048
#define SHADOW_MAP_SIZE_D16 128
const int shadowMapResolution = 2048;
#elif SETTING_SHADOW_MAP_RESOLUTION == 3072
#define SHADOW_MAP_SIZE_D16 192
const int shadowMapResolution = 3072;
#elif SETTING_SHADOW_MAP_RESOLUTION == 4096
#define SHADOW_MAP_SIZE_D16 256
const int shadowMapResolution = 4096;
#endif
const vec2 SHADOW_MAP_SIZE = vec2(float(shadowMapResolution), 1.0 / float(shadowMapResolution));
#ifndef SKIP_UNIFORMS
uniform int frameCounter;
uniform float sunAngle;
uniform float near;
uniform float far;
uniform vec3 cameraPosition;
uniform mat4 gbufferModelViewInverse;
uniform mat4 gbufferPreviousModelView;
uniform mat4 textureMatrix = mat4(1.0);
#endif
float vanillaFarPlane = far;
float vanillaNearPlane = near;
#if defined(DISTANT_HORIZONS)
uniform float dhNearPlane;
uniform float dhFarPlane;
#elif defined(VOXY)
uniform int vxRenderDistance;
#endif
#if defined(DISTANT_HORIZONS)
float farPlane = max(dhFarPlane, far);
float nearPlane = min(dhNearPlane, near);
#elif defined(VOXY)
float farPlane = max(far, float(vxRenderDistance * 16));
float nearPlane = near;
#else
float farPlane = far;
float nearPlane = near;
#endif
mat4 gbufferPrevModelView = gbufferPreviousModelView;
#ifndef SKIP_UNIFORMS
uniform vec3 uval_sunDirWorld;
uniform vec3 uval_moonDirWorld;
uniform vec3 uval_cuDetailWind;
uniform vec2 uval_mainImageSize;
uniform vec2 uval_mainImageSizeRcp;
uniform int uval_mainImageSizeIX;
uniform int uval_mainImageSizeIY;
uniform int uval_restirSpatialTileOffsetX;
uniform int uval_restirSpatialTileOffsety;
ivec2 uval_restirSpatialTileOffset = ivec2(uval_restirSpatialTileOffsetX, uval_restirSpatialTileOffsety);
#endif
ivec2 uval_mainImageSizeI = ivec2(uval_mainImageSizeIX, uval_mainImageSizeIY);
#ifndef GLOBAL_DATA_MODIFIER
#define GLOBAL_DATA_MODIFIER restrict readonly buffer
#endif
struct AEData {
    vec4 lastScreenAvgLum;
    vec4 screenAvgLum;
    vec4 expValues;
    vec2 hsPercents;
    uint shadowCount;
    uint highlightCount;
    uint weightSum;
    #ifdef SETTING_DEBUG_AE
    uint lumHistogram[256];
    uint lumHistogramMaxBinCount;
    float finalAvgLum;
    #endif
};
struct CameraData {
    uint frustumPlaneCount;
    vec4 frustumPlanes[6];
};
layout(std430, binding = 0) GLOBAL_DATA_MODIFIER GlobalData {
    uvec4 global_dispatchSize1;
    uvec4 global_dispatchSize2;
    uvec4 global_dispatchSize3;
    uvec4 global_dispatchSize4;
    mat4 gbufferPrevModelViewInverse;
    mat4 global_shadowRotationMatrix;
    mat4 global_shadowRotationMatrixInverse;
    mat4 global_taaJitterMat;
    mat4 global_camProj;
    mat4 global_camProjInverse;
    mat4 global_prevCamProj;
    mat4 global_prevCamProjInverse;
    mat4 global_shadowProj;
    mat4 global_shadowProjInverse;
    mat4 global_shadowProjNext;
    mat4 global_shadowProjNextInverse;
    mat4 global_shadowView;
    mat4 global_shadowViewInverse;
    mat4 global_sceneToShadowNDC;
    mat4 global_shadowViewToShadowNDC;
    mat4 global_shadowNDCToScene;
    vec3 global_prevCameraDelta;
    CameraData global_cameraData;
    vec2 global_mipmapSizes[16];
    vec2 global_mipmapSizesRcp[16];
    ivec4 global_mipmapTiles3[16];
    ivec2 global_mipmapSizesI[16];
    ivec2 global_mipmapSizePrefixesPadded[16];
    ivec2 global_mipmapSizePrefixes[16];
    ivec4 global_hizTiles[16];
    ivec4 global_mipmapTileCeil[16];
    ivec4 global_mipmapTileCeilPadded[16];
    ivec3 global_shadowAABBMinPrev;
    ivec3 global_shadowAABBMaxPrev;
    ivec3 global_shadowAABBMin;
    ivec3 global_shadowAABBMax;
    vec3 global_shadowAABBMinHistory;
    vec3 global_shadowAABBMaxHistory;
    ivec3 global_shadowAABBMinNew;
    ivec3 global_shadowAABBMaxNew;
    float global_focusDistance;
    int global_lastWorldTime;
    float global_historyResetFactor;
    vec4 global_motionFactor;
    vec4 global_taaResetFactor;
    float global_turbidity;
    AEData global_aeData;
    uint global_atomicCounters[16];
};
layout(std430, binding = 1) GLOBAL_DATA_MODIFIER IndirectComputeData {
    uint indirectComputeData[];
};
#ifndef SKIP_UNIFORMS
uniform sampler3D usam_stbnVec1;
uniform sampler3D usam_stbnVec2;
uniform sampler2D usam_cloudPhases;
uniform sampler2D usam_hiz;
uniform sampler3D usam_cumulusDetail1;
uniform sampler3D usam_cumulusDetail2;
uniform sampler3D usam_cumulusCurl;
uniform sampler2D usam_cumulusBase;
#endif
#ifndef SKIP_UNIFORMS
uniform sampler2D usam_frgba16f;
#endif
ivec2 _textile_texelToTexel(ivec2 texelPos, ivec2 tileOffset, ivec2 tileSize) {
    return clamp(texelPos, ivec2(0), tileSize - 1) + tileOffset;
}
vec2 _textile_uvToUV(vec2 uv, vec2 tileOffsetF, vec2 tileSizeF, vec2 atlastSizeRcp) {
    vec2 textureTexelPos = clamp(uv * tileSizeF, vec2(0.5), tileSizeF - 0.5) + tileOffsetF;
    return clamp(textureTexelPos * atlastSizeRcp, 0.0, 1.0);
}
vec2 _textile_uvToGatherUV(vec2 uv, vec2 tileOffsetF, vec2 tileSizeF, vec2 atlastSizeRcp) {
    vec2 textureTexelPos = clamp(uv * tileSizeF, vec2(1.0), tileSizeF - 1.0) + tileOffsetF;
    return clamp(textureTexelPos * atlastSizeRcp, 0.0, 1.0);
}
vec2 _textile_texelToGatherUV(vec2 texelPos, vec2 tileOffsetF, vec2 tileSizeF, vec2 atlastSizeRcp) {
    vec2 textureTexelPos = clamp(texelPos, vec2(1.0), tileSizeF - 1.0) + tileOffsetF;
    return clamp(textureTexelPos * atlastSizeRcp, 0.0, 1.0);
}
#define _shadesmith_RGBA32UI_4_OFFSET (uval_mainImageSizeI * ivec2(0, 2))
#define _shadesmith_RGBA32UI_4_SIZE uval_mainImageSizeI
#define _shadesmith_RGBA32UI_4_TEXEL_TO_TEXEL(texelPos) _textile_texelToTexel(texelPos, _shadesmith_RGBA32UI_4_OFFSET, _shadesmith_RGBA32UI_4_SIZE)
#define transient_lowCloudRender_store(x, v) imageStore(uimg_rgba32ui, _shadesmith_RGBA32UI_4_TEXEL_TO_TEXEL(x), v)
#define _shadesmith_FRGBA16F_ATLAS_SIZE vec2(1056.0, 832.0)
#define _shadesmith_FRGBA16F_ATLAS_SIZE_RCP (vec2(1.0) / _shadesmith_FRGBA16F_ATLAS_SIZE)
#define _shadesmith_FRGBA16F_1_OFFSET_F vec2(1024.0, 0.0)
#define _shadesmith_FRGBA16F_1_SIZE_F vec2(32.0, 192.0)
#define _shadesmith_FRGBA16F_1_UV_TO_UV(uv) _textile_uvToUV(uv, _shadesmith_FRGBA16F_1_OFFSET_F, _shadesmith_FRGBA16F_1_SIZE_F, _shadesmith_FRGBA16F_ATLAS_SIZE_RCP)
#define _shadesmith_FRGBA16F_2_OFFSET_F vec2(0.0, 768.0)
#define _shadesmith_FRGBA16F_2_SIZE_F vec2(256.0, 64.0)
#define _shadesmith_FRGBA16F_2_UV_TO_UV(uv) _textile_uvToUV(uv, _shadesmith_FRGBA16F_2_OFFSET_F, _shadesmith_FRGBA16F_2_SIZE_F, _shadesmith_FRGBA16F_ATLAS_SIZE_RCP)
#define persistent_cloudsAmbLUT_sample(x) texture(usam_frgba16f, _shadesmith_FRGBA16F_1_UV_TO_UV(x))
#define persistent_transmittanceLUT_sample(x) texture(usam_frgba16f, _shadesmith_FRGBA16F_2_UV_TO_UV(x))
#ifdef DISABLE_FP16
#define NO_HALF a
#define hf
#define float16_t float
#define f16vec2 vec2
#define f16vec3 vec3
#define f16vec4 vec4
#define f16mat2 mat2
#define f16mat3 mat3
#define f16mat4 mat4
#else
#if defined MC_GL_AMD_gpu_shader_half_float
#extension GL_AMD_gpu_shader_half_float : enable
#elif defined MC_GL_NV_gpu_shader5 || defined SETTING_ASSUME_NVIDIA_GPU
#extension GL_NV_gpu_shader5 : enable
#else
#define NO_HALF a
#define hf
#define float16_t float
#define f16vec2 vec2
#define f16vec3 vec3
#define f16vec4 vec4
#define f16mat2 mat2
#define f16mat3 mat3
#define f16mat4 mat4
#endif
#endif
/*
    References:
        [WHY23] Whyte, Killian. "Soft Clamp Function". 2023.
            https:

        You can find full license texts in /licenses
*/
#define PI 3.14159265358979323846
#define PI_2 (2.0 * PI)
#define PI_HALF (0.5 * PI)
#define PI_QUARTER (0.25 * PI)
#define RCP_PI (1.0 / PI)
#define RCP_PI_2 (1.0 / PI_2)
#define RCP_PI_HALF (1.0 / PI_HALF)
#define GOLDEN_RATIO 1.618033988749
#define GOLDEN_ANGLE 2.39996322972865332
#define SPHERE_SOLID_ANGLE (4.0 * PI)
#define FLT_MAX uintBitsToFloat(0x7F7FFFFF)
#define FLT_MIN uintBitsToFloat(0x00800000)
#define FLT_TRUE_MIN uintBitsToFloat(0x00000001)
#define FLT_POS_INF uintBitsToFloat(0x7F800000)
#define FLT_NEG_INF uintBitsToFloat(0xFF800000)
#define FP16_MAX 65504.0
#define INT32_MAX 2147483647
#define INT32_MIN -2147483648
#define rcp(x) (1.0 / (x))
#define saturate(x) clamp(x, 0.0, 1.0)
float min4(float x, float y, float z, float w) { return min(x, min(y, min(z, w))); }
float min4(vec4 v) { return min(min(v.x, v.y), min(v.z, v.w)); }
float linearStep(float edge0, float edge1, float x) { return saturate((x - edge0) / (edge1 - edge0)); }
vec2 linearStep(float edge0, float edge1, vec2 x) { return saturate((x - edge0) / (edge1 - edge0)); }
vec3 linearStep(float edge0, float edge1, vec3 x) { return saturate((x - edge0) / (edge1 - edge0)); }
vec4 linearStep(float edge0, float edge1, vec4 x) { return saturate((x - edge0) / (edge1 - edge0)); }
float pow2(float x) { return x * x; }
vec2 pow2(vec2 x) { return x * x; }
vec3 pow2(vec3 x) { return x * x; }
vec4 pow2(vec4 x) { return x * x; }
float pow3(float x) { return x * x * x; }
vec2 pow3(vec2 x) { return x * x * x; }
vec3 pow3(vec3 x) { return x * x * x; }
vec4 pow3(vec4 x) { return x * x * x; }
float pow4(float x) {
    float x2 = x * x;
    return x2 * x2;
}
vec2 pow4(vec2 x) {
    vec2 x2 = x * x;
    return x2 * x2;
}
vec3 pow4(vec3 x) {
    vec3 x2 = x * x;
    return x2 * x2;
}
vec4 pow4(vec4 x) {
    vec4 x2 = x * x;
    return x2 * x2;
}
float pow5(float x) {
    float x2 = x * x;
    return x2 * x2 * x;
}
vec2 pow5(vec2 x) {
    vec2 x2 = x * x;
    return x2 * x2 * x;
}
vec3 pow5(vec3 x) {
    vec3 x2 = x * x;
    return x2 * x2 * x;
}
vec4 pow5(vec4 x) {
    vec4 x2 = x * x;
    return x2 * x2 * x;
}
#ifndef NO_HALF
float16_t pow2(float16_t x) { return x * x; }
f16vec2 pow2(f16vec2 x) { return x * x; }
f16vec3 pow2(f16vec3 x) { return x * x; }
f16vec4 pow2(f16vec4 x) { return x * x; }
float16_t pow3(float16_t x) { return x * x * x; }
f16vec2 pow3(f16vec2 x) { return x * x * x; }
f16vec3 pow3(f16vec3 x) { return x * x * x; }
f16vec4 pow3(f16vec4 x) { return x * x * x; }
float16_t pow4(float16_t x) {
    float16_t x2 = x * x;
    return x2 * x2;
}
f16vec2 pow4(f16vec2 x) {
    f16vec2 x2 = x * x;
    return x2 * x2;
}
f16vec3 pow4(f16vec3 x) {
    f16vec3 x2 = x * x;
    return x2 * x2;
}
f16vec4 pow4(f16vec4 x) {
    f16vec4 x2 = x * x;
    return x2 * x2;
}
#endif
float raySphereIntersectNearest(vec3 r0, vec3 rd, vec3 s0, float sR) {
    float a = dot(rd, rd);
    vec3 s0_r0 = r0 - s0;
    float b = 2.0 * dot(rd, s0_r0);
    float c = dot(s0_r0, s0_r0) - (sR * sR);
    float delta = b * b - 4.0*a*c;
    float result = -1.0;
    if (delta >= 0.0 && a != 0.0) {
        float sol0 = (-b - sqrt(delta)) / (2.0*a);
        float sol1 = (-b + sqrt(delta)) / (2.0*a);
        if (sol0 >= 0.0 || sol1 >= 0.0) {
            if (sol0 < 0.0) {
                result = sol1;
            } else if (sol1 < 0.0) {
                result = sol0;
            } else {
                result = min(sol0, sol1);
            }
            result = max(0.0, result);
        }
    }
    return result;
}
#define COLORS2_COLORSPACES_CIE_XYZ 0
#define COLORS2_COLORSPACES_SRGB 1
#define COLORS2_COLORSPACES_REC709 2
#define COLORS2_COLORSPACES_REC2020 3
#define COLORS2_COLORSPACES_DCI_P3 4
#define COLORS2_COLORSPACES_ADOBE_RGB_1998 5
#define COLORS2_COLORSPACES_ACES_AP0 6
#define COLORS2_COLORSPACES_ACES_AP1 7
#define COLORS2_COLORSPACES_COLOR_MCSPACEFACE 8
#define _colors2_colorspaces_convert(a, b, x) colors2_colorspaces_ ## a ## _to_ ## b ##(x)
#define colors2_colorspaces_convert(a, b, x) _colors2_colorspaces_convert(a, b, x)
#define _colors2_colorspaces_luma(a, x) colors2_colorspaces_ ## a ## _luma(x)
#define colors2_colorspaces_luma(a, x) _colors2_colorspaces_luma(a, x)
const mat3 _colors2_colorspaces_mat_CIE_XYZ_to_CIE_XYZ = mat3(
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0
);
const mat3 _colors2_colorspaces_mat_CIE_XYZ_to_SRGB = mat3(
    3.2406, -1.5372, -0.4986,
    -0.9689, 1.8758, 0.0415,
    0.0557, -0.204, 1.057
);
const mat3 _colors2_colorspaces_mat_CIE_XYZ_to_REC709 = mat3(
    3.2409699419, -1.5373831776, -0.4986107603,
    -0.9692436363, 1.8759675015, 0.0415550574,
    0.0556300797, -0.2039769589, 1.0569715142
);
const mat3 _colors2_colorspaces_mat_CIE_XYZ_to_REC2020 = mat3(
    1.716651188, -0.3556707838, -0.2533662814,
    -0.6666843518, 1.6164812366, 0.0157685458,
    0.0176398574, -0.0427706133, 0.9421031212
);
const mat3 _colors2_colorspaces_mat_CIE_XYZ_to_DCI_P3 = mat3(
    2.7253940305, -1.0180030062, -0.4401631952,
    -0.7951680258, 1.6897320548, 0.0226471906,
    0.0412418914, -0.0876390192, 1.1009293786
);
const mat3 _colors2_colorspaces_mat_CIE_XYZ_to_ADOBE_RGB_1998 = mat3(
    2.04159, -0.56501, -0.34473,
    -0.96924, 1.87597, 0.04156,
    0.01344, -0.11836, 1.01517
);
const mat3 _colors2_colorspaces_mat_CIE_XYZ_to_ACES_AP0 = mat3(
    1.0498110175, 0.0, -9.74845e-05,
    -0.4959030231, 1.3733130458, 0.0982400361,
    0.0, 0.0, 0.9912520182
);
const mat3 _colors2_colorspaces_mat_CIE_XYZ_to_ACES_AP1 = mat3(
    1.6410233797, -0.3248032942, -0.2364246952,
    -0.6636628587, 1.6153315917, 0.0167563477,
    0.0117218943, -0.008284442, 0.9883948585
);
const mat3 _colors2_colorspaces_mat_CIE_XYZ_to_COLOR_MCSPACEFACE = mat3(
    1.8036169276, -0.4552904521, -0.2378028419,
    -0.8777214976, 1.7861935367, 0.044102742,
    -0.0076302897, 0.0213060993, 0.9055290952
);
const mat3 _colors2_colorspaces_mat_SRGB_to_CIE_XYZ = mat3(
    0.4124, 0.3576, 0.1805,
    0.2126, 0.7152, 0.0722,
    0.0193, 0.1192, 0.9505
);
const mat3 _colors2_colorspaces_mat_SRGB_to_SRGB = mat3(
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0
);
const mat3 _colors2_colorspaces_mat_SRGB_to_REC709 = mat3(
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0
);
const mat3 _colors2_colorspaces_mat_SRGB_to_REC2020 = mat3(
    0.6274413721, 0.3292974595, 0.0433514584,
    0.0690276171, 0.9195806669, 0.0113614226,
    0.0163642351, 0.0880171625, 0.8955649727
);
const mat3 _colors2_colorspaces_mat_SRGB_to_DCI_P3 = mat3(
    0.8686602648, 0.1289247846, 0.0025580657,
    0.034463766, 0.9618535095, 0.0036450448,
    0.0167452803, 0.071043109, 0.9121578398
);
const mat3 _colors2_colorspaces_mat_SRGB_to_ADOBE_RGB_1998 = mat3(
    0.715177301, 0.284885616, 4.7408e-05,
    -8.1246e-05, 1.000047472, -6e-09,
    -2.7899e-05, 0.041163336, 0.958799413
);
const mat3 _colors2_colorspaces_mat_SRGB_to_ACES_AP0 = mat3(
    0.439643004, 0.3830054714, 0.1773993089,
    0.0897157319, 0.8134750538, 0.0967822524,
    0.0175127205, 0.1115514385, 0.870882793
);
const mat3 _colors2_colorspaces_mat_SRGB_to_ACES_AP1 = mat3(
    0.6131324224, 0.3395380158, 0.047416696,
    0.0701243808, 0.9163940113, 0.013451524,
    0.0205876575, 0.1095745716, 0.869785404
);
const mat3 _colors2_colorspaces_mat_SRGB_to_COLOR_MCSPACEFACE = mat3(
    0.6424391956, 0.2910124185, 0.066641612,
    0.01862347, 0.9688787528, 0.0124565459,
    0.0188551746, 0.1204306855, 0.8606615207
);
const mat3 _colors2_colorspaces_mat_REC709_to_CIE_XYZ = mat3(
    0.4123907993, 0.3575843394, 0.1804807884,
    0.2126390059, 0.7151686788, 0.0721923154,
    0.0193308187, 0.1191947798, 0.9505321522
);
const mat3 _colors2_colorspaces_mat_REC709_to_SRGB = mat3(
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0
);
const mat3 _colors2_colorspaces_mat_REC709_to_REC709 = mat3(
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0
);
const mat3 _colors2_colorspaces_mat_REC709_to_REC2020 = mat3(
    0.6274038959, 0.3292830384, 0.0433130657,
    0.0690972894, 0.9195403951, 0.0113623156,
    0.0163914389, 0.0880133079, 0.8955952532
);
const mat3 _colors2_colorspaces_mat_REC709_to_DCI_P3 = mat3(
    0.8685797397, 0.1289191385, 0.0025011218,
    0.0345404103, 0.9618113864, 0.0036482034,
    0.016771429, 0.0710399978, 0.9121885732
);
const mat3 _colors2_colorspaces_mat_REC709_to_ADOBE_RGB_1998 = mat3(
    0.715125854, 0.2848731398, 1.4438e-06,
    2.1264e-06, 1.0000036763, 5.5347e-06,
    -1.3532e-06, 0.0411615333, 0.9588327043
);
const mat3 _colors2_colorspaces_mat_REC709_to_ACES_AP0 = mat3(
    0.4396329819, 0.3829886982, 0.17737832,
    0.0897764429, 0.8134394287, 0.0967841283,
    0.0175411704, 0.1115465533, 0.8709122763
);
const mat3 _colors2_colorspaces_mat_REC709_to_ACES_AP1 = mat3(
    0.6130974024, 0.3395231462, 0.0473794514,
    0.0701937225, 0.9163538791, 0.0134523985,
    0.0206155929, 0.1095697729, 0.8698146342
);
const mat3 _colors2_colorspaces_mat_REC709_to_COLOR_MCSPACEFACE = mat3(
    0.6423975126, 0.290999674, 0.0666028135,
    0.0187025778, 0.968836322, 0.0124611002,
    0.0188839772, 0.1204254114, 0.8606906114
);
const mat3 _colors2_colorspaces_mat_REC2020_to_CIE_XYZ = mat3(
    0.6369580483, 0.1446169036, 0.1688809752,
    0.262700212, 0.6779980715, 0.0593017165,
    0.0, 0.028072693, 1.0609850577
);
const mat3 _colors2_colorspaces_mat_REC2020_to_SRGB = mat3(
    1.6603034854, -0.5875701425, -0.0728900602,
    -0.1243755953, 1.1328344814, -0.0083597372,
    -0.01811228, -0.1005836085, 1.1187703262
);
const mat3 _colors2_colorspaces_mat_REC2020_to_REC709 = mat3(
    1.6604910021, -0.5876411388, -0.0728498633,
    -0.1245504745, 1.1328998971, -0.0083494226,
    -0.0181507634, -0.100578898, 1.1187296614
);
const mat3 _colors2_colorspaces_mat_REC2020_to_REC2020 = mat3(
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0
);
const mat3 _colors2_colorspaces_mat_REC2020_to_DCI_P3 = mat3(
    1.4261665053, -0.3646122688, -0.0615542365,
    -0.0625062418, 1.0689717224, -0.0064654806,
    0.0024438227, -0.0211212969, 1.0186774743
);
const mat3 _colors2_colorspaces_mat_REC2020_to_ADOBE_RGB_1998 = mat3(
    1.151978935, -0.0975047657, -0.0544737317,
    -0.124547502, 1.1329022557, -0.0083434163,
    -0.0225324809, -0.0498056448, 1.0723310102
);
const mat3 _colors2_colorspaces_mat_REC2020_to_ACES_AP0 = mat3(
    0.6790856347, 0.1577009146, 0.1632134507,
    0.0460020031, 0.859054673, 0.094943324,
    -0.0005739432, 0.0284677684, 0.9721061748
);
const mat3 _colors2_colorspaces_mat_REC2020_to_ACES_AP1 = mat3(
    0.9748949779, 0.0195991086, 0.0055059134,
    0.0021795628, 0.9955354689, 0.0022849683,
    0.0047972397, 0.0245320166, 0.9706707437
);
const mat3 _colors2_colorspaces_mat_REC2020_to_COLOR_MCSPACEFACE = mat3(
    1.02924225, -0.0545245427, 0.0252822927,
    -0.08983974, 1.0853508417, 0.0044888983,
    0.0007354405, 0.0387656211, 0.9604989385
);
const mat3 _colors2_colorspaces_mat_DCI_P3_to_CIE_XYZ = mat3(
    0.4451698156, 0.2771344092, 0.1722826698,
    0.2094916779, 0.7215952542, 0.0689130679,
    -0.0, 0.0470605601, 0.9073553944
);
const mat3 _colors2_colorspaces_mat_DCI_P3_to_SRGB = mat3(
    1.1573859234, -0.1549414014, -0.0026012394,
    -0.041378309, 1.0455482025, -0.0040707446,
    -0.0180228775, -0.0785725929, 1.0966699081
);
const mat3 _colors2_colorspaces_mat_DCI_P3_to_REC709 = mat3(
    1.1575164062, -0.1549623781, -0.0025540281,
    -0.0415000715, 1.0455679231, -0.0040678515,
    -0.018050039, -0.0785782727, 1.0966283116
);
const mat3 _colors2_colorspaces_mat_DCI_P3_to_REC2020 = mat3(
    0.7117832307, 0.2436603169, 0.0445564524,
    0.0416151636, 0.9498416297, 0.0085432067,
    -0.0008447284, 0.0191095072, 0.9817352212
);
const mat3 _colors2_colorspaces_mat_DCI_P3_to_DCI_P3 = mat3(
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0
);
const mat3 _colors2_colorspaces_mat_DCI_P3_to_ADOBE_RGB_1998 = mat3(
    0.8159476268, 0.1870365007, -0.0029836898,
    -0.0414978627, 1.0455710024, -0.0040618024,
    -0.0190167405, -0.0323060291, 1.0513156541
);
const mat3 _colors2_colorspaces_mat_DCI_P3_to_ACES_AP0 = mat3(
    0.4897866453, 0.3183760433, 0.1918373114,
    0.0684129538, 0.8289890733, 0.1025979728,
    -4.4998e-05, 0.0454764943, 0.9545685037
);
const mat3 _colors2_colorspaces_mat_DCI_P3_to_ACES_AP1 = mat3(
    0.6947248661, 0.2562644839, 0.04901065,
    0.0429788175, 0.9461757697, 0.0108454127,
    0.0036155455, 0.0430194671, 0.9533649873
);
const mat3 _colors2_colorspaces_mat_DCI_P3_to_COLOR_MCSPACEFACE = mat3(
    0.7303069694, 0.1994789445, 0.0702140861,
    -0.0187831594, 1.0091068134, 0.009676346,
    0.0013253512, 0.0553550597, 0.9433195891
);
const mat3 _colors2_colorspaces_mat_ADOBE_RGB_1998_to_CIE_XYZ = mat3(
    0.57667, 0.18556, 0.18823,
    0.29734, 0.62736, 0.07529,
    0.02703, 0.07069, 0.99134
);
const mat3 _colors2_colorspaces_mat_ADOBE_RGB_1998_to_SRGB = mat3(
    1.398208596, -0.39829809, -3.9774e-05,
    0.000136554, 0.999946439, -6.455e-06,
    3.3869e-05, -0.042926418, 1.042971631
);
const mat3 _colors2_colorspaces_mat_ADOBE_RGB_1998_to_REC709 = mat3(
    1.3983671735, -0.3983451225, 5.4016e-06,
    -1.03176e-05, 0.9999916496, -3.9459e-06,
    -3.709e-07, -0.042926951, 1.0429319656
);
const mat3 _colors2_colorspaces_mat_ADOBE_RGB_1998_to_REC2020 = mat3(
    0.8773375991, 0.0774977091, 0.0451746704,
    0.0966138895, 0.8915203988, 0.011846867,
    0.0229200098, 0.0430379497, 0.9340446591
);
const mat3 _colors2_colorspaces_mat_ADOBE_RGB_1998_to_DCI_P3 = mat3(
    1.2145920645, -0.2171838064, 0.0026126829,
    0.0482902509, 0.9478877447, 0.0038012193,
    0.0234515446, 0.0252011134, 0.9513504319
);
const mat3 _colors2_colorspaces_mat_ADOBE_RGB_1998_to_ADOBE_RGB_1998 = mat3(
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0
);
const mat3 _colors2_colorspaces_mat_ADOBE_RGB_1998_to_ACES_AP0 = mat3(
    0.614764313, 0.2002455356, 0.1849943834,
    0.1255320021, 0.7735159805, 0.1009365364,
    0.024527523, 0.0671725736, 0.9083019068
);
const mat3 _colors2_colorspaces_mat_ADOBE_RGB_1998_to_ACES_AP1 = mat3(
    0.857331761, 0.0932620958, 0.0494155164,
    0.0981471377, 0.8878074297, 0.0140266997,
    0.0288267153, 0.0640182469, 0.9071571651
);
const mat3 _colors2_colorspaces_mat_ADOBE_RGB_1998_to_COLOR_MCSPACEFACE = mat3(
    0.8983045668, 0.0322422724, 0.0694645249,
    0.0261430701, 0.9608432342, 0.0129923579,
    0.0264051721, 0.0759552419, 0.897641378
);
const mat3 _colors2_colorspaces_mat_ACES_AP0_to_CIE_XYZ = mat3(
    0.9525523959, 0.0, 9.36786e-05,
    0.3439664498, 0.7281660966, -0.0721325464,
    0.0, 0.0, 1.0088251844
);
const mat3 _colors2_colorspaces_mat_ACES_AP0_to_SRGB = mat3(
    2.5214008886, -1.1339957494, -0.3875618568,
    -0.2762140616, 1.3725955663, -0.0962823557,
    -0.0153202001, -0.1529925618, 1.1683871996
);
const mat3 _colors2_colorspaces_mat_ACES_AP0_to_REC709 = mat3(
    2.5216861866, -1.1341309882, -0.3875551986,
    -0.2764799141, 1.3727190876, -0.0962391734,
    -0.015378065, -0.1529753359, 1.1683534009
);
const mat3 _colors2_colorspaces_mat_ACES_AP0_to_REC2020 = mat3(
    1.4904095205, -0.2661709193, -0.2242386013,
    -0.0801674998, 1.1821671211, -0.1019996212,
    0.0032276312, -0.0347764757, 1.0315488446
);
const mat3 _colors2_colorspaces_mat_ACES_AP0_to_DCI_P3 = mat3(
    2.1546035168, -0.8084960464, -0.3461074707,
    -0.1788775564, 1.280565414, -0.1016878576,
    0.0086234533, -0.0610453898, 1.0524219365
);
const mat3 _colors2_colorspaces_mat_ACES_AP0_to_ADOBE_RGB_1998 = mat3(
    1.7245612643, -0.4199958158, -0.304565011,
    -0.2764756536, 1.3727208758, -0.0962338848,
    -0.0261287411, -0.0901729979, 1.1162946235
);
const mat3 _colors2_colorspaces_mat_ACES_AP0_to_ACES_AP0 = mat3(
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0
);
const mat3 _colors2_colorspaces_mat_ACES_AP0_to_ACES_AP1 = mat3(
    1.4514393161, -0.2365107469, -0.2149285693,
    -0.0765537733, 1.1762296998, -0.0996759265,
    0.0083161484, -0.0060324498, 0.9977163014
);
const mat3 _colors2_colorspaces_mat_ACES_AP0_to_COLOR_MCSPACEFACE = mat3(
    1.5384451464, -0.3392907066, -0.19915444,
    -0.2208933788, 1.3068226981, -0.0859293193,
    0.0010885009, 0.0122289218, 0.9866825774
);
const mat3 _colors2_colorspaces_mat_ACES_AP1_to_CIE_XYZ = mat3(
    0.6624541811, 0.1340042065, 0.156187687,
    0.2722287168, 0.6740817658, 0.0536895174,
    -0.0055746495, 0.0040607335, 1.0103391003
);
const mat3 _colors2_colorspaces_mat_ACES_AP1_to_SRGB = mat3(
    1.7048586763, -0.6217160219, -0.0832993717,
    -0.1300768242, 1.1407357748, -0.0105598017,
    -0.0239640729, -0.1289755083, 1.1530140189
);
const mat3 _colors2_colorspaces_mat_ACES_AP1_to_REC709 = mat3(
    1.7050509927, -0.6217921207, -0.083258872,
    -0.1302564175, 1.1408047366, -0.0105483191,
    -0.0240033568, -0.1289689761, 1.1529723329
);
const mat3 _colors2_colorspaces_mat_ACES_AP1_to_REC2020 = mat3(
    1.0258247477, -0.0200531908, -0.0057715568,
    -0.0022343695, 1.0045865019, -0.0023521324,
    -0.0050133515, -0.0252900718, 1.0303034233
);
const mat3 _colors2_colorspaces_mat_ACES_AP1_to_DCI_P3 = mat3(
    1.464120167, -0.3933270416, -0.0707931253,
    -0.0664765138, 1.0752915253, -0.0088150114,
    -0.0025528617, -0.0470296027, 1.0495824644
);
const mat3 _colors2_colorspaces_mat_ACES_AP1_to_ADOBE_RGB_1998 = mat3(
    1.182219458, -0.1196751803, -0.06254384,
    -0.1302534036, 1.1408068945, -0.0105421535,
    -0.0283790646, -0.0767015586, 1.1050735076
);
const mat3 _colors2_colorspaces_mat_ACES_AP1_to_ACES_AP0 = mat3(
    0.6954522414, 0.1406786965, 0.1638690622,
    0.0447945634, 0.8596711184, 0.0955343182,
    -0.0055258826, 0.0040252103, 1.0015006723
);
const mat3 _colors2_colorspaces_mat_ACES_AP1_to_ACES_AP1 = mat3(
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0
);
const mat3 _colors2_colorspaces_mat_ACES_AP1_to_COLOR_MCSPACEFACE = mat3(
    1.0558172503, -0.0760536019, 0.0202363516,
    -0.0946074079, 1.0920168543, 0.0025905536,
    -0.0041475025, 0.0146375846, 0.9895099179
);
const mat3 _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_CIE_XYZ = mat3(
    0.6326705035, 0.1593748231, 0.1583847254,
    0.3109383344, 0.6385030652, 0.0505586004,
    -0.0019849432, -0.0136803265, 1.1044717614
);
const mat3 _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_SRGB = mat3(
    1.5732175875, -0.4582177853, -0.1151565195,
    -0.0298175917, 1.0427085222, -0.0127917816,
    -0.0302889016, -0.1358492065, 1.1662125458
);
const mat3 _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_REC709 = mat3(
    1.5733946999, -0.4582756388, -0.1151190611,
    -0.0299830237, 1.0427599524, -0.0127769286,
    -0.0303259165, -0.1358452479, 1.1661711645
);
const mat3 _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_REC2020 = mat3(
    0.975967555, 0.0499553701, -0.0259229251,
    0.0808021347, 0.9256507776, -0.0064529123,
    -0.004008449, -0.0373974036, 1.0414058526
);
const mat3 _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_DCI_P3 = mat3(
    1.3626775245, -0.2639569859, -0.0987205386,
    0.0253970497, 0.9866137758, -0.0120108255,
    -0.0034048709, -0.0575247555, 1.0609296265
);
const mat3 _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_ADOBE_RGB_1998 = mat3(
    1.1166338266, -0.030670652, -0.0859627369,
    -0.0299799561, 1.0427620595, -0.0127707659,
    -0.0303137568, -0.0873306478, 1.1176372892
);
const mat3 _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_ACES_AP0 = mat3(
    0.6748538843, 0.1737961892, 0.1513499266,
    0.1139293384, 0.7939320393, 0.0921386223,
    -0.0021565314, -0.0100317066, 1.012188238
);
const mat3 _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_ACES_AP1 = mat3(
    0.9530274476, 0.0666372627, -0.0196647103,
    0.0825594145, 0.9215416099, -0.0041010244,
    0.0027733055, -0.0133528374, 1.010579532
);
const mat3 _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_COLOR_MCSPACEFACE = mat3(
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0
);
#define colors2_colorspaces_SRGB_luma(x) dot(x, _colors2_colorspaces_mat_SRGB_to_CIE_XYZ[1])
#define colors2_colorspaces_1_luma(x) colors2_colorspaces_SRGB_luma(x)
#define colors2_colorspaces_REC709_luma(x) dot(x, _colors2_colorspaces_mat_REC709_to_CIE_XYZ[1])
#define colors2_colorspaces_2_luma(x) colors2_colorspaces_REC709_luma(x)
#define colors2_colorspaces_REC2020_luma(x) dot(x, _colors2_colorspaces_mat_REC2020_to_CIE_XYZ[1])
#define colors2_colorspaces_3_luma(x) colors2_colorspaces_REC2020_luma(x)
#define colors2_colorspaces_DCI_P3_luma(x) dot(x, _colors2_colorspaces_mat_DCI_P3_to_CIE_XYZ[1])
#define colors2_colorspaces_4_luma(x) colors2_colorspaces_DCI_P3_luma(x)
#define colors2_colorspaces_ADOBE_RGB_1998_luma(x) dot(x, _colors2_colorspaces_mat_ADOBE_RGB_1998_to_CIE_XYZ[1])
#define colors2_colorspaces_5_luma(x) colors2_colorspaces_ADOBE_RGB_1998_luma(x)
#define colors2_colorspaces_ACES_AP0_luma(x) dot(x, _colors2_colorspaces_mat_ACES_AP0_to_CIE_XYZ[1])
#define colors2_colorspaces_6_luma(x) colors2_colorspaces_ACES_AP0_luma(x)
#define colors2_colorspaces_ACES_AP1_luma(x) dot(x, _colors2_colorspaces_mat_ACES_AP1_to_CIE_XYZ[1])
#define colors2_colorspaces_7_luma(x) colors2_colorspaces_ACES_AP1_luma(x)
#define colors2_colorspaces_COLOR_MCSPACEFACE_luma(x) dot(x, _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_CIE_XYZ[1])
#define colors2_colorspaces_8_luma(x) colors2_colorspaces_COLOR_MCSPACEFACE_luma(x)
#define colors2_colorspaces_CIE_XYZ_to_CIE_XYZ(x) (x * _colors2_colorspaces_mat_CIE_XYZ_to_CIE_XYZ)
#define colors2_colorspaces_0_to_0(x) colors2_colorspaces_CIE_XYZ_to_CIE_XYZ(x)
#define colors2_colorspaces_CIE_XYZ_to_SRGB(x) (x * _colors2_colorspaces_mat_CIE_XYZ_to_SRGB)
#define colors2_colorspaces_0_to_1(x) colors2_colorspaces_CIE_XYZ_to_SRGB(x)
#define colors2_colorspaces_CIE_XYZ_to_REC709(x) (x * _colors2_colorspaces_mat_CIE_XYZ_to_REC709)
#define colors2_colorspaces_0_to_2(x) colors2_colorspaces_CIE_XYZ_to_REC709(x)
#define colors2_colorspaces_CIE_XYZ_to_REC2020(x) (x * _colors2_colorspaces_mat_CIE_XYZ_to_REC2020)
#define colors2_colorspaces_0_to_3(x) colors2_colorspaces_CIE_XYZ_to_REC2020(x)
#define colors2_colorspaces_CIE_XYZ_to_DCI_P3(x) (x * _colors2_colorspaces_mat_CIE_XYZ_to_DCI_P3)
#define colors2_colorspaces_0_to_4(x) colors2_colorspaces_CIE_XYZ_to_DCI_P3(x)
#define colors2_colorspaces_CIE_XYZ_to_ADOBE_RGB_1998(x) (x * _colors2_colorspaces_mat_CIE_XYZ_to_ADOBE_RGB_1998)
#define colors2_colorspaces_0_to_5(x) colors2_colorspaces_CIE_XYZ_to_ADOBE_RGB_1998(x)
#define colors2_colorspaces_CIE_XYZ_to_ACES_AP0(x) (x * _colors2_colorspaces_mat_CIE_XYZ_to_ACES_AP0)
#define colors2_colorspaces_0_to_6(x) colors2_colorspaces_CIE_XYZ_to_ACES_AP0(x)
#define colors2_colorspaces_CIE_XYZ_to_ACES_AP1(x) (x * _colors2_colorspaces_mat_CIE_XYZ_to_ACES_AP1)
#define colors2_colorspaces_0_to_7(x) colors2_colorspaces_CIE_XYZ_to_ACES_AP1(x)
#define colors2_colorspaces_CIE_XYZ_to_COLOR_MCSPACEFACE(x) (x * _colors2_colorspaces_mat_CIE_XYZ_to_COLOR_MCSPACEFACE)
#define colors2_colorspaces_0_to_8(x) colors2_colorspaces_CIE_XYZ_to_COLOR_MCSPACEFACE(x)
#define colors2_colorspaces_SRGB_to_CIE_XYZ(x) (x * _colors2_colorspaces_mat_SRGB_to_CIE_XYZ)
#define colors2_colorspaces_1_to_0(x) colors2_colorspaces_SRGB_to_CIE_XYZ(x)
#define colors2_colorspaces_SRGB_to_SRGB(x) (x * _colors2_colorspaces_mat_SRGB_to_SRGB)
#define colors2_colorspaces_1_to_1(x) colors2_colorspaces_SRGB_to_SRGB(x)
#define colors2_colorspaces_SRGB_to_REC709(x) (x * _colors2_colorspaces_mat_SRGB_to_REC709)
#define colors2_colorspaces_1_to_2(x) colors2_colorspaces_SRGB_to_REC709(x)
#define colors2_colorspaces_SRGB_to_REC2020(x) (x * _colors2_colorspaces_mat_SRGB_to_REC2020)
#define colors2_colorspaces_1_to_3(x) colors2_colorspaces_SRGB_to_REC2020(x)
#define colors2_colorspaces_SRGB_to_DCI_P3(x) (x * _colors2_colorspaces_mat_SRGB_to_DCI_P3)
#define colors2_colorspaces_1_to_4(x) colors2_colorspaces_SRGB_to_DCI_P3(x)
#define colors2_colorspaces_SRGB_to_ADOBE_RGB_1998(x) (x * _colors2_colorspaces_mat_SRGB_to_ADOBE_RGB_1998)
#define colors2_colorspaces_1_to_5(x) colors2_colorspaces_SRGB_to_ADOBE_RGB_1998(x)
#define colors2_colorspaces_SRGB_to_ACES_AP0(x) (x * _colors2_colorspaces_mat_SRGB_to_ACES_AP0)
#define colors2_colorspaces_1_to_6(x) colors2_colorspaces_SRGB_to_ACES_AP0(x)
#define colors2_colorspaces_SRGB_to_ACES_AP1(x) (x * _colors2_colorspaces_mat_SRGB_to_ACES_AP1)
#define colors2_colorspaces_1_to_7(x) colors2_colorspaces_SRGB_to_ACES_AP1(x)
#define colors2_colorspaces_SRGB_to_COLOR_MCSPACEFACE(x) (x * _colors2_colorspaces_mat_SRGB_to_COLOR_MCSPACEFACE)
#define colors2_colorspaces_1_to_8(x) colors2_colorspaces_SRGB_to_COLOR_MCSPACEFACE(x)
#define colors2_colorspaces_REC709_to_CIE_XYZ(x) (x * _colors2_colorspaces_mat_REC709_to_CIE_XYZ)
#define colors2_colorspaces_2_to_0(x) colors2_colorspaces_REC709_to_CIE_XYZ(x)
#define colors2_colorspaces_REC709_to_SRGB(x) (x * _colors2_colorspaces_mat_REC709_to_SRGB)
#define colors2_colorspaces_2_to_1(x) colors2_colorspaces_REC709_to_SRGB(x)
#define colors2_colorspaces_REC709_to_REC709(x) (x * _colors2_colorspaces_mat_REC709_to_REC709)
#define colors2_colorspaces_2_to_2(x) colors2_colorspaces_REC709_to_REC709(x)
#define colors2_colorspaces_REC709_to_REC2020(x) (x * _colors2_colorspaces_mat_REC709_to_REC2020)
#define colors2_colorspaces_2_to_3(x) colors2_colorspaces_REC709_to_REC2020(x)
#define colors2_colorspaces_REC709_to_DCI_P3(x) (x * _colors2_colorspaces_mat_REC709_to_DCI_P3)
#define colors2_colorspaces_2_to_4(x) colors2_colorspaces_REC709_to_DCI_P3(x)
#define colors2_colorspaces_REC709_to_ADOBE_RGB_1998(x) (x * _colors2_colorspaces_mat_REC709_to_ADOBE_RGB_1998)
#define colors2_colorspaces_2_to_5(x) colors2_colorspaces_REC709_to_ADOBE_RGB_1998(x)
#define colors2_colorspaces_REC709_to_ACES_AP0(x) (x * _colors2_colorspaces_mat_REC709_to_ACES_AP0)
#define colors2_colorspaces_2_to_6(x) colors2_colorspaces_REC709_to_ACES_AP0(x)
#define colors2_colorspaces_REC709_to_ACES_AP1(x) (x * _colors2_colorspaces_mat_REC709_to_ACES_AP1)
#define colors2_colorspaces_2_to_7(x) colors2_colorspaces_REC709_to_ACES_AP1(x)
#define colors2_colorspaces_REC709_to_COLOR_MCSPACEFACE(x) (x * _colors2_colorspaces_mat_REC709_to_COLOR_MCSPACEFACE)
#define colors2_colorspaces_2_to_8(x) colors2_colorspaces_REC709_to_COLOR_MCSPACEFACE(x)
#define colors2_colorspaces_REC2020_to_CIE_XYZ(x) (x * _colors2_colorspaces_mat_REC2020_to_CIE_XYZ)
#define colors2_colorspaces_3_to_0(x) colors2_colorspaces_REC2020_to_CIE_XYZ(x)
#define colors2_colorspaces_REC2020_to_SRGB(x) (x * _colors2_colorspaces_mat_REC2020_to_SRGB)
#define colors2_colorspaces_3_to_1(x) colors2_colorspaces_REC2020_to_SRGB(x)
#define colors2_colorspaces_REC2020_to_REC709(x) (x * _colors2_colorspaces_mat_REC2020_to_REC709)
#define colors2_colorspaces_3_to_2(x) colors2_colorspaces_REC2020_to_REC709(x)
#define colors2_colorspaces_REC2020_to_REC2020(x) (x * _colors2_colorspaces_mat_REC2020_to_REC2020)
#define colors2_colorspaces_3_to_3(x) colors2_colorspaces_REC2020_to_REC2020(x)
#define colors2_colorspaces_REC2020_to_DCI_P3(x) (x * _colors2_colorspaces_mat_REC2020_to_DCI_P3)
#define colors2_colorspaces_3_to_4(x) colors2_colorspaces_REC2020_to_DCI_P3(x)
#define colors2_colorspaces_REC2020_to_ADOBE_RGB_1998(x) (x * _colors2_colorspaces_mat_REC2020_to_ADOBE_RGB_1998)
#define colors2_colorspaces_3_to_5(x) colors2_colorspaces_REC2020_to_ADOBE_RGB_1998(x)
#define colors2_colorspaces_REC2020_to_ACES_AP0(x) (x * _colors2_colorspaces_mat_REC2020_to_ACES_AP0)
#define colors2_colorspaces_3_to_6(x) colors2_colorspaces_REC2020_to_ACES_AP0(x)
#define colors2_colorspaces_REC2020_to_ACES_AP1(x) (x * _colors2_colorspaces_mat_REC2020_to_ACES_AP1)
#define colors2_colorspaces_3_to_7(x) colors2_colorspaces_REC2020_to_ACES_AP1(x)
#define colors2_colorspaces_REC2020_to_COLOR_MCSPACEFACE(x) (x * _colors2_colorspaces_mat_REC2020_to_COLOR_MCSPACEFACE)
#define colors2_colorspaces_3_to_8(x) colors2_colorspaces_REC2020_to_COLOR_MCSPACEFACE(x)
#define colors2_colorspaces_DCI_P3_to_CIE_XYZ(x) (x * _colors2_colorspaces_mat_DCI_P3_to_CIE_XYZ)
#define colors2_colorspaces_4_to_0(x) colors2_colorspaces_DCI_P3_to_CIE_XYZ(x)
#define colors2_colorspaces_DCI_P3_to_SRGB(x) (x * _colors2_colorspaces_mat_DCI_P3_to_SRGB)
#define colors2_colorspaces_4_to_1(x) colors2_colorspaces_DCI_P3_to_SRGB(x)
#define colors2_colorspaces_DCI_P3_to_REC709(x) (x * _colors2_colorspaces_mat_DCI_P3_to_REC709)
#define colors2_colorspaces_4_to_2(x) colors2_colorspaces_DCI_P3_to_REC709(x)
#define colors2_colorspaces_DCI_P3_to_REC2020(x) (x * _colors2_colorspaces_mat_DCI_P3_to_REC2020)
#define colors2_colorspaces_4_to_3(x) colors2_colorspaces_DCI_P3_to_REC2020(x)
#define colors2_colorspaces_DCI_P3_to_DCI_P3(x) (x * _colors2_colorspaces_mat_DCI_P3_to_DCI_P3)
#define colors2_colorspaces_4_to_4(x) colors2_colorspaces_DCI_P3_to_DCI_P3(x)
#define colors2_colorspaces_DCI_P3_to_ADOBE_RGB_1998(x) (x * _colors2_colorspaces_mat_DCI_P3_to_ADOBE_RGB_1998)
#define colors2_colorspaces_4_to_5(x) colors2_colorspaces_DCI_P3_to_ADOBE_RGB_1998(x)
#define colors2_colorspaces_DCI_P3_to_ACES_AP0(x) (x * _colors2_colorspaces_mat_DCI_P3_to_ACES_AP0)
#define colors2_colorspaces_4_to_6(x) colors2_colorspaces_DCI_P3_to_ACES_AP0(x)
#define colors2_colorspaces_DCI_P3_to_ACES_AP1(x) (x * _colors2_colorspaces_mat_DCI_P3_to_ACES_AP1)
#define colors2_colorspaces_4_to_7(x) colors2_colorspaces_DCI_P3_to_ACES_AP1(x)
#define colors2_colorspaces_DCI_P3_to_COLOR_MCSPACEFACE(x) (x * _colors2_colorspaces_mat_DCI_P3_to_COLOR_MCSPACEFACE)
#define colors2_colorspaces_4_to_8(x) colors2_colorspaces_DCI_P3_to_COLOR_MCSPACEFACE(x)
#define colors2_colorspaces_ADOBE_RGB_1998_to_CIE_XYZ(x) (x * _colors2_colorspaces_mat_ADOBE_RGB_1998_to_CIE_XYZ)
#define colors2_colorspaces_5_to_0(x) colors2_colorspaces_ADOBE_RGB_1998_to_CIE_XYZ(x)
#define colors2_colorspaces_ADOBE_RGB_1998_to_SRGB(x) (x * _colors2_colorspaces_mat_ADOBE_RGB_1998_to_SRGB)
#define colors2_colorspaces_5_to_1(x) colors2_colorspaces_ADOBE_RGB_1998_to_SRGB(x)
#define colors2_colorspaces_ADOBE_RGB_1998_to_REC709(x) (x * _colors2_colorspaces_mat_ADOBE_RGB_1998_to_REC709)
#define colors2_colorspaces_5_to_2(x) colors2_colorspaces_ADOBE_RGB_1998_to_REC709(x)
#define colors2_colorspaces_ADOBE_RGB_1998_to_REC2020(x) (x * _colors2_colorspaces_mat_ADOBE_RGB_1998_to_REC2020)
#define colors2_colorspaces_5_to_3(x) colors2_colorspaces_ADOBE_RGB_1998_to_REC2020(x)
#define colors2_colorspaces_ADOBE_RGB_1998_to_DCI_P3(x) (x * _colors2_colorspaces_mat_ADOBE_RGB_1998_to_DCI_P3)
#define colors2_colorspaces_5_to_4(x) colors2_colorspaces_ADOBE_RGB_1998_to_DCI_P3(x)
#define colors2_colorspaces_ADOBE_RGB_1998_to_ADOBE_RGB_1998(x) (x * _colors2_colorspaces_mat_ADOBE_RGB_1998_to_ADOBE_RGB_1998)
#define colors2_colorspaces_5_to_5(x) colors2_colorspaces_ADOBE_RGB_1998_to_ADOBE_RGB_1998(x)
#define colors2_colorspaces_ADOBE_RGB_1998_to_ACES_AP0(x) (x * _colors2_colorspaces_mat_ADOBE_RGB_1998_to_ACES_AP0)
#define colors2_colorspaces_5_to_6(x) colors2_colorspaces_ADOBE_RGB_1998_to_ACES_AP0(x)
#define colors2_colorspaces_ADOBE_RGB_1998_to_ACES_AP1(x) (x * _colors2_colorspaces_mat_ADOBE_RGB_1998_to_ACES_AP1)
#define colors2_colorspaces_5_to_7(x) colors2_colorspaces_ADOBE_RGB_1998_to_ACES_AP1(x)
#define colors2_colorspaces_ADOBE_RGB_1998_to_COLOR_MCSPACEFACE(x) (x * _colors2_colorspaces_mat_ADOBE_RGB_1998_to_COLOR_MCSPACEFACE)
#define colors2_colorspaces_5_to_8(x) colors2_colorspaces_ADOBE_RGB_1998_to_COLOR_MCSPACEFACE(x)
#define colors2_colorspaces_ACES_AP0_to_CIE_XYZ(x) (x * _colors2_colorspaces_mat_ACES_AP0_to_CIE_XYZ)
#define colors2_colorspaces_6_to_0(x) colors2_colorspaces_ACES_AP0_to_CIE_XYZ(x)
#define colors2_colorspaces_ACES_AP0_to_SRGB(x) (x * _colors2_colorspaces_mat_ACES_AP0_to_SRGB)
#define colors2_colorspaces_6_to_1(x) colors2_colorspaces_ACES_AP0_to_SRGB(x)
#define colors2_colorspaces_ACES_AP0_to_REC709(x) (x * _colors2_colorspaces_mat_ACES_AP0_to_REC709)
#define colors2_colorspaces_6_to_2(x) colors2_colorspaces_ACES_AP0_to_REC709(x)
#define colors2_colorspaces_ACES_AP0_to_REC2020(x) (x * _colors2_colorspaces_mat_ACES_AP0_to_REC2020)
#define colors2_colorspaces_6_to_3(x) colors2_colorspaces_ACES_AP0_to_REC2020(x)
#define colors2_colorspaces_ACES_AP0_to_DCI_P3(x) (x * _colors2_colorspaces_mat_ACES_AP0_to_DCI_P3)
#define colors2_colorspaces_6_to_4(x) colors2_colorspaces_ACES_AP0_to_DCI_P3(x)
#define colors2_colorspaces_ACES_AP0_to_ADOBE_RGB_1998(x) (x * _colors2_colorspaces_mat_ACES_AP0_to_ADOBE_RGB_1998)
#define colors2_colorspaces_6_to_5(x) colors2_colorspaces_ACES_AP0_to_ADOBE_RGB_1998(x)
#define colors2_colorspaces_ACES_AP0_to_ACES_AP0(x) (x * _colors2_colorspaces_mat_ACES_AP0_to_ACES_AP0)
#define colors2_colorspaces_6_to_6(x) colors2_colorspaces_ACES_AP0_to_ACES_AP0(x)
#define colors2_colorspaces_ACES_AP0_to_ACES_AP1(x) (x * _colors2_colorspaces_mat_ACES_AP0_to_ACES_AP1)
#define colors2_colorspaces_6_to_7(x) colors2_colorspaces_ACES_AP0_to_ACES_AP1(x)
#define colors2_colorspaces_ACES_AP0_to_COLOR_MCSPACEFACE(x) (x * _colors2_colorspaces_mat_ACES_AP0_to_COLOR_MCSPACEFACE)
#define colors2_colorspaces_6_to_8(x) colors2_colorspaces_ACES_AP0_to_COLOR_MCSPACEFACE(x)
#define colors2_colorspaces_ACES_AP1_to_CIE_XYZ(x) (x * _colors2_colorspaces_mat_ACES_AP1_to_CIE_XYZ)
#define colors2_colorspaces_7_to_0(x) colors2_colorspaces_ACES_AP1_to_CIE_XYZ(x)
#define colors2_colorspaces_ACES_AP1_to_SRGB(x) (x * _colors2_colorspaces_mat_ACES_AP1_to_SRGB)
#define colors2_colorspaces_7_to_1(x) colors2_colorspaces_ACES_AP1_to_SRGB(x)
#define colors2_colorspaces_ACES_AP1_to_REC709(x) (x * _colors2_colorspaces_mat_ACES_AP1_to_REC709)
#define colors2_colorspaces_7_to_2(x) colors2_colorspaces_ACES_AP1_to_REC709(x)
#define colors2_colorspaces_ACES_AP1_to_REC2020(x) (x * _colors2_colorspaces_mat_ACES_AP1_to_REC2020)
#define colors2_colorspaces_7_to_3(x) colors2_colorspaces_ACES_AP1_to_REC2020(x)
#define colors2_colorspaces_ACES_AP1_to_DCI_P3(x) (x * _colors2_colorspaces_mat_ACES_AP1_to_DCI_P3)
#define colors2_colorspaces_7_to_4(x) colors2_colorspaces_ACES_AP1_to_DCI_P3(x)
#define colors2_colorspaces_ACES_AP1_to_ADOBE_RGB_1998(x) (x * _colors2_colorspaces_mat_ACES_AP1_to_ADOBE_RGB_1998)
#define colors2_colorspaces_7_to_5(x) colors2_colorspaces_ACES_AP1_to_ADOBE_RGB_1998(x)
#define colors2_colorspaces_ACES_AP1_to_ACES_AP0(x) (x * _colors2_colorspaces_mat_ACES_AP1_to_ACES_AP0)
#define colors2_colorspaces_7_to_6(x) colors2_colorspaces_ACES_AP1_to_ACES_AP0(x)
#define colors2_colorspaces_ACES_AP1_to_ACES_AP1(x) (x * _colors2_colorspaces_mat_ACES_AP1_to_ACES_AP1)
#define colors2_colorspaces_7_to_7(x) colors2_colorspaces_ACES_AP1_to_ACES_AP1(x)
#define colors2_colorspaces_ACES_AP1_to_COLOR_MCSPACEFACE(x) (x * _colors2_colorspaces_mat_ACES_AP1_to_COLOR_MCSPACEFACE)
#define colors2_colorspaces_7_to_8(x) colors2_colorspaces_ACES_AP1_to_COLOR_MCSPACEFACE(x)
#define colors2_colorspaces_COLOR_MCSPACEFACE_to_CIE_XYZ(x) (x * _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_CIE_XYZ)
#define colors2_colorspaces_8_to_0(x) colors2_colorspaces_COLOR_MCSPACEFACE_to_CIE_XYZ(x)
#define colors2_colorspaces_COLOR_MCSPACEFACE_to_SRGB(x) (x * _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_SRGB)
#define colors2_colorspaces_8_to_1(x) colors2_colorspaces_COLOR_MCSPACEFACE_to_SRGB(x)
#define colors2_colorspaces_COLOR_MCSPACEFACE_to_REC709(x) (x * _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_REC709)
#define colors2_colorspaces_8_to_2(x) colors2_colorspaces_COLOR_MCSPACEFACE_to_REC709(x)
#define colors2_colorspaces_COLOR_MCSPACEFACE_to_REC2020(x) (x * _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_REC2020)
#define colors2_colorspaces_8_to_3(x) colors2_colorspaces_COLOR_MCSPACEFACE_to_REC2020(x)
#define colors2_colorspaces_COLOR_MCSPACEFACE_to_DCI_P3(x) (x * _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_DCI_P3)
#define colors2_colorspaces_8_to_4(x) colors2_colorspaces_COLOR_MCSPACEFACE_to_DCI_P3(x)
#define colors2_colorspaces_COLOR_MCSPACEFACE_to_ADOBE_RGB_1998(x) (x * _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_ADOBE_RGB_1998)
#define colors2_colorspaces_8_to_5(x) colors2_colorspaces_COLOR_MCSPACEFACE_to_ADOBE_RGB_1998(x)
#define colors2_colorspaces_COLOR_MCSPACEFACE_to_ACES_AP0(x) (x * _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_ACES_AP0)
#define colors2_colorspaces_8_to_6(x) colors2_colorspaces_COLOR_MCSPACEFACE_to_ACES_AP0(x)
#define colors2_colorspaces_COLOR_MCSPACEFACE_to_ACES_AP1(x) (x * _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_ACES_AP1)
#define colors2_colorspaces_8_to_7(x) colors2_colorspaces_COLOR_MCSPACEFACE_to_ACES_AP1(x)
#define colors2_colorspaces_COLOR_MCSPACEFACE_to_COLOR_MCSPACEFACE(x) (x * _colors2_colorspaces_mat_COLOR_MCSPACEFACE_to_COLOR_MCSPACEFACE)
#define colors2_colorspaces_8_to_8(x) colors2_colorspaces_COLOR_MCSPACEFACE_to_COLOR_MCSPACEFACE(x)
/*
    References:
        [WIK25a] Wikipedia. "Rec. 601". 2025.
            https:
        [WIK25b] Wikipedia. "Rec. 709". 2025.
            https:
        [WIK25c] Wikipedia. "sRGB". 2025.
            https:
        [ITU25] ITU, "Recommendation BT.2100", 2025.
            https:
            
    Note:
        EOTF: Electro-Optical Transfer Function (decoding gamma, non-linear to linear)
        OETF: Opto-Electronic Transfer Function (encoding gamma, linear to non-linear)
*/
#define COLORS2_TF_IDENTITY 0
#define COLORS2_TF_REC601 1
#define COLORS2_TF_REC709 2
#define COLORS2_TF_SRGB   3
#define COLORS2_TF_EXP22  4
#define COLORS2_TF_EXP24  5
#define COLORS2_TF_PQ     6
#define COLORS2_TF_HLG    7
#define _colors2_oetf(a, x) colors2_oetf_## a ##(x)
#define colors2_oetf(a, x) _colors2_oetf(a, x)
#define _colors2_eotf(a, x) colors2_eotf_## a ##(x)
#define colors2_eotf(a, x) _colors2_eotf(a, x)
float colors2_oetf_identity(float c) {
    return c;
}
vec3 colors2_oetf_identity(vec3 c) {
    return c;
}
float colors2_eotf_identity(float c) {
    return c;
}
vec3 colors2_eotf_identity(vec3 c) {
    return c;
}
float colors2_oetf_Rec601(float c) {
    float lower = 4.5 * c;
    float higher = pow(c, 0.45) * 1.099 - 0.099;
    return mix(lower, higher, c >= 0.018);
}
vec3 colors2_oetf_Rec601(vec3 c) {
    vec3 lower = 4.5 * c;
    vec3 higher = pow(c, vec3(0.45)) * 1.099 - 0.099;
    return mix(lower, higher, greaterThanEqual(c, vec3(0.018)));
}
float colors2_eotf_Rec601(float c) {
    float lower = c / 4.5;
    float higher = pow((c + 0.099) / 1.099, 1.0 / 0.45);
    return mix(lower, higher, c >= 0.081);
}
vec3 colors2_eotf_Rec601(vec3 c) {
    vec3 lower = c / 4.5;
    vec3 higher = pow((c + 0.099) / 1.099, vec3(1.0 / 0.45));
    return mix(lower, higher, greaterThanEqual(c, vec3(0.081)));
}
float colors2_oetf_Rec709(float c) {
    return colors2_oetf_Rec601(c);
}
vec3 colors2_oetf_Rec709(vec3 c) {
    return colors2_oetf_Rec601(c);
}
float colors2_eotf_Rec709(float c) {
    return colors2_eotf_Rec601(c);
}
vec3 colors2_eotf_Rec709(vec3 c) {
    return colors2_eotf_Rec601(c);
}
float colors2_oetf_sRGB(float c) {
    float lower = 12.92 * c;
    float higher = pow(c, 1.0 / 2.4) * 1.055 - 0.055;
    return mix(lower, higher, c > 0.0031308);
}
vec3 colors2_oetf_sRGB(vec3 c) {
    vec3 lower = 12.92 * c;
    vec3 higher = pow(c, vec3(1.0 / 2.4)) * 1.055 - 0.055;
    return mix(lower, higher, greaterThan(c, vec3(0.0031308)));
}
float colors2_eotf_sRGB(float c) {
    float lower = c / 12.92;
    float higher = pow((c + 0.055) / 1.055, 2.4);
    return mix(lower, higher, c > 0.04045);
}
vec3 colors2_eotf_sRGB(vec3 c) {
    vec3 lower = c / 12.92;
    vec3 higher = pow((c + 0.055) / 1.055, vec3(2.4));
    return mix(lower, higher, greaterThan(c, vec3(0.04045)));
}
float colors2_oetf_Exp22(float c) {
    return pow(c, 1.0 / 2.2);
}
vec3 colors2_oetf_Exp22(vec3 c) {
    return pow(c, vec3(1.0 / 2.2));
}
float colors2_eotf_Exp22(float c) {
    return pow(c, 2.2);
}
vec3 colors2_eotf_Exp22(vec3 c) {
    return pow(c, vec3(2.2));
}
float colors2_oetf_Exp24(float c) {
    return pow(c, 1.0 / 2.4);
}
vec3 colors2_oetf_Exp24(vec3 c) {
    return pow(c, vec3(1.0 / 2.4));
}
float colors2_eotf_Exp24(float c) {
    return pow(c, 2.4);
}
vec3 colors2_eotf_Exp24(vec3 c) {
    return pow(c, vec3(2.4));
}
const float _PQ_M1 = 2610.0 / 16384.0;
const float _PQ_M2 = 2523.0 / 4096.0 * 128.0;
const float _PQ_C1 = 3424.0 / 4096.0;
const float _PQ_C2 = 2413.0 / 4096.0 * 32.0;
const float _PQ_C3 = 2392.0 / 4096.0 * 32.0;
const float _PQ_PEAK = 10000.0;
float colors2_oetf_PQ(float c) {
    float y = c / _PQ_PEAK;
    float yPow = pow(y, _PQ_M1);
    float numerator = _PQ_C1 + _PQ_C2 * yPow;
    float denominator = 1.0 + _PQ_C3 * yPow;
    return pow(numerator / denominator, _PQ_M2);
}
vec3 colors2_oetf_PQ(vec3 c) {
    vec3 y = c / _PQ_PEAK;
    vec3 yPow = pow(y, vec3(_PQ_M1));
    vec3 numerator = vec3(_PQ_C1) + vec3(_PQ_C2) * yPow;
    vec3 denominator = vec3(1.0) + vec3(_PQ_C3) * yPow;
    return pow(numerator / denominator, vec3(_PQ_M2));
}
float colors2_eotf_PQ(float c) {
    float ePow = pow(c, 1.0 / _PQ_M2);
    float numerator = max(ePow - _PQ_C1, 0.0);
    float denominator = _PQ_C2 - _PQ_C3 * ePow;
    float y = pow(numerator / denominator, 1.0 / _PQ_M1);
    return y * _PQ_PEAK;
}
vec3 colors2_eotf_PQ(vec3 c) {
    vec3 ePow = pow(c, vec3(1.0 / _PQ_M2));
    vec3 numerator = max(ePow - vec3(_PQ_C1), 0.0);
    vec3 denominator = _PQ_C2 - _PQ_C3 * ePow;
    vec3 y = pow(numerator / denominator, vec3(1.0 / _PQ_M1));
    return y * _PQ_PEAK;
}
const float _HLG_A = 0.17883277;
const float _HLG_B = 1.0 - 4.0 * _HLG_A;
const float _HLG_C = 0.5 - _HLG_A * log(4.0 * _HLG_A);
float colors2_oetf_HLG(float c) {
    float lower = sqrt(3.0 * c);
    float higher = _HLG_A * log(12.0 * c - _HLG_B) + _HLG_C;
    return mix(lower, higher, c > 1.0 / 12.0);
}
vec3 colors2_oetf_HLG(vec3 c) {
    vec3 lower = sqrt(3.0 * c);
    vec3 higher = _HLG_A * log(12.0 * c - _HLG_B) + _HLG_C;
    return mix(lower, higher, greaterThan(c, vec3(1.0 / 12.0)));
}
float colors2_eotf_HLG(float c) {
    float lower = c * c / 3.0;
    float higher = (exp((c - _HLG_C) / _HLG_A) + _HLG_B) / 12.0;
    return mix(lower, higher, c > 0.5);
}
vec3 colors2_eotf_HLG(vec3 c) {
    vec3 lower = c * c / 3.0;
    vec3 higher = (exp((c - vec3(_HLG_C)) / vec3(_HLG_A)) + vec3(_HLG_B)) / 12.0;
    return mix(lower, higher, greaterThan(c, vec3(0.5)));
}
float colors2_oetf_0(float c) { return colors2_eotf_identity(c); }
vec3 colors2_oetf_0(vec3 c) { return colors2_eotf_identity(c); }
float colors2_eotf_0(float c) { return colors2_oetf_identity(c); }
vec3 colors2_eotf_0(vec3 c) { return colors2_oetf_identity(c); }
float colors2_oetf_1(float c) { return colors2_oetf_Rec601(c); }
vec3 colors2_oetf_1(vec3 c) { return colors2_oetf_Rec601(c); }
float colors2_eotf_1(float c) { return colors2_eotf_Rec601(c); }
vec3 colors2_eotf_1(vec3 c) { return colors2_eotf_Rec601(c); }
float colors2_oetf_2(float c) { return colors2_oetf_Rec709(c); }
vec3 colors2_oetf_2(vec3 c) { return colors2_oetf_Rec709(c); }
float colors2_eotf_2(float c) { return colors2_eotf_Rec709(c); }
vec3 colors2_eotf_2(vec3 c) { return colors2_eotf_Rec709(c); }
float colors2_oetf_3(float c) { return colors2_oetf_sRGB(c); }
vec3 colors2_oetf_3(vec3 c) { return colors2_oetf_sRGB(c); }
float colors2_eotf_3(float c) { return colors2_eotf_sRGB(c); }
vec3 colors2_eotf_3(vec3 c) { return colors2_eotf_sRGB(c); }
float colors2_oetf_4(float c) { return colors2_oetf_Exp22(c); }
vec3 colors2_oetf_4(vec3 c) { return colors2_oetf_Exp22(c); }
float colors2_eotf_4(float c) { return colors2_eotf_Exp22(c); }
vec3 colors2_eotf_4(vec3 c) { return colors2_eotf_Exp22(c); }
float colors2_oetf_5(float c) { return colors2_oetf_Exp24(c); }
vec3 colors2_oetf_5(vec3 c) { return colors2_oetf_Exp24(c); }
float colors2_eotf_5(float c) { return colors2_eotf_Exp24(c); }
vec3 colors2_eotf_5(vec3 c) { return colors2_eotf_Exp24(c); }
float colors2_oetf_6(float c) { return colors2_oetf_PQ(c); }
vec3 colors2_oetf_6(vec3 c) { return colors2_oetf_PQ(c); }
float colors2_eotf_6(float c) { return colors2_eotf_PQ(c); }
vec3 colors2_eotf_6(vec3 c) { return colors2_eotf_PQ(c); }
float colors2_oetf_7(float c) { return colors2_oetf_HLG(c); }
vec3 colors2_oetf_7(vec3 c) { return colors2_oetf_HLG(c); }
float colors2_eotf_7(float c) { return colors2_eotf_HLG(c); }
vec3 colors2_eotf_7(vec3 c) { return colors2_eotf_HLG(c); }
#define COLORS2_MATERIAL_COLORSPACE SETTING_MATERIAL_COLOR_SPACE
#define COLORS2_MATERIAL_TF SETTING_MATERIAL_TRANSFER_FUNC
#define COLORS2_CONSTANTS_COLORSPACE COLORS2_COLORSPACES_ACES_AP0
#define COLORS2_CONSTANTS_TF COLORS2_TF_IDENTITY
#define COLORS2_WORKING_COLORSPACE SETTING_WORKING_COLOR_SPACE
#define COLORS2_DRT_WORKING_COLORSPACE SETTING_DRT_WORKING_COLOR_SPACE
#define COLORS2_OUTPUT_COLORSPACE COLORS2_COLORSPACES_SRGB
#define COLORS2_OUTPUT_TF COLORS2_TF_SRGB
#define colors2_material_toWorkSpace(x) colors2_colorspaces_convert(COLORS2_MATERIAL_COLORSPACE, COLORS2_WORKING_COLORSPACE, colors2_eotf(COLORS2_MATERIAL_TF, x))
#define colors2_constants_toWorkSpace(x) colors2_colorspaces_convert(COLORS2_CONSTANTS_COLORSPACE, COLORS2_WORKING_COLORSPACE, x)
const mat3 _SRGB_TO_YCOCG = mat3(
    0.25, 0.5, -0.25,
    0.5, 0.0, 0.5,
    0.25, -0.5, -0.25
);
const mat3 _YCOCG_TO_SRGB = mat3(
    1.0, 1.0, 1.0,
    1.0, 0.0, -1.0,
    -1.0, 1.0, -1.0
);
const mat3 _COLORS_LOGLUV32_M = mat3(
    0.2209, 0.3390, 0.4184,
    0.1138, 0.6780, 0.7319,
    0.0102, 0.1130, 0.2969
);
const mat3 _COLORS_LOGLUV32_INVERSE_M = mat3(
    6.0014, -2.7008, -1.7996,
    -1.3320, 3.1029, -5.7721,
    0.3008, -1.0882, 5.6268
);
const vec2 _COLORS_UV_MUL = vec2(6.4313725490, 14.4705882353);
const vec3 _COLORS_UV_DIV = vec3(1.0, 15.0, 3.0);
const float _COLORS_UV_INV_MUL = 0.6219512195;
const vec2 _COLORS_UV_Z_MUL = vec2(-3.0, -20.0);
/*
    References:
        [FOU99] G. Fournier, M. Jonasz. “Computer-based underwater imaging analysis”.irborne and In-water Underwater Imaging. 1999.
        [DRA03] Draine, B.T. "Scattering by Interstellar Dust Grains. I. Optical and Ultraviolet".
            The Astrophysical Journal. 2003.
            https:
        [JEN23] Jendersie, Johannes. d'Eon, Eugene. "An Approximate Mie Scattering Function for Fog and Cloud Rendering".
            SIGGRAPH 2023. 2023.
            https:

     Other Credits:
        Jessie - Bi-Lambertian plate and Klein-Nishina phase functions

        You can find full license texts in /licenses
*/
const float UNIFORM_PHASE = 1.0 / (4.0 * PI);
float phasefunc_HenyeyGreenstein(float cosTheta, float g) {
    float g2 = pow2(g);
    float numerator = 1.0 - g2;
    float denominator = pow(1.0 + g2 - 2.0 * g * cosTheta, 3.0 / 2.0);
    float term0 = UNIFORM_PHASE;
    float term1 = numerator / denominator;
    return term0 * term1;
}
vec3 phasefunc_HenyeyGreenstein(float cosTheta, vec3 g) {
    vec3 g2 = pow2(g);
    vec3 numerator = 1.0 - g2;
    vec3 denominator = pow(1.0 + g2 - 2.0 * g * cosTheta, vec3(3.0 / 2.0));
    float term0 = UNIFORM_PHASE;
    vec3 term1 = numerator / denominator;
    return term0 * term1;
}
float phasefunc_Draine(float cosTheta, float g, float alpha) {
    float g2 = pow2(g);
    float numerator1 = 1.0 - g2;
    float denominator1 = pow(1.0 + g2 - 2.0 * g * cosTheta, 3.0 / 2.0);
    float numerator2 = 1.0 + alpha * pow2(cosTheta);
    float denominator2 = 1.0 + alpha * (1.0 + 2.0 * g2) / 3.0;
    float term0 = UNIFORM_PHASE;
    float term1 = numerator1 / denominator1;
    float term2 = numerator2 / denominator2;
    return term0 * term1 * term2;
}
float phasefunc_HenyeyGreensteinDraine(float cosTheta, float d) {
    float gHG = exp(-0.0990567 / (d - 1.67154));
    float gD = exp(-2.20679 / (d + 3.91029) - 0.428934);
    float a = exp(3.62489 - 8.29288 / (d + 5.52825));
    float wD = exp(-0.599085 / (d - 0.641583) - 0.665888);
    return mix(phasefunc_HenyeyGreenstein(cosTheta, gHG), phasefunc_Draine(cosTheta, gD, a), wD);
}
const vec3 CLOUDS_ST_SCATTERING = colors2_constants_toWorkSpace(vec3(0.23777277562949245, 0.23987629843161026, 0.2551375513806795));
const vec3 CLOUDS_ST_EXTINCTION = colors2_constants_toWorkSpace(vec3(0.23777304241545993, 0.2398763953030018, 0.25513757827543126));
const vec3 CLOUDS_ST_ASYM = colors2_constants_toWorkSpace(vec3(0.8629828250733059, 0.8727334366957631, 0.9334765415706695));
const vec3 CLOUDS_ST_E = colors2_constants_toWorkSpace(vec3(1091938.4155551041, 3341273.320789842, 5.699703416476822e12));
const float CLOUDS_ST_R_EFF = 7.33;
const vec3 CLOUDS_CU_SCATTERING = colors2_constants_toWorkSpace(vec3(0.18067349140471628, 0.18215551958414714, 0.19358579492341665));
const vec3 CLOUDS_CU_EXTINCTION = colors2_constants_toWorkSpace(vec3(0.18067367051236774, 0.18215559145291857, 0.19358580629452912));
const vec3 CLOUDS_CU_ASYM = colors2_constants_toWorkSpace(vec3(0.8615159687912013, 0.8732937077048064, 0.9375708300315341));
const vec3 CLOUDS_CU_E = colors2_constants_toWorkSpace(vec3(935502.5670106385, 3581719.839469918, 4.094123822571251E13));
const float CLOUDS_CU_R_EFF = 5.77;
const vec3 CLOUDS_CI_SCATTERING = colors2_constants_toWorkSpace(vec3(6.17017026101243, 6.239057230606717, 6.667813761472693));
const vec3 CLOUDS_CI_EXTINCTION = colors2_constants_toWorkSpace(vec3(6.170170260942012, 6.239057230606713, 6.667813761472693));
const vec3 CLOUDS_CI_ASYM = colors2_constants_toWorkSpace(vec3(0.7816707299139416, 0.7895764808723628, 0.8408420552232578));
const vec3 CLOUDS_CI_E = colors2_constants_toWorkSpace(vec3(4714.18358593152, 6665.142983584232, 143262.2082694281));
const float CLOUDS_CI_R_EFF = 91.7;
struct CloudParticpatingMedium {
    vec3 scattering;
    vec3 extinction;
    vec3 phase;
};
vec3 _clouds_samplePhaseLUT(float cosTheta, float type) {
    const float a0 = 0.672617934627;
    const float a1 = -0.0713555761181;
    const float a2 = 0.0299320735609;
    const float b = 0.264767018876;
    float x1 = acos(cosTheta);
    float x2 = x1 * x1;
    float u = saturate((a0 + a1 * x1 + a2 * x2) * pow(x1, b));
    float v = (type + 0.5) / 3.0;
    vec4 rgbm = texture(usam_cloudPhases, vec2(u, v));
    return colors2_constants_toWorkSpace(rgbm.rgb * rgbm.a);
}
vec3 _clouds_cumulusLUTPhase(float cosTheta) {
    return _clouds_samplePhaseLUT(cosTheta, 1.0);
}
vec3 clouds_phase_cu(float cosTheta, float mixRatio) {
    return mix(vec3(phasefunc_HenyeyGreensteinDraine(cosTheta, CLOUDS_CU_R_EFF * 2.0)), _clouds_cumulusLUTPhase(cosTheta), mixRatio);
}
CloudParticpatingMedium clouds_cu_medium(float cosTheta) {
    CloudParticpatingMedium medium;
    medium.scattering = CLOUDS_CU_SCATTERING;
    medium.extinction = CLOUDS_CU_EXTINCTION;
    medium.phase = clouds_phase_cu(cosTheta, SETTING_CLOUDS_CU_PHASE_RATIO);
    return medium;
}
/*
    References:
        [EPI20] Epic Games, Inc. "Unreal Engine Sky Atmosphere Rendering Technique". 2020.
            MIT License. Copyright (c) 2020 Epic Games, Inc.
            https:
        [HIL20] Hillaire, Sébastien. "A Scalable and Production Ready Sky and Atmosphere Rendering Technique".
            EGSR 2020. 2020.
            https:
        [INT17] Intel Corporation. "Outdoor Light Scattering Sample". 2017.
            Apache License 2.0. Copyright (c) 2017 Intel Corporation.
            https:
        [PRE99] Preetham, A. J. et al. "A Practical Analytic Model for Daylight"
            SIGGRAPH 1999. 1999.
            https:

        You can find full license texts in /licenses

    Other Credits:
        Jessie - Helping with Mie coefficients (https:
*/
#if SETTING_EPIPOLAR_SLICES == 256
#define EPIPOLAR_SLICE_D16 16
#define EPIPOLAR_SLICE_D128 2
#elif SETTING_EPIPOLAR_SLICES == 512
#define EPIPOLAR_SLICE_D16 32
#define EPIPOLAR_SLICE_D128 4
#elif SETTING_EPIPOLAR_SLICES == 1024
#define EPIPOLAR_SLICE_D16 64
#define EPIPOLAR_SLICE_D128 8
#elif SETTING_EPIPOLAR_SLICES == 2048
#define EPIPOLAR_SLICE_D16 128
#define EPIPOLAR_SLICE_D128 16
#endif
#if SETTING_SLICE_SAMPLES == 128
#define EPIPOLAR_DATA_Y_SIZE 385
#define SLICE_SAMPLE_D16 8
#elif SETTING_SLICE_SAMPLES == 256
#define EPIPOLAR_DATA_Y_SIZE 769
#define SLICE_SAMPLE_D16 16
#elif SETTING_SLICE_SAMPLES == 512
#define EPIPOLAR_DATA_Y_SIZE 1537
#define SLICE_SAMPLE_D16 32
#elif SETTING_SLICE_SAMPLES == 1024
#define EPIPOLAR_DATA_Y_SIZE 3073
#define SLICE_SAMPLE_D16 64
#endif
#define PLANET_RADIUS_OFFSET 0.01
struct AtmosphereParameters {
    float bottom;
    float top;
    float mieHeight;
    vec3 rayleighSctrCoeff;
    vec3 rayleighExtinction;
    vec3 mieSctrCoeff;
    vec3 mieExtinction;
    float miePhaseG;
    float miePhaseE;
    vec3 ozoneExtinction;
};
vec3 atmosphere_mieCoefficientsPreetham(float turbidity) {
    const vec3 a0 = vec3(-0.00767542206226, -0.00822772032997, -0.0121707541321);
    const vec3 a1 = vec3(0.00771550875198, 0.00827069152678, 0.0122343187466);
    return max(colors2_constants_toWorkSpace(a0 + a1 * turbidity), 0.0);
}
AtmosphereParameters getAtmosphereParameters() {
    const float ATMOSPHERE_BOTTOM = 6378.137;
    const float ATMOSPHERE_TOP = ATMOSPHERE_BOTTOM + 100.0;
    const float MIE_HEIGHT = 1.2;
    const vec3 RAYLEIGH_SCATTERING_BASE = colors2_constants_toWorkSpace(vec3(0.0120766817597, 0.0129498634753, 0.0275704559807));
    vec3 RAYLEIGH_SCATTERING = RAYLEIGH_SCATTERING_BASE * SETTING_ATM_RAY_SCT_MUL;
    vec3 MIE_SCATTERING_BASE = atmosphere_mieCoefficientsPreetham(global_turbidity);
    vec3 MIE_SCATTERING = MIE_SCATTERING_BASE * SETTING_ATM_MIE_SCT_MUL;
    vec3 MIE_ABOSORPTION = MIE_SCATTERING_BASE * SETTING_ATM_MIE_ABS_MUL;
    const float MIE_PHASE_G = 0.7034;
    const float MIE_PHASE_E = 2500.0;
    const vec3 OZONE_ABOSORPTION_BASE = colors2_constants_toWorkSpace(vec3(3.2964135827e-10, 2.9538443418e-10, 3.7326149468e-11) * 100000.0);
    const vec3 OZONE_ABOSORPTION = OZONE_ABOSORPTION_BASE * SETTING_ATM_OZO_ABS_MUL;
    AtmosphereParameters atmosphere;
    atmosphere.bottom = ATMOSPHERE_BOTTOM;
    atmosphere.top = ATMOSPHERE_TOP;
    atmosphere.mieHeight = MIE_HEIGHT;
    atmosphere.rayleighSctrCoeff = RAYLEIGH_SCATTERING;
    atmosphere.rayleighExtinction = RAYLEIGH_SCATTERING;
    atmosphere.miePhaseG = MIE_PHASE_G;
    atmosphere.miePhaseE = MIE_PHASE_E;
    atmosphere.mieSctrCoeff = MIE_SCATTERING;
    atmosphere.mieExtinction = MIE_SCATTERING + MIE_ABOSORPTION;
    atmosphere.ozoneExtinction = OZONE_ABOSORPTION;
    return atmosphere;
}
/*
    References:
        [EPI20] Epic Games, Inc. "Unreal Engine Sky Atmosphere Rendering Technique". 2020.
            MIT License. Copyright (c) 2020 Epic Games, Inc.
            https:
        [HIL20] Hillaire, Sébastien. "A Scalable and Production Ready Sky and Atmosphere Rendering Technique".
            EGSR 2020. 2020.
            https:

        You can find full license texts in /licenses
*/
/*
    References:
        [EPI20] Epic Games, Inc. "Unreal Engine Sky Atmosphere Rendering Technique". 2020.
            MIT License. Copyright (c) 2020 Epic Games, Inc.
            https:
        [HIL20] Hillaire, Sébastien. "A Scalable and Production Ready Sky and Atmosphere Rendering Technique".
            EGSR 2020. 2020.
            https:

        You can find full license texts in /licenses
*/
/*
    References:
        [BRU08] Bruneton, Eric. "Precomputed Atmospheric Scattering". EGSR 2008. 2008.
            https:
        [EPI20] Epic Games, Inc. "Unreal Engine Sky Atmosphere Rendering Technique". 2020.
            MIT License. Copyright (c) 2020 Epic Games, Inc.
            https:
        [HIL20] Hillaire, Sébastien. "A Scalable and Production Ready Sky and Atmosphere Rendering Technique".
            EGSR 2020. 2020.
            https:
        [INT17] Intel Corporation. "Outdoor Light Scattering Sample". 2017.
            Apache License 2.0. Copyright (c) 2017 Intel Corporation.
            https:
        [YUS13] Yusov, Egor. “Practical Implementation of Light Scattering Effects Using Epipolar Sampling and
            1D Min/Max Binary Trees”. GDC 2013. 2013.
            http:

        You can find full license texts in /licenses
*/
struct ScatteringResult {
    vec3 transmittance;
    vec3 inScattering;
};
/*
    References:
        [GIL23] Gilcher, Pascal. "A Better R2 Sequence". 2023.
            https:
        [JIM17] Jimenez, Jorge. "Interleaved Gradient Noise". 2017.
            https:
        [ROB18] Roberts, Martine. "The Unreasonable Effectiveness of Quasirandom Sequences". 2018.
            https:
        [WOL22] Wolfe, Alan. "Interleaved Gradient Noise: A Different Kind of Low Discrepancy Sequence". 2022.
            MIT License. Copyright (c) 2019 Alan Wolfe.
            https:

        You can find full license texts in /licenses
*/
float rand_stbnVec1(ivec2 texelPos, uint frame) {
    return texelFetch(usam_stbnVec1, ivec3(texelPos, frame) & ivec3(127, 127, 63), 0).x;
}
vec2 rand_stbnVec2(ivec2 texelPos, uint frame) {
    return texelFetch(usam_stbnVec2, ivec3(texelPos, frame) & ivec3(127, 127, 63), 0).xy;
}
vec2 rand_r2Seq2(uint idx) {
    const float g = 1.32471795724474602596;
    const vec2 a = 1.0 - vec2(1.0 / g, 1.0 / (g * g));
    return 1.0 - fract(a * idx - 0.5);
}
ivec2 rand_newStbnPos(ivec2 basePos, uint i) {
    return basePos + ivec2(rand_r2Seq2(i) * 128);
}
vec3 rand_sampleInCone(vec3 center, float coneHalfAngle, vec2 rand) {
    float phi = PI_2 * rand.x;
    float cosTheta = cos(coneHalfAngle);
    float cosAlpha = mix(1.0, cosTheta, rand.y);
    float sinAlpha = sqrt(1.0 - cosAlpha * cosAlpha);
    vec3 other = abs(center.x) < 0.9 ? vec3(1, 0, 0) : vec3(0, 1, 0);
    vec3 u = normalize(cross(center, other));
    vec3 v = cross(center, u);
    return normalize(cosAlpha * center + sinAlpha * (cos(phi) * u + sin(phi) * v));
}
float atmosphere_heightNoClamping(AtmosphereParameters atmosphere, vec3 worldPos) {
    float worldHeight = worldPos.y - 62.0;
    return worldHeight * (1.0 / float(SETTING_ATM_ALT_SCALE)) + atmosphere.bottom;
}
vec3 atmosphere_viewToAtmNoClamping(AtmosphereParameters atmosphere, vec3 viewPos) {
    vec3 feetPlayer = (gbufferModelViewInverse * vec4(viewPos, 1.0)).xyz;
    vec3 world = feetPlayer + cameraPosition;
    float height = atmosphere_heightNoClamping(atmosphere, world);
    return vec3(world.x, 0.0, world.z) * (1.0 / float(SETTING_ATM_D_SCALE)) + vec3(0.0, height, 0.0);
}
#define INVALID_EPIPOLAR_LINE vec4(-1000.0, -1000.0, -100.0, -100.0)
const vec3 GROUND_ALBEDO_BASE = vec3(ivec3(SETTING_ATM_GROUND_ALBEDO_R, SETTING_ATM_GROUND_ALBEDO_G, SETTING_ATM_GROUND_ALBEDO_B)) / 255.0;
#define LUT_QUANTIZATION_MUL 512.0
#define TRANSMITTANCE_TEXTURE_WIDTH 256
#define TRANSMITTANCE_TEXTURE_HEIGHT 64
const vec2 TRANSMITTANCE_TEXTURE_SIZE = vec2(TRANSMITTANCE_TEXTURE_WIDTH, TRANSMITTANCE_TEXTURE_HEIGHT);
const vec2 TRANSMITTANCE_TEXEL_SIZE = 1.0 / TRANSMITTANCE_TEXTURE_SIZE;
#define MULTI_SCTR_LUT_SIZE 32
#define SKYVIEW_LUT_WIDTH SETTING_SKYVIEW_RES
#define SKYVIEW_LUT_HEIGHT SETTING_SKYVIEW_RES
#define SKYVIEW_LUT_LAYERS 4
#define SKYVIEW_LUT_DEPTH 8
#define SKYVIEW_LUT_SIZE ivec2(SKYVIEW_LUT_WIDTH, SKYVIEW_LUT_HEIGHT)
#define SKYVIEW_LUT_SIZE_F vec2(SKYVIEW_LUT_WIDTH, SKYVIEW_LUT_HEIGHT)
#if SETTING_SKYVIEW_RES == 128
#define SKYVIEW_RES_D16 8
#elif SETTING_SKYVIEW_RES == 256
#define SKYVIEW_RES_D16 16
#elif SETTING_SKYVIEW_RES == 512
#define SKYVIEW_RES_D16 32
#elif SETTING_SKYVIEW_RES == 1024
#define SKYVIEW_RES_D16 64
#endif
void _atmospherics_air_lut_lutTransmittanceParamsToUv(AtmosphereParameters atmosphere, float height, float cosZenith, out vec2 uv) {
    height = clamp(height, atmosphere.bottom + 0.0001, atmosphere.top - 0.0001);
    cosZenith = clamp(cosZenith, -1.0, 1.0);
    float H = sqrt(max(0.0, pow2(atmosphere.top) - pow2(atmosphere.bottom)));
    float rho = sqrt(max(0.0, pow2(height) - pow2(atmosphere.bottom)));
    float discriminant = pow2(height) * (cosZenith * cosZenith - 1.0) + pow2(atmosphere.top);
    float d = max(0.0, (-height * cosZenith + sqrt(discriminant)));
    float d_min = atmosphere.top - height;
    float d_max = rho + H;
    float x_mu = (d - d_min) / (d_max - d_min);
    float x_r = rho / H;
    uv = vec2(x_mu, x_r);
}
vec3 atmospherics_air_lut_sampleTransmittance(AtmosphereParameters atmosphere, float cosLightZenith, float sampleAltitude) {
    vec2 tLUTUV;
    _atmospherics_air_lut_lutTransmittanceParamsToUv(atmosphere, sampleAltitude, cosLightZenith, tLUTUV);
    uint cond = uint(any(lessThan(tLUTUV, vec2(0.0))));
    cond |= uint(any(greaterThan(tLUTUV, vec2(1.0))));
    if (bool(cond)) {
        return vec3(0.0);
    }
    return persistent_transmittanceLUT_sample(tLUTUV).rgb;
}
#define _LUMINOUS_EFFICACY 683.002 
#define _blackBody_func1_v0 vec3(-37290175.3986, -40810912.9676, -47350510.215)
#define _blackBody_func1_v1 vec3(7055.3581938, 6758.95549072, 4118.25228444)
#define _blackBody_func1_v2 vec3(0.00484537801959, 0.00491276883428, 0.00506185958018)
#define _blackBody_func1_v3 vec3(-6.810769857e-7, -6.950213321e-7, -6.9539565265e-7)
#define _blackBody_func1_v4 vec3(5.6731538598e-11, 5.8002399769e-11, 5.6337103621e-11)
#define _blackBody_func1_v5 vec3(-2.5703246799e-15, -2.6264426188e-15, -2.4816463488e-15)
#define _blackBody_func1_v6 vec3(4.8909354617e-20, 4.9886030965e-20, 4.5966064285e-20)
#define _blackBody_func1(x) exp2( _blackBody_func1_v0 * rcp(pow2(x)) + _blackBody_func1_v1 * rcp(x) + _blackBody_func1_v2 * x + _blackBody_func1_v3 * pow2(x) + _blackBody_func1_v4 * pow3(x) + _blackBody_func1_v5 * pow4(x) + _blackBody_func1_v6 * pow5(x) )
#define _blackBody_func2_v0 vec3(-8005.4231085, -12668.5089522, 90350.9871613)
#define _blackBody_func2_v1 vec3(-13.8986440037, -13.5414550402, -53.296767586)
#define _blackBody_func2_v2 vec3(0.00322233921192, 0.00326336194057, 0.00762350264707)
#define _blackBody_func2_v3 vec3(-8.7157145477e-8, -8.8899800557e-8, -2.0127905863e-7)
#define _blackBody_func2_v4 vec3(1.2119660239e-12, 1.242334591e-12, 2.7501969304e-12)
#define _blackBody_func2_v5 vec3(-6.7641067868e-18, -6.9583618131e-18, -1.5149377815e-17)
#define _blackBody_func2(x) _blackBody_func2_v0 + _blackBody_func2_v1 * x + _blackBody_func2_v2 * pow2(x) + _blackBody_func2_v3 * pow3(x) + _blackBody_func2_v4 * pow4(x) + _blackBody_func2_v5 * pow5(x)
#define blackBody_evalRadiance_AP0(temperture) (_LUMINOUS_EFFICACY * mix( _blackBody_func1(temperture), _blackBody_func2(temperture), smoothstep(9000.0, 10000.0, float(temperture)) ))
/*
    References:
        [WRE18] Wrensch, Benjamin. "Reverse Z Cheatsheet". IOLITE Development Blog. 2023.
*/
float coords_viewZToReversedZ(float viewZ, float near) {
    return near / -viewZ;
}
vec3 coords_toViewCoord(vec2 texCoord, float viewZ, mat4 projInv) {
    vec2 ndcXY = texCoord * 2.0 - 1.0;
    vec2 clipXY = ndcXY * -viewZ;
    vec2 viewXY = clipXY * vec2(projInv[0][0], projInv[1][1]);
    return vec3(viewXY, viewZ);
}
vec2 coords_equirectanglarForward(vec3 direction) {
    float phi = atan(direction.z, direction.x);
    float theta = asin(direction.y);
    vec2 uv = vec2((phi + PI) / (2.0 * PI), (theta + PI / 2.0) / PI);
    return uv;
}
const mat3 _COORDS_EQUATORIAL_TO_GALACTIC = mat3(
    -0.0548755604, 0.4941094279, -0.8676661490,
    -0.8734370902, -0.4448296300, -0.1980763734,
    -0.4838350155, 0.7469822445, 0.4559837762
);
const mat3 _COORDS_WORLD_TO_EQUATORIAL = mat3(
    0.0, 1.0, 0.0,
    1.0, 0.0, 0.0,
    0.0, 0.0, -1.0
);
#ifdef SETTING_REAL_SUN_TEMPERATURE
#define SUN_TEMPERATURE 5772.0
#else
#define SUN_TEMPERATURE SETTING_SUN_TEMPERATURE
#endif
#define SUN_RADIUS (695700.0 * SETTING_SUN_RADIUS)
#define SUN_DISTANCE (149597870.7 * SETTING_SUN_DISTANCE)
#define SUN_ANGULAR_RADIUS atan(SUN_RADIUS / SUN_DISTANCE)
#define SUN_SOLID_ANGLE (2.0 * PI * (1.0 - sqrt(pow2(SUN_DISTANCE) - pow2(SUN_RADIUS)) / SUN_DISTANCE))
#define SUN_LUMINANCE colors2_constants_toWorkSpace(blackBody_evalRadiance_AP0(SUN_TEMPERATURE))
#define SUN_ILLUMINANCE (SUN_LUMINANCE * SUN_SOLID_ANGLE)
#define MOON_RADIUS (1737.4 * SETTING_MOON_RADIUS)
#define MOON_DISTANCE (384399 * SETTING_MOON_DISTANCE)
#define MOON_ANGULAR_RADIUS atan(MOON_RADIUS / MOON_DISTANCE)
#define MOON_SOLID_ANGLE (2.0 * PI * (1.0 - sqrt(pow2(MOON_DISTANCE) - pow2(MOON_RADIUS)) / MOON_DISTANCE))
#define MOON_ALBEDO (SETTING_MOON_ALBEDO * vec3(SETTING_MOON_COLOR_R, SETTING_MOON_COLOR_G, SETTING_MOON_COLOR_B))
#define MOON_LUMINANCE (SUN_ILLUMINANCE * MOON_ALBEDO * RCP_PI)
#define MOON_ILLUMINANCE (MOON_LUMINANCE * MOON_SOLID_ANGLE)
const float _CELESTIAL_STARMAP_MILKYWAY_LUMINANCE = 0.1927554;
const float _CELESTIAL_REAL_MILKYWAY_LUMINANCE_MCD = 1.5;
const float _CELESTIAL_REAL_MILKYWAY_LUMINANCE_KCD = _CELESTIAL_REAL_MILKYWAY_LUMINANCE_MCD / 1000000.0;
const float _CELESTIAL_STARMAP_EXP = _CELESTIAL_REAL_MILKYWAY_LUMINANCE_KCD / _CELESTIAL_STARMAP_MILKYWAY_LUMINANCE;
const vec2 _CELESTIAL_STARMAP_SIZE = vec2(8192.0, 4096.0);
struct SkyViewLutParams {
    float latitude;
    float longitude;
    float viewHeight;
};
struct CloudMainRayParams {
    vec3 rayStart;
    vec3 rayDir;
    vec3 rayEnd;
    float rayStartHeight;
    float rayEndHeight;
};
struct CloudRenderParams {
    vec3 lightDir;
    vec3 lightIrradiance;
    float cosLightTheta;
};
CloudRenderParams cloudRenderParams_init(CloudMainRayParams rayParam, vec3 lightDir, vec3 lightIrradiance) {
    CloudRenderParams params;
    params.lightDir = normalize(lightDir);
    params.lightIrradiance = lightIrradiance;
    params.cosLightTheta = dot(rayParam.rayDir, lightDir);
    return params;
}
struct CloudRaymarchLayerParam {
    CloudParticpatingMedium medium;
    vec3 ambientIrradiance;
    vec2 layerRange;
    vec3 rayStart;
    vec3 rayEnd;
    vec4 rayStep;
};
CloudRaymarchLayerParam clouds_raymarchLayerParam_init(
    CloudMainRayParams mainRayParam,
    CloudParticpatingMedium medium,
    vec3 ambientIrradiance,
    vec2 layerRange,
    float origin2RayOffset,
    float rayLength,
    uint stepCount
) {
    CloudRaymarchLayerParam param;
    param.medium = medium;
    param.ambientIrradiance = ambientIrradiance;
    param.layerRange = layerRange;
    param.rayStart = mainRayParam.rayStart + mainRayParam.rayDir * origin2RayOffset;
    param.rayEnd = param.rayStart + mainRayParam.rayDir * rayLength;
    param.rayStep = vec4(param.rayEnd - param.rayStart, rayLength) * rcp(float(stepCount + 1u));
    return param;
}
struct CloudRaymarchAccumState {
    vec3 totalInSctr;
    vec3 totalTransmittance;
};
CloudRaymarchAccumState clouds_raymarchAccumState_init() {
    CloudRaymarchAccumState state;
    state.totalInSctr = vec3(0.0);
    state.totalTransmittance = vec3(1.0);
    return state;
}
struct CloudRaymarchStepState {
    vec4 origin;
    vec4 position;
    float height;
    vec4 rayStep;
    vec3 upVector;
};
CloudRaymarchStepState clouds_raymarchStepState_init(CloudRaymarchLayerParam layerParam) {
    CloudRaymarchStepState state;
    state.origin = vec4(layerParam.rayStart, 0.0);
    state.position = state.origin;
    state.height = length(state.position.xyz);
    state.upVector = state.position.xyz / state.height;
    state.rayStep = layerParam.rayStep;
    return state;
}
void clouds_raymarchStepState_update(inout CloudRaymarchStepState state, float stepCount) {
    state.position = state.origin + state.rayStep * stepCount;
    state.height = length(state.position.xyz);
    state.upVector = state.position.xyz / state.height;
}
void clouds_computeLighting(
    AtmosphereParameters atmosphere,
    CloudRenderParams renderParams,
    CloudRaymarchLayerParam layerParam,
    CloudRaymarchStepState stepState,
    float sampleDensity,
    float sampleDensityLod,
    vec3 lightOpticalDepth,
    inout CloudRaymarchAccumState accumState
) {
    float cosLightZenith = dot(stepState.upVector, renderParams.lightDir);
    vec3 tLightToSample = atmospherics_air_lut_sampleTransmittance(atmosphere, cosLightZenith, stepState.height);
    vec3 sampleScattering = layerParam.medium.scattering * sampleDensity;
    vec3 sampleExtinction = layerParam.medium.extinction * sampleDensity;
    vec3 sampleOpticalDepth = sampleExtinction * stepState.rayStep.w;
    vec3 sampleTransmittance = exp(-sampleOpticalDepth);
    vec3 sampleLightIrradiance = renderParams.lightIrradiance;
    vec3 sampleLightTransmittance = exp(-lightOpticalDepth);
    sampleLightIrradiance *= tLightToSample * sampleLightTransmittance;
    float D = exp2(SETTING_CLOUDS_MS_RADIUS);
    float ambLightDesnity = mix(sampleDensityLod, sampleDensity, 0.4);
    vec3 ambLightOpticalDepth = layerParam.medium.extinction * ambLightDesnity;
    float horizonFactor = saturate(pow3(renderParams.cosLightTheta));
    ambLightOpticalDepth = mix(ambLightOpticalDepth, lightOpticalDepth, horizonFactor);
    vec3 ambientTransmittance = max(exp(-ambLightOpticalDepth), exp(-ambLightOpticalDepth * 0.25) * 0.7);
    vec3 sampleAmbientIrradiance = layerParam.ambientIrradiance;
    sampleAmbientIrradiance *= ambientTransmittance;
    vec3 sampleIrradiance = sampleLightIrradiance;
    sampleIrradiance *= layerParam.medium.phase;
    sampleIrradiance += sampleAmbientIrradiance;
    vec3 fMS = (sampleScattering / sampleExtinction) * (1.0 - exp(-D * sampleExtinction));
    fMS = mix(fMS, fMS * 0.99, linearStep(0.9, 1.0, fMS));
    vec3 sampleMSIrradiance = sampleLightIrradiance;
    sampleMSIrradiance *= UNIFORM_PHASE;
    sampleMSIrradiance += sampleAmbientIrradiance;
    sampleMSIrradiance *= fMS / (1.0 - fMS);
    sampleIrradiance += sampleMSIrradiance;
    vec3 sampleInSctr = sampleIrradiance * sampleScattering;
    vec3 sampleInSctrInt = (sampleInSctr - sampleInSctr * sampleTransmittance) / sampleExtinction;
    accumState.totalInSctr += sampleInSctrInt * accumState.totalTransmittance;
    accumState.totalTransmittance *= sampleTransmittance;
}
/*
    References:
        [QUI13a] Quilez, Inigo. "Voronoi - smooth ". 2014.
            MIT License. Copyright (c) 2014 Inigo Quilez.
            https:

        You can find full license texts in /licenses
*/
struct AxisAngle {
    vec3 axis;
    vec3 csc;
};
#define MAT2_GOLDEN_ANGLE mat2(-0.737368878, 0.675490294, -0.675490294, -0.737368878)
/*
    References:
        [QUI08] Quilez, Inigo. "Value Noise Derivatives". 2008.
            https:
        [QUI13a] Quilez, Inigo. "Noise - value - 2D". 2013.
            MIT License. Copyright (c) 2013 Inigo Quilez.
            https:
        [QUI13b] Quilez, Inigo. "Noise - value - 3D". 2013.
            MIT License. Copyright (c) 2013 Inigo Quilez.
            https:
        [QUI17a] Quilez, Inigo. "Noise - Value - 2D - Deriv". 2017.
            MIT License. Copyright (c) 2017 Inigo Quilez.
            https:
        [QUI17b] Quilez, Inigo. "Noise - Value - 3D - Deriv". 2017.
            MIT License. Copyright (c) 2017 Inigo Quilez.
            https:

        You can find full license texts in /licenses
*/
/*
    References:
        [QUI17] Quilez, Inigo. "Integer Hash Functions". 2017.
            MIT License. Copyright (c) 2017,2024 Inigo Quilez.
            https:
            https:
            https:
        [JAR20] Jarzynski, Mark. Olano, Marc. "Hash Functions for GPU Rendering". 2020.
            https:

        You can find full license texts in /licenses
*/
const uvec4 _HASH_LINEAR_COMB_MAGIC_MUL = uvec4(19u, 47u, 101u, 131u);
const uint _HASH_LINEAR_COMB_MAGIC_ADD = 173u;
uvec4 hash_pcg4d_44(uvec4 v) {
    v = v * 1664525u + 1013904223u;
    v.x += v.y * v.w;
    v.y += v.z * v.x;
    v.z += v.x * v.y;
    v.w += v.y * v.z;
    v = v ^ (v >> 16u);
    v.x += v.y * v.w;
    v.y += v.z * v.x;
    v.z += v.x * v.y;
    v.w += v.y * v.z;
    return v;
}
const uint _HASH_XXHASH32_PRIME32_2 = 0x85EBCA77u;
const uint _HASH_XXHASH32_PRIME32_3 = 0xC2B2AE3Du;
const uint _HASH_XXHASH32_PRIME32_4 = 0x27D4EB2Fu;
const uint _HASH_XXHASH32_PRIME32_5 = 0x165667B1u;
uvec3 hash_33_q3(uvec3 v) {
    return hash_pcg4d_44(uvec4(v, _HASH_XXHASH32_PRIME32_2)).xyz;
}
float hash_uintToFloat(uint v) {
    return uintBitsToFloat(0x3f800000u | (v >> 9u)) - 1.0;
}
vec2 hash_uintToFloat(uvec2 v) {
    return uintBitsToFloat(0x3f800000u | (v >> 9u)) - 1.0;
}
vec3 hash_uintToFloat(uvec3 v) {
    return uintBitsToFloat(0x3f800000u | (v >> 9u)) - 1.0;
}
vec4 hash_uintToFloat(uvec4 v) {
    return uintBitsToFloat(0x3f800000u | (v >> 9u)) - 1.0;
}
#define _NOISE_INTERPOLANT 1
struct FBMParameters {
    float frequency;
    float persistence;
    float lacunarity;
    uint octaveCount;
};
#if _NOISE_INTERPOLANT == 1
#define _NOISE_INTERPO(w) (w * w * w * (w * (w * 6.0 - 15.0) + 10.0))
#define _NOISE_INTERPO_GRAD(w) (30.0 * w * w * (w * (w - 2.0) + 1.0))
#else
#define _NOISE_INTERPO(w) (w * w * (3.0 - 2.0 * w))
#define _NOISE_INTERPO_GRAD(w) (6.0 * w * (1.0 - w))
#endif
/*
    References:
        [QUI13a] Quilez, Inigo. "Noise - gradient - 2D". 2013.
            MIT License. Copyright (c) 2013 Inigo Quilez.
            https:
        [QUI13b] Quilez, Inigo. "Noise - gradien  - 3D". 2013.
            MIT License. Copyright (c) 2013 Inigo Quilez.
            https:
        [QUI17a] Quilez, Inigo. "Noise - Gradient - 2D - Deriv". 2017.
            MIT License. Copyright (c) 2017 Inigo Quilez.
            https:
        [QUI17b] Quilez, Inigo. "Noise - Gradient - 3D - Deriv". 2017.
            MIT License. Copyright (c) 2017 Inigo Quilez.
            https:
        [QUI17c] Quilez, Inigo. "Gradient Noise Derivatives". 2017.
            https:

        You can find full license texts in /licenses
*/
/*
    References:
        [QUI15] Quilez, Inigo. "Texture Repetition". 2015.
            https:
        [QUI17] Quilez, Inigo. "Texture Repetition V". 2017.
            MIT License. Copyright (c) 2017 Inigo Quilez
            https:
        [DJO12] Djonov, Phill. "Bicubic Filtering in Fewer Taps". 2012.
            https:
        [MJP19] MJP. "An HLSL function for sampling a 2D texture with Catmull-Rom filtering, using 9 texture samples instead of 16". 2019.
            https:

        You can find full license texts in /licenses
*/
#if DERIVATIVE_AVAILABLE
#endif
vec4 sampling_catmullBicubic5Tap(sampler2D texSampler, vec2 texelPos, float sharpness, vec2 texRcpSize){
    vec2 t = fract(texelPos - 0.5);
    vec2 centerUV = (floor(texelPos - 0.5) + vec2(0.5f, 0.5f)) * texRcpSize;
    vec2 f = t;
    vec2 f2 = t * t;
    vec2 f3 = t * t * t;
    float s = sharpness;
    vec2 w0 = -s * f3 + 2.0 * s * f2 - s * f;
    vec2 w1 = (2.0 - s) * f3 + (s - 3.0) * f2 + 1.0;
    vec2 w2 = (s - 2.0) * f3 + (3.0 - 2.0 * s) * f2 + s * f;
    vec2 w3 = s * f3 - s * f2;
    vec2 w12 = w1 + w2;
    vec2 tc12 = centerUV + (w2 / w12) * texRcpSize;
    vec2 tc0 = centerUV - 1.0f * texRcpSize;
    vec2 tc3 = centerUV + 2.0f * texRcpSize;
    vec4 c1 = vec4(texture(texSampler, vec2(tc12.x, tc0.y)));
    vec4 c2 = vec4(texture(texSampler, vec2(tc0.x, tc12.y)));
    vec4 c3 = vec4(texture(texSampler, vec2(tc12.x, tc12.y)));
    vec4 c4 = vec4(texture(texSampler, vec2(tc3.x, tc12.y)));
    vec4 c5 = vec4(texture(texSampler, vec2(tc12.x, tc3.y)));
    float weight1 = w12.x * w0.y;
    float weight2 = w0.x * w12.y;
    float weight3 = w12.x * w12.y;
    float weight4 = w3.x * w12.y;
    float weight5 = w12.x * w3.y;
    vec4 color = weight1 * c1;
    color += weight2 * c2;
    color += weight3 * c3;
    color += weight4 * c4;
    color += weight5 * c5;
    return color * rcp(weight1 + weight2 + weight3 + weight4 + weight5);
}
struct CatmullRomBicubic5TapData {
    vec3 uv1AndWeight;
    vec3 uv2AndWeight;
    vec3 uv3AndWeight;
    vec3 uv4AndWeight;
    vec3 uv5AndWeight;
};
vec4 sampling_catmullBicubic5Tap(sampler2D texSampler, vec2 uv, float sharpness){
    vec2 texSize = vec2(textureSize(texSampler, 0));
    vec2 texelPos = uv * texSize;
    vec2 texRcpSize = rcp(texSize);
    return sampling_catmullBicubic5Tap(texSampler, texelPos, sharpness, texRcpSize);
}
vec4 sampling_bSplineBicubic4Tap(sampler2D texSampler, vec2 texelPos, vec2 texRcpSize) {
    vec2 f = fract(texelPos - 0.5);
    vec2 f2 = f * f;
    vec2 f3 = f2 * f;
    vec2 w0 = f2 - 0.5 * (f3 + f);
    vec2 w1 = 1.5 * f3 - 2.5 * f2 + 1.0;
    vec2 w3 = 0.5 * (f3 - f2);
    vec2 w2 = 1.0 - w0 - w1 - w3;
    vec2 s0 = w0 + w1;
    vec2 s1 = w2 + w3;
    vec2 centerUV = (floor(texelPos - 0.5) + 0.5) * texRcpSize;
    vec2 t0 = centerUV + (w1 / s0 - 1.0) * texRcpSize;
    vec2 t1 = centerUV + (w3 / s1 + 1.0) * texRcpSize;
    return (texture(texSampler, vec2(t0.x, t0.y)) * s0.x
    + texture(texSampler, vec2(t1.x, t0.y)) * s1.x) * s0.y
    + (texture(texSampler, vec2(t0.x, t1.y)) * s0.x
    + texture(texSampler, vec2(t1.x, t1.y)) * s1.x) * s1.y;
}
vec4 sampling_bSplineBicubic4Tap(sampler2D texSampler, vec2 uv) {
    vec2 texSize = vec2(textureSize(texSampler, 0));
    vec2 texelPos = uv * texSize;
    vec2 texRcpSize = rcp(texSize);
    return sampling_bSplineBicubic4Tap(texSampler, texelPos, texRcpSize);
}
struct BSplineBicubic4TapData {
    vec2 uv00;
    vec2 uv10;
    vec2 uv01;
    vec2 uv11;
    vec2 weight0;
    vec2 weight1;
};
vec4 sampling_catmullRomBicubic9Tap(sampler2D texSampler, vec2 texelPos, vec2 texRcpSize) {
    vec2 samplePos = texelPos;
    vec2 texPos1 = floor(samplePos - 0.5) + 0.5;
    vec2 f = samplePos - texPos1;
    vec2 w0 = f * (-0.5 + f * (1.0 - 0.5 * f));
    vec2 w1 = 1.0 + f * f * (-2.5 + 1.5 * f);
    vec2 w2 = f * (0.5 + f * (2.0 - 1.5 * f));
    vec2 w3 = f * f * (-0.5 + 0.5 * f);
    vec2 w12 = w1 + w2;
    vec2 offset12 = w2 / w12;
    vec2 texPos0 = (texPos1 - 1.0) * texRcpSize;
    vec2 texPos3 = (texPos1 + 2.0) * texRcpSize;
    vec2 texPos12 = (texPos1 + offset12) * texRcpSize;
    vec4 result = vec4(0.0);
    result += texture(texSampler, vec2(texPos0.x, texPos0.y)) * w0.x * w0.y;
    result += texture(texSampler, vec2(texPos12.x, texPos0.y)) * w12.x * w0.y;
    result += texture(texSampler, vec2(texPos3.x, texPos0.y)) * w3.x * w0.y;
    result += texture(texSampler, vec2(texPos0.x, texPos12.y)) * w0.x * w12.y;
    result += texture(texSampler, vec2(texPos12.x, texPos12.y)) * w12.x * w12.y;
    result += texture(texSampler, vec2(texPos3.x, texPos12.y)) * w3.x * w12.y;
    result += texture(texSampler, vec2(texPos0.x, texPos3.y)) * w0.x * w3.y;
    result += texture(texSampler, vec2(texPos12.x, texPos3.y)) * w12.x * w3.y;
    result += texture(texSampler, vec2(texPos3.x, texPos3.y)) * w3.x * w3.y;
    return result;
}
vec4 sampling_catmullRomBicubic9Tap(sampler2D texSampler, vec2 uv) {
    vec2 texSize = vec2(textureSize(texSampler, 0));
    vec2 texelPos = uv * texSize;
    vec2 texRcpSize = rcp(texSize);
    return sampling_catmullRomBicubic9Tap(texSampler, texelPos, texRcpSize);
}
struct CatmullRomBicubic9TapData {
    vec2 uv00;
    vec2 uv12_0;
    vec2 uv30;
    vec2 uv01_2;
    vec2 uv12_12;
    vec2 uv31_2;
    vec2 uv03;
    vec2 uv12_3;
    vec2 uv33;
    vec2 weight0;
    vec2 weight12;
    vec2 weight3;
};
const float _LOW_BASE_FREQ = exp2(SETTING_CLOUDS_LOW_BASE_FREQ);
const float _LOW_CURL_FREQ = exp2(SETTING_CLOUDS_LOW_CURL_FREQ);
const float _LOW_BILLOWY_FREQ = exp2(SETTING_CLOUDS_LOW_BILLOWY_FREQ - 1.0);
const float _LOW_BILLOWY_CURL_STR = exp2(SETTING_CLOUDS_LOW_BILLOWY_CURL_STR - 1.0);
const float _HIGH_BILLOWY_FREQ = exp2(SETTING_CLOUDS_HIGH_BILLOWY_FREQ);
const float _HIGH_BILLOWY_CURL_STR = exp2(SETTING_CLOUDS_HIGH_BILLOWY_CURL_STR);
const float _LOW_WISPS_FREQ = exp2(SETTING_CLOUDS_LOW_WISPS_FREQ);
const float _LOW_WISPS_CURL_STR = exp2(SETTING_CLOUDS_LOW_WISPS_CURL_STR);
/*
b_{i}
-1.755622
3.6801126
-163.09651
320.59657
-163.29147
0.01273534
*/
float _clouds_cu_heightCurveWisp(vec4 xs) {
    const float a0 = -1.755622;;
    const vec4 as = vec4(3.6801126, -163.09651, 320.59657, -163.29147);
    const float a5 = 0.01273534;
    return exp2(dot(as, xs) + a0) + a5;
}
/*
c_{i}
-2.8940248
20.938597
-83.765418
114.27168
-53.99707
*/
float _clouds_cu_heightCurveBillowy(vec4 xs) {
    const float a0 = -2.8940248;
    const vec4 as = vec4(20.938597, -83.765418, 114.27168, -53.99707);
    return exp2(dot(as, xs) + a0);
}
float worleyNoise(vec2 x, uint seed) {
    uvec2 centerCellID = uvec2(ivec2(floor(x)));
    vec2 centerOffset = fract(x);
    float f1 = 0.0;
    float f2 = 0.0;
    float m = 1.0;
    for (int ix = -1; ix <= 1; ++ix) {
        for (int iy = -1; iy <= 1; ++iy) {
            ivec2 idOffset = ivec2(ix, iy);
            uvec2 cellID = centerCellID + (idOffset + 2);
            uvec3 hashPos = uvec3(cellID, seed);
            vec3 hashValF = hash_uintToFloat(hash_33_q3(hashPos));
            vec2 cellCenter = hashValF.xy + vec2(idOffset);
            float cellDistance = distance(centerOffset, cellCenter);
            float v = pow2(hashValF.z) * saturate(1.0 - cellDistance);
            const float w = 0.35;
            const float wRcp = 1.4285714286;
            float h = hashValF.z * saturate((m - cellDistance) * wRcp + 0.5);
            float wh = w * h;
            m = mix(m, cellDistance, h) - fma(wh, -h, wh) / (1.0 + 3.0 * w);
            if (f1 < v) {
                f2 = f1;
                f1 = v;
            } else if (f2 < v) {
                f2 = v;
            }
        }
    }
    return saturate(1.0 - m - f2);
}
float coverageNoise(vec2 pos) {
    pos *= _LOW_BASE_FREQ;
    float higherOctave = texture(usam_cumulusBase, pos / 32.0).x;
    const float freq = 0.35;
    float baseNoise = worleyNoise(pos * freq, 0x1919810u);
    return baseNoise + higherOctave * 0.75;
}
float detailNoiseB(vec3 pos, vec3 curl) {
    vec3 lowFreqPos = pos + curl * _LOW_BILLOWY_CURL_STR;
    lowFreqPos *= _LOW_BILLOWY_FREQ;
    float lowFreq = texture(usam_cumulusDetail1, lowFreqPos).x;
    vec3 highFreqPos = pos + curl * _HIGH_BILLOWY_CURL_STR;
    highFreqPos *= _HIGH_BILLOWY_FREQ;
    float highFreq = texture(usam_cumulusDetail2, highFreqPos).x;
    return pow3(1.0 - lowFreq) * 0.6 + pow2(0.5 - highFreq) * 0.5;
}
float detailNoiseW(vec3 pos) {
    pos *= 0.5;
    pos *= _LOW_WISPS_FREQ;
    return texture(usam_cumulusDetail2, pos).x;
}
vec3 detailCurlNoise(vec3 pos) {
    pos *= 0.5;
    pos *= _LOW_CURL_FREQ;
    return texture(usam_cumulusCurl, pos).xyz;
}
bool clouds_cu_density(vec3 rayPos, float heightFraction, bool detail, out float densityOut, out float densityLodOut) {
    vec2 baseCoveragePos = rayPos.xz;
    float baseCoverage = coverageNoise(baseCoveragePos);
    const float COVERAGE = SETTING_CLOUDS_CU_COVERAGE;
    float COVERAGE_P = pow2(COVERAGE);
    float COVERAGE_SQRT = sqrt(COVERAGE);
    baseCoverage = max(baseCoverage - (1.0 - COVERAGE_P) * 0.8, 0.0);
    densityOut = baseCoverage * (1.0 - pow2(1.0 - COVERAGE));
    float x1 = heightFraction;
    float x2 = x1 * x1;
    float x3 = x1 * x2;
    float x4 = x1 * x3;
    vec4 xs = vec4(x1, x2, x3, x4);
    const float CONE_FACTOR = mix(5.0, 0.1, SETTING_CLOUDS_LOW_CONE_FACTOR);
    const float CONE_TOP_FACTOR = mix(4.0, 10.0, SETTING_CLOUDS_LOW_CONE_FACTOR);
    const float TOP_CURVE_FACTOR = float(SETTING_CLOUDS_LOW_TOP_CURVE_FACTOR);
    const float BOTTOM_CURVE_FACTOR = float(SETTING_CLOUDS_LOW_BOTTOM_CURVE_FACTOR);
    densityOut *= 1.5 - pow(heightFraction, CONE_FACTOR);
    densityOut *= exp2(-(heightFraction) * CONE_TOP_FACTOR);
    densityOut *= saturate(1.0 - exp2(TOP_CURVE_FACTOR * (heightFraction - 1.0)));
    densityOut *= saturate(1.0 - exp2(-BOTTOM_CURVE_FACTOR * heightFraction));
    densityLodOut = densityOut;
    const float CU_BASE_DENSITY_THRESHOLD = 0.02;
    if (densityOut > CU_BASE_DENSITY_THRESHOLD) {
        #if !defined(SETTING_SCREENSHOT_MODE) && defined(SETTING_CLOUDS_CU_WIND)
        rayPos += uval_cuDetailWind;
        #endif
        #define DETAIL_NOISE 1
        vec3 curlPos = rayPos;
        curlPos.y *= 1.3;
        vec3 detailCurl = detailCurlNoise(curlPos);
        detailCurl *= 0.2 + 0.3 * pow2(heightFraction);
        detailCurl *= linearStep(mix(CU_BASE_DENSITY_THRESHOLD, 1.0, pow5(1.0 - heightFraction)), 0.0, densityOut);
        float detail1Billowy = detailNoiseB(rayPos, detailCurl);
        float bottomDetail = 1.0 - detail1Billowy * smoothstep(0.1, 0.0, heightFraction) * 2.0;
        float hc3 = _clouds_cu_heightCurveBillowy(xs);
        detail1Billowy *= hc3;
        detail1Billowy *= COVERAGE_SQRT;
        #if DETAIL_NOISE
        densityOut = linearStep(saturate(detail1Billowy), 1.0, densityOut);
        #endif
        float detail1Wisp = detailNoiseW(rayPos + detailCurl * 2.0 * _LOW_WISPS_CURL_STR);
        detail1Wisp = pow2(detail1Wisp);
        detail1Wisp *= COVERAGE_SQRT;
        float hc2 = _clouds_cu_heightCurveWisp(xs);
        detail1Wisp *= hc2;
        #if DETAIL_NOISE
        densityOut = linearStep(saturate(detail1Wisp), 1.0, densityOut);
        #endif
        float hardEdgeBlend = linearStep(0.0, 0.3, heightFraction);
        float minDetailDensity = mix(0.001, 0.02, hardEdgeBlend);
        float edgeDesnityRange = mix(0.08, 0.0015, hardEdgeBlend);
        densityOut *= smoothstep(minDetailDensity, minDetailDensity + edgeDesnityRange, densityOut);
        densityOut *= 1.0 + heightFraction * 16.0;
        densityOut *= bottomDetail;
        if (densityOut > 0.0) {
            return true;
        }
    }
    densityOut = 0.0;
    return false;
}
#define CLOUDS_AMBLUT_LAYER_STRAUS 0.5
#define CLOUDS_AMBLUT_LAYER_CUMULUS 1.5
#define CLOUDS_AMBLUT_LAYER_ALTOCUMULUS 2.5
#define CLOUDS_AMBLUT_LAYER_CIRRUS 3.5
#define CLOUDS_AMBLUT_LAYER_CIRROSTRATUS 4.5
#define CLOUDS_AMBLUT_LAYER_NOCTILUCENT 5.5
#define _CLOUDS_AMBLUT_SIZE 16.0
#define _CLOUDS_AMBLUT_SIZE_RCP rcp(_CLOUDS_AMBLUT_SIZE)
#define _CLOUDS_AMBLUT_SIZE_LAYERS 6.0
#define _CLOUDS_AMBLUT_SIZE_LAYERS_RCP rcp(_CLOUDS_AMBLUT_SIZE_LAYERS)
vec2 cloods_amblut_uv(vec3 viewDir, vec2 jitter) {
    vec2 uv = coords_equirectanglarForward(viewDir);
    uv += (jitter - 0.5) * _CLOUDS_AMBLUT_SIZE_RCP;
    uv = fract(uv);
    return uv;
}
vec2 clouds_amblut_tileUV(vec2 uv, float layer) {
    float layerIndex = clamp(floor(layer), 0.0, _CLOUDS_AMBLUT_SIZE_LAYERS - 1.0);
    return vec2(uv.x, (uv.y + layerIndex) * _CLOUDS_AMBLUT_SIZE_LAYERS_RCP);
}
vec4 clouds_amblut_sampleRaw(vec2 uv, float layer) {
    return persistent_cloudsAmbLUT_sample(clouds_amblut_tileUV(uv, layer));
}
vec3 clouds_amblut_sample(vec2 uv, float layer) {
    return clouds_amblut_sampleRaw(uv, layer).rgb;
}
#if SETTING_CLOUDS_LOW_UPSCALE_FACTOR == 0
#define UPSCALE_FACTOR 1.0
#define DOWNSCALE_DIVIDE(x) x
#define RENDER_MULTIPLIER 1.0
#define CHECK_MIP_LEVEL 3
#define CHECK_MIP_FACTOR 8.0
#elif SETTING_CLOUDS_LOW_UPSCALE_FACTOR == 1
#define UPSCALE_FACTOR 1.5
#define DOWNSCALE_DIVIDE(x) (x * 2 / 3)
#define RENDER_MULTIPLIER 0.6666666667
#define CHECK_MIP_LEVEL 3
#define CHECK_MIP_FACTOR 8.0
#elif SETTING_CLOUDS_LOW_UPSCALE_FACTOR == 2
#define UPSCALE_FACTOR 2.0
#define DOWNSCALE_DIVIDE(x) (x / 2)
#define RENDER_MULTIPLIER 0.5
#define CHECK_MIP_LEVEL 4
#define CHECK_MIP_FACTOR 16.0
#elif SETTING_CLOUDS_LOW_UPSCALE_FACTOR == 3
#define UPSCALE_FACTOR 2.5
#define DOWNSCALE_DIVIDE(x) (x * 2 / 5)
#define RENDER_MULTIPLIER 0.4
#define CHECK_MIP_LEVEL 4
#define CHECK_MIP_FACTOR 16.0
#elif SETTING_CLOUDS_LOW_UPSCALE_FACTOR == 4
#define UPSCALE_FACTOR 3.0
#define DOWNSCALE_DIVIDE(x) (x / 3)
#define RENDER_MULTIPLIER 0.3333333333
#define CHECK_MIP_LEVEL 5
#define CHECK_MIP_FACTOR 32.0
#elif SETTING_CLOUDS_LOW_UPSCALE_FACTOR == 5
#define UPSCALE_FACTOR 3.5
#define DOWNSCALE_DIVIDE(x) (x * 2 / 7)
#define RENDER_MULTIPLIER 0.2857142857
#define CHECK_MIP_LEVEL 5
#define CHECK_MIP_FACTOR 32.0
#elif SETTING_CLOUDS_LOW_UPSCALE_FACTOR == 6
#define UPSCALE_FACTOR 4.0
#define DOWNSCALE_DIVIDE(x) (x / 4)
#define RENDER_MULTIPLIER 0.25
#define CHECK_MIP_LEVEL 6
#define CHECK_MIP_FACTOR 64.0
#endif
ivec2 renderSize = DOWNSCALE_DIVIDE(uval_mainImageSizeI);
vec2 clouds_ss_upscaleoffset() {
    return rand_r2Seq2(frameCounter);
}
vec2 clouds_ss_upscaledTexelCenter(ivec2 texelPosDownScale) {
    vec2 texelPos1x1F = vec2(texelPosDownScale * UPSCALE_FACTOR);
    vec2 offset = clouds_ss_upscaleoffset() * UPSCALE_FACTOR;
    return clamp(texelPos1x1F + offset, vec2(0.0), uval_mainImageSize);
}
#define CLOUDS_SS_MAX_ACCUM SETTING_CLOUDS_LOW_MAX_ACCUM
struct CloudSSHistoryData {
    vec3 inScattering;
    vec3 transmittance;
    float hLen;
};
CloudSSHistoryData clouds_ss_historyData_init() {
    CloudSSHistoryData data;
    data.inScattering = vec3(0.0);
    data.transmittance = vec3(1.0);
    data.hLen = 0.0;
    return data;
}
void clouds_ss_historyData_pack(out uvec4 packedData, CloudSSHistoryData data) {
    data.inScattering = clamp(data.inScattering, 0.0, FP16_MAX);
    packedData.x = packHalf2x16(data.inScattering.xy);
    packedData.y = packHalf2x16(vec2(data.inScattering.z, data.transmittance.x));
    packedData.z = packHalf2x16(data.transmittance.yz);
    packedData.w = floatBitsToUint(data.hLen);
}
uvec2 morton_8bDecode(uint code) {
    uvec2 result = uvec2(code, code >> 1) & 0x55u;
    result = (result | (result >> 1)) & 0x33u;
    result = (result | (result >> 2)) & 0x0fu;
    return result;
}
vec4 hiz_furthest_gather(vec2 texelPos, int level) {
    vec4 mipTile = vec4(global_hizTiles[level]);
    vec2 readPos = mipTile.xy + clamp(texelPos, vec2(1.0), mipTile.zw - 1.0);
    return textureGather(usam_hiz, readPos / vec2(textureSize(usam_hiz, 0)), 1);
}
bool hiz_groupSkyCheck4x4(vec2 groupOrigin, int level) {
    vec4 hizValues = hiz_furthest_gather(groupOrigin + vec2(-1.0, -1.0), level);
    hizValues = min(hizValues, hiz_furthest_gather(groupOrigin + vec2(1.0, -1.0), level));
    hizValues = min(hizValues, hiz_furthest_gather(groupOrigin + vec2(-1.0, 1.0), level));
    hizValues = min(hizValues, hiz_furthest_gather(groupOrigin + vec2(1.0, 1.0), level));
    return min4(hizValues) <= coords_viewZToReversedZ(-65536.0, near);
}
layout(local_size_x = 8, local_size_y = 8) in;
const vec2 workGroupsRender = vec2(RENDER_MULTIPLIER, RENDER_MULTIPLIER);
shared bool shared_worldGroupCheck;
layout(rgba32ui) uniform writeonly uimage2D uimg_rgba32ui;
const float TRANSMITTANCE_EPSILON = 0.01;
void render(ivec2 texelPosDownScale) {
    vec2 texelPosF = clouds_ss_upscaledTexelCenter(texelPosDownScale);
    float viewZ = -65536.0;
    vec2 screenPos = texelPosF * uval_mainImageSizeRcp;
    vec3 viewPos = coords_toViewCoord(screenPos, viewZ, global_camProjInverse);
    vec3 originView = vec3(0.0);
    vec3 endView = viewPos;
    mat3 vectorView2World = mat3(gbufferModelViewInverse);
    vec3 viewDirView = normalize(endView - originView);
    vec3 viewDirWorld = normalize(vectorView2World * viewDirView);
    AtmosphereParameters atmosphere = getAtmosphereParameters();
    CloudMainRayParams mainRayParams;
    mainRayParams.rayStart = atmosphere_viewToAtmNoClamping(atmosphere, originView);
    const vec3 earthCenter = vec3(0.0);
    float maxRayLen = 0.0;
    {
        vec3 rayDir = viewDirWorld;
        if (endView.z == -65536.0) {
            if (length(mainRayParams.rayStart) > atmosphere.top) {
                float tTop = raySphereIntersectNearest(mainRayParams.rayStart, rayDir, earthCenter, atmosphere.top);
                if (tTop < 0.0) {
                    return;
                }
                mainRayParams.rayStart += rayDir * (tTop + 0.001);
            }
            float clampedBottom = min(atmosphere.bottom, length(mainRayParams.rayStart) - 0.001);
            float tBottom = raySphereIntersectNearest(mainRayParams.rayStart, rayDir, earthCenter, clampedBottom);
            float tTop = raySphereIntersectNearest(mainRayParams.rayStart, rayDir, earthCenter, atmosphere.top);
            float rayLen = 0.0;
            if (tBottom < 0.0) {
                if (tTop < 0.0) {
                    return;
                } else {
                    rayLen = tTop;
                    maxRayLen = tTop;
                }
            } else {
                if (tTop > 0.0) {
                    rayLen = min(tTop, tBottom);
                    maxRayLen = max(tTop, tBottom);
                }
            }
            mainRayParams.rayEnd = mainRayParams.rayStart + rayDir * rayLen;
        } else {
            return;
        }
    }
    mainRayParams.rayDir = normalize(mainRayParams.rayEnd - mainRayParams.rayStart);
    mainRayParams.rayStartHeight = length(mainRayParams.rayStart);
    mainRayParams.rayEndHeight = length(mainRayParams.rayEnd);
    float lightSelectRand = rand_stbnVec1(rand_newStbnPos(texelPosDownScale, 0), frameCounter);
    float sunAngleWarped = fract(sunAngle + 0.25);
    float sunLightFactor = smoothstep(0.23035, 0.24035, sunAngleWarped);
    sunLightFactor *= smoothstep(0.76965, 0.75965, sunAngleWarped);
    sunLightFactor += lightSelectRand * 0.2 - 0.1;
    sunLightFactor = step(0.5, sunLightFactor);
    vec3 lightDir = mix(uval_moonDirWorld, uval_sunDirWorld, sunLightFactor);
    vec3 lightIlluminance = mix(MOON_ILLUMINANCE, SUN_ILLUMINANCE, sunLightFactor);
    CloudRenderParams renderParams = cloudRenderParams_init(mainRayParams, lightDir, lightIlluminance);
    CloudRaymarchAccumState cuAccum = clouds_raymarchAccumState_init();
    vec2 ambLutJitterRand = rand_stbnVec2(rand_newStbnPos(texelPosDownScale, 1), frameCounter);
    vec3 viewDir = mainRayParams.rayDir;
    vec2 ambLutUV = cloods_amblut_uv(viewDir, ambLutJitterRand);
    {
        float cuMinHeight = atmosphere.bottom + SETTING_CLOUDS_CU_HEIGHT;
        float cuMaxHeight = cuMinHeight + SETTING_CLOUDS_CU_THICKNESS;
        float cuMidHeight = cuMinHeight + SETTING_CLOUDS_CU_THICKNESS * 0.5;
        float cuHeightDiff = cuMidHeight - mainRayParams.rayStartHeight;
        float cuOrigin2RayBot = raySphereIntersectNearest(mainRayParams.rayStart, mainRayParams.rayDir, earthCenter, cuMinHeight);
        float cuOrigin2RayTop = raySphereIntersectNearest(mainRayParams.rayStart, mainRayParams.rayDir, earthCenter, cuMaxHeight);
        bool inLayer = abs(cuHeightDiff) < SETTING_CLOUDS_CU_THICKNESS * 0.5;
        float cuOrigin2RayStart = inLayer ? 0.0 : (cuHeightDiff < 0.0 ? cuOrigin2RayTop : cuOrigin2RayBot);
        vec3 cuRayStartOffset = mainRayParams.rayStart + mainRayParams.rayDir * (cuOrigin2RayStart + 0.1);
        float cuRayLenBot = raySphereIntersectNearest(cuRayStartOffset, mainRayParams.rayDir, earthCenter, cuMinHeight);
        float cuRayLenTop = raySphereIntersectNearest(cuRayStartOffset, mainRayParams.rayDir, earthCenter, cuMaxHeight);
        float cuRayLen = cuRayLenBot;
        if (cuRayLenTop > 0.0) {
            if (cuRayLenBot > 0.0) {
                cuRayLen = min(cuRayLenTop, cuRayLenBot);
            } else {
                cuRayLen = cuRayLenTop;
            }
        }
        const float CLOUDS_CU_MAX_RAY_LENGTH = 50.0;
        cuRayLen = cuRayLen <= 0.0 ? CLOUDS_CU_MAX_RAY_LENGTH : cuRayLen;
        cuRayLen += 0.1;
        uint cuFlag = uint(sign(cuHeightDiff) == sign(mainRayParams.rayDir.y)) | uint(inLayer);
        cuFlag &= uint(cuOrigin2RayStart >= 0.0);
        if (bool(cuFlag)) {
            #define CLOUDS_CU_DENSITY (256.0 * SETTING_CLOUDS_CU_DENSITY)
            cuRayLen = min(cuRayLen, CLOUDS_CU_MAX_RAY_LENGTH);
            float cuRaySteps = cuRayLen / CLOUDS_CU_MAX_RAY_LENGTH * float(SETTING_CLOUDS_LOW_STEP_MAX);
            cuRaySteps = max(cuRaySteps, SETTING_CLOUDS_LOW_STEP_MIN);
            uint cuRayStepsI = uint(cuRaySteps);
            vec3 ambientIrradiance = clouds_amblut_sample(ambLutUV, CLOUDS_AMBLUT_LAYER_CUMULUS);
            CloudParticpatingMedium cuMedium = clouds_cu_medium(renderParams.cosLightTheta);
            CloudRaymarchLayerParam layerParam = clouds_raymarchLayerParam_init(
                mainRayParams,
                cuMedium,
                ambientIrradiance,
                vec2(cuMinHeight, cuMaxHeight),
                cuOrigin2RayStart,
                cuRayLen,
                cuRayStepsI
            );
            CloudRaymarchStepState stepState = clouds_raymarchStepState_init(layerParam);
            vec2 lightRayDirJitterRand = rand_stbnVec2(rand_newStbnPos(texelPosDownScale, 2), frameCounter);
            vec3 lightRayDir = renderParams.lightDir;
            lightRayDir = rand_sampleInCone(lightRayDir, SUN_ANGULAR_RADIUS * 4.0, lightRayDirJitterRand);
            float mainRayJitterRand = rand_stbnVec1(rand_newStbnPos(texelPosDownScale, 1), frameCounter);
            float lightRayJitterRand = rand_stbnVec1(rand_newStbnPos(texelPosDownScale, 2), frameCounter);
            for (uint stepIndex = 0; stepIndex < cuRayStepsI; ++stepIndex) {
                if (stepState.position.w > cuRayLen) break;
                float heightFraction = linearStep(cuMinHeight, cuMaxHeight, stepState.height);
                float sampleDensity = 0.0;
                float sampleDensityLod = 0.0;
                if (clouds_cu_density(stepState.position.xyz, heightFraction, true, sampleDensity, sampleDensityLod)) {
                    sampleDensity *= CLOUDS_CU_DENSITY;
                    sampleDensityLod *= CLOUDS_CU_DENSITY;
                    #define CLOUDS_CU_LIGHT_RAYMARCH_STEP 8
                    #define CLOUDS_CU_LIGHT_RAYMARCH_STEP_RCP rcp(float(CLOUDS_CU_LIGHT_RAYMARCH_STEP))
                    const float C = 0.5 * CLOUDS_CU_LIGHT_RAYMARCH_STEP_RCP;
                    float lightRayTotalDensity = 0.0;
                    {
                        float lightRayLen = SETTING_CLOUDS_CU_THICKNESS * 1.0;
                        vec3 lightRayTotalDelta = lightRayDir * lightRayLen;
                        for (uint lightStepIndex = 0; lightStepIndex < CLOUDS_CU_LIGHT_RAYMARCH_STEP; ++lightStepIndex) {
                            float indexF = float(lightStepIndex);
                            float x = (indexF + lightRayJitterRand) * CLOUDS_CU_LIGHT_RAYMARCH_STEP_RCP;
                            vec3 lightRaySamplePos = stepState.position.xyz + lightRayTotalDelta * pow2(x);
                            float lightSampleHeight = length(lightRaySamplePos);
                            if (lightSampleHeight > cuMaxHeight) break;
                            float lightHeightFraction = linearStep(cuMinHeight, cuMaxHeight, lightSampleHeight);
                            float lightSampleDensity = 0.0;
                            float lightSampleDensityLod = 0.0;
                            if (clouds_cu_density(lightRaySamplePos, lightHeightFraction, true, lightSampleDensity, lightSampleDensityLod)) {
                                float x = (indexF + 0.5) * CLOUDS_CU_LIGHT_RAYMARCH_STEP_RCP;
                                float lightRayStepLength = 4.0 * x * C * lightRayLen;
                                lightRayTotalDensity += lightSampleDensity * lightRayStepLength;
                            }
                        }
                    }
                    lightRayTotalDensity *= CLOUDS_CU_DENSITY;
                    vec3 lightRayOpticalDepth = cuMedium.extinction * lightRayTotalDensity;
                    clouds_computeLighting(
                        atmosphere,
                        renderParams,
                        layerParam,
                        stepState,
                        sampleDensity,
                        sampleDensityLod,
                        lightRayOpticalDepth,
                        cuAccum
                    );
                }
                if (cuAccum.totalTransmittance.y < TRANSMITTANCE_EPSILON) {
                    break;
                }
                clouds_raymarchStepState_update(stepState, float(stepIndex) + mainRayJitterRand);
            }
        }
    }
    CloudSSHistoryData historyData = clouds_ss_historyData_init();
    historyData.inScattering = clamp(cuAccum.totalInSctr, 0.0, FP16_MAX);
    historyData.transmittance = cuAccum.totalTransmittance;
    historyData.hLen = 1.0;
    uvec4 packedOutput = uvec4(0u);
    clouds_ss_historyData_pack(packedOutput, historyData);
    transient_lowCloudRender_store(texelPosDownScale, packedOutput);
}
void main() {
    if (gl_LocalInvocationIndex == 0) {
        vec2 groupCenter = vec2(gl_WorkGroupID.xy << 3u) + 4.0;
        vec2 hizCheckPos = groupCenter * UPSCALE_FACTOR / CHECK_MIP_FACTOR;
        shared_worldGroupCheck = hiz_groupSkyCheck4x4(hizCheckPos, CHECK_MIP_LEVEL);
    }
    barrier();
    if (shared_worldGroupCheck) {
        uvec2 workGroupOrigin = gl_WorkGroupID.xy << 3;
        uint threadIdx = gl_SubgroupID * gl_SubgroupSize + gl_SubgroupInvocationID;
        uvec2 mortonPos = morton_8bDecode(threadIdx);
        uvec2 mortonGlobalPosU = workGroupOrigin + mortonPos;
        ivec2 texelPos = ivec2(mortonGlobalPosU);
        if (all(lessThan(texelPos, renderSize))) {
            render(texelPos);
        }
    }
}