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

Line 
1#include <iostream>
2#include <stack>
3#include "Pvs.h"
4#include "Intersectable.h"
5#include "KdIntersectable.h"
6#include "KdTree.h"
7#include "common.h"
8
9
10namespace GtpVisibilityPreprocessor {
11
12int MailablePvsData::sMailId = 1;
13int MailablePvsData::sReservedMailboxes = 1;
14
15
16int KdPvs::Compress()
17{
18        return 0; // TODO
19}
20
21
22int ObjectPvs::CountObjectsInPvs() const
23{
24        int pvs = 0;
25
26        Intersectable::NewMail();
27        KdLeaf::NewMail();
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
35                // found kd node
36                // the pvs is the number od different objects in the node leaves
37                // We eliminate already accounted kd nodes and objects using mailboxing.
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
51                                // already processed node (= objects in pvs)?
52                                if (0 ||!node->Mailed())
53                                {
54                                        node->Mail();
55
56                                        if (node->IsLeaf())
57                                        {
58                                                KdLeaf *leaf = dynamic_cast<KdLeaf *>(node);
59#if 1                       
60                                                // add #objects exclusivly in this node
61                                                pvs += (int)(leaf->mObjects.size() - leaf->mMultipleObjects.size());
62
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();
66                                               
67                                                for (oit = leaf->mMultipleObjects.begin(); oit != oit_end; ++ oit)
68                                                {
69                                                        Intersectable *object = *oit;                                           
70                           
71                                                        if (!object->Mailed())
72                                                        {
73                                                                object->Mail();
74                                                                ++ pvs;
75                                                        }
76                                                }
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
91                                        }
92                                        else // traverse tree
93                                        {
94                                                KdInterior *interior = dynamic_cast<KdInterior *>(node);
95
96                                                tStack.push(interior->mFront);
97                                                tStack.push(interior->mBack);
98                                        }
99                                }
100                        }
101                }
102                else
103                {
104                        ++ pvs;
105                }
106        }
107
108        return pvs;
109}
110
111}
Note: See TracBrowser for help on using the repository browser.