Advertisement
Guest User

Untitled

a guest
Apr 14th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. uniform vec3 cam;
  2. //uniform vec4 trans[20];
  3. uniform int sdf_type[101];
  4. uniform vec3 sdf_place[300];
  5. uniform vec3 sdf_size[300];
  6. uniform float sdf_value[101];
  7. uniform float edge[101];
  8.  
  9. uniform vec3 light[300];
  10. uniform vec3 l_color[300];
  11. uniform float specular[101];
  12. uniform float tonality[101];
  13.  
  14. varying vec2 v_vTexcoord;
  15. varying vec3 v_vPosition;
  16. //////////////Functions//////////////
  17. mat4 Axis( vec3 v, float angle )
  18. {
  19.     float ss = sin( angle );
  20.     float c = cos( angle );
  21.     float ic = 1.0 - c;
  22.     return mat4( v.x*v.x*ic + c,     v.y*v.x*ic - ss*v.z, v.z*v.x*ic + ss*v.y, 0.0,
  23.                  v.x*v.y*ic + ss*v.z, v.y*v.y*ic + c,     v.z*v.y*ic - ss*v.x, 0.0,
  24.                  v.x*v.z*ic - ss*v.y, v.y*v.z*ic + ss*v.x, v.z*v.z*ic + c,     0.0,
  25.               0.0,                0.0,                0.0,                1.0 );
  26. }
  27. mat4 trans = Axis(vec3(0.,0.,0.),0.0);
  28. ////////Shapes//////////
  29. float ellipsoid( vec3 pp, vec3 ss )
  30. {
  31.     float k0 = length(pp/ss);
  32.     return k0*(k0-1.0)/length(pp/(ss*ss));
  33. }
  34. float box(vec3 pp, vec3 ss)
  35. {
  36.     return length(max(abs(pp)-ss / 2.,0.));
  37. }
  38. float cylinder( vec3 pp, vec3 ss )
  39. {
  40.     vec2 d = abs(vec2(length(vec2(pp.x,pp.z)),pp.y)) - ss.xy;
  41.     return min(max(d.x,d.y),0.0) + length(max(d,0.0));
  42. }
  43. float cone( vec3 pp, vec3 ss )
  44. {
  45.     vec2 qq = vec2( length(vec2(pp.x,pp.z)), pp.y );
  46.     vec2 k1 = vec2(ss.z,ss.xy);
  47.     vec2 k2 = vec2(ss.z,2.0*ss.xy);
  48.     vec2 ca = vec2(qq.x-min(qq.x,(qq.y < 0.0)?0.0:ss.z), abs(qq.y)-ss.y);
  49.     vec2 cb = qq - k1 + k2*clamp(dot(k1-qq,k2)/dot(k2,k2), 0.0, 1.0 );
  50.     float fs = (cb.x < 0.0 && ca.y < 0.0) ? -1.0 : 1.0;
  51.     return fs*sqrt( min(dot(ca,ca),dot(cb,cb)) );
  52. }
  53. ///////////Tools//////////////
  54. float sdf_blend(float d1, float d2, float k)
  55. {
  56.  return k * d1 + (1. - k) * d2;
  57. }
  58. float sdf_round( float pp, float h )
  59. {
  60.     return pp - h;
  61. }
  62. float sdf_union( float d1, float d2, float k )
  63. {
  64.     float h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 );
  65.     return mix( d2, d1, h ) - k*h*(1.0-h);
  66. }
  67. float subtract( float d1, float d2, float k )
  68. {
  69.     float h = clamp( 0.5 - 0.5*(d2+d1)/k, 0.0, 1.0 );
  70.     return mix( d2, -d1, h ) + k*h*(1.0-h);
  71. }
  72. float intersect( float d1, float d2, float k )
  73. {
  74.     float h = clamp( 0.5 - 0.5*(d2-d1)/k, 0.0, 1.0 );
  75.     return mix( d2, d1, h ) + k*h*(1.0-h);
  76. }
  77. float displace( float d1, vec3 pp, vec3 ss )
  78. {
  79.     float d2 = sin(ss.x*pp.x)*sin(ss.y*pp.y)*sin(ss.z*pp.z);
  80.     return d1+d2;
  81. }
  82. vec3 twist( vec3 pp )
  83. {
  84.     const float k = 1.0; // or some other amount
  85.     float c = cos(k*pp.y);
  86.     float ss = sin(k*pp.y);
  87.     mat3 m = mat3(c,-ss,0.,ss,c,0., 0.,0.,1.);
  88.     return vec3((m*vec3(pp.x,pp.z,0.)).xy,pp.y);
  89. }
  90. vec3 bend( vec3 pp )
  91. {
  92.     const float k = 0.1; // or some other amount
  93.     float c = cos(k*pp.x);
  94.     float ss = sin(k*pp.x);
  95.     mat3 m = mat3(c,-ss,0.,ss,c,0., 0.,0.,1.);
  96.     return vec3((m*vec3(pp.xy,0.)).xy,pp.z);
  97. }
  98. ////////////Lighting//////////////
  99. float sdf_shape (int tt, float dd, vec3 pp, vec3 ss, float vv, float ee)
  100. {
  101.     float place_e = ee;
  102.     float place_d = dd; ///in case dd is not used at all
  103.     float place_v = clamp(vv,0.00000001,1000000.0); ///in case vv is not used at all
  104.     //vec3 qq = mod(pp,c)-0.5*c;///repetition
  105.     if (tt==0){return sdf_round(box(pp,ss),ee);}
  106.     if (tt==1){return sdf_round(cylinder(pp,ss),ee);}
  107.     if (tt==2){return sdf_round(cone(pp,ss),ee);}
  108.     if (tt==3){return sdf_round(ellipsoid(pp,ss),ee);}
  109.     //4
  110.     if (tt==5){return sdf_blend(place_d,sdf_round(box(pp,ss),ee),place_v);}
  111.     if (tt==6){return sdf_blend(place_d,sdf_round(cylinder(pp,ss),ee),place_v);}
  112.     if (tt==7){return sdf_blend(place_d,sdf_round(cone(pp,ss),ee),place_v);}
  113.     if (tt==8){return sdf_blend(place_d,ellipsoid(pp,ss),place_v);}
  114.     //9
  115.     if (tt==10){return sdf_union(place_d,sdf_round(box(pp,ss),ee),place_v);}
  116.     if (tt==11){return sdf_union(place_d,sdf_round(cylinder(pp,ss),ee),place_v);}
  117.     if (tt==12){return sdf_union(place_d,sdf_round(cone(pp,ss),ee),place_v);}
  118.     if (tt==13){return sdf_union(place_d,ellipsoid(pp,ss),place_v);}
  119.     return 100000000.;
  120. }
  121. vec3 sdf_normal (vec3 m)///apply normal values to shapes
  122. {
  123.  const float eps = .01;
  124.  const int max_input = 2;
  125.  vec3 p1 = m + vec3(eps,0.,0.);
  126.  vec3 p2 = m - vec3(eps,0.,0.);
  127.  vec3 p3 = m + vec3(0.,eps,0.);
  128.  vec3 p4 = m - vec3(0.,eps,0.);
  129.  vec3 p5 = m + vec3(0.,0.,eps);
  130.  vec3 p6 = m - vec3(0.,0.,eps);
  131.  float d1 = sdf_shape(sdf_type[0],0.,(trans*vec4(p1+sdf_place[0],1.)).xyz,sdf_size[0],sdf_value[0],edge[0]);
  132.  float d2 = sdf_shape(sdf_type[0],0.,(trans*vec4(p2+sdf_place[0],1.)).xyz,sdf_size[0],sdf_value[0],edge[0]);
  133.  float d3 = sdf_shape(sdf_type[0],0.,(trans*vec4(p3+sdf_place[0],1.)).xyz,sdf_size[0],sdf_value[0],edge[0]);
  134.  float d4 = sdf_shape(sdf_type[0],0.,(trans*vec4(p4+sdf_place[0],1.)).xyz,sdf_size[0],sdf_value[0],edge[0]);
  135.  float d5 = sdf_shape(sdf_type[0],0.,(trans*vec4(p5+sdf_place[0],1.)).xyz,sdf_size[0],sdf_value[0],edge[0]);
  136.  float d6 = sdf_shape(sdf_type[0],0.,(trans*vec4(p6+sdf_place[0],1.)).xyz,sdf_size[0],sdf_value[0],edge[0]);
  137.  for(int i = 0; i < max_input; i++)
  138.  {
  139.     if (i > 0)
  140.     {
  141.         d1 = sdf_shape(sdf_type[i],d1,p1+sdf_place[i],sdf_size[i],sdf_value[i],edge[i]);
  142.         d2 = sdf_shape(sdf_type[i],d2,p2+sdf_place[i],sdf_size[i],sdf_value[i],edge[i]);
  143.         d3 = sdf_shape(sdf_type[i],d3,p3+sdf_place[i],sdf_size[i],sdf_value[i],edge[i]);
  144.         d4 = sdf_shape(sdf_type[i],d4,p4+sdf_place[i],sdf_size[i],sdf_value[i],edge[i]);
  145.         d5 = sdf_shape(sdf_type[i],d5,p5+sdf_place[i],sdf_size[i],sdf_value[i],edge[i]);
  146.         d6 = sdf_shape(sdf_type[i],d6,p6+sdf_place[i],sdf_size[i],sdf_value[i],edge[i]);
  147.     }
  148.  }
  149.  return normalize(vec3(d1-d2,d3-d4,d5-d6));
  150. }
  151. vec4 simpleLambert (vec3 normal, vec3 look) ///light and shade to shapes
  152. {
  153.  vec3 lightDir = light[0]; // Light direction
  154.  vec3 lightCol = l_color[0]; // Light color
  155.  
  156.  float NdotL = max(dot(normal, lightDir),0.);
  157.  vec3 h = (lightDir - look) / 2.;
  158.  float spec = pow( dot(normal, h), tonality[0]) * specular[0];//
  159.  
  160.  return vec4(lightCol * vec3(0.4,0.7,1.) + spec * NdotL, 1.);// ;
  161. }
  162. vec4 renderSurface(vec3 l, vec3 look)//////render shape, with lighting and everything
  163. {
  164.  vec3 n = sdf_normal(l);
  165.  return simpleLambert(n, look);
  166. }
  167. /////
  168. vec4 raymarch (vec3 pp, vec3 direction)
  169. {
  170.  const int max_input = 2;
  171.  for (int i = 0; i < 64; i++)///<---64/32/16
  172.  {
  173.  float d1 = sdf_shape(sdf_type[0],0.,(trans*vec4(pp+sdf_place[0],1.)).xyz,sdf_size[0],sdf_value[0],edge[0]);
  174.  for(int i = 0; i < max_input; i++)
  175.  {
  176.     if (i > 0)
  177.     {
  178.         d1 = sdf_shape(sdf_type[i],d1,pp+sdf_place[i],sdf_size[i],sdf_value[i],edge[i]);
  179.     }
  180.  }
  181.   //float d2 = sdf_shape(10,d1,pp+sdf_place[1],sdf_size[1],sdf_value[1]);
  182.   float dist = d1;
  183.   if (dist < 0.002)
  184.   {
  185.     float res = 1.0;
  186.     for( float tt=0.; tt < 6.; tt+=0.)/// mint = a[0]; maxt = a[1];
  187.     {
  188.         vec3 h = pp + (light[0]*tt);
  189.         float q1 = sdf_shape(sdf_type[0],0.,(trans*vec4(h+sdf_place[0],1.)).xyz,sdf_size[0],sdf_value[0],edge[0]);
  190.         for(int e = 0; e < max_input; e++)
  191.         {
  192.             if (e > 0)
  193.             {
  194.                 q1 = sdf_shape(sdf_type[e],q1,h+sdf_place[e],sdf_size[e],sdf_value[e],edge[e]);
  195.             }
  196.         }
  197.         if( q1<0.0000005 ) {res = 0.0; tt = 100000.;}///apply darkness
  198.         res = min( res, 2.*q1/tt );
  199.         tt += q1;
  200.     }
  201.     vec4 img = renderSurface(pp, direction);
  202.     float ao = 1. - float(i) / (64.-1.);
  203.     float amb = 0.5;
  204.     res = (amb + res) * (1.-amb);
  205.     //img.rgb += vec3(0.5,0.5,0.5);
  206.     img.rgb *= (ao * res);
  207.  
  208.     return img;
  209.   }
  210.   pp += dist * direction;
  211.  }
  212.  return vec4(1.,0.,0.,0.);
  213. }
  214. ///////////////MAIN/////////////////
  215. void main()
  216. {
  217.     gl_FragColor = raymarch(v_vPosition, normalize(v_vPosition - cam));
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement