#ifndef __CHCPLUSPLUSTRAVERSER_H #define __CHCPLUSPLUSTRAVERSER_H #include "RenderTraverser.h" namespace CHCDemoEngine { class OcclusionQuery; /** Class predicting the visiblity of nodes. */ class VisibilityPredictor { public: /** Predicts the probability of a node to stay visible / invisible. The probability could be taken from a measured or analytic function. */ float GetProbability(BvhNode *node) const { return 0.98f - 0.68f * exp(-(float)node->GetTimesTestedInvisible()); } }; /** Class implementing traversal using the CHC++ algorithm. */ class CHCPlusPlusTraverser: public RenderTraverser { public: CHCPlusPlusTraverser(); virtual int GetType() const { return CHCPLUSPLUS;} protected: /** Traverses and renders the scene with the specified method */ virtual void Traverse(); /** Queries nodes nodes tested invisible in previous frames. */ void QueryPreviouslyInvisibleNodes(BvhNode *node); /** Computes the next multiquery. */ OcclusionQuery *GetNextMultiQuery(BvhNodeContainer &iqueue); /** Issues batched multiqueries. */ void IssueMultiQueries(); /** Handles the result of an occlusion query. */ void HandleQueryResult(OcclusionQuery *query); ////////////// /// the query queue QueryQueue mQueryQueue; BvhNodeQueue mVQueue; BvhNodeContainer mIQueue; VisibilityPredictor mVisibilityPredictor; }; } #endif // __CHCPLUSPLUSTRAVERSER_H