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:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2010-10-31 02:15:12 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2010-10-31 02:15:12 +0400
commitaa7575c0080c5ba86ff7f2127619400809063a14 (patch)
tree996e7a4994f40c0d7ed58c167580ad6a9a07aff4 /source/blender/freestyle/intern/system
parente3747f7bee194e8dc1a56292bdb247ccc8207062 (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')
-rwxr-xr-xsource/blender/freestyle/intern/system/PseudoNoise.cpp23
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);