Changeset 1099 for GTP/trunk/Lib/Vis/Preprocessing/src/VspOspTree.cpp
- Timestamp:
- 07/07/06 16:14:33 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Vis/Preprocessing/src/VspOspTree.cpp
r1097 r1099 30 30 int VspTree::sFrontAndBackId = 0; 31 31 32 32 VspTree *VspTree::VspSplitCandidate::sVspTree = NULL; 33 OspTree *OspTree::OspSplitCandidate::sOspTree = NULL; 33 34 34 35 // pvs penalty can be different from pvs size … … 442 443 AxisAlignedBox3 *forcedBoundingBox) 443 444 { 445 // store pointer to this tree 446 VspSplitCandidate::sVspTree = this; 447 444 448 mVspStats.nodes = 1; 445 449 … … 574 578 575 579 //-- push the new split candidates on the queue 576 VspSplitCandidate *frontCandidate = new VspSplitCandidate( );577 VspSplitCandidate *backCandidate = new VspSplitCandidate( );578 579 EvalSplitCandidate( tFrontData,*frontCandidate);580 EvalSplitCandidate( tBackData,*backCandidate);581 582 tQueue. push(frontCandidate);583 tQueue. push(backCandidate);580 VspSplitCandidate *frontCandidate = new VspSplitCandidate(tFrontData); 581 VspSplitCandidate *backCandidate = new VspSplitCandidate(tBackData); 582 583 EvalSplitCandidate(*frontCandidate); 584 EvalSplitCandidate(*backCandidate); 585 586 tQueue.Push(frontCandidate); 587 tQueue.Push(backCandidate); 584 588 585 589 // delete old leaf node … … 634 638 635 639 636 void VspTree::EvalSplitCandidate(VspTraversalData &tData, 637 VspSplitCandidate &splitCandidate) 640 void VspTree::EvalSplitCandidate(VspSplitCandidate &splitCandidate) 638 641 { 639 642 float frontProb; 640 643 float backProb; 641 644 642 VspLeaf *leaf = dynamic_cast<VspLeaf *>( tData.mNode);645 VspLeaf *leaf = dynamic_cast<VspLeaf *>(splitCandidate.mParentData.mNode); 643 646 644 647 // compute locally best split plane 645 648 const bool success = 646 SelectSplitPlane( tData, splitCandidate.mSplitPlane,frontProb, backProb);649 SelectSplitPlane(splitCandidate.mParentData, splitCandidate.mSplitPlane, frontProb, backProb); 647 650 648 651 // compute global decrease in render cost 649 splitCandidate.mPriority = EvalRenderCostDecrease(splitCandidate.mSplitPlane,tData);650 splitCandidate. mParentData = tData;651 splitCandidate.mMaxCostMisses = success ? tData.mMaxCostMisses :tData.mMaxCostMisses + 1;652 const float priority = EvalRenderCostDecrease(splitCandidate.mSplitPlane, splitCandidate.mParentData); 653 splitCandidate.SetPriority(priority); 654 splitCandidate.mMaxCostMisses = success ? splitCandidate.mParentData.mMaxCostMisses : splitCandidate.mParentData.mMaxCostMisses + 1; 652 655 653 656 //Debug << "p: " << tData.mNode << " depth: " << tData.mDepth << endl; … … 2539 2542 2540 2543 OspTree::OspTree(): 2541 mRoot(NULL) 2542 #if TODO 2543 mOutOfBoundsCell(NULL), 2544 mStoreRays(false), 2545 mUseRandomAxis(false), 2544 mRoot(NULL), 2546 2545 mTimeStamp(1) 2547 #endif2548 2546 { 2549 2547 #if TODO … … 2751 2749 2752 2750 //-- push the new split candidates on the queue 2753 OspSplitCandidate *frontCandidate = new OspSplitCandidate( );2754 OspSplitCandidate *backCandidate = new OspSplitCandidate( );2755 2756 EvalSplitCandidate( tFrontData,*frontCandidate);2757 EvalSplitCandidate( tBackData,*backCandidate);2758 2759 tQueue. push(frontCandidate);2760 tQueue. push(backCandidate);2751 OspSplitCandidate *frontCandidate = new OspSplitCandidate(tFrontData); 2752 OspSplitCandidate *backCandidate = new OspSplitCandidate(tBackData); 2753 2754 EvalSplitCandidate(*frontCandidate); 2755 EvalSplitCandidate(*backCandidate); 2756 2757 tQueue.Push(frontCandidate); 2758 tQueue.Push(backCandidate); 2761 2759 2762 2760 // delete old leaf node … … 2779 2777 2780 2778 2781 void OspTree::EvalSplitCandidate(OspTraversalData &tData, 2782 OspSplitCandidate &splitCandidate) 2779 void OspTree::EvalSplitCandidate(OspSplitCandidate &splitCandidate) 2783 2780 { 2784 2781 float frontProb; 2785 2782 float backProb; 2786 2783 2787 KdLeaf *leaf = dynamic_cast<KdLeaf *>( tData.mNode);2784 KdLeaf *leaf = dynamic_cast<KdLeaf *>(splitCandidate.mParentData.mNode); 2788 2785 2789 2786 // compute locally best split plane 2790 2787 const bool success = 2791 SelectSplitPlane( tData, splitCandidate.mSplitPlane,frontProb, backProb);2788 SelectSplitPlane(splitCandidate.mParentData, splitCandidate.mSplitPlane, frontProb, backProb); 2792 2789 2793 2790 //TODO 2794 2791 // compute global decrease in render cost 2795 splitCandidate.mPriority = EvalRenderCostDecrease(splitCandidate.mSplitPlane, tData); 2796 splitCandidate.mParentData = tData; 2797 splitCandidate.mMaxCostMisses = success ? tData.mMaxCostMisses : tData.mMaxCostMisses + 1; 2792 splitCandidate.SetPriority(EvalRenderCostDecrease(splitCandidate.mSplitPlane, splitCandidate.mParentData)); 2793 splitCandidate.mMaxCostMisses = success ? splitCandidate.mParentData.mMaxCostMisses : splitCandidate.mParentData.mMaxCostMisses + 1; 2798 2794 } 2799 2795 … … 3263 3259 AxisAlignedBox3 *forcedBoundingBox) 3264 3260 { 3261 // store pointer to this tree 3262 OspSplitCandidate::sOspTree = this; 3263 3265 3264 mOspStats.nodes = 1; 3266 3265 … … 3331 3330 SplitCandidate *HierarchyManager::NextSplitCandidate() 3332 3331 { 3333 SplitCandidate *splitCandidate = mTQueue.top();3332 SplitCandidate *splitCandidate = static_cast<SplitCandidate *>(mTQueue.Top()); 3334 3333 //Debug << "priority: " << splitCandidate->GetPriority() << endl; 3335 mTQueue. pop();3334 mTQueue.Pop(); 3336 3335 3337 3336 return splitCandidate; … … 3398 3397 3399 3398 // compute first split candidate 3400 VspTree::VspSplitCandidate *splitCandidate = new VspTree::VspSplitCandidate( );3401 mVspTree.EvalSplitCandidate( vData,*splitCandidate);3402 3403 mTQueue. push(splitCandidate);3399 VspTree::VspSplitCandidate *splitCandidate = new VspTree::VspSplitCandidate(vData); 3400 mVspTree.EvalSplitCandidate(*splitCandidate); 3401 3402 mTQueue.Push(splitCandidate); 3404 3403 3405 3404 … … 3427 3426 3428 3427 // compute first split candidate 3429 OspTree::OspSplitCandidate *oSplitCandidate = new OspTree::OspSplitCandidate( );3430 mOspTree.EvalSplitCandidate( oData,*oSplitCandidate);3431 3432 mTQueue. push(splitCandidate);3428 OspTree::OspSplitCandidate *oSplitCandidate = new OspTree::OspSplitCandidate(oData); 3429 mOspTree.EvalSplitCandidate(*oSplitCandidate); 3430 3431 mTQueue.Push(splitCandidate); 3433 3432 } 3434 3433 … … 3488 3487 3489 3488 //-- subdivide leaf node 3490 //-- either a object space or view space split3489 //-- we have either a object space or view space split 3491 3490 if (splitCandidate->Type() == SplitCandidate::VIEW_SPACE) 3492 3491 { … … 3515 3514 bool HierarchyManager::FinishedConstruction() 3516 3515 { 3517 return mTQueue. empty();3518 } 3519 3520 3521 void HierarchyManager::RepairQueue( )3516 return mTQueue.Empty(); 3517 } 3518 3519 3520 void HierarchyManager::RepairQueue(const vector<SplitCandidate *> &dirtyList) 3522 3521 { 3523 3522 // TODO … … 3535 3534 // (explicit data structure, binary tree) 3536 3535 // *) inserting and removal is efficient 3537 // *) search is not efficient => store pointer to queue elementwith each3536 // *) search is not efficient => store queue position with each 3538 3537 // split candidate 3539 3538 3540 vector<SplitCandidate *> candidates; 3541 3542 while (!mTQueue.empty()) 3543 { 3544 SplitCandidate *candidate = mTQueue.top(); 3545 mTQueue.pop(); 3546 3547 candidates.push_back(candidate); 3548 } 3549 3550 // Reinsert 3551 3552 } 3553 3554 } 3539 vector<SplitCandidate *>::const_iterator sit, sit_end = dirtyList.end(); 3540 3541 for (sit = dirtyList.begin(); sit != sit_end; ++ sit) 3542 { 3543 SplitCandidate* sc = *sit; 3544 3545 mTQueue.Erase(sc); 3546 3547 // reevaluate 3548 sc->EvalPriority(); 3549 3550 // reinsert 3551 mTQueue.Push(sc); 3552 } 3553 } 3554 3555 }
Note: See TracChangeset
for help on using the changeset viewer.