diff --git a/components/terrain/chunkmanager.cpp b/components/terrain/chunkmanager.cpp index 7ccd89ac21..3d7c2b1dfc 100644 --- a/components/terrain/chunkmanager.cpp +++ b/components/terrain/chunkmanager.cpp @@ -19,6 +19,23 @@ namespace Terrain { + struct UpdateTextureFilteringFunctor + { + UpdateTextureFilteringFunctor(Resource::SceneManager* sceneMgr) + : mSceneManager(sceneMgr) + { + } + Resource::SceneManager* mSceneManager; + + void operator()(ChunkKey, osg::Object* obj) + { + TerrainDrawable* drawable = static_cast(obj); + CompositeMap* composite = drawable->getCompositeMap(); + if (composite && composite->mTexture) + mSceneManager->applyFilterSettings(composite->mTexture); + } + }; + ChunkManager::ChunkManager(Storage* storage, Resource::SceneManager* sceneMgr, TextureManager* textureManager, CompositeMapRenderer* renderer, ESM::RefId worldspace, double expiryDelay) : GenericResourceManager(nullptr, expiryDelay) @@ -61,6 +78,12 @@ namespace Terrain return node; } + void ChunkManager::updateTextureFiltering() + { + UpdateTextureFilteringFunctor f(mSceneManager); + mCache->call(f); + } + void ChunkManager::reportStats(unsigned int frameNumber, osg::Stats* stats) const { Resource::reportStats("Terrain Chunk", frameNumber, mCache->getStats(), *stats); @@ -85,10 +108,9 @@ namespace Terrain texture->setTextureWidth(mCompositeMapSize); texture->setTextureHeight(mCompositeMapSize); texture->setInternalFormat(GL_RGB); - texture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR); - texture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE); texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE); + mSceneManager->applyFilterSettings(texture); return texture; } diff --git a/components/terrain/chunkmanager.hpp b/components/terrain/chunkmanager.hpp index 20d6ba9327..b4f327e699 100644 --- a/components/terrain/chunkmanager.hpp +++ b/components/terrain/chunkmanager.hpp @@ -85,6 +85,8 @@ namespace Terrain void setCompositeMapLevel(float level) { mCompositeMapLevel = level; } void setMaxCompositeGeometrySize(float maxCompGeometrySize) { mMaxCompGeometrySize = maxCompGeometrySize; } + void updateTextureFiltering(); + void setNodeMask(unsigned int mask) { mNodeMask = mask; } unsigned int getNodeMask() override { return mNodeMask; } diff --git a/components/terrain/world.cpp b/components/terrain/world.cpp index 58cfc0b068..e18881e490 100644 --- a/components/terrain/world.cpp +++ b/components/terrain/world.cpp @@ -133,6 +133,8 @@ namespace Terrain { if (mTextureManager) mTextureManager->updateTextureFiltering(); + if (mChunkManager) + mChunkManager->updateTextureFiltering(); } void World::clearAssociatedCaches()