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

@@ -19,6 +19,7 @@ using namespace osg;
CameraNode::CameraNode():
_clearColor(osg::Vec4(0.0f,0.0f,0.0f,1.0f)),
_clearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT),
_transformOrder(PRE_MULTIPLE),
_renderOrder(POST_RENDER),
_renderTargetImplementation(FRAME_BUFFER)
{
@@ -30,6 +31,7 @@ CameraNode::CameraNode(const CameraNode& camera,const CopyOp& copyop):
_clearColor(camera._clearColor),
_clearMask(camera._clearMask),
_viewport(camera._viewport),
_transformOrder(camera._transformOrder),
_projectionMatrix(camera._projectionMatrix),
_viewMatrix(camera._viewMatrix),
_renderOrder(camera._renderOrder),
@@ -143,7 +145,14 @@ bool CameraNode::computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const
{
if (_referenceFrame==RELATIVE_RF)
{
matrix.preMult(_viewMatrix);
if (_transformOrder==PRE_MULTIPLE)
{
matrix.preMult(_viewMatrix);
}
else
{
matrix.postMult(_viewMatrix);
}
}
else // absolute
{
@@ -158,7 +167,16 @@ bool CameraNode::computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor*) const
if (_referenceFrame==RELATIVE_RF)
{
matrix.postMult(inverse);
if (_transformOrder==PRE_MULTIPLE)
{
// note doing inverse so pre becomes post.
matrix.postMult(inverse);
}
else
{
// note doing inverse so post becomes pre.
matrix.preMult(inverse);
}
}
else // absolute
{

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();