Changeset 1912 for GTP/trunk/Lib/Vis/Preprocessing/src/VspTree.cpp
- Timestamp:
- 12/20/06 00:26:02 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Vis/Preprocessing/src/VspTree.cpp
r1911 r1912 724 724 725 725 // create new interior node and two leaf node 726 const AxisAlignedPlane splitPlane = sc->mSplitPlane;727 726 const int maxCostMisses = sc->GetMaxCostMisses(); 728 727 729 newNode = SubdivideNode(splitPlane, tData, tFrontData, tBackData); 728 newNode = SubdivideNode(*sc, 729 tFrontData, 730 tBackData); 730 731 731 732 // how often was max cost ratio missed in this branch? … … 832 833 833 834 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 835 847 // compute global decrease in render cost 836 848 float oldRenderCost; 837 const float renderCostDecr = EvalRenderCostDecrease(splitCandidate.mSplitPlane, 838 splitCandidate.mParentData, 839 oldRenderCost); 840 849 const float renderCostDecr = EvalRenderCostDecrease(splitCandidate, oldRenderCost); 841 850 splitCandidate.SetRenderCostDecrease(renderCostDecr); 842 851 … … 854 863 { 855 864 priority /= ((float)splitCandidate.GetPvsEntriesIncr() + mMemoryConst); 856 }857 858 859 /////////////860 // avg ray contri861 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);870 865 } 871 866 … … 904 899 } 905 900 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 924 VspInterior *VspTree::SubdivideNode(const VspSubdivisionCandidate &sc, 912 925 VspTraversalData &frontData, 913 926 VspTraversalData &backData) 914 927 { 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 917 933 /////////////// 918 934 //-- new traversal values … … 928 944 929 945 //-- 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 933 953 //-- split front and back node geometry and compute area 934 954 tData.mBoundingBox.Split(splitPlane.mAxis, … … 940 960 backData.mProbability = tData.mProbability - frontData.mProbability; 941 961 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; 942 968 943 969 //////// … … 1519 1545 1520 1546 1521 float VspTree::EvalRenderCostDecrease(const AxisAlignedPlane &candidatePlane, 1522 const VspTraversalData &tData, 1523 float &normalizedOldRenderCost, 1524 const float avgRayContri) const 1547 float VspTree::EvalRenderCostDecrease(VspSubdivisionCandidate &sc, 1548 float &normalizedOldRenderCost) const 1525 1549 { 1526 1550 float pvsFront = 0; … … 1529 1553 1530 1554 const float viewSpaceVol = mBoundingBox.GetVolume(); 1555 const VspTraversalData &tData = sc.mParentData; 1556 1557 const AxisAlignedPlane &candidatePlane = sc.mSplitPlane; 1558 const float avgRayContri = sc.GetAvgRayContribution(); 1531 1559 1532 1560 ////////////////////////////////////////////// … … 1537 1565 KdLeaf::NewMail(3); 1538 1566 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) 1542 1570 { 1543 1571 RayInfo rayInf = *rit; … … 1563 1591 AxisAlignedBox3 backBox; 1564 1592 1565 data.mBoundingBox.Split(candidatePlane.mAxis,1566 candidatePlane.mPosition,1567 frontBox,1568 backBox);1569 1570 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; 1572 1600 float pFront = frontBox.GetVolume(); 1573 1601 float pBack = pOverall - pFront; … … 1576 1604 /////////////////// 1577 1605 //-- 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; 1592 1618 1593 1619 const float oldRenderCost = pOverall * penaltyOld; 1594 const float newRenderCost = penaltyFront * pFront + penaltyBack* pBack;1620 const float newRenderCost = sc.mCorrectedFrontPvs * pFront + sc.mCorrectedBackPvs * pBack; 1595 1621 1596 1622 // we also return the old render cost … … 1612 1638 1613 1639 1614 float VspTree::EvalLocalSplitCost(const VspTraversalData & data,1640 float VspTree::EvalLocalSplitCost(const VspTraversalData &tData, 1615 1641 const AxisAlignedBox3 &box, 1616 1642 const int axis, … … 1627 1653 KdLeaf::NewMail(3); 1628 1654 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(); 1631 1656 1632 1657 // 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) 1634 1659 { 1635 1660 VssRay *ray = (*rit).mRay; … … 1645 1670 ////////////// 1646 1671 //-- evaluate cost heuristics 1647 float pOverall = data.mProbability; 1672 1673 float pOverall = tData.mProbability; 1648 1674 1649 1675 // we use spatial mid split => simplified computation … … 1651 1677 1652 1678 const float newCost = pvsBack * pBack + pvsFront * pFront; 1653 const float oldCost = (float)pvs Size* pOverall + Limits::Small;1679 const float oldCost = (float)pvsTotal * pOverall + Limits::Small; 1654 1680 1655 1681 #ifdef GTPGTP_DEBUG … … 2921 2947 #endif 2922 2948 2949 mTotalCost = vData.mCorrectedPvs = pvsCost; 2950 mPvsEntries = EvalPvsEntriesSize(rays); 2951 2923 2952 ////////////// 2924 2953 //-- create the first split candidate … … 2927 2956 EvalSubdivisionCandidate(*splitCandidate); 2928 2957 leaf->SetSubdivisionCandidate(splitCandidate); 2929 2930 mTotalCost = pvsCost;2931 mPvsEntries = EvalPvsEntriesSize(rays);2932 2958 2933 2959 EvalSubdivisionStats(*splitCandidate); … … 3333 3359 // create new interior node and two leaf node 3334 3360 const AxisAlignedPlane splitPlane = oldInterior->GetPlane(); 3335 3336 3361 sc->mSplitPlane = splitPlane; 3337 3362 … … 3339 3364 EvalSubdivisionCandidate(*sc, false); 3340 3365 3341 newNode = SubdivideNode( splitPlane, tData, tFrontData, tBackData);3366 newNode = SubdivideNode(*sc, tFrontData, tBackData); 3342 3367 3343 3368 //oldNode->mRenderCostDecr += sc->GetRenderCostDecrease();
Note: See TracChangeset
for help on using the changeset viewer.