home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / share / k3d / shaders / surface / k3d_texblender.sl < prev    next >
Encoding:
Text File  |  2008-01-23  |  5.2 KB  |  206 lines

  1.  
  2.  
  3. #include "k3d_filterwidth.h"
  4. #include "k3d_project.h"
  5. #include "k3d_displace.h"
  6. #include "k3d_material.h"
  7. #include "k3d_reflections.h"
  8. #include "k3d_locillum.h"
  9. #include "k3d_noises.h"
  10.  
  11. color altMaterialPlastic (normal Nf;  color basecolor,selftcolor,Rcolor,RFcolor;
  12.                        float Ka, Kd, Ks, roughness,selft,Kr,Krfr;)
  13. {
  14.     extern vector I;
  15.     return (basecolor * ( Ka*ambient() + Kd*diffuse(Nf)+selft*selftcolor ) )
  16.        + Kr*Rcolor+Krfr*RFcolor
  17.      + Ks*specular(Nf,-normalize(I),roughness);
  18. }
  19.  
  20. color
  21. myEnvironment (point P;  vector R;  float Kr, blur;  DECLARE_ENVPARAMS;)
  22. {
  23.     color C = 0;
  24.     float alpha;
  25.     if (envname != "") {
  26.         if (envspace == "NDC")
  27.             C = ReflMap (envname, P, blur, alpha);
  28.         else
  29.             C = Environment (envname, envspace, envrad, P, R, blur, alpha);
  30.     }
  31.     return C;
  32. }
  33.  
  34. float myrand(point p;)
  35. {
  36.     float x,hx;
  37.     x=abs(xcomp(p));
  38.     x+=abs(ycomp(p));
  39.     x+=abs(zcomp(p));
  40.  
  41.     float n=log(x,10);
  42.     n-=6;
  43.     n=round(n);
  44.     x=x/pow(10,n);
  45.     hx=mod(x,1000000)/1000;
  46.     x=mod(x+hx+x*100,1000);
  47.     return x/1000;
  48. }
  49.  
  50. float tex_clouds(point P;float depth)
  51. {
  52.     float val=0;
  53.     float i,arm=1;
  54.     float Karm=1;
  55.  
  56.     for(i=0;i<depth;i=i+1)
  57.     {
  58.         //val=val*(1-Karm)+Karm*snoise(arm*P);
  59.         val=val+Karm*snoise(arm*P);
  60.         Karm*=0.8;
  61.         arm*=2;
  62.     }
  63.     return clamp((val+1)/2,0,1);
  64. }
  65.  
  66. float tex_wood(point PP; float ringscale)
  67. {
  68.     float grainy = 1;
  69.  
  70.     float my_t = zcomp(PP) / ringscale;
  71.     point PQ = point (xcomp(PP)*8, ycomp(PP)*8, zcomp(PP));
  72.     my_t += noise (PQ) / 16;
  73.  
  74.     PQ = point (xcomp(PP), my_t, ycomp(PP)+12.93);
  75.     float r = ringscale * noise (PQ);
  76.     r -= floor (r);
  77.     r = 0.2 + 0.8 * smoothstep(0.2, 0.55, r) * (1 - smoothstep(0.75, 0.8, r));
  78.     PQ = point (xcomp(PP)*128+5, zcomp(PP)*8-3, ycomp(PP)*128+1);
  79.     float r2 = grainy * (1.3 - noise (PQ)) + (1-grainy);
  80.  
  81.     return clamp(r*r2*r2,0,1);
  82. }
  83.  
  84. color colorMap(string mapname, space; 
  85.         float scalex, scaley, scalez, octaves, blur;)
  86. {
  87.     point transp;
  88.     color newc;
  89.  
  90.     transp=transform(space,P)*vector (scalex, scaley, scalez);
  91.  
  92.     if (mapname=="clouds")
  93.         newc=tex_clouds(transp,octaves);
  94.     else if (mapname=="noise")
  95.         newc=myrand(transp);
  96.     else if (mapname=="wood")
  97.         newc=tex_wood(transp,octaves);
  98.     else 
  99.     {
  100.         newc=texture(mapname,s*scalex,t*scaley,"blur",blur,"fill",-1,"width",0);
  101.     if (comp(newc,1)==-1) newc=comp(newc,0); /* treat a 1-channel texture map as a greyscale */
  102.     }
  103.               return newc;
  104. }
  105.  
  106. color BlendColor(string mode; float K; color newc, oldc)
  107. {
  108.   color res=oldc;
  109.   if (mode=="m") res+=K*newc;
  110.   if (mode=="f") res*= (1-K)*(color 1)+K*newc;
  111.     return res;
  112. }
  113.  
  114. float BlendFloat(string mode; float K, newf, oldf)
  115. {
  116.   float res=oldf;
  117.  
  118.  if (mode=="m") res=(res+K*newf)/(1+K);
  119.  if (mode=="f") res*= ((1-K)+K*newf);
  120.  
  121.     return res;
  122. }
  123.  
  124. surface
  125. k3d_texblender (float Ka = 1, Kd = .5, Ks = .2, roughness = .3, Kr=0,selft=0;
  126.         float Rblur=0.1,RFblur=0.1;
  127.         float Krfr=0,eta=0.8,Ko=1;
  128.  
  129.         float cKmap[5]={0,0,0,0,0};
  130.         float oKmap[5]={0,0,0,0,0};
  131.         float sKmap[5]={0,0,0,0,0};
  132.         float mKmap[5]={0,0,0,0,0};
  133.         float bKmap[5]={0,0,0,0,0};
  134.         float rKmap[5]={0,0,0,0,0};
  135.         float iKmap[5]={0,0,0,0,0};
  136.         float aKmap[5]={0,0,0,0,0};
  137.         float nGmap=0;
  138.         float Kcs=1;
  139.         float Sgmx[5]={1,1,1,1,1},Sgmy[5]={1,1,1,1,1},Sgmz[5]={1,1,1,1,1};
  140.         float Depth[5]={3,3,3,3,3};
  141.         float Gblur[5]={0,0,0,0,0};
  142.         string Gmapname[5]={"","","","",""};
  143.         string Gspace[5]={"object","object","object","object","object"};
  144.         string Gmode[5]={"m","m","m","m","m"};
  145.  
  146.         DECLARE_DEFAULTED_ENVPARAMS;
  147.     )
  148. {
  149.     color Ct = Kcs*Cs, Ot = Os*Ko,Cselft=Kcs*Cs;
  150.     float ks = Ks,kr=Kr;
  151.     float disp = 0,i,Alpha=1;
  152.     vector V ,D,badN,corr,dispDir,ndir;
  153.  
  154.     normal Nf =normalize( faceforward(normalize(N),I));
  155.     dispDir=normalize( faceforward(normalize(Ng),I));
  156.     corr=Nf-dispDir;
  157.  
  158.     for(i=0;i<nGmap;i=i+1)
  159.     {
  160.         
  161.         color MC=colorMap(Gmapname[i],Gspace[i],Sgmx[i],Sgmy[i],Sgmz[i],
  162.                                             Depth[i],Gblur[i]);
  163.     float MF=(comp(MC,0)+comp(MC,1)+comp(MC,2))/3; // when we want a float
  164.         string mode=Gmode[i];
  165.         
  166.         if((Alpha*cKmap[i])!=0) Ct=BlendColor(mode,Alpha*cKmap[i],MC,Ct);
  167.         if((Alpha*oKmap[i])!=0) Ot=BlendColor(mode,Alpha*oKmap[i],MC,Ot);
  168.         if((Alpha*sKmap[i])!=0) ks=BlendFloat(mode,Alpha*sKmap[i],MF,ks);
  169.         if((Alpha*mKmap[i])!=0) kr=BlendFloat(mode,Alpha*mKmap[i],MF,kr);
  170.         if((Alpha*rKmap[i])!=0) roughness=BlendFloat(mode,Alpha*rKmap[i],
  171.                                                  MF,roughness);
  172.         if(aKmap[i]!=0) Alpha=BlendFloat("f",aKmap[i],MF,1);
  173.         if((Alpha*iKmap[i])!=0) selft=BlendFloat(mode,Alpha*iKmap[i],MF,selft);
  174.         if((Alpha*bKmap[i])!=0) disp=BlendFloat(mode,Alpha*bKmap[i],MF,disp);
  175.     }
  176.     if(disp!=0)
  177.     {
  178.             ndir=normalize(corr+Displace(dispDir,"shader",disp,0));
  179.             ndir=normalize(ndir-(Nf*(ndir.Nf)));
  180.             ndir=normalize(Nf+ndir);
  181.             ndir=normalize(ndir-(Nf*(ndir.Nf)));
  182.             Nf+=disp*(normalize(ndir));
  183.             Nf=normalize(Nf);
  184.     }
  185.  
  186.     color env=0,benv=0;
  187.     float olds=raysamples;
  188.     V = normalize(I);
  189.     
  190.     if((kr!=0) && (((Nf.V)>=0) || (raylevel()==0)) ) 
  191.     {
  192.         if(Rblur==0) raysamples=1;
  193.         env=myEnvironment(P,normalize(reflect(V,Nf)),1,Rblur,ENVPARAMS);
  194.     }
  195.     if(Krfr!=0) 
  196.     {
  197.         if(RFblur==0) raysamples=1;
  198.         else raysamples=olds;
  199.         benv=myEnvironment(P,refract(V,Nf,(V.Nf > 0) ? 1.0/eta : eta),1,RFblur,ENVPARAMS);
  200.     }
  201.     Ci = altMaterialPlastic (Nf,Ct,Cselft,env,benv,
  202.                 Ka,Kd,ks,roughness,selft,kr,Krfr);
  203.     Oi = Ot;  Ci *= Oi;
  204. }
  205.  
  206.