Work in progress to allow osg::Texture2DArray to be set up with a single osg::Image containing 3D image data.
git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14773 16af8721-9629-0410-8352-f15c8da7e697
This commit is contained in:
parent
d97e01c520
commit
c30be2355b
@ -59,7 +59,7 @@ class OSG_EXPORT Texture2DArray : public Texture
|
|||||||
* image/layer count, you have to use the extension subclass, since it provides
|
* image/layer count, you have to use the extension subclass, since it provides
|
||||||
* graphic context dependent information.
|
* graphic context dependent information.
|
||||||
*/
|
*/
|
||||||
virtual unsigned int getNumImages() const { return getTextureDepth(); }
|
virtual unsigned int getNumImages() const { return _images.size(); }
|
||||||
|
|
||||||
/** Check how often was a certain layer in the given context modified */
|
/** Check how often was a certain layer in the given context modified */
|
||||||
inline unsigned int& getModifiedCount(unsigned int layer, unsigned int contextID) const
|
inline unsigned int& getModifiedCount(unsigned int layer, unsigned int contextID) const
|
||||||
@ -131,10 +131,8 @@ class OSG_EXPORT Texture2DArray : public Texture
|
|||||||
|
|
||||||
void applyTexImage2DArray_subload(State& state, Image* image, GLsizei inwidth, GLsizei inheight, GLsizei indepth, GLint inInternalFormat, GLsizei& numMipmapLevels) const;
|
void applyTexImage2DArray_subload(State& state, Image* image, GLsizei inwidth, GLsizei inheight, GLsizei indepth, GLint inInternalFormat, GLsizei& numMipmapLevels) const;
|
||||||
|
|
||||||
/**
|
typedef std::vector< ref_ptr<Image> > Images;
|
||||||
* Use std::vector to encapsulate referenced pointers to images of different layers.
|
Images _images;
|
||||||
* Vectors gives us a random access iterator. The overhead of non-used elements is negligible */
|
|
||||||
std::vector<ref_ptr<Image> > _images;
|
|
||||||
|
|
||||||
// subloaded images can have different texture and image sizes.
|
// subloaded images can have different texture and image sizes.
|
||||||
mutable GLsizei _textureWidth, _textureHeight, _textureDepth;
|
mutable GLsizei _textureWidth, _textureHeight, _textureDepth;
|
||||||
|
@ -107,15 +107,17 @@ int Texture2DArray::compare(const StateAttribute& sa) const
|
|||||||
|
|
||||||
void Texture2DArray::setImage(unsigned int layer, Image* image)
|
void Texture2DArray::setImage(unsigned int layer, Image* image)
|
||||||
{
|
{
|
||||||
// check if the layer exceeds the texture depth
|
if (layer>= static_cast<unsigned int>(_images.size()))
|
||||||
if (static_cast<int>(layer) >= _textureDepth)
|
|
||||||
{
|
{
|
||||||
// print warning and do nothing
|
// _images vector not large enough to contain layer so expand it.
|
||||||
OSG_WARN<<"Warning: Texture2DArray::setImage(..) failed, the given layer number is bigger then the size of the texture array."<<std::endl;
|
_images.resize(layer+1);
|
||||||
return;
|
_modifiedCount.resize(layer+1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// do not need to replace already assigned images
|
||||||
|
if (_images[layer] == image) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_images[layer] == image) return;
|
|
||||||
|
|
||||||
unsigned numImageRequireUpdateBefore = 0;
|
unsigned numImageRequireUpdateBefore = 0;
|
||||||
for (unsigned int i=0; i<getNumImages(); ++i)
|
for (unsigned int i=0; i<getNumImages(); ++i)
|
||||||
@ -159,6 +161,29 @@ void Texture2DArray::setImage(unsigned int layer, Image* image)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Image* Texture2DArray::getImage(unsigned int layer)
|
||||||
|
{
|
||||||
|
return (layer<static_cast<unsigned int>(_images.size())) ? _images[layer].get() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Image* Texture2DArray::getImage(unsigned int layer) const
|
||||||
|
{
|
||||||
|
return (layer<static_cast<unsigned int>(_images.size())) ? _images[layer].get() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Texture2DArray::imagesValid() const
|
||||||
|
{
|
||||||
|
if (_images.empty()) return false;
|
||||||
|
|
||||||
|
for(Images::const_iterator itr = _images.begin();
|
||||||
|
itr != _images.end();
|
||||||
|
++itr)
|
||||||
|
{
|
||||||
|
if (!(itr->valid()) || !((*itr)->valid())) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void Texture2DArray::setTextureSize(int width, int height, int depth)
|
void Texture2DArray::setTextureSize(int width, int height, int depth)
|
||||||
{
|
{
|
||||||
// set dimensions
|
// set dimensions
|
||||||
@ -170,44 +195,16 @@ void Texture2DArray::setTextureSize(int width, int height, int depth)
|
|||||||
void Texture2DArray::setTextureDepth(int depth)
|
void Texture2DArray::setTextureDepth(int depth)
|
||||||
{
|
{
|
||||||
// if we decrease the number of layers, then delete non-used
|
// if we decrease the number of layers, then delete non-used
|
||||||
if (depth < _textureDepth)
|
if (depth < static_cast<int>(_images.size()))
|
||||||
{
|
{
|
||||||
_images.resize(depth);
|
_images.resize(depth);
|
||||||
_modifiedCount.resize(depth);
|
_modifiedCount.resize(depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we increase the array, then add new empty elements
|
|
||||||
if (depth > _textureDepth)
|
|
||||||
{
|
|
||||||
_images.resize(depth, ref_ptr<Image>(0));
|
|
||||||
_modifiedCount.resize(depth, ImageModifiedCount());
|
|
||||||
}
|
|
||||||
|
|
||||||
// resize the texture array
|
// resize the texture array
|
||||||
_textureDepth = depth;
|
_textureDepth = depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
Image* Texture2DArray::getImage(unsigned int layer)
|
|
||||||
{
|
|
||||||
return _images[layer].get();
|
|
||||||
}
|
|
||||||
|
|
||||||
const Image* Texture2DArray::getImage(unsigned int layer) const
|
|
||||||
{
|
|
||||||
return _images[layer].get();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Texture2DArray::imagesValid() const
|
|
||||||
{
|
|
||||||
if (_textureDepth < 1) return false;
|
|
||||||
for (int n=0; n < _textureDepth; n++)
|
|
||||||
{
|
|
||||||
if (!_images[n].valid() || !_images[n]->data())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Texture2DArray::computeInternalFormat() const
|
void Texture2DArray::computeInternalFormat() const
|
||||||
{
|
{
|
||||||
if (imagesValid()) computeInternalFormatWithImage(*_images[0]);
|
if (imagesValid()) computeInternalFormatWithImage(*_images[0]);
|
||||||
|
@ -11,7 +11,6 @@ static bool checkImages( const osg::Texture2DArray& tex )
|
|||||||
static bool readImages( osgDB::InputStream& is, osg::Texture2DArray& tex )
|
static bool readImages( osgDB::InputStream& is, osg::Texture2DArray& tex )
|
||||||
{
|
{
|
||||||
unsigned int size = 0; is >> size >> is.BEGIN_BRACKET;
|
unsigned int size = 0; is >> size >> is.BEGIN_BRACKET;
|
||||||
tex.setTextureDepth(size);
|
|
||||||
for ( unsigned int i=0; i<size; ++i )
|
for ( unsigned int i=0; i<size; ++i )
|
||||||
{
|
{
|
||||||
osg::Image* image = is.readImage();
|
osg::Image* image = is.readImage();
|
||||||
|
Loading…
Reference in New Issue
Block a user