Introduced bool Texture2D::textureObjectValid(State) and bool SubloadCallback::textureObjectValid(Texture2D&,State&) method to make it tell Texture2D::apply() whether the texture object is still valid or whether it's no longed valid for the any changes to the image attached to the Texture

This commit is contained in:
Robert Osfield 2010-12-03 14:18:16 +00:00
parent 0754a78ddb
commit 06509b9769
2 changed files with 46 additions and 16 deletions

View File

@ -87,6 +87,12 @@ class OSG_EXPORT Texture2D : public Texture
class OSG_EXPORT SubloadCallback : public Referenced
{
public:
virtual bool textureObjectValid(const Texture2D& texture, State& state) const
{
return texture.textureObjectValid(state);
}
virtual TextureObject* generateTextureObject(const Texture2D& texture, State& state) const
{
return osg::Texture::generateTextureObject(&texture, state.getContextID(), GL_TEXTURE_2D);
@ -132,6 +138,8 @@ class OSG_EXPORT Texture2D : public Texture
* compiled, create the texture mipmap levels. */
virtual void apply(State& state) const;
protected :
virtual ~Texture2D();
@ -139,6 +147,10 @@ class OSG_EXPORT Texture2D : public Texture
virtual void computeInternalFormat() const;
void allocateMipmap(State& state) const;
/** Return true of the TextureObject assigned to the context associate with osg::State object is valid.*/
bool textureObjectValid(State& state) const;
friend class SubloadCallback;
ref_ptr<Image> _image;

View File

@ -125,6 +125,25 @@ void Texture2D::setImage(Image* image)
}
}
bool Texture2D::textureObjectValid(State& state) const
{
TextureObject* textureObject = getTextureObject(state.getContextID());
if (!textureObject) return false;
// return true if image isn't assigned as we won't be override the value.
if (!_image) return true;
// compute the internal texture format, this set the _internalFormat to an appropriate value.
computeInternalFormat();
GLsizei new_width, new_height, new_numMipmapLevels;
// compute the dimensions of the texture.
computeRequiredTextureDimensions(state, *_image, new_width, new_height, new_numMipmapLevels);
return textureObject->match(GL_TEXTURE_2D, new_numMipmapLevels, _internalFormat, new_width, new_height, 1, _borderWidth);
}
void Texture2D::apply(State& state) const
{
@ -141,27 +160,26 @@ void Texture2D::apply(State& state) const
// get the texture object for the current contextID.
TextureObject* textureObject = getTextureObject(contextID);
if (textureObject)
if (textureObject && !textureObjectValid(state))
{
if (_image.valid() && getModifiedCount(contextID) != _image->getModifiedCount())
bool textureObjectInvalidated = false;
if (_subloadCallback.valid())
{
// compute the internal texture format, this set the _internalFormat to an appropriate value.
computeInternalFormat();
GLsizei new_width, new_height, new_numMipmapLevels;
// compute the dimensions of the texture.
computeRequiredTextureDimensions(state, *_image, new_width, new_height, new_numMipmapLevels);
if (!textureObject->match(GL_TEXTURE_2D, new_numMipmapLevels, _internalFormat, new_width, new_height, 1, _borderWidth))
textureObjectInvalidated = !_subloadCallback->textureObjectValid(*this, state);
}
else if (_image.valid() && getModifiedCount(contextID) != _image->getModifiedCount())
{
textureObjectInvalidated = !textureObjectValid(state);
}
if (textureObjectInvalidated)
{
OSG_NOTICE<<"Discarding TextureObject"<<std::endl;
Texture::releaseTextureObject(contextID, _textureObjectBuffer[contextID].get());
_textureObjectBuffer[contextID] = 0;
textureObject = 0;
}
}
}
if (textureObject)
{