#ifndef __PVS_H #define __PVS_H #include "common.h" #include "Bvh.h" namespace CHCDemoEngine { class BvhNode; class Bvh; //#define USE_TIMESTAMPS struct PvsEntry { PvsEntry(SceneEntity *ent, float t): mEntity(ent) #ifdef USE_TIMESTAMPS , mTimeStamp(t) #endif {} friend bool operator<(const PvsEntry &a, const PvsEntry &b); /////////////// SceneEntity *mEntity; #ifdef USE_TIMESTAMPS float mTimeStamp; #endif }; typedef std::vector PvsEntryContainer; /** Class representing the Potentially Visible Set (PVS) from a view cell. */ class Pvs { public: void Clear(); bool Empty() const; /** Convencience method adding all scene entities associated with a bvh node. */ void AddEntry(Bvh *bvh, BvhNode *node, float timeStamp = -1); int GetSize() const; inline SceneEntity *GetEntity(int i) const; inline PvsEntry GetEntry(int i) const; inline void AddEntry(const PvsEntry &entry); /* Sort entries by timestamp */ void Sort(); protected: /// vector of PVS entries PvsEntryContainer mEntries; }; inline SceneEntity *Pvs::GetEntity(int i) const { return mEntries[i].mEntity; } inline PvsEntry Pvs::GetEntry(int i) const { return mEntries[i]; } inline void Pvs::AddEntry(const PvsEntry &entry) { mEntries.push_back(entry); } inline int Pvs::GetSize() const { return (int)mEntries.size(); } inline void Pvs::AddEntry(Bvh *bvh, BvhNode *node, float timeStamp) { int geometrySize; SceneEntity **entities; entities = bvh->GetGeometry(node, geometrySize); for (int i = 0; i < geometrySize; ++ i) { AddEntry(PvsEntry(entities[i], timeStamp)); } } } #endif