From 4ee03cd61fef8d71e0a4614ef512e34ce30fa278 Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 26 Mar 2012 00:31:03 +0200 Subject: [PATCH] handle timeout --- apps/openmw/mwrender/occlusionquery.cpp | 16 +++++++++++++--- apps/openmw/mwrender/occlusionquery.hpp | 6 +++++- apps/openmw/mwrender/renderingmanager.cpp | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwrender/occlusionquery.cpp b/apps/openmw/mwrender/occlusionquery.cpp index 971815f9b..6718a588b 100644 --- a/apps/openmw/mwrender/occlusionquery.cpp +++ b/apps/openmw/mwrender/occlusionquery.cpp @@ -12,7 +12,7 @@ using namespace Ogre; OcclusionQuery::OcclusionQuery(OEngine::Render::OgreRenderer* renderer, SceneNode* sunNode) : mSunTotalAreaQuery(0), mSunVisibleAreaQuery(0), mSingleObjectQuery(0), mActiveQuery(0), mDoQuery(0), mSunVisibility(0), mQuerySingleObjectStarted(false), - mQuerySingleObjectRequested(false) + mQuerySingleObjectRequested(false), mResponding(true), mDelay(0) { mRendering = renderer; mSunNode = sunNode; @@ -93,7 +93,8 @@ OcclusionQuery::~OcclusionQuery() bool OcclusionQuery::supported() { - return mSupported; + if (!mResponding) std::cout << "Occlusion query timed out" << std::endl; + return mSupported && mResponding; } void OcclusionQuery::notifyRenderSingleObject(Renderable* rend, const Pass* pass, const AutoParamDataSource* source, @@ -150,10 +151,13 @@ void OcclusionQuery::renderQueueEnded(uint8 queueGroupId, const String& invocati } } -void OcclusionQuery::update() +void OcclusionQuery::update(float duration) { if (!mSupported) return; + mDelay += duration; + if (mDelay >= 2) mResponding = false; + mWasVisible = false; // Adjust the position of the sun billboards according to camera viewing distance @@ -172,6 +176,9 @@ void OcclusionQuery::update() if (!mSunTotalAreaQuery->isStillOutstanding() && !mSunVisibleAreaQuery->isStillOutstanding()) { + mDelay = 0; + mResponding = true; + unsigned int totalPixels; unsigned int visiblePixels; @@ -193,6 +200,9 @@ void OcclusionQuery::update() } if (!mSingleObjectQuery->isStillOutstanding() && mQuerySingleObjectStarted) { + mDelay = 0; + mResponding = true; + unsigned int result; mSingleObjectQuery->pullOcclusionQuery(&result); diff --git a/apps/openmw/mwrender/occlusionquery.hpp b/apps/openmw/mwrender/occlusionquery.hpp index 987087e27..004190cd9 100644 --- a/apps/openmw/mwrender/occlusionquery.hpp +++ b/apps/openmw/mwrender/occlusionquery.hpp @@ -39,7 +39,7 @@ namespace MWRender /** * per-frame update */ - void update(); + void update(float duration); /** * request occlusion test for a billboard at the given position, omitting an entity @@ -79,6 +79,10 @@ namespace MWRender bool mWasVisible; + bool mResponding; + + float mDelay; + bool mTestResult; bool mSupported; diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index b4711e8df..2aec95e81 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -150,7 +150,7 @@ void RenderingManager::update (float duration){ mActors.update (duration); - mOcclusionQuery->update(); + mOcclusionQuery->update(duration); mSkyManager->update(duration);