mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-22 12:39:59 +00:00
Apply texture filter setting changes
This commit is contained in:
parent
5442bf23a6
commit
24bb2e152c
@ -419,6 +419,12 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
|
||||
|
||||
mResourceSystem.reset(new Resource::ResourceSystem(mVFS.get()));
|
||||
mResourceSystem->getTextureManager()->setUnRefImageDataAfterApply(true);
|
||||
osg::Texture::FilterMode min = osg::Texture::LINEAR_MIPMAP_NEAREST;
|
||||
osg::Texture::FilterMode mag = osg::Texture::LINEAR;
|
||||
if (Settings::Manager::getString("texture filtering", "General") == "trilinear")
|
||||
min = osg::Texture::LINEAR_MIPMAP_LINEAR;
|
||||
int maxAnisotropy = Settings::Manager::getInt("anisotropy", "General");
|
||||
mResourceSystem->getTextureManager()->setFilterSettings(min, mag, maxAnisotropy);
|
||||
|
||||
// Create input and UI first to set up a bootstrapping environment for
|
||||
// showing a loading screen and keeping the window responsive while doing so
|
||||
@ -469,7 +475,7 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
|
||||
}
|
||||
|
||||
// Create the world
|
||||
mEnvironment.setWorld( new MWWorld::World (*mViewer, rootNode, mResourceSystem.get(),
|
||||
mEnvironment.setWorld( new MWWorld::World (mViewer, rootNode, mResourceSystem.get(),
|
||||
mFileCollections, mContentFiles, mEncoder, mFallbackMap,
|
||||
mActivationDistanceOverride, mCellName, mStartupScript));
|
||||
MWBase::Environment::get().getWorld()->setupPlayer();
|
||||
|
@ -38,12 +38,10 @@ namespace
|
||||
|
||||
std::string textureFilteringToStr(const std::string& val)
|
||||
{
|
||||
if (val == "anisotropic")
|
||||
return "Anisotropic";
|
||||
else if (val == "bilinear")
|
||||
return "Bilinear";
|
||||
else
|
||||
if (val == "trilinear")
|
||||
return "Trilinear";
|
||||
else
|
||||
return "Bilinear";
|
||||
}
|
||||
|
||||
void parseResolution (int &x, int &y, const std::string& str)
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <osgViewer/Viewer>
|
||||
|
||||
#include <components/resource/resourcesystem.hpp>
|
||||
#include <components/resource/texturemanager.hpp>
|
||||
|
||||
#include <components/settings/settings.hpp>
|
||||
|
||||
@ -82,7 +83,7 @@ namespace MWRender
|
||||
float mFogEnd;
|
||||
};
|
||||
|
||||
RenderingManager::RenderingManager(osgViewer::Viewer &viewer, osg::ref_ptr<osg::Group> rootNode, Resource::ResourceSystem* resourceSystem)
|
||||
RenderingManager::RenderingManager(osgViewer::Viewer* viewer, osg::ref_ptr<osg::Group> rootNode, Resource::ResourceSystem* resourceSystem)
|
||||
: mViewer(viewer)
|
||||
, mRootNode(rootNode)
|
||||
, mResourceSystem(resourceSystem)
|
||||
@ -97,13 +98,13 @@ namespace MWRender
|
||||
|
||||
mObjects.reset(new Objects(mResourceSystem, lightRoot));
|
||||
|
||||
mViewer.setIncrementalCompileOperation(new osgUtil::IncrementalCompileOperation);
|
||||
mViewer->setIncrementalCompileOperation(new osgUtil::IncrementalCompileOperation);
|
||||
|
||||
mObjects->setIncrementalCompileOperation(mViewer.getIncrementalCompileOperation());
|
||||
mObjects->setIncrementalCompileOperation(mViewer->getIncrementalCompileOperation());
|
||||
|
||||
mEffectManager.reset(new EffectManager(mRootNode, mResourceSystem));
|
||||
|
||||
mViewer.setLightingMode(osgViewer::View::NO_LIGHT);
|
||||
mViewer->setLightingMode(osgViewer::View::NO_LIGHT);
|
||||
|
||||
osg::ref_ptr<osg::LightSource> source = new osg::LightSource;
|
||||
mSunLight = new osg::Light;
|
||||
@ -133,10 +134,10 @@ namespace MWRender
|
||||
else
|
||||
cullingMode |= osg::CullStack::SMALL_FEATURE_CULLING;
|
||||
|
||||
viewer.getCamera()->setCullingMode( cullingMode );
|
||||
mViewer->getCamera()->setCullingMode( cullingMode );
|
||||
|
||||
mViewer.getCamera()->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR);
|
||||
mViewer.getCamera()->setCullingMode(cullingMode);
|
||||
mViewer->getCamera()->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR);
|
||||
mViewer->getCamera()->setCullingMode(cullingMode);
|
||||
|
||||
mViewDistance = Settings::Manager::getFloat("viewing distance", "Viewing distance");
|
||||
mFieldOfView = Settings::Manager::getFloat("field of view", "General");
|
||||
@ -184,7 +185,7 @@ namespace MWRender
|
||||
|
||||
osg::Vec3f RenderingManager::getEyePos()
|
||||
{
|
||||
osg::Vec3d eye = mViewer.getCameraManipulator()->getMatrix().getTrans();
|
||||
osg::Vec3d eye = mViewer->getCameraManipulator()->getMatrix().getTrans();
|
||||
return eye;
|
||||
}
|
||||
|
||||
@ -232,7 +233,7 @@ namespace MWRender
|
||||
|
||||
void RenderingManager::configureFog(float /* fogDepth */, const osg::Vec4f &colour)
|
||||
{
|
||||
mViewer.getCamera()->setClearColor(colour);
|
||||
mViewer->getCamera()->setClearColor(colour);
|
||||
|
||||
mStateUpdater->setFogColor(colour);
|
||||
mStateUpdater->setFogEnd(mViewDistance);
|
||||
@ -325,11 +326,26 @@ namespace MWRender
|
||||
void RenderingManager::updateProjectionMatrix()
|
||||
{
|
||||
double fovy, aspect, zNear, zFar;
|
||||
mViewer.getCamera()->getProjectionMatrixAsPerspective(fovy, aspect, zNear, zFar);
|
||||
mViewer->getCamera()->getProjectionMatrixAsPerspective(fovy, aspect, zNear, zFar);
|
||||
fovy = mFieldOfView;
|
||||
zNear = 5.f;
|
||||
zFar = mViewDistance;
|
||||
mViewer.getCamera()->setProjectionMatrixAsPerspective(fovy, aspect, zNear, zFar);
|
||||
mViewer->getCamera()->setProjectionMatrixAsPerspective(fovy, aspect, zNear, zFar);
|
||||
}
|
||||
|
||||
void RenderingManager::updateTextureFiltering()
|
||||
{
|
||||
osg::Texture::FilterMode min = osg::Texture::LINEAR_MIPMAP_NEAREST;
|
||||
osg::Texture::FilterMode mag = osg::Texture::LINEAR;
|
||||
|
||||
if (Settings::Manager::getString("texture filtering", "General") == "trilinear")
|
||||
min = osg::Texture::LINEAR_MIPMAP_LINEAR;
|
||||
|
||||
int maxAnisotropy = Settings::Manager::getInt("anisotropy", "General");
|
||||
|
||||
mViewer->stopThreading();
|
||||
mResourceSystem->getTextureManager()->setFilterSettings(min, mag, maxAnisotropy);
|
||||
mViewer->startThreading();
|
||||
}
|
||||
|
||||
void RenderingManager::processChangedSettings(const Settings::CategorySettingVector &changed)
|
||||
@ -346,6 +362,8 @@ namespace MWRender
|
||||
mViewDistance = Settings::Manager::getFloat("viewing distance", "Viewing distance");
|
||||
updateProjectionMatrix();
|
||||
}
|
||||
else if (it->first == "General" && (it->second == "texture filtering" || it->second == "anisotropy"))
|
||||
updateTextureFiltering();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,7 @@ namespace MWRender
|
||||
class RenderingManager : public MWRender::RenderingInterface
|
||||
{
|
||||
public:
|
||||
RenderingManager(osgViewer::Viewer& viewer, osg::ref_ptr<osg::Group> rootNode, Resource::ResourceSystem* resourceSystem);
|
||||
RenderingManager(osgViewer::Viewer* viewer, osg::ref_ptr<osg::Group> rootNode, Resource::ResourceSystem* resourceSystem);
|
||||
~RenderingManager();
|
||||
|
||||
MWRender::Objects& getObjects();
|
||||
@ -99,8 +99,9 @@ namespace MWRender
|
||||
|
||||
private:
|
||||
void updateProjectionMatrix();
|
||||
void updateTextureFiltering();
|
||||
|
||||
osgViewer::Viewer& mViewer;
|
||||
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
||||
osg::ref_ptr<osg::Group> mRootNode;
|
||||
osg::ref_ptr<osg::Group> mLightRoot;
|
||||
Resource::ResourceSystem* mResourceSystem;
|
||||
|
@ -143,7 +143,7 @@ namespace MWWorld
|
||||
}
|
||||
|
||||
World::World (
|
||||
osgViewer::Viewer& viewer,
|
||||
osgViewer::Viewer* viewer,
|
||||
osg::ref_ptr<osg::Group> rootNode,
|
||||
Resource::ResourceSystem* resourceSystem,
|
||||
const Files::Collections& fileCollections,
|
||||
|
@ -162,7 +162,7 @@ namespace MWWorld
|
||||
public:
|
||||
|
||||
World (
|
||||
osgViewer::Viewer& viewer,
|
||||
osgViewer::Viewer* viewer,
|
||||
osg::ref_ptr<osg::Group> rootNode,
|
||||
Resource::ResourceSystem* resourceSystem,
|
||||
const Files::Collections& fileCollections,
|
||||
|
@ -36,6 +36,9 @@ namespace Resource
|
||||
|
||||
TextureManager::TextureManager(const VFS::Manager *vfs)
|
||||
: mVFS(vfs)
|
||||
, mMinFilter(osg::Texture::LINEAR_MIPMAP_LINEAR)
|
||||
, mMagFilter(osg::Texture::LINEAR)
|
||||
, mMaxAnisotropy(1)
|
||||
, mWarningTexture(createWarningTexture())
|
||||
, mUnRefImageDataAfterApply(false)
|
||||
{
|
||||
@ -52,6 +55,21 @@ namespace Resource
|
||||
mUnRefImageDataAfterApply = unref;
|
||||
}
|
||||
|
||||
void TextureManager::setFilterSettings(osg::Texture::FilterMode minFilter, osg::Texture::FilterMode magFilter, int maxAnisotropy)
|
||||
{
|
||||
mMinFilter = minFilter;
|
||||
mMagFilter = magFilter;
|
||||
mMaxAnisotropy = std::max(1, maxAnisotropy);
|
||||
|
||||
for (std::map<MapKey, osg::ref_ptr<osg::Texture2D> >::iterator it = mTextures.begin(); it != mTextures.end(); ++it)
|
||||
{
|
||||
osg::ref_ptr<osg::Texture2D> tex = it->second;
|
||||
tex->setFilter(osg::Texture::MIN_FILTER, mMinFilter);
|
||||
tex->setFilter(osg::Texture::MAG_FILTER, mMagFilter);
|
||||
tex->setMaxAnisotropy(static_cast<float>(mMaxAnisotropy));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
osg::ref_ptr<osg::Image> TextureManager::getImage(const std::string &filename)
|
||||
{
|
||||
@ -110,6 +128,9 @@ namespace Resource
|
||||
texture->setImage(image);
|
||||
texture->setWrap(osg::Texture::WRAP_S, wrapS);
|
||||
texture->setWrap(osg::Texture::WRAP_T, wrapT);
|
||||
texture->setFilter(osg::Texture::MIN_FILTER, mMinFilter);
|
||||
texture->setFilter(osg::Texture::MAG_FILTER, mMagFilter);
|
||||
texture->setMaxAnisotropy(mMaxAnisotropy);
|
||||
|
||||
texture->setUnRefImageDataAfterApply(mUnRefImageDataAfterApply);
|
||||
|
||||
|
@ -23,7 +23,8 @@ namespace Resource
|
||||
TextureManager(const VFS::Manager* vfs);
|
||||
~TextureManager();
|
||||
|
||||
// TODO: texture filtering settings
|
||||
/// @warning It is unsafe to call this function when a draw thread is using the textures. Call stopThreading() first!
|
||||
void setFilterSettings(osg::Texture::FilterMode minFilter, osg::Texture::FilterMode maxFilter, int maxAnisotropy);
|
||||
|
||||
/// Keep a copy of the texture data around in system memory? This is needed when using multiple graphics contexts,
|
||||
/// otherwise should be disabled to reduce memory usage.
|
||||
@ -40,6 +41,10 @@ namespace Resource
|
||||
private:
|
||||
const VFS::Manager* mVFS;
|
||||
|
||||
osg::Texture::FilterMode mMinFilter;
|
||||
osg::Texture::FilterMode mMagFilter;
|
||||
int mMaxAnisotropy;
|
||||
|
||||
typedef std::pair<std::pair<int, int>, std::string> MapKey;
|
||||
|
||||
std::map<std::string, osg::observer_ptr<osg::Image> > mImages;
|
||||
|
@ -322,7 +322,6 @@
|
||||
<Widget type="ComboBox" skin="MW_ComboBox" position="14 28 110 24" align="Left Top" name="TextureFilteringButton">
|
||||
<Property key="AddItem" value="Bilinear"/>
|
||||
<Property key="AddItem" value="Trilinear"/>
|
||||
<Property key="AddItem" value="Anisotropic"/>
|
||||
</Widget>
|
||||
<Widget type="Widget" skin="" position="184 4 300 50" align="Left Top" name="AnisotropyBox">
|
||||
<Widget type="TextBox" skin="SandText" position="0 0 300 24" align="Left Top" name="AnisotropyLabel">
|
||||
|
@ -48,13 +48,10 @@ stretch menu background = false
|
||||
field of view = 55
|
||||
|
||||
# Texture filtering mode. valid values:
|
||||
# none
|
||||
# anisotropic
|
||||
# bilinear
|
||||
# trilinear
|
||||
texture filtering = anisotropic
|
||||
texture filtering =
|
||||
|
||||
# Has no effect when texture filtering is not anisotropic
|
||||
anisotropy = 4
|
||||
|
||||
# Number of texture mipmaps to generate
|
||||
|
Loading…
x
Reference in New Issue
Block a user