Ignore:
Timestamp:
12/19/05 18:57:00 (19 years ago)
Author:
mattausch
Message:

added priority queue to vspbsptree

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/GtpVisibilityPreprocessor/src/VspBspTree.cpp

    r469 r472  
    3737VspBspTree::VspBspTree():  
    3838mRoot(NULL), 
    39 mPvsUseArea(true) 
     39mPvsUseArea(true), 
     40mNumCriteria(0) 
    4041{ 
    4142        mRootCell = new BspViewCell(); 
     
    5051        environment->GetFloatValue("VspBspTree.Termination.maxRayContribution", mTermMaxRayContribution); 
    5152        environment->GetFloatValue("VspBspTree.Termination.minAccRayLenght", mTermMinAccRayLength); 
     53        environment->GetFloatValue("VspBspTree.Termination.maxCostRatio", mTermMaxCostRatio); 
     54        environment->GetIntValue("VspBspTree.Termination.missTolerance", mTermMissTolerance); 
    5255 
    5356        //-- factors for bsp tree split plane heuristics 
     
    5760 
    5861        //-- termination criteria for axis aligned split 
    59         environment->GetFloatValue("VspBspTree.Termination.AxisAligned.ct_div_ci", mAaCtDivCi); 
    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); 
    6164         
    6265        environment->GetIntValue("VspBspTree.Termination.AxisAligned.minRays",  
     
    6770        environment->GetIntValue("VspBspTree.maxRayCandidates", mMaxRayCandidates); 
    6871        environment->GetIntValue("VspBspTree.splitPlaneStrategy", mSplitPlaneStrategy); 
    69         environment->GetFloatValue("VspBspTree.AxisAligned.splitBorder", mSplitBorder); 
     72        environment->GetFloatValue("VspBspTree.AxisAligned.splitBorder", mAxisAlignedSplitBorder); 
    7073 
    7174        environment->GetFloatValue("VspBspTree.Construction.epsilon", mEpsilon); 
     
    8285        if (mSplitPlaneStrategy & RANDOM_POLYGON) 
    8386                Debug << "random polygon "; 
     87 
    8488        if (mSplitPlaneStrategy & AXIS_ALIGNED) 
     89        { 
     90                ++ mNumCriteria; 
    8591                Debug << "axis aligned "; 
     92        } 
    8693        if (mSplitPlaneStrategy & LEAST_RAY_SPLITS) 
     94        { 
     95                ++ mNumCriteria; 
    8796                Debug << "least ray splits "; 
     97        } 
    8898        if (mSplitPlaneStrategy & BALANCED_RAYS) 
     99        { 
     100                ++ mNumCriteria; 
    89101                Debug << "balanced rays "; 
     102        } 
    90103        if (mSplitPlaneStrategy & PVS) 
     104        { 
     105                ++ mNumCriteria; 
    91106                Debug << "pvs"; 
     107        } 
    92108 
    93109        Debug << endl; 
     
    261277void VspBspTree::Construct(const PolygonContainer &polys, RayInfoContainer *rays) 
    262278{ 
    263         std::stack<VspBspTraversalData> tStack; 
     279        VspBspTraversalStack tStack; 
    264280 
    265281        mRoot = new BspLeaf(); 
     
    338354                EvaluateLeafStats(tData); 
    339355         
    340                 //-- clean up 
    341                  
     356                //-- clean up    
    342357                DEL_PTR(tData.mPolygons); 
    343358                DEL_PTR(tData.mRays); 
     
    361376 
    362377        // 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                 
    366385#ifdef _DEBUG    
    367386//      if (frontPolys->empty() && backPolys->empty() && (coincident.size() > 2)) 
     
    371390#endif 
    372391 
    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        } 
    376399 
    377400        // cleanup 
    378         DEL_PTR(tData.mNode);    
    379  
    380401        DEL_PTR(tData.mPolygons); 
    381402        DEL_PTR(tData.mRays); 
    382403        DEL_PTR(tData.mGeometry); 
    383404 
    384         return interior; 
    385 } 
    386  
    387 BspInterior *VspBspTree::SubdivideNode(VspBspTraversalData &tData, 
    388                                                                            VspBspTraversalData &frontData, 
    389                                                                            VspBspTraversalData &backData, 
    390                                                                            PolygonContainer &coincident) 
     405        return newNode; 
     406} 
     407 
     408BspNode *VspBspTree::SubdivideNode(VspBspTraversalData &tData, 
     409                                                                   VspBspTraversalData &frontData, 
     410                                                                   VspBspTraversalData &backData, 
     411                                                                   PolygonContainer &coincident) 
    391412{ 
    392413        mStat.nodes += 2; 
     
    394415        BspLeaf *leaf = dynamic_cast<BspLeaf *>(tData.mNode); 
    395416         
     417        int maxCostMisses = tData.mMaxCostMisses; 
     418 
    396419        // 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);  
    398431 
    399432#ifdef _DEBUG 
     
    414447                                                                  coincident); 
    415448 
    416     // compute pvs 
     449     
     450        //-- set left and right traversal data 
     451        frontData.mMaxCostMisses = maxCostMisses; 
     452        backData.mMaxCostMisses = maxCostMisses; 
     453 
     454        // compute pvs 
    417455        frontData.mPvs = ComputePvsSize(*frontData.mRays); 
    418456        backData.mPvs = ComputePvsSize(*backData.mRays); 
     
    426464                                                                           mBox, 
    427465                                                                           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(); 
    432470        } 
    433471 
     
    543581        float boxArea = box.SurfaceArea(); 
    544582   
    545         float minBand = minBox + mSplitBorder * (maxBox - minBox); 
    546         float maxBand = minBox + (1.0f - mSplitBorder) * (maxBox - minBox); 
     583        float minBand = minBox + mAxisAlignedSplitBorder * (maxBox - minBox); 
     584        float maxBand = minBox + (1.0f - mAxisAlignedSplitBorder) * (maxBox - minBox); 
    547585         
    548586        float minSum = 1e20f; 
     
    584622        } 
    585623   
    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; 
    589627 
    590628 
     
    615653        { 
    616654                float p = 0; 
    617                 float r = BestCostRatio(polys, box, i, p, objectsBack, objectsFront); 
     655                const float r = BestCostRatio(polys, box, i, p, objectsBack, objectsFront); 
    618656                 
    619657                if (r < costRatio) 
     
    625663        } 
    626664         
    627         if (costRatio >= mMaxCostRatio) 
     665        if (costRatio >= mTermMaxCostRatio) 
    628666                return false; 
    629667 
     
    634672} 
    635673 
    636 Plane3 VspBspTree::SelectPlane(BspLeaf *leaf, VspBspTraversalData &data) 
     674bool VspBspTree::SelectPlane(Plane3 &plane,  
     675                                                         BspLeaf *leaf,  
     676                                                         VspBspTraversalData &data) 
    637677{ 
    638678        if ((mSplitPlaneStrategy & AXIS_ALIGNED) && 
    639679                ((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);  
    644682        } 
    645683 
     
    651689                        const int randIdx = Random((int)data.mPolygons->size()); 
    652690                        Polygon3 *nextPoly = (*data.mPolygons)[randIdx]; 
    653                         return nextPoly->GetSupportingPlane(); 
     691 
     692                        plane = nextPoly->GetSupportingPlane(); 
     693                        return true; 
    654694                } 
    655695                else 
     
    665705                        const Vector3 normal = (*data.mRays)[candidateIdx].mRay->GetDir(); 
    666706                         
    667                         return Plane3(normal, pt); 
    668                 } 
    669  
    670                 return Plane3(); 
     707                        plane = Plane3(normal, pt); 
     708                        return true; 
     709                } 
     710 
     711                return false; 
    671712        } 
    672713 
    673714        // 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 
     718bool VspBspTree::SelectPlaneHeuristics(Plane3 &bestPlane,  
     719                                                                           BspLeaf *leaf,  
     720                                                                           VspBspTraversalData &data) 
    678721{ 
    679722        float lowestCost = MAX_FLOAT; 
    680         Plane3 bestPlane; 
     723        // intermediate plane 
    681724        Plane3 plane; 
    682725 
    683         int limit = Min((int)data.mPolygons->size(), mMaxPolyCandidates); 
    684          
     726        const int limit = Min((int)data.mPolygons->size(), mMaxPolyCandidates); 
    685727        int candidateIdx = limit; 
    686728         
     
    774816        }        
    775817 
     818        // cost ratio miss 
     819        if (lowestCost > mTermMaxCostRatio) 
     820                return false; 
     821 
    776822#ifdef _DEBUG 
    777823        Debug << "plane lowest cost: " << lowestCost << endl; 
    778824#endif 
    779         return bestPlane; 
     825 
     826        return true; 
    780827} 
    781828 
     
    802849                                                                 const VspBspTraversalData &data) 
    803850{ 
    804         float val = 0; 
     851        float cost = 0; 
    805852 
    806853        float sumBalancedRays = 0; 
     
    933980 
    934981        const float raysSize = (float)data.mRays->size() + Limits::Small; 
    935  
     982         
    936983        if (mSplitPlaneStrategy & LEAST_RAY_SPLITS) 
    937                 val += mLeastRaySplitsFactor * sumRaySplits / raysSize; 
     984                cost += mLeastRaySplitsFactor * sumRaySplits / raysSize; 
    938985 
    939986        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 
    944990        if (mSplitPlaneStrategy & PVS) 
    945991        { 
    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; 
    947995 
    948996                // give penalty to unbalanced split 
     
    950998                if (((pFront * 0.2 + Limits::Small) > pBack) ||  
    951999                        (pFront < (pBack * 0.2 + Limits::Small))) 
    952                         val += 0.5; 
     1000                        cost += 0.5; 
    9531001        } 
    9541002 
     
    9581006//                << " backpvs: " << backPvs << " pBack: " << pBack << endl << endl; 
    9591007#endif 
    960         return val; 
     1008 
     1009        // normalize by number of criteria 
     1010        return cost / (float)(mNumCriteria + Limits::Small); 
    9611011} 
    9621012 
Note: See TracChangeset for help on using the changeset viewer.