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:
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -115,6 +115,7 @@ CXXFILES =\
|
||||
Vec3.cpp\
|
||||
Version.cpp\
|
||||
VertexProgram.cpp\
|
||||
View.cpp\
|
||||
Viewport.cpp\
|
||||
|
||||
DEF += -DOSG_LIBRARY
|
||||
|
||||
@@ -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
221
src/osg/View.cpp
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
233
src/osgText/FadeText.cpp
Normal 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;
|
||||
|
||||
|
||||
}
|
||||
@@ -6,6 +6,7 @@ CXXFILES = \
|
||||
DefaultFont.cpp\
|
||||
Font.cpp\
|
||||
Text.cpp\
|
||||
FadeText.cpp\
|
||||
String.cpp\
|
||||
Version.cpp\
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user