- Timestamp:
- 01/11/07 04:18:36 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Vis/Preprocessing/src/GlobalLinesRenderer.cpp
r1964 r1968 200 200 201 201 202 /*GlobalLinesRenderer::GlobalLinesRenderer(RenderTexture *buffer1,203 RenderTexture *buffer2,204 Preprocessor *preprocessor,205 GlRenderer *renderer)206 : mNewTexture(buffer1), mOldTexture(buffer2), mPreprocessor(preprocessor), mMaxDepth(100),207 mRenderer(renderer)208 {209 }210 */211 212 213 202 GlobalLinesRenderer::GlobalLinesRenderer(Preprocessor *preprocessor, 214 GlRenderer *renderer, 215 const float mTexHeight, 216 const float mTexWidth, 217 const float eps): 203 const int texHeight, 204 const int texWidth, 205 const float eps, 206 const int maxDepth, 207 const bool sampleReverse): 218 208 mNewTexture(NULL), 219 209 mOldTexture(NULL), 220 mMaxDepth(0),221 mRenderer(renderer),222 210 mPreprocessor(preprocessor), 223 211 mTexHeight(mTexHeight), 224 212 mTexWidth(mTexWidth), 225 mEpsilon(eps) 226 { 227 } 228 229 230 GlobalLinesRenderer::GlobalLinesRenderer(Preprocessor *preprocessor, 231 GlRenderer *renderer): 213 mEpsilon(eps), 214 mMaxDepth(maxDepth), 215 mSampleReverse(sampleReverse) 216 { 217 mRenderer = new GlRenderer(mPreprocessor->mSceneGraph, 218 mPreprocessor->mViewCellsManager, 219 mPreprocessor->mKdTree); 220 221 } 222 223 224 GlobalLinesRenderer::GlobalLinesRenderer(Preprocessor *preprocessor): 232 225 mNewTexture(NULL), 233 226 mOldTexture(NULL), 234 mMaxDepth(0), 235 mRenderer(renderer), 227 mMaxDepth(40), 236 228 mPreprocessor(preprocessor), 237 229 mTexHeight(128), 238 230 mTexWidth(128), 239 mEpsilon(0.0001) 240 {} 231 mEpsilon(0.0001), 232 mSampleReverse(true) 233 { 234 mRenderer = new GlRenderer(mPreprocessor->mSceneGraph, 235 mPreprocessor->mViewCellsManager, 236 mPreprocessor->mKdTree); 237 } 241 238 242 239 … … 288 285 delete mNewItemBuffer; 289 286 delete mOldItemBuffer; 287 288 DEL_PTR(mRenderer); 290 289 } 291 290 292 291 293 void GlobalLinesRenderer::InitScene(const float alpha, const float beta) 294 { 295 AxisAlignedBox3 bbox = globalLinesRenderer->mPreprocessor->mKdTree->GetBox(); 296 297 const float sceneSize = Magnitude(bbox.Diagonal()); 298 299 // compute the center of the scene 300 Vector3 midPoint = bbox.Center(); 301 302 // add a small offset to provide some randomness in the sampling 303 Vector3 offset(Random(sceneSize * 1e-3f), 304 Random(sceneSize * 1e-3f), 305 Random(sceneSize * 1e-3f)); 306 307 midPoint += offset; 308 309 mNear = 1; 310 mFar = sceneSize * 2; 311 mWidth = sceneSize; 312 313 ComputeLookAt(alpha, 314 beta, 315 mEyeVec, 316 mUpVec, 317 mLeftVec); 318 319 mViewPoint = midPoint - 0.5f * sceneSize * mEyeVec; 320 321 cout << "mid point: " << midPoint << endl; 322 cout << "view point: " << mViewPoint << endl; 323 cout << "scene: " << bbox << endl; 324 292 void GlobalLinesRenderer::InitRenderTexture(RenderTexture *rt) 293 { 325 294 // setup the rendering context for the RenderTexture 326 mNewTexture->BeginCapture();295 rt->BeginCapture(); 327 296 { 328 297 //Reshape(mTexWidth, mTexHeight); … … 346 315 glLoadIdentity(); 347 316 gluLookAt(mViewPoint.x, mViewPoint.y, mViewPoint.z, 348 m idPoint.x, midPoint.y, midPoint.z,317 mTermination.x, mTermination.y, mTermination.z, 349 318 mUpVec.x, mUpVec.y, mUpVec.z); 350 319 351 320 } 352 mNewTexture->EndCapture(); 353 354 // setup the rendering context for the other depth buffer 355 mOldTexture->BeginCapture(); 356 { 357 // for item buffer: white means no color 358 glClearColor(1, 1, 1, 1); 359 360 //Reshape(mTexWidth, mTexHeight); 361 glViewport(0, 0, mTexWidth, mTexHeight); 362 SetFrustum(mWidth, mWidth, mNear, mFar); 363 364 glMatrixMode(GL_MODELVIEW); 365 glLoadIdentity(); 321 rt->EndCapture(); 322 } 323 324 325 void GlobalLinesRenderer::InitScene(const float alpha, const float beta) 326 { 327 AxisAlignedBox3 bbox = 328 globalLinesRenderer->mPreprocessor->mKdTree->GetBox(); 329 330 const float sceneSize = Magnitude(bbox.Diagonal()); 331 332 // compute the center of the scene 333 mTermination = bbox.Center(); 334 335 // add a small offset to provide some randomness in the sampling 336 if (0) 337 { 338 Vector3 offset( 339 Random(sceneSize * 1e-3f), 340 Random(sceneSize * 1e-3f), 341 Random(sceneSize * 1e-3f)); 342 343 mTermination += offset; 344 } 366 345 367 glFrontFace(GL_CCW); 368 glCullFace(GL_BACK); 369 370 glDisable(GL_CULL_FACE); 371 //glEnable(GL_CULL_FACE); 372 373 glShadeModel(GL_FLAT); 374 glEnable(GL_DEPTH_TEST); 375 376 gluLookAt(mViewPoint.x, mViewPoint.y, mViewPoint.z, 377 midPoint.x, midPoint.y, midPoint.z, 378 mUpVec.x, mUpVec.y, mUpVec.z); 379 } 380 mOldTexture->EndCapture(); 381 346 mNear = 1; 347 mFar = sceneSize * 2; 348 mWidth = sceneSize; 349 350 ComputeLookAt(alpha, 351 beta, 352 mEyeVec, 353 mUpVec, 354 mLeftVec); 355 356 mViewPoint = mTermination - 0.5f * sceneSize * mEyeVec; 357 358 cout << "termination point: " << mTermination << endl; 359 cout << "view point: " << mViewPoint << endl; 360 cout << "scene: " << bbox << endl; 361 362 InitRenderTexture(mNewTexture); 363 InitRenderTexture(mOldTexture); 364 365 cout << "eye: " << mEyeVec << " left: " << mLeftVec << " up: " << mUpVec << endl; 366 } 367 368 369 void GlobalLinesRenderer::InitScene(const SimpleRay &ray) 370 { 371 AxisAlignedBox3 bbox = 372 globalLinesRenderer->mPreprocessor->mKdTree->GetBox(); 373 374 const float sceneSize = Magnitude(bbox.Diagonal()); 375 376 // compute the center of the scene 377 mViewPoint = ray.mOrigin; 378 mTermination = ray.mOrigin + ray.mDirection; 379 380 mEyeVec = Normalize(ray.mDirection); 381 382 mNear = 1; 383 mFar = sceneSize * 2; 384 mWidth = sceneSize; 385 386 mEyeVec.RightHandedBase(mUpVec, mLeftVec); 387 mViewPoint = mTermination - 0.5f * sceneSize * mEyeVec; 388 389 cout << "termination point: " << mTermination << endl; 390 cout << "view point: " << mViewPoint << endl; 391 cout << "scene: " << bbox << endl; 392 393 InitRenderTexture(mNewTexture); 394 InitRenderTexture(mOldTexture); 395 382 396 cout << "eye: " << mEyeVec << " left: " << mLeftVec << " up: " << mUpVec << endl; 383 397 } … … 395 409 } 396 410 411 412 void GlobalLinesRenderer::CastGlobalLines(const SimpleRay &ray, 413 VssRayContainer &rays) 414 { 415 InitScene(ray); 416 417 // bind pixel shader implementing the front depth buffer functionality 418 ApplyDepthPeeling(rays); 419 } 397 420 398 421 void GlobalLinesRenderer::RenderObject(Intersectable *obj) … … 438 461 Vector3 &left) 439 462 { 440 //float x = cos(alpha);441 //float y = sin(alpha);442 463 eye.x = sin(alpha) * cos(beta); 443 464 eye.y = sin(alpha) * sin(beta); 444 465 eye.z = cos(alpha); 445 466 446 //eye = Normalize(eye);447 467 eye.RightHandedBase(up, left); 448 468 } … … 637 657 638 658 639 voidGlobalLinesRenderer::ProcessDepthBuffer(VssRayContainer &vssRays,659 bool GlobalLinesRenderer::ProcessDepthBuffer(VssRayContainer &vssRays, 640 660 const bool oldBufferInitialised, 641 661 const int pass) … … 660 680 mOldItemBuffer[i * 4 + 3] = 255; 661 681 } 682 } 683 684 ///////////////// 685 // test for validity 686 687 bool buffersEqual = true; 688 bool bufferEmpty = true; 689 690 for (int y = 0; y < mTexHeight; ++ y) 691 { 692 for (int x = 0; x < mTexWidth; ++ x) 693 { 694 const int depthIndex = x + mTexWidth * y; 695 const int itemIndex = 4 * depthIndex; 696 697 if (mOldItemBuffer[itemIndex] != mNewItemBuffer[itemIndex]) 698 { 699 buffersEqual = false; 700 } 701 702 unsigned char r = mNewItemBuffer[itemIndex]; 703 unsigned char g = mNewItemBuffer[itemIndex + 1]; 704 unsigned char b = mNewItemBuffer[itemIndex + 2]; 705 706 // 3 times 255 means no valid object 707 if (!((r == 255) && (g == 255) && (b == 255))) 708 { 709 bufferEmpty = false; 710 } 711 } 712 713 // early exit 714 if (!buffersEqual && !bufferEmpty) 715 break; 716 } 717 718 // depth buffer not valid 719 if (buffersEqual || bufferEmpty) 720 { 721 cout << "stopped at layer " << pass << endl; 722 return false; 662 723 } 663 724 … … 698 759 } 699 760 700 if ( termObj2)761 if (mSampleReverse && termObj2) 701 762 { 702 763 vssRays.push_back(new VssRay(clippedNewPt, clippedOldPt, NULL, termObj2, pass)); … … 705 766 } 706 767 } 768 769 return true; 707 770 } 708 771 … … 912 975 913 976 // process the buffers for following layer 914 ProcessDepthBuffer(rays, true, i); 977 // jump out of loop for the first invalid buffer 978 if (!ProcessDepthBuffer(rays, true, i)) 979 break; 915 980 } 916 981
Note: See TracChangeset
for help on using the changeset viewer.