#include "OgrePlatformQueryManager.h" #include "OcclusionQuery.h" #include #include #include #include namespace Ogre { //----------------------------------------------------------------------- PlatformQueryManager::PlatformQueryManager(PlatformHierarchyInterface *hierarchyInterface, Viewport *vp): QueryManager(hierarchyInterface), mViewport(vp), mWasInitialised(false) { } //----------------------------------------------------------------------- bool PlatformQueryManager::ShootRay(const Ray &ray, std::vector *visibleMeshes, bool isGlobalLine) { // run OGRE ray shooting query return false; } //----------------------------------------------------------------------- void PlatformQueryManager::ComputeFromPointVisibility(const Vector3 &point, InfoContainer *visibleNodes, InfoContainer *visibleGeometry, InfoContainer *visiblePatches, bool relativeVisibility) { SceneManager *sm = dynamic_cast (mHierarchyInterface)->GetSceneManager(); // create a camera for the point query Camera *cam = sm->createCamera("PointQueryCam"); //save old camera Camera *savedCam = mViewport->getCamera(); // --- initialise new camera mViewport->setCamera(cam); cam->setPosition(point); cam->setNearClipDistance(savedCam->getNearClipDistance()); cam->setFarClipDistance(savedCam->getFarClipDistance()); // set frustum to 45 degrees so all the scene can be captured with 6 shots cam->setAspectRatio(1.0); cam->setFOVy(Radian(Math::HALF_PI)); int sign = -1; // ---- capture visibility from all 6 directions for (int i=0; i < 6; i++) { sign *= -1; // Print camera details std::stringstream d; d << "Point query camera: " + StringConverter::toString(cam->getDerivedPosition()) + " " + "O: " + StringConverter::toString(cam->getDerivedOrientation()); LogManager::getSingleton().logMessage(d.str()); // prevent from initialising geometry / node array again if (i > 0) { mWasInitialised = true; } ComputeCameraVisibility(*cam, visibleNodes, visibleGeometry, visiblePatches, relativeVisibility); //mViewport->getTarget()->update(); for(int j=0; j<10000000; j++) printf("wait"); // permute directions Vector3 dir(0,0,0); dir[i/2] = sign; cam->setDirection(dir); } // reset camera mViewport->setCamera(savedCam); } //----------------------------------------------------------------------- void PlatformQueryManager::SetViewport(Viewport *vp) { mViewport = vp; } } // namespace Ogre