Cycles / OSL:

* Updates for noise_turbulence, to match svm function.
This commit is contained in:
Thomas Dinges
2012-09-02 16:06:18 +00:00
parent e1bca6cfc4
commit b26d19a7b8
3 changed files with 26 additions and 7 deletions

View File

@@ -35,7 +35,7 @@ float noise(point p, string basis, float distortion, float detail)
p += r; p += r;
} }
fac = noise_turbulence(p, basis, (int)detail, hard); fac = noise_turbulence(p, basis, detail, hard);
return fac; return fac;

View File

@@ -212,14 +212,17 @@ float noise_wave(string wave, float a)
/* Turbulence */ /* 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 fscale = 1.0;
float amp = 1.0; float amp = 1.0;
float sum = 0.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); float t = noise_basis(fscale * p, basis);
if (hard) if (hard)
@@ -229,10 +232,26 @@ float noise_turbulence(point p, string basis, int octaves, int hard)
amp *= 0.5; amp *= 0.5;
fscale *= 2.0; fscale *= 2.0;
} }
float rmd = octaves - floor(octaves);
sum *= ((float)(1 << octaves) / (float)((1 << (octaves + 1)) - 1)); if(rmd != 0.0) {
float t = noise_basis(fscale*p, basis);
return sum; if(hard)
t = fabs(2.0*t - 1.0);
float sum2 = sum + t*amp;
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 */ /* Utility */

View File

@@ -38,7 +38,7 @@ float wave(point p, float scale, string type, float detail, float distortion, fl
} }
if(distortion != 0.0) { 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); result = noise_wave("Sine", n);