From 4bc3b4b4579ae24d4ffd3c52fd8cb3c3defdac91 Mon Sep 17 00:00:00 2001
From: gradient <gradient@null.and.void>
Date: Sun, 10 Sep 2017 21:43:56 -0500
Subject: [PATCH] some random utils.glsl stuff

---
 examples/test/shaders/utils.glsl | 57 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/examples/test/shaders/utils.glsl b/examples/test/shaders/utils.glsl
index 1998de8..752306e 100644
--- a/examples/test/shaders/utils.glsl
+++ b/examples/test/shaders/utils.glsl
@@ -6,3 +6,60 @@ mat3 look_mat(vec3 origin, vec3 target, float roll) {
 
   return mat3(uu, vv, ww);
 }
+
+#define N_HIT_FAR_PLANE -1.
+#define N_SDF_RULER -2.
+
+float dot2( in vec3 v ) { return dot(v,v); }
+float udQuad( vec3 p, vec3 a, vec3 b, vec3 c, vec3 d )
+{
+    vec3 ba = b - a; vec3 pa = p - a;
+    vec3 cb = c - b; vec3 pb = p - b;
+    vec3 dc = d - c; vec3 pc = p - c;
+    vec3 ad = a - d; vec3 pd = p - d;
+    vec3 nor = cross( ba, ad );
+
+    return sqrt(
+    (sign(dot(cross(ba,nor),pa)) +
+     sign(dot(cross(cb,nor),pb)) +
+     sign(dot(cross(dc,nor),pc)) +
+     sign(dot(cross(ad,nor),pd))<3.0)
+     ?
+     min( min( min(
+     dot2(ba*clamp(dot(ba,pa)/dot2(ba),0.0,1.0)-pa),
+     dot2(cb*clamp(dot(cb,pb)/dot2(cb),0.0,1.0)-pb) ),
+     dot2(dc*clamp(dot(dc,pc)/dot2(dc),0.0,1.0)-pc) ),
+     dot2(ad*clamp(dot(ad,pd)/dot2(ad),0.0,1.0)-pd) )
+     :
+     dot(nor,pa)*dot(nor,pa)/dot2(nor) );
+}
+
+float atan2(in float y, in float x) {
+    return x == 0.0 ? sign(y)*PI/2 : atan(y, x);
+}
+
+float mod289(float x){return x - floor(x * (1.0 / 289.0)) * 289.0;}
+vec4 mod289(vec4 x){return x - floor(x * (1.0 / 289.0)) * 289.0;}
+vec4 perm(vec4 x){return mod289(((x * 34.0) + 1.0) * x);}
+
+float noise(vec3 p){
+    vec3 a = floor(p);
+    vec3 d = p - a;
+    d = d * d * (3.0 - 2.0 * d);
+
+    vec4 b = a.xxyy + vec4(0.0, 1.0, 0.0, 1.0);
+    vec4 k1 = perm(b.xyxy);
+    vec4 k2 = perm(k1.xyxy + b.zzww);
+
+    vec4 c = k2 + a.zzzz;
+    vec4 k3 = perm(c);
+    vec4 k4 = perm(c + 1.0);
+
+    vec4 o1 = fract(k3 * (1.0 / 41.0));
+    vec4 o2 = fract(k4 * (1.0 / 41.0));
+
+    vec4 o3 = o2 * d.z + o1 * (1.0 - d.z);
+    vec2 o4 = o3.yw * d.x + o3.xz * (1.0 - d.x);
+
+    return o4.y * d.y + o4.x * (1.0 - d.y);
+}