From 20ba1a403344445d5f9e93fe9a868d61e36b8fbc Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 24 Jan 2003 09:11:05 +0000 Subject: [PATCH] Fix for impostors bug where image insert were visible, this was down to a double call to RenderStage::drawPreRenderStage(). The call to it in RenderStage inside the draw() method has been removed, leaving on the call in SceneView. --- include/osg/ImpostorSprite | 2 ++ src/osg/ImpostorSprite.cpp | 6 +++++- src/osgUtil/CullVisitor.cpp | 20 +++++++++++++++----- src/osgUtil/RenderStage.cpp | 20 +++++++++++++++++--- src/osgUtil/RenderToTextureStage.cpp | 8 ++++++++ 5 files changed, 47 insertions(+), 9 deletions(-) diff --git a/include/osg/ImpostorSprite b/include/osg/ImpostorSprite index 57b12f8b7..70fc9f455 100644 --- a/include/osg/ImpostorSprite +++ b/include/osg/ImpostorSprite @@ -143,6 +143,8 @@ class SG_EXPORT ImpostorSprite : public Drawable /** accept a PrimtiveFunctor and call its methods to tell it about the interal primtives that this Drawable has.*/ virtual void accept(PrimitiveFunctor& pf) const; + // for debugging purposes. + Vec4 _color; protected: diff --git a/src/osg/ImpostorSprite.cpp b/src/osg/ImpostorSprite.cpp index cfe5dcafa..7a2c41008 100644 --- a/src/osg/ImpostorSprite.cpp +++ b/src/osg/ImpostorSprite.cpp @@ -41,6 +41,8 @@ ImpostorSprite::ImpostorSprite() _texture = NULL; _s = 0; _t = 0; + + _color.set(1.0f, 1.0f, 1.0f, 1.0f ); } ImpostorSprite::~ImpostorSprite() @@ -77,7 +79,8 @@ void ImpostorSprite::drawImplementation(State&) const { // when the tex env is set to REPLACE, and the // texture is set up correctly the color has no effect. - glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); + glColor4fv( _color.ptr() ); + glBegin( GL_QUADS ); @@ -268,6 +271,7 @@ ImpostorSprite* ImpostorSpriteManager::createOrReuseImpostorSprite(int s,int t,i stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF); stateset->setMode(GL_BLEND,osg::StateAttribute::ON); + stateset->setRenderingHint( StateSet::TRANSPARENT_BIN ); stateset->setAttributeAndModes( _alphafunc.get(), StateAttribute::ON ); diff --git a/src/osgUtil/CullVisitor.cpp b/src/osgUtil/CullVisitor.cpp index 666720294..a0a6b2fca 100644 --- a/src/osgUtil/CullVisitor.cpp +++ b/src/osgUtil/CullVisitor.cpp @@ -629,11 +629,17 @@ void CullVisitor::apply(Impostor& node) // create the impostor sprite. impostorSprite = createImpostorSprite(node); + //if (impostorSprite) impostorSprite->_color.set(0.0f,0.0f,1.0f,1.0f); + } + //else impostorSprite->_color.set(1.0f,1.0f,1.0f,1.0f); if (impostorSprite) { + // update frame number to show that impostor is in action. + impostorSprite->setLastFrameUsed(getTraversalNumber()); + if (_computeNearFar) updateCalculatedNearFar(matrix,*impostorSprite); StateSet* stateset = impostorSprite->getStateSet(); @@ -644,8 +650,6 @@ void CullVisitor::apply(Impostor& node) if (stateset) popStateSet(); - // update frame number to show that impostor is in action. - impostorSprite->setLastFrameUsed(getTraversalNumber()); } else @@ -886,12 +890,18 @@ ImpostorSprite* CullVisitor::createImpostorSprite(Impostor& node) dummyState->setAttribute(new_viewport); -// create the impostor sprite. - + // create the impostor sprite. ImpostorSprite* impostorSprite = _impostorSpriteManager->createOrReuseImpostorSprite(new_s,new_t,getTraversalNumber()-_numFramesToKeepImpostorSprites); - if (impostorSprite==NULL) return NULL; + if (impostorSprite==NULL) + { + osg::notify(osg::WARN)<<"Warning: unable to create required impostor sprite."<setLastFrameUsed(getTraversalNumber()); // have successfully created an impostor sprite so now need to // add it into the impostor. diff --git a/src/osgUtil/RenderStage.cpp b/src/osgUtil/RenderStage.cpp index ef5912247..c679b1ed6 100644 --- a/src/osgUtil/RenderStage.cpp +++ b/src/osgUtil/RenderStage.cpp @@ -79,23 +79,33 @@ void RenderStage::addToDependencyList(RenderStage* rs) void RenderStage::drawPreRenderStages(osg::State& state,RenderLeaf*& previous) { + if (_dependencyList.empty()) return; + + //cout << "Drawing prerendering stages "<x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<draw(state,previous); } + //cout << "Done Drawing prerendering stages "<x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<x(), _viewport->y(), _viewport->width(), _viewport->height() ); + //cout << " clearing "<x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<copyTexImage2D(state,_viewport->x(),_viewport->y(),_viewport->width(),_viewport->height()); + } if (_image.valid()) _image->readPixels(_viewport->x(),_viewport->y(),_viewport->width(),_viewport->height(),GL_RGBA,GL_UNSIGNED_BYTE);