00001 #include "VFlowRenderer.h"
00002 #include "glew.h"
00003 #include "VImage.h"
00004
00005
00006 VFlowRenderer::VFlowRenderer() : mProgramLoaded( false ),
00007 mShaderWrapperVelocity( this ),
00008 mShaderWrapperPressure( this ),
00009 mShaderWrapperVorticity( this ),
00010 mShaderWrapperGlyph( this ),
00011 mShaderWrapperGlyphTf(this),
00012 mShaderWrapperStreamLines ( this ),
00013 mShaderWrapperStreamLinesGlyph( this ),
00014 mShaderWrapperStreamLinesTf( this ),
00015 mShaderWrapperStreamLinesTfGlyph( this ),
00016 mShaderWrapperIcon(this),
00017 mShaderWrapperLIC( this ),
00018 mShaderWrapperLICTf( this ),
00019 mShaderWrapperLICTexture( this ),
00020 mShaderWrapperOLICTexture( this ),
00021 mShaderWrapperLICTextureTf(this),
00022 mFlowData( NULL ),
00023 mBaseGlyphSize(0.5f),
00024 mCameraDistance(20.0f),
00025 arrows_nonunifcale(0.0f),
00026 arrowalpha(1.0f),
00027 streamlinesalpha(1.0f),
00028 arrowTfActivated(false),
00029 streamlineTfActivated(false),
00030 licalpha(1.0f),
00031 licsteps(250),
00032 licstepsize(500),
00033 mUseGlyph(true),
00034 mStrGlyphes(false),
00035 licTfActivated(false),
00036 mLicTextureOffset(0.0f),
00037 mAnimateLic(false)
00038 {
00039 VVector eye( 5.0f, 0.0f, -20.0f );
00040 VVector view( 0.0f, 0.0f, 1.0f );
00041 VVector up( 0.0f, 1.0f, 0.0f );
00042
00043 mCamera.lookInDirection( eye, view, up );
00044 mCurrentMode = &mShaderWrapperVelocity;
00045
00046 }
00047
00048 void VFlowRenderer::processGuiInput( float dist, VVector position, VVector view, VVector up, VVector lookAt )
00049 {
00050
00051
00052 VVector lview = view * dist;
00053
00054 VVector campos = lookAt - lview;
00055
00056
00057
00058 mCamera.lookInDirection( campos, view, up );
00059 mCameraDistance = dist;
00060 }
00061
00062 void VFlowRenderer::setCurrentShader( int val )
00063 {
00064
00065 switch ( val )
00066 {
00067
00068 case 1:
00069 {
00070 mCurrentMode = &mShaderWrapperVelocity;
00071 activeDataValue = val;
00072 break;
00073 }
00074 case 2:
00075 {
00076 mCurrentMode = &mShaderWrapperPressure;
00077 activeDataValue = val;
00078 break;
00079 }
00080 case 3:
00081 {
00082 mCurrentMode = &mShaderWrapperVorticity;
00083 activeDataValue = val;
00084 break;
00085 }
00086 default:
00087 {
00088 mCurrentMode = &mShaderWrapperVelocity;
00089 activeDataValue = val;
00090 break;
00091 }
00092 }
00093 }
00094
00095 void VFlowRenderer::resize( int width, int height )
00096 {
00097 mCamera.setProjection( width, height );
00098 }
00099
00100 void VFlowRenderer::draw( int m_TimeStep )
00101 {
00102 if( mFlowData )
00103 {
00104 mCurrentMode->set( m_TimeStep );
00105 mFlowData->draw( m_TimeStep );
00106 mCurrentMode->clean();
00107 }
00108 }
00109
00110 void VFlowRenderer::drawGlyphes( int m_TimeStep )
00111 {
00112 if( mFlowData )
00113 {
00114 if(arrowTfActivated)
00115 {
00116 mShaderWrapperGlyphTf.set( m_TimeStep );
00117 mFlowData->drawPoints( m_TimeStep );
00118 mShaderWrapperGlyphTf.clean();
00119
00120 }
00121 else
00122 {
00123 mShaderWrapperGlyph.set( m_TimeStep );
00124 mFlowData->drawPoints( m_TimeStep );
00125 mShaderWrapperGlyph.clean();
00126 }
00127 }
00128 }
00129
00130 void VFlowRenderer::drawStreamLines()
00131 {
00132 if( mFlowData )
00133 {
00134 if(!mStrGlyphes)
00135 {
00136 if( streamlineTfActivated )
00137 {
00138 mShaderWrapperStreamLinesTf.set( 0 );
00139 mFlowData->drawStreamLines( streamlinesColor );
00140 mShaderWrapperStreamLinesTf.clean();
00141 }
00142 else
00143 {
00144 mShaderWrapperStreamLines.set( 0 );
00145 mFlowData->drawStreamLines( streamlinesColor );
00146 mShaderWrapperStreamLines.clean();
00147 }
00148 }
00149 else
00150 {
00151 if( streamlineTfActivated )
00152 {
00153 mShaderWrapperStreamLinesTfGlyph.set( 0 );
00154 mFlowData->drawStreamLines( streamlinesColor );
00155 mShaderWrapperStreamLinesTfGlyph.clean();
00156 }
00157 else
00158 {
00159 mShaderWrapperStreamLinesGlyph.set( 0 );
00160 mFlowData->drawStreamLines( streamlinesColor );
00161 mShaderWrapperStreamLinesGlyph.clean();
00162 }
00163 }
00164
00165 }
00166 }
00167
00168 void VFlowRenderer::drawIcons()
00169 {
00170 if( mFlowData )
00171 {
00172 mShaderWrapperIcon.set(0);
00173 mFlowData->drawIcons();
00174 mShaderWrapperIcon.clean();
00175 }
00176 }
00177
00178 void VFlowRenderer::drawLic( int m_TimeStep )
00179 {
00180 if(licTfActivated)
00181 {
00182 if(mAnimateLic)
00183 mShaderWrapperLICTextureTf.set( m_TimeStep );
00184 else
00185 mShaderWrapperLICTf.set( m_TimeStep );
00186 }
00187 else
00188 {
00189 if(mAnimateLic)
00190 mShaderWrapperLICTexture.set( m_TimeStep );
00191 else
00192 mShaderWrapperLIC.set( m_TimeStep );
00193 }
00194
00195
00196
00197
00198 glBegin(GL_QUADS);
00199 glTexCoord2f(1.0f, 0.0f);
00200 glVertex3f(mFlowData->getMinPos().getX(), mFlowData->getMinPos().getY(), -0.00f);
00201 glTexCoord2f(0.0f, 0.0f);
00202 glVertex3f(mFlowData->getMaxPos().getX(), mFlowData->getMinPos().getY(), -0.00f);
00203 glTexCoord2f(0.0f, 1.0f);
00204 glVertex3f(mFlowData->getMaxPos().getX(), mFlowData->getMaxPos().getY(), -0.00f);
00205 glTexCoord2f(1.0f, 1.0f);
00206 glVertex3f(mFlowData->getMinPos().getX(), mFlowData->getMaxPos().getY(), -0.00f);
00207 glEnd();
00208
00209
00210
00211
00212 if(licTfActivated)
00213 {
00214 if(mAnimateLic)
00215 mShaderWrapperLICTextureTf.clean();
00216 else
00217 mShaderWrapperLICTf.clean();
00218 }
00219 else
00220 {
00221 if(mAnimateLic)
00222 mShaderWrapperLICTexture.clean();
00223 else
00224 mShaderWrapperLIC.clean();
00225 }
00226
00227 VImage::renderOuterScreen(mWhiteNoise.getFrolicHandle());
00228 }
00229
00230 void VFlowRenderer::loadProgram()
00231 {
00232 mVelocityProgram = VProgram(VVertexShader("shader/flow_vertex.glsl"), VFragmentShader("shader/velocity_fragment.glsl"));
00233 mPressureProgram = VProgram(VVertexShader("shader/flow_vertex.glsl"), VFragmentShader("shader/pressure_fragment.glsl"));
00234 mVorticityProgram = VProgram(VVertexShader("shader/flow_vertex.glsl"), VFragmentShader("shader/vorticity_fragment.glsl"));
00235 mGlyphProgram = VProgram(VVertexShader("shader/glyph_vertex.glsl"), VFragmentShader("shader/glyph_fragment.glsl"));
00236 mGlyphProgramTf = VProgram(VVertexShader("shader/glyph_vertex.glsl"), VFragmentShader("shader/glyph_fragment_tf.glsl"));
00237 mRenderToVBProgram = VProgram( VVertexShader("shader/rendervertexbuffer_vertex.glsl"), VFragmentShader("shader/rendervertexbuffer_fragment.glsl") );
00238 mRenderToVBProgramGlyph = VProgram( VVertexShader("shader/rendervertexbuffer_vertex_gl.glsl"), VFragmentShader("shader/rendervertexbuffer_fragment_gl.glsl") );
00239 mRenderToVBProgramTf = VProgram( VVertexShader("shader/rendervertexbuffer_vertex_tf.glsl"), VFragmentShader("shader/rendervertexbuffer_fragment_tf.glsl") );
00240 mRenderToVBProgramTfGlyph = VProgram( VVertexShader("shader/rendervertexbuffer_vertex_tf_gl.glsl"), VFragmentShader("shader/rendervertexbuffer_fragment_tf_gl.glsl") );
00241 mLICProgram = VProgram(VVertexShader("shader/lic_vertex.glsl"), VFragmentShader("shader/lic_fragment.glsl"));
00242 mLICProgramTexture = VProgram(VVertexShader("shader/lic_vertex.glsl"), VFragmentShader("shader/lic_fragment_tx.glsl"));
00243 mOLICProgramTexture = VProgram(VVertexShader("shader/lic_vertex.glsl"), VFragmentShader("shader/olic_fragment_tx.glsl"));
00244
00245 mLICProgramTf = VProgram(VVertexShader("shader/lic_vertex_tf.glsl"), VFragmentShader("shader/lic_fragment_tf.glsl"));
00246 mLICProgramTextureTf = VProgram(VVertexShader("shader/lic_vertex_tf.glsl"), VFragmentShader("shader/lic_fragment_tx_tf.glsl"));
00247
00248 mIconProgram = VProgram(VVertexShader("shader/icon_vertex.glsl"), VFragmentShader("shader/icon_fragment.glsl"));
00249
00250 mGlyph.loadImage("textures/arrow.png");
00251 mTriangle.loadImage("textures/triangle.png");
00252 mPerlinNoise.loadImage("textures/noise.png");
00253
00254 mWhiteNoise.generate(256, 256, 20);
00255
00256 float gauss[41] =
00257 {
00258 0.0010,
00259 0.0014,
00260 0.0021,
00261 0.0030,
00262 0.0042,
00263 0.0058,
00264 0.0077,
00265 0.0102,
00266 0.0132,
00267 0.0166,
00268 0.0206,
00269 0.0250,
00270 0.0298,
00271 0.0347,
00272 0.0396,
00273 0.0443,
00274 0.0486,
00275 0.0522,
00276 0.0549,
00277 0.0566,
00278 0.0572,
00279 0.0566,
00280 0.0549,
00281 0.0522,
00282 0.0486,
00283 0.0443,
00284 0.0396,
00285 0.0347,
00286 0.0298,
00287 0.0250,
00288 0.0206,
00289 0.0166,
00290 0.0132,
00291 0.0102,
00292 0.0077,
00293 0.0058,
00294 0.0042,
00295 0.0030,
00296 0.0021,
00297 0.0014,
00298 0.0010
00299 };
00300
00301 float sawtooth[41] =
00302 {
00303 0.0,
00304 0.0,
00305 0.0,
00306 0.0,
00307 0.0,
00308 0.0,
00309 0.0,
00310 0.0,
00311 0.0,
00312 0.0,
00313 0.0,
00314 0.0024,
00315 0.0049,
00316 0.0073,
00317 0.0098,
00318 0.0122,
00319 0.0146,
00320 0.0171,
00321 0.0195,
00322 0.0220,
00323 0.0244,
00324 0.0268,
00325 0.0293,
00326 0.0317,
00327 0.0341,
00328 0.0366,
00329 0.0390,
00330 0.0415,
00331 0.0439,
00332 0.0463,
00333 0.0488,
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353 0.0,
00354 0.0,
00355 0.0,
00356 0.0,
00357 0.0,
00358 0.0,
00359 0.0,
00360 0.0,
00361 0.0,
00362 0.0
00363 };
00364
00365 std::vector<float> mTextureBase;
00366
00367 for ( int i = 0; i < 41; ++i )
00368 {
00369
00370
00371
00372 mTextureBase.push_back (gauss[i]);
00373 mTextureBase.push_back (gauss[i]);
00374 mTextureBase.push_back (gauss[i]);
00375 mTextureBase.push_back (1.0f);
00376 }
00377
00378 glGenTextures (1, &mGaussTextureHandle);
00379 glBindTexture(GL_TEXTURE_2D, mGaussTextureHandle);
00380
00381 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
00382 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
00383 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00384 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
00385
00386 gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA16F_ARB, 41, 1, GL_RGBA, GL_FLOAT, &(mTextureBase[0]));
00387
00388
00389 glBindTexture(GL_TEXTURE_2D, 0);
00390 glDisable(GL_TEXTURE_2D);
00391
00392 mProgramLoaded = true;
00393
00394
00395 const GLenum glError = glGetError();
00396
00397 if (glError != GL_NO_ERROR)
00398 std::cout << "Error Loading Programs " << gluErrorString(glError) << std::endl;
00399 }
00400
00401 void VFlowRenderer::generateFrolic(float m_Width, float m_Height)
00402 {
00403 float factor;
00404 int x, y;
00405
00406 if(m_Width < m_Height)
00407 {
00408 x = (int)(256.0f * m_Width / m_Height);
00409 y = 256;
00410 }
00411 else
00412 {
00413 x = 256;
00414 y = (int)(256.0f * m_Height / m_Width);
00415 }
00416 mWhiteNoise.generateFrolicTexture(x, y);
00417 }
00418