OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / blender / mountain_voronoi3.MeshOutput.meshbake.gdshader

1878 lines · gdshader ref:
shader_type spatial;
render_mode blend_mix, depth_draw_opaque, depth_test_default, cull_back, diffuse_lambert, specular_schlick_ggx;


// Varyings
varying vec4 var_bb_mk0;
varying vec4 var_bb_mk1;
varying vec4 var_bb_mk2;
varying vec4 var_bb_mk3;



// Group: MTN_Albedo
void group_MTN_Albedo_800004a8b4017eed(in float p_SnowFactor, in float p_Beach, in float p_Underside, in vec4 p_Rock_Colour, in vec4 p_Snow_Colour, in vec4 p_Beach_Colour, in vec4 p_Underside_Colour, out vec4 p_Base_Color) {
// Group Input:0
	float n_out0p0 = p_SnowFactor;
	float n_out0p1 = p_Beach;
	float n_out0p2 = p_Underside;
	vec4 n_out0p3 = p_Rock_Colour;
	vec4 n_out0p4 = p_Snow_Colour;
	vec4 n_out0p5 = p_Beach_Colour;
	vec4 n_out0p6 = p_Underside_Colour;


// Clamp:5
	float n_in5p1 = 0.00000;
	float n_in5p2 = 1.00000;
	float n_out5p0 = clamp(n_out0p0, n_in5p1, n_in5p2);


// Mix:2
	vec3 n_out2p0 = mix(vec3(n_out0p3.xyz), vec3(n_out0p4.xyz), n_out5p0);


// Clamp:6
	float n_in6p1 = 0.00000;
	float n_in6p2 = 1.00000;
	float n_out6p0 = clamp(n_out0p1, n_in6p1, n_in6p2);


// Mix:3
	vec3 n_out3p0 = mix(n_out2p0, vec3(n_out0p5.xyz), n_out6p0);


// Clamp:7
	float n_in7p1 = 0.00000;
	float n_in7p2 = 1.00000;
	float n_out7p0 = clamp(n_out0p2, n_in7p1, n_in7p2);


// Mix:4
	vec3 n_out4p0 = mix(n_out3p0, vec3(n_out0p6.xyz), n_out7p0);


// Group Output:1
	p_Base_Color = vec4(n_out4p0, 0.0);


}

// Group: MTN_Roughness
void group_MTN_Roughness_800004a8bf017ee2(in float p_SnowFactor, in float p_Beach, in float p_Slope, in float p_Rock_Roughness, in float p_Snow_Roughness, in float p_Sand_Roughness, in float p_Wet_Roughness, in float p_Wet_Slope_Start, in float p_Wet_Slope_Full, out float p_Roughness, out float p_Rock_Snow_Roughness) {
// Group Input:0
	float n_out0p0 = p_SnowFactor;
	float n_out0p1 = p_Beach;
	float n_out0p2 = p_Slope;
	float n_out0p3 = p_Rock_Roughness;
	float n_out0p4 = p_Snow_Roughness;
	float n_out0p5 = p_Sand_Roughness;
	float n_out0p6 = p_Wet_Roughness;
	float n_out0p7 = p_Wet_Slope_Start;
	float n_out0p8 = p_Wet_Slope_Full;


// Clamp:7
	float n_in7p1 = 0.00000;
	float n_in7p2 = 1.00000;
	float n_out7p0 = clamp(n_out0p0, n_in7p1, n_in7p2);


// Mix:2
	float n_out2p0 = mix(n_out0p3, n_out0p4, n_out7p0);


// Clamp:8
	float n_in8p1 = 0.00000;
	float n_in8p2 = 1.00000;
	float n_out8p0 = clamp(n_out0p1, n_in8p1, n_in8p2);


// Mix:3
	float n_out3p0 = mix(n_out2p0, n_out0p5, n_out8p0);


	float n_out4p0;
// Expression:4
	float n_in4p3 = 0.00000;
	float n_in4p4 = 1.00000;
	n_out4p0 = 0.0;
	{
		float _d = n_out0p8 - n_out0p7;
		float _t = clamp((n_out0p2 - n_out0p7) / (abs(_d) < 1e-6 ? 1e-6 : _d), 0.0, 1.0);
		_t = _t * _t * (3.0 - 2.0 * _t);
		n_out4p0 = n_in4p3 + _t * (n_in4p4 - n_in4p3);
	}


// FloatOp:5
	float n_out5p0 = n_out4p0 * n_out0p1;


// Clamp:9
	float n_in9p1 = 0.00000;
	float n_in9p2 = 1.00000;
	float n_out9p0 = clamp(n_out5p0, n_in9p1, n_in9p2);


// Mix:6
	float n_out6p0 = mix(n_out3p0, n_out0p6, n_out9p0);


// Group Output:1
	p_Roughness = n_out6p0;
	p_Rock_Snow_Roughness = n_out2p0;


}

// GlobalExpression:0
	#ifndef BB_NOISE_HELPERS
	#define BB_NOISE_HELPERS
	uint bb_rotl(uint x, uint k) { return (x << k) | (x >> (32u - k)); }
	
	void bb_final(inout uint a, inout uint b, inout uint c) {
		c ^= b; c -= bb_rotl(b, 14u);
		a ^= c; a -= bb_rotl(c, 11u);
		b ^= a; b -= bb_rotl(a, 25u);
		c ^= b; c -= bb_rotl(b, 16u);
		a ^= c; a -= bb_rotl(c, 4u);
		b ^= a; b -= bb_rotl(a, 14u);
		c ^= b; c -= bb_rotl(b, 24u);
	}
	
	uint bb_hash_uint2(uint kx, uint ky) {
		uint a, b, c;
		a = b = c = 0xdeadbeefu + (2u << 2u) + 13u;
		b += ky; a += kx;
		bb_final(a, b, c);
		return c;
	}
	
	uint bb_hash_uint3(uint kx, uint ky, uint kz) {
		uint a, b, c;
		a = b = c = 0xdeadbeefu + (3u << 2u) + 13u;
		c += kz; b += ky; a += kx;
		bb_final(a, b, c);
		return c;
	}
	
	float bb_hash_float2_to_float(vec2 k) {
		return float(bb_hash_uint2(floatBitsToUint(k.x), floatBitsToUint(k.y)))
		       * (1.0 / 4294967295.0);
	}
	
	vec3 bb_random_offset(float seed) {
		return vec3(100.0 + bb_hash_float2_to_float(vec2(seed, 0.0)) * 100.0,
		            100.0 + bb_hash_float2_to_float(vec2(seed, 1.0)) * 100.0,
		            100.0 + bb_hash_float2_to_float(vec2(seed, 2.0)) * 100.0);
	}
	
	float bb_fade(float t) { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); }
	
	float bb_negate_if(float val, bool cond) { return cond ? -val : val; }
	
	float bb_grad3(uint hash, float x, float y, float z) {
		uint h = hash & 15u;
		float u = h < 8u ? x : y;
		float vt = ((h == 12u) || (h == 14u)) ? x : z;
		float v = h < 4u ? y : vt;
		return bb_negate_if(u, (h & 1u) != 0u) + bb_negate_if(v, (h & 2u) != 0u);
	}
	
	float bb_tri_mix(float v0, float v1, float v2, float v3,
	                 float v4, float v5, float v6, float v7,
	                 float x, float y, float z) {
		float x1 = 1.0 - x;
		float y1 = 1.0 - y;
		float z1 = 1.0 - z;
		return z1 * (y1 * (v0 * x1 + v1 * x) + y * (v2 * x1 + v3 * x)) +
		       z  * (y1 * (v4 * x1 + v5 * x) + y * (v6 * x1 + v7 * x));
	}
	
	float bb_perlin_3d(vec3 p) {
		vec3 fl = floor(p);
		vec3 f = p - fl;
		ivec3 I = ivec3(fl);
		uint X = uint(I.x); uint Y = uint(I.y); uint Z = uint(I.z);
		uint X1 = X + 1u; uint Y1 = Y + 1u; uint Z1 = Z + 1u;
		float u = bb_fade(f.x);
		float v = bb_fade(f.y);
		float w = bb_fade(f.z);
		return bb_tri_mix(
			bb_grad3(bb_hash_uint3(X , Y , Z ), f.x      , f.y      , f.z      ),
			bb_grad3(bb_hash_uint3(X1, Y , Z ), f.x - 1.0, f.y      , f.z      ),
			bb_grad3(bb_hash_uint3(X , Y1, Z ), f.x      , f.y - 1.0, f.z      ),
			bb_grad3(bb_hash_uint3(X1, Y1, Z ), f.x - 1.0, f.y - 1.0, f.z      ),
			bb_grad3(bb_hash_uint3(X , Y , Z1), f.x      , f.y      , f.z - 1.0),
			bb_grad3(bb_hash_uint3(X1, Y , Z1), f.x - 1.0, f.y      , f.z - 1.0),
			bb_grad3(bb_hash_uint3(X , Y1, Z1), f.x      , f.y - 1.0, f.z - 1.0),
			bb_grad3(bb_hash_uint3(X1, Y1, Z1), f.x - 1.0, f.y - 1.0, f.z - 1.0),
			u, v, w);
	}
	
	// C fmod truncates toward zero. GLSL mod() floors. Not interchangeable.
	float bb_fmod1(float x, float y) { return x - y * trunc(x / y); }
	vec3 bb_fmod3(vec3 p, float y) {
		return vec3(bb_fmod1(p.x, y), bb_fmod1(p.y, y), bb_fmod1(p.z, y));
	}
	
	float bb_snoise_3d(vec3 p) {
		vec3 corr = 0.5 * vec3(greaterThanEqual(abs(p), vec3(1000000.0)));
		p = bb_fmod3(p, 100000.0) + corr;
		return 0.9820 * bb_perlin_3d(p);  // noise_scale3
	}
	
	float bb_noise_3d(vec3 p) { return 0.5 * bb_snoise_3d(p) + 0.5; }
	
	float bb_noise_fbm(vec3 p, float detail, float roughness, float lacunarity,
	                   bool normalize_) {
		float fscale = 1.0;
		float amp = 1.0;
		float maxamp = 0.0;
		float sum = 0.0;
		int n = int(detail);
		for (int i = 0; i <= n && i < 16; i++) {
			float t = bb_snoise_3d(fscale * p);
			sum += t * amp;
			maxamp += amp;
			amp *= roughness;
			fscale *= lacunarity;
		}
		float rmd = detail - floor(detail);
		if (rmd != 0.0) {
			float t = bb_snoise_3d(fscale * p);
			float sum2 = sum + t * amp;
			return normalize_
				? mix(0.5 * sum / maxamp + 0.5, 0.5 * sum2 / (maxamp + amp) + 0.5, rmd)
				: mix(sum, sum2, rmd);
		}
		return normalize_ ? 0.5 * sum / maxamp + 0.5 : sum;
	}
	
	vec3 bb_noise_distort(vec3 p, float distortion) {
		if (distortion == 0.0) { return p; }
		return p + vec3(bb_snoise_3d(p + bb_random_offset(0.0)) * distortion,
		                bb_snoise_3d(p + bb_random_offset(1.0)) * distortion,
		                bb_snoise_3d(p + bb_random_offset(2.0)) * distortion);
	}
	
	#endif
	
