From a730365ea16dbc890721d14b6788fcfd0e0c8513 Mon Sep 17 00:00:00 2001 From: bzzt Date: Wed, 20 Feb 2019 13:37:00 +0000 Subject: [PATCH] Creanup Distant Terrain code - Cull terrain in the stock osg::CullVisitor - Do not compile composite maps for shadow camera - Do not abuse userdata for composite maps --- components/terrain/chunkmanager.cpp | 13 ++------- components/terrain/quadtreenode.cpp | 6 ++-- components/terrain/quadtreeworld.cpp | 38 ++++++-------------------- components/terrain/terraindrawable.cpp | 12 +++++--- components/terrain/terraindrawable.hpp | 11 +++++++- components/terrain/terraingrid.cpp | 5 ---- components/terrain/viewdata.cpp | 12 ++++---- components/terrain/viewdata.hpp | 5 ++-- 8 files changed, 39 insertions(+), 63 deletions(-) diff --git a/components/terrain/chunkmanager.cpp b/components/terrain/chunkmanager.cpp index 41b1fdbe1..881397936 100644 --- a/components/terrain/chunkmanager.cpp +++ b/components/terrain/chunkmanager.cpp @@ -30,7 +30,6 @@ ChunkManager::ChunkManager(Storage *storage, Resource::SceneManager *sceneMgr, T , mCompositeMapSize(512) , mCompositeMapLevel(1.f) , mMaxCompGeometrySize(1.f) - , mCullingActive(true) { } @@ -208,7 +207,8 @@ osg::ref_ptr ChunkManager::createChunk(float chunkSize, const osg::Ve mCompositeMapRenderer->addCompositeMap(compositeMap.get(), false); - transform->getOrCreateUserDataContainer()->setUserData(compositeMap); + geometry->setCompositeMap(compositeMap); + geometry->setCompositeMapRenderer(mCompositeMapRenderer); TextureLayer layer; layer.mDiffuseMap = compositeMap->mTexture; @@ -222,14 +222,7 @@ osg::ref_ptr ChunkManager::createChunk(float chunkSize, const osg::Ve } transform->addChild(geometry); - - if (!mCullingActive) - { - transform->setCullingActive(false); - geometry->setCullingActive(false); - } - else - transform->getBound(); + transform->getBound(); if (mSceneManager->getIncrementalCompileOperation()) { diff --git a/components/terrain/quadtreenode.cpp b/components/terrain/quadtreenode.cpp index cb921631b..69f9b3fa4 100644 --- a/components/terrain/quadtreenode.cpp +++ b/components/terrain/quadtreenode.cpp @@ -120,7 +120,7 @@ void QuadTreeNode::traverse(ViewData* vd, const osg::Vec3f& viewPoint, LodCallba bool stopTraversal = (lodCallback->isSufficientDetail(this, dist)) || !getNumChildren(); if (stopTraversal) - vd->add(this, true); + vd->add(this); else { for (unsigned int i=0; iadd(this, true); + vd->add(this); else { for (unsigned int i=0; iadd(this, true); + vd->add(this); else { for (unsigned int i=0; igetSize() <= mMinSize) { // We arrived at a leaf. - // Since the tree is used for LOD level selection instead of culling, we do not need to load an actual height data here. + // Since the tree is used for LOD level selection instead of culling, we do not need to load the actual height data here. float minZ = -std::numeric_limits::max(); float maxZ = std::numeric_limits::max(); float cellWorldSize = mStorage->getCellWorldSize(); @@ -226,9 +226,6 @@ QuadTreeWorld::QuadTreeWorld(osg::Group *parent, osg::Group *compileRoot, Resour , mVertexLodMod(vertexLodMod) , mViewDistance(std::numeric_limits::max()) { - // No need for culling on the Drawable / Transform level as the quad tree performs the culling already. - mChunkManager->setCullingActive(false); - mChunkManager->setCompositeMapSize(compMapResolution); mChunkManager->setCompositeMapLevel(compMapLevel); mChunkManager->setMaxCompositeGeometrySize(maxCompGeometrySize); @@ -362,44 +359,25 @@ void QuadTreeWorld::accept(osg::NodeVisitor &nv) else { osgUtil::IntersectionVisitor* iv = static_cast(&nv); - osgUtil::LineSegmentIntersector* lineIntsersector = dynamic_cast(iv->getIntersector()); - if (!lineIntsersector) - throw std::runtime_error("Can not update QuadTreeWorld - the LineSegmentIntersector expected"); + osgUtil::LineSegmentIntersector* lineIntersector = dynamic_cast(iv->getIntersector()); + if (!lineIntersector) + throw std::runtime_error("Cannot update QuadTreeWorld: node visitor is not LineSegmentIntersector"); osg::Matrix matrix = osg::Matrix::identity(); - if (lineIntsersector->getCoordinateFrame() == osgUtil::Intersector::CoordinateFrame::MODEL && iv->getModelMatrix() == 0) - matrix = lineIntsersector->getTransformation(*iv, osgUtil::Intersector::CoordinateFrame::MODEL); - osg::ref_ptr terrainIntersector (new TerrainLineIntersector(lineIntsersector, matrix)); + if (lineIntersector->getCoordinateFrame() == osgUtil::Intersector::CoordinateFrame::MODEL && iv->getModelMatrix() == 0) + matrix = lineIntersector->getTransformation(*iv, osgUtil::Intersector::CoordinateFrame::MODEL); + osg::ref_ptr terrainIntersector (new TerrainLineIntersector(lineIntersector, matrix)); mRootNode->intersect(vd, terrainIntersector); } } - if (isCullVisitor) - { - for (unsigned int i=0; igetNumEntries(); ++i) - { - ViewData::Entry& entry = vd->getEntry(i); - entry.set(entry.mNode, !static_cast(&nv)->isCulled(entry.mNode->getBoundingBox())); - } - } - for (unsigned int i=0; igetNumEntries(); ++i) { ViewData::Entry& entry = vd->getEntry(i); loadRenderingNode(entry, vd, mVertexLodMod, mChunkManager.get()); - if (entry.mVisible) - { - osg::UserDataContainer* udc = entry.mRenderingNode->getUserDataContainer(); - if (udc && udc->getUserData()) - { - mCompositeMapRenderer->setImmediate(static_cast(udc->getUserData())); - udc->setUserData(nullptr); - - } - entry.mRenderingNode->accept(nv); - } + entry.mRenderingNode->accept(nv); } if (!isCullVisitor) diff --git a/components/terrain/terraindrawable.cpp b/components/terrain/terraindrawable.cpp index f216bb33b..151977cd4 100644 --- a/components/terrain/terraindrawable.cpp +++ b/components/terrain/terraindrawable.cpp @@ -4,13 +4,11 @@ #include +#include "compositemaprenderer.hpp" + namespace Terrain { -TerrainDrawable::TerrainDrawable() -{ -} - TerrainDrawable::TerrainDrawable(const TerrainDrawable ©, const osg::CopyOp ©op) : osg::Geometry(copy, copyop) , mPasses(copy.mPasses) @@ -63,6 +61,12 @@ void TerrainDrawable::cull(osgUtil::CullVisitor *cv) return; } + if (mCompositeMap) + { + mCompositeMapRenderer->setImmediate(mCompositeMap); + mCompositeMap = nullptr; + } + bool pushedLight = mLightListCallback && mLightListCallback->pushLightState(this, cv); for (PassVector::const_iterator it = mPasses.begin(); it != mPasses.end(); ++it) diff --git a/components/terrain/terraindrawable.hpp b/components/terrain/terraindrawable.hpp index 6bef60bc7..b77b6b784 100644 --- a/components/terrain/terraindrawable.hpp +++ b/components/terrain/terraindrawable.hpp @@ -16,6 +16,9 @@ namespace SceneUtil namespace Terrain { + class CompositeMap; + class CompositeMapRenderer; + /** * Subclass of Geometry that supports built in multi-pass rendering and built in LightListCallback. */ @@ -28,7 +31,8 @@ namespace Terrain virtual const char* className() const { return "TerrainDrawable"; } virtual const char* libraryName() const { return "Terrain"; } - TerrainDrawable(); + TerrainDrawable() = default; + ~TerrainDrawable() = default; TerrainDrawable(const TerrainDrawable& copy, const osg::CopyOp& copyop); virtual void accept(osg::NodeVisitor &nv); @@ -41,10 +45,15 @@ namespace Terrain virtual void compileGLObjects(osg::RenderInfo& renderInfo) const; + void setCompositeMap(CompositeMap* map) { mCompositeMap = map; } + void setCompositeMapRenderer(CompositeMapRenderer* renderer) { mCompositeMapRenderer = renderer; } + private: PassVector mPasses; osg::ref_ptr mLightListCallback; + osg::ref_ptr mCompositeMap; + osg::ref_ptr mCompositeMapRenderer; }; } diff --git a/components/terrain/terraingrid.cpp b/components/terrain/terraingrid.cpp index f8ce2019c..c91240334 100644 --- a/components/terrain/terraingrid.cpp +++ b/components/terrain/terraingrid.cpp @@ -61,11 +61,6 @@ osg::ref_ptr TerrainGrid::buildTerrain (osg::Group* parent, float chu return nullptr; if (parent) parent->addChild(node); - - osg::UserDataContainer* udc = node->getUserDataContainer(); - if (udc && udc->getUserData()) - mCompositeMapRenderer->setImmediate(static_cast(udc->getUserData())); - return node; } } diff --git a/components/terrain/viewdata.cpp b/components/terrain/viewdata.cpp index d1870abaa..d07a0e356 100644 --- a/components/terrain/viewdata.cpp +++ b/components/terrain/viewdata.cpp @@ -26,7 +26,7 @@ void ViewData::copyFrom(const ViewData& other) mViewPoint = other.mViewPoint; } -void ViewData::add(QuadTreeNode *node, bool visible) +void ViewData::add(QuadTreeNode *node) { unsigned int index = mNumEntries++; @@ -34,7 +34,7 @@ void ViewData::add(QuadTreeNode *node, bool visible) mEntries.resize(index+1); Entry& entry = mEntries[index]; - if (entry.set(node, visible)) + if (entry.set(node)) mChanged = true; } @@ -73,7 +73,7 @@ void ViewData::reset() { // clear any unused entries for (unsigned int i=mNumEntries; i mRenderingNode;