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
|
||||
* 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 */
|
||||
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;
|
||||
|
||||
/**
|
||||
* Use std::vector to encapsulate referenced pointers to images of different layers.
|
||||
* Vectors gives us a random access iterator. The overhead of non-used elements is negligible */
|
||||
std::vector<ref_ptr<Image> > _images;
|
||||
typedef std::vector< ref_ptr<Image> > Images;
|
||||
Images _images;
|
||||
|
||||
// subloaded images can have different texture and image sizes.
|
||||
mutable GLsizei _textureWidth, _textureHeight, _textureDepth;
|
||||
|
@ -107,15 +107,17 @@ int Texture2DArray::compare(const StateAttribute& sa) const
|
||||
|
||||
void Texture2DArray::setImage(unsigned int layer, Image* image)
|
||||
{
|
||||
// check if the layer exceeds the texture depth
|
||||
if (static_cast<int>(layer) >= _textureDepth)
|
||||
if (layer>= static_cast<unsigned int>(_images.size()))
|
||||
{
|
||||
// print warning and do nothing
|
||||
OSG_WARN<<"Warning: Texture2DArray::setImage(..) failed, the given layer number is bigger then the size of the texture array."<<std::endl;
|
||||
return;
|
||||
// _images vector not large enough to contain layer so expand it.
|
||||
_images.resize(layer+1);
|
||||
_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;
|
||||
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)
|
||||
{
|
||||
// set dimensions
|
||||
@ -170,44 +195,16 @@ void Texture2DArray::setTextureSize(int width, int height, int depth)
|
||||
void Texture2DArray::setTextureDepth(int depth)
|
||||
{
|
||||
// if we decrease the number of layers, then delete non-used
|
||||
if (depth < _textureDepth)
|
||||
if (depth < static_cast<int>(_images.size()))
|
||||
{
|
||||
_images.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
|
||||
_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
|
||||
{
|
||||
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 )
|
||||
{
|
||||
unsigned int size = 0; is >> size >> is.BEGIN_BRACKET;
|
||||
tex.setTextureDepth(size);
|
||||
for ( unsigned int i=0; i<size; ++i )
|
||||
{
|
||||
osg::Image* image = is.readImage();
|
||||
|
Loading…
Reference in New Issue
Block a user