Ignore:
Timestamp:
02/19/06 20:15:02 (18 years ago)
Author:
mattausch
Message:

removed bug in split queue

File:
1 edited

Legend:

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

    r653 r654  
    9191        environment->GetFloatValue("VspBspTree.Termination.maxCostRatio", mTermMaxCostRatio); 
    9292 
    93         // HACK 
    94         mTermMinPolygons = 25; 
     93        environment->GetFloatValue("VspBspTree.Termination.minGlobalCostRatio", mTermMinGlobalCostRatio); 
     94        environment->GetIntValue("VspBspTree.Termination.globalCostMissTolerance", mTermGlobalCostMissTolerance); 
     95 
     96        // HACK//mTermMinPolygons = 25; 
    9597 
    9698        //-- factors for bsp tree split plane heuristics 
     
    389391        mBspStats.polys = (int)polys.size(); 
    390392 
     393        mGlobalCostMisses = 0; 
     394 
    391395        cout << "finished" << endl; 
    392396 
     
    395399                  << TimeDiff(startTime, GetTime())*1e-3 << " secs" << endl << endl; 
    396400 
    397         Construct(polys, rays); 
     401        if (0) 
     402                ConstructWithSplitQueue(polys, rays); 
     403        else 
     404                Construct(polys, rays); 
    398405 
    399406        // clean up polygons 
     
    496503                                  << TimeDiff(startTime, GetTime())*1e-3 << "s" << endl; 
    497504 
    498                 if (mBspStats.Leaves() == nLeaves) 
     505                if (mBspStats.Leaves() >= nLeaves) 
    499506                { 
    500507                        nLeaves += 500; 
     
    523530 
    524531 
    525 void VspBspTree::ConstructWithSplitQueueQueue(const PolygonContainer &polys,  
     532void VspBspTree::ConstructWithSplitQueue(const PolygonContainer &polys,  
    526533                                                                                          RayInfoContainer *rays) 
    527534{ 
     
    551558        tQueue.push(splitCandidate); 
    552559 
    553  
    554560        mTotalCost = tData.mPvs * tData.mProbability / mBox.GetVolume(); 
    555561        mTotalPvsSize = tData.mPvs; 
     
    558564                        << "#ViewCells\n1\n" <<  endl 
    559565                        << "#RenderCostDecrease\n0\n" << endl  
     566                        << "#dummy\n0\n" << endl 
    560567                        << "#TotalRenderCost\n" << mTotalCost << endl 
    561568                        << "#AvgRenderCost\n" << mTotalPvsSize << endl; 
     
    583590            tQueue.pop();                
    584591 
     592                // cost ratio of cost decrease / totalCost 
     593                float costRatio = splitCandidate.GetCost() / mTotalCost; 
     594 
     595                Debug << "cost ratio: " << costRatio << endl; 
     596 
     597                if (costRatio < mTermMinGlobalCostRatio) 
     598                {Debug << "here1 cost ratio: " << costRatio << " max " << mTermMinGlobalCostRatio << endl; 
     599                        ++ mGlobalCostMisses; 
     600                } 
    585601                if (0 && !mOutOfMemory) 
    586602                { 
     
    601617                                  << TimeDiff(startTime, GetTime())*1e-3 << "s" << endl; 
    602618 
    603                 if (mBspStats.Leaves() == nLeaves) 
     619                if (mBspStats.Leaves() >= nLeaves) 
    604620                { 
    605621                        nLeaves += 500; 
     
    627643 
    628644 
    629 bool VspBspTree::TerminationCriteriaMet(const VspBspTraversalData &data) const 
     645bool VspBspTree::LocalTerminationCriteriaMet(const VspBspTraversalData &data) const 
    630646{ 
    631647        return 
     
    633649                 (data.mPvs <= mTermMinPvs)   || 
    634650                 (data.mProbability <= mTermMinProbability) || 
    635                  (mBspStats.Leaves() >= mMaxViewCells) || 
    636 #if 0 
    637                  (((int)data.mPolygons->size() <= mTermMinPolygons) && !data.mPolygons->empty())|| 
    638 #endif 
    639651                 (data.GetAvgRayContribution() > mTermMaxRayContribution) || 
    640652                 (data.mDepth >= mTermMaxDepth)); 
     
    642654 
    643655 
     656bool VspBspTree::GlobalTerminationCriteriaMet(const VspBspTraversalData &data) const 
     657{ 
     658        return 
     659                (mOutOfMemory  
     660                || (mBspStats.Leaves() >= mMaxViewCells)  
     661                || (mGlobalCostMisses >= mTermGlobalCostMissTolerance) 
     662                 ); 
     663} 
     664 
     665 
     666 
    644667BspNode *VspBspTree::Subdivide(VspBspTraversalQueue &tQueue, 
    645668                                                           VspBspTraversalData &tData) 
     
    647670        BspNode *newNode = tData.mNode; 
    648671 
    649         if (!mOutOfMemory && !TerminationCriteriaMet(tData)) 
     672        if (!LocalTerminationCriteriaMet(tData) && !GlobalTerminationCriteriaMet(tData)) 
    650673        { 
    651674                PolygonContainer coincident; 
     
    786809        BspNode *newNode = tData.mNode; 
    787810 
    788         if (!mOutOfMemory && !TerminationCriteriaMet(tData)) 
     811        if (!LocalTerminationCriteriaMet(tData) && !GlobalTerminationCriteriaMet(tData)) 
    789812        { 
    790813                PolygonContainer coincident; 
     
    801824                // create new interior node and two leaf node 
    802825                const Plane3 splitPlane = splitCandidate.mSplitPlane; 
    803                          
     826                                 
    804827                newNode = SubdivideNode(splitPlane, tData, tFrontData, tBackData, coincident); 
    805  
     828                 
    806829#if 0 // TODO 
    807                         if (splitAxis < 3) 
    808                                 ++ mBspStats.splits[splitAxis]; 
    809                         else 
    810                                 ++ mBspStats.polySplits; 
    811  
    812                         tFrontData.mIsKdNode = tBackData.mIsKdNode = (tData.mIsKdNode && splitAxis < 3); 
    813                         // how often was max cost ratio missed in this branch? 
    814                         tFrontData.mMaxCostMisses = maxCostMisses; 
    815                         tBackData.mMaxCostMisses = maxCostMisses; 
     830                if (splitAxis < 3) 
     831                        ++ mBspStats.splits[splitAxis]; 
     832                else 
     833                        ++ mBspStats.polySplits; 
     834 
     835                tFrontData.mIsKdNode = tBackData.mIsKdNode = (tData.mIsKdNode && splitAxis < 3); 
     836                // how often was max cost ratio missed in this branch? 
     837                tFrontData.mMaxCostMisses = maxCostMisses; 
     838                tBackData.mMaxCostMisses = maxCostMisses; 
     839 
    816840#endif 
    817841                if (1) 
     
    829853                        mSubdivisionStats  
    830854                                        << "#ViewCells\n" << mBspStats.Leaves() << endl 
    831                                         << "#RenderCostDecrease\n" << -costDecr << endl  
     855                                        << "#RenderCostDecrease\n" << -costDecr << endl 
     856                                        << "#dummy\n" << splitCandidate.GetCost() << endl 
    832857                                        << "#TotalRenderCost\n" << mTotalCost << endl 
    833858                                        << "#AvgRenderCost\n" << (float)mTotalPvsSize / (float)mBspStats.Leaves() << endl; 
     
    838863                VspBspSplitCandidate backCandidate; 
    839864 
    840                 EvalSplitCandidate(tData, frontCandidate); 
    841                 EvalSplitCandidate(tData, backCandidate); 
    842  
     865                EvalSplitCandidate(tFrontData, frontCandidate); 
     866                EvalSplitCandidate(tBackData, backCandidate); 
     867         
    843868                tQueue.push(frontCandidate); 
    844869                tQueue.push(backCandidate); 
     
    847872                DEL_PTR(tData.mNode); 
    848873        } 
     874 
    849875 
    850876        //-- terminate traversal and create new view cell 
     
    904930 
    905931        BspLeaf *leaf = dynamic_cast<BspLeaf *>(tData.mNode); 
     932 
     933        // compute locally best split plane 
    906934        SelectPlane(splitData.mSplitPlane, leaf, tData, frontData, backData, splitAxis); 
    907935 
     
    910938        DEL_PTR(backData.mGeometry); 
    911939         
     940        // compute global decrease in render cost 
    912941        splitData.mRenderCost = EvalRenderCostDecrease(splitData.mSplitPlane, tData); 
    913942        splitData.mParentData = tData; 
     
    966995                { 
    967996                        frontData.mProbability = frontData.mGeometry->GetVolume(); 
    968                         backData.mProbability =  tData.mProbability - frontData.mProbability; 
     997                        backData.mProbability = tData.mProbability - frontData.mProbability; 
    969998                } 
    970999        } 
     
    15901619        int pvsFront = 0; 
    15911620        int pvsBack = 0; 
    1592         int totalPvs = data.mPvs; 
     1621        int totalPvs = 0; 
    15931622 
    15941623        // probability that view point lies in back / front node 
     
    16491678        const float newRenderCost = penaltyFront * pFront + penaltyBack * pBack; 
    16501679 
    1651         return oldRenderCost - newRenderCost; 
     1680        //Debug << "decrease: " << oldRenderCost - newRenderCost << endl; 
     1681        return (oldRenderCost - newRenderCost) / mBox.GetVolume(); 
    16521682} 
    16531683 
     
    18601890        if (!obj) 
    18611891                return; 
    1862          
     1892        // new object 
    18631893        if ((obj->mMailbox != sFrontId) && 
    18641894                (obj->mMailbox != sBackId) && 
Note: See TracChangeset for help on using the changeset viewer.