Changeset 496 for trunk/VUT/GtpVisibilityPreprocessor/src/GlRenderer.cpp
- Timestamp:
- 01/04/06 15:07:05 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/VUT/GtpVisibilityPreprocessor/src/GlRenderer.cpp
r494 r496 8 8 #include <GL/glext.h> 9 9 10 GlRenderer *renderer= NULL;10 GlRendererWidget *rendererWidget = NULL; 11 11 12 12 #ifdef _WIN32 … … 18 18 19 19 GlRenderer::GlRenderer(SceneGraph *sceneGraph, 20 ViewCellsManager *viewCellsManager): 21 QGLWidget(), 20 ViewCellsManager *viewCellsManager): 22 21 mSceneGraph(sceneGraph), 23 22 mViewCellsManager(viewCellsManager) … … 26 25 mViewPoint = mSceneGraph->GetBox().Center(); 27 26 mViewDirection = Vector3(0,0,1); 28 mRender = true;29 30 27 // timerId = startTimer(10); 31 28 mFrame = 0; 32 mPvsStatFrames = 10000;33 mPvsErrorBuffer.resize(mPvsStatFrames);34 ClearErrorBuffer();35 pbuffer = NULL;36 29 } 37 30 38 31 GlRenderer::~GlRenderer() 39 32 { 40 if (pbuffer)41 delete pbuffer;42 33 } 43 34 … … 101 92 102 93 void 103 GlRenderer:: initializeGL()94 GlRenderer::InitGL() 104 95 { 105 96 glMatrixMode(GL_PROJECTION); … … 124 115 } 125 116 126 void127 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 }139 117 140 118 … … 182 160 } 183 161 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 163 float 164 GlRenderer::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); 218 221 } 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 237 244 238 245 float 239 GlRenderer ::Render()246 GlRendererWidget::RenderErrors() 240 247 { 241 248 float pErrorPixels = -1.0f; … … 346 353 return pErrorPixels; 347 354 } 355 348 356 349 357 void … … 363 371 } 364 372 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 374 void 375 GlRendererBuffer::ClearErrorBuffer() 376 { 377 for (int i=0; i < mPvsStatFrames; i++) { 378 mPvsErrorBuffer[i] = 1.0f; 379 } 380 } 381 382 383 void 384 GlRendererBuffer::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(); 423 400 } 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 424 void 425 GlRendererWidget::mousePressEvent(QMouseEvent *e) 449 426 { 450 427 int x = e->pos().x(); … … 457 434 458 435 void 459 GlRenderer ::mouseMoveEvent(QMouseEvent *e)436 GlRendererWidget::mouseMoveEvent(QMouseEvent *e) 460 437 { 461 438 float MOVE_SENSITIVITY = Magnitude(mSceneGraph->GetBox().Diagonal())*1e-3; … … 485 462 486 463 void 487 GlRenderer::mouseReleaseEvent(QMouseEvent *) 488 { 489 490 491 } 464 GlRendererWidget::mouseReleaseEvent(QMouseEvent *) 465 { 466 467 468 } 469 470 void 471 GlRendererWidget::resizeGL(int w, int h) 472 { 473 SetupProjection(w, h); 474 updateGL(); 475 } 476 477 void 478 GlRendererWidget::paintGL() 479 { 480 RenderErrors(); 481 mFrame++; 482 }
Note: See TracChangeset
for help on using the changeset viewer.