Ignore:
Timestamp:
12/20/06 00:26:02 (17 years ago)
Author:
mattausch
Message:
 
File:
1 edited

Legend:

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

    r1911 r1912  
    724724                 
    725725                // create new interior node and two leaf node 
    726                 const AxisAlignedPlane splitPlane = sc->mSplitPlane; 
    727726                const int maxCostMisses = sc->GetMaxCostMisses(); 
    728727 
    729                 newNode = SubdivideNode(splitPlane, tData, tFrontData, tBackData); 
     728                newNode = SubdivideNode(*sc, 
     729                                                                tFrontData,  
     730                                                                tBackData); 
    730731         
    731732                // how often was max cost ratio missed in this branch? 
     
    832833         
    833834        VspLeaf *leaf = dynamic_cast<VspLeaf *>(splitCandidate.mParentData.mNode); 
    834          
     835 
     836        ///////////// 
     837        // avg ray contri 
     838 
     839        const int pvs = EvalPvsEntriesSize(*splitCandidate.mParentData.mRays); 
     840 
     841        const float avgRayContri = (float)pvs /  
     842                ((float)splitCandidate.mParentData.mRays->size() + Limits::Small); 
     843 
     844        splitCandidate.SetAvgRayContribution(avgRayContri); 
     845        cout << "vsp avg ray contri: " << avgRayContri << endl; 
     846 
    835847        // compute global decrease in render cost 
    836848        float oldRenderCost; 
    837         const float renderCostDecr = EvalRenderCostDecrease(splitCandidate.mSplitPlane,  
    838                                                                                                                 splitCandidate.mParentData, 
    839                                                                                                                 oldRenderCost); 
    840  
     849        const float renderCostDecr = EvalRenderCostDecrease(splitCandidate, oldRenderCost); 
    841850        splitCandidate.SetRenderCostDecrease(renderCostDecr); 
    842851 
     
    854863        { 
    855864                priority /= ((float)splitCandidate.GetPvsEntriesIncr() + mMemoryConst); 
    856         } 
    857  
    858  
    859         ///////////// 
    860         // avg ray contri 
    861  
    862         if (USE_AVGRAYCONTRI) 
    863         { 
    864                 const int pvs = EvalPvsEntriesSize(*splitCandidate.mParentData.mRays); 
    865  
    866                 const float avgRayContri = (float)pvs /  
    867                         ((float)splitCandidate.mParentData.mRays->size() + Limits::Small); 
    868  
    869                 splitCandidate.SetAvgRayContribution(avgRayContri); 
    870865        } 
    871866 
     
    904899        } 
    905900 
    906         return (int)(fPvsSize + bPvsSize - oldPvsSize); 
    907 } 
    908  
    909  
    910 VspInterior *VspTree::SubdivideNode(const AxisAlignedPlane &splitPlane, 
    911                                                                         VspTraversalData &tData, 
     901        const float oldPvsRatio = oldPvsSize / splitCandidate.mParentData.mPvs; 
     902        const float correctedOldPvs = splitCandidate.mParentData.mCorrectedPvs * oldPvsRatio; 
     903 
     904        cout <<"here102 "<< endl; 
     905        cout << "old pvs ratio: " << oldPvsRatio << endl; 
     906        const float correctedFrontPvs =  
     907                mHierarchyManager->EvalCorrectedPvs(fPvsSize,  
     908                                                                                        correctedOldPvs,  
     909                                                                                        splitCandidate.GetAvgRayContribution()); 
     910        cout <<"here103 "<< endl; 
     911        const float correctedBackPvs =  
     912                mHierarchyManager->EvalCorrectedPvs(bPvsSize,  
     913                                                                                        correctedOldPvs,  
     914                                                                                        splitCandidate.GetAvgRayContribution()); 
     915 
     916         
     917        cout << "vsp front entries " << fPvsSize << " corrected: " << correctedFrontPvs << endl; 
     918        cout << "vsp back entries " << bPvsSize << " corrected: " << correctedBackPvs << endl; 
     919 
     920        return (int)(correctedFrontPvs + correctedBackPvs - correctedOldPvs); 
     921} 
     922 
     923 
     924VspInterior *VspTree::SubdivideNode(const VspSubdivisionCandidate &sc, 
    912925                                                                        VspTraversalData &frontData, 
    913926                                                                        VspTraversalData &backData) 
    914927{ 
    915         VspLeaf *leaf = dynamic_cast<VspLeaf *>(tData.mNode); 
    916          
     928        VspLeaf *leaf = dynamic_cast<VspLeaf *>(sc.mParentData.mNode); 
     929 
     930        const VspTraversalData &tData = sc.mParentData; 
     931        const AxisAlignedPlane splitPlane = sc.mSplitPlane; 
     932 
    917933        /////////////// 
    918934        //-- new traversal values 
     
    928944 
    929945        //-- compute pvs 
    930         frontData.mPvs = EvalPvsCost(*frontData.mRays); 
    931         backData.mPvs = EvalPvsCost(*backData.mRays); 
    932                  
     946        frontData.mPvs = (float)EvalPvsEntriesSize(*frontData.mRays); 
     947        backData.mPvs = (float)EvalPvsEntriesSize(*backData.mRays); 
     948         
     949        //-- compute pvs correction for coping with undersampling 
     950        frontData.mCorrectedPvs = sc.mCorrectedFrontPvs; 
     951        backData.mCorrectedPvs = sc.mCorrectedBackPvs; 
     952 
    933953        //-- split front and back node geometry and compute area 
    934954        tData.mBoundingBox.Split(splitPlane.mAxis,  
     
    940960        backData.mProbability = tData.mProbability - frontData.mProbability; 
    941961 
     962        //-- compute render cost 
     963        frontData.mRenderCost = (float)EvalRenderCost(*frontData.mRays); 
     964        backData.mRenderCost = (float)EvalRenderCost(*backData.mRays); 
     965         
     966        frontData.mCorrectedRenderCost = sc.mCorrectedFrontPvs; 
     967        backData.mCorrectedRenderCost = sc.mCorrectedBackPvs; 
    942968 
    943969        //////// 
     
    15191545 
    15201546 
    1521 float VspTree::EvalRenderCostDecrease(const AxisAlignedPlane &candidatePlane, 
    1522                                                                           const VspTraversalData &tData, 
    1523                                                                           float &normalizedOldRenderCost, 
    1524                                                                           const float avgRayContri) const 
     1547float VspTree::EvalRenderCostDecrease(VspSubdivisionCandidate &sc, 
     1548                                                                          float &normalizedOldRenderCost) const 
    15251549{ 
    15261550        float pvsFront = 0; 
     
    15291553 
    15301554        const float viewSpaceVol = mBoundingBox.GetVolume(); 
     1555        const VspTraversalData &tData = sc.mParentData; 
     1556         
     1557        const AxisAlignedPlane &candidatePlane = sc.mSplitPlane; 
     1558        const float avgRayContri = sc.GetAvgRayContribution(); 
    15311559 
    15321560        ////////////////////////////////////////////// 
     
    15371565        KdLeaf::NewMail(3); 
    15381566 
    1539         RayInfoContainer::const_iterator rit, rit_end = data.mRays->end(); 
    1540  
    1541         for (rit = data.mRays->begin(); rit != rit_end; ++ rit) 
     1567        RayInfoContainer::const_iterator rit, rit_end = tData.mRays->end(); 
     1568 
     1569        for (rit = tData.mRays->begin(); rit != rit_end; ++ rit) 
    15421570        { 
    15431571                RayInfo rayInf = *rit; 
     
    15631591        AxisAlignedBox3 backBox; 
    15641592 
    1565         data.mBoundingBox.Split(candidatePlane.mAxis,  
    1566                                                         candidatePlane.mPosition,  
    1567                                                         frontBox,  
    1568                                                         backBox); 
    1569  
    1570         // probability that view point lies in back / front node 
    1571         float pOverall = data.mProbability; 
     1593        tData.mBoundingBox.Split(candidatePlane.mAxis,  
     1594                                                         candidatePlane.mPosition,  
     1595                                                         frontBox,  
     1596                                                         backBox); 
     1597 
     1598    // probability that view point lies in back / front node 
     1599        float pOverall = tData.mProbability; 
    15721600        float pFront = frontBox.GetVolume(); 
    15731601        float pBack = pOverall - pFront; 
     
    15761604        /////////////////// 
    15771605        //-- evaluate render cost heuristics 
    1578 #if 0 
    1579         const float penaltyOld = totalPvs; 
    1580  
    1581     const float penaltyFront = pvsFront; 
    1582         const float penaltyBack = pvsBack; 
    1583 #else 
    1584         const float penaltyOld = totalPvs * tData.mPvsCorrectionFactor; 
    1585  
    1586         const float frontCorr = mHierarchyManager->EvalPvsCorrectionFactor(pvsFront, penaltyOld, avgRayContri); 
    1587         const float backCorr = mHierarchyManager->EvalPvsCorrectionFactor(pvsBack, penaltyOld, avgRayContri); 
    1588  
    1589         const float penaltyFront = frontCorr; 
    1590         const float penaltyBack = pvsBack * backCorr;; 
    1591 #endif 
     1606 
     1607        const float oldRenderCostRatio = tData.mPvs ? (totalPvs / tData.mPvs) : 1; 
     1608 
     1609        const float penaltyOld = tData.mCorrectedPvs * oldRenderCostRatio; 
     1610 
     1611        cout <<"here107 " << penaltyOld << endl; 
     1612        sc.mCorrectedFrontPvs = mHierarchyManager->EvalCorrectedPvs(pvsFront, penaltyOld, avgRayContri); 
     1613        cout <<"here108 " << tData.mCorrectedPvs << " " << oldRenderCostRatio << endl; 
     1614        sc.mCorrectedBackPvs = mHierarchyManager->EvalCorrectedPvs(pvsBack, penaltyOld, avgRayContri); 
     1615 
     1616        cout << "vsp front pvs " << pvsFront << " corrected: " << sc.mCorrectedFrontPvs << endl; 
     1617        cout << "vsp back pvs " << pvsBack << " corrected: " << sc.mCorrectedBackPvs << endl; 
    15921618 
    15931619        const float oldRenderCost = pOverall * penaltyOld; 
    1594         const float newRenderCost = penaltyFront * pFront + penaltyBack * pBack; 
     1620        const float newRenderCost = sc.mCorrectedFrontPvs * pFront + sc.mCorrectedBackPvs * pBack; 
    15951621 
    15961622        // we also return the old render cost 
     
    16121638 
    16131639 
    1614 float VspTree::EvalLocalSplitCost(const VspTraversalData &data, 
     1640float VspTree::EvalLocalSplitCost(const VspTraversalData &tData, 
    16151641                                                                  const AxisAlignedBox3 &box, 
    16161642                                                                  const int axis, 
     
    16271653        KdLeaf::NewMail(3); 
    16281654 
    1629         const float pvsSize = data.mPvs; 
    1630         RayInfoContainer::const_iterator rit, rit_end = data.mRays->end(); 
     1655        RayInfoContainer::const_iterator rit, rit_end = tData.mRays->end(); 
    16311656 
    16321657        // this is the main ray classification loop! 
    1633         for(rit = data.mRays->begin(); rit != rit_end; ++ rit) 
     1658        for(rit = tData.mRays->begin(); rit != rit_end; ++ rit) 
    16341659        { 
    16351660                VssRay *ray = (*rit).mRay; 
     
    16451670        ////////////// 
    16461671        //-- evaluate cost heuristics 
    1647         float pOverall = data.mProbability; 
     1672 
     1673        float pOverall = tData.mProbability; 
    16481674 
    16491675        // we use spatial mid split => simplified computation 
     
    16511677         
    16521678        const float newCost = pvsBack * pBack + pvsFront * pFront; 
    1653         const float oldCost = (float)pvsSize * pOverall + Limits::Small; 
     1679        const float oldCost = (float)pvsTotal * pOverall + Limits::Small; 
    16541680         
    16551681#ifdef GTPGTP_DEBUG 
     
    29212947#endif 
    29222948 
     2949        mTotalCost = vData.mCorrectedPvs = pvsCost; 
     2950        mPvsEntries = EvalPvsEntriesSize(rays); 
     2951 
    29232952        ////////////// 
    29242953        //-- create the first split candidate 
     
    29272956    EvalSubdivisionCandidate(*splitCandidate); 
    29282957        leaf->SetSubdivisionCandidate(splitCandidate); 
    2929  
    2930         mTotalCost = pvsCost; 
    2931         mPvsEntries = EvalPvsEntriesSize(rays); 
    29322958 
    29332959        EvalSubdivisionStats(*splitCandidate); 
     
    33333359                // create new interior node and two leaf node 
    33343360                const AxisAlignedPlane splitPlane = oldInterior->GetPlane(); 
    3335          
    33363361                sc->mSplitPlane = splitPlane; 
    33373362         
     
    33393364                EvalSubdivisionCandidate(*sc, false); 
    33403365 
    3341                 newNode = SubdivideNode(splitPlane, tData, tFrontData, tBackData); 
     3366                newNode = SubdivideNode(*sc, tFrontData, tBackData); 
    33423367         
    33433368                //oldNode->mRenderCostDecr += sc->GetRenderCostDecrease(); 
Note: See TracChangeset for help on using the changeset viewer.