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

Revision 1284, 3.6 KB checked in by mattausch, 18 years ago (diff)
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#include "BvHierarchy.h"
9
10
11namespace GtpVisibilityPreprocessor {
12
13int MailablePvsData::sMailId = 1;
14int MailablePvsData::sReservedMailboxes = 1;
15
16
17int KdPvs::Compress()
18{
19        return 0; // TODO
20}
21
22/** the pvs is the number of different objects in the node leaves
23        We eliminate already accounted kd nodes and objects using mailboxing.
24*/
25static int CountNewObjectsInKdNode(KdIntersectable *kdobj)
26{
27        int pvs = 0;
28        stack<KdNode *> tStack;
29
30        tStack.push(kdobj->GetItem());
31
32        while (!tStack.empty())
33        {
34                KdNode *node = tStack.top();
35                tStack.pop();
36
37                // already processed node (=> objects already in pvs)?
38                if (!node->Mailed())
39                {
40                        node->Mail();
41
42                        if (node->IsLeaf())
43                        {
44                                KdLeaf *leaf = dynamic_cast<KdLeaf *>(node);
45                       
46                                // add #objects exclusivly in this node
47                                pvs += (int)(leaf->mObjects.size() - leaf->mMultipleObjects.size());
48
49                                // Objects already accounted for can only be found among those
50                                // which are referenced in more than one leaf
51                                ObjectContainer::const_iterator oit, oit_end = leaf->mMultipleObjects.end();
52                                               
53                                for (oit = leaf->mMultipleObjects.begin(); oit != oit_end; ++ oit)
54                                {
55                                        Intersectable *object = *oit;                                           
56                           
57                                        if (!object->Mailed())
58                                        {
59                                                object->Mail();
60                                                ++ pvs;
61                                        }
62                                }
63                        }
64                        else // traverse tree
65                        {
66                                KdInterior *interior = dynamic_cast<KdInterior *>(node);
67
68                                tStack.push(interior->mFront);
69                                tStack.push(interior->mBack);
70                        }
71                }
72        }
73
74        return pvs;
75}
76
77
78/** the pvs is the number of different objects in the node leaves
79        We eliminate already accounted kd nodes and objects using mailboxing.
80*/
81static int CountNewObjectsInBvhNode(BvhIntersectable *bvhobj)
82{
83        BvhNode *node= bvhobj->GetItem();
84
85        // early exit
86        if (node->IsLeaf())     
87        {
88                if (!node->Mailed())
89                {
90                        node->Mail();
91                        return (int)(((BvhLeaf *)node)->mObjects.size());
92                }
93                else
94                {
95                        return 0;
96                }
97        }                       
98
99        // compute leaf pvs
100        int pvs = 0;
101
102        stack<BvhNode *> tStack;
103
104        tStack.push(bvhobj->GetItem());
105
106        while (!tStack.empty())
107        {
108                BvhNode *node = tStack.top();
109                tStack.pop();
110
111                // already processed node (=> objects already in pvs)?
112                if (!node->Mailed())
113                {
114                        node->Mail();
115
116                        if (node->IsLeaf())
117                        {
118                                BvhLeaf *leaf = dynamic_cast<BvhLeaf *>(node);
119                       
120                                // add #objects exclusivly in this node
121                                pvs += (int)leaf->mObjects.size();
122                        }
123                        else // traverse tree
124                        {
125                                BvhInterior *interior = dynamic_cast<BvhInterior *>(node);
126
127                                tStack.push(interior->GetFront());
128                                tStack.push(interior->GetBack());
129                        }
130                }
131        }
132        return pvs;
133}
134
135
136
137int ObjectPvs::CountObjectsInPvs() const
138{
139        int pvs = 0;
140
141        Intersectable::NewMail();
142        KdLeaf::NewMail();
143        BvhLeaf::NewMail();
144
145        ObjectPvsMap::const_iterator it, it_end = mEntries.end();
146
147        for (it = mEntries.begin(); it != it_end; ++ it)
148        {
149                Intersectable *obj = (*it).first;
150
151                switch (obj->Type())
152                {
153                        case Intersectable::KD_INTERSECTABLE:
154                                {
155                                        // found kd node
156                                        KdIntersectable *kdObj = dynamic_cast<KdIntersectable *>(obj);
157                                        pvs += CountNewObjectsInKdNode(kdObj); 
158                                        break;
159                                }
160                        case Intersectable::BVH_INTERSECTABLE:
161                                {
162                                        BvhIntersectable *bvhObj = dynamic_cast<BvhIntersectable *>(obj);
163                                        pvs += CountNewObjectsInBvhNode(bvhObj);
164                                        break;
165                                }
166                        default:
167                                ++ pvs;
168                                break;
169                }
170        }
171
172        return pvs;
173}
174
175}
Note: See TracBrowser for help on using the repository browser.