source: trunk/VUT/GtpVisibilityPreprocessor/src/Pvs.h @ 350

Revision 350, 2.4 KB checked in by mattausch, 19 years ago (diff)

ray merge started

Line 
1#ifndef __PVS_H
2#define __PVS_H
3
4#include <map>
5
6class KdNode;
7class BspNode;
8class Ray;
9class Intersectable;
10
11
12template<typename T>
13struct LtSample {
14    bool operator()(const T a, const T b) const
15    {
16                return a < b;
17        }
18};
19
20//typedef std::map<T *, PvsData<T>, LtSample<T>> PvsMap<T>;
21
22template<typename T>
23struct PvsData {
24  int mVisibleSamples;
25  PvsData<T>() {}
26  PvsData<T>(const int samples): mVisibleSamples(samples) {}
27};
28
29template<typename T>
30class Pvs
31{
32public:
33    Pvs(): mSamples(0), mEntries() {}
34        int mSamples;
35
36        int Compress() {return 0;}
37        int GetSize() {return (int)mEntries.size();}
38        bool Empty() {return mEntries.size() == 0;}
39        void Merge(const Pvs<T> &a, const Pvs<T> &b);
40
41        PvsData<T> *Find(T sample);
42        int AddSample(T sample);
43
44        void GetData(const int index,
45               T &entry,
46               PvsData<T> &data);
47        std::map<T, PvsData<T>, LtSample<T> > mEntries;
48};
49
50template <typename T>
51void Pvs<T>::Merge(const Pvs<T> &a, const Pvs<T> &b)
52{
53        //std::merge(a.mEntries.begin(), a.mEntries.end(),
54        //             b.mEntries.begin(), b.mEntries.end(), mEntries.begin());
55}
56
57template <typename T>
58PvsData<T> *Pvs<T>::Find(T sample)
59{
60  std::map<T, PvsData<T>, LtSample<T> >::iterator i = mEntries.find(sample);
61  if (i != mEntries.end()) {
62    return &(*i).second;
63  } else
64    return NULL;
65}
66
67template <typename T>
68void Pvs<T>::GetData(const int index,
69               T &entry,
70               PvsData<T> &data)
71{
72  std::map<T, PvsData<T>, LtSample<T> >::iterator i = mEntries.begin();
73  for (int k = 0; k != index && i != mEntries.end(); i++, k++);
74
75  entry = (*i).first;
76  data = (*i).second;
77}
78
79template <typename T>
80int Pvs<T>::AddSample(T sample)
81{
82        int result;
83        PvsData<T> *data = Find(sample);
84
85        if (data)
86        {
87                data->mVisibleSamples ++;
88                result = 0;
89       
90        }
91        else
92        {
93                mEntries[sample] = PvsData<T>(1);
94                result = 1;
95        }
96
97        return  result;
98}
99
100/** Class instantiating the Pvs template for kd tree nodes.
101*/
102class KdPvs: public Pvs<KdNode *>
103{
104        int Compress();
105};
106
107typedef std::map<KdNode *, PvsData<KdNode *>, LtSample<KdNode *> > KdPvsMap;
108typedef std::map<Intersectable *, PvsData<Intersectable *>, LtSample<Intersectable *> > ViewCellPvsMap;
109typedef PvsData<Intersectable *> ViewCellPvsData;
110typedef PvsData<KdNode *> KdPvsData;
111//typedef Pvs<KdNode *> KdPvs;
112typedef Pvs<Intersectable *> ViewCellPvs;
113
114#endif
115
Note: See TracBrowser for help on using the repository browser.