forked from mirror/openmw-tes3mp
Recompute the LOD stitching when the view changes
This commit is contained in:
parent
ef704db877
commit
9db71e3f62
3 changed files with 32 additions and 6 deletions
|
@ -283,6 +283,26 @@ unsigned int getLodFlags(QuadTreeNode* node, int ourLod, ViewData* vd)
|
||||||
return lodFlags;
|
return lodFlags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void loadRenderingNode(ViewData::Entry& entry, ViewData* vd, ChunkManager* chunkManager)
|
||||||
|
{
|
||||||
|
if (vd->hasChanged())
|
||||||
|
{
|
||||||
|
// have to recompute the lodFlags in case a neighbour has changed LOD.
|
||||||
|
int ourLod = Log2(int(entry.mNode->getSize()));
|
||||||
|
unsigned int lodFlags = getLodFlags(entry.mNode, ourLod, vd);
|
||||||
|
if (lodFlags != entry.mLodFlags)
|
||||||
|
entry.mRenderingNode = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!entry.mRenderingNode)
|
||||||
|
{
|
||||||
|
int ourLod = Log2(int(entry.mNode->getSize()));
|
||||||
|
unsigned int lodFlags = getLodFlags(entry.mNode, ourLod, vd);
|
||||||
|
entry.mRenderingNode = chunkManager->getChunk(entry.mNode->getSize(), entry.mNode->getCenter(), ourLod, lodFlags);
|
||||||
|
entry.mLodFlags = lodFlags;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void QuadTreeWorld::accept(osg::NodeVisitor &nv)
|
void QuadTreeWorld::accept(osg::NodeVisitor &nv)
|
||||||
{
|
{
|
||||||
if (nv.getVisitorType() != osg::NodeVisitor::CULL_VISITOR)// && nv.getVisitorType() != osg::NodeVisitor::INTERSECTION_VISITOR)
|
if (nv.getVisitorType() != osg::NodeVisitor::CULL_VISITOR)// && nv.getVisitorType() != osg::NodeVisitor::INTERSECTION_VISITOR)
|
||||||
|
@ -301,12 +321,8 @@ void QuadTreeWorld::accept(osg::NodeVisitor &nv)
|
||||||
for (unsigned int i=0; i<vd->getNumEntries(); ++i)
|
for (unsigned int i=0; i<vd->getNumEntries(); ++i)
|
||||||
{
|
{
|
||||||
ViewData::Entry& entry = vd->getEntry(i);
|
ViewData::Entry& entry = vd->getEntry(i);
|
||||||
if (!entry.mRenderingNode)
|
|
||||||
{
|
loadRenderingNode(entry, vd, mChunkManager.get());
|
||||||
int ourLod = Log2(int(entry.mNode->getSize()));
|
|
||||||
unsigned int lodFlags = getLodFlags(entry.mNode, ourLod, vd);
|
|
||||||
entry.mRenderingNode = mChunkManager->getChunk(entry.mNode->getSize(), entry.mNode->getCenter(), ourLod, lodFlags);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (entry.mVisible)
|
if (entry.mVisible)
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,6 +34,11 @@ ViewData::Entry &ViewData::getEntry(unsigned int i)
|
||||||
return mEntries[i];
|
return mEntries[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ViewData::hasChanged() const
|
||||||
|
{
|
||||||
|
return mChanged;
|
||||||
|
}
|
||||||
|
|
||||||
void ViewData::reset(unsigned int frame)
|
void ViewData::reset(unsigned int frame)
|
||||||
{
|
{
|
||||||
// clear any unused entries
|
// clear any unused entries
|
||||||
|
@ -67,6 +72,7 @@ bool ViewData::contains(QuadTreeNode *node)
|
||||||
ViewData::Entry::Entry()
|
ViewData::Entry::Entry()
|
||||||
: mNode(NULL)
|
: mNode(NULL)
|
||||||
, mVisible(true)
|
, mVisible(true)
|
||||||
|
, mLodFlags(0)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ namespace Terrain
|
||||||
QuadTreeNode* mNode;
|
QuadTreeNode* mNode;
|
||||||
bool mVisible;
|
bool mVisible;
|
||||||
|
|
||||||
|
unsigned int mLodFlags;
|
||||||
osg::ref_ptr<osg::Node> mRenderingNode;
|
osg::ref_ptr<osg::Node> mRenderingNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -47,6 +48,9 @@ namespace Terrain
|
||||||
|
|
||||||
unsigned int getFrameLastUsed() const { return mFrameLastUsed; }
|
unsigned int getFrameLastUsed() const { return mFrameLastUsed; }
|
||||||
|
|
||||||
|
/// @return Have any nodes changed since the last frame
|
||||||
|
bool hasChanged() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<Entry> mEntries;
|
std::vector<Entry> mEntries;
|
||||||
unsigned int mNumEntries;
|
unsigned int mNumEntries;
|
||||||
|
|
Loading…
Reference in a new issue