diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2010-10-31 02:15:12 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2010-10-31 02:15:12 +0400 |
commit | aa7575c0080c5ba86ff7f2127619400809063a14 (patch) | |
tree | 996e7a4994f40c0d7ed58c167580ad6a9a07aff4 /source/blender/freestyle/intern/system/PseudoNoise.cpp | |
parent | e3747f7bee194e8dc1a56292bdb247ccc8207062 (diff) |
Fix for occasional disappearance of strokes when using SpatialNoiseShader.
The PseudoNoise class for generating a series of noise values had a bug
involving a signed integer overflow when renders were at high image resolution.
This caused the noise generator to yield very large noise values, putting
strokes out of the renders' image boundary.
Diffstat (limited to 'source/blender/freestyle/intern/system/PseudoNoise.cpp')
-rwxr-xr-x | source/blender/freestyle/intern/system/PseudoNoise.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/source/blender/freestyle/intern/system/PseudoNoise.cpp b/source/blender/freestyle/intern/system/PseudoNoise.cpp index 87ee45e69b2..7a5fee2da4f 100755 --- a/source/blender/freestyle/intern/system/PseudoNoise.cpp +++ b/source/blender/freestyle/intern/system/PseudoNoise.cpp @@ -43,9 +43,10 @@ PseudoNoise::init (long seed) real PseudoNoise::linearNoise (real x) { - int i = x*NB_VALUE_NOISE; - real x1=_values[i%NB_VALUE_NOISE], x2=_values[(i+1)%NB_VALUE_NOISE]; - real t=x*real(NB_VALUE_NOISE)-real(i); + real tmp; + int i = modf(x, &tmp) * NB_VALUE_NOISE; + real x1=_values[i], x2=_values[(i+1)%NB_VALUE_NOISE]; + real t = modf(x * NB_VALUE_NOISE, &tmp); return x1*(1-t)+x2*t; } @@ -60,18 +61,18 @@ LanczosWindowed(real t) real PseudoNoise::smoothNoise (real x) { - int i = x*NB_VALUE_NOISE; - real t=x*real(NB_VALUE_NOISE)-real(i); - if (i - 1 < 0) + real tmp; + int i = modf(x, &tmp) * NB_VALUE_NOISE; + int h = i - 1; + if (h < 0) { - int plus=-i/NB_VALUE_NOISE; - i=i+NB_VALUE_NOISE*(plus+2); - t=(x+plus+2)*real(NB_VALUE_NOISE)-real(i); + h = NB_VALUE_NOISE + h; } - real x1=_values[i%NB_VALUE_NOISE], x2=_values[(i+1)%NB_VALUE_NOISE]; - real x0=_values[(i-1)%NB_VALUE_NOISE], x3=_values[(i+2)%NB_VALUE_NOISE]; + real x1=_values[i], x2=_values[(i+1)%NB_VALUE_NOISE]; + real x0=_values[h], x3=_values[(i+2)%NB_VALUE_NOISE]; + real t = modf(x * NB_VALUE_NOISE, &tmp); real y0=LanczosWindowed(-1-t); real y1=LanczosWindowed(-t); real y2=LanczosWindowed(1-t); |