本文整理汇总了C++中osg::State::getFrameStamp方法的典型用法代码示例。如果您正苦于以下问题:C++ State::getFrameStamp方法的具体用法?C++ State::getFrameStamp怎么用?C++ State::getFrameStamp使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类osg::State
的用法示例。
在下文中一共展示了State::getFrameStamp方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: createFileName
std::string DepthPeelBin::createFileName( osg::State& state, int pass, bool depth )
{
unsigned int contextID = state.getContextID();
int frameNumber = state.getFrameStamp()->getFrameNumber();
std::ostringstream ostr;
ostr << std::setfill( '0' );
ostr << "f" << std::setw( 6 ) << frameNumber <<
"_c" << std::setw( 2 ) << contextID << "_";
ostr << "peel_part" << _partitionNumber;
if( pass == -1 )
ostr << "_a";
else
ostr << "_b" << std::setw( 2 ) << pass;
if( depth )
ostr << "_z";
ostr << ".png";
return( ostr.str() );
}
示例2: exclusive
void
MPGeometry::renderPrimitiveSets(osg::State& state,
bool renderColor,
bool usingVBOs) const
{
// check the map frame to see if it's up to date
if ( _frame.needsSync() )
{
// this lock protects a MapFrame sync when we have multiple DRAW threads.
Threading::ScopedMutexLock exclusive( _frameSyncMutex );
if ( _frame.needsSync() && _frame.sync() ) // always double check
{
// This should only happen is the layer ordering changes;
// If layers are added or removed, the Tile gets rebuilt and
// the point is moot.
std::vector<Layer> reordered;
const ImageLayerVector& layers = _frame.imageLayers();
reordered.reserve( layers.size() );
for( ImageLayerVector::const_iterator i = layers.begin(); i != layers.end(); ++i )
{
std::vector<Layer>::iterator j = std::find( _layers.begin(), _layers.end(), i->get()->getUID() );
if ( j != _layers.end() )
reordered.push_back( *j );
}
_layers.swap( reordered );
}
}
unsigned layersDrawn = 0;
// access the GL extensions interface for the current GC:
const osg::Program::PerContextProgram* pcp = 0L;
#if OSG_MIN_VERSION_REQUIRED(3,3,3)
osg::ref_ptr<osg::GLExtensions> ext;
#else
osg::ref_ptr<osg::GL2Extensions> ext;
#endif
unsigned contextID;
if (_supportsGLSL)
{
contextID = state.getContextID();
#if OSG_MIN_VERSION_REQUIRED(3,3,3)
ext = osg::GLExtensions::Get(contextID, true);
#else
ext = osg::GL2Extensions::Get( contextID, true );
#endif
pcp = state.getLastAppliedProgramObject();
}
// cannot store these in the object since there could be multiple GCs (and multiple
// PerContextPrograms) at large
GLint tileKeyLocation = -1;
GLint birthTimeLocation = -1;
GLint opacityLocation = -1;
GLint uidLocation = -1;
GLint orderLocation = -1;
GLint texMatParentLocation = -1;
GLint minRangeLocation = -1;
GLint maxRangeLocation = -1;
// The PCP can change (especially in a VirtualProgram environment). So we do need to
// requery the uni locations each time unfortunately. TODO: explore optimizations.
if ( pcp )
{
tileKeyLocation = pcp->getUniformLocation( _tileKeyUniformNameID );
birthTimeLocation = pcp->getUniformLocation( _birthTimeUniformNameID );
opacityLocation = pcp->getUniformLocation( _opacityUniformNameID );
uidLocation = pcp->getUniformLocation( _uidUniformNameID );
orderLocation = pcp->getUniformLocation( _orderUniformNameID );
texMatParentLocation = pcp->getUniformLocation( _texMatParentUniformNameID );
minRangeLocation = pcp->getUniformLocation( _minRangeUniformNameID );
maxRangeLocation = pcp->getUniformLocation( _maxRangeUniformNameID );
}
// apply the tilekey uniform once.
if ( tileKeyLocation >= 0 )
{
ext->glUniform4fv( tileKeyLocation, 1, _tileKeyValue.ptr() );
}
// set the "birth time" - i.e. the time this tile last entered the scene in the current GC.
if ( birthTimeLocation >= 0 )
{
PerContextData& pcd = _pcd[contextID];
if ( pcd.birthTime < 0.0f )
{
const osg::FrameStamp* stamp = state.getFrameStamp();
if ( stamp )
{
pcd.birthTime = stamp->getReferenceTime();
}
}
ext->glUniform1f( birthTimeLocation, pcd.birthTime );
}
// activate the tile coordinate set - same for all layers
if ( renderColor )
//.........这里部分代码省略.........
示例3: readonly
//.........这里部分代码省略.........
ProgramMap::const_iterator p = _programCache.find( vec );
if ( p != _programCache.end() )
{
program = p->second.get();
}
else
{
ShaderVector keyVector;
//OE_NOTICE << LC << "Building new Program for VP " << getName() << std::endl;
program = buildProgram(
getName(),
state,
accumFunctions,
accumShaderMap,
accumAttribBindings,
accumAttribAliases,
_template.get(),
keyVector);
// global sharing.
s_programRepo.share(program);
// finally, put own new program in the cache.
_programCache[ keyVector ] = program;
}
}
}
// finally, apply the program attribute.
if ( program.valid() )
{
const unsigned int contextID = state.getContextID();
const osg::GL2Extensions* extensions = osg::GL2Extensions::Get(contextID,true);
osg::Program::PerContextProgram* pcp = program->getPCP( contextID );
bool useProgram = state.getLastAppliedProgramObject() != pcp;
#ifdef DEBUG_APPLY_COUNTS
{
// debugging
static int s_framenum = 0;
static Threading::Mutex s_mutex;
static std::map< const VirtualProgram*, std::pair<int,int> > s_counts;
Threading::ScopedMutexLock lock(s_mutex);
int framenum = state.getFrameStamp()->getFrameNumber();
if ( framenum > s_framenum )
{
OE_NOTICE << LC << "Applies in last frame: " << std::endl;
for(std::map<const VirtualProgram*,std::pair<int,int> >::iterator i = s_counts.begin(); i != s_counts.end(); ++i)
{
std::pair<int,int>& counts = i->second;
OE_NOTICE << LC << " "
<< i->first->getName() << " : " << counts.second << "/" << counts.first << std::endl;
}
s_framenum = framenum;
s_counts.clear();
}
s_counts[this].first++;
if ( useProgram )
s_counts[this].second++;
}
#endif
if ( useProgram )
{
if( pcp->needsLink() )
program->compileGLObjects( state );
if( pcp->isLinked() )
{
if( osg::isNotifyEnabled(osg::INFO) )
pcp->validateProgram();
pcp->useProgram();
state.setLastAppliedProgramObject( pcp );
}
else
{
// program not usable, fallback to fixed function.
extensions->glUseProgram( 0 );
state.setLastAppliedProgramObject(0);
OE_WARN << LC << "Program link failure!" << std::endl;
}
}
//program->apply( state );
#if 0 // test code for detecting race conditions
for(int i=0; i<10000; ++i) {
state.setLastAppliedProgramObject(0L);
program->apply( state );
}
#endif
}
}
示例4: lock
void
VirtualProgram::apply( osg::State& state ) const
{
if (_shaderMap.empty() && !_inheritSet)
{
// If there's no data in the VP, and never has been, unload any existing program.
// NOTE: OSG's State processor creates a "global default attribute" for each type.
// Sine we have no way of knowing whether the user created the VP or OSG created it
// as the default fallback, we use the "_inheritSet" flag to differeniate. This
// prevents any shader leakage from a VP-enabled node.
const unsigned int contextID = state.getContextID();
const osg::GL2Extensions* extensions = osg::GL2Extensions::Get(contextID,true);
if( ! extensions->isGlslSupported() ) return;
extensions->glUseProgram( 0 );
state.setLastAppliedProgramObject(0);
return;
}
#ifdef APPLY_DEBUG_COUNTS
{
Threading::ScopedMutexLock lock(s_mutex);
int framenum = state.getFrameStamp()->getFrameNumber();
if ( framenum > s_framenum )
{
OE_INFO << LC << "Applies in last frame: " << std::endl;
for(std::map<const VirtualProgram*,int>::iterator i = s_counts.begin(); i != s_counts.end(); ++i)
{
OE_INFO << LC << " " << i->first->getName() << " : " << i->second << std::endl;
i->second = 0;
}
s_framenum = framenum;
s_counts.clear();
}
s_counts[this]++;
}
#endif
// first, find and collect all the VirtualProgram attributes:
ShaderMap accumShaderMap;
AttribBindingList accumAttribBindings;
AttribAliasMap accumAttribAliases;
if ( _inherit )
{
const StateHack::AttributeVec* av = StateHack::GetAttributeVec( state, this );
if ( av && av->size() > 0 )
{
// find the deepest VP that doesn't inherit:
unsigned start = 0;
for( start = (int)av->size()-1; start > 0; --start )
{
const VirtualProgram* vp = dynamic_cast<const VirtualProgram*>( (*av)[start].first );
if ( vp && (vp->_mask & _mask) && vp->_inherit == false )
break;
}
// collect shaders from there to here:
for( unsigned i=start; i<av->size(); ++i )
{
const VirtualProgram* vp = dynamic_cast<const VirtualProgram*>( (*av)[i].first );
if ( vp && (vp->_mask && _mask) )
{
ShaderMap vpShaderMap;
vp->getShaderMap( vpShaderMap );
for( ShaderMap::const_iterator i = vpShaderMap.begin(); i != vpShaderMap.end(); ++i )
{
addToAccumulatedMap( accumShaderMap, i->first, i->second );
}
const AttribBindingList& abl = vp->getAttribBindingList();
accumAttribBindings.insert( abl.begin(), abl.end() );
#ifdef USE_ATTRIB_ALIASES
const AttribAliasMap& aliases = vp->getAttribAliases();
accumAttribAliases.insert( aliases.begin(), aliases.end() );
#endif
}
}
}
}
// next add the local shader components to the map, respecting the override values:
{
Threading::ScopedReadLock readonly(_dataModelMutex);
for( ShaderMap::const_iterator i = _shaderMap.begin(); i != _shaderMap.end(); ++i )
{
addToAccumulatedMap( accumShaderMap, i->first, i->second );
}
const AttribBindingList& abl = this->getAttribBindingList();
accumAttribBindings.insert( abl.begin(), abl.end() );
#ifdef USE_ATTRIB_ALIASES
const AttribAliasMap& aliases = this->getAttribAliases();
accumAttribAliases.insert( aliases.begin(), aliases.end() );
#endif
}
//.........这里部分代码省略.........