7a5fee2da4f8fafb7b02af90ef748b12097e2298
[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   real tmp;
47   int i = modf(x, &tmp) * NB_VALUE_NOISE;
48   real x1=_values[i], x2=_values[(i+1)%NB_VALUE_NOISE];
49   real t = modf(x * NB_VALUE_NOISE, &tmp);
50   return x1*(1-t)+x2*t;
51 }
52
53 real 
54 LanczosWindowed(real t)
55 {
56   if (fabs(t)>2) return 0;
57   if (fabs(t)<M_EPSILON) return 1.0;
58   return sin(M_PI*t)/(M_PI*t) * sin(M_PI*t/2.0)/(M_PI*t/2.0);
59 }
60
61 real 
62 PseudoNoise::smoothNoise (real x)
63 {
64   real tmp;
65   int i = modf(x, &tmp) * NB_VALUE_NOISE;
66   int h = i - 1;
67   if (h < 0)
68     {
69           h = NB_VALUE_NOISE + h;
70     }
71
72   real x1=_values[i], x2=_values[(i+1)%NB_VALUE_NOISE];
73   real x0=_values[h], x3=_values[(i+2)%NB_VALUE_NOISE];
74
75   real t = modf(x * NB_VALUE_NOISE, &tmp);
76   real y0=LanczosWindowed(-1-t);
77   real y1=LanczosWindowed(-t);
78   real y2=LanczosWindowed(1-t);
79   real y3=LanczosWindowed(2-t);
80   //    cerr<<"x0="<<x0<<"  x1="<<x1<<"  x2="<<x2<<"  x3="<<x3<<endl;
81   //    cerr<<"y0="<<y0<<"  y1="<<y1<<"  y2="<<y2<<"  y3="<<y3<<"  :";
82   return (x0*y0+x1*y1+x2*y2+x3*y3)/(y0+y1+y2+y3);
83 }
84
85 real 
86 PseudoNoise::turbulenceSmooth (real x, unsigned nbOctave)
87 {
88   real y=0;
89   real k=1.0;
90   for (unsigned i=0; i<nbOctave; i++)
91     {
92       y=y+k*smoothNoise(x*k);
93       k=k/2.0;
94     }
95   return y;
96 }
97
98 real 
99 PseudoNoise::turbulenceLinear (real x, unsigned nbOctave)
100 {
101   real y=0;
102   real k=1.0;
103   for (unsigned i=0; i<nbOctave; i++)
104     {
105       y=y+k*linearNoise(x*k);
106       k=k/2.0;
107     }
108   return y;
109 }