Added osgmultiplecameras example and support for pre/post multiplaction.
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user