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

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

ray merge started

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