Changeset 472 for trunk/VUT/GtpVisibilityPreprocessor/src/VspBspTree.cpp
- Timestamp:
- 12/19/05 18:57:00 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/VUT/GtpVisibilityPreprocessor/src/VspBspTree.cpp
r469 r472 37 37 VspBspTree::VspBspTree(): 38 38 mRoot(NULL), 39 mPvsUseArea(true) 39 mPvsUseArea(true), 40 mNumCriteria(0) 40 41 { 41 42 mRootCell = new BspViewCell(); … … 50 51 environment->GetFloatValue("VspBspTree.Termination.maxRayContribution", mTermMaxRayContribution); 51 52 environment->GetFloatValue("VspBspTree.Termination.minAccRayLenght", mTermMinAccRayLength); 53 environment->GetFloatValue("VspBspTree.Termination.maxCostRatio", mTermMaxCostRatio); 54 environment->GetIntValue("VspBspTree.Termination.missTolerance", mTermMissTolerance); 52 55 53 56 //-- factors for bsp tree split plane heuristics … … 57 60 58 61 //-- termination criteria for axis aligned split 59 environment->GetFloatValue("VspBspTree.Termination.AxisAligned.ct_div_ci", mA aCtDivCi);60 environment->GetFloatValue("VspBspTree.Termination. AxisAligned.maxCostRatio",mMaxCostRatio);62 environment->GetFloatValue("VspBspTree.Termination.AxisAligned.ct_div_ci", mAxisAlignedCtDivCi); 63 environment->GetFloatValue("VspBspTree.Termination.maxCostRatio", mTermMaxCostRatio); 61 64 62 65 environment->GetIntValue("VspBspTree.Termination.AxisAligned.minRays", … … 67 70 environment->GetIntValue("VspBspTree.maxRayCandidates", mMaxRayCandidates); 68 71 environment->GetIntValue("VspBspTree.splitPlaneStrategy", mSplitPlaneStrategy); 69 environment->GetFloatValue("VspBspTree.AxisAligned.splitBorder", m SplitBorder);72 environment->GetFloatValue("VspBspTree.AxisAligned.splitBorder", mAxisAlignedSplitBorder); 70 73 71 74 environment->GetFloatValue("VspBspTree.Construction.epsilon", mEpsilon); … … 82 85 if (mSplitPlaneStrategy & RANDOM_POLYGON) 83 86 Debug << "random polygon "; 87 84 88 if (mSplitPlaneStrategy & AXIS_ALIGNED) 89 { 90 ++ mNumCriteria; 85 91 Debug << "axis aligned "; 92 } 86 93 if (mSplitPlaneStrategy & LEAST_RAY_SPLITS) 94 { 95 ++ mNumCriteria; 87 96 Debug << "least ray splits "; 97 } 88 98 if (mSplitPlaneStrategy & BALANCED_RAYS) 99 { 100 ++ mNumCriteria; 89 101 Debug << "balanced rays "; 102 } 90 103 if (mSplitPlaneStrategy & PVS) 104 { 105 ++ mNumCriteria; 91 106 Debug << "pvs"; 107 } 92 108 93 109 Debug << endl; … … 261 277 void VspBspTree::Construct(const PolygonContainer &polys, RayInfoContainer *rays) 262 278 { 263 std::stack<VspBspTraversalData>tStack;279 VspBspTraversalStack tStack; 264 280 265 281 mRoot = new BspLeaf(); … … 338 354 EvaluateLeafStats(tData); 339 355 340 //-- clean up 341 356 //-- clean up 342 357 DEL_PTR(tData.mPolygons); 343 358 DEL_PTR(tData.mRays); … … 361 376 362 377 // create new interior node and two leaf nodes 363 BspInterior *interior = 364 SubdivideNode(tData, tFrontData, tBackData, coincident); 365 378 BspNode *newNode = SubdivideNode(tData, tFrontData, tBackData, coincident); 379 380 // subdivide further 381 if (!newNode->IsLeaf()) 382 { 383 BspInterior *interior = dynamic_cast<BspInterior *>(newNode); 384 366 385 #ifdef _DEBUG 367 386 // if (frontPolys->empty() && backPolys->empty() && (coincident.size() > 2)) … … 371 390 #endif 372 391 373 // push the children on the stack 374 tStack.push(tFrontData); 375 tStack.push(tBackData); 392 // push the children on the stack 393 tStack.push(tFrontData); 394 tStack.push(tBackData); 395 396 // delete old leaf node 397 DEL_PTR(tData.mNode); 398 } 376 399 377 400 // cleanup 378 DEL_PTR(tData.mNode);379 380 401 DEL_PTR(tData.mPolygons); 381 402 DEL_PTR(tData.mRays); 382 403 DEL_PTR(tData.mGeometry); 383 404 384 return interior;385 } 386 387 Bsp Interior*VspBspTree::SubdivideNode(VspBspTraversalData &tData,388 389 390 405 return newNode; 406 } 407 408 BspNode *VspBspTree::SubdivideNode(VspBspTraversalData &tData, 409 VspBspTraversalData &frontData, 410 VspBspTraversalData &backData, 411 PolygonContainer &coincident) 391 412 { 392 413 mStat.nodes += 2; … … 394 415 BspLeaf *leaf = dynamic_cast<BspLeaf *>(tData.mNode); 395 416 417 int maxCostMisses = tData.mMaxCostMisses; 418 396 419 // select subdivision plane 397 BspInterior *interior = new BspInterior(SelectPlane(leaf, tData)); 420 Plane3 splitPlane; 421 if (!SelectPlane(splitPlane, leaf, tData)) 422 { 423 ++ maxCostMisses; 424 425 if (maxCostMisses >= mTermMissTolerance) 426 return leaf; 427 } 428 429 // subdivide further 430 BspInterior *interior = new BspInterior(splitPlane); 398 431 399 432 #ifdef _DEBUG … … 414 447 coincident); 415 448 416 // compute pvs 449 450 //-- set left and right traversal data 451 frontData.mMaxCostMisses = maxCostMisses; 452 backData.mMaxCostMisses = maxCostMisses; 453 454 // compute pvs 417 455 frontData.mPvs = ComputePvsSize(*frontData.mRays); 418 456 backData.mPvs = ComputePvsSize(*backData.mRays); … … 426 464 mBox, 427 465 mEpsilon); 428 429 430 frontData.mArea = frontData.mGeometry->GetArea() ;431 backData.mArea = backData.mGeometry->GetArea() ;466 467 // area is normalized with view space area 468 frontData.mArea = frontData.mGeometry->GetArea() / mBox.SurfaceArea(); 469 backData.mArea = backData.mGeometry->GetArea() / mBox.SurfaceArea(); 432 470 } 433 471 … … 543 581 float boxArea = box.SurfaceArea(); 544 582 545 float minBand = minBox + m SplitBorder * (maxBox - minBox);546 float maxBand = minBox + (1.0f - m SplitBorder) * (maxBox - minBox);583 float minBand = minBox + mAxisAlignedSplitBorder * (maxBox - minBox); 584 float maxBand = minBox + (1.0f - mAxisAlignedSplitBorder) * (maxBox - minBox); 547 585 548 586 float minSum = 1e20f; … … 584 622 } 585 623 586 float oldCost = (float)polys.size();587 float newCost = mAaCtDivCi + minSum / boxArea;588 float ratio = newCost / oldCost;624 const float oldCost = (float)polys.size(); 625 const float newCost = mAxisAlignedCtDivCi + minSum / boxArea; 626 const float ratio = newCost / oldCost; 589 627 590 628 … … 615 653 { 616 654 float p = 0; 617 float r = BestCostRatio(polys, box, i, p, objectsBack, objectsFront);655 const float r = BestCostRatio(polys, box, i, p, objectsBack, objectsFront); 618 656 619 657 if (r < costRatio) … … 625 663 } 626 664 627 if (costRatio >= m MaxCostRatio)665 if (costRatio >= mTermMaxCostRatio) 628 666 return false; 629 667 … … 634 672 } 635 673 636 Plane3 VspBspTree::SelectPlane(BspLeaf *leaf, VspBspTraversalData &data) 674 bool VspBspTree::SelectPlane(Plane3 &plane, 675 BspLeaf *leaf, 676 VspBspTraversalData &data) 637 677 { 638 678 if ((mSplitPlaneStrategy & AXIS_ALIGNED) && 639 679 ((int)data.mRays->size() > mTermMinRaysForAxisAligned)) 640 { 641 Plane3 plane; 642 if (SelectAxisAlignedPlane(plane, *data.mPolygons)) // TODO: should be rays 643 return plane; 680 { // TODO: candidates should be rays 681 return SelectAxisAlignedPlane(plane, *data.mPolygons); 644 682 } 645 683 … … 651 689 const int randIdx = Random((int)data.mPolygons->size()); 652 690 Polygon3 *nextPoly = (*data.mPolygons)[randIdx]; 653 return nextPoly->GetSupportingPlane(); 691 692 plane = nextPoly->GetSupportingPlane(); 693 return true; 654 694 } 655 695 else … … 665 705 const Vector3 normal = (*data.mRays)[candidateIdx].mRay->GetDir(); 666 706 667 return Plane3(normal, pt); 668 } 669 670 return Plane3(); 707 plane = Plane3(normal, pt); 708 return true; 709 } 710 711 return false; 671 712 } 672 713 673 714 // use heuristics to find appropriate plane 674 return SelectPlaneHeuristics(leaf, data); 675 } 676 677 Plane3 VspBspTree::SelectPlaneHeuristics(BspLeaf *leaf, VspBspTraversalData &data) 715 return SelectPlaneHeuristics(plane, leaf, data); 716 } 717 718 bool VspBspTree::SelectPlaneHeuristics(Plane3 &bestPlane, 719 BspLeaf *leaf, 720 VspBspTraversalData &data) 678 721 { 679 722 float lowestCost = MAX_FLOAT; 680 Plane3 bestPlane;723 // intermediate plane 681 724 Plane3 plane; 682 725 683 int limit = Min((int)data.mPolygons->size(), mMaxPolyCandidates); 684 726 const int limit = Min((int)data.mPolygons->size(), mMaxPolyCandidates); 685 727 int candidateIdx = limit; 686 728 … … 774 816 } 775 817 818 // cost ratio miss 819 if (lowestCost > mTermMaxCostRatio) 820 return false; 821 776 822 #ifdef _DEBUG 777 823 Debug << "plane lowest cost: " << lowestCost << endl; 778 824 #endif 779 return bestPlane; 825 826 return true; 780 827 } 781 828 … … 802 849 const VspBspTraversalData &data) 803 850 { 804 float val= 0;851 float cost = 0; 805 852 806 853 float sumBalancedRays = 0; … … 933 980 934 981 const float raysSize = (float)data.mRays->size() + Limits::Small; 935 982 936 983 if (mSplitPlaneStrategy & LEAST_RAY_SPLITS) 937 val+= mLeastRaySplitsFactor * sumRaySplits / raysSize;984 cost += mLeastRaySplitsFactor * sumRaySplits / raysSize; 938 985 939 986 if (mSplitPlaneStrategy & BALANCED_RAYS) 940 val += mBalancedRaysFactor * fabs(sumBalancedRays) / raysSize; 941 942 const float denom = pOverall * (float)data.mPvs * 2.0f + Limits::Small; 943 987 cost += mBalancedRaysFactor * fabs(sumBalancedRays) / raysSize; 988 989 // pvs criterium 944 990 if (mSplitPlaneStrategy & PVS) 945 991 { 946 val += mPvsFactor * (frontPvs * pFront + (backPvs * pBack)) / denom; 992 const float oldCost = pOverall * (float)data.mPvs + Limits::Small; 993 994 cost += mPvsFactor * (frontPvs * pFront + (backPvs * pBack)) / oldCost; 947 995 948 996 // give penalty to unbalanced split … … 950 998 if (((pFront * 0.2 + Limits::Small) > pBack) || 951 999 (pFront < (pBack * 0.2 + Limits::Small))) 952 val+= 0.5;1000 cost += 0.5; 953 1001 } 954 1002 … … 958 1006 // << " backpvs: " << backPvs << " pBack: " << pBack << endl << endl; 959 1007 #endif 960 return val; 1008 1009 // normalize by number of criteria 1010 return cost / (float)(mNumCriteria + Limits::Small); 961 1011 } 962 1012
Note: See TracChangeset
for help on using the changeset viewer.