forked from teamnwah/openmw-tes3coop
Merge pull request #385 from OpenMW/master
Add OpenMW commits up to 13 Feb 2018
This commit is contained in:
commit
53d758ba16
12 changed files with 54 additions and 18 deletions
|
@ -163,7 +163,6 @@ namespace MWGui
|
||||||
if (mViewer->getIncrementalCompileOperation())
|
if (mViewer->getIncrementalCompileOperation())
|
||||||
{
|
{
|
||||||
mViewer->getIncrementalCompileOperation()->setMaximumNumOfObjectsToCompilePerFrame(100);
|
mViewer->getIncrementalCompileOperation()->setMaximumNumOfObjectsToCompilePerFrame(100);
|
||||||
mViewer->getIncrementalCompileOperation()->setTargetFrameRate(getTargetFrameRate());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assign dummy bounding sphere callback to avoid the bounding sphere of the entire scene being recomputed after each frame of loading
|
// Assign dummy bounding sphere callback to avoid the bounding sphere of the entire scene being recomputed after each frame of loading
|
||||||
|
|
|
@ -205,7 +205,10 @@ namespace MWRender
|
||||||
mObjects.reset(new Objects(mResourceSystem, sceneRoot, mUnrefQueue.get()));
|
mObjects.reset(new Objects(mResourceSystem, sceneRoot, mUnrefQueue.get()));
|
||||||
|
|
||||||
if (getenv("OPENMW_DONT_PRECOMPILE") == NULL)
|
if (getenv("OPENMW_DONT_PRECOMPILE") == NULL)
|
||||||
|
{
|
||||||
mViewer->setIncrementalCompileOperation(new osgUtil::IncrementalCompileOperation);
|
mViewer->setIncrementalCompileOperation(new osgUtil::IncrementalCompileOperation);
|
||||||
|
mViewer->getIncrementalCompileOperation()->setTargetFrameRate(Settings::Manager::getFloat("target framerate", "Cells"));
|
||||||
|
}
|
||||||
|
|
||||||
mResourceSystem->getSceneManager()->setIncrementalCompileOperation(mViewer->getIncrementalCompileOperation());
|
mResourceSystem->getSceneManager()->setIncrementalCompileOperation(mViewer->getIncrementalCompileOperation());
|
||||||
|
|
||||||
|
@ -223,6 +226,7 @@ namespace MWRender
|
||||||
else
|
else
|
||||||
mTerrain.reset(new Terrain::TerrainGrid(sceneRoot, mRootNode, mResourceSystem, mTerrainStorage, Mask_Terrain, Mask_PreCompile));
|
mTerrain.reset(new Terrain::TerrainGrid(sceneRoot, mRootNode, mResourceSystem, mTerrainStorage, Mask_Terrain, Mask_PreCompile));
|
||||||
mTerrain->setDefaultViewer(mViewer->getCamera());
|
mTerrain->setDefaultViewer(mViewer->getCamera());
|
||||||
|
mTerrain->setTargetFrameRate(Settings::Manager::getFloat("target framerate", "Cells"));
|
||||||
|
|
||||||
mCamera.reset(new Camera(mViewer->getCamera()));
|
mCamera.reset(new Camera(mViewer->getCamera()));
|
||||||
|
|
||||||
|
|
|
@ -607,6 +607,11 @@ namespace MWWorld
|
||||||
}
|
}
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
void Store<ESM::Cell>::clearDynamic()
|
||||||
|
{
|
||||||
|
setUp();
|
||||||
|
}
|
||||||
|
|
||||||
void Store<ESM::Cell>::setUp()
|
void Store<ESM::Cell>::setUp()
|
||||||
{
|
{
|
||||||
typedef DynamicExt::iterator ExtIterator;
|
typedef DynamicExt::iterator ExtIterator;
|
||||||
|
|
|
@ -293,6 +293,7 @@ namespace MWWorld
|
||||||
const ESM::Cell *find(const std::string &id) const;
|
const ESM::Cell *find(const std::string &id) const;
|
||||||
const ESM::Cell *find(int x, int y) const;
|
const ESM::Cell *find(int x, int y) const;
|
||||||
|
|
||||||
|
virtual void clearDynamic();
|
||||||
void setUp();
|
void setUp();
|
||||||
|
|
||||||
RecordId load(ESM::ESMReader &esm);
|
RecordId load(ESM::ESMReader &esm);
|
||||||
|
|
|
@ -328,7 +328,6 @@ namespace MWWorld
|
||||||
mWorldScene->clear();
|
mWorldScene->clear();
|
||||||
|
|
||||||
mStore.clearDynamic();
|
mStore.clearDynamic();
|
||||||
mStore.setUp();
|
|
||||||
|
|
||||||
if (mPlayer)
|
if (mPlayer)
|
||||||
{
|
{
|
||||||
|
|
|
@ -245,11 +245,6 @@ void BulletNifLoader::handleNiTriShape(const Nif::NiTriShape *shape, int flags,
|
||||||
{
|
{
|
||||||
assert(shape != NULL);
|
assert(shape != NULL);
|
||||||
|
|
||||||
// Interpret flags
|
|
||||||
bool hidden = (flags&Nif::NiNode::Flag_Hidden) != 0;
|
|
||||||
bool collide = (flags&Nif::NiNode::Flag_MeshCollision) != 0;
|
|
||||||
bool bbcollide = (flags&Nif::NiNode::Flag_BBoxCollision) != 0;
|
|
||||||
|
|
||||||
// If the object was marked "NCO" earlier, it shouldn't collide with
|
// If the object was marked "NCO" earlier, it shouldn't collide with
|
||||||
// anything. So don't do anything.
|
// anything. So don't do anything.
|
||||||
if ((flags & 0x800))
|
if ((flags & 0x800))
|
||||||
|
@ -257,11 +252,6 @@ void BulletNifLoader::handleNiTriShape(const Nif::NiTriShape *shape, int flags,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!collide && !bbcollide && hidden)
|
|
||||||
// This mesh apparently isn't being used for anything, so don't
|
|
||||||
// bother setting it up.
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!shape->skin.empty())
|
if (!shape->skin.empty())
|
||||||
isAnimated = false;
|
isAnimated = false;
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,8 @@ namespace Terrain
|
||||||
{
|
{
|
||||||
|
|
||||||
CompositeMapRenderer::CompositeMapRenderer()
|
CompositeMapRenderer::CompositeMapRenderer()
|
||||||
: mTimeAvailable(0.0005)
|
: mTargetFrameRate(120)
|
||||||
|
, mMinimumTimeAvailable(0.0025)
|
||||||
{
|
{
|
||||||
setSupportsDisplayList(false);
|
setSupportsDisplayList(false);
|
||||||
setCullingActive(false);
|
setCullingActive(false);
|
||||||
|
@ -22,6 +23,14 @@ CompositeMapRenderer::CompositeMapRenderer()
|
||||||
|
|
||||||
void CompositeMapRenderer::drawImplementation(osg::RenderInfo &renderInfo) const
|
void CompositeMapRenderer::drawImplementation(osg::RenderInfo &renderInfo) const
|
||||||
{
|
{
|
||||||
|
double dt = mTimer.time_s();
|
||||||
|
dt = std::min(dt, 0.2);
|
||||||
|
mTimer.setStartTick();
|
||||||
|
double targetFrameTime = 1.0/static_cast<double>(mTargetFrameRate);
|
||||||
|
double conservativeTimeRatio(0.75);
|
||||||
|
double availableTime = std::max((targetFrameTime - dt)*conservativeTimeRatio,
|
||||||
|
mMinimumTimeAvailable);
|
||||||
|
|
||||||
mCompiled.clear();
|
mCompiled.clear();
|
||||||
|
|
||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mMutex);
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mMutex);
|
||||||
|
@ -39,7 +48,7 @@ void CompositeMapRenderer::drawImplementation(osg::RenderInfo &renderInfo) const
|
||||||
mImmediateCompileSet.erase(mImmediateCompileSet.begin());
|
mImmediateCompileSet.erase(mImmediateCompileSet.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
double timeLeft = mTimeAvailable;
|
double timeLeft = availableTime;
|
||||||
|
|
||||||
while (!mCompileSet.empty() && timeLeft > 0)
|
while (!mCompileSet.empty() && timeLeft > 0)
|
||||||
{
|
{
|
||||||
|
@ -126,9 +135,14 @@ void CompositeMapRenderer::compile(CompositeMap &compositeMap, osg::RenderInfo &
|
||||||
ext->glBindFramebuffer(GL_FRAMEBUFFER_EXT, fboId);
|
ext->glBindFramebuffer(GL_FRAMEBUFFER_EXT, fboId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CompositeMapRenderer::setTimeAvailableForCompile(double time)
|
void CompositeMapRenderer::setMinimumTimeAvailableForCompile(double time)
|
||||||
{
|
{
|
||||||
mTimeAvailable = time;
|
mMinimumTimeAvailable = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CompositeMapRenderer::setTargetFrameRate(float framerate)
|
||||||
|
{
|
||||||
|
mTargetFrameRate = framerate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CompositeMapRenderer::addCompositeMap(CompositeMap* compositeMap, bool immediate)
|
void CompositeMapRenderer::addCompositeMap(CompositeMap* compositeMap, bool immediate)
|
||||||
|
|
|
@ -40,7 +40,10 @@ namespace Terrain
|
||||||
void compile(CompositeMap& compositeMap, osg::RenderInfo& renderInfo, double* timeLeft) const;
|
void compile(CompositeMap& compositeMap, osg::RenderInfo& renderInfo, double* timeLeft) const;
|
||||||
|
|
||||||
/// Set the available time in seconds for compiling (non-immediate) composite maps each frame
|
/// Set the available time in seconds for compiling (non-immediate) composite maps each frame
|
||||||
void setTimeAvailableForCompile(double time);
|
void setMinimumTimeAvailableForCompile(double time);
|
||||||
|
|
||||||
|
/// If current frame rate is higher than this, the extra time will be set aside to do more compiling
|
||||||
|
void setTargetFrameRate(float framerate);
|
||||||
|
|
||||||
/// Add a composite map to be rendered
|
/// Add a composite map to be rendered
|
||||||
void addCompositeMap(CompositeMap* map, bool immediate=false);
|
void addCompositeMap(CompositeMap* map, bool immediate=false);
|
||||||
|
@ -51,7 +54,9 @@ namespace Terrain
|
||||||
unsigned int getCompileSetSize() const;
|
unsigned int getCompileSetSize() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double mTimeAvailable;
|
float mTargetFrameRate;
|
||||||
|
double mMinimumTimeAvailable;
|
||||||
|
mutable osg::Timer mTimer;
|
||||||
|
|
||||||
typedef std::set<osg::ref_ptr<CompositeMap> > CompileSet;
|
typedef std::set<osg::ref_ptr<CompositeMap> > CompileSet;
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,11 @@ World::~World()
|
||||||
delete mStorage;
|
delete mStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void World::setTargetFrameRate(float rate)
|
||||||
|
{
|
||||||
|
mCompositeMapRenderer->setTargetFrameRate(rate);
|
||||||
|
}
|
||||||
|
|
||||||
float World::getHeightAt(const osg::Vec3f &worldPos)
|
float World::getHeightAt(const osg::Vec3f &worldPos)
|
||||||
{
|
{
|
||||||
return mStorage->getHeightAt(worldPos);
|
return mStorage->getHeightAt(worldPos);
|
||||||
|
|
|
@ -57,6 +57,9 @@ namespace Terrain
|
||||||
World(osg::Group* parent, osg::Group* compileRoot, Resource::ResourceSystem* resourceSystem, Storage* storage, int nodeMask, int preCompileMask);
|
World(osg::Group* parent, osg::Group* compileRoot, Resource::ResourceSystem* resourceSystem, Storage* storage, int nodeMask, int preCompileMask);
|
||||||
virtual ~World();
|
virtual ~World();
|
||||||
|
|
||||||
|
/// See CompositeMapRenderer::setTargetFrameRate
|
||||||
|
void setTargetFrameRate(float rate);
|
||||||
|
|
||||||
/// Apply the scene manager's texture filtering settings to all cached textures.
|
/// Apply the scene manager's texture filtering settings to all cached textures.
|
||||||
/// @note Thread safe.
|
/// @note Thread safe.
|
||||||
void updateTextureFiltering();
|
void updateTextureFiltering();
|
||||||
|
|
|
@ -178,6 +178,14 @@ cache expiry delay
|
||||||
The amount of time (in seconds) that a preloaded texture or object will stay in cache
|
The amount of time (in seconds) that a preloaded texture or object will stay in cache
|
||||||
after it is no longer referenced or required, for example, when all cells containing this texture have been unloaded.
|
after it is no longer referenced or required, for example, when all cells containing this texture have been unloaded.
|
||||||
|
|
||||||
|
target framerate
|
||||||
|
----------------
|
||||||
|
:Type: floating point
|
||||||
|
:Range: >0
|
||||||
|
:Default: 60
|
||||||
|
|
||||||
|
Affects the time to be set aside each frame for graphics preloading operations. The game will distribute the preloading over several frames so as to not go under the specified framerate. For best results, set this value to the monitor's refresh rate. If you still experience stutters on turning around, you can try a lower value, although the framerate during loading will suffer a bit in that case.
|
||||||
|
|
||||||
pointers cache size
|
pointers cache size
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,9 @@ prediction time = 1
|
||||||
# How long to keep models/textures/collision shapes in cache after they're no longer referenced/required (in seconds)
|
# How long to keep models/textures/collision shapes in cache after they're no longer referenced/required (in seconds)
|
||||||
cache expiry delay = 5
|
cache expiry delay = 5
|
||||||
|
|
||||||
|
# Affects the time to be set aside each frame for graphics preloading operations
|
||||||
|
target framerate = 60
|
||||||
|
|
||||||
# The count of pointers, that will be saved for a faster search by object ID.
|
# The count of pointers, that will be saved for a faster search by object ID.
|
||||||
pointers cache size = 40
|
pointers cache size = 40
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue