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

worked on vsp osp methodsd

File:
1 edited

Legend:

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

    r1636 r1640  
    109109                "Hierarchy.Construction.levels", mNumMultiLevels); 
    110110 
     111        Environment::GetSingleton()->GetIntValue( 
     112                "Hierarchy.Construction.minStepsOfSameType", mMinStepsOfSameType); 
     113         
     114 
    111115        char subdivisionStatsLog[100]; 
    112116        Environment::GetSingleton()->GetStringValue("Hierarchy.subdivisionStats", subdivisionStatsLog); 
     
    116120                "Hierarchy.Construction.recomputeSplitPlaneOnRepair", mRecomputeSplitPlaneOnRepair); 
    117121 
    118         Debug << "******** Hierachy Manager Parameters ***********" << endl; 
     122        Debug << "******** Hierachy Manager Options ***********" << endl; 
    119123        Debug << "max leaves: " << mTermMaxLeaves << endl; 
    120124        Debug << "min global cost ratio: " << mTermMinGlobalCostRatio << endl; 
     
    124128        Debug << "number of multilevels: " << mNumMultiLevels << endl; 
    125129        Debug << "recompute split plane on repair: " << mRecomputeSplitPlaneOnRepair << endl; 
     130        Debug << "minimal number of steps from same type: " << mMinStepsOfSameType << endl; 
    126131 
    127132        switch (mConstructionType) 
     
    228233void HierarchyManager::EvalSubdivisionStats() 
    229234{ 
     235        // TODO 
     236        const float objectSpaceMem = GetObjectSpaceMemUsage(); 
     237        const float viewSpaceMem = mVspTree->GetMemUsage(); 
     238         
     239        // calculate cost in MB 
     240        const float memoryCost = mHierarchyStats.mMemory  / (1024.0f * 1024.0f) 
     241                                                         + objectSpaceMem + viewSpaceMem; 
     242 
    230243        //cout << "pvs entries " << mHierarchyStats.pvsEntries << endl; 
    231244        AddSubdivisionStats(mHierarchyStats.Leaves(), 
     
    233246                                                mHierarchyStats.mTotalCost, 
    234247                                                mHierarchyStats.mPvsEntries, 
    235                                                 mHierarchyStats.mMemory, 
    236                                                 1.0f / (mHierarchyStats.mTotalCost * mHierarchyStats.mMemory) 
     248                                                memoryCost, 
     249                                                1.0f / (mHierarchyStats.mTotalCost * memoryCost) 
    237250                                                ); 
    238251} 
     
    243256                                                                                   const float totalRenderCost, 
    244257                                                                                   const int pvsEntries, 
    245                                                                                    const int memory, 
     258                                                                                   const float memory, 
    246259                                                                                   const float renderCostPerStorage) 
    247260{ 
     
    309322         
    310323        mHierarchyStats.mNodes = 2; 
    311          
     324 
     325        // create first nodes 
     326        mVspTree->Initialise(sampleRays, forcedViewSpace); 
     327        InitialiseObjectSpaceSubdivision(objects); 
     328 
     329        // hack: assume that object space can be seen from view space 
    312330        mHierarchyStats.mTotalCost = (float)objects.size(); 
     331        mHierarchyStats.mPvsEntries = 1; 
     332        mHierarchyStats.mMemory = sizeof(PvsData) + sizeof(Intersectable *) / (1024.0f * 1024.0f); 
     333 
     334        EvalSubdivisionStats(); 
    313335        Debug << "setting total cost to " << mHierarchyStats.mTotalCost << endl; 
    314336 
     
    316338        cout << "Constructing view space / object space tree ... \n"; 
    317339         
    318         // compute view space bounding box 
    319         mVspTree->ComputeBoundingBox(sampleRays, forcedViewSpace); 
    320  
    321340        SplitQueue objectSpaceQueue; 
    322341        SplitQueue viewSpaceQueue; 
     
    326345        mSavedViewSpaceSubdivisionType = mViewSpaceSubdivisionType; 
    327346        mViewSpaceSubdivisionType = NO_VIEWSPACE_SUBDIV; 
    328  
    329         mSavedObjectSpaceSubdivisionType = mObjectSpaceSubdivisionType; 
     347        //mSavedObjectSpaceSubdivisionType = mObjectSpaceSubdivisionType; 
    330348 
    331349        // number of initial splits 
    332         int minSteps = 200; 
     350        const int minSteps = mMinStepsOfSameType; 
    333351        float renderCostDecr = Limits::Infinity; 
    334352 
     
    337355         
    338356        objectSpaceQueue.Push(osc); 
     357 
    339358 
    340359        ///////////////////////// 
     
    349368                RunConstruction(objectSpaceQueue, dirtyVspList, renderCostDecr, minSteps); 
    350369 
    351         cout << ospSteps << " object space partition steps taken" << endl; 
    352  
     370        cout << "\n" << ospSteps << " object space partition steps taken" << endl; 
     371 
     372        // create view space 
    353373        SubdivisionCandidate *vsc =  
    354374                        PrepareViewSpaceSubdivision(sampleRays, objects); 
    355375 
    356376        viewSpaceQueue.Push(vsc); 
    357  
     377         
    358378        // view space subdivision was constructed 
    359379        mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 
    360380 
    361         // don't terminate on max steps 
    362         //maxSteps = mTermMaxLeaves; 
     381        // the priorities were calculated for driving sha. 
     382        // => recalculate "real" priorities taking visibility into 
     383        // account so we can compare to view space splits 
     384        ResetQueue(objectSpaceQueue, false); 
     385 
     386         
     387        // lower number of minsteps: the decicion of which domain to subdivide 
     388        // should be decided using the render cost decrease from now 
     389        //minSteps = 1; 
    363390 
    364391        // This method subdivides view space / object space  
     
    370397        while (!(viewSpaceQueue.Empty() && objectSpaceQueue.Empty())) 
    371398        { 
     399                const float vspPriority = viewSpaceQueue.Empty() ? 0 : viewSpaceQueue.Top()->GetPriority(); 
     400                const float ospPriority = objectSpaceQueue.Empty() ? 0 : objectSpaceQueue.Top()->GetPriority(); 
     401 
     402                cout << "new decicion, vsp: " << vspPriority << ", osp: " << ospPriority << endl; 
     403 
    372404                // 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                         // lower number of minsteps: this should be solved  
    381                         // with render cost decrease from now 
    382                         //minSteps = 5;  
    383  
     405                if (ospPriority >= vspPriority) 
     406                { 
     407                        // use splits of one kind until rendercost decrease of other domain is reached 
     408                        renderCostDecr = vspPriority; 
     409                        cout << "comparing with this render cost: " << renderCostDecr << endl; 
    384410                        // dirtied view space candidates 
    385411                        SubdivisionCandidateContainer dirtyVspList; 
     
    391417                                RunConstruction(objectSpaceQueue, dirtyVspList, renderCostDecr, minSteps); 
    392418 
    393                         cout << ospSteps << " object space partition steps taken" << endl; 
     419                        cout << "\n" << ospSteps << " object space partition steps taken" << endl; 
    394420                 
    395                         // object space subdivision constructed 
    396                         mObjectSpaceSubdivisionType = mSavedObjectSpaceSubdivisionType; 
    397  
    398                         /// Repair split queue 
     421                        /// Repair split queue, i.e., affected view space candidates 
    399422                        cout << "repairing queue ... " << endl; 
    400423                        RepairQueue(dirtyVspList, viewSpaceQueue, true); 
    401                         cout << "repaired " << dirtyVspList.size() << " candidates" << endl; 
     424                        cout << "\nrepaired " << (int)dirtyVspList.size() << " candidates" << endl; 
    402425                } 
    403426                else 
    404427                { 
    405428                        // use splits of one kind until rendercost slope is reached 
    406                 //      renderCostDecr = mHierarchyStats.mRenderCostDecrease; 
     429                        renderCostDecr = ospPriority; 
     430                        cout << "comparing with this render cost: " << renderCostDecr << endl; 
    407431 
    408432                        ///////////////// 
     
    415439                                RunConstruction(viewSpaceQueue, dirtyOspList, renderCostDecr, minSteps); 
    416440 
    417                         cout << vspSteps << " view space partition steps taken" << endl; 
     441                        cout << "\n" << vspSteps << " view space partition steps taken" << endl; 
    418442 
    419443                        // view space subdivision constructed 
     
    423447                        cout << "repairing queue ... " << endl; 
    424448                        RepairQueue(dirtyOspList, objectSpaceQueue, true); 
    425                         cout << "repaired " << dirtyOspList.size() << " candidates" << endl; 
     449                        cout << "repaired " << (int)dirtyOspList.size() << " candidates" << endl; 
    426450                } 
    427451        } 
     
    443467        mHierarchyStats.Start(); 
    444468        mHierarchyStats.mNodes = 2; // two nodes for view space and object space 
    445  
     469        mHierarchyStats.mPvsEntries = 1; 
     470        mHierarchyStats.mMemory = sizeof(PvsData) + sizeof(Intersectable *) / (1024.0f * 1024.0f); 
    446471        mHierarchyStats.mTotalCost = (float)objects.size(); 
     472 
    447473        mHierarchyStats.mRenderCostDecrease = 0; 
    448474 
     
    453479        cout << "Constructing view space / object space tree ... \n"; 
    454480         
    455         // compute view space bounding box 
    456         mVspTree->ComputeBoundingBox(sampleRays, forcedViewSpace); 
     481        // create only roots 
     482        mVspTree->Initialise(sampleRays, forcedViewSpace); 
     483        InitialiseObjectSpaceSubdivision(objects); 
    457484 
    458485        // use objects for evaluating vsp tree construction in the  
     
    464491        mViewSpaceSubdivisionType = NO_VIEWSPACE_SUBDIV; 
    465492 
    466         // create just one view cell 
    467         SubdivisionCandidate *vspSc =  
    468                 PrepareViewSpaceSubdivision(sampleRays, objects); 
    469  
    470493        // start view space subdivison immediately? 
    471494        if (StartViewSpaceSubdivision()) 
    472495        { 
    473496                // prepare vsp tree for traversal 
    474                 mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 
     497        mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 
     498                SubdivisionCandidate *vspSc =  
     499                        PrepareViewSpaceSubdivision(sampleRays, objects); 
     500 
    475501                mTQueue.Push(vspSc); 
    476502        } 
     
    489515                                        sampleRays,  
    490516                                        objects,  
    491                                         forcedViewSpace,//  
    492                                         vspSc); 
     517                                        forcedViewSpace); 
    493518         
    494519        cout << "\nfinished in " << TimeDiff(startTime, GetTime()) * 1e-3 << " secs" << endl; 
     
    519544 
    520545        return vsc; 
     546} 
     547 
     548 
     549float HierarchyManager::GetObjectSpaceMemUsage() const 
     550{ 
     551        if (mObjectSpaceSubdivisionType == KD_BASED_OBJ_SUBDIV) 
     552        { 
     553                // TODO; 
     554        } 
     555        else if (mObjectSpaceSubdivisionType == BV_BASED_OBJ_SUBDIV) 
     556        { 
     557                return mBvHierarchy->GetMemUsage(); 
     558        } 
     559 
     560        return -1; 
     561} 
     562 
     563void HierarchyManager::InitialiseObjectSpaceSubdivision(const ObjectContainer &objects) 
     564{ 
     565        if (mObjectSpaceSubdivisionType == KD_BASED_OBJ_SUBDIV) 
     566        { 
     567                // TODO; 
     568        } 
     569        else if (mObjectSpaceSubdivisionType == BV_BASED_OBJ_SUBDIV) 
     570        { 
     571                mBvHierarchy->Initialise(objects); 
     572        } 
    521573} 
    522574 
     
    608660        } 
    609661         
    610         mHierarchyStats.mTotalCost -= sc->GetRenderCostDecrease(); 
    611          
    612662        cout << sc->Type() << " "; 
    613663                 
     664        ///////////// 
    614665        // update stats 
     666 
    615667        mHierarchyStats.mNodes += 2; 
    616          
    617         const int pvsEntries = sc->GetPvsEntriesIncr(); 
    618         mHierarchyStats.mPvsEntries += pvsEntries; 
    619          
    620         //cout << "pvs entries: " << pvsEntries << " " << mHierarchyStats.pvsEntries << endl; 
    621         mHierarchyStats.mMemory += 0; // TODO 
     668        mHierarchyStats.mTotalCost -= sc->GetRenderCostDecrease(); 
     669 
     670        const int pvsEntriesIncr = sc->GetPvsEntriesIncr(); 
     671        mHierarchyStats.mPvsEntries += pvsEntriesIncr; 
     672        //cout << "pvs entries: " << pvsEntriesIncr << " " << mHierarchyStats.pvsEntries << endl; 
     673 
     674        const int sizeOfEntry = sizeof(PvsData) + sizeof(Intersectable *); 
     675        // memory size in byte 
     676        mHierarchyStats.mMemory += float(pvsEntriesIncr * sizeOfEntry); 
    622677        mHierarchyStats.mRenderCostDecrease = sc->GetRenderCostDecrease(); 
    623678 
    624         // subdivision successful 
     679        // output stats 
    625680        EvalSubdivisionStats(); 
    626681                 
     
    656711 
    657712 
     713int HierarchyManager::GetObjectSpaceSubdivisionLeaves() const 
     714{ 
     715        int maxLeaves= 0; 
     716 
     717        if (mObjectSpaceSubdivisionType == KD_BASED_OBJ_SUBDIV) 
     718        { 
     719                maxLeaves = mOspTree->mOspStats.Leaves(); 
     720        } 
     721        else if (mObjectSpaceSubdivisionType == BV_BASED_OBJ_SUBDIV) 
     722        { 
     723                maxLeaves = mBvHierarchy->mBvhStats.Leaves(); 
     724        } 
     725 
     726        return maxLeaves; 
     727} 
     728 
     729 
    658730bool HierarchyManager::StartObjectSpaceSubdivision() const 
    659731{ 
     
    673745        return  
    674746                ((mConstructionType == INTERLEAVED) &&  
    675                  (mMinDepthForObjectSpaceSubdivion <= mVspTree->mVspStats.maxDepth)); 
     747                 (mMinStepsOfSameType <= mVspTree->mVspStats.nodes)); 
    676748} 
    677749 
     
    694766        return  
    695767                ((mConstructionType == INTERLEAVED) &&  
    696                  (mMinDepthForViewSpaceSubdivion <= GetObjectSpaceSubdivisionDepth())); 
     768                 (mMinStepsOfSameType <= GetObjectSpaceSubdivisionLeaves())); 
    697769} 
    698770 
     
    701773                                                                           const VssRayContainer &sampleRays, 
    702774                                                                           const ObjectContainer &objects, 
    703                                                                            AxisAlignedBox3 *forcedViewSpace, 
    704                                                                            SubdivisionCandidate *firstVsp) 
     775                                                                           AxisAlignedBox3 *forcedViewSpace) 
    705776{ 
    706777        while (!FinishedConstruction()) 
     
    719790                        mObjectSpaceSubdivisionType = mSavedObjectSpaceSubdivisionType; 
    720791 
    721                         cout << "\nstarting object space subdivision at depth "  
    722                                  << mVspTree->mVspStats.maxDepth << " ("  
    723                                  << mMinDepthForObjectSpaceSubdivion << ") " << endl; 
     792                        cout << "\nstarting object space subdivision after "  
     793                                 << mVspTree->mVspStats.nodes << " ("  
     794                                 << mMinStepsOfSameType << ") " << endl; 
    724795 
    725796                        SubdivisionCandidate *ospSc = PrepareObjectSpaceSubdivision(sampleRays, objects); 
     797                         
     798                        cout << "reseting queue ... "; 
     799                        ResetQueue(mTQueue, mRecomputeSplitPlaneOnRepair); 
     800                        cout << "finished" << endl; 
     801 
    726802                        mTQueue.Push(ospSc); 
     803                } 
     804 
     805                if (StartViewSpaceSubdivision()) 
     806                { 
     807                        mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 
     808 
     809                        cout << "\nstarting view space subdivision at depth "  
     810                                 << GetObjectSpaceSubdivisionLeaves() << " ("  
     811                                 << mMinStepsOfSameType << ") " << endl; 
     812 
     813                        SubdivisionCandidate *vspSc = PrepareViewSpaceSubdivision(sampleRays, objects); 
    727814 
    728815                        cout << "reseting queue ... "; 
    729                         ResetQueue(); 
     816                        ResetQueue(mTQueue, mRecomputeSplitPlaneOnRepair); 
    730817                        cout << "finished" << endl; 
    731                 } 
    732  
    733                 if (StartViewSpaceSubdivision()) 
    734                 { 
    735                         mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 
    736  
    737                         cout << "\nstarting view space subdivision at depth "  
    738                                  << GetObjectSpaceSubdivisionDepth() << " ("  
    739                                  << mMinDepthForViewSpaceSubdivion << ") " << endl; 
    740  
    741                         //SubdivisionCandidate *vspSc = PrepareViewSpaceSubdivision(sampleRays, objects); 
    742                         mTQueue.Push(firstVsp); 
    743  
    744                         cout << "reseting queue ... "; 
    745                         ResetQueue(); 
    746                         cout << "finished" << endl; 
     818 
     819                        // push view space candidate                     
     820                        mTQueue.Push(vspSc); 
    747821                } 
    748822 
     
    784858                if ((sc->GetRenderCostDecrease() < minRenderCostDecr) && 
    785859                        !(steps < minSteps)) 
     860                { 
     861                        cout << "breaking on " << sc->GetRenderCostDecrease() << " smaller than " << minRenderCostDecr << endl; 
    786862                        break; 
    787  
     863                } 
    788864                //////// 
    789865                //-- subdivide leaf node of either type 
     
    826902                 
    827903                        mHierarchyStats.mTotalCost = mBvHierarchy->mTotalCost; 
    828  
     904                         
     905                        // bug!! pvs entries could be much higher at this stage 
    829906                        mHierarchyStats.mNodes = 2; 
    830                         mHierarchyStats.mPvsEntries = 0; 
     907                        mHierarchyStats.mPvsEntries = 1; 
    831908                        mHierarchyStats.mRenderCostDecrease = 0; 
    832909 
     
    861938         
    862939        mHierarchyStats.mNodes = 2; 
    863         mHierarchyStats.mPvsEntries = 0; 
     940        // bug!! pvs entries could be much higher at this stage 
     941        mHierarchyStats.mPvsEntries = 1; 
    864942        mHierarchyStats.mRenderCostDecrease = 0; 
    865943 
     944        // evaluate new stats before first subdivsiion 
    866945        EvalSubdivisionStats(); 
    867946 
     
    884963        cout << "Constructing view space / object space tree ... \n"; 
    885964         
    886         // compute view space bounding box 
    887         mVspTree->ComputeBoundingBox(sampleRays, forcedViewSpace); 
     965        // initialise view / object space 
     966        mVspTree->Initialise(sampleRays, forcedViewSpace); 
     967        InitialiseObjectSpaceSubdivision(objects); 
    888968 
    889969        // use sah for evaluating osp tree construction  
     
    892972        mSavedViewSpaceSubdivisionType = mViewSpaceSubdivisionType; 
    893973        mViewSpaceSubdivisionType = NO_VIEWSPACE_SUBDIV; 
    894          
    895         // first view cell 
    896         SubdivisionCandidate *vspVc = PrepareViewSpaceSubdivision(sampleRays, objects); 
    897974 
    898975        mSavedObjectSpaceSubdivisionType = mObjectSpaceSubdivisionType; 
    899         //mObjectSpaceSubdivisionType = NO_OBJ_SUBDIV; 
     976        mObjectSpaceSubdivisionType = NO_OBJ_SUBDIV; 
    900977 
    901978        const int limit = mNumMultiLevels; 
     
    9351012                // subdivide view space with respect to the objects 
    9361013 
    937                 if (!ViewSpaceSubdivisionConstructed()) 
    938                 { 
    939                         mTQueue.Push(vspVc); 
    940                          
    941                         // view space subdivision constructed 
    942                         mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 
    943                 } 
    944                 else 
    945                 { 
    946                         ResetViewSpaceSubdivision(sampleRays, objects); 
    947                 } 
     1014                SubdivisionCandidate *vspVc = ResetViewSpaceSubdivision(sampleRays, objects); 
     1015                mTQueue.Push(vspVc); 
     1016 
     1017                // view space subdivision constructed 
     1018                mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 
     1019                 
    9481020 
    9491021                // process view space candidates 
     
    9691041        FinishObjectSpaceSubdivision(objects); 
    9701042} 
     1043 
     1044 
     1045void HierarchyManager::OptimizeMultiLevel(const VssRayContainer &sampleRays,                                                                                      
     1046                                                                                  const ObjectContainer &objects, 
     1047                                                                                  AxisAlignedBox3 *forcedViewSpace) 
     1048{ 
     1049        mHierarchyStats.Reset(); 
     1050        mHierarchyStats.Start(); 
     1051        mHierarchyStats.mNodes = 2; 
     1052         
     1053        mHierarchyStats.mTotalCost = (float)objects.size(); 
     1054        Debug << "setting total cost to " << mHierarchyStats.mTotalCost << endl; 
     1055 
     1056        const long startTime = GetTime(); 
     1057        cout << "Constructing view space / object space tree ... \n"; 
     1058         
     1059        // initialise view / object space 
     1060        mVspTree->Initialise(sampleRays, forcedViewSpace); 
     1061        InitialiseObjectSpaceSubdivision(objects); 
     1062 
     1063        // use sah for evaluating osp tree construction  
     1064        // in the first iteration of the subdivision 
     1065         
     1066        mSavedViewSpaceSubdivisionType = mViewSpaceSubdivisionType; 
     1067        mViewSpaceSubdivisionType = NO_VIEWSPACE_SUBDIV; 
     1068 
     1069        mSavedObjectSpaceSubdivisionType = mObjectSpaceSubdivisionType; 
     1070        mObjectSpaceSubdivisionType = NO_OBJ_SUBDIV; 
     1071 
     1072        const int limit = mNumMultiLevels; 
     1073        int i = 0; 
     1074 
     1075        // This method subdivides view space / object space  
     1076        // in order to converge to some optimal cost for this partition 
     1077        // start with object space partiton 
     1078        // then optimizate view space partition for the current osp 
     1079        // and vice versa until iteration depth is reached. 
     1080        while (1) 
     1081        { 
     1082                char subdivisionStatsLog[100]; 
     1083                sprintf(subdivisionStatsLog, "tests/i3d/subdivision-%04d.log", i); 
     1084                mSubdivisionStats.open(subdivisionStatsLog); 
     1085 
     1086                // subdivide object space first 
     1087                ResetObjectSpaceSubdivision(sampleRays, objects); 
     1088 
     1089                // process object space candidates 
     1090                RunConstruction(false); 
     1091 
     1092                // object space subdivision constructed 
     1093                mObjectSpaceSubdivisionType = mSavedObjectSpaceSubdivisionType; 
     1094 
     1095                cout << "iteration " << i << " of " << limit << " finished" << endl; 
     1096 
     1097                mSubdivisionStats.close(); 
     1098 
     1099                if ((i ++) >= limit) 
     1100                        break; 
     1101 
     1102                sprintf(subdivisionStatsLog, "tests/i3d/subdivision-%04d.log", i); 
     1103                mSubdivisionStats.open(subdivisionStatsLog); 
     1104 
     1105                ///////////////// 
     1106                // subdivide view space with respect to the objects 
     1107 
     1108                SubdivisionCandidate *vspVc = ResetViewSpaceSubdivision(sampleRays, objects); 
     1109                mTQueue.Push(vspVc); 
     1110 
     1111                // view space subdivision constructed 
     1112                mViewSpaceSubdivisionType = mSavedViewSpaceSubdivisionType; 
     1113                 
     1114 
     1115                // process view space candidates 
     1116                RunConstruction(false); 
     1117 
     1118                cout << "iteration " << i << " of " << limit << " finished" << endl; 
     1119 
     1120                mSubdivisionStats.close(); 
     1121 
     1122                if ((i ++) >= limit) 
     1123                        break; 
     1124        } 
     1125         
     1126        cout << "\nfinished in " << TimeDiff(startTime, GetTime()) * 1e-3 << " secs" << endl; 
     1127 
     1128/*#if _DEBUG 
     1129        cout << "view space: " << GetViewSpaceBox() << endl; 
     1130        cout << "object space:  " << GetObjectSpaceBox() << endl; 
     1131#endif*/ 
     1132 
     1133        mHierarchyStats.Stop(); 
     1134        mVspTree->mVspStats.Stop(); 
     1135        FinishObjectSpaceSubdivision(objects); 
     1136} 
     1137 
    9711138 
    9721139 
     
    10671234 
    10681235 
    1069 void HierarchyManager::ResetQueue() 
     1236void HierarchyManager::ResetQueue(SplitQueue &splitQueue, const bool recomputeSplitPlane) 
    10701237{ 
    10711238        SubdivisionCandidateContainer mCandidateBuffer; 
    10721239 
    10731240        // remove from queue 
    1074         while (!mTQueue.Empty()) 
    1075         { 
    1076                 SubdivisionCandidate *candidate = NextSubdivisionCandidate(mTQueue); 
     1241        while (!splitQueue.Empty()) 
     1242        { 
     1243                SubdivisionCandidate *candidate = NextSubdivisionCandidate(splitQueue); 
    10771244                 // reevaluate local split plane and priority 
    1078                 candidate->EvalPriority(); 
     1245                candidate->EvalPriority(recomputeSplitPlane); 
    10791246                cout << "."; 
    10801247                mCandidateBuffer.push_back(candidate); 
     
    10851252    for (sit = mCandidateBuffer.begin(); sit != sit_end; ++ sit) 
    10861253        { 
    1087                 mTQueue.Push(*sit); 
     1254                splitQueue.Push(*sit); 
    10881255        } 
    10891256} 
Note: See TracChangeset for help on using the changeset viewer.