Introduced new osg::View, and osg::RenderInfo classes into the core OSG to help

handle scenes with multiple views with elements that need coordinating on a per view basis.

Added beginings of new osgText::FadeText class (not functionality yet).
This commit is contained in:
Robert Osfield
2006-09-18 20:54:48 +00:00
parent fa791e99b8
commit def74d3471
41 changed files with 1303 additions and 194 deletions

View File

@@ -20,7 +20,7 @@ using namespace osg;
BlendColor::BlendColor() :
_constantColor(0.0f,0.0f,0.0f,0.0f)
_constantColor(1.0f,1.0f,1.0f,1.0f)
{
}

View File

@@ -16,6 +16,7 @@
using namespace osg;
CameraNode::CameraNode():
_view(0),
_clearColor(osg::Vec4(0.0f,0.0f,0.0f,1.0f)),
_clearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT),
_transformOrder(PRE_MULTIPLY),
@@ -32,6 +33,7 @@ CameraNode::CameraNode():
CameraNode::CameraNode(const CameraNode& camera,const CopyOp& copyop):
Transform(camera,copyop),
CullSettings(camera),
_view(camera._view),
_clearColor(camera._clearColor),
_clearMask(camera._clearMask),
_colorMask(camera._colorMask),

View File

@@ -115,6 +115,7 @@ CXXFILES =\
Vec3.cpp\
Version.cpp\
VertexProgram.cpp\
View.cpp\
Viewport.cpp\
DEF += -DOSG_LIBRARY

View File

@@ -11,6 +11,7 @@
#include <osg/StateAttribute>
#include <osg/StateSet>
#include <osg/State>
#include <osg/Notify>
#include <algorithm>

221
src/osg/View.cpp Normal file
View File

@@ -0,0 +1,221 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#include <osg/View>
#include <osg/Notify>
using namespace osg;
// use this cull callback to allow the camera to traverse the View's children without
// actuall having them assigned as children to the camea itself. This make the camera a
// decorator without ever directly being assigned to it.
class ViewCameraTraverseNodeCallback : public osg::NodeCallback
{
public:
ViewCameraTraverseNodeCallback(osg::View* view):_view(view) {}
virtual void operator()(osg::Node*, osg::NodeVisitor* nv)
{
_view->Group::traverse(*nv);
}
osg::View* _view;
};
View::View()
{
setReferenceFrame(osg::Transform::ABSOLUTE_RF);
}
/** Copy constructor using CopyOp to manage deep vs shallow copy.*/
View::View(const View& view,const CopyOp& copyop):
Transform(view,copyop),
CullSettings(view),
_projectionMatrix(view._projectionMatrix),
_viewMatrix(view._viewMatrix)
{
// need to clone the cameras.
for(unsigned int i=0; i<view.getNumCameras(); ++i)
{
const CameraData& cd = view.getCameraData(i);
addCamera(dynamic_cast<osg::CameraNode*>(cd._camera->clone(copyop)), cd._projectionOffset, cd._viewOffset);
}
}
View::~View()
{
// detatch the cameras from this View to prevent dangling pointers
for(CameraList::iterator itr = _cameras.begin();
itr != _cameras.end();
++itr)
{
CameraData& cd = *itr;
cd._camera->setView(0);
cd._camera->setCullCallback(0);
}
}
Matrixd View::getInverseViewMatrix() const
{
Matrixd inverse;
inverse.invert(_viewMatrix);
return inverse;
}
void View::setProjectionMatrixAsOrtho(double left, double right,
double bottom, double top,
double zNear, double zFar)
{
setProjectionMatrix(osg::Matrixd::ortho(left, right,
bottom, top,
zNear, zFar));
}
void View::setProjectionMatrixAsOrtho2D(double left, double right,
double bottom, double top)
{
setProjectionMatrix(osg::Matrixd::ortho2D(left, right,
bottom, top));
}
void View::setProjectionMatrixAsFrustum(double left, double right,
double bottom, double top,
double zNear, double zFar)
{
setProjectionMatrix(osg::Matrixd::frustum(left, right,
bottom, top,
zNear, zFar));
}
void View::setProjectionMatrixAsPerspective(double fovy,double aspectRatio,
double zNear, double zFar)
{
setProjectionMatrix(osg::Matrixd::perspective(fovy,aspectRatio,
zNear, zFar));
}
bool View::getProjectionMatrixAsOrtho(double& left, double& right,
double& bottom, double& top,
double& zNear, double& zFar)
{
return _projectionMatrix.getOrtho(left, right,
bottom, top,
zNear, zFar);
}
bool View::getProjectionMatrixAsFrustum(double& left, double& right,
double& bottom, double& top,
double& zNear, double& zFar)
{
return _projectionMatrix.getFrustum(left, right,
bottom, top,
zNear, zFar);
}
bool View::getProjectionMatrixAsPerspective(double& fovy,double& aspectRatio,
double& zNear, double& zFar)
{
return _projectionMatrix.getPerspective(fovy, aspectRatio, zNear, zFar);
}
void View::setViewMatrixAsLookAt(const Vec3& eye,const Vec3& center,const Vec3& up)
{
setViewMatrix(osg::Matrixd::lookAt(eye,center,up));
}
void View::getViewMatrixAsLookAt(Vec3& eye,Vec3& center,Vec3& up,float lookDistance)
{
_viewMatrix.getLookAt(eye,center,up,lookDistance);
}
bool View::computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const
{
if (_referenceFrame==RELATIVE_RF)
{
matrix.preMult(_viewMatrix);
}
else // absolute
{
matrix = _viewMatrix;
}
return true;
}
bool View::computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor*) const
{
const Matrixd& inverse = getInverseViewMatrix();
if (_referenceFrame==RELATIVE_RF)
{
// note doing inverse so pre becomes post.
matrix.postMult(inverse);
}
else // absolute
{
matrix = inverse;
}
return true;
}
void View::updateCameras()
{
for(CameraList::iterator itr = _cameras.begin();
itr != _cameras.end();
++itr)
{
CameraData& cd = *itr;
cd._camera->setProjectionMatrix(cd._projectionOffset * _projectionMatrix);
cd._camera->setViewMatrix(cd._viewOffset * _viewMatrix);
cd._camera->inheritCullSettings(*this);
}
}
bool View::addCamera(osg::CameraNode* camera, const osg::Matrix& projectionOffset, const osg::Matrix& viewOffset)
{
if (!camera) return false;
ViewCameraTraverseNodeCallback* cb = new ViewCameraTraverseNodeCallback(this);
camera->setCullCallback(cb);
camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
camera->setProjectionMatrix(projectionOffset * _projectionMatrix);
camera->setViewMatrix(viewOffset * _viewMatrix);
camera->inheritCullSettings(*this);
_cameras.push_back(CameraData(camera, projectionOffset, viewOffset));
osg::notify(osg::NOTICE)<<"Added camera"<<std::endl;
return true;
}
bool View::removeCamera(unsigned int pos)
{
if (pos >= _cameras.size()) return false;
_cameras[pos]._camera->setView(0);
_cameras[pos]._camera->setCullCallback(0);
_cameras.erase(_cameras.begin()+pos);
osg::notify(osg::NOTICE)<<"Removed camera"<<std::endl;
return true;
}