// GlobalExpression:1
	#ifndef BB_NOISE_AA_HELPERS
	#define BB_NOISE_AA_HELPERS
	uniform float bb_aa_strength : hint_range(0.0, 1.0) = 1.0;
	
	float bb_footprint(vec3 q) { return max(length(dFdx(q)), length(dFdy(q))); }
	
	float bb_octave_w(float x) { return 1.0 - smoothstep(0.7, 1.4, x); }
	
	float bb_noise_fbm_aa(vec3 p, float fw, float detail, float roughness, float lacunarity,
	                      bool normalize_) {
		float fscale = 1.0;
		float amp = 1.0;
		float maxamp = 0.0;
		float sum = 0.0;
		int n = int(detail);
		for (int i = 0; i <= n && i < 16; i++) {
			float w = bb_octave_w(fw * fscale);
			float t = (w > 0.0) ? bb_snoise_3d(fscale * p) : 0.0;
			sum += t * amp * w;
			maxamp += amp;
			amp *= roughness;
			fscale *= lacunarity;
		}
		float rmd = detail - floor(detail);
		if (rmd != 0.0) {
			float w = bb_octave_w(fw * fscale);
			float t = (w > 0.0) ? bb_snoise_3d(fscale * p) : 0.0;
			float sum2 = sum + t * amp * w;
			return normalize_
				? mix(0.5 * sum / maxamp + 0.5, 0.5 * sum2 / (maxamp + amp) + 0.5, rmd)
				: mix(sum, sum2, rmd);
		}
		return normalize_ ? 0.5 * sum / maxamp + 0.5 : sum;
	}
	
	#endif
	
// GlobalExpression:2
	#ifndef BB_NOISE_GRAD_HELPERS
	#define BB_NOISE_GRAD_HELPERS
	float bb_fade_d(float t) { return 30.0 * t * t * (t - 1.0) * (t - 1.0); }
	
	vec3 bb_grad3_vec(uint hash) {
		return vec3(bb_grad3(hash, 1.0, 0.0, 0.0), bb_grad3(hash, 0.0, 1.0, 0.0),
		            bb_grad3(hash, 0.0, 0.0, 1.0));
	}
	
	float bb_perlin_3d_g(vec3 p, out vec3 grad) {
		vec3 fl = floor(p);
		vec3 f = p - fl;
		ivec3 I = ivec3(fl);
		uint X = uint(I.x); uint Y = uint(I.y); uint Z = uint(I.z);
		uint X1 = X + 1u; uint Y1 = Y + 1u; uint Z1 = Z + 1u;
		uint h0 = bb_hash_uint3(X , Y , Z ); uint h1 = bb_hash_uint3(X1, Y , Z );
		uint h2 = bb_hash_uint3(X , Y1, Z ); uint h3 = bb_hash_uint3(X1, Y1, Z );
		uint h4 = bb_hash_uint3(X , Y , Z1); uint h5 = bb_hash_uint3(X1, Y , Z1);
		uint h6 = bb_hash_uint3(X , Y1, Z1); uint h7 = bb_hash_uint3(X1, Y1, Z1);
		float c0 = bb_grad3(h0, f.x      , f.y      , f.z      );
		float c1 = bb_grad3(h1, f.x - 1.0, f.y      , f.z      );
		float c2 = bb_grad3(h2, f.x      , f.y - 1.0, f.z      );
		float c3 = bb_grad3(h3, f.x - 1.0, f.y - 1.0, f.z      );
		float c4 = bb_grad3(h4, f.x      , f.y      , f.z - 1.0);
		float c5 = bb_grad3(h5, f.x - 1.0, f.y      , f.z - 1.0);
		float c6 = bb_grad3(h6, f.x      , f.y - 1.0, f.z - 1.0);
		float c7 = bb_grad3(h7, f.x - 1.0, f.y - 1.0, f.z - 1.0);
		float u = bb_fade(f.x);
		float v = bb_fade(f.y);
		float w = bb_fade(f.z);
		float x1 = 1.0 - u; float y1 = 1.0 - v; float z1 = 1.0 - w;
		vec3 lat = z1 * (y1 * (bb_grad3_vec(h0) * x1 + bb_grad3_vec(h1) * u)
		                 + v * (bb_grad3_vec(h2) * x1 + bb_grad3_vec(h3) * u))
		         + w  * (y1 * (bb_grad3_vec(h4) * x1 + bb_grad3_vec(h5) * u)
		                 + v * (bb_grad3_vec(h6) * x1 + bb_grad3_vec(h7) * u));
		float e0 = c0 * x1 + c1 * u; float e1 = c2 * x1 + c3 * u;
		float e2 = c4 * x1 + c5 * u; float e3 = c6 * x1 + c7 * u;
		float du = z1 * (y1 * (c1 - c0) + v * (c3 - c2)) + w * (y1 * (c5 - c4) + v * (c7 - c6));
		float dv = z1 * (e1 - e0) + w * (e3 - e2);
		float dw = (y1 * e2 + v * e3) - (y1 * e0 + v * e1);
		grad = lat + vec3(du * bb_fade_d(f.x), dv * bb_fade_d(f.y), dw * bb_fade_d(f.z));
		return bb_tri_mix(c0, c1, c2, c3, c4, c5, c6, c7, u, v, w);
	}
	
	float bb_snoise_3d_g(vec3 p, out vec3 grad) {
		vec3 corr = 0.5 * vec3(greaterThanEqual(abs(p), vec3(1000000.0)));
		p = bb_fmod3(p, 100000.0) + corr;
		vec3 g;
		float r = 0.9820 * bb_perlin_3d_g(p, g);
		grad = 0.9820 * g;
		return r;
	}
	
	// fw: the noise coordinate's screen footprint (NOISE_AA_HELPERS_GLSL). The
	// octave weights are bb_noise_fbm_aa's, so value and gradient describe the SAME
	// faded function; a weight is treated as locally constant (it varies with the
	// footprint, not with p). At fw = 0 every weight is exactly 1.
	float bb_noise_fbm_g(vec3 p, float fw, float detail, float roughness, float lacunarity,
	                     bool normalize_, out vec3 grad) {
		float fscale = 1.0;
		float amp = 1.0;
		float maxamp = 0.0;
		float sum = 0.0;
		vec3 gsum = vec3(0.0);
		int n = int(detail);
		for (int i = 0; i <= n && i < 16; i++) {
			float w = bb_octave_w(fw * fscale);
			vec3 g = vec3(0.0);
			float t = (w > 0.0) ? bb_snoise_3d_g(fscale * p, g) : 0.0;
			sum += t * amp * w;
			gsum += g * (amp * w * fscale);
			maxamp += amp;
			amp *= roughness;
			fscale *= lacunarity;
		}
		float rmd = detail - floor(detail);
		if (rmd != 0.0) {
			float w = bb_octave_w(fw * fscale);
			vec3 g = vec3(0.0);
			float t = (w > 0.0) ? bb_snoise_3d_g(fscale * p, g) : 0.0;
			float sum2 = sum + t * amp * w;
			vec3 gsum2 = gsum + g * (amp * w * fscale);
			if (normalize_) {
				grad = mix(0.5 * gsum / maxamp, 0.5 * gsum2 / (maxamp + amp), rmd);
				return mix(0.5 * sum / maxamp + 0.5, 0.5 * sum2 / (maxamp + amp) + 0.5, rmd);
			}
			grad = mix(gsum, gsum2, rmd);
			return mix(sum, sum2, rmd);
		}
		grad = normalize_ ? 0.5 * gsum / maxamp : gsum;
		return normalize_ ? 0.5 * sum / maxamp + 0.5 : sum;
	}
	
	#endif
	
