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

Revision 341, 2.4 KB checked in by mattausch, 19 years ago (diff)
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);
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)
52{
53        std::map<T, PvsData<T>, LtSample<T> >::iterator it, it_end = mEntries.end();
54
55        for (it = mEntries.begin(); it != mEntries.end(); ++ it)
56        {
57                // TODO
58        }
59}
60
61template <typename T>
62PvsData<T> *Pvs<T>::Find(T sample)
63{
64  std::map<T, PvsData<T>, LtSample<T> >::iterator i = mEntries.find(sample);
65  if (i != mEntries.end()) {
66    return &(*i).second;
67  } else
68    return NULL;
69}
70
71template <typename T>
72void Pvs<T>::GetData(const int index,
73               T &entry,
74               PvsData<T> &data)
75{
76  std::map<T, PvsData<T>, LtSample<T> >::iterator i = mEntries.begin();
77  for (int k = 0; k != index && i != mEntries.end(); i++, k++);
78
79  entry = (*i).first;
80  data = (*i).second;
81}
82
83template <typename T>
84int Pvs<T>::AddSample(T sample)
85{
86        int result;
87        PvsData<T> *data = Find(sample);
88
89        if (data)
90        {
91                data->mVisibleSamples ++;
92                result = 0;
93       
94        }
95        else
96        {
97                mEntries[sample] = PvsData<T>(1);
98                result = 1;
99        }
100
101        return  result;
102}
103
104/** Class instantiating the Pvs template for kd tree nodes.
105*/
106class KdPvs: public Pvs<KdNode *>
107{
108        int Compress();
109};
110
111typedef std::map<KdNode *, PvsData<KdNode *>, LtSample<KdNode *> > KdPvsMap;
112typedef std::map<Intersectable *, PvsData<Intersectable *>, LtSample<Intersectable *> > ViewCellPvsMap;
113typedef PvsData<Intersectable *> ViewCellPvsData;
114typedef PvsData<KdNode *> KdPvsData;
115//typedef Pvs<KdNode *> KdPvs;
116typedef Pvs<Intersectable *> ViewCellPvs;
117
118#endif
119
Note: See TracBrowser for help on using the repository browser.