Cycles / OSL:
authorThomas Dinges <blender@dingto.org>
Sun, 2 Sep 2012 16:06:18 +0000 (16:06 +0000)
committerThomas Dinges <blender@dingto.org>
Sun, 2 Sep 2012 16:06:18 +0000 (16:06 +0000)
* Updates for noise_turbulence, to match svm function.

intern/cycles/kernel/osl/nodes/node_noise_texture.osl
intern/cycles/kernel/osl/nodes/node_texture.h
intern/cycles/kernel/osl/nodes/node_wave_texture.osl

index bc59f115ccedd87f61ec58ca59d6f2baee1c5127..7738902f52938123f1082203a33315bf9d578baf 100644 (file)
@@ -35,7 +35,7 @@ float noise(point p, string basis, float distortion, float detail)
                p += r;
        }
 
-       fac = noise_turbulence(p, basis, (int)detail, hard);
+       fac = noise_turbulence(p, basis, detail, hard);
        
        return fac;
     
index d2dbd6db8b3ef97a44b4b7ce30fbd4d38e58b5f5..5f3d4d9f3bf1d92ea123a05374fa00dcfd0a2e75 100644 (file)
@@ -212,14 +212,17 @@ float noise_wave(string wave, float a)
 
 /* Turbulence */
 
-float noise_turbulence(point p, string basis, int octaves, int hard)
+float noise_turbulence(point p, string basis, float octaves, int hard)
 {
        float fscale = 1.0;
        float amp = 1.0;
        float sum = 0.0;
-       int i;
+       int i, n;
+       
+       octaves = clamp(octaves, 0.0, 16.0);
+       n = (int)octaves;
 
-       for (i = 0; i <= octaves; i++) {
+       for (i = 0; i <= n; i++) {
                float t = noise_basis(fscale * p, basis);
 
                if (hard)
@@ -229,10 +232,26 @@ float noise_turbulence(point p, string basis, int octaves, int hard)
                amp *= 0.5;
                fscale *= 2.0;
        }
+       
+       float rmd = octaves - floor(octaves);
+
+       if(rmd != 0.0) {
+               float t = noise_basis(fscale*p, basis);
+
+               if(hard)
+                       t = fabs(2.0*t - 1.0);
 
-       sum *= ((float)(1 << octaves) / (float)((1 << (octaves + 1)) - 1));
+               float sum2 = sum + t*amp;
 
-       return sum;
+               sum *= ((float)(1 << n)/(float)((1 << (n+1)) - 1));
+               sum2 *= ((float)(1 << (n+1))/(float)((1 << (n+2)) - 1));
+
+               return (1.0 - rmd)*sum + rmd*sum2;
+       }
+       else {
+               sum *= ((float)(1 << n)/(float)((1 << (n+1)) - 1));
+               return sum;
+       }
 }
 
 /* Utility */
index 83f55631f98c991a7b5ac767a4944d17052dbad6..693f09ae24c6c036025643ef3e6bd27cb107beb1 100644 (file)
@@ -38,7 +38,7 @@ float wave(point p, float scale, string type, float detail, float distortion, fl
        }
        
        if(distortion != 0.0) {
-               n = n +(distortion * noise_turbulence(p*dscale, "Perlin", (int)detail, 0));
+               n = n +(distortion * noise_turbulence(p*dscale, "Perlin", detail, 0));
        }
        result = noise_wave("Sine", n);