// GlobalExpression:3
	#ifndef BB_NOISE_HESS_HELPERS
	#define BB_NOISE_HESS_HELPERS
	float bb_fade_dd(float t) { return 60.0 * t * (t - 1.0) * (2.0 * t - 1.0); }
	
	float bb_perlin_3d_h(vec3 p, out vec3 grad, out mat3 hess) {
		vec3 fl = floor(p);
		vec3 f = p - fl;
		ivec3 I = ivec3(fl);
		uint X = uint(I.x); uint Y = uint(I.y); uint Z = uint(I.z);
		uint X1 = X + 1u; uint Y1 = Y + 1u; uint Z1 = Z + 1u;
		uint h0 = bb_hash_uint3(X , Y , Z ); uint h1 = bb_hash_uint3(X1, Y , Z );
		uint h2 = bb_hash_uint3(X , Y1, Z ); uint h3 = bb_hash_uint3(X1, Y1, Z );
		uint h4 = bb_hash_uint3(X , Y , Z1); uint h5 = bb_hash_uint3(X1, Y , Z1);
		uint h6 = bb_hash_uint3(X , Y1, Z1); uint h7 = bb_hash_uint3(X1, Y1, Z1);
		float c0 = bb_grad3(h0, f.x      , f.y      , f.z      );
		float c1 = bb_grad3(h1, f.x - 1.0, f.y      , f.z      );
		float c2 = bb_grad3(h2, f.x      , f.y - 1.0, f.z      );
		float c3 = bb_grad3(h3, f.x - 1.0, f.y - 1.0, f.z      );
		float c4 = bb_grad3(h4, f.x      , f.y      , f.z - 1.0);
		float c5 = bb_grad3(h5, f.x - 1.0, f.y      , f.z - 1.0);
		float c6 = bb_grad3(h6, f.x      , f.y - 1.0, f.z - 1.0);
		float c7 = bb_grad3(h7, f.x - 1.0, f.y - 1.0, f.z - 1.0);
		float u = bb_fade(f.x);
		float v = bb_fade(f.y);
		float w = bb_fade(f.z);
		float x1 = 1.0 - u; float y1 = 1.0 - v; float z1 = 1.0 - w;
		vec3 G0 = bb_grad3_vec(h0); vec3 G1 = bb_grad3_vec(h1);
		vec3 G2 = bb_grad3_vec(h2); vec3 G3 = bb_grad3_vec(h3);
		vec3 G4 = bb_grad3_vec(h4); vec3 G5 = bb_grad3_vec(h5);
		vec3 G6 = bb_grad3_vec(h6); vec3 G7 = bb_grad3_vec(h7);
		vec3 lat = z1 * (y1 * (G0 * x1 + G1 * u) + v * (G2 * x1 + G3 * u))
		         + w  * (y1 * (G4 * x1 + G5 * u) + v * (G6 * x1 + G7 * u));
		float e0 = c0 * x1 + c1 * u; float e1 = c2 * x1 + c3 * u;
		float e2 = c4 * x1 + c5 * u; float e3 = c6 * x1 + c7 * u;
		float du = z1 * (y1 * (c1 - c0) + v * (c3 - c2)) + w * (y1 * (c5 - c4) + v * (c7 - c6));
		float dv = z1 * (e1 - e0) + w * (e3 - e2);
		float dw = (y1 * e2 + v * e3) - (y1 * e0 + v * e1);
		vec3 s1 = vec3(bb_fade_d(f.x), bb_fade_d(f.y), bb_fade_d(f.z));
		vec3 s2 = vec3(bb_fade_dd(f.x), bb_fade_dd(f.y), bb_fade_dd(f.z));
		grad = lat + vec3(du, dv, dw) * s1;
		vec4 A0 = vec4(G0, c0); vec4 A1 = vec4(G1, c1); vec4 A2 = vec4(G2, c2); vec4 A3 = vec4(G3, c3);
		vec4 A4 = vec4(G4, c4); vec4 A5 = vec4(G5, c5); vec4 A6 = vec4(G6, c6); vec4 A7 = vec4(G7, c7);
		vec4 a00 = A0 * x1 + A1 * u; vec4 a10 = A2 * x1 + A3 * u;
		vec4 a01 = A4 * x1 + A5 * u; vec4 a11 = A6 * x1 + A7 * u;
		vec4 d00 = A1 - A0; vec4 d10 = A3 - A2; vec4 d01 = A5 - A4; vec4 d11 = A7 - A6;
		vec4 Tu = z1 * (y1 * d00 + v * d10) + w * (y1 * d01 + v * d11);
		vec4 Tv = z1 * (a10 - a00) + w * (a11 - a01);
		vec4 Tw = (y1 * a01 + v * a11) - (y1 * a00 + v * a10);
		float Tuv = z1 * (d10.w - d00.w) + w * (d11.w - d01.w);
		float Tuw = (y1 * d01.w + v * d11.w) - (y1 * d00.w + v * d10.w);
		float Tvw = (a11.w - a01.w) - (a10.w - a00.w);
		float hxx = 2.0 * Tu.x * s1.x + Tu.w * s2.x;
		float hyy = 2.0 * Tv.y * s1.y + Tv.w * s2.y;
		float hzz = 2.0 * Tw.z * s1.z + Tw.w * s2.z;
		float hxy = Tv.x * s1.y + Tu.y * s1.x + Tuv * s1.x * s1.y;
		float hxz = Tw.x * s1.z + Tu.z * s1.x + Tuw * s1.x * s1.z;
		float hyz = Tw.y * s1.z + Tv.z * s1.y + Tvw * s1.y * s1.z;
		hess = mat3(vec3(hxx, hxy, hxz), vec3(hxy, hyy, hyz), vec3(hxz, hyz, hzz));
		return bb_tri_mix(c0, c1, c2, c3, c4, c5, c6, c7, u, v, w);
	}
	
	float bb_snoise_3d_h(vec3 p, out vec3 grad, out mat3 hess) {
		vec3 corr = 0.5 * vec3(greaterThanEqual(abs(p), vec3(1000000.0)));
		p = bb_fmod3(p, 100000.0) + corr;
		vec3 g;
		mat3 H;
		float r = 0.9820 * bb_perlin_3d_h(p, g, H);
		grad = 0.9820 * g;
		hess = 0.9820 * H;
		return r;
	}
	
	float bb_noise_fbm_h(vec3 p, float fw, float detail, float roughness, float lacunarity,
	                     bool normalize_, out vec3 grad, out mat3 hess) {
		float fscale = 1.0;
		float amp = 1.0;
		float maxamp = 0.0;
		float sum = 0.0;
		vec3 gsum = vec3(0.0);
		mat3 hsum = mat3(0.0);
		int n = int(detail);
		for (int i = 0; i <= n && i < 16; i++) {
			float w = bb_octave_w(fw * fscale);
			vec3 g = vec3(0.0);
			mat3 H = mat3(0.0);
			float t = (w > 0.0) ? bb_snoise_3d_h(fscale * p, g, H) : 0.0;
			sum += t * amp * w;
			gsum += g * (amp * w * fscale);
			hsum += H * (amp * w * fscale * fscale);
			maxamp += amp;
			amp *= roughness;
			fscale *= lacunarity;
		}
		float rmd = detail - floor(detail);
		if (rmd != 0.0) {
			float w = bb_octave_w(fw * fscale);
			vec3 g = vec3(0.0);
			mat3 H = mat3(0.0);
			float t = (w > 0.0) ? bb_snoise_3d_h(fscale * p, g, H) : 0.0;
			float sum2 = sum + t * amp * w;
			vec3 gsum2 = gsum + g * (amp * w * fscale);
			mat3 hsum2 = hsum + H * (amp * w * fscale * fscale);
			if (normalize_) {
				grad = mix(0.5 * gsum / maxamp, 0.5 * gsum2 / (maxamp + amp), rmd);
				hess = (0.5 * (1.0 - rmd) / maxamp) * hsum + (0.5 * rmd / (maxamp + amp)) * hsum2;
				return mix(0.5 * sum / maxamp + 0.5, 0.5 * sum2 / (maxamp + amp) + 0.5, rmd);
			}
			grad = mix(gsum, gsum2, rmd);
			hess = (1.0 - rmd) * hsum + rmd * hsum2;
			return mix(sum, sum2, rmd);
		}
		grad = normalize_ ? 0.5 * gsum / maxamp : gsum;
		hess = normalize_ ? (0.5 / maxamp) * hsum : hsum;
		return normalize_ ? 0.5 * sum / maxamp + 0.5 : sum;
	}
	
	#endif
	
// GlobalExpression:4
	#ifndef BB_MTN_NORMALS
	#define BB_MTN_NORMALS
	float bb_mr_smooth_d(float x, float a, float b, out float d) {
		if (a == b) { d = 0.0; return 0.0; }
		float t = clamp((x - a) / (b - a), 0.0, 1.0);
		d = 6.0 * t * (1.0 - t) / (b - a);
		return t * t * (3.0 - 2.0 * t);
	}
	
	vec3 bb_bump_normal(vec3 N, vec3 g, float dist, float strength) {
		vec3 Pg = g - N * dot(g, N);
		vec3 m = N - dist * Pg;
		vec3 nr = (dot(m, m) > 0.0) ? normalize(m) : N;
		vec3 w = N + max(strength, 0.0) * (nr - N);
		return (dot(w, w) > 0.0) ? normalize(w) : N;
	}
	
	void bb_mtn_normals(vec3 q, float alt, vec3 N, vec3 dqx, vec3 dqy,
			float stretch, float turb, float coupling, float micro_s, float micro_d,
			float snow_line, float snow_w, float slope_max, float slope_min,
			float trans_scale, float trans_amt, float snow_scale,
			float rock_bs, float snow_bs, float surf_d,
			out vec3 normal_out, out float slope_out, out float snow_out) {
		const float QPM = 0.01;  // q per world metre: MTN_Coordinates' object / 100
		N = normalize(N);
		// ---- rock: MTN_RockDetail (Mapping scale = Stretch on all axes, Noise Scale) + distortion
		float k = stretch * 0.10000000149011612;
		vec3 x = q * k;
		vec3 g0, g1, g2;
		mat3 H0, H1, H2;
		float n0 = bb_snoise_3d_h(x + bb_random_offset(0.0), g0, H0);
		float n1 = bb_snoise_3d_h(x + bb_random_offset(1.0), g1, H1);
		float n2 = bb_snoise_3d_h(x + bb_random_offset(2.0), g2, H2);
		vec3 y = x + turb * vec3(n0, n1, n2);
		mat3 J = mat3(1.0) + turb * transpose(mat3(g0, g1, g2));   // row i = e_i + D g_i
		float fw_y = bb_aa_strength * max(length(J * (dqx * k)), length(J * (dqy * k)));
		vec3 gF;
		mat3 HF;
		float rock = bb_noise_fbm_h(y, fw_y, 5.700000286102295, 0.643696665763855, 1.7000000476837158, true, gF, HF);
		vec3 gx = transpose(J) * gF;
		mat3 Hx = transpose(J) * HF * J + turb * (gF.x * H0 + gF.y * H1 + gF.z * H2);
		float sw = k * QPM;
		vec3 gR = gx * sw;
		mat3 HR = Hx * (sw * sw);
		float rock_scaled = (rock - 0.5) * coupling;
		// ---- micro relief -> slope, with the slope's exact gradient
		float ms = max(micro_s, 0.0);
		vec3 m = N - micro_d * (gR - N * dot(gR, N));
		float ml = max(length(m), 1e-20);
		vec3 nr = m / ml;
		vec3 w = N + ms * (nr - N);
		float wl = max(length(w), 1e-20);
		vec3 n1w = w / wl;
		float slope = n1w.z;
		vec3 qv = (vec3(0.0, 0.0, 1.0) - slope * n1w) / wl;
		vec3 v = (qv - nr * dot(nr, qv)) / ml;
		vec3 gSlope = -micro_d * ms * (HR * (v - N * dot(v, N)));
		// ---- snow noise (MTN_SnowField) and transition noise (MTN_SnowMask), with gradients
		float fq = bb_aa_strength * max(length(dqx), length(dqy));
		vec3 gs_y;
		float snow = bb_noise_fbm_g(q * snow_scale, fq * snow_scale, 2.0, 0.3499999940395355, 2.0, true, gs_y);
		vec3 gSnow = gs_y * (snow_scale * QPM);
		vec3 gt_y;
		float trans = bb_noise_fbm_g(q * trans_scale, fq * trans_scale, 4.0, 0.5, 2.0, true, gt_y);
		vec3 gTrans = gt_y * (trans_scale * QPM);
		// ---- snow mask: clamp(A(alt) S(slope) + (trans - 0.5) amount + RockScaled, 0, 1)
		float dA;
		float A = bb_mr_smooth_d(alt, snow_line - snow_w, snow_line + snow_w, dA);
		float dS;
		float S = bb_mr_smooth_d(slope, slope_max, slope_min, dS);
		vec3 gA = vec3(0.0, 0.0, QPM) * dA;   // Altitude = world z / 100
		float sm = A * S + (trans - 0.5) * trans_amt + rock_scaled;
		vec3 gsm = A * dS * gSlope + S * gA + trans_amt * gTrans + coupling * gR;
		float SF = clamp(sm, 0.0, 1.0);
		vec3 gSF = (sm > 0.0 && sm < 1.0) ? gsm : vec3(0.0);
		// ---- surface height and normal (SurfaceBump)
		vec3 gH = gR + SF * (gSnow - gR) + (snow - rock) * gSF;
		float bs = mix(rock_bs, snow_bs, SF);
		normal_out = bb_bump_normal(N, gH, surf_d, bs);
		slope_out = slope;
		snow_out = SF;
	}
	
	#endif
	