View File

@@ -871,18 +871,18 @@ PrecipitationEffect::PrecipitationDrawable::PrecipitationDrawable(const Precipit
void PrecipitationEffect::PrecipitationDrawable::drawImplementation(osg::State& state) const
void PrecipitationEffect::PrecipitationDrawable::drawImplementation(osg::RenderInfo& renderInfo) const
{
if (!_geometry) return;
const osg::Geometry::Extensions* extensions = osg::Geometry::getExtensions(state.getContextID(),true);
const osg::Geometry::Extensions* extensions = osg::Geometry::getExtensions(renderInfo.getContextID(),true);
// save OpenGL matrices
glPushMatrix();
if (_requiresPreviousMatrix)
{
state.setActiveTextureUnit(0);
renderInfo.getState()->setActiveTextureUnit(0);
glMatrixMode( GL_TEXTURE );
glPushMatrix();
}
@@ -931,7 +931,7 @@ void PrecipitationEffect::PrecipitationDrawable::drawImplementation(osg::State&
glLoadMatrix((*itr)->second.modelview.ptr());
}
_geometry->draw(state);
_geometry->draw(renderInfo);
unsigned int numVertices = osg::minimum(_geometry->getVertexArray()->getNumElements(), _numberOfVertices);
glDrawArrays(_drawType, 0, numVertices);

View File

@@ -510,6 +510,9 @@ bool OsgCameraGroup::realize()
}
_shvec.clear();
// create the osg::View to keep track of complete views in an OSG centric way.
_view = new osg::View;
osg::Node* node = getTopMostSceneData();
if (node)
@@ -549,6 +552,11 @@ bool OsgCameraGroup::realize()
osgUtil::SceneView* sv = sh->getSceneView();
sv->setDefaults(_realizeSceneViewOptions);
// note, should really compute the projection and view offsets...
// but not critical as Producer controls the CameraNode matrices via SceneView.
_view->addCamera(sv->getCamera());
sv->setView(_view.get());
if (_renderSurfaceStateMap.count(rs)==0)
{

View File

@@ -225,21 +225,21 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayHelp()
ditr!=_descriptionList.end();
++ditr)
{
(*ditr)->draw(*(sv->getState()));
(*ditr)->draw(sv->getRenderInfo());
}
for(TextList::iterator oitr=_optionList.begin();
oitr!=_optionList.end();
++oitr)
{
(*oitr)->draw(*(sv->getState()));
(*oitr)->draw(sv->getRenderInfo());
}
for(TextList::iterator eitr=_explanationList.begin();
eitr!=_explanationList.end();
++eitr)
{
(*eitr)->draw(*(sv->getState()));
(*eitr)->draw(sv->getRenderInfo());
}
}
@@ -425,7 +425,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
// update and draw the frame rate text.
_frameRateLabelText->draw(*(sv->getState()));
_frameRateLabelText->draw(sv->getRenderInfo());
if (_fs.size()>1)
{
unsigned int lindex = (_index + 1) % _fs.size();
@@ -434,7 +434,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
sprintf(tmpText,"%4.2f",1.0/timePerFrame);
_frameRateCounterText->setText(tmpText);
}
_frameRateCounterText->draw(*(sv->getState()));
_frameRateCounterText->draw(sv->getRenderInfo());
if (_veh->getFrameStatsMode()>=ViewerEventHandler::CAMERA_STATS)
@@ -462,7 +462,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
sprintf(tmpText,"%4.2f",1000.0*updateTime/(double)_fs.size());
_updateTimeText->setText(tmpText);
_updateTimeText->draw(*(sv->getState()));
_updateTimeText->draw(sv->getRenderInfo());
TextList::iterator itr;
CameraTimes::iterator titr;
@@ -472,7 +472,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
{
sprintf(tmpText,"%4.2f",1000.0*(*titr)/(double)_fs.size());
(*itr)->setText(tmpText);
(*itr)->draw(*(sv->getState()));
(*itr)->draw(sv->getRenderInfo());
}
for(itr=_drawTimeText.begin(),titr = _drawTimes.begin();
@@ -481,7 +481,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
{
sprintf(tmpText,"%4.2f",1000.0*(*titr)/(double)_fs.size());
(*itr)->setText(tmpText);
(*itr)->draw(*(sv->getState()));
(*itr)->draw(sv->getRenderInfo());
}
unsigned int i;
@@ -495,7 +495,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
gpuTimingsValid = true;
sprintf(tmpText,"%4.2f", gpuTime);
(*itr)->setText(tmpText);
(*itr)->draw(*(sv->getState()));
(*itr)->draw(sv->getRenderInfo());
}
}
@@ -505,7 +505,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
{
if (gpuTimingsValid || ((*itr)->getName()!="GPU"))
{
(*itr)->draw(*(sv->getState()));
(*itr)->draw(sv->getRenderInfo());
}
}
}
@@ -533,20 +533,20 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
itr != _sceneStatsLabelList.end();
++itr)
{
(*itr)->draw(*(sv->getState()));
(*itr)->draw(sv->getRenderInfo());
}
sprintf(tmpText,"%d",stats._vertexCount);
_numVerticesText->setText(tmpText);
_numVerticesText->draw(*(sv->getState()));
_numVerticesText->draw(sv->getRenderInfo());
sprintf(tmpText,"%d",primitives);
_numPrimitivesText->setText(tmpText);
_numPrimitivesText->draw(*(sv->getState()));
_numPrimitivesText->draw(sv->getRenderInfo());
sprintf(tmpText,"%d",stats.numDrawables);
_numDrawablesText->setText(tmpText);
_numDrawablesText->draw(*(sv->getState()));
_numDrawablesText->draw(sv->getRenderInfo());
}
}

233
src/osgText/FadeText.cpp Normal file
View File

