 	return 0.5 + 0.5 * 0.3333 * ( sin(w + u*sin(u + v*sin(v))) + sin(v + w*sin(w + u*sin(u))) +  sin(u + v*sin(v + w*sin(w))) );
 }
 
+
 float mixd(float a, float b, float alpha)
 {
 	return b;//((1.0-alpha)*a + alpha*b);
 }
+
 
 float ds[17] = float[](0.000, 0.707, -1.000, 0.707, 0.000, -0.707, 1.000, -0.707, 0.000, 0.707, -1.000, 0.707, 0.000, -0.707, 1.000, -0.707, 0.000);
 float dc[17] = float[](1.000, -0.707, 0.000, 0.707, -1.000, 0.707, 0.000, -0.707, 1.000, -0.707, 0.000, 0.707, -1.000, 0.707, 0.000, -0.707, 1.000);
 
+
 vec2 ofse(int i, float r, vec2 p)
 {
 	return vec2(1.0*ds[i]*r, (1.7*r) + 1.0*dc[i]*r);
 	//return vec2(0.5*r-noiz3(p.x,p.y, i*0.23)*r, 0.5*r-noiz3(p.x,p.y, i*0.17)*r);
 }
+
+
+vec2 warpMono(vec2 pix)
+{
+    float f = -8.1;
+
+    vec2 v = pix * 2.0 - 1.0;
+
+    vec2 warped = vec2(
+        f * v.x / (v.y * v.y + f),
+        f * v.y / (v.x * v.x + f)
+    ) * 0.5 + 0.5;
+
+    return warped;
+}
+
+
+vec2 warpDual(vec2 pix)
+{
+    pix.x = mod(pix.x * 2.0, 1.0);
+    return warpMono(pix);
+}
+
 
 void main()
 {

	return (2.0 * n) / (f + n - z * (f - n));
}

float sig(float x)
{
	return 1.0 / (1.0 + exp(-x));
}

float getAO(float d0, float dn)
{

	return exp(-(abs(diff)-eps)*500.0);
}


float noiz3(float x, float y, float z)
{
	float u = 121.12421 * (1.0+x);
