soc-2008-mxcurioni: resolved uint issues (replaced with unsigned int). Still NOT...
[blender.git] / source / blender / freestyle / intern / system / PseudoNoise.cpp
1
2 //
3 //  Copyright (C) : Please refer to the COPYRIGHT file distributed 
4 //   with this source distribution. 
5 //
6 //  This program is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU General Public License
8 //  as published by the Free Software Foundation; either version 2
9 //  of the License, or (at your option) any later version.
10 //
11 //  This program is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 //  GNU General Public License for more details.
15 //
16 //  You should have received a copy of the GNU General Public License
17 //  along with this program; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 //
20 ///////////////////////////////////////////////////////////////////////////////
21
22 #include <math.h>
23 #include "RandGen.h"
24 #include "PseudoNoise.h"
25
26 static const unsigned NB_VALUE_NOISE = 512;
27
28 real *PseudoNoise::_values;
29
30 PseudoNoise::PseudoNoise ()
31 {
32 }
33
34 void
35 PseudoNoise::init (long seed)
36 {
37   _values = new real[NB_VALUE_NOISE];
38   RandGen::srand48(seed);
39   for (unsigned int i=0; i<NB_VALUE_NOISE; i++)
40     _values[i] = -1.0 + 2.0 * RandGen::drand48();
41 }
42
43 real 
44 PseudoNoise::linearNoise (real x)
45 {
46   int i = x*NB_VALUE_NOISE;
47   real x1=_values[i%NB_VALUE_NOISE], x2=_values[(i+1)%NB_VALUE_NOISE];
48   real t=x*real(NB_VALUE_NOISE)-real(i);
49   return x1*(1-t)+x2*t;
50 }
51
52 real 
53 LanczosWindowed(real t)
54 {
55   if (fabs(t)>2) return 0;
56   if (fabs(t)<M_EPSILON) return 1.0;
57   return sin(M_PI*t)/(M_PI*t) * sin(M_PI*t/2.0)/(M_PI*t/2.0);
58 }
59
60 real 
61 PseudoNoise::smoothNoise (real x)
62 {
63   int i = x*NB_VALUE_NOISE;
64   real t=x*real(NB_VALUE_NOISE)-real(i);
65   if (i - 1 < 0)
66     {
67       int plus=-i/NB_VALUE_NOISE;
68       i=i+NB_VALUE_NOISE*(plus+2);
69       t=(x+plus+2)*real(NB_VALUE_NOISE)-real(i);
70     }
71
72   real x1=_values[i%NB_VALUE_NOISE], x2=_values[(i+1)%NB_VALUE_NOISE];
73   real x0=_values[(i-1)%NB_VALUE_NOISE], x3=_values[(i+2)%NB_VALUE_NOISE];
74
75   real y0=LanczosWindowed(-1-t);
76   real y1=LanczosWindowed(-t);
77   real y2=LanczosWindowed(1-t);
78   real y3=LanczosWindowed(2-t);
79   //    cerr<<"x0="<<x0<<"  x1="<<x1<<"  x2="<<x2<<"  x3="<<x3<<endl;
80   //    cerr<<"y0="<<y0<<"  y1="<<y1<<"  y2="<<y2<<"  y3="<<y3<<"  :";
81   return (x0*y0+x1*y1+x2*y2+x3*y3)/(y0+y1+y2+y3);
82 }
83
84 real 
85 PseudoNoise::turbulenceSmooth (real x, unsigned nbOctave)
86 {
87   real y=0;
88   real k=1.0;
89   for (unsigned i=0; i<nbOctave; i++)
90     {
91       y=y+k*smoothNoise(x*k);
92       k=k/2.0;
93     }
94   return y;
95 }
96
97 real 
98 PseudoNoise::turbulenceLinear (real x, unsigned nbOctave)
99 {
100   real y=0;
101   real k=1.0;
102   for (unsigned i=0; i<nbOctave; i++)
103     {
104       y=y+k*linearNoise(x*k);
105       k=k/2.0;
106     }
107   return y;
108 }