00001 #ifndef __NOISE_H
00002 #define __NOISE_H
00003
00004
00005 #include <core_api/vector3d.h>
00006 #include <core_api/color.h>
00007
00008 #include <yafray_config.h>
00009
00010 __BEGIN_YAFRAY
00011
00012 class YAFRAYPLUGIN_EXPORT noiseGenerator_t
00013 {
00014 public:
00015 noiseGenerator_t() {}
00016 virtual ~noiseGenerator_t() {}
00017 virtual PFLOAT operator() (const point3d_t &pt) const=0;
00018
00019 virtual point3d_t offset(const point3d_t &pt) const { return pt; }
00020 };
00021
00022
00023
00024 class YAFRAYPLUGIN_EXPORT newPerlin_t : public noiseGenerator_t
00025 {
00026 public:
00027 newPerlin_t() {}
00028 virtual ~newPerlin_t() {}
00029 virtual PFLOAT operator() (const point3d_t &pt) const;
00030 private:
00031 PFLOAT fade(PFLOAT t) const { return t*t*t*(t*(t*6 - 15) + 10); }
00032 PFLOAT grad(int hash, PFLOAT x, PFLOAT y, PFLOAT z) const
00033 {
00034 int h = hash & 15;
00035 PFLOAT u = h<8 ? x : y,
00036 v = h<4 ? y : h==12||h==14 ? x : z;
00037 return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v);
00038 }
00039 };
00040
00041
00042
00043 class YAFRAYPLUGIN_EXPORT stdPerlin_t : public noiseGenerator_t
00044 {
00045 public:
00046 stdPerlin_t() {}
00047 virtual ~stdPerlin_t() {}
00048 virtual PFLOAT operator() (const point3d_t &pt) const;
00049 };
00050
00051
00052 class YAFRAYPLUGIN_EXPORT blenderNoise_t : public noiseGenerator_t
00053 {
00054 public:
00055 blenderNoise_t() {}
00056 virtual ~blenderNoise_t() {}
00057 virtual PFLOAT operator() (const point3d_t &pt) const;
00058
00059 virtual point3d_t offset(const point3d_t &pt) const { return pt+point3d_t(1.0, 1.0, 1.0); }
00060 };
00061
00062
00063
00064
00065 typedef PFLOAT (*distMetricFunc)(PFLOAT x, PFLOAT y, PFLOAT z, PFLOAT e);
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 class YAFRAYPLUGIN_EXPORT voronoi_t : public noiseGenerator_t
00131 {
00132 public:
00133 enum voronoiType {V_F1, V_F2, V_F3, V_F4, V_F2F1, V_CRACKLE};
00134 enum dMetricType {DIST_REAL, DIST_SQUARED, DIST_MANHATTAN, DIST_CHEBYCHEV,
00135 DIST_MINKOVSKY_HALF, DIST_MINKOVSKY_FOUR, DIST_MINKOVSKY};
00136 voronoi_t(voronoiType vt=V_F1, dMetricType dm=DIST_REAL, PFLOAT mex=2.5);
00137 virtual ~voronoi_t()
00138 {
00139
00140 }
00141 virtual PFLOAT operator() (const point3d_t &pt) const;
00142 PFLOAT getDistance(int x, PFLOAT da[4]) const { return da[x & 3]; }
00143 point3d_t getPoint(int x, point3d_t pa[4]) const { return pa[x & 3]; }
00144 void setMinkovskyExponent(PFLOAT me) { mk_exp=me; }
00145 void getFeatures(const point3d_t &pt, PFLOAT da[4], point3d_t pa[4]) const;
00146 void setDistM(dMetricType dm);
00147 protected:
00148 voronoiType vType;
00149 dMetricType dmType;
00150 PFLOAT mk_exp, w1, w2, w3,w4;
00151
00152 distMetricFunc distfunc2;
00153
00154
00155 };
00156
00157
00158 class YAFRAYPLUGIN_EXPORT cellNoise_t : public noiseGenerator_t
00159 {
00160 public:
00161 cellNoise_t() {}
00162 virtual ~cellNoise_t() {}
00163 virtual PFLOAT operator() (const point3d_t &pt) const;
00164 };
00165
00166
00167
00168
00169 class YAFRAYPLUGIN_EXPORT musgrave_t
00170 {
00171 public:
00172 musgrave_t() {}
00173 virtual ~musgrave_t() {}
00174 virtual PFLOAT operator() (const point3d_t &pt) const=0;
00175 };
00176
00177 class YAFRAYPLUGIN_EXPORT fBm_t : public musgrave_t
00178 {
00179 public:
00180 fBm_t(PFLOAT _H, PFLOAT _lacu, PFLOAT _octs, const noiseGenerator_t* _nGen)
00181 : H(_H), lacunarity(_lacu), octaves(_octs), nGen(_nGen) {}
00182 virtual ~fBm_t() {}
00183 virtual PFLOAT operator() (const point3d_t &pt) const;
00184 protected:
00185 PFLOAT H, lacunarity, octaves;
00186 const noiseGenerator_t* nGen;
00187 };
00188
00189 class YAFRAYPLUGIN_EXPORT mFractal_t : public musgrave_t
00190 {
00191 public:
00192 mFractal_t(PFLOAT _H, PFLOAT _lacu, PFLOAT _octs, const noiseGenerator_t* _nGen)
00193 : H(_H), lacunarity(_lacu), octaves(_octs), nGen(_nGen) {}
00194 virtual ~mFractal_t() {}
00195 virtual PFLOAT operator() (const point3d_t &pt) const;
00196 protected:
00197 PFLOAT H, lacunarity, octaves;
00198 const noiseGenerator_t* nGen;
00199 };
00200
00201 class YAFRAYPLUGIN_EXPORT heteroTerrain_t : public musgrave_t
00202 {
00203 public:
00204 heteroTerrain_t(PFLOAT _H, PFLOAT _lacu, PFLOAT _octs, PFLOAT _offs, const noiseGenerator_t* _nGen)
00205 : H(_H), lacunarity(_lacu), octaves(_octs), offset(_offs), nGen(_nGen) {}
00206 virtual ~heteroTerrain_t() {}
00207 virtual PFLOAT operator() (const point3d_t &pt) const;
00208 protected:
00209 PFLOAT H, lacunarity, octaves, offset;
00210 const noiseGenerator_t* nGen;
00211 };
00212
00213 class YAFRAYPLUGIN_EXPORT hybridMFractal_t : public musgrave_t
00214 {
00215 public:
00216 hybridMFractal_t(PFLOAT _H, PFLOAT _lacu, PFLOAT _octs, PFLOAT _offs, PFLOAT _gain, const noiseGenerator_t* _nGen)
00217 : H(_H), lacunarity(_lacu), octaves(_octs), offset(_offs), gain(_gain), nGen(_nGen) {}
00218 virtual ~hybridMFractal_t() {}
00219 virtual PFLOAT operator() (const point3d_t &pt) const;
00220 protected:
00221 PFLOAT H, lacunarity, octaves, offset, gain;
00222 const noiseGenerator_t* nGen;
00223 };
00224
00225 class YAFRAYPLUGIN_EXPORT ridgedMFractal_t : public musgrave_t
00226 {
00227 public:
00228 ridgedMFractal_t(PFLOAT _H, PFLOAT _lacu, PFLOAT _octs, PFLOAT _offs, PFLOAT _gain, const noiseGenerator_t* _nGen)
00229 : H(_H), lacunarity(_lacu), octaves(_octs), offset(_offs), gain(_gain), nGen(_nGen) {}
00230 virtual ~ridgedMFractal_t() {}
00231 virtual PFLOAT operator() (const point3d_t &pt) const;
00232 protected:
00233 PFLOAT H, lacunarity, octaves, offset, gain;
00234 const noiseGenerator_t* nGen;
00235 };
00236
00237
00238
00239
00240 CFLOAT YAFRAYPLUGIN_EXPORT turbulence(const noiseGenerator_t* ngen, const point3d_t &pt, int oct, PFLOAT size, bool hard);
00241
00242 colorA_t YAFRAYPLUGIN_EXPORT cellNoiseColor(const point3d_t &pt);
00243
00244 static inline PFLOAT getSignedNoise(const noiseGenerator_t* nGen, const point3d_t &pt)
00245 {
00246 return (PFLOAT)2.0 * (*nGen)(pt) - (PFLOAT)1.0;
00247 }
00248
00249
00250 __END_YAFRAY
00251
00252 #endif //__NOISE_H