Hi again, here's the code I'm using:
// my SubloadCallback:
ITexture2DSubloadCallback::ITexture2DSubloadCallback(osg::Texture2D*
texture)
{
const osg::Image* _image = texture->getImage();
// m_POT_width, m_POT_height are members of the subload callback
m_POT_width = (double)mathNextPowerOf2((unsigned int)_image->s()),
m_POT_height = (double)mathNextPowerOf2((unsigned int)_image->t()),
// set the texture to beleive it is of power of two size
texture->setTextureSize(m_POT_width, m_POT_height);
// set to linear to disable mipmap generation
texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
}
void ITexture2DSubloadCallback::load(const osg::Texture2D& texture,
osg::State& state) const
{
const osg::Image* _image = texture.getImage();
glTexImage2D(GL_TEXTURE_2D, 0,
osg::Image::computeNumComponents(_image->getInternalTextureFormat()),
(int)m_POT_width,
(int)m_POT_height,
0,
_image->getPixelFormat(),
_image->getDataType(),
0
);
state.checkGLErrors("ITexture2DSubloadCallback::load");
}
void ITexture2DSubloadCallback::subload(const osg::Texture2D& texture,
osg::State& state) const
{
const osg::Image* _image = texture.getImage();
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
_image->s(), _image->t(),
_image->getPixelFormat(),
_image->getDataType(),
_image->data()
);
state.checkGLErrors("ITexture2DSubloadCallback::subload");
}
// and here's how I create the textured quad that is attached to the scene's
root...
float width = 200;
float height = 200;
osg::ref_ptr<osg::Geode> geode;
osg::ref_ptr<osg::Geometry> geom;
// create geometry...
geode = new osg::Geode;
geom = new osg::Geometry;
osg::Vec3 top_left(0, height, 0);
osg::Vec3 bottom_left(0, 0, 0);
osg::Vec3 bottom_right(width, 0, 0);
osg::Vec3 top_right(width, height, 0);
// vertices...
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array(4);
(*vertices)[0] = top_left;
(*vertices)[1] = bottom_left;
(*vertices)[2] = bottom_right;
(*vertices)[3] = top_right;
geom->setVertexArray(vertices.get());
// texcoords...
osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array(4);
(*texcoords)[0].set(0.0f,1.0f);
(*texcoords)[1].set(0.0f,0.0f);
(*texcoords)[2].set(1.0f,0.0f);
(*texcoords)[3].set(1.0f,1.0f);
geom->setTexCoordArray(0, texcoords.get());
// normals...
osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array(1);
(*normals)[0].set(0.0f, 0.0f, 1.0f);
geom->setNormalArray(normals.get());
geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
// colors...
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array(1);
(*colors)[0].set(1.0f, 1.0f, 1.0f, 1.0f); // this is the color that will
be displayed if the texture won't be displayed
geom->setColorArray(colors.get());
geom->setColorBinding(osg::Geometry::BIND_OVERALL);
geom->addPrimitiveSet(new osg::DrawArrays(GL_QUADS,0,4));
geode->addDrawable(geom.get());
// texture...
osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
texture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
texture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
texture->setWrap( osg::Texture2D::WRAP_S, osg::Texture2D::CLAMP );
texture->setWrap( osg::Texture2D::WRAP_T, osg::Texture2D::CLAMP );
texture->setDataVariance(osg::Object::DYNAMIC);
osg::ref_ptr<osg::Image> image = osgDB::readImageFile("Icon.png"); // 57x57
image (NPOT)...
if(image.valid())
texture->setImage(image.get());
*osg::ref_ptr<ITexture2DSubloadCallback> t2dscb = new
ITexture2DSubloadCallback(texture);
texture->setSubloadCallback(t2dscb.get());
*
// stateset...
osg::StateSet* stateset = geom->getOrCreateStateSet();
stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF |
osg::StateAttribute::PROTECTED);
stateset->setTextureAttributeAndModes(0, texture.get(),
osg::StateAttribute::ON);
m_root->addChild(geode.get());
That's all. Hope you can help. Thanks!
Alessandro
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org