OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / blender / mountain_voronoi3.Mountain.tres

735 lines · tres ref:
[gd_resource type="ShaderMaterial" format=3 uid="uid://bincx38n8hupa"]

[ext_resource type="Shader" uid="uid://dajae1870kijp" path="res://blender/mountain_voronoi3.Mountain.meshbake.gdshader" id="1_pfa3r"]
[ext_resource type="Shader" uid="uid://bbkvm5uk2ixcy" path="res://blender/mountain_voronoi3.Mountain.gdshader" id="2_80hhj"]

[sub_resource type="ShaderMaterial" id="ShaderMaterial_1k5xf"]
render_priority = 0
shader = ExtResource("1_pfa3r")
shader_parameter/bb_aa_strength = 1.0
shader_parameter/bb_gen_min = Vector3(-6000, -300, -6000)
shader_parameter/bb_gen_size = Vector3(12000, 600, 12000)
shader_parameter/bb_gen_from_uv = 0.0
shader_parameter/bb_coord_scale = 1.0
shader_parameter/bb_world_to_object = Projection(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)
shader_parameter/bb_world_to_object_on = 0.0

[resource]
render_priority = 0
shader = ExtResource("2_80hhj")
shader_parameter/bb_aa_strength = 1.0
shader_parameter/bb_gen_min = Vector3(-6000, -300, -6000)
shader_parameter/bb_gen_size = Vector3(12000, 600, 12000)
shader_parameter/bb_gen_from_uv = 0.0
shader_parameter/bb_coord_scale = 1.0
shader_parameter/bb_world_to_object = Projection(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)
shader_parameter/bb_world_to_object_on = 0.0
metadata/bb_mesh_bake = {
"kernel": "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);
}



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;
}

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;
}

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;
}

void bb_mtn_fields(vec3 q, vec3 N, vec3 dq0, vec3 dq1, vec3 dq2,
		float stretch, float turb, float coupling, float micro_s, float micro_d,
		float trans_scale, float trans_amt, float snow_scale,
		out vec3 gR, out vec3 gDiff, out vec3 G1, out vec3 gSlope, out float T, out float D) {
	const float QPM = 0.01;
	N = normalize(N);
	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));
	float fw_y = bb_aa_strength * max(max(length(J * (dq0 * k)), length(J * (dq1 * k))), length(J * (dq2 * 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;
	gR = gx * sw;
	mat3 HR = Hx * (sw * sw);
	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;
	gSlope = -micro_d * ms * (HR * (v - N * dot(v, N)));
	float fq = bb_aa_strength * max(max(length(dq0), length(dq1)), length(dq2));
	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);
	gDiff = gSnow - gR;
	G1 = trans_amt * gTrans + coupling * gR;
	T = (trans - 0.5) * trans_amt + (rock - 0.5) * coupling;
	D = snow - rock;
}

void bb_mk_in_0(vec3 p, out vec3 vector, out float w, out float scale, out float detail, out float roughness, out float lacunarity, out float offset_in, out float gain, out float distortion) {
	vec3 mb_n7_generated_out;
	vec3 mb_n7_normal_out;
	vec3 mb_n7_uv_out;
	vec3 mb_n7_object_out;
	{ vec3 _lp = p * bb_coord_scale; mb_n7_object_out = vec3(-_lp.x, _lp.z, _lp.y); }
	vec3 mb_n9_vec_out;
	{
		vec3 vec_in = mb_n7_object_out;
		vec3 vec_unused_b = vec3(0.0, 0.0, 0.0);
		vec3 vec_unused_c = vec3(0.0, 0.0, 0.0);
		float scale = 0.009999999776482582;
		vec3 vec_out = vec3(0.0);
		vec_out = vec_in * scale;
		mb_n9_vec_out = vec_out;
	}
	float mb_n52_v;
	{
		float v = float(0.0);
		v = 0.18000000715255737;
		mb_n52_v = v;
	}
	vec3 mb_n39_vec_out;
	{
		vec3 vec_in = mb_n9_vec_out;
		vec3 vec_unused_b = vec3(0.0, 0.0, 0.0);
		vec3 vec_unused_c = vec3(0.0, 0.0, 0.0);
		float scale = mb_n52_v;
		vec3 vec_out = vec3(0.0);
		vec_out = vec_in * scale;
		mb_n39_vec_out = vec_out;
	}
	vector = mb_n39_vec_out;
	w = 0.0;
	scale = 1.0;
	detail = 4.0;
	roughness = 0.5;
	lacunarity = 2.0;
	offset_in = 0.0;
	gain = 1.0;
	distortion = 0.0;
}

float bb_mk_0(vec3 p, float spacing) {
	vec3 vector;
	float w;
	float scale;
	float detail;
	float roughness;
	float lacunarity;
	float offset_in;
	float gain;
	float distortion;
	bb_mk_in_0(p, vector, w, scale, detail, roughness, lacunarity, offset_in, gain, distortion);
	vec3 _np0 = vector * scale;
	float _k_fp = 0.0;
	vec3 _s_vector;
	float _s_w;
	float _s_scale;
	float _s_detail;
	float _s_roughness;
	float _s_lacunarity;
	float _s_offset_in;
	float _s_gain;
	float _s_distortion;
	bb_mk_in_0(p + vec3(spacing, 0.0, 0.0), _s_vector, _s_w, _s_scale, _s_detail, _s_roughness, _s_lacunarity, _s_offset_in, _s_gain, _s_distortion); _k_fp = max(_k_fp, length(_s_vector * _s_scale - _np0));
	bb_mk_in_0(p + vec3(0.0, spacing, 0.0), _s_vector, _s_w, _s_scale, _s_detail, _s_roughness, _s_lacunarity, _s_offset_in, _s_gain, _s_distortion); _k_fp = max(_k_fp, length(_s_vector * _s_scale - _np0));
	bb_mk_in_0(p + vec3(0.0, 0.0, spacing), _s_vector, _s_w, _s_scale, _s_detail, _s_roughness, _s_lacunarity, _s_offset_in, _s_gain, _s_distortion); _k_fp = max(_k_fp, length(_s_vector * _s_scale - _np0));
	float fac = 0.0;
	vec3 color = vec3(0.0);
	{
		vec3 _np = bb_noise_distort(vector * scale, distortion);
		float _fw = bb_aa_strength * _k_fp;
		fac = bb_noise_fbm_aa(_np, _fw, detail, roughness, lacunarity, true);
		// Cycles builds Color from three fBMs at decorrelated offsets, not from fac.
		color = vec3(fac,
		             bb_noise_fbm_aa(_np + bb_random_offset(3.0), _fw, detail, roughness, lacunarity, true),
		             bb_noise_fbm_aa(_np + bb_random_offset(4.0), _fw, detail, roughness, lacunarity, true));
	}
	return fac;
}

void bb_mk_in_1(vec3 p, out vec3 vector, out float w, out float scale, out float detail, out float roughness, out float lacunarity, out float offset_in, out float gain, out float distortion) {
	vec3 mb_n7_generated_out;
	vec3 mb_n7_normal_out;
	vec3 mb_n7_uv_out;
	vec3 mb_n7_object_out;
	{ vec3 _lp = p * bb_coord_scale; mb_n7_object_out = vec3(-_lp.x, _lp.z, _lp.y); }
	vec3 mb_n9_vec_out;
	{
		vec3 vec_in = mb_n7_object_out;
		vec3 vec_unused_b = vec3(0.0, 0.0, 0.0);
		vec3 vec_unused_c = vec3(0.0, 0.0, 0.0);
		float scale = 0.009999999776482582;
		vec3 vec_out = vec3(0.0);
		vec_out = vec_in * scale;
		mb_n9_vec_out = vec_out;
	}
	float mb_n72_v;
	{
		float v = float(0.0);
		v = 0.30000001192092896;
		mb_n72_v = v;
	}
	vec3 mb_n59_vec_out;
	{
		vec3 vec_in = mb_n9_vec_out;
		vec3 vec_unused_b = vec3(0.0, 0.0, 0.0);
		vec3 vec_unused_c = vec3(0.0, 0.0, 0.0);
		float scale = mb_n72_v;
		vec3 vec_out = vec3(0.0);
		vec_out = vec_in * scale;
		mb_n59_vec_out = vec_out;
	}
	vector = mb_n59_vec_out;
	w = 0.0;
	scale = 1.0;
	detail = 4.0;
	roughness = 0.5;
	lacunarity = 2.0;
	offset_in = 0.0;
	gain = 1.0;
	distortion = 0.0;
}

float bb_mk_1(vec3 p, float spacing) {
	vec3 vector;
	float w;
	float scale;
	float detail;
	float roughness;
	float lacunarity;
	float offset_in;
	float gain;
	float distortion;
	bb_mk_in_1(p, vector, w, scale, detail, roughness, lacunarity, offset_in, gain, distortion);
	vec3 _np0 = vector * scale;
	float _k_fp = 0.0;
	vec3 _s_vector;
	float _s_w;
	float _s_scale;
	float _s_detail;
	float _s_roughness;
	float _s_lacunarity;
	float _s_offset_in;
	float _s_gain;
	float _s_distortion;
	bb_mk_in_1(p + vec3(spacing, 0.0, 0.0), _s_vector, _s_w, _s_scale, _s_detail, _s_roughness, _s_lacunarity, _s_offset_in, _s_gain, _s_distortion); _k_fp = max(_k_fp, length(_s_vector * _s_scale - _np0));
	bb_mk_in_1(p + vec3(0.0, spacing, 0.0), _s_vector, _s_w, _s_scale, _s_detail, _s_roughness, _s_lacunarity, _s_offset_in, _s_gain, _s_distortion); _k_fp = max(_k_fp, length(_s_vector * _s_scale - _np0));
	bb_mk_in_1(p + vec3(0.0, 0.0, spacing), _s_vector, _s_w, _s_scale, _s_detail, _s_roughness, _s_lacunarity, _s_offset_in, _s_gain, _s_distortion); _k_fp = max(_k_fp, length(_s_vector * _s_scale - _np0));
	float fac = 0.0;
	vec3 color = vec3(0.0);
	{
		vec3 _np = bb_noise_distort(vector * scale, distortion);
		float _fw = bb_aa_strength * _k_fp;
		fac = bb_noise_fbm_aa(_np, _fw, detail, roughness, lacunarity, true);
		// Cycles builds Color from three fBMs at decorrelated offsets, not from fac.
		color = vec3(fac,
		             bb_noise_fbm_aa(_np + bb_random_offset(3.0), _fw, detail, roughness, lacunarity, true),
		             bb_noise_fbm_aa(_np + bb_random_offset(4.0), _fw, detail, roughness, lacunarity, true));
	}
	return fac;
}

void bb_mk_nin(vec3 p, out vec3 q_in, out float rock_stretch, out float rock_turb, out float detail_coupling, out float micro_strength, out float micro_distance, out float trans_scale, out float trans_amount, out float snow_noise_scale) {
	vec3 mb_n7_generated_out;
	vec3 mb_n7_normal_out;
	vec3 mb_n7_uv_out;
	vec3 mb_n7_object_out;
	{ vec3 _lp = p * bb_coord_scale; mb_n7_object_out = vec3(-_lp.x, _lp.z, _lp.y); }
	vec3 mb_n9_vec_out;
	{
		vec3 vec_in = mb_n7_object_out;
		vec3 vec_unused_b = vec3(0.0, 0.0, 0.0);
		vec3 vec_unused_c = vec3(0.0, 0.0, 0.0);
		float scale = 0.009999999776482582;
		vec3 vec_out = vec3(0.0);
		vec_out = vec_in * scale;
		mb_n9_vec_out = vec_out;
	}
	float mb_n18_v;
	{
		float v = float(0.0);
		v = 2.9700000286102295;
		mb_n18_v = v;
	}
	float mb_n19_v;
	{
		float v = float(0.0);
		v = 1.7799999713897705;
		mb_n19_v = v;
	}
	float mb_n20_v;
	{
		float v = float(0.0);
		v = 0.6100000143051147;
		mb_n20_v = v;
	}
	float mb_n21_v;
	{
		float v = float(0.0);
		v = 2.3399999141693115;
		mb_n21_v = v;
	}
	float mb_n22_v;
	{
		float v = float(0.0);
		v = 35.0;
		mb_n22_v = v;
	}
	float mb_n28_v;
	{
		float v = float(0.0);
		v = 0.15000000596046448;
		mb_n28_v = v;
	}
	float mb_n29_v;
	{
		float v = float(0.0);
		v = 0.4899999797344208;
		mb_n29_v = v;
	}
	float mb_n30_v;
	{
		float v = float(0.0);
		v = 0.800000011920929;
		mb_n30_v = v;
	}
	q_in = mb_n9_vec_out;
	rock_stretch = mb_n18_v;
	rock_turb = mb_n19_v;
	detail_coupling = mb_n20_v;
	micro_strength = mb_n21_v;
	micro_distance = mb_n22_v;
	trans_scale = mb_n28_v;
	trans_amount = mb_n29_v;
	snow_noise_scale = mb_n30_v;
}

void dc_material_kernel(vec3 p, vec3 n, float spacing,
		out vec4 c0, out vec4 c1, out vec4 c2, out vec4 c3) {
	float m0 = bb_mk_0(p, spacing);
	float m1 = bb_mk_1(p, spacing);
	vec3 gR = vec3(0.0), gDiff = vec3(0.0), G1 = vec3(0.0), gSlope = vec3(0.0);
	float T = 0.0, D = 0.0;
	{
		vec3 q_in; vec3 _s_q_in;
		float rock_stretch; float _s_rock_stretch;
		float rock_turb; float _s_rock_turb;
		float detail_coupling; float _s_detail_coupling;
		float micro_strength; float _s_micro_strength;
		float micro_distance; float _s_micro_distance;
		float trans_scale; float _s_trans_scale;
		float trans_amount; float _s_trans_amount;
		float snow_noise_scale; float _s_snow_noise_scale;
		bb_mk_nin(p, q_in, rock_stretch, rock_turb, detail_coupling, micro_strength, micro_distance, trans_scale, trans_amount, snow_noise_scale);
		bb_mk_nin(p + vec3(spacing, 0.0, 0.0), _s_q_in, _s_rock_stretch, _s_rock_turb, _s_detail_coupling, _s_micro_strength, _s_micro_distance, _s_trans_scale, _s_trans_amount, _s_snow_noise_scale);
		vec3 dq0 = _s_q_in - q_in;
		bb_mk_nin(p + vec3(0.0, spacing, 0.0), _s_q_in, _s_rock_stretch, _s_rock_turb, _s_detail_coupling, _s_micro_strength, _s_micro_distance, _s_trans_scale, _s_trans_amount, _s_snow_noise_scale);
		vec3 dq1 = _s_q_in - q_in;
		bb_mk_nin(p + vec3(0.0, 0.0, spacing), _s_q_in, _s_rock_stretch, _s_rock_turb, _s_detail_coupling, _s_micro_strength, _s_micro_distance, _s_trans_scale, _s_trans_amount, _s_snow_noise_scale);
		vec3 dq2 = _s_q_in - q_in;
		// the vertex normal, Godot -> Blender axes as the fragment's _wn
		bb_mtn_fields(q_in, vec3(-n.x, n.z, n.y), dq0, dq1, dq2,
			rock_stretch, rock_turb, detail_coupling, micro_strength, micro_distance,
			trans_scale, trans_amount, snow_noise_scale, gR, gDiff, G1, gSlope, T, D);
	}
	// c0.x carries mask 0 + 2.0: the BAKED FLAG (all 16 slots are in use, and
	// a chunk the kernel never ran on reads zeros: c0.x < 1.5 = not baked).
	c0 = vec4(m0 + 2.0, m1, T, D);
	c1 = vec4(gR, gDiff.x);
	c2 = vec4(gDiff.y, gDiff.z, G1.x, G1.y);
	c3 = vec4(G1.z, gSlope);
}
",
"material": SubResource("ShaderMaterial_1k5xf"),
"slots": [{
"node": 40.0,
"output": "fac",
"slot": "c0.x",
"type": "TEX_NOISE"
}, {
"node": 60.0,
"output": "fac",
"slot": "c0.y",
"type": "TEX_NOISE"
}, {
"node": 12.0,
"output": "T D gR gDiff G1 gSlope",
"slot": "c0.zw c1 c2 c3",
"type": "__MTN_NORMALS__"
}],
"uniforms": ["bb_coord_scale", "bb_aa_strength"],
"version": 2.0
}