float square(float x, y, minx, maxx, miny, maxy, taper) { return smoothstep(minx, minx + taper, x) * (1 - smoothstep(maxx, maxx + taper, x)) * smoothstep(miny, miny + taper, y) * (1 - smoothstep(maxy, maxy + taper, y)); } displacement repeatbump(float Km = 0.1, min_s = 0.1, max_s = 0.8, min_t = 0.1, max_t = 0.8, fuzz = 0.1, s_repeats = 4, t_repeats = 4) { float hump = 0; normal n = normalize(N); float ss = mod(s * s_repeats, 1); float tt = mod(t * s_repeats, 1); hump = square(ss, tt, min_s, max_s, min_t, max_t, fuzz); P = P - n * hump * Km; N = calculatenormal(P); }