mirror of
				https://github.com/TES3MP/openmw-tes3mp.git
				synced 2025-10-31 17:26:42 +00:00 
			
		
		
		
	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; | ||||
| } | ||||
| 
 | ||||
| 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) | ||||
| { | ||||
|     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) | ||||
|     { | ||||
|         ViewData::Entry& entry = vd->getEntry(i); | ||||
|         if (!entry.mRenderingNode) | ||||
|         { | ||||
|             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); | ||||
|         } | ||||
| 
 | ||||
|         loadRenderingNode(entry, vd, mChunkManager.get()); | ||||
| 
 | ||||
|         if (entry.mVisible) | ||||
|         { | ||||
|  |  | |||
|  | @ -34,6 +34,11 @@ ViewData::Entry &ViewData::getEntry(unsigned int i) | |||
|     return mEntries[i]; | ||||
| } | ||||
| 
 | ||||
| bool ViewData::hasChanged() const | ||||
| { | ||||
|     return mChanged; | ||||
| } | ||||
| 
 | ||||
| void ViewData::reset(unsigned int frame) | ||||
| { | ||||
|     // clear any unused entries
 | ||||
|  | @ -67,6 +72,7 @@ bool ViewData::contains(QuadTreeNode *node) | |||
| ViewData::Entry::Entry() | ||||
|     : mNode(NULL) | ||||
|     , mVisible(true) | ||||
|     , mLodFlags(0) | ||||
| { | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -33,6 +33,7 @@ namespace Terrain | |||
|             QuadTreeNode* mNode; | ||||
|             bool mVisible; | ||||
| 
 | ||||
|             unsigned int mLodFlags; | ||||
|             osg::ref_ptr<osg::Node> mRenderingNode; | ||||
|         }; | ||||
| 
 | ||||
|  | @ -47,6 +48,9 @@ namespace Terrain | |||
| 
 | ||||
|         unsigned int getFrameLastUsed() const { return mFrameLastUsed; } | ||||
| 
 | ||||
|         /// @return Have any nodes changed since the last frame
 | ||||
|         bool hasChanged() const; | ||||
| 
 | ||||
|     private: | ||||
|         std::vector<Entry> mEntries; | ||||
|         unsigned int mNumEntries; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue