Added osgmultiplecameras example and support for pre/post multiplaction.

This commit is contained in:
Robert Osfield
2005-06-15 10:59:10 +00:00
parent 71122ff38f
commit dfaed083ea
9 changed files with 351 additions and 15 deletions

View File

@@ -1029,8 +1029,29 @@ void CullVisitor::apply(osg::CameraNode& camera)
StateSet* node_state = camera.getStateSet();
if (node_state) pushStateSet(node_state);
// use render to texture stage.
if (camera.getReferenceFrame()==osg::Transform::ABSOLUTE_RF)
{
pushProjectionMatrix(createOrReuseMatrix(camera.getProjectionMatrix()));
pushModelViewMatrix(createOrReuseMatrix(camera.getViewMatrix()));
}
else if (camera.getTransformOrder()==osg::CameraNode::POST_MULTIPLE)
{
pushProjectionMatrix(createOrReuseMatrix(getProjectionMatrix()*camera.getProjectionMatrix()));
pushModelViewMatrix(createOrReuseMatrix(getModelViewMatrix()*camera.getViewMatrix()));
}
else // pre multiple
{
pushProjectionMatrix(createOrReuseMatrix(camera.getProjectionMatrix()*getProjectionMatrix()));
pushModelViewMatrix(createOrReuseMatrix(camera.getViewMatrix()*getModelViewMatrix()));
}
if (camera.getRenderOrder()==osg::CameraNode::NESTED_RENDER)
{
handle_cull_callbacks_and_traverse(camera);
}
else
{
// use render to texture stage.
// create the render to texture stage.
osg::ref_ptr<osgUtil::RenderToTextureStage> rtts = new osgUtil::RenderToTextureStage;
@@ -1056,20 +1077,12 @@ void CullVisitor::apply(osg::CameraNode& camera)
// set the current renderbin to be the newly created stage.
setCurrentRenderBin(rtts.get());
pushProjectionMatrix(new osg::RefMatrix(camera.getProjectionMatrix()));
pushModelViewMatrix(new osg::RefMatrix(camera.getViewMatrix()));
// traverse the subgraph
{
handle_cull_callbacks_and_traverse(camera);
}
// restore the previous model view matrix.
popModelViewMatrix();
// restore the previous model view matrix.
popProjectionMatrix();
// restore the previous renderbin.
setCurrentRenderBin(previousRenderBin);
@@ -1088,10 +1101,7 @@ void CullVisitor::apply(osg::CameraNode& camera)
case osg::CameraNode::PRE_RENDER :
getCurrentRenderBin()->getStage()->addPreRenderStage(rtts.get());
break;
case osg::CameraNode::NESTED_RENDER :
getCurrentRenderBin()->getStage()->addPostRenderStage(rtts.get());
break;
case osg::CameraNode::POST_RENDER :
default :
getCurrentRenderBin()->getStage()->addPostRenderStage(rtts.get());
break;
}
@@ -1112,6 +1122,12 @@ void CullVisitor::apply(osg::CameraNode& camera)
}
// restore the previous model view matrix.
popModelViewMatrix();
// restore the previous model view matrix.
popProjectionMatrix();
// pop the node's state off the render graph stack.
if (node_state) popStateSet();