// GlobalExpression:5
	#ifndef BB_GENERATED_UNIFORMS
	#define BB_GENERATED_UNIFORMS
	uniform vec3 bb_gen_min = vec3(0.0);
	uniform vec3 bb_gen_size = vec3(1.0);
	uniform float bb_gen_from_uv = 0.0;
	uniform float bb_coord_scale = 1.0;
	uniform mat4 bb_world_to_object = mat4(1.0);
	uniform float bb_world_to_object_on = 0.0;
	#endif
	
// GlobalExpression:6
	#ifndef BB_NOISE_GRAD_HELPERS
	#define BB_NOISE_GRAD_HELPERS
	float bb_fade_d(float t) { return 30.0 * t * t * (t - 1.0) * (t - 1.0); }
	
	vec3 bb_grad3_vec(uint hash) {
		return vec3(bb_grad3(hash, 1.0, 0.0, 0.0), bb_grad3(hash, 0.0, 1.0, 0.0),
		            bb_grad3(hash, 0.0, 0.0, 1.0));
	}
	
	float bb_perlin_3d_g(vec3 p, out vec3 grad) {
		vec3 fl = floor(p);
		vec3 f = p - fl;
		ivec3 I = ivec3(fl);
		uint X = uint(I.x); uint Y = uint(I.y); uint Z = uint(I.z);
		uint X1 = X + 1u; uint Y1 = Y + 1u; uint Z1 = Z + 1u;
		uint h0 = bb_hash_uint3(X , Y , Z ); uint h1 = bb_hash_uint3(X1, Y , Z );
		uint h2 = bb_hash_uint3(X , Y1, Z ); uint h3 = bb_hash_uint3(X1, Y1, Z );
		uint h4 = bb_hash_uint3(X , Y , Z1); uint h5 = bb_hash_uint3(X1, Y , Z1);
		uint h6 = bb_hash_uint3(X , Y1, Z1); uint h7 = bb_hash_uint3(X1, Y1, Z1);
		float c0 = bb_grad3(h0, f.x      , f.y      , f.z      );
		float c1 = bb_grad3(h1, f.x - 1.0, f.y      , f.z      );
		float c2 = bb_grad3(h2, f.x      , f.y - 1.0, f.z      );
		float c3 = bb_grad3(h3, f.x - 1.0, f.y - 1.0, f.z      );
		float c4 = bb_grad3(h4, f.x      , f.y      , f.z - 1.0);
		float c5 = bb_grad3(h5, f.x - 1.0, f.y      , f.z - 1.0);
		float c6 = bb_grad3(h6, f.x      , f.y - 1.0, f.z - 1.0);
		float c7 = bb_grad3(h7, f.x - 1.0, f.y - 1.0, f.z - 1.0);
		float u = bb_fade(f.x);
		float v = bb_fade(f.y);
		float w = bb_fade(f.z);
		float x1 = 1.0 - u; float y1 = 1.0 - v; float z1 = 1.0 - w;
		vec3 lat = z1 * (y1 * (bb_grad3_vec(h0) * x1 + bb_grad3_vec(h1) * u)
		                 + v * (bb_grad3_vec(h2) * x1 + bb_grad3_vec(h3) * u))
		         + w  * (y1 * (bb_grad3_vec(h4) * x1 + bb_grad3_vec(h5) * u)
		                 + v * (bb_grad3_vec(h6) * x1 + bb_grad3_vec(h7) * u));
		float e0 = c0 * x1 + c1 * u; float e1 = c2 * x1 + c3 * u;
		float e2 = c4 * x1 + c5 * u; float e3 = c6 * x1 + c7 * u;
		float du = z1 * (y1 * (c1 - c0) + v * (c3 - c2)) + w * (y1 * (c5 - c4) + v * (c7 - c6));
		float dv = z1 * (e1 - e0) + w * (e3 - e2);
		float dw = (y1 * e2 + v * e3) - (y1 * e0 + v * e1);
		grad = lat + vec3(du * bb_fade_d(f.x), dv * bb_fade_d(f.y), dw * bb_fade_d(f.z));
		return bb_tri_mix(c0, c1, c2, c3, c4, c5, c6, c7, u, v, w);
	}
	
	float bb_snoise_3d_g(vec3 p, out vec3 grad) {
		vec3 corr = 0.5 * vec3(greaterThanEqual(abs(p), vec3(1000000.0)));
		p = bb_fmod3(p, 100000.0) + corr;
		vec3 g;
		float r = 0.9820 * bb_perlin_3d_g(p, g);
		grad = 0.9820 * g;
		return r;
	}
	
	// fw: the noise coordinate's screen footprint (NOISE_AA_HELPERS_GLSL). The
	// octave weights are bb_noise_fbm_aa's, so value and gradient describe the SAME
	// faded function; a weight is treated as locally constant (it varies with the
	// footprint, not with p). At fw = 0 every weight is exactly 1.
	float bb_noise_fbm_g(vec3 p, float fw, float detail, float roughness, float lacunarity,
	                     bool normalize_, out vec3 grad) {
		float fscale = 1.0;
		float amp = 1.0;
		float maxamp = 0.0;
		float sum = 0.0;
		vec3 gsum = vec3(0.0);
		int n = int(detail);
		for (int i = 0; i <= n && i < 16; i++) {
			float w = bb_octave_w(fw * fscale);
			vec3 g = vec3(0.0);
			float t = (w > 0.0) ? bb_snoise_3d_g(fscale * p, g) : 0.0;
			sum += t * amp * w;
			gsum += g * (amp * w * fscale);
			maxamp += amp;
			amp *= roughness;
			fscale *= lacunarity;
		}
		float rmd = detail - floor(detail);
		if (rmd != 0.0) {
			float w = bb_octave_w(fw * fscale);
			vec3 g = vec3(0.0);
			float t = (w > 0.0) ? bb_snoise_3d_g(fscale * p, g) : 0.0;
			float sum2 = sum + t * amp * w;
			vec3 gsum2 = gsum + g * (amp * w * fscale);
			if (normalize_) {
				grad = mix(0.5 * gsum / maxamp, 0.5 * gsum2 / (maxamp + amp), rmd);
				return mix(0.5 * sum / maxamp + 0.5, 0.5 * sum2 / (maxamp + amp) + 0.5, rmd);
			}
			grad = mix(gsum, gsum2, rmd);
			return mix(sum, sum2, rmd);
		}
		grad = normalize_ ? 0.5 * gsum / maxamp : gsum;
		return normalize_ ? 0.5 * sum / maxamp + 0.5 : sum;
	}
	
	#endif
	
// GlobalExpression:7
	#ifndef BB_NOISE_HESS_HELPERS
	#define BB_NOISE_HESS_HELPERS
	float bb_fade_dd(float t) { return 60.0 * t * (t - 1.0) * (2.0 * t - 1.0); }
	
	float bb_perlin_3d_h(vec3 p, out vec3 grad, out mat3 hess) {
		vec3 fl = floor(p);
		vec3 f = p - fl;
		ivec3 I = ivec3(fl);
		uint X = uint(I.x); uint Y = uint(I.y); uint Z = uint(I.z);
		uint X1 = X + 1u; uint Y1 = Y + 1u; uint Z1 = Z + 1u;
		uint h0 = bb_hash_uint3(X , Y , Z ); uint h1 = bb_hash_uint3(X1, Y , Z );
		uint h2 = bb_hash_uint3(X , Y1, Z ); uint h3 = bb_hash_uint3(X1, Y1, Z );
		uint h4 = bb_hash_uint3(X , Y , Z1); uint h5 = bb_hash_uint3(X1, Y , Z1);
		uint h6 = bb_hash_uint3(X , Y1, Z1); uint h7 = bb_hash_uint3(X1, Y1, Z1);
		float c0 = bb_grad3(h0, f.x      , f.y      , f.z      );
		float c1 = bb_grad3(h1, f.x - 1.0, f.y      , f.z      );
		float c2 = bb_grad3(h2, f.x      , f.y - 1.0, f.z      );
		float c3 = bb_grad3(h3, f.x - 1.0, f.y - 1.0, f.z      );
		float c4 = bb_grad3(h4, f.x      , f.y      , f.z - 1.0);
		float c5 = bb_grad3(h5, f.x - 1.0, f.y      , f.z - 1.0);
		float c6 = bb_grad3(h6, f.x      , f.y - 1.0, f.z - 1.0);
		float c7 = bb_grad3(h7, f.x - 1.0, f.y - 1.0, f.z - 1.0);
		float u = bb_fade(f.x);
		float v = bb_fade(f.y);
		float w = bb_fade(f.z);
		float x1 = 1.0 - u; float y1 = 1.0 - v; float z1 = 1.0 - w;
		vec3 G0 = bb_grad3_vec(h0); vec3 G1 = bb_grad3_vec(h1);
		vec3 G2 = bb_grad3_vec(h2); vec3 G3 = bb_grad3_vec(h3);
		vec3 G4 = bb_grad3_vec(h4); vec3 G5 = bb_grad3_vec(h5);
		vec3 G6 = bb_grad3_vec(h6); vec3 G7 = bb_grad3_vec(h7);
		vec3 lat = z1 * (y1 * (G0 * x1 + G1 * u) + v * (G2 * x1 + G3 * u))
		         + w  * (y1 * (G4 * x1 + G5 * u) + v * (G6 * x1 + G7 * u));
		float e0 = c0 * x1 + c1 * u; float e1 = c2 * x1 + c3 * u;
		float e2 = c4 * x1 + c5 * u; float e3 = c6 * x1 + c7 * u;
		float du = z1 * (y1 * (c1 - c0) + v * (c3 - c2)) + w * (y1 * (c5 - c4) + v * (c7 - c6));
		float dv = z1 * (e1 - e0) + w * (e3 - e2);
		float dw = (y1 * e2 + v * e3) - (y1 * e0 + v * e1);
		vec3 s1 = vec3(bb_fade_d(f.x), bb_fade_d(f.y), bb_fade_d(f.z));
		vec3 s2 = vec3(bb_fade_dd(f.x), bb_fade_dd(f.y), bb_fade_dd(f.z));
		grad = lat + vec3(du, dv, dw) * s1;
		vec4 A0 = vec4(G0, c0); vec4 A1 = vec4(G1, c1); vec4 A2 = vec4(G2, c2); vec4 A3 = vec4(G3, c3);
		vec4 A4 = vec4(G4, c4); vec4 A5 = vec4(G5, c5); vec4 A6 = vec4(G6, c6); vec4 A7 = vec4(G7, c7);
		vec4 a00 = A0 * x1 + A1 * u; vec4 a10 = A2 * x1 + A3 * u;
		vec4 a01 = A4 * x1 + A5 * u; vec4 a11 = A6 * x1 + A7 * u;
		vec4 d00 = A1 - A0; vec4 d10 = A3 - A2; vec4 d01 = A5 - A4; vec4 d11 = A7 - A6;
		vec4 Tu = z1 * (y1 * d00 + v * d10) + w * (y1 * d01 + v * d11);
		vec4 Tv = z1 * (a10 - a00) + w * (a11 - a01);
		vec4 Tw = (y1 * a01 + v * a11) - (y1 * a00 + v * a10);
		float Tuv = z1 * (d10.w - d00.w) + w * (d11.w - d01.w);
		float Tuw = (y1 * d01.w + v * d11.w) - (y1 * d00.w + v * d10.w);
		float Tvw = (a11.w - a01.w) - (a10.w - a00.w);
		float hxx = 2.0 * Tu.x * s1.x + Tu.w * s2.x;
		float hyy = 2.0 * Tv.y * s1.y + Tv.w * s2.y;
		float hzz = 2.0 * Tw.z * s1.z + Tw.w * s2.z;
		float hxy = Tv.x * s1.y + Tu.y * s1.x + Tuv * s1.x * s1.y;
		float hxz = Tw.x * s1.z + Tu.z * s1.x + Tuw * s1.x * s1.z;
		float hyz = Tw.y * s1.z + Tv.z * s1.y + Tvw * s1.y * s1.z;
		hess = mat3(vec3(hxx, hxy, hxz), vec3(hxy, hyy, hyz), vec3(hxz, hyz, hzz));
		return bb_tri_mix(c0, c1, c2, c3, c4, c5, c6, c7, u, v, w);
	}
	
	float bb_snoise_3d_h(vec3 p, out vec3 grad, out mat3 hess) {
		vec3 corr = 0.5 * vec3(greaterThanEqual(abs(p), vec3(1000000.0)));
		p = bb_fmod3(p, 100000.0) + corr;
		vec3 g;
		mat3 H;
		float r = 0.9820 * bb_perlin_3d_h(p, g, H);
		grad = 0.9820 * g;
		hess = 0.9820 * H;
		return r;
	}
	
	float bb_noise_fbm_h(vec3 p, float fw, float detail, float roughness, float lacunarity,
	                     bool normalize_, out vec3 grad, out mat3 hess) {
		float fscale = 1.0;
		float amp = 1.0;
		float maxamp = 0.0;
		float sum = 0.0;
		vec3 gsum = vec3(0.0);
		mat3 hsum = mat3(0.0);
		int n = int(detail);
		for (int i = 0; i <= n && i < 16; i++) {
			float w = bb_octave_w(fw * fscale);
			vec3 g = vec3(0.0);
			mat3 H = mat3(0.0);
			float t = (w > 0.0) ? bb_snoise_3d_h(fscale * p, g, H) : 0.0;
			sum += t * amp * w;
			gsum += g * (amp * w * fscale);
			hsum += H * (amp * w * fscale * fscale);
			maxamp += amp;
			amp *= roughness;
			fscale *= lacunarity;
		}
		float rmd = detail - floor(detail);
		if (rmd != 0.0) {
			float w = bb_octave_w(fw * fscale);
			vec3 g = vec3(0.0);
			mat3 H = mat3(0.0);
			float t = (w > 0.0) ? bb_snoise_3d_h(fscale * p, g, H) : 0.0;
			float sum2 = sum + t * amp * w;
			vec3 gsum2 = gsum + g * (amp * w * fscale);
			mat3 hsum2 = hsum + H * (amp * w * fscale * fscale);
			if (normalize_) {
				grad = mix(0.5 * gsum / maxamp, 0.5 * gsum2 / (maxamp + amp), rmd);
				hess = (0.5 * (1.0 - rmd) / maxamp) * hsum + (0.5 * rmd / (maxamp + amp)) * hsum2;
				return mix(0.5 * sum / maxamp + 0.5, 0.5 * sum2 / (maxamp + amp) + 0.5, rmd);
			}
			grad = mix(gsum, gsum2, rmd);
			hess = (1.0 - rmd) * hsum + rmd * hsum2;
			return mix(sum, sum2, rmd);
		}
		grad = normalize_ ? 0.5 * gsum / maxamp : gsum;
		hess = normalize_ ? (0.5 / maxamp) * hsum : hsum;
		return normalize_ ? 0.5 * sum / maxamp + 0.5 : sum;
	}
	
	#endif
	
