Ignore:
Timestamp:
04/04/06 23:47:05 (18 years ago)
Author:
mattausch
Message:

fixed bug in teapot demo

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/App/Demos/Vis/Teapots/RenderTraverser.cpp

    r643 r724  
    1010 
    1111RenderTraverser::RenderTraverser(): mFrameID(1), mVisibilityThreshold(0), 
    12 mHierarchyRoot(NULL), mOcclusionQueries(NULL), mCurrentTestIdx(0), mIsQueryMode(false), 
     12mHierarchyRoot(NULL), mOcclusionQueries(NULL), mCurrentQueryIdx(0), mIsQueryMode(false), 
    1313mNumTraversedNodes(0), mNumQueryCulledNodes(0), mNumFrustumCulledNodes(0), 
    14 mRenderTime(0), mNumRenderedGeometry(0), mUseOptimization(true) 
     14mRenderTime(0), mNumRenderedGeometry(0), mUseOptimization(true), 
     15mUseArbQueries(false) 
    1516{ 
    1617} 
     
    1819RenderTraverser::~RenderTraverser() 
    1920{ 
    20         if(mOcclusionQueries)  
    21                 delete [] mOcclusionQueries; 
     21        DelQueries(); 
    2222} 
    2323 
     
    4747 
    4848        mFrameID ++; 
    49         ResetQueries(); 
     49         
    5050 
    5151        long endTime = getTime(); 
     
    267267} 
    268268 
    269 bool RenderTraverser::ResultAvailable(HierarchyNode *node) 
    270 { 
    271         int result; 
    272  
    273         glGetQueryivARB(node->GetOcclusionQuery(), 
    274                                         GL_QUERY_RESULT_AVAILABLE_ARB, &result); 
    275  
     269bool RenderTraverser::ResultAvailable(HierarchyNode *node) const 
     270{ 
     271        unsigned int result; 
     272        if (mUseArbQueries) 
     273        { 
     274                glGetQueryObjectuivARB(node->GetOcclusionQuery(), 
     275                                                           GL_QUERY_RESULT_AVAILABLE_ARB, &result); 
     276        } 
     277        else 
     278        { 
     279                 
     280                glGetOcclusionQueryuivNV(node->GetOcclusionQuery(),  
     281                                                                 GL_PIXEL_COUNT_AVAILABLE_NV, &result); 
     282 
     283        } 
     284         
    276285        return (result == GL_TRUE); 
    277286} 
     
    281290        mHierarchyRoot = sceneRoot; 
    282291 
    283         // not valid anymore for new hierarchy => delete 
    284         delete [] mOcclusionQueries; 
    285         mOcclusionQueries = NULL; 
     292        DelQueries(); 
    286293} 
    287294 
     
    291298} 
    292299 
    293 int RenderTraverser::GetOcclusionQueryResult(HierarchyNode *node) 
     300unsigned int RenderTraverser::GetOcclusionQueryResult(HierarchyNode *node) const 
    294301{ 
    295302        unsigned int result; 
    296          
    297         glGetQueryObjectuivARB(node->GetOcclusionQuery(), GL_QUERY_RESULT_ARB, &result); 
    298  
    299         return (int)result; 
     303 
     304        if (mUseArbQueries) 
     305        { 
     306                glGetQueryObjectuivARB(node->GetOcclusionQuery(), GL_QUERY_RESULT_ARB, &result); 
     307        } 
     308        else 
     309        { 
     310                glGetOcclusionQueryuivNV(node->GetOcclusionQuery(), GL_PIXEL_COUNT_NV, &result); 
     311        } 
     312 
     313        return result; 
    300314} 
    301315 
     
    330344{ 
    331345        // get next available test id 
    332         unsigned int occlusionQuery = mOcclusionQueries[mCurrentTestIdx++]; 
     346        unsigned int occlusionQuery = mOcclusionQueries[mCurrentQueryIdx ++]; 
    333347         
    334348        node->SetOcclusionQuery(occlusionQuery); 
     349 
    335350        // do the actual occlusion query for this node 
    336         glBeginQueryARB(GL_SAMPLES_PASSED_ARB, occlusionQuery); 
     351        if (mUseArbQueries) 
     352        { 
     353                glBeginQueryARB(GL_SAMPLES_PASSED_ARB, occlusionQuery); 
     354        } 
     355        else 
     356        { 
     357                glBeginOcclusionQueryNV(occlusionQuery); 
     358        } 
    337359         
    338360        // if leaf and was visible => will be rendered anyway, thus we 
     
    350372        } 
    351373 
    352         glEndQueryARB(GL_SAMPLES_PASSED_ARB); 
     374        if (mUseArbQueries) 
     375        { 
     376                glEndQueryARB(GL_SAMPLES_PASSED_ARB); 
     377        } 
     378        else 
     379        { 
     380                glEndOcclusionQueryNV(); 
     381        } 
    353382} 
    354383 
    355384void RenderTraverser::Preprocess() 
    356385{ 
    357         if(!mOcclusionQueries) 
     386        if (!mOcclusionQueries) 
    358387        { 
    359388                mOcclusionQueries = new unsigned int[mHierarchyRoot->GetNumHierarchyNodes()]; 
     389 
     390                // generate ids for occlusion test 
     391                if (mUseArbQueries) 
     392                { 
     393                        glGenQueriesARB(mHierarchyRoot->GetNumHierarchyNodes(), mOcclusionQueries); 
     394                } 
     395                else 
     396                { 
     397                        glGenOcclusionQueriesNV(mHierarchyRoot->GetNumHierarchyNodes(), mOcclusionQueries); 
     398                } 
    360399        } 
    361400 
     
    363402        calcViewFrustumPlanes(&mClipPlanes, mProjViewMatrix); 
    364403        calcAABNPVertexIndices(mNPVertexIndices, mClipPlanes); 
    365         // generate ids for occlusion test 
    366         glGenQueriesARB(mHierarchyRoot->GetNumHierarchyNodes(), mOcclusionQueries); 
    367         mCurrentTestIdx = 0; 
     404 
     405        mCurrentQueryIdx = 0; 
    368406 
    369407        // reset statistics 
     
    375413 
    376414 
    377 void RenderTraverser::ResetQueries() 
    378 { 
     415void RenderTraverser::DelQueries() 
     416{ 
     417        if (!mOcclusionQueries) 
     418                return; 
     419 
    379420        // tell the driver that the occlusion queries won't be needed any more 
    380         glDeleteQueriesARB(mHierarchyRoot->GetNumHierarchyNodes(), mOcclusionQueries); 
     421        if (mUseArbQueries) 
     422        { 
     423                glDeleteQueriesARB(mHierarchyRoot->GetNumHierarchyNodes(), mOcclusionQueries); 
     424        } 
     425        else 
     426        { 
     427                glDeleteOcclusionQueriesNV(mHierarchyRoot->GetNumHierarchyNodes(), mOcclusionQueries); 
     428        } 
     429 
     430        delete [] mOcclusionQueries; 
     431 
     432        mOcclusionQueries = NULL; 
    381433} 
    382434 
     
    435487} 
    436488 
     489void RenderTraverser::SetUseArbQueries(const bool useArbQueries) 
     490{ 
     491        DelQueries(); 
     492        mUseArbQueries = useArbQueries; 
     493} 
     494 
     495bool RenderTraverser::GetUseArbQueries() const 
     496{ 
     497        return mUseArbQueries; 
     498} 
     499 
    437500long RenderTraverser::GetRenderTime() 
    438501{ 
Note: See TracChangeset for help on using the changeset viewer.