From 669d6be0b2419075aaab15577222a7c969e4ec2e Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 22 Jul 2008 14:47:59 +0000 Subject: [PATCH] Fixed handling of TextureCubeMap's with mipmapped/ImageSequence/PBO's. --- .../osgimagesequence/osgimagesequence.cpp | 52 +++++++++++++------ src/osg/ImageSequence.cpp | 2 +- src/osg/Texture.cpp | 38 +++++++------- src/osgPlugins/osg/ImageSequence.cpp | 4 +- src/osgPlugins/osg/TextureCubeMap.cpp | 7 ++- 5 files changed, 61 insertions(+), 42 deletions(-) diff --git a/examples/osgimagesequence/osgimagesequence.cpp b/examples/osgimagesequence/osgimagesequence.cpp index 7d9986fca..dccf15b1c 100644 --- a/examples/osgimagesequence/osgimagesequence.cpp +++ b/examples/osgimagesequence/osgimagesequence.cpp @@ -19,12 +19,16 @@ #include #include #include +#include #include +#include +#include #include #include #include #include +#include #include @@ -36,27 +40,37 @@ osg::StateSet* createState() { - // read 4 2d images - osg::ref_ptr image_0 = osgDB::readImageFile("Images/lz.rgb"); - osg::ref_ptr image_1 = osgDB::readImageFile("Images/reflect.rgb"); - osg::ref_ptr image_2 = osgDB::readImageFile("Images/tank.rgb"); - osg::ref_ptr image_3 = osgDB::readImageFile("Images/skymap.jpg"); - osg::ref_ptr imageSequence = new osg::ImageSequence; - imageSequence->addImage(image_0.get()); - imageSequence->addImage(image_1.get()); - imageSequence->addImage(image_2.get()); - imageSequence->addImage(image_3.get()); - + + imageSequence->setDuration(2.0); + imageSequence->addImage(osgDB::readImageFile("Cubemap_axis/posx.png")); + imageSequence->addImage(osgDB::readImageFile("Cubemap_axis/negx.png")); + imageSequence->addImage(osgDB::readImageFile("Cubemap_axis/posy.png")); + imageSequence->addImage(osgDB::readImageFile("Cubemap_axis/negy.png")); + imageSequence->addImage(osgDB::readImageFile("Cubemap_axis/posz.png")); + imageSequence->addImage(osgDB::readImageFile("Cubemap_axis/negz.png")); + +#if 1 osg::Texture2D* texture = new osg::Texture2D; - texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR); - texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR); - texture->setWrap(osg::Texture2D::WRAP_R,osg::Texture2D::REPEAT); + texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR); + texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR); + texture->setWrap(osg::Texture::WRAP_R,osg::Texture::REPEAT); texture->setResizeNonPowerOfTwoHint(false); texture->setImage(imageSequence.get()); //texture->setTextureSize(512,512); - texture->setUpdateCallback(new osg::ImageSequence::UpdateCallback); + //texture->setUpdateCallback(new osg::ImageSequence::UpdateCallback); +#else + osg::TextureRectangle* texture = new osg::TextureRectangle; + texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR); + texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR); + texture->setWrap(osg::Texture::WRAP_R,osg::Texture::REPEAT); + // texture->setResizeNonPowerOfTwoHint(false); + texture->setImage(imageSequence.get()); + //texture->setTextureSize(512,512); + + //texture->setUpdateCallback(new osg::ImageSequence::UpdateCallback); +#endif // create the StateSet to store the texture data osg::StateSet* stateset = new osg::StateSet; @@ -80,13 +94,17 @@ osg::Node* createModel() } -int main(int , char **) +int main(int argc, char **argv) { + osg::ArgumentParser arguments(&argc,argv); + // construct the viewer. - osgViewer::Viewer viewer; + osgViewer::Viewer viewer(arguments); // create a model from the images and pass it to the viewer. viewer.setSceneData(createModel()); + //osgDB::writeNodeFile(*viewer.getSceneData(),"test.osg"); + return viewer.run(); } diff --git a/src/osg/ImageSequence.cpp b/src/osg/ImageSequence.cpp index 591c4d2a5..95d780370 100644 --- a/src/osg/ImageSequence.cpp +++ b/src/osg/ImageSequence.cpp @@ -26,7 +26,7 @@ void ImageSequence::UpdateCallback::operator () (osg::StateAttribute* attr, osg: { osg::Texture* texture = attr ? attr->asTexture() : 0; - //osg::notify(osg::NOTICE)<<"ImageSequence::UpdateCallback::"<getNumImages(); ++i) diff --git a/src/osg/Texture.cpp b/src/osg/Texture.cpp index d4e2a922d..2b623d0ff 100644 --- a/src/osg/Texture.cpp +++ b/src/osg/Texture.cpp @@ -42,7 +42,7 @@ using namespace osg; #define GL_STORAGE_SHARED_APPLE 0x85BF #endif -// #define DO_TIMING +//#define DO_TIMING ApplicationUsageProxy Texture_e0(ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_MAX_TEXTURE_SIZE","Set the maximum size of textures."); @@ -1015,11 +1015,15 @@ void Texture::applyTexImage2D_load(State& state, GLenum target, const Image* ima } + bool mipmappingRequired = _min_filter != LINEAR && _min_filter != NEAREST; + bool useHardwareMipMapGeneration = mipmappingRequired && (!image->isMipmap() && isHardwareMipmapGenerationEnabled(state)); + bool useGluBuildMipMaps = mipmappingRequired && (!useHardwareMipMapGeneration && !image->isMipmap()); + unsigned char* dataMinusOffset = 0; unsigned char* dataPlusOffset = 0; const PixelBufferObject* pbo = image->getPixelBufferObject(); - if (pbo && pbo->isPBOSupported(contextID) && !needImageRescale) + if (pbo && pbo->isPBOSupported(contextID) && !needImageRescale && !useGluBuildMipMaps) { state.bindPixelBufferObject(pbo); dataMinusOffset = data; @@ -1033,16 +1037,9 @@ void Texture::applyTexImage2D_load(State& state, GLenum target, const Image* ima pbo = 0; } - bool useHardwareMipMapGeneration = !image->isMipmap() && isHardwareMipmapGenerationEnabled(state); - - if( _min_filter == LINEAR || _min_filter == NEAREST || useHardwareMipMapGeneration) + if( !mipmappingRequired || useHardwareMipMapGeneration) { - if (_min_filter == LINEAR || _min_filter == NEAREST) - { - useHardwareMipMapGeneration = false; - } - GenerateMipmapMode mipmapResult = mipmapBeforeTexImage(state, useHardwareMipMapGeneration); if ( !compressed_image) @@ -1136,7 +1133,7 @@ void Texture::applyTexImage2D_load(State& state, GLenum target, const Image* ima gluBuild2DMipmaps( target, _internalFormat, inwidth,inheight, (GLenum)image->getPixelFormat(), (GLenum)image->getDataType(), - data -dataMinusOffset+dataPlusOffset); + data); int width = image->s(); int height = image->t(); @@ -1264,13 +1261,16 @@ void Texture::applyTexImage2D_subload(State& state, GLenum target, const Image* } - bool useHardwareMipMapGeneration = !image->isMipmap() && isHardwareMipmapGenerationEnabled(state); - - unsigned char* dataMinusOffset=0; - unsigned char* dataPlusOffset=0; + bool mipmappingRequired = _min_filter != LINEAR && _min_filter != NEAREST; + bool useHardwareMipMapGeneration = mipmappingRequired && (!image->isMipmap() && isHardwareMipmapGenerationEnabled(state)); + bool useGluBuildMipMaps = mipmappingRequired && (!useHardwareMipMapGeneration && !image->isMipmap()); + + unsigned char* dataMinusOffset = 0; + unsigned char* dataPlusOffset = 0; + const PixelBufferObject* pbo = image->getPixelBufferObject(); - if (pbo && pbo->isPBOSupported(contextID) && !needImageRescale) + if (pbo && pbo->isPBOSupported(contextID) && !needImageRescale && !useGluBuildMipMaps) { state.bindPixelBufferObject(pbo); dataMinusOffset = data; @@ -1284,12 +1284,10 @@ void Texture::applyTexImage2D_subload(State& state, GLenum target, const Image* pbo = 0; } - if( _min_filter == LINEAR || _min_filter == NEAREST || useHardwareMipMapGeneration) + if( !mipmappingRequired || useHardwareMipMapGeneration) { - - bool hardwareMipMapOn = _min_filter != LINEAR && _min_filter != NEAREST; - GenerateMipmapMode mipmapResult = mipmapBeforeTexImage(state, hardwareMipMapOn); + GenerateMipmapMode mipmapResult = mipmapBeforeTexImage(state, useHardwareMipMapGeneration); if (!compressed_image) { diff --git a/src/osgPlugins/osg/ImageSequence.cpp b/src/osgPlugins/osg/ImageSequence.cpp index ba191cb5e..41c672081 100644 --- a/src/osgPlugins/osg/ImageSequence.cpp +++ b/src/osgPlugins/osg/ImageSequence.cpp @@ -84,7 +84,7 @@ bool ImageSequence_writeLocalData(const Object& obj, Output& fw) itr != names.end(); ++itr) { - fw.indent()<<*itr<getFileName().empty()) fw.indent()<<(*itr)->getFileName()<getFileName().empty()) fw.indent()<getFileName())<(image); \ if (is) \ { \ + fw.indent() << "image "<<#FACE<