Ignore:
Timestamp:
01/04/06 15:07:05 (18 years ago)
Author:
bittner
Message:

glrenderer split into widget and buffer, buffer moved to the same thread as the preprocessor

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/GtpVisibilityPreprocessor/src/GlRenderer.cpp

    r494 r496  
    88#include <GL/glext.h> 
    99 
    10 GlRenderer *renderer = NULL; 
     10GlRendererWidget *rendererWidget = NULL; 
    1111 
    1212#ifdef _WIN32 
     
    1818 
    1919GlRenderer::GlRenderer(SceneGraph *sceneGraph, 
    20                                    ViewCellsManager *viewCellsManager): 
    21   QGLWidget(), 
     20                                           ViewCellsManager *viewCellsManager): 
    2221  mSceneGraph(sceneGraph), 
    2322  mViewCellsManager(viewCellsManager) 
     
    2625  mViewPoint = mSceneGraph->GetBox().Center(); 
    2726  mViewDirection = Vector3(0,0,1); 
    28   mRender = true; 
    29  
    3027  //  timerId = startTimer(10); 
    3128  mFrame = 0; 
    32   mPvsStatFrames = 10000; 
    33   mPvsErrorBuffer.resize(mPvsStatFrames); 
    34   ClearErrorBuffer(); 
    35   pbuffer = NULL; 
    3629} 
    3730 
    3831GlRenderer::~GlRenderer() 
    3932{ 
    40   if (pbuffer) 
    41         delete pbuffer; 
    4233} 
    4334 
     
    10192         
    10293void 
    103 GlRenderer::initializeGL() 
     94GlRenderer::InitGL() 
    10495{ 
    10596  glMatrixMode(GL_PROJECTION); 
     
    124115} 
    125116 
    126 void 
    127 GlRenderer::resizeGL(int w, int h) 
    128 { 
    129   SetupProjection(w, h); 
    130  
    131   if (pbuffer == NULL || pbuffer->size().width() != w || pbuffer->size().height() != h) { 
    132         if (pbuffer) 
    133           delete pbuffer; 
    134         pbuffer = new QGLPixelBuffer(QSize(w,h)); 
    135   } 
    136    
    137   updateGL(); 
    138 } 
    139117 
    140118 
     
    182160} 
    183161 
    184 void 
    185 GlRenderer::paintGL() 
    186 { 
    187   if (mRender) { 
    188         Render(); 
    189         mFrame++; 
    190   } 
    191 } 
    192  
    193 void 
    194 GlRenderer::ClearErrorBuffer() 
    195 { 
    196   for (int i=0; i < mPvsStatFrames; i++) { 
    197         mPvsErrorBuffer[i] = 1.0f; 
    198   } 
    199 } 
    200  
    201 void 
    202 GlRenderer::EvalPvsStat() 
    203 { 
    204   mPvsStat.Reset(); 
    205   halton.Reset(); 
    206  
    207   pbuffer->makeCurrent(); 
    208   initializeGL(); 
    209   SetupProjection(pbuffer->size().width(), pbuffer->size().height()); 
    210    
    211   for (int i=0; i < mPvsStatFrames; i++) { 
    212         float err; 
    213         RandomViewPoint(); 
    214         if (mPvsErrorBuffer[i] > 0.0f) { 
    215           mPvsErrorBuffer[i] = GetPixelError(); 
    216           cout<<"("<<i<<","<<mPvsErrorBuffer[i]<<")"; 
    217           //      swapBuffers(); 
     162 
     163float 
     164GlRenderer::GetPixelError() 
     165{ 
     166  float pErrorPixels = -1.0f; 
     167 
     168  glReadBuffer(GL_BACK); 
     169   
     170  mUseFalseColors = true; 
     171 
     172  SetupCamera(); 
     173  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     174  glEnable( GL_CULL_FACE ); 
     175   
     176  RenderScene(); 
     177 
     178  // now check whether any backfacing polygon would pass the depth test 
     179  static int query = -1; 
     180  if (query == -1) 
     181        glGenOcclusionQueriesNV(1, (unsigned int *)&query); 
     182   
     183  glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
     184  glDepthMask(GL_FALSE); 
     185  glDisable( GL_CULL_FACE ); 
     186   
     187  glBeginOcclusionQueryNV(query); 
     188   
     189  RenderScene(); 
     190   
     191  glEndOcclusionQueryNV(); 
     192 
     193  // at this point, if possible, go and do some other computation 
     194  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
     195  glDepthMask(GL_TRUE); 
     196  glEnable( GL_CULL_FACE ); 
     197   
     198  unsigned int pixelCount; 
     199  // reenable other state 
     200  glGetOcclusionQueryuivNV(query, 
     201                                                   GL_PIXEL_COUNT_NV, 
     202                                                   &pixelCount); 
     203 
     204  if (pixelCount > 0) 
     205        return -1.0f; // backfacing polygon found -> not a valid viewspace sample 
     206 
     207  ViewCell *viewcell = mViewCellsManager->GetViewCell(mViewPoint); 
     208   
     209  if (viewcell) { 
     210        SetupCamera(); 
     211        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     212 
     213        // Render PVS 
     214        std::map<Intersectable *, 
     215          PvsData<Intersectable *>, 
     216          LtSample<Intersectable *> >::const_iterator it = viewcell->GetPvs().mEntries.begin(); 
     217         
     218        for (; it != viewcell->GetPvs().mEntries.end(); ++ it) { 
     219          Intersectable *object = (*it).first; 
     220          RenderIntersectable(object); 
    218221        } 
    219          
    220         err = mPvsErrorBuffer[i]; 
    221          
    222         if (err >= 0.0f) { 
    223           if (err > mPvsStat.maxError) 
    224                 mPvsStat.maxError = err; 
    225           mPvsStat.sumError += err; 
    226           if (err == 0.0f) 
    227                 mPvsStat.errorFreeFrames++; 
    228           mPvsStat.frames++; 
    229         } 
    230   } 
    231    
    232   pbuffer->doneCurrent(); 
    233  
    234   cout<<endl<<flush; 
    235   mRenderingFinished.wakeAll(); 
    236 } 
     222 
     223        glBeginOcclusionQueryNV(query); 
     224 
     225        SetupCamera(); 
     226 
     227        RenderScene(); 
     228         
     229        glEndOcclusionQueryNV(); 
     230         
     231 
     232        unsigned int pixelCount; 
     233        // reenable other state 
     234        glGetOcclusionQueryuivNV(query, 
     235                                                         GL_PIXEL_COUNT_NV, 
     236                                                         &pixelCount); 
     237         
     238        pErrorPixels = (100.f*pixelCount)/(GetWidth()*GetHeight()); 
     239  } 
     240   
     241  return pErrorPixels; 
     242} 
     243 
    237244 
    238245float 
    239 GlRenderer::Render() 
     246GlRendererWidget::RenderErrors() 
    240247{ 
    241248  float pErrorPixels = -1.0f; 
     
    346353  return pErrorPixels; 
    347354} 
     355 
    348356 
    349357void 
     
    363371} 
    364372 
    365 float 
    366 GlRenderer::GetPixelError() 
    367 { 
    368   float pErrorPixels = -1.0f; 
    369  
    370   glReadBuffer(GL_BACK); 
    371    
    372   mUseFalseColors = true; 
    373  
    374   SetupCamera(); 
    375   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    376   glEnable( GL_CULL_FACE ); 
    377    
    378   RenderScene(); 
    379  
    380   // now check whether any backfacing polygon would pass the depth test 
    381   static int query = -1; 
    382   if (query == -1) 
    383         glGenOcclusionQueriesNV(1, (unsigned int *)&query); 
    384    
    385   glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
    386   glDepthMask(GL_FALSE); 
    387   glDisable( GL_CULL_FACE ); 
    388    
    389   glBeginOcclusionQueryNV(query); 
    390    
    391   RenderScene(); 
    392    
    393   glEndOcclusionQueryNV(); 
    394  
    395   // at this point, if possible, go and do some other computation 
    396   glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
    397   glDepthMask(GL_TRUE); 
    398   glEnable( GL_CULL_FACE ); 
    399    
    400   unsigned int pixelCount; 
    401   // reenable other state 
    402   glGetOcclusionQueryuivNV(query, 
    403                                                    GL_PIXEL_COUNT_NV, 
    404                                                    &pixelCount); 
    405  
    406   if (pixelCount > 0) 
    407         return -1.0f; // backfacing polygon found -> not a valid viewspace sample 
    408  
    409   ViewCell *viewcell = mViewCellsManager->GetViewCell(mViewPoint); 
    410    
    411   if (viewcell) { 
    412         SetupCamera(); 
    413         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    414  
    415         // Render PVS 
    416         std::map<Intersectable *, 
    417           PvsData<Intersectable *>, 
    418           LtSample<Intersectable *> >::const_iterator it = viewcell->GetPvs().mEntries.begin(); 
    419          
    420         for (; it != viewcell->GetPvs().mEntries.end(); ++ it) { 
    421           Intersectable *object = (*it).first; 
    422           RenderIntersectable(object); 
     373 
     374void 
     375GlRendererBuffer::ClearErrorBuffer() 
     376{ 
     377  for (int i=0; i < mPvsStatFrames; i++) { 
     378        mPvsErrorBuffer[i] = 1.0f; 
     379  } 
     380} 
     381 
     382 
     383void 
     384GlRendererBuffer::EvalPvsStat() 
     385{ 
     386  mPvsStat.Reset(); 
     387  halton.Reset(); 
     388 
     389  makeCurrent(); 
     390 
     391  SetupProjection(GetWidth(), GetHeight()); 
     392   
     393  for (int i=0; i < mPvsStatFrames; i++) { 
     394        float err; 
     395        RandomViewPoint(); 
     396        if (mPvsErrorBuffer[i] > 0.0f) { 
     397          mPvsErrorBuffer[i] = GetPixelError(); 
     398          cout<<"("<<i<<","<<mPvsErrorBuffer[i]<<")"; 
     399          //      swapBuffers(); 
    423400        } 
    424  
    425         glBeginOcclusionQueryNV(query); 
    426  
    427         SetupCamera(); 
    428  
    429         RenderScene(); 
    430          
    431         glEndOcclusionQueryNV(); 
    432          
    433  
    434         unsigned int pixelCount; 
    435         // reenable other state 
    436         glGetOcclusionQueryuivNV(query, 
    437                                                          GL_PIXEL_COUNT_NV, 
    438                                                          &pixelCount); 
    439          
    440         pErrorPixels = (100.f*pixelCount)/(height()*width()); 
    441   } 
    442    
    443   return pErrorPixels; 
    444 } 
    445  
    446  
    447 void 
    448 GlRenderer::mousePressEvent(QMouseEvent *e) 
     401         
     402        err = mPvsErrorBuffer[i]; 
     403         
     404        if (err >= 0.0f) { 
     405          if (err > mPvsStat.maxError) 
     406                mPvsStat.maxError = err; 
     407          mPvsStat.sumError += err; 
     408          if (err == 0.0f) 
     409                mPvsStat.errorFreeFrames++; 
     410          mPvsStat.frames++; 
     411        } 
     412  } 
     413   
     414  doneCurrent(); 
     415 
     416  cout<<endl<<flush; 
     417  mRenderingFinished.wakeAll(); 
     418} 
     419 
     420 
     421 
     422 
     423 
     424void 
     425GlRendererWidget::mousePressEvent(QMouseEvent *e) 
    449426{ 
    450427  int x = e->pos().x(); 
     
    457434 
    458435void 
    459 GlRenderer::mouseMoveEvent(QMouseEvent *e) 
     436GlRendererWidget::mouseMoveEvent(QMouseEvent *e) 
    460437{ 
    461438  float MOVE_SENSITIVITY = Magnitude(mSceneGraph->GetBox().Diagonal())*1e-3; 
     
    485462 
    486463void 
    487 GlRenderer::mouseReleaseEvent(QMouseEvent *) 
    488 { 
    489  
    490  
    491 } 
     464GlRendererWidget::mouseReleaseEvent(QMouseEvent *) 
     465{ 
     466 
     467 
     468} 
     469 
     470void 
     471GlRendererWidget::resizeGL(int w, int h) 
     472{ 
     473  SetupProjection(w, h); 
     474  updateGL(); 
     475} 
     476 
     477void 
     478GlRendererWidget::paintGL() 
     479{ 
     480  RenderErrors(); 
     481  mFrame++; 
     482} 
Note: See TracChangeset for help on using the changeset viewer.