Changeset 654 for GTP/trunk/Lib/Vis/Preprocessing/src/VspBspTree.cpp
- Timestamp:
- 02/19/06 20:15:02 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Vis/Preprocessing/src/VspBspTree.cpp
r653 r654 91 91 environment->GetFloatValue("VspBspTree.Termination.maxCostRatio", mTermMaxCostRatio); 92 92 93 // HACK 94 mTermMinPolygons = 25; 93 environment->GetFloatValue("VspBspTree.Termination.minGlobalCostRatio", mTermMinGlobalCostRatio); 94 environment->GetIntValue("VspBspTree.Termination.globalCostMissTolerance", mTermGlobalCostMissTolerance); 95 96 // HACK//mTermMinPolygons = 25; 95 97 96 98 //-- factors for bsp tree split plane heuristics … … 389 391 mBspStats.polys = (int)polys.size(); 390 392 393 mGlobalCostMisses = 0; 394 391 395 cout << "finished" << endl; 392 396 … … 395 399 << TimeDiff(startTime, GetTime())*1e-3 << " secs" << endl << endl; 396 400 397 Construct(polys, rays); 401 if (0) 402 ConstructWithSplitQueue(polys, rays); 403 else 404 Construct(polys, rays); 398 405 399 406 // clean up polygons … … 496 503 << TimeDiff(startTime, GetTime())*1e-3 << "s" << endl; 497 504 498 if (mBspStats.Leaves() == nLeaves)505 if (mBspStats.Leaves() >= nLeaves) 499 506 { 500 507 nLeaves += 500; … … 523 530 524 531 525 void VspBspTree::ConstructWithSplitQueue Queue(const PolygonContainer &polys,532 void VspBspTree::ConstructWithSplitQueue(const PolygonContainer &polys, 526 533 RayInfoContainer *rays) 527 534 { … … 551 558 tQueue.push(splitCandidate); 552 559 553 554 560 mTotalCost = tData.mPvs * tData.mProbability / mBox.GetVolume(); 555 561 mTotalPvsSize = tData.mPvs; … … 558 564 << "#ViewCells\n1\n" << endl 559 565 << "#RenderCostDecrease\n0\n" << endl 566 << "#dummy\n0\n" << endl 560 567 << "#TotalRenderCost\n" << mTotalCost << endl 561 568 << "#AvgRenderCost\n" << mTotalPvsSize << endl; … … 583 590 tQueue.pop(); 584 591 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 } 585 601 if (0 && !mOutOfMemory) 586 602 { … … 601 617 << TimeDiff(startTime, GetTime())*1e-3 << "s" << endl; 602 618 603 if (mBspStats.Leaves() == nLeaves)619 if (mBspStats.Leaves() >= nLeaves) 604 620 { 605 621 nLeaves += 500; … … 627 643 628 644 629 bool VspBspTree:: TerminationCriteriaMet(const VspBspTraversalData &data) const645 bool VspBspTree::LocalTerminationCriteriaMet(const VspBspTraversalData &data) const 630 646 { 631 647 return … … 633 649 (data.mPvs <= mTermMinPvs) || 634 650 (data.mProbability <= mTermMinProbability) || 635 (mBspStats.Leaves() >= mMaxViewCells) ||636 #if 0637 (((int)data.mPolygons->size() <= mTermMinPolygons) && !data.mPolygons->empty())||638 #endif639 651 (data.GetAvgRayContribution() > mTermMaxRayContribution) || 640 652 (data.mDepth >= mTermMaxDepth)); … … 642 654 643 655 656 bool VspBspTree::GlobalTerminationCriteriaMet(const VspBspTraversalData &data) const 657 { 658 return 659 (mOutOfMemory 660 || (mBspStats.Leaves() >= mMaxViewCells) 661 || (mGlobalCostMisses >= mTermGlobalCostMissTolerance) 662 ); 663 } 664 665 666 644 667 BspNode *VspBspTree::Subdivide(VspBspTraversalQueue &tQueue, 645 668 VspBspTraversalData &tData) … … 647 670 BspNode *newNode = tData.mNode; 648 671 649 if (! mOutOfMemory && !TerminationCriteriaMet(tData))672 if (!LocalTerminationCriteriaMet(tData) && !GlobalTerminationCriteriaMet(tData)) 650 673 { 651 674 PolygonContainer coincident; … … 786 809 BspNode *newNode = tData.mNode; 787 810 788 if (! mOutOfMemory && !TerminationCriteriaMet(tData))811 if (!LocalTerminationCriteriaMet(tData) && !GlobalTerminationCriteriaMet(tData)) 789 812 { 790 813 PolygonContainer coincident; … … 801 824 // create new interior node and two leaf node 802 825 const Plane3 splitPlane = splitCandidate.mSplitPlane; 803 826 804 827 newNode = SubdivideNode(splitPlane, tData, tFrontData, tBackData, coincident); 805 828 806 829 #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 816 840 #endif 817 841 if (1) … … 829 853 mSubdivisionStats 830 854 << "#ViewCells\n" << mBspStats.Leaves() << endl 831 << "#RenderCostDecrease\n" << -costDecr << endl 855 << "#RenderCostDecrease\n" << -costDecr << endl 856 << "#dummy\n" << splitCandidate.GetCost() << endl 832 857 << "#TotalRenderCost\n" << mTotalCost << endl 833 858 << "#AvgRenderCost\n" << (float)mTotalPvsSize / (float)mBspStats.Leaves() << endl; … … 838 863 VspBspSplitCandidate backCandidate; 839 864 840 EvalSplitCandidate(t Data, frontCandidate);841 EvalSplitCandidate(t Data, backCandidate);842 865 EvalSplitCandidate(tFrontData, frontCandidate); 866 EvalSplitCandidate(tBackData, backCandidate); 867 843 868 tQueue.push(frontCandidate); 844 869 tQueue.push(backCandidate); … … 847 872 DEL_PTR(tData.mNode); 848 873 } 874 849 875 850 876 //-- terminate traversal and create new view cell … … 904 930 905 931 BspLeaf *leaf = dynamic_cast<BspLeaf *>(tData.mNode); 932 933 // compute locally best split plane 906 934 SelectPlane(splitData.mSplitPlane, leaf, tData, frontData, backData, splitAxis); 907 935 … … 910 938 DEL_PTR(backData.mGeometry); 911 939 940 // compute global decrease in render cost 912 941 splitData.mRenderCost = EvalRenderCostDecrease(splitData.mSplitPlane, tData); 913 942 splitData.mParentData = tData; … … 966 995 { 967 996 frontData.mProbability = frontData.mGeometry->GetVolume(); 968 backData.mProbability = 997 backData.mProbability = tData.mProbability - frontData.mProbability; 969 998 } 970 999 } … … 1590 1619 int pvsFront = 0; 1591 1620 int pvsBack = 0; 1592 int totalPvs = data.mPvs;1621 int totalPvs = 0; 1593 1622 1594 1623 // probability that view point lies in back / front node … … 1649 1678 const float newRenderCost = penaltyFront * pFront + penaltyBack * pBack; 1650 1679 1651 return oldRenderCost - newRenderCost; 1680 //Debug << "decrease: " << oldRenderCost - newRenderCost << endl; 1681 return (oldRenderCost - newRenderCost) / mBox.GetVolume(); 1652 1682 } 1653 1683 … … 1860 1890 if (!obj) 1861 1891 return; 1862 1892 // new object 1863 1893 if ((obj->mMailbox != sFrontId) && 1864 1894 (obj->mMailbox != sBackId) &&
Note: See TracChangeset
for help on using the changeset viewer.