Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/nodes/shader/nodes/node_shader_noise.h')
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_noise.h32
1 files changed, 28 insertions, 4 deletions
diff --git a/source/blender/nodes/shader/nodes/node_shader_noise.h b/source/blender/nodes/shader/nodes/node_shader_noise.h
index 44aa8f6bb41..7f633820124 100644
--- a/source/blender/nodes/shader/nodes/node_shader_noise.h
+++ b/source/blender/nodes/shader/nodes/node_shader_noise.h
@@ -444,14 +444,17 @@ MINLINE float noise_wave(int wave, float a)
/* Turbulence */
-MINLINE float noise_turbulence(float p[3], int basis, int octaves, int hard)
+MINLINE float noise_turbulence(float p[3], int basis, float octaves, int hard)
{
float fscale = 1.0f;
float amp = 1.0f;
float sum = 0.0f;
- int i;
+ float rmd;
+ int i, n;
+
+ octaves = CLAMPIS(octaves, 0.0f, 16.0f);
- for(i = 0; i <= octaves; i++) {
+ for(i = 0; i <= (int)octaves; i++) {
float pscale[3] = {fscale*p[0], fscale*p[1], fscale*p[2]};
float t = noise_basis(pscale, basis);
@@ -463,7 +466,28 @@ MINLINE float noise_turbulence(float p[3], int basis, int octaves, int hard)
fscale *= 2.0f;
}
- sum *= ((float)(1 << octaves)/(float)((1 << (octaves+1)) - 1));
+ rmd = octaves - floor(octaves);
+
+ if(rmd != 0.0f) {
+ float pscale[3] = {fscale*p[0], fscale*p[1], fscale*p[2]};
+ float t = noise_basis(pscale, basis);
+ float sum2;
+
+ if(hard)
+ t = fabsf(2.0f*t - 1.0f);
+
+ 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.0f - rmd)*sum + rmd*sum2;
+ }
+ else {
+ sum *= ((float)(1 << n)/(float)((1 << (n+1)) - 1));
+ return sum;
+ }
+
return sum;
}