source: GTP/trunk/Lib/Vis/Preprocessing/src/Pvs.cpp @ 1189

Revision 1189, 2.4 KB checked in by mattausch, 18 years ago (diff)

changed osp partition to something taking mult references into account

RevLine 
[177]1#include <iostream>
[1141]2#include <stack>
[177]3#include "Pvs.h"
[1141]4#include "Intersectable.h"
5#include "KdIntersectable.h"
6#include "KdTree.h"
7#include "common.h"
[177]8
[1141]9
[863]10namespace GtpVisibilityPreprocessor {
[860]11
[1189]12int MailablePvsData::sMailId = 1;
13int MailablePvsData::sReservedMailboxes = 1;
[1141]14
[1189]15
[1141]16int KdPvs::Compress()
[177]17{
[311]18        return 0; // TODO
[860]19}
20
[1141]21
[1168]22int ObjectPvs::CountObjectsInPvs() const
[1141]23{
24        int pvs = 0;
25
26        Intersectable::NewMail();
[1176]27        KdLeaf::NewMail();
[1141]28
29        ObjectPvsMap::const_iterator it, it_end = mEntries.end();
30
31        for (it = mEntries.begin(); it != it_end; ++ it)
32        {
33                Intersectable *obj = (*it).first;
34
[1143]35                // found kd node
[1168]36                // the pvs is the number od different objects in the node leaves
37                // We eliminate already accounted kd nodes and objects using mailboxing.
[1141]38                if (obj->Type() == Intersectable::KD_INTERSECTABLE)
39                {
40                        KdIntersectable *kdObj = dynamic_cast<KdIntersectable *>(obj);
41
42                        stack<KdNode *> tStack;
43
44                        tStack.push(kdObj->GetNode());
45
46                        while (!tStack.empty())
47                        {
48                                KdNode *node = tStack.top();
49                                tStack.pop();
50
[1168]51                                // already processed node (= objects in pvs)?
[1184]52                                if (0 ||!node->Mailed())
[1141]53                                {
[1168]54                                        node->Mail();
[1141]55
[1168]56                                        if (node->IsLeaf())
57                                        {
58                                                KdLeaf *leaf = dynamic_cast<KdLeaf *>(node);
[1184]59#if 1                       
[1168]60                                                // add #objects exclusivly in this node
61                                                pvs += (int)(leaf->mObjects.size() - leaf->mMultipleObjects.size());
[1141]62
[1168]63                                                // Objects already accounted for can only be found among those
64                                                // which are referenced in more than one leaf
65                                                ObjectContainer::const_iterator oit, oit_end = leaf->mMultipleObjects.end();
[1141]66                                               
[1168]67                                                for (oit = leaf->mMultipleObjects.begin(); oit != oit_end; ++ oit)
[1141]68                                                {
[1168]69                                                        Intersectable *object = *oit;                                           
70                           
71                                                        if (!object->Mailed())
72                                                        {
73                                                                object->Mail();
74                                                                ++ pvs;
75                                                        }
[1141]76                                                }
[1184]77#else   
78                                                ObjectContainer::const_iterator oit, oit_end = leaf->mObjects.end();
79                                               
80                                                for (oit = leaf->mObjects.begin(); oit != oit_end; ++ oit)
81                                                {
82                                                        Intersectable *object = *oit;                                           
83                           
84                                                        if (!object->Mailed())
85                                                        {
86                                                                object->Mail();
87                                                                ++ pvs;
88                                                        }
89                                                }
90#endif
[1141]91                                        }
[1168]92                                        else // traverse tree
93                                        {
94                                                KdInterior *interior = dynamic_cast<KdInterior *>(node);
[1141]95
[1168]96                                                tStack.push(interior->mFront);
97                                                tStack.push(interior->mBack);
98                                        }
[1141]99                                }
100                        }
101                }
102                else
103                {
104                        ++ pvs;
105                }
106        }
107
108        return pvs;
109}
110
[311]111}
Note: See TracBrowser for help on using the repository browser.