Ignore:
Timestamp:
07/18/06 19:03:14 (18 years ago)
Author:
mattausch
Message:

added kd pvs support, changed way of counting pvs

File:
1 edited

Legend:

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

    r863 r1141  
    11#include <iostream> 
     2#include <stack> 
    23#include "Pvs.h" 
     4#include "Intersectable.h" 
     5#include "KdIntersectable.h" 
     6#include "KdTree.h" 
     7#include "common.h" 
     8 
    39 
    410namespace GtpVisibilityPreprocessor { 
    511 
    6 int 
    7 KdPvs::Compress() 
     12 
     13int KdPvs::Compress() 
    814{ 
    915        return 0; // TODO 
    1016} 
    1117 
     18 
     19int ObjectPvs::CountPvs() const 
     20{ 
     21        int pvs = 0; 
     22 
     23        Intersectable::NewMail(); 
     24        KdNode::NewMail(); 
     25 
     26        ObjectPvsMap::const_iterator it, it_end = mEntries.end(); 
     27 
     28        for (it = mEntries.begin(); it != it_end; ++ it) 
     29        { 
     30                Intersectable *obj = (*it).first; 
     31 
     32                if (obj->Type() == Intersectable::KD_INTERSECTABLE) 
     33                { 
     34                        KdIntersectable *kdObj = dynamic_cast<KdIntersectable *>(obj); 
     35 
     36                        stack<KdNode *> tStack; 
     37 
     38                        tStack.push(kdObj->GetNode()); 
     39 
     40                        while (!tStack.empty()) 
     41                        { 
     42                                KdNode *node = tStack.top(); 
     43                                tStack.pop(); 
     44 
     45                                // already processed node (objects in pvs) 
     46                                if (node->Mailed()) 
     47                                        continue; 
     48 
     49                                node->Mail(); 
     50 
     51                                if (node->IsLeaf()) 
     52                                { 
     53                                         
     54                                        KdLeaf *leaf = dynamic_cast<KdLeaf *>(node); 
     55 
     56                                        pvs += (int)(leaf->mObjects.size() - leaf->mMultipleObjects.size()); 
     57 
     58                                        ObjectContainer::const_iterator it, it_end = leaf->mMultipleObjects.end(); 
     59                                        { 
     60                                                Intersectable *object = *it;                                             
     61                                                 
     62                                                if (!object->Mailed()) 
     63                                                { 
     64                                                        object->Mail(); 
     65                                                        ++ pvs; 
     66                                                } 
     67                                        } 
     68                                } 
     69                                else 
     70                                { 
     71                                        KdInterior *interior = dynamic_cast<KdInterior *>(node); 
     72 
     73                                        tStack.push(interior->mFront); 
     74                                        tStack.push(interior->mBack); 
     75                                } 
     76                        } 
     77                } 
     78                else 
     79                { 
     80                        ++ pvs; 
     81                } 
     82        } 
     83 
     84        return pvs; 
    1285} 
     86 
     87} 
Note: See TracChangeset for help on using the changeset viewer.