Add CompositeMapRenderer
Temporarily render all terrain using composite maps for testing purposespull/185/head
parent
e323b2fa7b
commit
b1d4bb5708
@ -0,0 +1,78 @@
|
||||
#include "compositemaprenderer.hpp"
|
||||
|
||||
#include <OpenThreads/ScopedLock>
|
||||
|
||||
#include <osg/NodeVisitor>
|
||||
|
||||
namespace Terrain
|
||||
{
|
||||
|
||||
CompositeMapRenderer::CompositeMapRenderer()
|
||||
: mNumCompilePerFrame(1)
|
||||
, mLastFrame(0)
|
||||
{
|
||||
setCullingActive(false);
|
||||
}
|
||||
|
||||
void CompositeMapRenderer::traverse(osg::NodeVisitor &nv)
|
||||
{
|
||||
if (nv.getVisitorType() != osg::NodeVisitor::CULL_VISITOR)
|
||||
return;
|
||||
|
||||
if (mLastFrame == nv.getTraversalNumber())
|
||||
return;
|
||||
mLastFrame = nv.getTraversalNumber();
|
||||
|
||||
mCompiled.clear();
|
||||
|
||||
unsigned int numCompiled = 0;
|
||||
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mMutex);
|
||||
|
||||
while (!mImmediateCompileSet.empty())
|
||||
{
|
||||
osg::Node* node = *mImmediateCompileSet.begin();
|
||||
mCompiled.insert(node);
|
||||
|
||||
node->accept(nv);
|
||||
mImmediateCompileSet.erase(mImmediateCompileSet.begin());
|
||||
|
||||
++numCompiled;
|
||||
}
|
||||
|
||||
while (!mCompileSet.empty() && numCompiled <= mNumCompilePerFrame)
|
||||
{
|
||||
osg::Node* node = *mCompileSet.begin();
|
||||
mCompiled.insert(node);
|
||||
|
||||
node->accept(nv);
|
||||
mCompileSet.erase(mCompileSet.begin());
|
||||
|
||||
++numCompiled;
|
||||
}
|
||||
}
|
||||
|
||||
void CompositeMapRenderer::setNumCompilePerFrame(int num)
|
||||
{
|
||||
mNumCompilePerFrame = num;
|
||||
}
|
||||
|
||||
void CompositeMapRenderer::addCompositeMap(osg::Node *node, bool immediate)
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mMutex);
|
||||
if (immediate)
|
||||
mImmediateCompileSet.insert(node);
|
||||
else
|
||||
mCompileSet.insert(node);
|
||||
}
|
||||
|
||||
void CompositeMapRenderer::setImmediate(osg::Node *node)
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mMutex);
|
||||
mImmediateCompileSet.insert(node);
|
||||
mCompileSet.erase(node);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
#ifndef OPENMW_COMPONENTS_TERRAIN_COMPOSITEMAPRENDERER_H
|
||||
#define OPENMW_COMPONENTS_TERRAIN_COMPOSITEMAPRENDERER_H
|
||||
|
||||
#include <osg/Node>
|
||||
|
||||
#include <OpenThreads/Mutex>
|
||||
|
||||
#include <deque>
|
||||
|
||||
namespace Terrain
|
||||
{
|
||||
|
||||
/**
|
||||
* @brief The CompositeMapRenderer is responsible for updating composite map textures in a blocking or non-blocking way.
|
||||
*/
|
||||
class CompositeMapRenderer : public osg::Node
|
||||
{
|
||||
public:
|
||||
CompositeMapRenderer();
|
||||
|
||||
virtual void traverse(osg::NodeVisitor& nv);
|
||||
|
||||
/// Set the maximum number of (non-immediate) composite maps to compile per frame
|
||||
void setNumCompilePerFrame(int num);
|
||||
|
||||
/// Add a composite map to be rendered
|
||||
void addCompositeMap(osg::Node* node, bool immediate=false);
|
||||
|
||||
/// Mark this composite map to be required for the current frame
|
||||
void setImmediate(osg::Node* node);
|
||||
|
||||
private:
|
||||
unsigned int mNumCompilePerFrame;
|
||||
unsigned int mLastFrame;
|
||||
|
||||
typedef std::set<osg::ref_ptr<osg::Node> > CompileSet;
|
||||
|
||||
CompileSet mCompileSet;
|
||||
CompileSet mImmediateCompileSet;
|
||||
|
||||
CompileSet mCompiled;
|
||||
|
||||
OpenThreads::Mutex mMutex;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue