shader_type spatial;
render_mode specular_schlick_ggx, cull_back;

// Ice (Frostveil Tundra, env_frost.gd): frozen lake sheets and crystal clusters. Painted pale-blue body with deeper
// blue cracks (Voronoi edges in world XZ), a bright fresnel rim and a slow sparkle; crystals glow a little from inside.
uniform vec3 deep : source_color = vec3(0.45, 0.68, 0.9);
uniform vec3 pale : source_color = vec3(0.86, 0.95, 1.0);
uniform float cracks = 1.0;       // 0 = no crack lines (crystals)
uniform float glow = 0.0;         // emission strength (crystals)
uniform float crack_scale = 0.45;

varying vec3 wpos;

void vertex() {
	wpos = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
}

vec2 h22(vec2 p) {
	p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));
	return fract(sin(p) * 43758.5453);
}

float voronoi_edge(vec2 q) {
	vec2 i = floor(q);
	vec2 f = fract(q);
	float d1 = 8.0;
	float d2 = 8.0;
	for (int y = -1; y <= 1; y++) {
		for (int x = -1; x <= 1; x++) {
			vec2 g = vec2(float(x), float(y));
			float d = length(g + h22(i + g) - f);
			if (d < d1) {
				d2 = d1;
				d1 = d;
			} else if (d < d2) {
				d2 = d;
			}
		}
	}
	return d2 - d1;
}

void fragment() {
	vec2 p = wpos.xz;
	float e = voronoi_edge(p * crack_scale);
	float crack = (1.0 - smoothstep(0.02, 0.07, e)) * cracks;
	float body = smoothstep(0.0, 0.6, e);
	vec3 col = mix(deep, pale, 0.45 + 0.4 * body);
	col = mix(col, deep * 0.8, crack * 0.7);
	float fres = pow(1.0 - clamp(dot(NORMAL, VIEW), 0.0, 1.0), 3.0);
	col += vec3(0.8, 0.9, 1.0) * fres * 0.35;
	float sp = step(0.992, fract(sin(dot(floor(p * 4.0), vec2(12.9898, 78.233))) * 43758.5453));
	col += vec3(1.0) * sp * (0.5 + 0.5 * sin(TIME * 2.0 + p.x * 3.0)) * 0.4;
	ALBEDO = col;
	ROUGHNESS = 0.18;
	METALLIC = 0.0;
	SPECULAR = 0.6;
	EMISSION = mix(pale, deep, 0.4) * glow * (0.7 + 0.3 * sin(TIME * 1.3 + wpos.y * 4.0));
}
