Advertisement
ilich2011

Untitled

May 22nd, 2019
529
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.75 KB | None | 0 0
  1. #define MAX_STEPS 100
  2. #define MAX_DIST 100.
  3. #define SURF_DIST .001
  4.  
  5.  
  6. mat2 Rot(float a) {
  7. float s = sin(a);
  8. float c = cos(a);
  9. return mat2(c, -s, s, c);
  10. }
  11.  
  12.  
  13. float sdCylinder(vec3 p, vec3 a, vec3 b, float r) {
  14. vec3 ab = b-a;
  15. vec3 ap = p-a;
  16.  
  17. float t = dot(ab, ap) / dot(ab, ab);
  18.  
  19. vec3 c = a + t*ab;
  20.  
  21. float x = length(p-c)-r;
  22. float y = (abs(t-.5)-.5)*length(ab);
  23. float e = length(max(vec2(x, y), 0.));
  24. float i = min(max(x, y), 0.);
  25.  
  26. return e+i;
  27. }
  28.  
  29. float sdTorus(vec3 p, vec2 r) {
  30. float x = length(p.xz)-r.x;
  31. return length(vec2(x, p.y))-r.y;
  32. }
  33.  
  34. vec3 PlaneNormal(vec3 v0, vec3 v1, vec3 v2)
  35. {
  36. vec3 x = v0 - v1;
  37. vec3 y = v0 - v2;
  38. vec3 n = cross(x, y);
  39. return vec3((n.y < 0.)?-n:n);
  40. }
  41.  
  42. float dot2( in vec3 v ) { return dot(v,v); }
  43. vec4 udTriangle( vec3 p, vec3 a, vec3 b, vec3 c )
  44. {
  45. vec3 ba = b - a; vec3 pa = p - a;
  46. vec3 cb = c - b; vec3 pb = p - b;
  47. vec3 ac = a - c; vec3 pc = p - c;
  48. vec3 nor = cross( ba, ac );
  49.  
  50. return vec4(sqrt(
  51. (sign(dot(cross(ba,nor),pa)) +
  52. sign(dot(cross(cb,nor),pb)) +
  53. sign(dot(cross(ac,nor),pc))<2.0)
  54. ?
  55. min( min(
  56. dot2(ba*clamp(dot(ba,pa)/dot2(ba),0.0,1.0)-pa),
  57. dot2(cb*clamp(dot(cb,pb)/dot2(cb),0.0,1.0)-pb) ),
  58. dot2(ac*clamp(dot(ac,pc)/dot2(ac),0.0,1.0)-pc) )
  59. :
  60. dot(nor,pa)*dot(nor,pa)/dot2(nor)), PlaneNormal(a, b, c));
  61. }
  62.  
  63. vec4 min2( vec4 d1, vec4 d2 )
  64. {
  65. return (d1.x < d2.x) ? d1 : d2;
  66. }
  67.  
  68. vec4 Planes(vec3 p)
  69. {
  70. vec4 p0, p1, p2, p3;
  71. vec3 a1 = vec3(-3, 1., -1);
  72. vec3 a2 = vec3(-3., 3., 0.);
  73. vec3 a3 = vec3(-2., 1., 1.);
  74. vec3 a4 = vec3(-6., 1., 1.);
  75.  
  76. p0 = udTriangle(p, a1, a2, a3);
  77. p1 = udTriangle(p, a1, a2, a4);
  78. p2 = udTriangle(p, a2, a3, a4);
  79. p3 = udTriangle(p, a1, a3, a4);
  80.  
  81. return min2(min2(min2(p0, p1), p2), p3);
  82. }
  83.  
  84. float GetDist(vec3 p)
  85. {
  86. float planeDist = p.y;
  87.  
  88. float td = sdTorus(p-vec3(0,.5,0), vec2(1.5, .4));
  89. float bd = Planes(p).x;
  90. float cyld = sdCylinder(p, vec3(0, .7, -3), vec3(3, .7, -1), .3);
  91.  
  92. float d = min(td, planeDist);
  93. d = min(d, bd);
  94.  
  95. d = min(d, cyld);
  96.  
  97. return d;
  98. }
  99.  
  100. float GetDist2(vec3 p) {
  101. vec4 s = vec4(0, 1, 6, 1);
  102.  
  103. float td = sdTorus(p-vec3(0,.5,0), vec2(1.5, .4));
  104. float bd = Planes(p).x;
  105. float cyld = sdCylinder(p, vec3(0, .7, -3), vec3(3, .7, -1), .3);
  106.  
  107. float d = min(td, bd);
  108.  
  109. d = min(d, cyld);
  110.  
  111. return d;
  112. }
  113.  
  114.  
  115. float RayMarch(vec3 ro, vec3 rd) {
  116. float dO=0.;
  117.  
  118. for(int i=0; i<MAX_STEPS; i++) {
  119. vec3 p = ro + rd*dO;
  120. float dS = GetDist(p);
  121. dO += dS;
  122. if(dO>MAX_DIST || dS<SURF_DIST) break;
  123. }
  124.  
  125. return dO;
  126. }
  127.  
  128.  
  129. float RayMarch2(vec3 ro, vec3 rd) {
  130. float dO=0.;
  131.  
  132. for(int i=0; i<MAX_STEPS; i++) {
  133. vec3 p = ro + rd*dO;
  134. float dS = GetDist2(p);
  135. dO += dS;
  136. if(dO>MAX_DIST || dS<SURF_DIST) break;
  137. }
  138.  
  139. return dO;
  140. }
  141.  
  142.  
  143. vec3 GetNormal(vec3 p) {
  144. float d = GetDist(p);
  145. vec2 e = vec2(.001, 0);
  146.  
  147. vec3 n = d - vec3(
  148. GetDist(p-e.xyy),
  149. GetDist(p-e.yxy),
  150. GetDist(p-e.yyx));
  151. if(Planes(p).x <= .01 && Planes(p).x >= 0.)
  152. {
  153. return normalize(Planes(p).yzw);
  154. }
  155. return normalize(n);
  156. }
  157.  
  158. float GetLight(vec3 p) {
  159. vec3 lightPos = vec3(0, 5, 6);
  160. lightPos.xz += vec2(sin(iTime), cos(iTime))*10.;
  161. vec3 l = normalize(lightPos-p);
  162. vec3 n = GetNormal(p);
  163. float dif = clamp(dot(n, l), 0., 1.);
  164. float d = RayMarch(p+n*SURF_DIST*2., l);
  165. if(d<length(lightPos-p)) dif *= .1;
  166.  
  167. return dif;
  168. }
  169.  
  170.  
  171. vec3 Rot1(vec2 uv, vec3 p, vec3 l, float z) {
  172. vec3 f = normalize(l-p),
  173. r = normalize(cross(vec3(0,1,0), f)),
  174. u = cross(f,r),
  175. c = p+f*z,
  176. i = c + uv.x*r + uv.y*u,
  177. d = normalize(i-p);
  178. return d;
  179. }
  180.  
  181. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  182. {
  183. vec2 uv = (fragCoord-.5*iResolution.xy)/iResolution.y;
  184.  
  185. vec3 col = vec3(0);
  186.  
  187. vec3 ro = vec3(2, 2, -5);
  188. ro.yz *= Rot(.4);
  189. ro.xz *= Rot(iTime*.2);
  190. vec3 rd = Rot1(uv, ro, vec3(0,0,0), .7);
  191. float d = RayMarch(ro, rd);
  192.  
  193. vec3 p = ro + rd * d;
  194.  
  195. float dif = GetLight(p);
  196. col = vec3(dif);
  197.  
  198.  
  199.  
  200. vec3 p_m = vec3(0.);
  201. if(p.y <= SURF_DIST)
  202. {
  203. rd = normalize(vec3(rd.x, -rd.y+(0.1*cos(iTime - (p.x + p.z)*9.3)), rd.z));
  204. d = RayMarch2(p, rd);
  205.  
  206. p_m = p + rd * d;
  207. dif = GetLight(p_m);
  208. col = vec3(dif, dif, dif + 0.3);
  209. }
  210.  
  211.  
  212.  
  213.  
  214. fragColor = vec4(col,1.0);
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement