Advertisement
ilich2011

Untitled

May 16th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.44 KB | None | 0 0
  1. #define MAX_STEPS 100
  2. #define MAX_DIST 100.
  3. #define SURF_DIST .001
  4.  
  5. float sdCylinder(vec3 p, vec3 a, vec3 b, float r) {
  6. vec3 ab = b-a;
  7. vec3 ap = p-a;
  8.  
  9. float t = dot(ab, ap) / dot(ab, ab);
  10.  
  11. vec3 c = a + t*ab;
  12.  
  13. float x = length(p-c)-r;
  14. float y = (abs(t-.5)-.5)*length(ab);
  15. float e = length(max(vec2(x, y), 0.));
  16. float i = min(max(x, y), 0.);
  17.  
  18. return e+i;
  19. }
  20.  
  21. float sdTorus(vec3 p, vec2 r) {
  22. float x = length(p.xz)-r.x;
  23. return length(vec2(x, p.y))-r.y;
  24. }
  25.  
  26. vec3 PlaneNormal(vec3 v0, vec3 v1, vec3 v2)
  27. {
  28. vec3 x = v0 - v1;
  29. vec3 y = v0 - v2;
  30. vec3 n = cross(x, y);
  31. return vec3((n.y < 0.)?-n:n);
  32. }
  33.  
  34. float dot2( in vec3 v ) { return dot(v,v); }
  35. vec4 udTriangle( vec3 p, vec3 a, vec3 b, vec3 c )
  36. {
  37. vec3 ba = b - a; vec3 pa = p - a;
  38. vec3 cb = c - b; vec3 pb = p - b;
  39. vec3 ac = a - c; vec3 pc = p - c;
  40. vec3 nor = cross( ba, ac );
  41.  
  42. return vec4(sqrt(
  43. (sign(dot(cross(ba,nor),pa)) +
  44. sign(dot(cross(cb,nor),pb)) +
  45. sign(dot(cross(ac,nor),pc))<2.0)
  46. ?
  47. min( min(
  48. dot2(ba*clamp(dot(ba,pa)/dot2(ba),0.0,1.0)-pa),
  49. dot2(cb*clamp(dot(cb,pb)/dot2(cb),0.0,1.0)-pb) ),
  50. dot2(ac*clamp(dot(ac,pc)/dot2(ac),0.0,1.0)-pc) )
  51. :
  52. dot(nor,pa)*dot(nor,pa)/dot2(nor)), PlaneNormal(a, b, c));
  53. }
  54.  
  55. vec4 min2( vec4 d1, vec4 d2 )
  56. {
  57. return (d1.x < d2.x) ? d1 : d2;
  58. }
  59.  
  60. vec4 Planes(vec3 p)
  61. {
  62. vec4 p0, p1, p2, p3;
  63. vec3 a1 = vec3(-3, 1., 5);
  64. vec3 a2 = vec3(-3., 3., 6.);
  65. vec3 a3 = vec3(-2., 1., 7.);
  66. vec3 a4 = vec3(-6., 1., 7.);
  67.  
  68. p0 = udTriangle(p, a1, a2, a3);
  69. p1 = udTriangle(p, a1, a2, a4);
  70. p2 = udTriangle(p, a2, a3, a4);
  71. p3 = udTriangle(p, a1, a3, a4);
  72.  
  73. return min2(min2(min2(p0, p1), p2), p3);
  74. }
  75.  
  76. float GetDist(vec3 p)
  77. {
  78. float planeDist = p.y;
  79.  
  80. float td = sdTorus(p-vec3(0,.5,6), vec2(1.5, .4));
  81. float bd = Planes(p).x;
  82. float cyld = sdCylinder(p, vec3(0, .3, 3), vec3(3, .3, 5), .3);
  83.  
  84. float d = min(td, planeDist);
  85. d = min(d, bd);
  86.  
  87. d = min(d, cyld);
  88.  
  89. return d;
  90. }
  91.  
  92. float RayMarch(vec3 ro, vec3 rd) {
  93. float dO=0.;
  94.  
  95. for(int i=0; i<MAX_STEPS; i++) {
  96. vec3 p = ro + rd*dO;
  97. float dS = GetDist(p);
  98. dO += dS;
  99. if(dO>MAX_DIST || dS<SURF_DIST) break;
  100. }
  101.  
  102. return dO;
  103. }
  104.  
  105. vec3 GetNormal(vec3 p) {
  106. float d = GetDist(p);
  107. vec2 e = vec2(.001, 0);
  108.  
  109. vec3 n = d - vec3(
  110. GetDist(p-e.xyy),
  111. GetDist(p-e.yxy),
  112. GetDist(p-e.yyx));
  113. if(Planes(p).x <= .01 && Planes(p).x >= 0.)
  114. {
  115. return normalize(Planes(p).yzw);
  116. }
  117. return normalize(n);
  118. }
  119.  
  120. float GetLight(vec3 p) {
  121. vec3 lightPos = vec3(0, 5, 6);
  122. lightPos.xz += vec2(sin(iTime), cos(iTime))*10.;
  123. vec3 l = normalize(lightPos-p);
  124. vec3 n = GetNormal(p);
  125. float dif = clamp(dot(n, l), 0., 1.);
  126. float d = RayMarch(p+n*SURF_DIST*2., l);
  127. if(d<length(lightPos-p)) dif *= .1;
  128.  
  129. return dif;
  130. }
  131.  
  132. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  133. {
  134. vec2 uv = (fragCoord-.5*iResolution.xy)/iResolution.y;
  135.  
  136. vec3 col = vec3(0);
  137.  
  138. vec3 ro = vec3(0, 2, 0);
  139. vec3 rd = normalize(vec3(uv.x, uv.y-.2, 1));
  140.  
  141. float d = RayMarch(ro, rd);
  142.  
  143. vec3 p = ro + rd * d;
  144.  
  145. float dif = GetLight(p);
  146. col = vec3(dif);
  147.  
  148. fragColor = vec4(col,1.0);
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement