Ignore:
Timestamp:
10/17/06 20:32:06 (18 years ago)
Author:
mattausch
Message:

worked on gradient method for vsposp

File:
1 edited

Legend:

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

    r1632 r1633  
    113113        mSubdivisionStats.open(subdivisionStatsLog); 
    114114 
    115         //mMinRenderCostDecrease = -1; 
     115        Environment::GetSingleton()->GetBoolValue( 
     116                "Hierarchy.Construction.recomputeSplitPlaneOnRepair", mRecomputeSplitPlaneOnRepair); 
    116117 
    117118        Debug << "******** Hierachy Manager Parameters ***********" << endl; 
     
    122123        Debug << "repair queue: " << mRepairQueue << endl; 
    123124        Debug << "number of multilevels: " << mNumMultiLevels << endl; 
     125        Debug << "recompute split plane on repair: " << mRecomputeSplitPlaneOnRepair << endl; 
    124126 
    125127        switch (mConstructionType) 
     
    259261                (0 
    260262                || (mHierarchyStats.Leaves() >= mTermMaxLeaves)  
    261                 || (mHierarchyStats.mGlobalCostMisses >= mTermGlobalCostMissTolerance) 
     263                //|| (mHierarchyStats.mGlobalCostMisses >= mTermGlobalCostMissTolerance) 
    262264                || (candidate->GlobalTerminationCriteriaMet()) 
    263265                //|| (mHierarchyStats.mRenderCostDecrease < mMinRenderCostDecrease) 
     
    316318        // compute view space bounding box 
    317319        mVspTree->ComputeBoundingBox(sampleRays, forcedViewSpace); 
     320 
     321        SplitQueue objectSpaceQueue; 
     322        SplitQueue viewSpaceQueue; 
    318323 
    319324        // use sah for evaluating osp tree construction  
     
    324329        mSavedObjectSpaceSubdivisionType = mObjectSpaceSubdivisionType; 
    325330 
    326         SplitQueue objectSpaceQueue; 
    327         SplitQueue viewSpaceQueue; 
    328  
    329331        // number of initial splits 
    330332        int maxSteps = 200; 
    331333        float renderCostDecr = 0; 
     334 
     335        SubdivisionCandidate *osc =  
     336                PrepareObjectSpaceSubdivision(sampleRays, objects); 
     337         
     338        objectSpaceQueue.Push(osc); 
     339 
     340        ///////////////////////// 
     341        // calulcate initial object space splits 
     342         
     343        SubdivisionCandidateContainer dirtyVspList; 
     344 
     345        // subdivide object space first 
     346        // for first round, use sah splits. Once view space partition 
     347        // has started, use render cost heuristics instead 
     348        const int ospSteps =  
     349                RunConstruction(objectSpaceQueue, dirtyVspList, renderCostDecr, maxSteps); 
     350 
     351        cout << ospSteps << " object space partition steps taken" << endl; 
     352 
     353        SubdivisionCandidate *vsc =  
     354                        PrepareViewSpaceSubdivision(sampleRays, objects); 
     355 
     356        viewSpaceQueue.Push(vsc); 
     357 
     358        // view space subdivision was constructed 
     359        mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 
     360 
     361        // don't terminate on max steps 
     362        //maxSteps = mTermMaxLeaves; 
    332363 
    333364        // This method subdivides view space / object space  
     
    337368        // and vice versa until iteration depth is reached. 
    338369 
    339         while (1) 
    340         { 
    341                 // subdivide object space first 
    342                 // for first round, use sah splits. Once view space partition 
    343                 // has started, use render cost heuristics instead 
    344                 SubdivisionCandidate *osc =  
    345                         ResetObjectSpaceSubdivision(sampleRays, objects); 
    346                 objectSpaceQueue.Push(osc); 
    347  
    348                 // process object space candidates using render queue for  
    349                 // objects until slope of previous subdivision is reached 
    350                 SubdivisionCandidateContainer ospContainer; 
    351  
    352                 const int ospSteps =  
    353                         RunConstruction(objectSpaceQueue, ospContainer, renderCostDecr, maxSteps); 
    354             cout << ospSteps << " object space partition steps taken" << endl; 
    355  
    356                 // use splits of one kind until rendercost slope is reached 
    357                 renderCostDecr = mHierarchyStats.mRenderCostDecrease; 
     370        while (!(viewSpaceQueue.Empty() && objectSpaceQueue.Empty())) 
     371        { 
     372                // should view or object space be subdivided further? 
     373                if (viewSpaceQueue.Empty() || 
     374                        (!objectSpaceQueue.Empty() && 
     375                        (objectSpaceQueue.Top()->GetPriority() > viewSpaceQueue.Top()->GetPriority()))) 
     376                { 
     377                        // use splits of one kind until rendercost slope is reached 
     378                        renderCostDecr = mHierarchyStats.mRenderCostDecrease; 
     379 
     380                        // dirtied view space candidates 
     381                        SubdivisionCandidateContainer dirtyVspList; 
     382 
     383                        // subdivide object space first 
     384                        // for first round, use sah splits. Once view space partition 
     385                        // has started, use render cost heuristics instead 
     386                        const int ospSteps =  
     387                                RunConstruction(objectSpaceQueue, dirtyVspList, renderCostDecr, maxSteps); 
     388 
     389                        cout << ospSteps << " object space partition steps taken" << endl; 
    358390                 
    359                 // object space subdivision constructed 
    360                 mObjectSpaceSubdivisionType = mSavedObjectSpaceSubdivisionType; 
    361  
    362                 /// Repair split queue 
    363                 cout << "repairing queue ... " << endl; 
    364                  
    365                 vector<SubdivisionCandidate *> dirtyList; 
    366  
    367                 CollectDirtyCandidates(ospContainer, dirtyList); 
    368                 //RepairQueue(dirtyList, viewSpaceQueue); 
    369  
    370                 cout << "finished repairing queue ... " << endl; 
    371                  
    372                 CLEAR_CONTAINER(ospContainer); 
    373  
    374                 ///////////////// 
    375                 // subdivide view space with respect to the objects 
    376  
    377                 SubdivisionCandidate *vsc =  
    378                         ResetViewSpaceSubdivision(sampleRays, objects); 
    379                 viewSpaceQueue.Push(vsc); 
    380  
    381                 SubdivisionCandidateContainer vspContainer; 
    382                 // process view space candidates 
    383                 const int vspSteps =  
    384                         RunConstruction(viewSpaceQueue, vspContainer, renderCostDecr, maxSteps); 
    385  
    386                 cout << vspSteps << " view space partition steps taken" << endl; 
    387  
    388                 // view space subdivision constructed 
    389                 mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 
    390  
    391                 // use splits of one kind until rendercost slope is reached 
    392                 renderCostDecr = mHierarchyStats.mRenderCostDecrease; 
    393  
    394                 /// Repair split queue 
    395                 cout << "repairing queue ... " << endl; 
    396                  
    397                 CollectDirtyCandidates(vspContainer, dirtyList); 
    398                 //RepairQueue(dirtyList, objectSpaceQueue); 
    399  
    400                 cout << "finished repairing queue ... " << endl; 
    401  
    402                 CLEAR_CONTAINER(vspContainer); 
    403         } 
    404          
     391                        // object space subdivision constructed 
     392                        mObjectSpaceSubdivisionType = mSavedObjectSpaceSubdivisionType; 
     393 
     394                        /// Repair split queue 
     395                        cout << "repairing queue ... " << endl; 
     396                        RepairQueue(dirtyVspList, viewSpaceQueue, true); 
     397                        cout << "repaired " << dirtyVspList.size() << " candidates" << endl; 
     398                } 
     399                else 
     400                { 
     401                        // use splits of one kind until rendercost slope is reached 
     402                        renderCostDecr = mHierarchyStats.mRenderCostDecrease; 
     403 
     404                        ///////////////// 
     405                        // subdivide view space with respect to the objects 
     406 
     407                        SubdivisionCandidateContainer dirtyOspList; 
     408 
     409                        // process view space candidates 
     410                        const int vspSteps =  
     411                                RunConstruction(viewSpaceQueue, dirtyOspList, renderCostDecr, maxSteps); 
     412 
     413                        cout << vspSteps << " view space partition steps taken" << endl; 
     414 
     415                        // view space subdivision constructed 
     416                        mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 
     417 
     418                        /// Repair split queue 
     419                        cout << "repairing queue ... " << endl; 
     420                        RepairQueue(dirtyOspList, objectSpaceQueue, true); 
     421                        cout << "repaired " << dirtyOspList.size() << " candidates" << endl; 
     422                } 
     423        } 
     424 
    405425        cout << "\nfinished in " << TimeDiff(startTime, GetTime()) * 1e-3 << " secs" << endl; 
    406426 
     
    432452        mVspTree->ComputeBoundingBox(sampleRays, forcedViewSpace); 
    433453 
    434         // use objects for evaluating vsp tree construction in the first levels 
    435         // of the subdivision 
     454        // use objects for evaluating vsp tree construction in the  
     455        // first levels of the subdivision 
    436456        mSavedObjectSpaceSubdivisionType = mObjectSpaceSubdivisionType; 
    437457        mObjectSpaceSubdivisionType = NO_OBJ_SUBDIV; 
     
    557577                                                                                                 const bool repairQueue) 
    558578{ 
    559         // test if global termination criteria were met before this split 
    560579        const bool terminationCriteriaMet = GlobalTerminationCriteriaMet(sc); 
    561         const bool vspSplit = (sc->Type() == SubdivisionCandidate::VIEW_SPACE); 
    562  
    563         bool success = false; 
    564  
    565         switch (sc->Type()) 
    566         { 
    567         case SubdivisionCandidate::VIEW_SPACE: 
    568                 { 
    569                         VspNode *n = mVspTree->Subdivide(splitQueue, sc, terminationCriteriaMet); 
    570  
    571                         // check if terminated 
    572                         success = !n->IsLeaf(); 
    573                 } 
    574                 break; 
    575         case SubdivisionCandidate::OBJECT_SPACE: 
    576                 { 
    577                         if (mObjectSpaceSubdivisionType == KD_BASED_OBJ_SUBDIV) 
    578                         { 
    579                                 KdNode *n = mOspTree->Subdivide(splitQueue, sc, terminationCriteriaMet); 
    580  
    581                                 // local or global termination criteria failed 
    582                                 success = !n->IsLeaf(); 
    583                         } 
    584                         else if (mObjectSpaceSubdivisionType == BV_BASED_OBJ_SUBDIV) 
    585                         { 
    586                                 BvhNode *n = mBvHierarchy->Subdivide(splitQueue, sc, terminationCriteriaMet); 
    587  
    588                                 // local or global termination criteria failed 
    589                                 success = !n->IsLeaf();                                  
    590                         } 
    591                 } 
    592                 break; 
    593         default: 
    594                 cerr << "unknown subdivision type" << endl; 
    595                 break; 
    596         } 
     580 
     581        const bool success = sc->Apply(splitQueue, terminationCriteriaMet); 
    597582 
    598583        if (!success) // split was not taken 
     
    635620                // this would be object space splits and other way round 
    636621                vector<SubdivisionCandidate *> dirtyList; 
    637                 CollectDirtyCandidates(sc, dirtyList); 
    638  
    639                 RepairQueue(dirtyList, splitQueue); 
     622                sc->CollectDirtyCandidates(dirtyList, false); 
     623 
     624                RepairQueue(dirtyList, splitQueue, mRecomputeSplitPlaneOnRepair); 
    640625        } 
    641626 
     
    766751                //////// 
    767752                //-- subdivide leaf node of either type 
    768  
    769753                ApplySubdivisionCandidate(sc, mTQueue, repairQueue); 
    770  
    771754                DEL_PTR(sc); 
    772755        } 
     
    775758 
    776759int HierarchyManager::RunConstruction(SplitQueue &splitQueue, 
    777                                                                           SubdivisionCandidateContainer &chosenCandidates, 
     760                                                                          SubdivisionCandidateContainer &dirtyCandidates, 
    778761                                                                          const float minRenderCostDecr, 
    779762                                                                          const int maxSteps) 
    780763{ 
    781764        int steps = 0; 
     765        SubdivisionCandidate::NewMail(); 
    782766 
    783767        // main loop 
    784         while (!splitQueue.Empty() && ((steps ++) < maxSteps)) 
     768        while (!splitQueue.Empty() && (steps < maxSteps)) 
    785769        { 
    786770                SubdivisionCandidate *sc = NextSubdivisionCandidate(splitQueue);  
    787771                 
    788772                // minimum slope reached 
    789                 if (sc->GetRenderCostDecrease() < minRenderCostDecr) 
    790                         break; 
     773                //if (sc->GetRenderCostDecrease() < minRenderCostDecr)  break; 
    791774 
    792775                //////// 
     
    794777 
    795778                const bool repairQueue = false; 
    796                 bool success = ApplySubdivisionCandidate(sc, splitQueue, repairQueue); 
     779                const bool success = ApplySubdivisionCandidate(sc, splitQueue, repairQueue); 
    797780 
    798781                if (success) 
    799782                { 
    800                         chosenCandidates.push_back(sc); 
     783                        sc->CollectDirtyCandidates(dirtyCandidates, true); 
     784                        //cout << "collected " << dirtyCandidates.size() << "dirty candidates" << endl; 
     785                        ++ steps; 
    801786                } 
    802787        } 
     
    826811         
    827812                        firstCandidate = mBvHierarchy->Reset(sampleRays, objects); 
    828                         cout << "here4" << endl; 
     813                 
    829814                        mHierarchyStats.mTotalCost = mBvHierarchy->mTotalCost; 
    830815 
     
    835820                        // evaluate stats before first subdivision 
    836821                        EvalSubdivisionStats(); 
    837                         cout << "here5" << endl; 
    838822                } 
    839823                break; 
     
    845829                break; 
    846830        } 
    847 cout << "here6" << endl; 
     831 
    848832        return firstCandidate; 
    849833} 
     
    990974 
    991975 
    992 void HierarchyManager::CollectObjectSpaceDirtyList(SubdivisionCandidate *sc, 
    993                                                                                                    SubdivisionCandidateContainer &dirtyList) 
    994 { 
    995         switch (mObjectSpaceSubdivisionType) 
    996         { 
    997         case KD_BASED_OBJ_SUBDIV: 
    998                 { 
    999                         OspTree::OspSubdivisionCandidate *ospSc =  
    1000                                 dynamic_cast<OspTree::OspSubdivisionCandidate *>(sc); 
    1001  
    1002                         mOspTree->CollectDirtyCandidates(ospSc, dirtyList); 
    1003                         break; 
    1004                 } 
    1005         case BV_BASED_OBJ_SUBDIV: 
    1006                 { 
    1007                         BvHierarchy::BvhSubdivisionCandidate *bvhSc =  
    1008                                 dynamic_cast<BvHierarchy::BvhSubdivisionCandidate *>(sc); 
    1009  
    1010                         mBvHierarchy->CollectDirtyCandidates(bvhSc, dirtyList); 
    1011                         break; 
    1012                 } 
    1013         default: 
    1014                 break; 
    1015         } 
    1016 } 
    1017  
    1018  
    1019 void HierarchyManager::CollectViewSpaceDirtyList(SubdivisionCandidate *sc,  
    1020                                                                                                  SubdivisionCandidateContainer &dirtyList) 
    1021 { 
    1022         VspTree::VspSubdivisionCandidate *vspSc =  
    1023                 dynamic_cast<VspTree::VspSubdivisionCandidate *>(sc); 
    1024  
    1025         mVspTree->CollectDirtyCandidates(vspSc, dirtyList); 
    1026 } 
    1027  
    1028  
    1029 void HierarchyManager::CollectDirtyCandidates(SubdivisionCandidate *sc,  
    1030                                                                                           SubdivisionCandidateContainer &dirtyList) 
    1031 { 
    1032         // we have either a object space or view space split 
    1033         if (sc->Type() == SubdivisionCandidate::VIEW_SPACE) 
    1034         { 
    1035                 CollectViewSpaceDirtyList(sc, dirtyList); 
    1036         } 
    1037         else // object space split 
    1038         { 
    1039                 CollectObjectSpaceDirtyList(sc, dirtyList); 
    1040         } 
    1041 } 
    1042  
    1043  
    1044976void HierarchyManager::CollectDirtyCandidates(const SubdivisionCandidateContainer &chosenCandidates,  
    1045977                                                                                          SubdivisionCandidateContainer &dirtyList) 
    1046978{ 
    1047979        SubdivisionCandidateContainer::const_iterator sit, sit_end = chosenCandidates.end(); 
     980        SubdivisionCandidate::NewMail(); 
    1048981 
    1049982        for (sit = chosenCandidates.begin(); sit != sit_end; ++ sit) 
    1050983        { 
    1051                 // we have either a object space or view space split 
    1052                 if ((*sit)->Type() == SubdivisionCandidate::VIEW_SPACE) 
    1053                 { 
    1054                         CollectViewSpaceDirtyList(*sit, dirtyList); 
    1055                 } 
    1056                 else // object space split 
    1057                 { 
    1058                         CollectObjectSpaceDirtyList(*sit, dirtyList); 
    1059                 } 
    1060         } 
    1061 } 
    1062  
    1063  
    1064 void HierarchyManager::RepairQueue(const vector<SubdivisionCandidate *> &dirtyList,  
    1065                                                                    SplitQueue &splitQueue) 
     984                (*sit)->CollectDirtyCandidates(dirtyList, true); 
     985        } 
     986} 
     987 
     988 
     989void HierarchyManager::RepairQueue(const SubdivisionCandidateContainer &dirtyList,  
     990                                                                   SplitQueue &splitQueue, 
     991                                                                   const bool recomputeSplitPlaneOnRepair) 
    1066992{ 
    1067993        // for each update of the view space partition: 
     
    10971023                 
    10981024                splitQueue.Erase(sc); // erase from queue 
    1099                 sc->EvalPriority(); // reevaluate 
     1025                sc->EvalPriority(recomputeSplitPlaneOnRepair); // reevaluate 
    11001026                 
    11011027#ifdef _DEBUG 
     
    11131039        mHierarchyStats.mRepairTime += timeDiff; 
    11141040 
    1115         if (1) cout << "repaired in " << timeDiff * 1e-3f << " secs" << endl; 
     1041        if (0) cout << "repaired in " << timeDiff * 1e-3f << " secs" << endl; 
    11161042} 
    11171043 
Note: See TracChangeset for help on using the changeset viewer.