Fix waiting on initial quad tree build

This commit is contained in:
scrawl 2017-03-09 03:31:30 +01:00
parent 4dbd224249
commit 433900fca5
2 changed files with 28 additions and 21 deletions

View file

@ -337,34 +337,39 @@ void QuadTreeWorld::accept(osg::NodeVisitor &nv)
mRootNode->getViewDataMap()->clearUnusedViews(nv.getTraversalNumber()); mRootNode->getViewDataMap()->clearUnusedViews(nv.getTraversalNumber());
} }
void QuadTreeWorld::loadCell(int x, int y) void QuadTreeWorld::ensureQuadTreeBuilt()
{ {
if (mQuadTreeBuilt && !mRootNode)
{ {
mRootNode = mWorkItem->getRootNode(); OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mQuadTreeMutex);
mRootNode->setWorld(this); if (mQuadTreeBuilt)
mTerrainRoot->addChild(mRootNode); return;
mWorkItem = NULL; if (!mQuadTreeBuilt && !mWorkItem)
}
}
osg::ref_ptr<osg::Node> QuadTreeWorld::cacheCell(int x, int y)
{
if (!mQuadTreeBuilt)
{ {
const float minSize = 1/4.f; const float minSize = 1/4.f;
mWorkItem = new BuildQuadTreeItem(mStorage, mViewDataMap.get(), minSize); mWorkItem = new BuildQuadTreeItem(mStorage, mViewDataMap.get(), minSize);
mWorkQueue->addWorkItem(mWorkItem); mWorkQueue->addWorkItem(mWorkItem);
}
}
mWorkItem->waitTillDone(); mWorkItem->waitTillDone();
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mQuadTreeMutex);
mRootNode = mWorkItem->getRootNode();
mRootNode->setWorld(this);
mQuadTreeBuilt = true; mQuadTreeBuilt = true;
} }
return NULL;
} }
void QuadTreeWorld::enable(bool enabled) void QuadTreeWorld::enable(bool enabled)
{ {
if (enabled)
{
ensureQuadTreeBuilt();
if (!mRootNode->getNumParents())
mTerrainRoot->addChild(mRootNode);
}
if (mRootNode) if (mRootNode)
mRootNode->setNodeMask(enabled ? ~0 : 0); mRootNode->setNodeMask(enabled ? ~0 : 0);
} }

View file

@ -5,6 +5,8 @@
#include "world.hpp" #include "world.hpp"
#include <OpenThreads/Mutex>
namespace SceneUtil namespace SceneUtil
{ {
class WorkQueue; class WorkQueue;
@ -30,12 +32,11 @@ namespace Terrain
void accept(osg::NodeVisitor& nv); void accept(osg::NodeVisitor& nv);
virtual void loadCell(int x, int y);
virtual osg::ref_ptr<osg::Node> cacheCell(int x, int y);
virtual void enable(bool enabled); virtual void enable(bool enabled);
private: private:
void ensureQuadTreeBuilt();
osg::ref_ptr<RootNode> mRootNode; osg::ref_ptr<RootNode> mRootNode;
osg::ref_ptr<SceneUtil::WorkQueue> mWorkQueue; osg::ref_ptr<SceneUtil::WorkQueue> mWorkQueue;
@ -44,6 +45,7 @@ namespace Terrain
osg::ref_ptr<ViewDataMap> mViewDataMap; osg::ref_ptr<ViewDataMap> mViewDataMap;
OpenThreads::Mutex mQuadTreeMutex;
bool mQuadTreeBuilt; bool mQuadTreeBuilt;
}; };