@@ -0,0 +1,233 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#include <osgText/FadeText>
#include <osg/Notify>
#include <osg/io_utils>
#include <OpenThreads/Mutex>
#include <OpenThreads/ScopedLock>
using namespace osgText;
struct FadeTextUserData : public osg::Referenced
{
FadeTextUserData():
_frameNumber(0) {}
typedef std::list<FadeText*> FadeTextList;
unsigned int _frameNumber;
FadeTextList _fadeTextInView;
};
struct GlobalFadeText : public osg::Referenced
{
typedef std::set< osg::ref_ptr<FadeTextUserData> > UserDataSet;
typedef std::set<FadeText*> FadeTextSet;
typedef std::map<osg::View*, UserDataSet> ViewUserDataMap;
typedef std::map<osg::View*, FadeTextSet> ViewFadeTextMap;
GlobalFadeText():
_frameNumber(0xffffffff)
{
}
FadeTextUserData* createNewFadeTextUserData(osg::View* view)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
FadeTextUserData* userData = new FadeTextUserData;
if (!userData)
{
osg::notify(osg::NOTICE)<<"Memory error, unable to create FadeTextUserData."<<std::endl;
return 0;
}
_viewMap[view].insert(userData);
return userData;
}
void update(unsigned int frameNumber)
{
_frameNumber = frameNumber;
osg::notify(osg::NOTICE)<<"New frame, updating GlobalFadeText structure."<<std::endl;
for(GlobalFadeText::ViewUserDataMap::iterator vitr = _viewMap.begin();
vitr != _viewMap.end();
++vitr)
{
osg::View* view = vitr->first;
FadeTextSet& fadeTextSet = _viewFadeTextMap[view];
fadeTextSet.clear();
for(GlobalFadeText::UserDataSet::iterator uitr = vitr->second.begin();
uitr != vitr->second.end();
++uitr)
{
FadeTextUserData* userData = uitr->get();
int frameDelta = frameNumber - userData->_frameNumber;
if (frameDelta<=1)
{
for(FadeTextUserData::FadeTextList::iterator fitr = userData->_fadeTextInView.begin();
fitr != userData->_fadeTextInView.end();
++fitr)
{
FadeText* fadeText = *fitr;
fadeTextSet.insert(fadeText);
}
}
}
osg::notify(osg::NOTICE)<<" view="<<view<<"\tnumOfText="<<fadeTextSet.size()<<std::endl;
}
}
inline void updateIfRequired(unsigned int frameNumber)
{
if (_frameNumber!=frameNumber) update(frameNumber);
}
unsigned int _frameNumber;
OpenThreads::Mutex _mutex;
ViewUserDataMap _viewMap;
ViewFadeTextMap _viewFadeTextMap;
};
GlobalFadeText* getGlobalFadeText()
{
static osg::ref_ptr<GlobalFadeText> s_globalFadeText = new GlobalFadeText;
return s_globalFadeText.get();
}
struct FadeTextUpdateCallback : public osg::Drawable::UpdateCallback
{
virtual void update(osg::NodeVisitor* nv, osg::Drawable* drawable)
{
osgText::FadeText* fadeText = dynamic_cast<osgText::FadeText*>(drawable);
if (!fadeText) return;
unsigned int frameNumber = nv->getFrameStamp()->getFrameNumber();
osg::notify(osg::NOTICE)<<"Update FadeText "<<fadeText<<std::endl;
typedef std::set<FadeText*> FadeTextSet;
GlobalFadeText* gft = getGlobalFadeText();
gft->updateIfRequired(frameNumber);
osgText::FadeText::ViewBlendColourMap& vbcm = fadeText->getViewBlendColourMap();
GlobalFadeText::ViewFadeTextMap& vftm = gft->_viewFadeTextMap;
for(GlobalFadeText::ViewFadeTextMap::iterator itr = vftm.begin();
itr != vftm.end();
++itr)
{
osg::View* view = itr->first;
FadeTextSet& fadeTextSet = itr->second;
if (fadeTextSet.count(fadeText)==0)
{
osg::notify(osg::NOTICE)<<"Text "<<fadeText<<" not in "<<view<<std::endl;
}
else
{
osg::notify(osg::NOTICE)<<"Text "<<fadeText<<" is in "<<view<<std::endl;
}
osg::Vec4& tec = vbcm[view];
tec.set(1.0f,1.0f,1.0f, 0.5f + 0.5f * sin( float(frameNumber)*0.1));
}
}
};
FadeText::FadeText()
{
init();
}
FadeText::FadeText(const Text& text,const osg::CopyOp& copyop):
Text(text,copyop)
{
init();
}
void FadeText::init()
{
setUpdateCallback(new FadeTextUpdateCallback());
}
void FadeText::drawImplementation(osg::RenderInfo& renderInfo) const
{
ViewBlendColourMap::iterator itr = _viewBlendColourMap.find(renderInfo.getView());
if (itr != _viewBlendColourMap.end())
{
Text::drawImplementation(*renderInfo.getState(), itr->second );
}
else
{
Text::drawImplementation(*renderInfo.getState(), osg::Vec4(1.0f,1.0f,1.0f,1.0f) );
}
// now pass on new details
FadeTextUserData* userData = dynamic_cast<FadeTextUserData*>(renderInfo.getUserData());
if (!userData)
{
if (renderInfo.getUserData())
{
osg::notify(osg::NOTICE)<<"Warning user data not of supported type."<<std::endl;
return;
}
userData = getGlobalFadeText()->createNewFadeTextUserData(renderInfo.getView());
if (!userData)
{
osg::notify(osg::NOTICE)<<"Memory error, unable to create FadeTextUserData."<<std::endl;
return;
}
renderInfo.setUserData(userData);
}
unsigned int frameNumber = renderInfo.getState()->getFrameStamp()->getFrameNumber();
if (frameNumber != userData->_frameNumber)
{
// new frame so must reset UserData structure.
userData->_frameNumber = frameNumber;
userData->_fadeTextInView.clear();
}
userData->_fadeTextInView.push_back(const_cast<osgText::FadeText*>(this));
osgText::Text::AutoTransformCache& atc = _autoTransformCache[renderInfo.getContextID()];
osg::Matrix& matrix = atc._matrix;
osg::notify(osg::NOTICE)<<"cull Matrix = "<<matrix<<std::endl;
}

View File

@@ -6,6 +6,7 @@ CXXFILES = \
DefaultFont.cpp\
Font.cpp\
Text.cpp\
FadeText.cpp\
String.cpp\
Version.cpp\

View File

