Ignore:
Timestamp:
01/11/07 04:18:36 (18 years ago)
Author:
mattausch
Message:

early exit for global lines
preprocessor support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Vis/Preprocessing/src/GlobalLinesRenderer.cpp

    r1964 r1968  
    200200 
    201201 
    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  
    213202GlobalLinesRenderer::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): 
    218208mNewTexture(NULL),  
    219209mOldTexture(NULL),  
    220 mMaxDepth(0),  
    221 mRenderer(renderer),  
    222210mPreprocessor(preprocessor), 
    223211mTexHeight(mTexHeight), 
    224212mTexWidth(mTexWidth), 
    225 mEpsilon(eps) 
    226 { 
    227 } 
    228  
    229  
    230 GlobalLinesRenderer::GlobalLinesRenderer(Preprocessor *preprocessor,  
    231                                                                                  GlRenderer *renderer): 
     213mEpsilon(eps), 
     214mMaxDepth(maxDepth), 
     215mSampleReverse(sampleReverse) 
     216{ 
     217        mRenderer = new GlRenderer(mPreprocessor->mSceneGraph, 
     218                                                           mPreprocessor->mViewCellsManager, 
     219                                                           mPreprocessor->mKdTree); 
     220 
     221} 
     222 
     223 
     224GlobalLinesRenderer::GlobalLinesRenderer(Preprocessor *preprocessor): 
    232225mNewTexture(NULL),  
    233226mOldTexture(NULL),  
    234 mMaxDepth(0),  
    235 mRenderer(renderer),  
     227mMaxDepth(40),  
    236228mPreprocessor(preprocessor), 
    237229mTexHeight(128), 
    238230mTexWidth(128), 
    239 mEpsilon(0.0001) 
    240 {} 
     231mEpsilon(0.0001), 
     232mSampleReverse(true) 
     233{ 
     234        mRenderer = new GlRenderer(mPreprocessor->mSceneGraph, 
     235                                                           mPreprocessor->mViewCellsManager, 
     236                                                           mPreprocessor->mKdTree); 
     237} 
    241238 
    242239 
     
    288285        delete mNewItemBuffer; 
    289286        delete mOldItemBuffer; 
     287 
     288        DEL_PTR(mRenderer); 
    290289} 
    291290 
    292291  
    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  
     292void GlobalLinesRenderer::InitRenderTexture(RenderTexture *rt) 
     293{ 
    325294         // setup the rendering context for the RenderTexture 
    326         mNewTexture->BeginCapture(); 
     295        rt->BeginCapture(); 
    327296        { 
    328297                //Reshape(mTexWidth, mTexHeight); 
     
    346315                glLoadIdentity(); 
    347316                gluLookAt(mViewPoint.x, mViewPoint.y, mViewPoint.z,  
    348                                   midPoint.x, midPoint.y, midPoint.z,  
     317                                  mTermination.x, mTermination.y, mTermination.z,  
    349318                                  mUpVec.x, mUpVec.y, mUpVec.z); 
    350319 
    351320        } 
    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 
     325void 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        } 
    366345                 
    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 
     369void 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         
    382396        cout << "eye: " << mEyeVec << " left: " << mLeftVec << " up: " << mUpVec << endl; 
    383397} 
     
    395409} 
    396410 
     411 
     412void 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} 
    397420 
    398421void GlobalLinesRenderer::RenderObject(Intersectable *obj) 
     
    438461                                                                                Vector3 &left) 
    439462{ 
    440         //float x = cos(alpha); 
    441         //float y = sin(alpha); 
    442463        eye.x = sin(alpha) * cos(beta); 
    443464        eye.y = sin(alpha) * sin(beta); 
    444465        eye.z = cos(alpha); 
    445466 
    446         //eye = Normalize(eye); 
    447467        eye.RightHandedBase(up, left); 
    448468} 
     
    637657 
    638658 
    639 void GlobalLinesRenderer::ProcessDepthBuffer(VssRayContainer &vssRays,  
     659bool GlobalLinesRenderer::ProcessDepthBuffer(VssRayContainer &vssRays,  
    640660                                                                                         const bool oldBufferInitialised, 
    641661                                                                                         const int pass) 
     
    660680                        mOldItemBuffer[i * 4 + 3] = 255; 
    661681                } 
     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; 
    662723        } 
    663724 
     
    698759                        } 
    699760 
    700                         if (termObj2) 
     761                        if (mSampleReverse && termObj2) 
    701762                        { 
    702763                                vssRays.push_back(new VssRay(clippedNewPt, clippedOldPt, NULL, termObj2, pass)); 
     
    705766                } 
    706767        } 
     768 
     769        return true; 
    707770} 
    708771 
     
    912975 
    913976                // 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; 
    915980        } 
    916981 
Note: See TracChangeset for help on using the changeset viewer.