#ifndef _OcclusionQueriesQueryManager_H__ #define _OcclusionQueriesQueryManager_H__ #include "OgrePlatformQueryManager.h" namespace Ogre { class OgrePlatformHierarchyInterface; class Viewport; /** Class which implements a query manager for Ogre scene queries using occlusion queries. */ class __declspec(dllexport) OcclusionQueriesQueryManager: public PlatformQueryManager { public: /** Constructor taking a hierarchy interface as an argument. This allows to operate on different hierarchy types, while reusing the implementation of the query methods. */ OcclusionQueriesQueryManager(PlatformHierarchyInterface *hierarchyInterface, Viewport *vp, int queryModes): PlatformQueryManager(hierarchyInterface, vp, queryModes) {} void ComputeCameraVisibility(const Camera &camera, NodeInfoContainer *visibleNodes, MeshInfoContainer *visibleGeometry, PatchInfoContainer *visiblePatches, const bool relativeVisibility, const bool approximateVisibility); /** Uses the specified point to execute the visibility query in all directions. @sa ComputeCameraVisibility() */ void ComputeFromPointVisibility(const Vector3 &point, NodeInfoContainer *visibleNodes, MeshInfoContainer *visibleGeometry, PatchInfoContainer *visiblePatches, const bool relativeVisibility, const bool approximateVisibility); protected: void CollectGeometryVisibility(GtpVisibility::QueryList::iterator &visQueryIt, GtpVisibility::QueryList::iterator &projQueryIt, GeometryVector *geometryList, MeshInfoContainer *visibleGeometry, bool relativeVisibility); void CollectNodeVisibility(GtpVisibility::QueryList::iterator &visQueryIt, GtpVisibility::QueryList::iterator &projQueryIt, GtpVisibility::NodeVector *nodeList, NodeInfoContainer *visibleNodes, bool relativeVisibility); void CollectPatchVisibility(GtpVisibility::QueryList::iterator &visQueryIt, GtpVisibility::QueryList::iterator &projQueryIt, PatchVector *patchList, PatchInfoContainer *visiblePatches, bool relativeVisibility); void RemoveDuplicateNodes(NodeInfoContainer *visibleNodes); void RemoveDuplicateGeometry(MeshInfoContainer *visibleMesh); void RemoveDuplicatePatches(PatchInfoContainer *visiblePatches); /** Returns the patches of the geometry of a given node. @param node the node containing the patches @param patchList the patches are returned in this list */ virtual void GetNodePatchList(GtpVisibility::HierarchyNode *node, PatchVector *patchList); }; } // namespace Ogre #endif // OcclusionQueriesQueryManager