Added getBound() to begining of osgProducer::CameraGroup::frame() to ensure that the parallel cull traversals don't all do a getBound(). Added osgProducer::CameraGroup::getTopMostSceneData() convinience method.
211 lines
5.2 KiB
C++
211 lines
5.2 KiB
C++
//Open Producer - Copyright (C) 2002 Don Burns
|
|
//Distributed under the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE (LGPL)
|
|
//as published by the Free Software Foundation.
|
|
|
|
#include <osgProducer/CameraGroup>
|
|
|
|
using namespace osgProducer;
|
|
|
|
CameraGroup::CameraGroup() : Producer::CameraGroup()
|
|
{
|
|
_init();
|
|
}
|
|
|
|
CameraGroup::CameraGroup(Producer::CameraConfig *cfg): Producer::CameraGroup(cfg)
|
|
{
|
|
_init();
|
|
}
|
|
|
|
CameraGroup::CameraGroup(const std::string& configFile) : Producer::CameraGroup(configFile)
|
|
{
|
|
_init();
|
|
}
|
|
|
|
void CameraGroup::_init()
|
|
{
|
|
_scene_data = NULL;
|
|
_global_stateset = NULL;
|
|
_background_color.set( 0.2f, 0.2f, 0.4f, 1.0f );
|
|
_LODScale = 1.0f;
|
|
|
|
_fusionDistanceMode = osgUtil::SceneView::USE_CAMERA_FUSION_DISTANCE;
|
|
_fusionDistanceValue = 1.0f;
|
|
|
|
_initialized = false;
|
|
|
|
if (!_frameStamp) _frameStamp = new osg::FrameStamp;
|
|
|
|
// set up the maximum number of graphics contexts, before loading the scene graph
|
|
// to ensure that texture objects and display buffers are configured to the correct size.
|
|
osg::DisplaySettings::instance()->setMaxNumberOfGraphicsContexts( getNumberOfCameras() );
|
|
|
|
}
|
|
|
|
void CameraGroup::setSceneData( osg::Node *scene )
|
|
{
|
|
if (_scene_data==scene) return;
|
|
|
|
if (_scene_decorator.valid() && _scene_data.valid())
|
|
{
|
|
_scene_decorator->removeChild(_scene_data.get());
|
|
}
|
|
|
|
_scene_data = scene;
|
|
|
|
if (_scene_decorator.valid() && _scene_data.valid())
|
|
{
|
|
_scene_decorator->addChild(scene);
|
|
}
|
|
|
|
setUpSceneViewsWithData();
|
|
}
|
|
|
|
void CameraGroup::setSceneDecorator( osg::Group* decorator)
|
|
{
|
|
if (_scene_decorator==decorator) return;
|
|
|
|
_scene_decorator = decorator;
|
|
|
|
if (_scene_data.valid() && decorator)
|
|
{
|
|
decorator->addChild(_scene_data.get());
|
|
}
|
|
setUpSceneViewsWithData();
|
|
}
|
|
|
|
|
|
void CameraGroup::setUpSceneViewsWithData()
|
|
{
|
|
for(SceneHandlerList::iterator p = _shvec.begin(); p != _shvec.end(); p++ )
|
|
{
|
|
if (_scene_decorator.valid())
|
|
{
|
|
(*p)->setSceneData( _scene_decorator.get() );
|
|
}
|
|
else if (_scene_data.valid())
|
|
{
|
|
(*p)->setSceneData( _scene_data.get() );
|
|
|
|
}
|
|
|
|
(*p)->setFrameStamp( _frameStamp.get() );
|
|
(*p)->setGlobalStateSet( _global_stateset.get() );
|
|
(*p)->setBackgroundColor( _background_color );
|
|
(*p)->setLODScale( _LODScale );
|
|
(*p)->setFusionDistance( _fusionDistanceMode, _fusionDistanceValue );
|
|
|
|
}
|
|
}
|
|
|
|
|
|
void CameraGroup::setFrameStamp( osg::FrameStamp* fs )
|
|
{
|
|
_frameStamp = fs;
|
|
setUpSceneViewsWithData();
|
|
}
|
|
|
|
|
|
void CameraGroup::setGlobalStateSet( osg::StateSet *sset )
|
|
{
|
|
_global_stateset = sset;
|
|
setUpSceneViewsWithData();
|
|
}
|
|
|
|
void CameraGroup::setBackgroundColor( const osg::Vec4& backgroundColor )
|
|
{
|
|
_background_color = backgroundColor;
|
|
setUpSceneViewsWithData();
|
|
}
|
|
|
|
void CameraGroup::setLODScale( float scale )
|
|
{
|
|
// need to set a local variable?
|
|
_LODScale = scale;
|
|
setUpSceneViewsWithData();
|
|
}
|
|
|
|
void CameraGroup::setFusionDistance( osgUtil::SceneView::FusionDistanceMode mode,float value)
|
|
{
|
|
// need to set a local variable?
|
|
_fusionDistanceMode = mode;
|
|
_fusionDistanceValue = value;
|
|
setUpSceneViewsWithData();
|
|
}
|
|
|
|
void CameraGroup::advance()
|
|
{
|
|
if( !_initialized ) return;
|
|
CameraGroup::advance();
|
|
}
|
|
|
|
void CameraGroup::realize( ThreadingModel thread_model)
|
|
{
|
|
if( _initialized ) return;
|
|
|
|
|
|
if (!_ds) _ds = osg::DisplaySettings::instance();
|
|
|
|
_ds->setMaxNumberOfGraphicsContexts( _cfg->getNumberOfCameras() );
|
|
|
|
for( unsigned int i = 0; i < _cfg->getNumberOfCameras(); i++ )
|
|
{
|
|
Producer::Camera *cam = _cfg->getCamera(i);
|
|
osgProducer::SceneHandler *sh = new osgProducer::SceneHandler(_ds.get());
|
|
sh->setDefaults();
|
|
if( _global_stateset != NULL )
|
|
sh->setGlobalStateSet( _global_stateset.get() );
|
|
if( _scene_data != NULL )
|
|
sh->setSceneData( _scene_data.get() );
|
|
sh->setBackgroundColor( _background_color);
|
|
sh->getState()->setContextID(i);
|
|
sh->setFrameStamp( _frameStamp.get() );
|
|
_shvec.push_back( sh );
|
|
|
|
cam->setSceneHandler( sh );
|
|
}
|
|
|
|
|
|
setUpSceneViewsWithData();
|
|
|
|
/// Make all statesets the same as the first.
|
|
if( _global_stateset == NULL && _shvec.size() > 0 )
|
|
{
|
|
SceneHandlerList::iterator p;
|
|
p = _shvec.begin();
|
|
_global_stateset = (*p)->getGlobalStateSet();
|
|
p++;
|
|
for( ; p != _shvec.end(); p++ )
|
|
(*p)->setGlobalStateSet( _global_stateset.get() );
|
|
}
|
|
|
|
|
|
Producer::CameraGroup::realize( thread_model );
|
|
_initialized = true;
|
|
}
|
|
|
|
osg::Node* CameraGroup::getTopMostSceneData()
|
|
{
|
|
if (_scene_decorator.valid())
|
|
return _scene_decorator.get();
|
|
else
|
|
return _scene_data.get();
|
|
}
|
|
|
|
const osg::Node* CameraGroup::getTopMostSceneData() const
|
|
{
|
|
if (_scene_decorator.valid())
|
|
return _scene_decorator.get();
|
|
else
|
|
return _scene_data.get();
|
|
}
|
|
|
|
void CameraGroup::frame()
|
|
{
|
|
osg::Node* node = getTopMostSceneData();
|
|
if (node) node->getBound();
|
|
|
|
Producer::CameraGroup::frame();
|
|
_frameStamp->setFrameNumber( _frameStamp->getFrameNumber() + 1 );
|
|
}
|
|
|