// GlobalExpression:8
	#ifndef BB_NOISE_HELPERS
	#define BB_NOISE_HELPERS
	uint bb_rotl(uint x, uint k) { return (x << k) | (x >> (32u - k)); }
	
	void bb_final(inout uint a, inout uint b, inout uint c) {
		c ^= b; c -= bb_rotl(b, 14u);
		a ^= c; a -= bb_rotl(c, 11u);
		b ^= a; b -= bb_rotl(a, 25u);
		c ^= b; c -= bb_rotl(b, 16u);
		a ^= c; a -= bb_rotl(c, 4u);
		b ^= a; b -= bb_rotl(a, 14u);
		c ^= b; c -= bb_rotl(b, 24u);
	}
	
	uint bb_hash_uint2(uint kx, uint ky) {
		uint a, b, c;
		a = b = c = 0xdeadbeefu + (2u << 2u) + 13u;
		b += ky; a += kx;
		bb_final(a, b, c);
		return c;
	}
	
	uint bb_hash_uint3(uint kx, uint ky, uint kz) {
		uint a, b, c;
		a = b = c = 0xdeadbeefu + (3u << 2u) + 13u;
		c += kz; b += ky; a += kx;
		bb_final(a, b, c);
		return c;
	}
	
	float bb_hash_float2_to_float(vec2 k) {
		return float(bb_hash_uint2(floatBitsToUint(k.x), floatBitsToUint(k.y)))
		       * (1.0 / 4294967295.0);
	}
	
	vec3 bb_random_offset(float seed) {
		return vec3(100.0 + bb_hash_float2_to_float(vec2(seed, 0.0)) * 100.0,
		            100.0 + bb_hash_float2_to_float(vec2(seed, 1.0)) * 100.0,
		            100.0 + bb_hash_float2_to_float(vec2(seed, 2.0)) * 100.0);
	}
	
	float bb_fade(float t) { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); }
	
	float bb_negate_if(float val, bool cond) { return cond ? -val : val; }
	
	float bb_grad3(uint hash, float x, float y, float z) {
		uint h = hash & 15u;
		float u = h < 8u ? x : y;
		float vt = ((h == 12u) || (h == 14u)) ? x : z;
		float v = h < 4u ? y : vt;
		return bb_negate_if(u, (h & 1u) != 0u) + bb_negate_if(v, (h & 2u) != 0u);
	}
	
	float bb_tri_mix(float v0, float v1, float v2, float v3,
	                 float v4, float v5, float v6, float v7,
	                 float x, float y, float z) {
		float x1 = 1.0 - x;
		float y1 = 1.0 - y;
		float z1 = 1.0 - z;
		return z1 * (y1 * (v0 * x1 + v1 * x) + y * (v2 * x1 + v3 * x)) +
		       z  * (y1 * (v4 * x1 + v5 * x) + y * (v6 * x1 + v7 * x));
	}
	
	float bb_perlin_3d(vec3 p) {
		vec3 fl = floor(p);
		vec3 f = p - fl;
		ivec3 I = ivec3(fl);
		uint X = uint(I.x); uint Y = uint(I.y); uint Z = uint(I.z);
		uint X1 = X + 1u; uint Y1 = Y + 1u; uint Z1 = Z + 1u;
		float u = bb_fade(f.x);
		float v = bb_fade(f.y);
		float w = bb_fade(f.z);
		return bb_tri_mix(
			bb_grad3(bb_hash_uint3(X , Y , Z ), f.x      , f.y      , f.z      ),
			bb_grad3(bb_hash_uint3(X1, Y , Z ), f.x - 1.0, f.y      , f.z      ),
			bb_grad3(bb_hash_uint3(X , Y1, Z ), f.x      , f.y - 1.0, f.z      ),
			bb_grad3(bb_hash_uint3(X1, Y1, Z ), f.x - 1.0, f.y - 1.0, f.z      ),
			bb_grad3(bb_hash_uint3(X , Y , Z1), f.x      , f.y      , f.z - 1.0),
			bb_grad3(bb_hash_uint3(X1, Y , Z1), f.x - 1.0, f.y      , f.z - 1.0),
			bb_grad3(bb_hash_uint3(X , Y1, Z1), f.x      , f.y - 1.0, f.z - 1.0),
			bb_grad3(bb_hash_uint3(X1, Y1, Z1), f.x - 1.0, f.y - 1.0, f.z - 1.0),
			u, v, w);
	}
	
	// C fmod truncates toward zero. GLSL mod() floors. Not interchangeable.
	float bb_fmod1(float x, float y) { return x - y * trunc(x / y); }
	vec3 bb_fmod3(vec3 p, float y) {
		return vec3(bb_fmod1(p.x, y), bb_fmod1(p.y, y), bb_fmod1(p.z, y));
	}
	
	float bb_snoise_3d(vec3 p) {
		vec3 corr = 0.5 * vec3(greaterThanEqual(abs(p), vec3(1000000.0)));
		p = bb_fmod3(p, 100000.0) + corr;
		return 0.9820 * bb_perlin_3d(p);  // noise_scale3
	}
	
	float bb_noise_3d(vec3 p) { return 0.5 * bb_snoise_3d(p) + 0.5; }
	
	float bb_noise_fbm(vec3 p, float detail, float roughness, float lacunarity,
	                   bool normalize_) {
		float fscale = 1.0;
		float amp = 1.0;
		float maxamp = 0.0;
		float sum = 0.0;
		int n = int(detail);
		for (int i = 0; i <= n && i < 16; i++) {
			float t = bb_snoise_3d(fscale * p);
			sum += t * amp;
			maxamp += amp;
			amp *= roughness;
			fscale *= lacunarity;
		}
		float rmd = detail - floor(detail);
		if (rmd != 0.0) {
			float t = bb_snoise_3d(fscale * p);
			float sum2 = sum + t * amp;
			return normalize_
				? mix(0.5 * sum / maxamp + 0.5, 0.5 * sum2 / (maxamp + amp) + 0.5, rmd)
				: mix(sum, sum2, rmd);
		}
		return normalize_ ? 0.5 * sum / maxamp + 0.5 : sum;
	}
	
	vec3 bb_noise_distort(vec3 p, float distortion) {
		if (distortion == 0.0) { return p; }
		return p + vec3(bb_snoise_3d(p + bb_random_offset(0.0)) * distortion,
		                bb_snoise_3d(p + bb_random_offset(1.0)) * distortion,
		                bb_snoise_3d(p + bb_random_offset(2.0)) * distortion);
	}
	
	#endif
	
// GlobalExpression:9
	#ifndef BB_NOISE_AA_HELPERS
	#define BB_NOISE_AA_HELPERS
	uniform float bb_aa_strength : hint_range(0.0, 1.0) = 1.0;
	
	float bb_footprint(vec3 q) { return max(length(dFdx(q)), length(dFdy(q))); }
	
	float bb_octave_w(float x) { return 1.0 - smoothstep(0.7, 1.4, x); }
	
	float bb_noise_fbm_aa(vec3 p, float fw, float detail, float roughness, float lacunarity,
	                      bool normalize_) {
		float fscale = 1.0;
		float amp = 1.0;
		float maxamp = 0.0;
		float sum = 0.0;
		int n = int(detail);
		for (int i = 0; i <= n && i < 16; i++) {
			float w = bb_octave_w(fw * fscale);
			float t = (w > 0.0) ? bb_snoise_3d(fscale * p) : 0.0;
			sum += t * amp * w;
			maxamp += amp;
			amp *= roughness;
			fscale *= lacunarity;
		}
		float rmd = detail - floor(detail);
		if (rmd != 0.0) {
			float w = bb_octave_w(fw * fscale);
			float t = (w > 0.0) ? bb_snoise_3d(fscale * p) : 0.0;
			float sum2 = sum + t * amp * w;
			return normalize_
				? mix(0.5 * sum / maxamp + 0.5, 0.5 * sum2 / (maxamp + amp) + 0.5, rmd)
				: mix(sum, sum2, rmd);
		}
		return normalize_ ? 0.5 * sum / maxamp + 0.5 : sum;
	}
	
	#endif
	
// GlobalExpression:10
	#ifndef BB_NOISE_HELPERS
	#define BB_NOISE_HELPERS
	uint bb_rotl(uint x, uint k) { return (x << k) | (x >> (32u - k)); }
	
	void bb_final(inout uint a, inout uint b, inout uint c) {
		c ^= b; c -= bb_rotl(b, 14u);
		a ^= c; a -= bb_rotl(c, 11u);
		b ^= a; b -= bb_rotl(a, 25u);
		c ^= b; c -= bb_rotl(b, 16u);
		a ^= c; a -= bb_rotl(c, 4u);
		b ^= a; b -= bb_rotl(a, 14u);
		c ^= b; c -= bb_rotl(b, 24u);
	}
	
	uint bb_hash_uint2(uint kx, uint ky) {
		uint a, b, c;
		a = b = c = 0xdeadbeefu + (2u << 2u) + 13u;
		b += ky; a += kx;
		bb_final(a, b, c);
		return c;
	}
	
	uint bb_hash_uint3(uint kx, uint ky, uint kz) {
		uint a, b, c;
		a = b = c = 0xdeadbeefu + (3u << 2u) + 13u;
		c += kz; b += ky; a += kx;
		bb_final(a, b, c);
		return c;
	}
	
	float bb_hash_float2_to_float(vec2 k) {
		return float(bb_hash_uint2(floatBitsToUint(k.x), floatBitsToUint(k.y)))
		       * (1.0 / 4294967295.0);
	}
	
	vec3 bb_random_offset(float seed) {
		return vec3(100.0 + bb_hash_float2_to_float(vec2(seed, 0.0)) * 100.0,
		            100.0 + bb_hash_float2_to_float(vec2(seed, 1.0)) * 100.0,
		            100.0 + bb_hash_float2_to_float(vec2(seed, 2.0)) * 100.0);
	}
	
	float bb_fade(float t) { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); }
	
	float bb_negate_if(float val, bool cond) { return cond ? -val : val; }
	
	float bb_grad3(uint hash, float x, float y, float z) {
		uint h = hash & 15u;
		float u = h < 8u ? x : y;
		float vt = ((h == 12u) || (h == 14u)) ? x : z;
		float v = h < 4u ? y : vt;
		return bb_negate_if(u, (h & 1u) != 0u) + bb_negate_if(v, (h & 2u) != 0u);
	}
	
	float bb_tri_mix(float v0, float v1, float v2, float v3,
	                 float v4, float v5, float v6, float v7,
	                 float x, float y, float z) {
		float x1 = 1.0 - x;
		float y1 = 1.0 - y;
		float z1 = 1.0 - z;
		return z1 * (y1 * (v0 * x1 + v1 * x) + y * (v2 * x1 + v3 * x)) +
		       z  * (y1 * (v4 * x1 + v5 * x) + y * (v6 * x1 + v7 * x));
	}
	
	float bb_perlin_3d(vec3 p) {
		vec3 fl = floor(p);
		vec3 f = p - fl;
		ivec3 I = ivec3(fl);
		uint X = uint(I.x); uint Y = uint(I.y); uint Z = uint(I.z);
		uint X1 = X + 1u; uint Y1 = Y + 1u; uint Z1 = Z + 1u;
		float u = bb_fade(f.x);
		float v = bb_fade(f.y);
		float w = bb_fade(f.z);
		return bb_tri_mix(
			bb_grad3(bb_hash_uint3(X , Y , Z ), f.x      , f.y      , f.z      ),
			bb_grad3(bb_hash_uint3(X1, Y , Z ), f.x - 1.0, f.y      , f.z      ),
			bb_grad3(bb_hash_uint3(X , Y1, Z ), f.x      , f.y - 1.0, f.z      ),
			bb_grad3(bb_hash_uint3(X1, Y1, Z ), f.x - 1.0, f.y - 1.0, f.z      ),
			bb_grad3(bb_hash_uint3(X , Y , Z1), f.x      , f.y      , f.z - 1.0),
			bb_grad3(bb_hash_uint3(X1, Y , Z1), f.x - 1.0, f.y      , f.z - 1.0),
			bb_grad3(bb_hash_uint3(X , Y1, Z1), f.x      , f.y - 1.0, f.z - 1.0),
			bb_grad3(bb_hash_uint3(X1, Y1, Z1), f.x - 1.0, f.y - 1.0, f.z - 1.0),
			u, v, w);
	}
	
	// C fmod truncates toward zero. GLSL mod() floors. Not interchangeable.
	float bb_fmod1(float x, float y) { return x - y * trunc(x / y); }
	vec3 bb_fmod3(vec3 p, float y) {
		return vec3(bb_fmod1(p.x, y), bb_fmod1(p.y, y), bb_fmod1(p.z, y));
	}
	
	float bb_snoise_3d(vec3 p) {
		vec3 corr = 0.5 * vec3(greaterThanEqual(abs(p), vec3(1000000.0)));
		p = bb_fmod3(p, 100000.0) + corr;
		return 0.9820 * bb_perlin_3d(p);  // noise_scale3
	}
	
	float bb_noise_3d(vec3 p) { return 0.5 * bb_snoise_3d(p) + 0.5; }
	
	float bb_noise_fbm(vec3 p, float detail, float roughness, float lacunarity,
	                   bool normalize_) {
		float fscale = 1.0;
		float amp = 1.0;
		float maxamp = 0.0;
		float sum = 0.0;
		int n = int(detail);
		for (int i = 0; i <= n && i < 16; i++) {
			float t = bb_snoise_3d(fscale * p);
			sum += t * amp;
			maxamp += amp;
			amp *= roughness;
			fscale *= lacunarity;
		}
		float rmd = detail - floor(detail);
		if (rmd != 0.0) {
			float t = bb_snoise_3d(fscale * p);
			float sum2 = sum + t * amp;
			return normalize_
				? mix(0.5 * sum / maxamp + 0.5, 0.5 * sum2 / (maxamp + amp) + 0.5, rmd)
				: mix(sum, sum2, rmd);
		}
		return normalize_ ? 0.5 * sum / maxamp + 0.5 : sum;
	}
	
	vec3 bb_noise_distort(vec3 p, float distortion) {
		if (distortion == 0.0) { return p; }
		return p + vec3(bb_snoise_3d(p + bb_random_offset(0.0)) * distortion,
		                bb_snoise_3d(p + bb_random_offset(1.0)) * distortion,
		                bb_snoise_3d(p + bb_random_offset(2.0)) * distortion);
	}
	
	#endif
	
// GlobalExpression:11
	#ifndef BB_NOISE_AA_HELPERS
	#define BB_NOISE_AA_HELPERS
	uniform float bb_aa_strength : hint_range(0.0, 1.0) = 1.0;
	
	float bb_footprint(vec3 q) { return max(length(dFdx(q)), length(dFdy(q))); }
	
	float bb_octave_w(float x) { return 1.0 - smoothstep(0.7, 1.4, x); }
	
	float bb_noise_fbm_aa(vec3 p, float fw, float detail, float roughness, float lacunarity,
	                      bool normalize_) {
		float fscale = 1.0;
		float amp = 1.0;
		float maxamp = 0.0;
		float sum = 0.0;
		int n = int(detail);
		for (int i = 0; i <= n && i < 16; i++) {
			float w = bb_octave_w(fw * fscale);
			float t = (w > 0.0) ? bb_snoise_3d(fscale * p) : 0.0;
			sum += t * amp * w;
			maxamp += amp;
			amp *= roughness;
			fscale *= lacunarity;
		}
		float rmd = detail - floor(detail);
		if (rmd != 0.0) {
			float w = bb_octave_w(fw * fscale);
			float t = (w > 0.0) ? bb_snoise_3d(fscale * p) : 0.0;
			float sum2 = sum + t * amp * w;
			return normalize_
				? mix(0.5 * sum / maxamp + 0.5, 0.5 * sum2 / (maxamp + amp) + 0.5, rmd)
				: mix(sum, sum2, rmd);
		}
		return normalize_ ? 0.5 * sum / maxamp + 0.5 : sum;
	}
	
	#endif
	
// GlobalExpression:12
	#ifndef BB_MTN_FINISH
	#define BB_MTN_FINISH
	void bb_mtn_finish(float alt, vec3 N, vec3 gR, vec3 gDiff, vec3 G1, vec3 gSlope, float T, float D,
			float micro_s, float micro_d, float snow_line, float snow_w, float slope_max, float slope_min,
			float rock_bs, float snow_bs, float surf_d,
			out vec3 normal_out, out float slope_out, out float snow_out) {
		const float QPM = 0.01;
		N = normalize(N);
		float ms = max(micro_s, 0.0);
		vec3 m = N - micro_d * (gR - N * dot(gR, N));
		float ml = max(length(m), 1e-20);
		vec3 nr = m / ml;
		vec3 w = N + ms * (nr - N);
		float wl = max(length(w), 1e-20);
		float slope = (w / wl).z;
		float dA;
		float A = bb_mr_smooth_d(alt, snow_line - snow_w, snow_line + snow_w, dA);
		float dS;
		float S = bb_mr_smooth_d(slope, slope_max, slope_min, dS);
		vec3 gA = vec3(0.0, 0.0, QPM) * dA;
		float sm = A * S + T;
		vec3 gsm = A * dS * gSlope + S * gA + G1;
		float SF = clamp(sm, 0.0, 1.0);
		vec3 gSF = (sm > 0.0 && sm < 1.0) ? gsm : vec3(0.0);
		vec3 gH = gR + SF * gDiff + D * gSF;
		float bs = mix(rock_bs, snow_bs, SF);
		normal_out = bb_bump_normal(N, gH, surf_d, bs);
		slope_out = slope;
		snow_out = SF;
	}
	
	#endif
	

