Ignore:
Timestamp:
07/07/06 16:14:33 (18 years ago)
Author:
mattausch
Message:
 
File:
1 edited

Legend:

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

    r1097 r1099  
    3030int VspTree::sFrontAndBackId = 0; 
    3131 
    32  
     32VspTree *VspTree::VspSplitCandidate::sVspTree = NULL; 
     33OspTree *OspTree::OspSplitCandidate::sOspTree = NULL; 
    3334 
    3435// pvs penalty can be different from pvs size 
     
    442443                                                                  AxisAlignedBox3 *forcedBoundingBox)  
    443444{ 
     445        // store pointer to this tree 
     446        VspSplitCandidate::sVspTree = this; 
     447 
    444448        mVspStats.nodes = 1; 
    445449         
     
    574578         
    575579                //-- 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); 
    584588 
    585589                // delete old leaf node 
     
    634638 
    635639 
    636 void VspTree::EvalSplitCandidate(VspTraversalData &tData, 
    637                                                                  VspSplitCandidate &splitCandidate) 
     640void VspTree::EvalSplitCandidate(VspSplitCandidate &splitCandidate) 
    638641{ 
    639642        float frontProb; 
    640643        float backProb; 
    641644         
    642         VspLeaf *leaf = dynamic_cast<VspLeaf *>(tData.mNode); 
     645        VspLeaf *leaf = dynamic_cast<VspLeaf *>(splitCandidate.mParentData.mNode); 
    643646         
    644647        // compute locally best split plane 
    645648        const bool success =  
    646                 SelectSplitPlane(tData, splitCandidate.mSplitPlane,     frontProb, backProb); 
     649                SelectSplitPlane(splitCandidate.mParentData, splitCandidate.mSplitPlane, frontProb, backProb); 
    647650 
    648651        // 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; 
    652655 
    653656        //Debug << "p: " << tData.mNode << " depth: " << tData.mDepth << endl; 
     
    25392542 
    25402543OspTree::OspTree(): 
    2541 mRoot(NULL) 
    2542 #if TODO 
    2543 mOutOfBoundsCell(NULL), 
    2544 mStoreRays(false), 
    2545 mUseRandomAxis(false), 
     2544mRoot(NULL), 
    25462545mTimeStamp(1) 
    2547 #endif 
    25482546{ 
    25492547#if TODO 
     
    27512749                         
    27522750                //-- 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); 
    27612759 
    27622760                // delete old leaf node 
     
    27792777 
    27802778 
    2781 void OspTree::EvalSplitCandidate(OspTraversalData &tData, 
    2782                                                                  OspSplitCandidate &splitCandidate) 
     2779void OspTree::EvalSplitCandidate(OspSplitCandidate &splitCandidate) 
    27832780{ 
    27842781        float frontProb; 
    27852782        float backProb; 
    27862783         
    2787         KdLeaf *leaf = dynamic_cast<KdLeaf *>(tData.mNode); 
     2784        KdLeaf *leaf = dynamic_cast<KdLeaf *>(splitCandidate.mParentData.mNode); 
    27882785 
    27892786        // compute locally best split plane 
    27902787        const bool success =  
    2791                 SelectSplitPlane(tData, splitCandidate.mSplitPlane,     frontProb, backProb); 
     2788                SelectSplitPlane(splitCandidate.mParentData, splitCandidate.mSplitPlane, frontProb, backProb); 
    27922789 
    27932790        //TODO 
    27942791        // 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; 
    27982794} 
    27992795 
     
    32633259                                                                  AxisAlignedBox3 *forcedBoundingBox)  
    32643260{ 
     3261        // store pointer to this tree 
     3262        OspSplitCandidate::sOspTree = this; 
     3263 
    32653264        mOspStats.nodes = 1; 
    32663265         
     
    33313330SplitCandidate *HierarchyManager::NextSplitCandidate() 
    33323331{ 
    3333         SplitCandidate *splitCandidate = mTQueue.top(); 
     3332        SplitCandidate *splitCandidate = static_cast<SplitCandidate *>(mTQueue.Top()); 
    33343333        //Debug << "priority: " << splitCandidate->GetPriority() << endl; 
    3335         mTQueue.pop(); 
     3334        mTQueue.Pop(); 
    33363335 
    33373336        return splitCandidate; 
     
    33983397 
    33993398        // 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); 
    34043403 
    34053404 
     
    34273426 
    34283427        // 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); 
    34333432} 
    34343433 
     
    34883487 
    34893488                //-- subdivide leaf node 
    3490                 //-- either a object space or view space split 
     3489                //-- we have either a object space or view space split 
    34913490                if (splitCandidate->Type() == SplitCandidate::VIEW_SPACE) 
    34923491                { 
     
    35153514bool HierarchyManager::FinishedConstruction() 
    35163515{ 
    3517         return mTQueue.empty(); 
    3518 } 
    3519  
    3520  
    3521 void HierarchyManager::RepairQueue() 
     3516        return mTQueue.Empty(); 
     3517} 
     3518 
     3519 
     3520void HierarchyManager::RepairQueue(const vector<SplitCandidate *> &dirtyList) 
    35223521{ 
    35233522        // TODO 
     
    35353534        // (explicit data structure, binary tree) 
    35363535        // *) inserting and removal is efficient 
    3537         // *) search is not efficient => store pointer to queue element with each 
     3536        // *) search is not efficient => store queue position with each 
    35383537        // split candidate 
    35393538 
    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.