mat3 look_mat(vec3 origin, vec3 target, float roll) {
|
|
vec3 rr = vec3(sin(roll), cos(roll), 0.0);
|
|
vec3 ww = normalize(target - origin);
|
|
vec3 uu = normalize(cross(ww, rr));
|
|
vec3 vv = normalize(cross(uu, ww));
|
|
|
|
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);
|
|
}
|