--- /dev/null
+uniform Morph
+{
+ float morph;
+};
+
+const float PI = 3.1415926535;
+const float OFFSET = 0.001;
+
+#pragma MSP stage(vertex)
+vec3 deform(vec3 p)
+{
+ vec3 d = cos(p*(2.0*PI)+morph)*0.05;
+ return p*(1.0+(d.x+d.y+d.z)*sin(morph*0.2));
+}
+
+vec4 get_vertex_position() override
+{
+ return vec4(deform(vertex.xyz), 1.0);
+}
+
+vec3 get_vertex_normal() override
+{
+ vec3 tangent;
+ if(abs(normal.x)>abs(normal.y))
+ tangent = normalize(vec3(-normal.z, 0.0, normal.x));
+ else
+ tangent = normalize(vec3(0.0, -normal.z, normal.y));
+ vec3 binormal = cross(normal, tangent);
+
+ vec3 xn = deform(vertex.xyz-tangent*OFFSET);
+ vec3 xp = deform(vertex.xyz+tangent*OFFSET);
+ vec3 yn = deform(vertex.xyz-binormal*OFFSET);
+ vec3 yp = deform(vertex.xyz+binormal*OFFSET);
+
+ return normalize(cross(xp-xn, yp-yn));
+}