@@ -1447,7 +1447,12 @@ void Text::computeColorGradientsPerCharacter() const
}
}
void Text::drawImplementation(osg::State& state) const
void Text::drawImplementation(osg::RenderInfo& renderInfo) const
{
drawImplementation(*renderInfo.getState(), osg::Vec4(1.0f,1.0f,1.0f,1.0f));
}
void Text::drawImplementation(osg::State& state, const osg::Vec4& colorMultiplier) const
{
unsigned int contextID = state.getContextID();
@@ -1536,24 +1541,24 @@ void Text::drawImplementation(osg::State& state) const
switch(_backdropImplementation)
{
case POLYGON_OFFSET:
renderWithPolygonOffset(state);
renderWithPolygonOffset(state,colorMultiplier);
break;
case NO_DEPTH_BUFFER:
renderWithNoDepthBuffer(state);
renderWithNoDepthBuffer(state,colorMultiplier);
break;
case DEPTH_RANGE:
renderWithDepthRange(state);
renderWithDepthRange(state,colorMultiplier);
break;
case STENCIL_BUFFER:
renderWithStencilBuffer(state);
renderWithStencilBuffer(state,colorMultiplier);
break;
default:
renderWithPolygonOffset(state);
renderWithPolygonOffset(state,colorMultiplier);
}
}
else
{
renderOnlyForegroundText(state);
renderOnlyForegroundText(state,colorMultiplier);
}
}
@@ -1572,7 +1577,7 @@ void Text::drawImplementation(osg::State& state) const
osg::Vec3 c01(osg::Vec3(_textBB.xMin(),_textBB.yMax(),_textBB.zMin())*matrix);
glColor4f(1.0f,1.0f,0.0f,1.0f);
glColor4fv(colorMultiplier.ptr());
glBegin(GL_LINE_LOOP);
glVertex3fv(c00.ptr());
glVertex3fv(c10.ptr());
@@ -1584,7 +1589,7 @@ void Text::drawImplementation(osg::State& state) const
if (_drawMode & ALIGNMENT)
{
glColor4f(1.0f,0.0f,1.0f,1.0f);
glColor4fv(colorMultiplier.ptr());
float cursorsize = _characterHeight*0.5f;
@@ -1895,7 +1900,7 @@ void Text::convertRgbToHsv( float rgb[], float hsv[] ) const
}
void Text::drawForegroundText(osg::State& state, const GlyphQuads& glyphquad) const
void Text::drawForegroundText(osg::State& state, const GlyphQuads& glyphquad, const osg::Vec4& colorMultiplier) const
{
unsigned int contextID = state.getContextID();
@@ -1908,7 +1913,7 @@ void Text::drawForegroundText(osg::State& state, const GlyphQuads& glyphquad) co
if(_colorGradientMode == SOLID)
{
state.disableColorPointer();
glColor4fv(_color.ptr());
glColor4f(colorMultiplier.r()*_color.r(),colorMultiplier.g()*_color.g(),colorMultiplier.b()*_color.b(),colorMultiplier.a()*_color.a());
}
else
{
@@ -1920,7 +1925,7 @@ void Text::drawForegroundText(osg::State& state, const GlyphQuads& glyphquad) co
}
}
void Text::renderOnlyForegroundText(osg::State& state) const
void Text::renderOnlyForegroundText(osg::State& state, const osg::Vec4& colorMultiplier) const
{
for(TextureGlyphQuadMap::iterator titr=_textureGlyphQuadMap.begin();
titr!=_textureGlyphQuadMap.end();
@@ -1931,13 +1936,13 @@ void Text::renderOnlyForegroundText(osg::State& state) const
const GlyphQuads& glyphquad = titr->second;
drawForegroundText(state, glyphquad);
drawForegroundText(state, glyphquad, colorMultiplier);
}
}
void Text::renderWithPolygonOffset(osg::State& state) const
void Text::renderWithPolygonOffset(osg::State& state, const osg::Vec4& colorMultiplier) const
{
unsigned int contextID = state.getContextID();
@@ -1992,14 +1997,14 @@ void Text::renderWithPolygonOffset(osg::State& state) const
// Reset the polygon offset so the foreground text is on top
glPolygonOffset(0.0f,0.0f);
drawForegroundText(state, glyphquad);
drawForegroundText(state, glyphquad, colorMultiplier);
}
glPopAttrib();
}
void Text::renderWithNoDepthBuffer(osg::State& state) const
void Text::renderWithNoDepthBuffer(osg::State& state, const osg::Vec4& colorMultiplier) const
{
unsigned int contextID = state.getContextID();
@@ -2042,14 +2047,14 @@ void Text::renderWithNoDepthBuffer(osg::State& state) const
}
}
drawForegroundText(state, glyphquad);
drawForegroundText(state, glyphquad, colorMultiplier);
}
glPopAttrib();
}
// This idea comes from Paul Martz's OpenGL FAQ: 13.050
void Text::renderWithDepthRange(osg::State& state) const
void Text::renderWithDepthRange(osg::State& state, const osg::Vec4& colorMultiplier) const
{
unsigned int contextID = state.getContextID();
@@ -2099,13 +2104,13 @@ void Text::renderWithDepthRange(osg::State& state) const
glDepthRange(0.0, 1.0);
drawForegroundText(state, glyphquad);
drawForegroundText(state, glyphquad, colorMultiplier);
}
glPopAttrib();
}
void Text::renderWithStencilBuffer(osg::State& state) const
void Text::renderWithStencilBuffer(osg::State& state, const osg::Vec4& colorMultiplier) const
{
/* Here are the steps:
* 1) Disable drawing color
@@ -2256,7 +2261,7 @@ void Text::renderWithStencilBuffer(osg::State& state) const
}
}
drawForegroundText(state, glyphquad);
drawForegroundText(state, glyphquad, colorMultiplier);
}
glPopAttrib();

View File

@@ -740,7 +740,7 @@ void CullVisitor::apply(Geode& node)
if( drawable->getCullCallback() )
{
if( drawable->getCullCallback()->cull( this, drawable, _state.valid()?_state.get():NULL ) == true )
if( drawable->getCullCallback()->cull( this, drawable, &_renderInfo ) == true )
continue;
}

View File

@@ -352,17 +352,19 @@ RenderBin* RenderBin::find_or_insert(int binNum,const std::string& binName)
return rb;
}
void RenderBin::draw(osg::State& state,RenderLeaf*& previous)
void RenderBin::draw(osg::RenderInfo& renderInfo,RenderLeaf*& previous)
{
if (_drawCallback.valid())
{
_drawCallback->drawImplementation(this,state,previous);
_drawCallback->drawImplementation(this,renderInfo,previous);
}
else drawImplementation(state,previous);
else drawImplementation(renderInfo,previous);
}
void RenderBin::drawImplementation(osg::State& state,RenderLeaf*& previous)
void RenderBin::drawImplementation(osg::RenderInfo& renderInfo,RenderLeaf*& previous)
{
osg::State& state = *renderInfo.getState();
// osg::notify(osg::NOTICE)<<"begin RenderBin::drawImplementation "<<className()<<" sortMode "<<getSortMode()<<std::endl;
if (_stateset.valid())
@@ -381,7 +383,7 @@ void RenderBin::drawImplementation(osg::State& state,RenderLeaf*& previous)
rbitr!=_bins.end() && rbitr->first<0;
++rbitr)
{
rbitr->second->draw(state,previous);
rbitr->second->draw(renderInfo,previous);
}
@@ -391,7 +393,7 @@ void RenderBin::drawImplementation(osg::State& state,RenderLeaf*& previous)
++rlitr)
{
RenderLeaf* rl = *rlitr;
rl->render(state,previous);
rl->render(renderInfo,previous);
previous = rl;
}
@@ -407,7 +409,7 @@ void RenderBin::drawImplementation(osg::State& state,RenderLeaf*& previous)
++dw_itr)
{
RenderLeaf* rl = dw_itr->get();
rl->render(state,previous);
rl->render(renderInfo,previous);
previous = rl;
}
@@ -419,7 +421,7 @@ void RenderBin::drawImplementation(osg::State& state,RenderLeaf*& previous)
rbitr!=_bins.end();
++rbitr)
{
rbitr->second->draw(state,previous);
rbitr->second->draw(renderInfo,previous);
}
if (_stateset.valid())

View File

@@ -17,8 +17,10 @@
using namespace osg;
using namespace osgUtil;
void RenderLeaf::render(State& state,RenderLeaf* previous)
void RenderLeaf::render(osg::RenderInfo& renderInfo,RenderLeaf* previous)
{
osg::State& state = *renderInfo.getState();
// don't draw this leaf if the abort rendering flag has been set.
if (state.getAbortRendering())
{
@@ -55,7 +57,7 @@ void RenderLeaf::render(State& state,RenderLeaf* previous)
// draw the drawable
_drawable->draw(state);
_drawable->draw(renderInfo);
}
else
{
@@ -69,7 +71,7 @@ void RenderLeaf::render(State& state,RenderLeaf* previous)
state.apply(_parent->_stateset);
// draw the drawable
_drawable->draw(state);
_drawable->draw(renderInfo);
}
// osg::notify(osg::NOTICE)<<"RenderLeaf "<<_drawable->getName()<<" "<<_depth<<std::endl;

View File

@@ -195,7 +195,7 @@ void RenderStage::addPostRenderStage(RenderStage* rs, int order)
}
}
void RenderStage::drawPreRenderStages(osg::State& state,RenderLeaf*& previous)
void RenderStage::drawPreRenderStages(osg::RenderInfo& renderInfo,RenderLeaf*& previous)
{
if (_preRenderList.empty()) return;
@@ -204,18 +204,20 @@ void RenderStage::drawPreRenderStages(osg::State& state,RenderLeaf*& previous)
itr!=_preRenderList.end();
++itr)
{
itr->second->draw(state,previous);
itr->second->draw(renderInfo,previous);
}
//cout << "Done Drawing prerendering stages "<<this<< " "<<_viewport->x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<<std::endl;
}
void RenderStage::runCameraSetUp(osg::State& state)
void RenderStage::runCameraSetUp(osg::RenderInfo& renderInfo)
{
_cameraRequiresSetUp = false;
if (!_camera) return;
osg::State& state = *renderInfo.getState();
osg::CameraNode::RenderTargetImplementation renderTargetImplemntation = _camera->getRenderTargetImplementation();
osg::CameraNode::RenderTargetImplementation renderTargetFallback = _camera->getRenderTargetFallback();
@@ -620,8 +622,10 @@ void RenderStage::runCameraSetUp(osg::State& state)
}
void RenderStage::copyTexture(osg::State& state)
void RenderStage::copyTexture(osg::RenderInfo& renderInfo)
{
osg::State& state = *renderInfo.getState();
if (_readBuffer != GL_NONE)
{
glReadBuffer(_readBuffer);
@@ -690,8 +694,10 @@ void RenderStage::copyTexture(osg::State& state)
#endif
}
void RenderStage::drawInner(osg::State& state,RenderLeaf*& previous, bool& doCopyTexture)
void RenderStage::drawInner(osg::RenderInfo& renderInfo,RenderLeaf*& previous, bool& doCopyTexture)
{
osg::State& state = *renderInfo.getState();
if (_drawBuffer != GL_NONE)
{
glDrawBuffer(_drawBuffer);
@@ -711,7 +717,7 @@ void RenderStage::drawInner(osg::State& state,RenderLeaf*& previous, bool& doCop
}
// do the drawing itself.
RenderBin::draw(state,previous);
RenderBin::draw(renderInfo,previous);
if(state.getCheckForGLErrors()!=osg::State::NEVER_CHECK_GL_ERRORS)
@@ -730,7 +736,7 @@ void RenderStage::drawInner(osg::State& state,RenderLeaf*& previous, bool& doCop
// now copy the rendered image to attached texture.
if (doCopyTexture)
{
copyTexture(state);
copyTexture(renderInfo);
}
if (_image.valid())
@@ -784,9 +790,10 @@ void RenderStage::drawInner(osg::State& state,RenderLeaf*& previous, bool& doCop
struct DrawInnerOperation : public osg::GraphicsThread::Operation
{
DrawInnerOperation(RenderStage* stage) :
DrawInnerOperation(RenderStage* stage, osg::RenderInfo& renderInfo) :
osg::GraphicsThread::Operation("DrawInnerStage",false),
_stage(stage) {}
_stage(stage),
_renderInfo(renderInfo) {}
virtual void operator() (osg::GraphicsContext* context)
{
@@ -795,15 +802,17 @@ struct DrawInnerOperation : public osg::GraphicsThread::Operation
{
RenderLeaf* previous = 0;
bool doCopyTexture = false;
_stage->drawInner(*(context->getState()), previous, doCopyTexture);
_renderInfo.setState(context->getState());
_stage->drawInner(_renderInfo, previous, doCopyTexture);
}
}
RenderStage* _stage;
RenderInfo _renderInfo;
};
void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
void RenderStage::draw(osg::RenderInfo& renderInfo,RenderLeaf*& previous)
{
if (_stageDrawnThisFrame) return;
@@ -811,18 +820,20 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
// note, SceneView does call to drawPreRenderStages explicitly
// so there is no need to call it here.
drawPreRenderStages(state,previous);
drawPreRenderStages(renderInfo,previous);
if (_cameraRequiresSetUp)
{
runCameraSetUp(state);
runCameraSetUp(renderInfo);
}
osg::State& state = *renderInfo.getState();
osg::State* useState = &state;
osg::GraphicsContext* callingContext = state.getGraphicsContext();
osg::GraphicsContext* useContext = callingContext;
osg::GraphicsThread* useThread = 0;
osg::RenderInfo useRenderInfo(renderInfo);
if (_graphicsContext.valid() && _graphicsContext != callingContext)
{
@@ -833,6 +844,7 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
useState = _graphicsContext->getState();
useContext = _graphicsContext.get();
useThread = useContext->getGraphicsThread();
useRenderInfo.setState(useState);
// syncronize the frame stamps
useState->setFrameStamp(const_cast<osg::FrameStamp*>(state.getFrameStamp()));
@@ -846,13 +858,13 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
if (useThread)
{
useThread->add(new DrawInnerOperation( this ), true);
useThread->add(new DrawInnerOperation( this, renderInfo ), true);
doCopyTexture = false;
}
else
{
drawInner( *useState, previous, doCopyTexture);
drawInner( useRenderInfo, previous, doCopyTexture);
}
@@ -865,7 +877,7 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
callingContext->makeContextCurrent(useContext);
}
copyTexture(state);
copyTexture(renderInfo);
}
if (_camera && _camera->getPostDrawCallback())
@@ -887,11 +899,12 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
// place the post draw here temprorarily while we figure out how
// best to do SceneView.
drawPostRenderStages(state,previous);
drawPostRenderStages(renderInfo,previous);
}
void RenderStage::drawImplementation(osg::State& state,RenderLeaf*& previous)
void RenderStage::drawImplementation(osg::RenderInfo& renderInfo,RenderLeaf*& previous)
{
osg::State& state = *renderInfo.getState();
if (!_viewport)
{
@@ -952,12 +965,12 @@ void RenderStage::drawImplementation(osg::State& state,RenderLeaf*& previous)
}
// draw the children and local.
RenderBin::drawImplementation(state,previous);
RenderBin::drawImplementation(renderInfo,previous);
state.apply();
}
void RenderStage::drawPostRenderStages(osg::State& state,RenderLeaf*& previous)
void RenderStage::drawPostRenderStages(osg::RenderInfo& renderInfo,RenderLeaf*& previous)
{
if (_postRenderList.empty()) return;
@@ -966,7 +979,7 @@ void RenderStage::drawPostRenderStages(osg::State& state,RenderLeaf*& previous)
itr!=_postRenderList.end();
++itr)
{
itr->second->draw(state,previous);
itr->second->draw(renderInfo,previous);
}
//cout << "Done Drawing prerendering stages "<<this<< " "<<_viewport->x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<<std::endl;
}

View File

@@ -155,7 +155,7 @@ void SceneView::setDefaults(unsigned int options)
_lightingMode = NO_SCENEVIEW_LIGHT;
}
_state = new State;
_renderInfo.setState(new State);
_rendergraph = new StateGraph;
_renderStage = new RenderStage;
@@ -245,7 +245,7 @@ void SceneView::init()
_initVisitor->setFrameStamp(_frameStamp.get());
GLObjectsVisitor* dlv = dynamic_cast<GLObjectsVisitor*>(_initVisitor.get());
if (dlv) dlv->setState(_state.get());
if (dlv) dlv->setState(_renderInfo.getState());
if (_frameStamp.valid())
{
@@ -460,14 +460,16 @@ void SceneView::cull()
// update the active uniforms
updateUniforms();
if (!_state)
if (!_renderInfo.getState())
{
osg::notify(osg::INFO) << "Warning: no valid osgUtil::SceneView::_state attached, creating a default state automatically."<< std::endl;
// note the constructor for osg::State will set ContextID to 0 which will be fine to single context graphics
// applications which is ok for most apps, but not multiple context/pipe applications.
_state = new osg::State;
_renderInfo.setState(new osg::State);
}
osg::State* state = _renderInfo.getState();
if (!_localStateSet)
{
@@ -477,8 +479,8 @@ void SceneView::cull()
// we in theory should be able to be able to bypass reset, but we'll call it just incase.
//_state->reset();
_state->setFrameStamp(_frameStamp.get());
_state->setDisplaySettings(_displaySettings.get());
state->setFrameStamp(_frameStamp.get());
state->setDisplaySettings(_displaySettings.get());
if (!_cullVisitor)
@@ -655,7 +657,7 @@ void SceneView::cullStage(const osg::Matrixd& projection,const osg::Matrixd& mod
cullVisitor->setStateGraph(rendergraph);
cullVisitor->setRenderStage(renderStage);
cullVisitor->setState( _state.get() );
cullVisitor->setRenderInfo( _renderInfo );
renderStage->reset();
@@ -740,51 +742,57 @@ void SceneView::releaseAllGLObjects()
{
if (!_camera) return;
_camera->releaseGLObjects(_state.get());
_camera->releaseGLObjects(_renderInfo.getState());
// we need to reset State as it keeps handles to Program objects.
if (_state.valid()) _state->reset();
if (_renderInfo.getState()) _renderInfo.getState()->reset();
}
void SceneView::flushAllDeletedGLObjects()
{
osg::State* state = _renderInfo.getState();
_requiresFlush = false;
double availableTime = 100.0f;
double currentTime = _state->getFrameStamp()?_state->getFrameStamp()->getReferenceTime():0.0;
double currentTime = state->getFrameStamp()?state->getFrameStamp()->getReferenceTime():0.0;
osg::FrameBufferObject::flushDeletedFrameBufferObjects(_state->getContextID(),currentTime,availableTime);
osg::RenderBuffer::flushDeletedRenderBuffers(_state->getContextID(),currentTime,availableTime);
osg::Texture::flushAllDeletedTextureObjects(_state->getContextID());
osg::Drawable::flushAllDeletedDisplayLists(_state->getContextID());
osg::Drawable::flushDeletedVertexBufferObjects(_state->getContextID(),currentTime,availableTime);
osg::VertexProgram::flushDeletedVertexProgramObjects(_state->getContextID(),currentTime,availableTime);
osg::FragmentProgram::flushDeletedFragmentProgramObjects(_state->getContextID(),currentTime,availableTime);
osg::Program::flushDeletedGlPrograms(_state->getContextID(),currentTime,availableTime);
osg::Shader::flushDeletedGlShaders(_state->getContextID(),currentTime,availableTime);
osg::FrameBufferObject::flushDeletedFrameBufferObjects(state->getContextID(),currentTime,availableTime);
osg::RenderBuffer::flushDeletedRenderBuffers(state->getContextID(),currentTime,availableTime);
osg::Texture::flushAllDeletedTextureObjects(state->getContextID());
osg::Drawable::flushAllDeletedDisplayLists(state->getContextID());
osg::Drawable::flushDeletedVertexBufferObjects(state->getContextID(),currentTime,availableTime);
osg::VertexProgram::flushDeletedVertexProgramObjects(state->getContextID(),currentTime,availableTime);
osg::FragmentProgram::flushDeletedFragmentProgramObjects(state->getContextID(),currentTime,availableTime);
osg::Program::flushDeletedGlPrograms(state->getContextID(),currentTime,availableTime);
osg::Shader::flushDeletedGlShaders(state->getContextID(),currentTime,availableTime);
}
void SceneView::flushDeletedGLObjects(double& availableTime)
{
osg::State* state = _renderInfo.getState();
_requiresFlush = false;
double currentTime = _state->getFrameStamp()?_state->getFrameStamp()->getReferenceTime():0.0;
double currentTime = state->getFrameStamp()?state->getFrameStamp()->getReferenceTime():0.0;
osg::FrameBufferObject::flushDeletedFrameBufferObjects(_state->getContextID(),currentTime,availableTime);
osg::RenderBuffer::flushDeletedRenderBuffers(_state->getContextID(),currentTime,availableTime);
osg::Texture::flushDeletedTextureObjects(_state->getContextID(),currentTime,availableTime);
osg::Drawable::flushDeletedDisplayLists(_state->getContextID(),availableTime);
osg::Drawable::flushDeletedVertexBufferObjects(_state->getContextID(),currentTime,availableTime);
osg::VertexProgram::flushDeletedVertexProgramObjects(_state->getContextID(),currentTime,availableTime);
osg::FragmentProgram::flushDeletedFragmentProgramObjects(_state->getContextID(),currentTime,availableTime);
osg::Program::flushDeletedGlPrograms(_state->getContextID(),currentTime,availableTime);
osg::Shader::flushDeletedGlShaders(_state->getContextID(),currentTime,availableTime);
osg::FrameBufferObject::flushDeletedFrameBufferObjects(state->getContextID(),currentTime,availableTime);
osg::RenderBuffer::flushDeletedRenderBuffers(state->getContextID(),currentTime,availableTime);
osg::Texture::flushDeletedTextureObjects(state->getContextID(),currentTime,availableTime);
osg::Drawable::flushDeletedDisplayLists(state->getContextID(),availableTime);
osg::Drawable::flushDeletedVertexBufferObjects(state->getContextID(),currentTime,availableTime);
osg::VertexProgram::flushDeletedVertexProgramObjects(state->getContextID(),currentTime,availableTime);
osg::FragmentProgram::flushDeletedFragmentProgramObjects(state->getContextID(),currentTime,availableTime);
osg::Program::flushDeletedGlPrograms(state->getContextID(),currentTime,availableTime);
osg::Shader::flushDeletedGlShaders(state->getContextID(),currentTime,availableTime);
}
void SceneView::draw()
{
osg::State* state = _renderInfo.getState();
// note, to support multi-pipe systems the deletion of OpenGL display list
// and texture objects is deferred until the OpenGL context is the correct
// context for when the object were originally created. Here we know what
@@ -799,7 +807,7 @@ void SceneView::draw()
// assume the the draw which is about to happen could generate GL objects that need flushing in the next frame.
_requiresFlush = true;
_state->setInitialViewMatrix(new osg::RefMatrix(getViewMatrix()));
state->setInitialViewMatrix(new osg::RefMatrix(getViewMatrix()));
RenderLeaf* previous = NULL;
if (_displaySettings.valid() && _displaySettings->getStereo())
@@ -831,12 +839,12 @@ void SceneView::draw()
_renderStageRight->setDrawBuffer(GL_BACK_RIGHT);
_renderStageRight->setReadBuffer(GL_BACK_RIGHT);
_renderStageLeft->drawPreRenderStages(*_state,previous);
_renderStageRight->drawPreRenderStages(*_state,previous);
_renderStageLeft->drawPreRenderStages(_renderInfo,previous);
_renderStageRight->drawPreRenderStages(_renderInfo,previous);
_renderStageLeft->draw(*_state,previous);
_renderStageLeft->draw(_renderInfo,previous);
_renderStageRight->draw(*_state,previous);
_renderStageRight->draw(_renderInfo,previous);
}
break;
@@ -854,8 +862,8 @@ void SceneView::draw()
_localStateSet->setAttribute(getViewport());
_renderStageLeft->drawPreRenderStages(*_state,previous);
_renderStageRight->drawPreRenderStages(*_state,previous);
_renderStageLeft->drawPreRenderStages(_renderInfo,previous);
_renderStageRight->drawPreRenderStages(_renderInfo,previous);
// ensure that left eye color planes are active.
@@ -875,7 +883,7 @@ void SceneView::draw()
_localStateSet->setAttribute(leftColorMask);
// draw left eye.
_renderStageLeft->draw(*_state,previous);
_renderStageLeft->draw(_renderInfo,previous);
@@ -897,7 +905,7 @@ void SceneView::draw()
_renderStageRight->setColorMask(rightColorMask);
// draw right eye.
_renderStageRight->draw(*_state,previous);
_renderStageRight->draw(_renderInfo,previous);
}
break;
@@ -926,8 +934,8 @@ void SceneView::draw()
_renderStageLeft->setColorMask(cmask);
_renderStageRight->setColorMask(cmask);
_renderStageLeft->drawPreRenderStages(*_state,previous);
_renderStageRight->drawPreRenderStages(*_state,previous);
_renderStageLeft->drawPreRenderStages(_renderInfo,previous);
_renderStageRight->drawPreRenderStages(_renderInfo,previous);
int separation = _displaySettings->getSplitStereoHorizontalSeparation();
@@ -948,21 +956,21 @@ void SceneView::draw()
{
_localStateSet->setAttribute(viewportLeft.get());
_renderStageLeft->setViewport(viewportLeft.get());
_renderStageLeft->draw(*_state,previous);
_renderStageLeft->draw(_renderInfo,previous);
_localStateSet->setAttribute(viewportRight.get());
_renderStageRight->setViewport(viewportRight.get());
_renderStageRight->draw(*_state,previous);
_renderStageRight->draw(_renderInfo,previous);
}
else
{
_localStateSet->setAttribute(viewportRight.get());
_renderStageLeft->setViewport(viewportRight.get());
_renderStageLeft->draw(*_state,previous);
_renderStageLeft->draw(_renderInfo,previous);
_localStateSet->setAttribute(viewportLeft.get());
_renderStageRight->setViewport(viewportLeft.get());
_renderStageRight->draw(*_state,previous);
_renderStageRight->draw(_renderInfo,previous);
}
}
@@ -992,8 +1000,8 @@ void SceneView::draw()
_renderStageLeft->setColorMask(cmask);
_renderStageRight->setColorMask(cmask);
_renderStageLeft->drawPreRenderStages(*_state,previous);
_renderStageRight->drawPreRenderStages(*_state,previous);
_renderStageLeft->drawPreRenderStages(_renderInfo,previous);
_renderStageRight->drawPreRenderStages(_renderInfo,previous);
int separation = _displaySettings->getSplitStereoVerticalSeparation();
@@ -1013,21 +1021,21 @@ void SceneView::draw()
{
_localStateSet->setAttribute(viewportTop.get());
_renderStageLeft->setViewport(viewportTop.get());
_renderStageLeft->draw(*_state,previous);
_renderStageLeft->draw(_renderInfo,previous);
_localStateSet->setAttribute(viewportBottom.get());
_renderStageRight->setViewport(viewportBottom.get());
_renderStageRight->draw(*_state,previous);
_renderStageRight->draw(_renderInfo,previous);
}
else
{
_localStateSet->setAttribute(viewportBottom.get());
_renderStageLeft->setViewport(viewportBottom.get());
_renderStageLeft->draw(*_state,previous);
_renderStageLeft->draw(_renderInfo,previous);
_localStateSet->setAttribute(viewportTop.get());
_renderStageRight->setViewport(viewportTop.get());
_renderStageRight->draw(*_state,previous);
_renderStageRight->draw(_renderInfo,previous);
}
}
break;
@@ -1055,8 +1063,8 @@ void SceneView::draw()
_renderStage->setColorMask(cmask);
_localStateSet->setAttribute(getViewport());
_renderStage->drawPreRenderStages(*_state,previous);
_renderStage->draw(*_state,previous);
_renderStage->drawPreRenderStages(_renderInfo,previous);
_renderStage->draw(_renderInfo,previous);
}
break;
case(osg::DisplaySettings::VERTICAL_INTERLACE):
@@ -1077,8 +1085,8 @@ void SceneView::draw()
_renderStageLeft->setColorMask(cmask);
_renderStageRight->setColorMask(cmask);
_renderStageLeft->drawPreRenderStages(*_state,previous);
_renderStageRight->drawPreRenderStages(*_state,previous);
_renderStageLeft->drawPreRenderStages(_renderInfo,previous);
_renderStageRight->drawPreRenderStages(_renderInfo,previous);
glEnable(GL_STENCIL_TEST);
@@ -1086,7 +1094,7 @@ void SceneView::draw()
_interlacedStereoStencilWidth != getViewport()->width() ||
_interlacedStereoStencilHeight != getViewport()->height() )
{
getViewport()->apply(*_state);
getViewport()->apply(*state);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(getViewport()->x(), getViewport()->width(), getViewport()->y(), getViewport()->height(), -1.0, 1.0);
@@ -1117,10 +1125,10 @@ void SceneView::draw()
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glStencilFunc(GL_EQUAL, 0, ~0u);
_renderStageLeft->draw(*_state,previous);
_renderStageLeft->draw(_renderInfo,previous);
glStencilFunc(GL_NOTEQUAL, 0, ~0u);
_renderStageRight->draw(*_state,previous);
_renderStageRight->draw(_renderInfo,previous);
glDisable(GL_STENCIL_TEST);
}
break;
@@ -1142,8 +1150,8 @@ void SceneView::draw()
_renderStageLeft->setColorMask(cmask);
_renderStageRight->setColorMask(cmask);
_renderStageLeft->drawPreRenderStages(*_state,previous);
_renderStageRight->drawPreRenderStages(*_state,previous);
_renderStageLeft->drawPreRenderStages(_renderInfo,previous);
_renderStageRight->drawPreRenderStages(_renderInfo,previous);
glEnable(GL_STENCIL_TEST);
@@ -1151,7 +1159,7 @@ void SceneView::draw()
_interlacedStereoStencilWidth != getViewport()->width() ||
_interlacedStereoStencilHeight != getViewport()->height() )
{
getViewport()->apply(*_state);
getViewport()->apply(*state);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(getViewport()->x(), getViewport()->width(), getViewport()->y(), getViewport()->height(), -1.0, 1.0);
@@ -1182,10 +1190,10 @@ void SceneView::draw()
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glStencilFunc(GL_EQUAL, 0, ~0u);
_renderStageLeft->draw(*_state,previous);
_renderStageLeft->draw(_renderInfo,previous);
glStencilFunc(GL_NOTEQUAL, 0, ~0u);
_renderStageRight->draw(*_state,previous);
_renderStageRight->draw(_renderInfo,previous);
glDisable(GL_STENCIL_TEST);
}
break;
@@ -1223,20 +1231,20 @@ void SceneView::draw()
_renderStage->setColorMask(cmask);
// bog standard draw.
_renderStage->drawPreRenderStages(*_state,previous);
_renderStage->draw(*_state,previous);
_renderStage->drawPreRenderStages(_renderInfo,previous);
_renderStage->draw(_renderInfo,previous);
}
// re apply the defalt OGL state.
_state->popAllStateSets();
_state->apply();
state->popAllStateSets();
state->apply();
if (_camera->getPostDrawCallback())
{
(*(_camera->getPostDrawCallback()))(*_camera);
}
if (_state->getCheckForGLErrors()!=osg::State::NEVER_CHECK_GL_ERRORS)
if (state->getCheckForGLErrors()!=osg::State::NEVER_CHECK_GL_ERRORS)
{
GLenum errorNo = glGetError();
if (errorNo!=GL_NO_ERROR)
@@ -1245,7 +1253,7 @@ void SceneView::draw()
// go into debug mode of OGL error in a fine grained way to help
// track down OpenGL errors.
_state->setCheckForGLErrors(osg::State::ONCE_PER_ATTRIBUTE);
state->setCheckForGLErrors(osg::State::ONCE_PER_ATTRIBUTE);
}
}
}
@@ -1309,7 +1317,7 @@ void SceneView::clearArea(int x,int y,int width,int height,const osg::Vec4& colo
osg::ref_ptr<osg::Viewport> viewport = new osg::Viewport;
viewport->setViewport(x,y,width,height);
_state->applyAttribute(viewport.get());
_renderInfo.getState()->applyAttribute(viewport.get());
glScissor( x, y, width, height );
glEnable( GL_SCISSOR_TEST );