void vertex() {
// Input:2
	vec4 n_out2p0 = CUSTOM0;


// VaryingSetter:3
	var_bb_mk0 = n_out2p0;


// Input:4
	vec4 n_out4p0 = CUSTOM1;


// VaryingSetter:5
	var_bb_mk1 = n_out4p0;


// Input:6
	vec4 n_out6p0 = CUSTOM2;


// VaryingSetter:7
	var_bb_mk2 = n_out6p0;


// Input:8
	vec4 n_out8p0 = CUSTOM3;


// VaryingSetter:9
	var_bb_mk3 = n_out8p0;


}

void fragment() {
	vec3 n_out8p0;
	vec3 n_out8p1;
	vec3 n_out8p2;
	vec3 n_out8p3;
// Expression:8
	n_out8p0 = vec3(0.0, 0.0, 0.0);
	n_out8p1 = vec3(0.0, 0.0, 0.0);
	n_out8p2 = vec3(0.0, 0.0, 0.0);
	n_out8p3 = vec3(0.0, 0.0, 0.0);
	{
		vec3 _gwp = (INV_VIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
		vec3 _gwn = normalize((INV_VIEW_MATRIX * vec4(NORMAL, 0.0)).xyz);
		vec3 _wp = vec3(-_gwp.x, _gwp.z, _gwp.y);
		vec3 _wn = vec3(-_gwn.x, _gwn.z, _gwn.y);
		// ⛔ MODEL_MATRIX IS NOT ALWAYS THE OBJECT'S. A consumer that
		// draws this material on STREAMED CHUNKS -- dc-terrain -- gives
		// each chunk its own instance with CHUNK-LOCAL vertices, so
		// inverse(MODEL_MATRIX) yields the position within that chunk
		// (0..64 m, resetting at every boundary) instead of a coordinate
		// that spans the asset. Generated is then very nearly constant
		// and the material renders as a flat wash, with nothing wrong
		// anywhere to see. Such a consumer sets bb_world_to_object and
		// turns the flag on; everything else keeps MODEL_MATRIX.
		mat4 _w2o = (bb_world_to_object_on > 0.5)
				? bb_world_to_object : inverse(MODEL_MATRIX);
		vec3 _lp = (_w2o * vec4(_gwp, 1.0)).xyz * bb_coord_scale;
		vec3 _op = vec3(-_lp.x, _lp.z, _lp.y);
		// Generated is the position normalised over the object's bounding
		// box, 0..1. Object space was substituted for it for a long time,
		// which is the SAME SHAPE but the wrong SCALE: on a 40-unit mountain
		// every noise frequency came out ~40x too coarse, which reads as
		// large blotches and missing fine detail. The bounds arrive as
		// uniforms because a shader cannot know the mesh AABB.
		// ⛔ GENERATED IS THE UNDISPLACED POSITION, NOT THIS ONE.
		// Blender normalises the position a point had BEFORE
		// displacement. On a displaced mesh that is a DIFFERENT point
		// from the one being shaded, so no choice of bounding box can
		// recover it from _lp -- measured: undeformed box 0.785,
		// evaluated box 0.360, and the two agree exactly on the FLAT
		// parts and diverge only where the mesh is displaced. It has to
		// be carried per-vertex; proc-nodes captures it at SetPosition.
		vec3 _orco = (bb_gen_from_uv > 0.5) ? vec3(UV, UV2.x) : _lp;
		vec3 _gg = (_orco - bb_gen_min) / max(bb_gen_size, vec3(1e-6));
		// ...and normalised coordinates take the axis change too. A NEGATED
		// axis becomes 1 - t, not -t, because the value is already a
		// fraction of the box rather than a position.
		n_out8p0 = vec3(1.0 - _gg.x, _gg.z, _gg.y);
		n_out8p1 = _wn;
		n_out8p2 = vec3(UV, 0.0);
		n_out8p3 = _op;
	}


	vec3 n_out10p0;
// Expression:10
	vec3 n_in10p1 = vec3(0.00000, 0.00000, 0.00000);
	vec3 n_in10p2 = vec3(0.00000, 0.00000, 0.00000);
	float n_in10p3 = 0.01000;
	n_out10p0 = vec3(0.0, 0.0, 0.0);
	{
		n_out10p0 = n_out8p3 * n_in10p3;
	}


	vec3 n_out9p0;
	vec3 n_out9p1;
// Expression:9
	n_out9p0 = vec3(0.0, 0.0, 0.0);
	n_out9p1 = vec3(0.0, 0.0, 0.0);
	{
		vec3 _gwp = (INV_VIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
		vec3 _gwn = normalize((INV_VIEW_MATRIX * vec4(NORMAL, 0.0)).xyz);
		vec3 _wp = vec3(-_gwp.x, _gwp.z, _gwp.y);
		vec3 _wn = vec3(-_gwn.x, _gwn.z, _gwn.y);
		n_out9p0 = _wp;
		n_out9p1 = _wn;
	}


	vec3 n_out11p0;
// Expression:11
	vec3 n_in11p1 = vec3(0.00000, 0.00000, 0.00000);
	vec3 n_in11p2 = vec3(0.00000, 0.00000, 0.00000);
	float n_in11p3 = 0.01000;
	n_out11p0 = vec3(0.0, 0.0, 0.0);
	{
		n_out11p0 = n_out9p0 * n_in11p3;
	}


// VectorDecompose:12
	float n_out12p0 = n_out11p0.x;
	float n_out12p1 = n_out11p0.y;
	float n_out12p2 = n_out11p0.z;


	float n_out19p0;
// Expression:19
	n_out19p0 = 0.0;
	{
		n_out19p0 = 2.9700000286102295;
	}


	float n_out20p0;
// Expression:20
	n_out20p0 = 0.0;
	{
		n_out20p0 = 1.7799999713897705;
	}


	float n_out21p0;
// Expression:21
	n_out21p0 = 0.0;
	{
		n_out21p0 = 0.6100000143051147;
	}


	float n_out22p0;
// Expression:22
	n_out22p0 = 0.0;
	{
		n_out22p0 = 2.3399999141693115;
	}


	float n_out23p0;
// Expression:23
	n_out23p0 = 0.0;
	{
		n_out23p0 = 35.0;
	}


	float n_out24p0;
// Expression:24
	n_out24p0 = 0.0;
	{
		n_out24p0 = 0.10000000149011612;
	}


	float n_out25p0;
// Expression:25
	n_out25p0 = 0.0;
	{
		n_out25p0 = 6.320000648498535;
	}


	float n_out26p0;
// Expression:26
	n_out26p0 = 0.0;
	{
		n_out26p0 = 4.400000095367432;
	}


	float n_out27p0;
// Expression:27
	n_out27p0 = 0.0;
	{
		n_out27p0 = 0.550000011920929;
	}


	float n_out28p0;
// Expression:28
	n_out28p0 = 0.0;
	{
		n_out28p0 = 0.7599999904632568;
	}


	float n_out29p0;
// Expression:29
	n_out29p0 = 0.0;
	{
		n_out29p0 = 0.15000000596046448;
	}


	float n_out30p0;
// Expression:30
	n_out30p0 = 0.0;
	{
		n_out30p0 = 0.4899999797344208;
	}


	float n_out31p0;
// Expression:31
	n_out31p0 = 0.0;
	{
		n_out31p0 = 0.800000011920929;
	}


	float n_out32p0;
// Expression:32
	n_out32p0 = 0.0;
	{
		n_out32p0 = 0.550000011920929;
	}


	float n_out33p0;
// Expression:33
	n_out33p0 = 0.0;
	{
		n_out33p0 = 0.15000000596046448;
	}


	float n_out34p0;
// Expression:34
	n_out34p0 = 0.0;
	{
		n_out34p0 = 149.99998474121094;
	}


	float n_out35p0;
// Expression:35
	n_out35p0 = 0.0;
	{
		n_out35p0 = 0.10000000149011612;
	}


	float n_out36p0;
// Expression:36
	n_out36p0 = 0.0;
	{
		n_out36p0 = 1.0;
	}


// VaryingGetter:80
	vec4 n_out80p0 = var_bb_mk0;


// VaryingGetter:81
	vec4 n_out81p0 = var_bb_mk1;


// VaryingGetter:82
	vec4 n_out82p0 = var_bb_mk2;


// VaryingGetter:83
	vec4 n_out83p0 = var_bb_mk3;


	vec3 n_out13p0;
	float n_out13p1;
	float n_out13p2;
// Expression:13
	n_out13p0 = vec3(0.0, 0.0, 0.0);
	n_out13p1 = 0.0;
	n_out13p2 = 0.0;
	{
		vec3 _gwp = (INV_VIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
		vec3 _gwn = normalize((INV_VIEW_MATRIX * vec4(NORMAL, 0.0)).xyz);
		vec3 _wp = vec3(-_gwp.x, _gwp.z, _gwp.y);
		vec3 _wn = vec3(-_gwn.x, _gwn.z, _gwn.y);
		vec3 _dqx = dFdx(n_out10p0);
		vec3 _dqy = dFdy(n_out10p0);
		if (n_out80p0[0] > 1.5) {
			bb_mtn_finish(n_out12p2, _wn,
				vec3(n_out81p0[0], n_out81p0[1], n_out81p0[2]), vec3(n_out81p0[3], n_out82p0[0], n_out82p0[1]),
				vec3(n_out82p0[2], n_out82p0[3], n_out83p0[0]), vec3(n_out83p0[1], n_out83p0[2], n_out83p0[3]),
				n_out80p0[2], n_out80p0[3],
				n_out22p0, n_out23p0, n_out25p0, n_out26p0, n_out27p0, n_out28p0,
				n_out32p0, n_out33p0, n_out34p0,
				n_out13p0, n_out13p1, n_out13p2);
		} else {
			bb_mtn_normals(n_out10p0, n_out12p2, _wn, _dqx, _dqy,
				n_out19p0, n_out20p0, n_out21p0, n_out22p0, n_out23p0,
				n_out25p0, n_out26p0, n_out27p0, n_out28p0, n_out29p0, n_out30p0,
				n_out31p0, n_out32p0, n_out33p0, n_out34p0,
				n_out13p0, n_out13p1, n_out13p2);
		}
	}


	float n_out53p0;
// Expression:53
	n_out53p0 = 0.0;
	{
		n_out53p0 = 0.18000000715255737;
	}


	vec3 n_out40p0;
// Expression:40
	vec3 n_in40p1 = vec3(0.00000, 0.00000, 0.00000);
	vec3 n_in40p2 = vec3(0.00000, 0.00000, 0.00000);
	n_out40p0 = vec3(0.0, 0.0, 0.0);
	{
		n_out40p0 = n_out10p0 * n_out53p0;
	}


	float n_out41p0;
	vec3 n_out41p1;
// Expression:41
	float n_in41p1 = 0.00000;
	float n_in41p2 = 1.00000;
	float n_in41p3 = 4.00000;
	float n_in41p4 = 0.50000;
	float n_in41p5 = 2.00000;
	float n_in41p6 = 0.00000;
	float n_in41p7 = 1.00000;
	float n_in41p8 = 0.00000;
	n_out41p0 = 0.0;
	n_out41p1 = vec3(0.0, 0.0, 0.0);
	{
		vec3 _np = bb_noise_distort(n_out40p0 * n_in41p2, n_in41p8);
		float _fw = bb_aa_strength * bb_footprint(_np);
		if (n_out80p0[0] > 1.5) {
			n_out41p0 = n_out80p0[0] - 2.0;
			n_out41p1 = vec3(n_out41p0);
		} else {
			n_out41p0 = bb_noise_fbm_aa(_np, _fw, n_in41p3, n_in41p4, n_in41p5, true);
			// Cycles builds Color from three fBMs at decorrelated offsets, not from n_out41p0.
			n_out41p1 = vec3(n_out41p0,
			             bb_noise_fbm_aa(_np + bb_random_offset(3.0), _fw, n_in41p3, n_in41p4, n_in41p5, true),
			             bb_noise_fbm_aa(_np + bb_random_offset(4.0), _fw, n_in41p3, n_in41p4, n_in41p5, true));
		}
	}


// FloatOp:42
	float n_in42p1 = 0.50000;
	float n_out42p0 = n_out41p0 - n_in42p1;


	float n_out54p0;
// Expression:54
	n_out54p0 = 0.0;
	{
		n_out54p0 = -0.02000001072883606;
	}


// FloatOp:43
	float n_out43p0 = n_out42p0 * n_out54p0;


// FloatOp:44
	float n_out44p0 = n_out12p2 + n_out43p0;


	float n_out55p0;
// Expression:55
	n_out55p0 = 0.0;
	{
		n_out55p0 = 1.3899999856948853;
	}


	float n_out56p0;
// Expression:56
	n_out56p0 = 0.0;
	{
		n_out56p0 = 0.6500000357627869;
	}


// FloatOp:45
	float n_out45p0 = n_out55p0 - n_out56p0;


	float n_out46p0;
// Expression:46
	float n_in46p3 = 0.00000;
	float n_in46p4 = 1.00000;
	n_out46p0 = 0.0;
	{
		float _d = n_out45p0 - n_out55p0;
		float _t = clamp((n_out44p0 - n_out55p0) / (abs(_d) < 1e-6 ? 1e-6 : _d), 0.0, 1.0);
		_t = _t * _t * (3.0 - 2.0 * _t);
		n_out46p0 = n_in46p3 + _t * (n_in46p4 - n_in46p3);
	}


	float n_out57p0;
// Expression:57
	n_out57p0 = 0.0;
	{
		n_out57p0 = 0.7099999785423279;
	}


	float n_out58p0;
// Expression:58
	n_out58p0 = 0.0;
	{
		n_out58p0 = 0.7200000286102295;
	}


	float n_out47p0;
// Expression:47
	float n_in47p3 = 0.00000;
	float n_in47p4 = 1.00000;
	n_out47p0 = 0.0;
	{
		float _d = n_out58p0 - n_out57p0;
		float _t = clamp((n_out13p1 - n_out57p0) / (abs(_d) < 1e-6 ? 1e-6 : _d), 0.0, 1.0);
		_t = _t * _t * (3.0 - 2.0 * _t);
		n_out47p0 = n_in47p3 + _t * (n_in47p4 - n_in47p3);
	}


	float n_out59p0;
// Expression:59
	n_out59p0 = 0.0;
	{
		n_out59p0 = 0.7200000286102295;
	}


// Clamp:50
	float n_in50p1 = 0.00000;
	float n_in50p2 = 1.00000;
	float n_out50p0 = clamp(n_out59p0, n_in50p1, n_in50p2);


// Mix:48
	float n_in48p0 = 1.00000;
	float n_out48p0 = mix(n_in48p0, n_out47p0, n_out50p0);


// FloatOp:49
	float n_out49p0 = n_out46p0 * n_out48p0;


	float n_out73p0;
// Expression:73
	n_out73p0 = 0.0;
	{
		n_out73p0 = 0.30000001192092896;
	}


	vec3 n_out60p0;
// Expression:60
	vec3 n_in60p1 = vec3(0.00000, 0.00000, 0.00000);
	vec3 n_in60p2 = vec3(0.00000, 0.00000, 0.00000);
	n_out60p0 = vec3(0.0, 0.0, 0.0);
	{
		n_out60p0 = n_out10p0 * n_out73p0;
	}


	float n_out61p0;
	vec3 n_out61p1;
// Expression:61
	float n_in61p1 = 0.00000;
	float n_in61p2 = 1.00000;
	float n_in61p3 = 4.00000;
	float n_in61p4 = 0.50000;
	float n_in61p5 = 2.00000;
	float n_in61p6 = 0.00000;
	float n_in61p7 = 1.00000;
	float n_in61p8 = 0.00000;
	n_out61p0 = 0.0;
	n_out61p1 = vec3(0.0, 0.0, 0.0);
	{
		vec3 _np = bb_noise_distort(n_out60p0 * n_in61p2, n_in61p8);
		float _fw = bb_aa_strength * bb_footprint(_np);
		if (n_out80p0[0] > 1.5) {
			n_out61p0 = n_out80p0[1];
			n_out61p1 = vec3(n_out61p0);
		} else {
			n_out61p0 = bb_noise_fbm_aa(_np, _fw, n_in61p3, n_in61p4, n_in61p5, true);
			// Cycles builds Color from three fBMs at decorrelated offsets, not from n_out61p0.
			n_out61p1 = vec3(n_out61p0,
			             bb_noise_fbm_aa(_np + bb_random_offset(3.0), _fw, n_in61p3, n_in61p4, n_in61p5, true),
			             bb_noise_fbm_aa(_np + bb_random_offset(4.0), _fw, n_in61p3, n_in61p4, n_in61p5, true));
		}
	}


// FloatOp:62
	float n_in62p1 = 0.50000;
	float n_out62p0 = n_out61p0 - n_in62p1;


	float n_out74p0;
// Expression:74
	n_out74p0 = 0.0;
	{
		n_out74p0 = 67.93999481201172;
	}


// FloatOp:63
	float n_out63p0 = n_out62p0 * n_out74p0;


// FloatOp:64
	float n_out64p0 = n_out12p2 + n_out63p0;


	float n_out75p0;
// Expression:75
	n_out75p0 = 0.0;
	{
		n_out75p0 = -0.10000000149011612;
	}


	float n_out76p0;
// Expression:76
	n_out76p0 = 0.0;
	{
		n_out76p0 = 11.729999542236328;
	}


// FloatOp:65
	float n_out65p0 = n_out75p0 - n_out76p0;


	float n_out66p0;
// Expression:66
	float n_in66p3 = 0.00000;
	float n_in66p4 = 1.00000;
	n_out66p0 = 0.0;
	{
		float _d = n_out65p0 - n_out75p0;
		float _t = clamp((n_out64p0 - n_out75p0) / (abs(_d) < 1e-6 ? 1e-6 : _d), 0.0, 1.0);
		_t = _t * _t * (3.0 - 2.0 * _t);
		n_out66p0 = n_in66p3 + _t * (n_in66p4 - n_in66p3);
	}


	float n_out77p0;
// Expression:77
	n_out77p0 = 0.0;
	{
		n_out77p0 = 0.2499999850988388;
	}


	float n_out78p0;
// Expression:78
	n_out78p0 = 0.0;
	{
		n_out78p0 = -0.550000011920929;
	}


	float n_out67p0;
// Expression:67
	float n_in67p3 = 0.00000;
	float n_in67p4 = 1.00000;
	n_out67p0 = 0.0;
	{
		float _d = n_out78p0 - n_out77p0;
		float _t = clamp((n_out13p1 - n_out77p0) / (abs(_d) < 1e-6 ? 1e-6 : _d), 0.0, 1.0);
		_t = _t * _t * (3.0 - 2.0 * _t);
		n_out67p0 = n_in67p3 + _t * (n_in67p4 - n_in67p3);
	}


	float n_out79p0;
// Expression:79
	n_out79p0 = 0.0;
	{
		n_out79p0 = 0.41999998688697815;
	}


// Clamp:70
	float n_in70p1 = 0.00000;
	float n_in70p2 = 1.00000;
	float n_out70p0 = clamp(n_out79p0, n_in70p1, n_in70p2);


// Mix:68
	float n_in68p0 = 1.00000;
	float n_out68p0 = mix(n_in68p0, n_out67p0, n_out70p0);


// FloatOp:69
	float n_out69p0 = n_out66p0 * n_out68p0;


	vec4 n_out6p0;
// MTN_Albedo:6
	vec4 n_in6p3 = vec4(0.19000, 0.17000, 0.15000, 1.00000);
	vec4 n_in6p4 = vec4(0.92000, 0.94000, 0.97000, 1.00000);
	vec4 n_in6p5 = vec4(0.76000, 0.66000, 0.47000, 1.00000);
	vec4 n_in6p6 = vec4(0.05500, 0.05000, 0.04800, 1.00000);
/* Group: MTN_Albedo */
	group_MTN_Albedo_800004a8b4017eed(n_out13p2, n_out49p0, n_out69p0, n_in6p3, n_in6p4, n_in6p5, n_in6p6, n_out6p0);


	float n_out7p0;
	float n_out7p1;
// MTN_Roughness:7
	float n_in7p3 = 0.85000;
	float n_in7p4 = 0.35000;
	float n_in7p5 = 0.92000;
	float n_in7p6 = 0.16000;
	float n_in7p7 = 0.78000;
	float n_in7p8 = 0.97000;
/* Group: MTN_Roughness */
	group_MTN_Roughness_800004a8bf017ee2(n_out13p2, n_out49p0, n_out13p1, n_in7p3, n_in7p4, n_in7p5, n_in7p6, n_in7p7, n_in7p8, n_out7p0, n_out7p1);


// Clamp:179
	float n_in179p1 = 0.00000;
	float n_in179p2 = 1.00000;
	float n_out179p0 = clamp(n_out7p0, n_in179p1, n_in179p2);


	vec3 n_out479p0;
// Expression:479
	n_out479p0 = vec3(0.0, 0.0, 0.0);
	{
		n_out479p0 = normalize((VIEW_MATRIX * vec4(vec3(-n_out13p0.x, n_out13p0.z, n_out13p0.y), 0.0)).xyz);
	}


// Output:0
	ALBEDO = vec3(n_out6p0.xyz);
	ROUGHNESS = n_out179p0;
	NORMAL = n_out479p0;


}