Added support for TextureCubeMap into osgUtil::RenderToTextureStage.
This commit is contained in:
@@ -22,69 +22,15 @@
|
||||
|
||||
using namespace osg;
|
||||
|
||||
|
||||
// include/osg/TextureCubeMap defines GL_TEXTURE_CUBE_MAP to be
|
||||
// 0x8513 which is the same as GL_TEXTURE_CUBE_MAP_ARB & _EXT.
|
||||
// assume its the same as what OpenGL 1.3 defines.
|
||||
|
||||
#ifndef GL_ARB_texture_cube_map
|
||||
#define GL_ARB_texture_cube_map 1
|
||||
#define GL_TEXTURE_CUBE_MAP_ARB 0x8513
|
||||
#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514
|
||||
#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515
|
||||
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516
|
||||
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517
|
||||
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518
|
||||
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519
|
||||
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A
|
||||
#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B
|
||||
#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef GL_EXT_texture_cube_map
|
||||
#define GL_EXT_texture_cube_map 1
|
||||
#define GL_TEXTURE_CUBE_MAP_EXT 0x8513
|
||||
#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514
|
||||
#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515
|
||||
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516
|
||||
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517
|
||||
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518
|
||||
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519
|
||||
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A
|
||||
#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B
|
||||
#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef GL_ARB_texture_cube_map
|
||||
# define CUBE_MAP_POSITIVE_X GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB
|
||||
# define CUBE_MAP_NEGATIVE_X GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB
|
||||
# define CUBE_MAP_POSITIVE_Y GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB
|
||||
# define CUBE_MAP_NEGATIVE_Y GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB
|
||||
# define CUBE_MAP_POSITIVE_Z GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB
|
||||
# define CUBE_MAP_NEGATIVE_Z GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB
|
||||
#elif GL_EXT_texture_cube_map
|
||||
# define CUBE_MAP_POSITIVE_X GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT
|
||||
# define CUBE_MAP_NEGATIVE_X GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT
|
||||
# define CUBE_MAP_POSITIVE_Y GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT
|
||||
# define CUBE_MAP_NEGATIVE_Y GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT
|
||||
# define CUBE_MAP_POSITIVE_Z GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT
|
||||
# define CUBE_MAP_NEGATIVE_Z GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT
|
||||
#endif
|
||||
|
||||
|
||||
# if GL_EXT_texture_cube_map || GL_ARB_texture_cube_map
|
||||
static GLenum faceTarget[6] =
|
||||
{
|
||||
CUBE_MAP_POSITIVE_X,
|
||||
CUBE_MAP_NEGATIVE_X,
|
||||
CUBE_MAP_POSITIVE_Y,
|
||||
CUBE_MAP_NEGATIVE_Y,
|
||||
CUBE_MAP_POSITIVE_Z,
|
||||
CUBE_MAP_NEGATIVE_Z
|
||||
GL_TEXTURE_CUBE_MAP_POSITIVE_X,
|
||||
GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
|
||||
GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
|
||||
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
|
||||
GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
|
||||
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
TextureCubeMap::TextureCubeMap():
|
||||
@@ -330,6 +276,74 @@ void TextureCubeMap::apply(State& state) const
|
||||
}
|
||||
}
|
||||
|
||||
void TextureCubeMap::copyTexSubImageCubeMap(State& state, int face, int xoffset, int yoffset, int x, int y, int width, int height )
|
||||
{
|
||||
const unsigned int contextID = state.getContextID();
|
||||
const Extensions* extensions = getExtensions(contextID,true);
|
||||
|
||||
if (!extensions->isCubeMapSupported())
|
||||
return;
|
||||
|
||||
if (_internalFormat==0) _internalFormat=GL_RGBA;
|
||||
|
||||
// get the texture object for the current contextID.
|
||||
TextureObject* textureObject = getTextureObject(contextID);
|
||||
|
||||
if (!textureObject)
|
||||
{
|
||||
// create texture object.
|
||||
apply(state);
|
||||
|
||||
textureObject = getTextureObject(contextID);
|
||||
|
||||
if (!textureObject)
|
||||
{
|
||||
// failed to create texture object
|
||||
osg::notify(osg::NOTICE)<<"Warning : failed to create TextureCubeMap texture obeject, copyTexSubImageCubeMap abondoned."<<std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
GLenum target = faceTarget[face];
|
||||
|
||||
if (textureObject)
|
||||
{
|
||||
// we have a valid image
|
||||
textureObject->bind();
|
||||
|
||||
applyTexParameters(GL_TEXTURE_CUBE_MAP, state);
|
||||
|
||||
bool needHardwareMipMap = (_min_filter != LINEAR && _min_filter != NEAREST);
|
||||
bool hardwareMipMapOn = false;
|
||||
if (needHardwareMipMap)
|
||||
{
|
||||
const Texture::Extensions* tex_extensions = Texture::getExtensions(contextID,true);
|
||||
bool generateMipMapSupported = tex_extensions->isGenerateMipMapSupported();
|
||||
|
||||
hardwareMipMapOn = _useHardwareMipMapGeneration && generateMipMapSupported;
|
||||
|
||||
if (!hardwareMipMapOn)
|
||||
{
|
||||
// have to swtich off mip mapping
|
||||
notify(NOTICE)<<"Warning: TextureCubeMap::copyTexImage2D(,,,,) switch of mip mapping as hardware support not available."<<std::endl;
|
||||
_min_filter = LINEAR;
|
||||
}
|
||||
}
|
||||
|
||||
if (hardwareMipMapOn) glTexParameteri( target, GL_GENERATE_MIPMAP_SGIS,GL_TRUE);
|
||||
|
||||
glCopyTexSubImage2D( target , 0, xoffset, yoffset, x, y, width, height);
|
||||
|
||||
if (hardwareMipMapOn) glTexParameteri( target, GL_GENERATE_MIPMAP_SGIS,GL_FALSE);
|
||||
|
||||
// inform state that this texture is the current one bound.
|
||||
state.haveAppliedTextureAttribute(state.getActiveTextureUnit(), this);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
typedef buffered_value< ref_ptr<TextureCubeMap::Extensions> > BufferedExtensions;
|
||||
static BufferedExtensions s_extensions;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user