Eigene Dateien/FlowVis/src/VFlowRenderer.cpp

Go to the documentation of this file.
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         //VVector view = lookAt - position;
00051         //view.normalize();
00052         VVector lview = view * dist;
00053 
00054         VVector campos = lookAt - lview;
00055 
00056         //view.normalize();
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 /* = 0 */ )
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 /* = 0 */ )
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 /* = 0 */ )
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         //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
00197         //glDisable(GL_DEPTH_TEST);
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         //glEnable(GL_DEPTH_TEST);
00209 
00210         //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
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                 //0.0012,
00335                 //0.0037,
00336                 //0.0061,
00337                 //0.0085,
00338                 //0.0110,
00339                 //0.0134,
00340                 //0.0159,
00341                 //0.0183,
00342                 //0.0207,
00343                 //0.0232,
00344                 //0.0256,
00345                 //0.0280,
00346                 //0.0305,
00347                 //0.0329,
00348                 //0.0354,
00349                 //0.0378,
00350                 //0.0402,
00351                 //0.0427,
00352                 //0.0451,
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                 /*mTextureBase.push_back (sawtooth[i] * 2.0f);
00370                 mTextureBase.push_back (sawtooth[i] * 2.0f);
00371                 mTextureBase.push_back (sawtooth[i] * 2.0f);*/
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         //glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mWidth, mHeight, GL_RGBA, GL_FLOAT, &(tmp[0]));
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 

Generated on Mon Jan 21 01:15:16 2008 for FlowVis by  doxygen 1.5.4