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

  1. /*********************************
  2.  *AUTHOR: Ken Musgrave.
  3.  *    Conversion to Shading Language and minor modifications by Fredrik BrĪ£nnbacka.
  4.  *
  5.  *
  6.  * REFERENCES:
  7.  *    _Texturing and Modeling: A Procedural Approach_, by David S. Ebert, ed.,
  8.  *    F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, and Steven Worley.
  9.  *    Academic Press, 1998.  ISBN 0-12-228730-4.
  10.  *
  11.  *********************************/
  12.  #include "k3d_noises.h"
  13.  
  14. displacement
  15. k3d_fractal(float H = 0.8, lacunarity = 2.5, octaves = 7, offset = 0.9, sharpness = 4, threshold = 12, Kt = 0.1)
  16. {
  17.     float result, signal, weight, i, exponent;
  18.     point PP =transform("shader",P);
  19.     normal Nn = normalize(N);    
  20.     for( i=0; i<octaves; i += 1 ) {
  21.                /* First octaves */
  22.  
  23.                if ( i == 0) {
  24.                   signal = snoise2( PP );
  25.                   if ( signal < 0.0 ) signal = -signal;
  26.                   signal = offset - signal;
  27.                   signal = pow( signal, sharpness );
  28.                              /*This should give you a power function to control
  29.                              sharpness of the ridges. Or you can just use the
  30.                              original one -- signal *= signal;*/
  31.                   result = signal;
  32.                   weight = 1.0;
  33.             }else{
  34.             
  35.                   exponent = pow( lacunarity, (-i*H) );
  36.             /*
  37.                   PP.x *= lacunarity;
  38.                   PP.y *= lacunarity;
  39.                   PP.z *= lacunarity;
  40.             */
  41.             PP = PP * lacunarity;
  42.                   /* weigh successive contributions by previous signal */
  43.                   weight = signal * threshold;
  44.                   weight = clamp(weight,0,1)    ;            
  45.                   signal = snoise2( PP );
  46.  
  47.                   /* get absolute value of signal*/
  48.                   signal = abs(signal);
  49.  
  50.                   /* invert and translate*/
  51.                   signal = offset - signal;
  52.  
  53.                   /* sharpen the ridge*/
  54.                   signal = pow( signal, sharpness ); /* Or signal *= signal;*/
  55.  
  56.                   /* weight the contribution*/
  57.                   signal *= weight;
  58.                   result += signal * exponent;
  59.                }
  60.     }
  61.  
  62.     P+= Nn*result*Kt;
  63.       N = calculatenormal(P);    
  64. }
  65.