diff --git a/src/osg/FragmentProgram.cpp b/src/osg/FragmentProgram.cpp index 34c404b4d..d841b35c8 100644 --- a/src/osg/FragmentProgram.cpp +++ b/src/osg/FragmentProgram.cpp @@ -190,7 +190,16 @@ void FragmentProgram::apply(State& state) const void FragmentProgram::releaseGLObjects(State* state) const { - const_cast(this)->dirtyFragmentProgramObject(); + if (!state) const_cast(this)->dirtyFragmentProgramObject(); + else + { + unsigned int contextID = state->getContextID(); + if (_fragmentProgramIDList[contextID] != 0) + { + FragmentProgram::deleteFragmentProgramObject(contextID,_fragmentProgramIDList[contextID]); + _fragmentProgramIDList[contextID] = 0; + } + } } diff --git a/src/osg/PagedLOD.cpp b/src/osg/PagedLOD.cpp index 74ba86e98..bca8e58e1 100644 --- a/src/osg/PagedLOD.cpp +++ b/src/osg/PagedLOD.cpp @@ -185,8 +185,9 @@ void PagedLOD::removeExpiredChildren(double expiryTime,NodeList& removedChildren { if (!_perRangeDataList[_children.size()-1]._filename.empty() && _perRangeDataList[_children.size()-1]._timeStampbefore(*type_rhs)) return -1;\ + if (*type_lhs != *type_rhs) return 1;\ + return 0; // passed all the above comparison macro's, must be equal. } diff --git a/src/osg/Referenced.cpp b/src/osg/Referenced.cpp index 83bb83eb6..711ec759d 100644 --- a/src/osg/Referenced.cpp +++ b/src/osg/Referenced.cpp @@ -23,7 +23,11 @@ static std::auto_ptr s_deleteHandler(0); void Referenced::setDeleteHandler(DeleteHandler* handler) { -// s_deleteHandler.reset(handler); +#if defined(_MSC_VER) && (_MSC_VER <= 1200) // 1200 == VC++ 6.0 + s_deleteHandler = handler; +#else + s_deleteHandler.reset(handler); +#endif } DeleteHandler* Referenced::getDeleteHandler() diff --git a/src/osg/Texture.cpp b/src/osg/Texture.cpp index dfa5b58bb..eff983d94 100644 --- a/src/osg/Texture.cpp +++ b/src/osg/Texture.cpp @@ -1070,7 +1070,18 @@ void Texture::compileGLObjects(State& state) const void Texture::releaseGLObjects(State* state) const { - const_cast(this)->dirtyTextureObject(); + if (!state) const_cast(this)->dirtyTextureObject(); + else + { + unsigned int contextID = state->getContextID(); + if (_textureObjectBuffer[contextID].valid()) + { + OpenThreads::ScopedLock lock(getTextureObjectManager()->_mutex); + + getTextureObjectManager()->_textureObjectListMap[contextID].push_back(_textureObjectBuffer[contextID]); + _textureObjectBuffer[contextID] = 0; + } + } } typedef buffered_value< ref_ptr > BufferedExtensions; diff --git a/src/osg/VertexProgram.cpp b/src/osg/VertexProgram.cpp index 3149bef4a..eb143ff72 100644 --- a/src/osg/VertexProgram.cpp +++ b/src/osg/VertexProgram.cpp @@ -191,7 +191,16 @@ void VertexProgram::apply(State& state) const void VertexProgram::releaseGLObjects(State* state) const { - const_cast(this)->dirtyVertexProgramObject(); + if (!state) const_cast(this)->dirtyVertexProgramObject(); + else + { + unsigned int contextID = state->getContextID(); + if (_vertexProgramIDList[contextID] != 0) + { + VertexProgram::deleteVertexProgramObject(contextID,_vertexProgramIDList[contextID]); + _vertexProgramIDList[contextID] = 0; + } + } }