#ifndef __PVS_H #define __PVS_H #include class KdNode; class BspNode; class Ray; class Intersectable; struct LtKdNode { bool operator()(const KdNode *a, const KdNode *b) const { return a < b; } }; /** Superclass for all types of PVS data. */ class Pvs { public: Pvs(): mSamples(0) {} int mSamples; virtual int Compress() = 0; virtual int GetSize() = 0; }; struct KdPvsData { int mVisibleSamples; KdPvsData() {} KdPvsData(const int samples):mVisibleSamples(samples) {} }; typedef std::map KdPvsMap; class KdPvs: public Pvs { public: KdPvsMap mEntries; KdPvs():mEntries() {} KdPvsData *Find(KdNode *node); int AddNodeSample(KdNode *node); int Compress() {return 0;} int GetSize() { return (int)mEntries.size(); } void GetData(const int index, KdNode *&node, KdPvsData &data ); }; struct LtBspNode { bool operator()(const BspNode *a, const BspNode *b) const { return a < b; } }; struct BspPvsData { int mVisibleSamples; BspPvsData() {} BspPvsData(const int samples): mVisibleSamples(samples) {} }; typedef std::map BspPvsMap; class BspPvs: public Pvs { public: BspPvs(): mEntries() {} BspPvsMap mEntries; BspPvsData *Find(BspNode *node); int AddNodeSample(BspNode *node); int Compress() {return 0;} int GetSize() {return (int)mEntries.size();} void GetData(const int index, BspNode *&node, BspPvsData &data); }; struct LtIntersectable { bool operator()(const Intersectable *a, const Intersectable *b) const { return a < b; } }; struct ViewCellPvsData { int mVisibleSamples; ViewCellPvsData() {} ViewCellPvsData(const int samples): mVisibleSamples(samples) {} }; typedef std::map ViewCellPvsMap; class ViewCellPvs { public: ViewCellPvs(): mEntries() {} ViewCellPvsMap mEntries; int Compress() {return 0;} int GetSize() {return (int)mEntries.size();} ViewCellPvsData *Find(Intersectable *obj); int AddObject(Intersectable *obj); void GetData(const int index, Intersectable *&obj, ViewCellPvsData &data); }; #endif