00001 #pragma once 00002 00003 #ifndef _v_white_noise_h 00004 #define _v_white_noise_h 00005 00006 #include <vector> 00007 #include "randomc.h" 00008 00009 00010 template <class RG1, class RG2> 00011 class TRandomCombined : private RG1, private RG2 00012 { 00013 public: 00014 TRandomCombined(int32 seed = 19) : RG1(seed), RG2(seed+1) 00015 { 00016 00017 }; 00018 00019 void RandomInit(int32 seed) 00020 { // re-seed 00021 RG1::RandomInit(seed); 00022 RG2::RandomInit(seed+1); 00023 } 00024 00025 double Random() 00026 { 00027 long double r = RG1::Random() + RG2::Random(); 00028 if (r >= 1.) r -= 1.; 00029 return r; 00030 } 00031 00032 long IRandom(long min, long max) 00033 { // output random integer 00034 // get integer random number in desired interval 00035 int iinterval = max - min + 1; 00036 if (iinterval <= 0) return -1; // error 00037 int i = int(iinterval * Random()); // truncate 00038 if (i >= iinterval) i = iinterval-1; 00039 return min + i; 00040 } 00041 }; 00042 00043 00047 class VWhiteNoise 00048 { 00049 public: 00050 00054 VWhiteNoise(); 00055 00059 ~VWhiteNoise(); 00060 00067 void generate( int m_Width, int m_Height, int m_Steps = 20 ); 00068 00074 void generateFrolicTexture ( int m_Width, int m_Height); 00075 00080 unsigned int getTextureHandle() 00081 { 00082 return mTextureHandle; 00083 } 00084 00089 unsigned int getFrolicHandle() 00090 { 00091 return mFrolicHandle; 00092 } 00093 00094 private: 00095 00099 void bindOpenGlTexture(); 00100 00104 void bindOpengGlFrolicTexture(); 00105 00111 float generateRandom( int m_Steps ); 00112 00113 TRandomCombined<CRandomMother, CRandomMersenne> mRandomNumberGenerator; 00115 unsigned int mTextureHandle; 00116 std::vector<float> mNoise; 00117 int mWidth; 00118 int mHeight; 00121 unsigned int mFrolicHandle; 00122 std::vector<float> mFrolic; 00123 int mFWidth; 00124 int mFHeight; 00125 }; 00126 00127 #endif // _v_white_noise_h