A little toolkit for single-quad fragment shader demos
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
1.8 KiB

  1. mat3 look_mat(vec3 origin, vec3 target, float roll) {
  2. vec3 rr = vec3(sin(roll), cos(roll), 0.0);
  3. vec3 ww = normalize(target - origin);
  4. vec3 uu = normalize(cross(ww, rr));
  5. vec3 vv = normalize(cross(uu, ww));
  6. return mat3(uu, vv, ww);
  7. }
  8. #define N_HIT_FAR_PLANE -1.
  9. #define N_SDF_RULER -2.
  10. float dot2( in vec3 v ) { return dot(v,v); }
  11. float udQuad( vec3 p, vec3 a, vec3 b, vec3 c, vec3 d )
  12. {
  13. vec3 ba = b - a; vec3 pa = p - a;
  14. vec3 cb = c - b; vec3 pb = p - b;
  15. vec3 dc = d - c; vec3 pc = p - c;
  16. vec3 ad = a - d; vec3 pd = p - d;
  17. vec3 nor = cross( ba, ad );
  18. return sqrt(
  19. (sign(dot(cross(ba,nor),pa)) +
  20. sign(dot(cross(cb,nor),pb)) +
  21. sign(dot(cross(dc,nor),pc)) +
  22. sign(dot(cross(ad,nor),pd))<3.0)
  23. ?
  24. min( min( min(
  25. dot2(ba*clamp(dot(ba,pa)/dot2(ba),0.0,1.0)-pa),
  26. dot2(cb*clamp(dot(cb,pb)/dot2(cb),0.0,1.0)-pb) ),
  27. dot2(dc*clamp(dot(dc,pc)/dot2(dc),0.0,1.0)-pc) ),
  28. dot2(ad*clamp(dot(ad,pd)/dot2(ad),0.0,1.0)-pd) )
  29. :
  30. dot(nor,pa)*dot(nor,pa)/dot2(nor) );
  31. }
  32. float atan2(in float y, in float x) {
  33. return x == 0.0 ? sign(y)*PI/2 : atan(y, x);
  34. }
  35. float mod289(float x){return x - floor(x * (1.0 / 289.0)) * 289.0;}
  36. vec4 mod289(vec4 x){return x - floor(x * (1.0 / 289.0)) * 289.0;}
  37. vec4 perm(vec4 x){return mod289(((x * 34.0) + 1.0) * x);}
  38. float noise(vec3 p){
  39. vec3 a = floor(p);
  40. vec3 d = p - a;
  41. d = d * d * (3.0 - 2.0 * d);
  42. vec4 b = a.xxyy + vec4(0.0, 1.0, 0.0, 1.0);
  43. vec4 k1 = perm(b.xyxy);
  44. vec4 k2 = perm(k1.xyxy + b.zzww);
  45. vec4 c = k2 + a.zzzz;
  46. vec4 k3 = perm(c);
  47. vec4 k4 = perm(c + 1.0);
  48. vec4 o1 = fract(k3 * (1.0 / 41.0));
  49. vec4 o2 = fract(k4 * (1.0 / 41.0));
  50. vec4 o3 = o2 * d.z + o1 * (1.0 - d.z);
  51. vec2 o4 = o3.yw * d.x + o3.xz * (1.0 - d.x);
  52. return o4.y * d.y + o4.x * (1.0 - d.y);
  53. }