From Romano Magacho, fixes to handle the subloading from Image when the

internal format changes requiring a rebuild of the texture object.
This commit is contained in:
Robert Osfield 2004-01-23 13:25:45 +00:00
parent 34bc8a2471
commit edce2211fa
7 changed files with 12 additions and 12 deletions

View File

@ -366,7 +366,7 @@ class SG_EXPORT Texture : public osg::StateAttribute
/** Helper method which subloads images to the texture itself, but does not set or use texture binding. /** Helper method which subloads images to the texture itself, but does not set or use texture binding.
* Note, do not call this method directly unless you are implementing your own Subload callback*/ * Note, do not call this method directly unless you are implementing your own Subload callback*/
void applyTexImage2D_subload(State& state, GLenum target, const Image* image, GLsizei width, GLsizei height,GLsizei numMipmapLevels) const; void applyTexImage2D_subload(State& state, GLenum target, const Image* image, GLsizei width, GLsizei height, GLint inInternalFormat, GLsizei numMipmapLevels) const;
protected : protected :

View File

@ -97,7 +97,7 @@ class SG_EXPORT TextureRectangle : public Texture
void applyTexParameters(GLenum target, State& state) const; void applyTexParameters(GLenum target, State& state) const;
void applyTexImage_load(GLenum target, Image* image, State& state, GLsizei& inwidth, GLsizei& inheight) const; void applyTexImage_load(GLenum target, Image* image, State& state, GLsizei& inwidth, GLsizei& inheight) const;
void applyTexImage_subload(GLenum target, Image* image, State& state, GLsizei& inwidth, GLsizei& inheight) const; void applyTexImage_subload(GLenum target, Image* image, State& state, GLsizei& inwidth, GLsizei& inheight, GLint& inInternalFormat) const;
// not ideal that _image is mutable, but its required since // not ideal that _image is mutable, but its required since
// Image::ensureDimensionsArePowerOfTwo() can only be called // Image::ensureDimensionsArePowerOfTwo() can only be called

View File

@ -98,6 +98,7 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl
/** Get the whether UseFrameBlock is on or off.*/ /** Get the whether UseFrameBlock is on or off.*/
bool getUseFrameBlock() const { return _useFrameBlock; } bool getUseFrameBlock() const { return _useFrameBlock; }
Block* getFrameBlock() { return _frameBlock.get(); }
/** Set the priority of the database pager thread during the frame (i.e. while cull and draw are running.)*/ /** Set the priority of the database pager thread during the frame (i.e. while cull and draw are running.)*/
void setThreadPriorityDuringFrame(ThreadPriority duringFrame) { _threadPriorityDuringFrame = duringFrame; } void setThreadPriorityDuringFrame(ThreadPriority duringFrame) { _threadPriorityDuringFrame = duringFrame; }

View File

@ -741,16 +741,15 @@ void Texture::applyTexImage2D_load(State& state, GLenum target, const Image* ima
void Texture::applyTexImage2D_subload(State& state, GLenum target, const Image* image, GLsizei inwidth, GLsizei inheight,GLsizei numMipmapLevels) const void Texture::applyTexImage2D_subload(State& state, GLenum target, const Image* image, GLsizei inwidth, GLsizei inheight, GLint inInternalFormat, GLint numMipmapLevels) const
{ {
// if we don't have a valid image we can't create a texture! // if we don't have a valid image we can't create a texture!
if (!image || !image->data()) if (!image || !image->data())
return; return;
// image size has changed so we have to re-load the image from scratch. // image size has changed so we have to re-load the image from scratch.
if (image->s()!=inwidth || image->t()!=inheight) if (image->s()!=inwidth || image->t()!=inheight || image->getInternalTextureFormat()!=inInternalFormat )
{ {
applyTexImage2D_load(state, target, image, inwidth, inheight,numMipmapLevels); applyTexImage2D_load(state, target, image, inwidth, inheight,numMipmapLevels);
return; return;
} }

View File

@ -123,7 +123,7 @@ void Texture2D::apply(State& state) const
else if (_image.valid() && getModifiedTag(contextID) != _image->getModifiedTag()) else if (_image.valid() && getModifiedTag(contextID) != _image->getModifiedTag())
{ {
applyTexImage2D_subload(state,GL_TEXTURE_2D,_image.get(), applyTexImage2D_subload(state,GL_TEXTURE_2D,_image.get(),
_textureWidth, _textureHeight, _numMipmapLevels); _textureWidth, _textureHeight, _internalFormat, _numMipmapLevels);
// update the modified tag to show that it is upto date. // update the modified tag to show that it is upto date.
getModifiedTag(contextID) = _image->getModifiedTag(); getModifiedTag(contextID) = _image->getModifiedTag();
@ -172,7 +172,7 @@ void Texture2D::apply(State& state) const
{ {
//std::cout<<"Reusing texture object"<<std::endl; //std::cout<<"Reusing texture object"<<std::endl;
applyTexImage2D_subload(state,GL_TEXTURE_2D,_image.get(), applyTexImage2D_subload(state,GL_TEXTURE_2D,_image.get(),
_textureWidth, _textureHeight, _numMipmapLevels); _textureWidth, _textureHeight, _internalFormat, _numMipmapLevels);
} }
else else
{ {

View File

@ -225,7 +225,7 @@ void TextureCubeMap::apply(State& state) const
const osg::Image* image = _images[n].get(); const osg::Image* image = _images[n].get();
if (image && getModifiedTag((Face)n,contextID) != image->getModifiedTag()) if (image && getModifiedTag((Face)n,contextID) != image->getModifiedTag())
{ {
applyTexImage2D_subload( state, faceTarget[n], _images[n].get(), _textureWidth, _textureHeight, _numMipmapLevels); applyTexImage2D_subload( state, faceTarget[n], _images[n].get(), _textureWidth, _textureHeight, _internalFormat, _numMipmapLevels);
getModifiedTag((Face)n,contextID) = image->getModifiedTag(); getModifiedTag((Face)n,contextID) = image->getModifiedTag();
} }
} }
@ -272,7 +272,7 @@ void TextureCubeMap::apply(State& state) const
{ {
if (textureObject->isAllocated()) if (textureObject->isAllocated())
{ {
applyTexImage2D_subload( state, faceTarget[n], image, _textureWidth, _textureHeight, _numMipmapLevels); applyTexImage2D_subload( state, faceTarget[n], image, _textureWidth, _textureHeight, _internalFormat, _numMipmapLevels);
} }
else else
{ {

View File

@ -118,7 +118,7 @@ void TextureRectangle::apply(State& state) const
} }
else if (_image.valid() && getModifiedTag(contextID) != _image->getModifiedTag()) else if (_image.valid() && getModifiedTag(contextID) != _image->getModifiedTag())
{ {
applyTexImage_subload(GL_TEXTURE_RECTANGLE_NV, _image.get(), state, _textureWidth, _textureHeight); applyTexImage_subload(GL_TEXTURE_RECTANGLE_NV, _image.get(), state, _textureWidth, _textureHeight, _internalFormat);
// update the modified tag to show that it is upto date. // update the modified tag to show that it is upto date.
getModifiedTag(contextID) = _image->getModifiedTag(); getModifiedTag(contextID) = _image->getModifiedTag();
@ -212,13 +212,13 @@ void TextureRectangle::applyTexImage_load(GLenum target, Image* image, State& st
inheight = image->t(); inheight = image->t();
} }
void TextureRectangle::applyTexImage_subload(GLenum target, Image* image, State& state, GLsizei& inwidth, GLsizei& inheight) const void TextureRectangle::applyTexImage_subload(GLenum target, Image* image, State& state, GLsizei& inwidth, GLsizei& inheight, GLint& inInternalFormat) const
{ {
// if we don't have a valid image we can't create a texture! // if we don't have a valid image we can't create a texture!
if (!image || !image->data()) if (!image || !image->data())
return; return;
if (image->s()!=inwidth || image->t()!=inheight) if (image->s()!=inwidth || image->t()!=inheight || image->getInternalTextureFormat()!=inInternalFormat)
{ {
applyTexImage_load(target, image, state, inwidth, inheight); applyTexImage_load(target, image, state, inwidth, inheight);
return; return;