#include "rmannotes.sl" displacement rockfalls(float freq = 1, Km = 0.1, width = 0.1) { float surface_mag, layer_mag; float ss, tt,half_width,d; float fuzz = 0.05; point p1,p2; float size = 1.0, magnitude =0.0, i; point P2; /* init */ surface_mag = 0; /* rotate & repeat layers */ ss = repeat(s, freq); tt = repeat(t, freq); /* layer 1 */ p1 = (0.5, 0, 0); p2 = (0.5, 1, 0); d = ptlined(p1, p2, (ss, tt, 0)) + noise (ss * 10 , tt * 10)/20; layer_mag = 1 - smoothstep(width - fuzz, width, d); surface_mag += layer_mag; P2 = transform("shader",P); for (i= 0 ;i<10.0; i+=1.0) { magnitude += abs(.3 - snoise(P2*size))/(size-i); size *=2.0; } magnitude += udn2(ss,tt,.8,1.7); /* displace */ N =faceforward(N,-I); P += -Km * (2 * magnitude * magnitude * normalize(N) * (1 - surface_mag) + surface_mag * normalize(N)); N = calculatenormal(P); }