Ignore:
Timestamp:
11/18/05 20:30:31 (19 years ago)
Author:
mattausch
Message:

proceeding with the kd view space partition

Location:
trunk/VUT/GtpVisibilityPreprocessor
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/GtpVisibilityPreprocessor/scripts/default.env

    r422 r423  
    6262 
    6363Sampling { 
    64         totalSamples    1000000 
     64        totalSamples    300000 
    6565        samplesPerPass  3 
    6666} 
     
    208208        Termination { 
    209209                maxDepth        40 
    210                 minPvs          1 
    211                 minRays         50 
    212                 minSize         0.00001 
     210                minPvs          5 
     211                minRays         100 
     212                minSize         0.001 
    213213                maxCostRatio    0.95 
    214                 maxRayContribution 0.05 
     214                maxRayContribution 0.1 
    215215        } 
    216216         
    217217        maxTotalMemory  400 
    218         maxStaticMemory 20 
     218        maxStaticMemory 200 
    219219 
    220220        splitType regular 
  • trunk/VUT/GtpVisibilityPreprocessor/src/SamplingPreprocessor.cpp

    r422 r423  
    764764                        cout << "building VSP tree from " << (int)mVspSampleRays.size() << " samples " << endl; 
    765765                        mVspKdTree = new VspKdTree(); 
    766                         mVspKdTree->Construct(mVspSampleRays); 
     766                        mVspKdTree->Construct(mVspSampleRays, &mKdTree->GetBox()); 
    767767                 
    768768                        // add contributions of saved samples to PVS 
  • trunk/VUT/GtpVisibilityPreprocessor/src/ViewCellBsp.cpp

    r422 r423  
    739739                 (data.mArea <= mTermMinArea) || 
    740740                 (data.mDepth >= mTermMaxDepth) || 
    741                  (((float)data.mPvs / ((float)data.mRays->size() + Limits::Small)) <  
    742                         mTermMaxRayContribution)); 
     741                 (data.GetAvgRayContribution() < mTermMaxRayContribution)); 
    743742} 
    744743 
  • trunk/VUT/GtpVisibilityPreprocessor/src/ViewCellBsp.h

    r422 r423  
    351351                int mPvs; 
    352352                 
     353                /** Returns average ray contribution. 
     354                */ 
     355                float GetAvgRayContribution() const 
     356                { 
     357                        return (float)mPvs / ((float)mRays->size() + Limits::Small); 
     358                } 
     359 
     360 
    353361                BspTraversalData(): 
    354362                mNode(NULL), 
  • trunk/VUT/GtpVisibilityPreprocessor/src/VspKdTree.cpp

    r422 r423  
    118118} 
    119119 
    120 void VspKdTreeInterior::ReplaceChildLink(VspKdTreeNode *oldChild, VspKdTreeNode *newChild) 
     120void VspKdTreeInterior::ReplaceChildLink(VspKdTreeNode *oldChild,  
     121                                                                                 VspKdTreeNode *newChild) 
    121122{ 
    122123        if (mBack == oldChild) 
     
    139140void VspKdTreeInterior::Print(ostream &s) const  
    140141{ 
    141         if (mAxis == 0) 
    142                 s << "x "; 
    143         else 
    144                 if (mAxis == 1) 
    145                         s << "y "; 
    146                 else 
    147                         s << "z "; 
     142        switch (mAxis) 
     143        { 
     144        case 0: 
     145                s << "x "; break; 
     146        case 1: 
     147                s << "y "; break; 
     148        case 2: 
     149                s << "z "; break; 
     150        } 
     151 
    148152        s << mPosition << " "; 
    149153 
     
    268272        environment->GetStringValue("VspKdTree.splitType", sname); 
    269273        string name(sname); 
    270          
    271         if (name.compare("regular") == 0) 
    272                 splitType = ESplitRegular; 
    273         else 
    274         { 
    275                 if (name.compare("heuristic") == 0) 
    276                         splitType = ESplitHeuristic; 
    277                 else  
    278                 { 
    279                         cerr << "Invalid VspKdTree split type " << name << endl; 
    280                         exit(1); 
    281                 } 
    282         } 
    283  
     274                 
    284275        Debug << "======= vsp kd tree options ========" << endl; 
    285276        Debug << "max depth: "<< mTermMaxDepth << endl; 
     
    289280        Debug << "max cost ratio: "<< mTermMaxCostRatio << endl; 
    290281        Debug << "min size: "<<mTermMinSize << endl; 
     282 
     283        if (name.compare("regular") == 0) 
     284        { 
     285                Debug << "using regular split" << endl; 
     286                splitType = ESplitRegular; 
     287        } 
     288        else 
     289        { 
     290                if (name.compare("heuristic") == 0) 
     291                { 
     292                        Debug << "using heuristic split" << endl; 
     293                        splitType = ESplitHeuristic; 
     294                } 
     295                else  
     296                { 
     297                        cerr << "Invalid VspKdTree split type " << name << endl; 
     298                        exit(1); 
     299                } 
     300        } 
    291301 
    292302        mRoot = NULL; 
     
    415425        mRoot = new VspKdTreeLeaf(NULL, (int)rays.size()); 
    416426 
    417         // first construct a leaf that will get subdivide 
     427        // first construct a leaf that will get subdivided 
    418428        VspKdTreeLeaf *leaf = dynamic_cast<VspKdTreeLeaf *>(mRoot); 
    419429         
     
    453463 
    454464        mStat.Print(cout); 
    455         cout<<"#Total memory=" << GetMemUsage() << endl; 
     465        Debug << "#Total memory=" << GetMemUsage() << endl; 
    456466} 
    457467 
     
    463473 
    464474        priority_queue<TraversalData> tStack; 
    465         //  stack<TraversalData> tStack; 
     475        //stack<TraversalData> tStack; 
    466476   
    467477        tStack.push(tdata); 
     
    471481   
    472482        int lastMem = 0; 
     483 
    473484        while (!tStack.empty())  
    474485        { 
    475486                float mem = GetMemUsage(); 
    476487                 
    477                 if ( lastMem/10 != ((int)mem)/10)  
     488                if (lastMem / 10 != ((int)mem) / 10)  
    478489                { 
    479490                        cout << mem << " MB" << endl; 
     
    481492                lastMem = (int)mem; 
    482493                 
    483                 if (mem > mMaxMemory)  
    484                 { 
     494                if (1 && mem > mMaxMemory)  
     495                { 
     496                        Debug << "memory limit reached: " << mem << endl; 
    485497                        // count statistics on unprocessed leafs 
    486498                        while (!tStack.empty())  
     
    493505     
    494506                TraversalData data = tStack.top(); 
    495                 tStack.pop(); 
    496      
     507                tStack.pop();     
    497508                 
    498509                VspKdTreeNode *node = SubdivideNode((VspKdTreeLeaf *) data.mNode, 
     
    503514                if (!node->IsLeaf())  
    504515                { 
    505                         VspKdTreeInterior *interior = (VspKdTreeInterior *) node; 
     516                        VspKdTreeInterior *interior = dynamic_cast<VspKdTreeInterior *>(node); 
    506517 
    507518                        // push the children on the stack 
     
    542553                                                                                 pvsBack, 
    543554                                                                                 pvsFront); 
    544  
    545555        }  
    546         else  
    547         { 
    548                 if (splitType == ESplitHeuristic) 
     556        else if (splitType == ESplitHeuristic) 
     557        { 
    549558                        costRatio = BestCostRatioHeuristic(leaf, 
    550559                                                                                           axis,         
     
    554563                                                                                           pvsBack, 
    555564                                                                                           pvsFront); 
    556                 else { 
    557                         cerr << "VspKdTree: Unknown split heuristics\n"; 
    558                         exit(1); 
    559                 } 
    560   } 
     565        } 
     566        else  
     567        { 
     568                cerr << "VspKdTree: Unknown split heuristics\n"; 
     569                exit(1); 
     570        } 
    561571 
    562572        if (costRatio > mTermMaxCostRatio)  
    563573        { 
    564                 cout<<"Too big cost ratio " << costRatio << endl; 
     574                cout << "Too big cost ratio " << costRatio << endl; 
    565575                return -1; 
    566576        } 
    567577 
    568578#if 1    
    569         cout << 
     579        Debug << 
    570580                "pvs=" << leaf->mPvsSize << 
    571581                " rays=" << (int)leaf->mRays.size() << 
     
    880890                                                                                          const AxisAlignedBox3 &box) const 
    881891{ 
    882         return ((leaf->GetPvsSize() < mTermMinPvs) || (leaf->mRays.size() < mTermMinRays) || 
     892        return ((leaf->GetPvsSize() < mTermMinPvs) ||  
     893                    //(leaf->mRays.size() < mTermMinRays) || 
    883894                        // (leaf->GetAvgRayContribution() > termMaxRayContribution ) || 
    884                          (leaf->mDepth >= mTermMaxDepth) || SqrMagnitude(box.Size()) <= mTermMinSize); 
     895                        (leaf->mDepth >= mTermMaxDepth) ||  
     896                        (SqrMagnitude(box.Size()) <= mTermMinSize)); 
    885897} 
    886898 
     
    893905        if (TerminationCriteriaMet(leaf, box)) 
    894906        { 
    895  
    896 #if 1 
    897                 if (leaf->mDepth >= mTermMaxDepth)  
    898                 { 
    899                         Debug << "Warning: max depth reached depth="<<(int)leaf->mDepth<<" rays=" << (int)leaf->mRays.size() << endl; 
    900                         Debug << "Bbox: " << GetBBox(leaf) << endl; 
    901                 } 
    902 #endif 
     907                if (1) 
     908                { 
     909                        if (leaf->mDepth >= mTermMaxDepth)  
     910                        { 
     911                                Debug << "Warning: max depth reached depth=" << (int)leaf->mDepth<<" rays=" << (int)leaf->mRays.size() << endl; 
     912                                Debug << "Bbox: " << GetBBox(leaf) << endl; 
     913                        } 
    903914                 
     915                        Debug << "depth: " << (int)leaf->mDepth << " pvs: " << leaf->GetPvsSize() << " rays: " << leaf->mRays.size() << endl; 
     916                } 
    904917                return leaf; 
    905918        } 
     
    913926         
    914927        // select subdivision axis 
    915         int axis = SelectPlane( leaf, box, position, raysBack, raysFront, pvsBack, pvsFront); 
    916  
    917         //      cout<<"rays back="<<raysBack<<" rays front="<<raysFront<<" pvs back="<<pvsBack<<" pvs front="<< 
    918         //              pvsFront<<endl; 
     928        int axis = SelectPlane(leaf, box, position, raysBack, raysFront, pvsBack, pvsFront); 
     929 
     930        Debug << "rays back=" << raysBack << " rays front=" << raysFront << " pvs back=" << pvsBack << " pvs front=" << pvsFront << endl; 
    919931 
    920932        if (axis == -1)  
     
    10401052        tstack.push(mRoot); 
    10411053 
    1042         while (!tstack.empty())  
     1054        while (!tstack.empty()) 
    10431055        { 
    10441056                VspKdTreeNode *node = tstack.top(); 
     
    10781090 
    10791091 
    1080  
    1081  
    10821092VspKdTreeNode *VspKdTree::SubdivideLeaf(VspKdTreeLeaf *leaf, 
    10831093                                                                                const float sizeThreshold) 
     
    10951105                (SqrMagnitude(leafBBox.Size()) > sizeThreshold) ) 
    10961106        { 
    1097         // memory check and realese... 
     1107        // memory check and release 
    10981108                if (GetMemUsage() > mMaxTotalMemory)  
    10991109                        ReleaseMemory(pass); 
     
    11091119 
    11101120 
    1111 void 
    1112 VspKdTree::UpdateRays(VssRayContainer &remove, 
    1113                                           VssRayContainer &add) 
     1121void VspKdTree::UpdateRays(VssRayContainer &remove, 
     1122                                                   VssRayContainer &add) 
    11141123{ 
    11151124        VspKdTreeLeaf::NewMail(); 
     
    11351144 
    11361145        //  cout<<"all/inactive"<<remove.size()<<"/"<<inactive<<endl; 
    1137    
    1138         for(VssRayContainer::const_iterator ri = add.begin(); ri != add.end(); ++ ri)  
     1146        for (VssRayContainer::const_iterator ri = add.begin(); ri != add.end(); ++ ri)  
    11391147        { 
    11401148                AddRay(*ri); 
     
    12561264                        // find the ray in the leaf and swap it with the last ray 
    12571265                        VspKdTreeLeaf *leaf = dynamic_cast<VspKdTreeLeaf *>(data.mNode); 
     1266 
    12581267                        leaf->AddRay(data.mRayData); 
    12591268                        ++ mStat.addedRayRefs; 
     
    14161425 
    14171426#if DEBUG_COLLAPSE 
    1418         cout<<"Total memory before="<<GetMemUsage()<<endl; 
     1427        cout << "Total memory before=" << GetMemUsage() << endl; 
    14191428#endif 
    14201429 
     
    15371546        } 
    15381547         
    1539         cout << "sum=" << sumRayContribution << endl; 
    1540         cout << "leaves=" << leaves << endl; 
    1541         avgRayContribution = sumRayContribution/(float)leaves; 
     1548        Debug << "sum=" << sumRayContribution << endl; 
     1549        Debug << "leaves=" << leaves << endl; 
     1550        avgRayContribution = sumRayContribution / (float)leaves; 
    15421551} 
    15431552 
     
    15561565                if (node->IsLeaf())  
    15571566                { 
    1558                         VspKdTreeLeaf *leaf = (VspKdTreeLeaf *)node; 
     1567                        VspKdTreeLeaf *leaf = dynamic_cast<VspKdTreeLeaf *>(node); 
     1568 
    15591569                        float c = leaf->GetAvgRayContribution(); 
    15601570                        int num = (int)(c*ratioPerLeaf + 0.5); 
  • trunk/VUT/GtpVisibilityPreprocessor/src/VspKdTree.h

    r422 r423  
    327327                AxisAlignedBox3 mBox; 
    328328                int mDepth; 
    329                 float mPriority; 
     329                //float mPriority; 
    330330         
    331331                TraversalData() {} 
    332332 
    333333                TraversalData(VspKdTreeNode *n, const float p): 
    334                 mNode(n), mPriority(p) 
     334                mNode(n)//, mPriority(p) 
    335335                {} 
    336336 
     
    338338                mNode(n), mBox(b), mDepth(d) {} 
    339339     
    340                 // comparator for the  
    341                 struct less_priority : public binary_function<const TraversalData, const TraversalData, bool>  
     340                // comparator for the priority queue 
     341                /*struct less_priority : public binary_function<const TraversalData, const TraversalData, bool>  
    342342                { 
    343                         bool operator()(const TraversalData a, const TraversalData b)  
    344                         { 
    345                                 return a.mPriority < b.mPriority; 
    346                         } 
    347                 }; 
     343                        bool operator()(const TraversalData a, const TraversalData b) {                  
     344                        return a.mPriority < b.mPriority;               }       };*/ 
    348345 
    349346                //    ~TraversalData() {} 
     
    375372#if 0 
    376373                        return 
    377                                 leafa->GetPvsSize() / (float)(leafa->rays.size() + 1) 
     374                                leafa->GetPvsSize() / (float)(leafa->rays.size() + Limits::Small()) 
    378375                                > 
    379                                 leafb->GetPvsSize() / (float)(leafb->rays.size() + 1); 
     376                                leafb->GetPvsSize() / (float)(leafb->rays.size() + Limits::Small()); 
    380377#endif 
    381378#if 0 
Note: See TracChangeset for help on using the changeset viewer.