[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] | 10 | namespace GtpVisibilityPreprocessor {
|
---|
[860] | 11 |
|
---|
[1189] | 12 | int MailablePvsData::sMailId = 1;
|
---|
| 13 | int MailablePvsData::sReservedMailboxes = 1;
|
---|
[1141] | 14 |
|
---|
[1189] | 15 |
|
---|
[1141] | 16 | int KdPvs::Compress()
|
---|
[177] | 17 | {
|
---|
[311] | 18 | return 0; // TODO
|
---|
[860] | 19 | }
|
---|
| 20 |
|
---|
[1141] | 21 |
|
---|
[1168] | 22 | int 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 | } |
---|