Hi Mike,

You can set the internal texture format via :

  texture->setInternalFormat(internalformat);

In you case setInternalFormat(GL_BGRA) might just do the trick.

As for the most efficient way to do what you are doing you'll want to
attach an osg::PixelBufferObject to a single osg::Image, and then do a
setData on this single image.  This way the OSG can use the pixel
buffer object extension to stream the data to the texture.  You'd also
best do all reading in a background thread as per the xine-lib and
quicktime plugins.

Robert.

On Fri, May 23, 2008 at 1:29 PM, Mike Greene <[EMAIL PROTECTED]> wrote:
> Hi,
>  I have the following simple program (modified texture rectangle sample).
> I'm reading a set of large (1920x1080) bitmaps from disk and swapping each
> callback loop. My problem is that the bmps need to be in BGRA instead of
> RGBA format. Can I change the TextureRectangle in OSG to compensate for
> this?
>
> Mike Greene
>
> //code
>
> #include <osg/Notify>
> #include <osg/TextureRectangle>
> #include <osg/Geometry>
> #include <osg/Geode>
> #include <osg/TexMat>
>
> #include <osg/Group>
> #include <osg/Projection>
> #include <osg/MatrixTransform>
> #include <osgText/Text>
>
> #include <osgDB/Registry>
> #include <osgDB/ReadFile>
>
> #include <osgViewer/Viewer>
>
> osg::Image* img = new osg::Image();
> osg::TextureRectangle* texture = new osg::TextureRectangle();
>
> long texturecounter = 0;
>
> class TextureChangeCallback : public osg::NodeCallback
> {
> public:
>   TextureChangeCallback(
>                      double delay = 0.05) :
>           _phaseS(35.0f),
>       _phaseT(18.0f),
>       _phaseScale(5.0f),
>       _delay(delay),
>       _prevTime(0.0)
>   {
>   }
>
>   virtual void operator()(osg::Node*, osg::NodeVisitor* nv)
>   {
>           if (texturecounter == 0) img =
> osgDB::readImageFile("c:\\mgreene\\data\\mach00.bmp");
>           if (texturecounter == 1) img =
> osgDB::readImageFile("c:\\mgreene\\data\\mach01.bmp");
>           if (texturecounter == 2) img =
> osgDB::readImageFile("c:\\mgreene\\data\\mach02.bmp");
>           if (texturecounter == 3) img =
> osgDB::readImageFile("c:\\mgreene\\data\\mach03.bmp");
>           if (texturecounter == 4) img =
> osgDB::readImageFile("c:\\mgreene\\data\\mach04.bmp");
>           if (texturecounter == 5) img =
> osgDB::readImageFile("c:\\mgreene\\data\\mach05.bmp");
>
>           texture->setImage(img);
>           texturecounter+=1;
>           if (texturecounter == 6) texturecounter = 0;
>             }
>
> private:
>
>   float _phaseS, _phaseT, _phaseScale;
>
>   double _delay;
>   double _prevTime;
> };
>
> int main(int argc, char** argv)
> {
>   // use an ArgumentParser object to manage the program arguments.
>   osg::ArgumentParser arguments(&argc,argv);
>
>   osg::Group* root = new osg::Group;
>   osg::BoundingBox bb(0.0f,0.0f,0.0f,1.0f,1.78f,1.78f);
>
>   /////////////////
>   osg::Vec3 top_left(bb.xMin(),bb.yMax(),bb.zMax());
>   osg::Vec3 bottom_left(bb.xMin(),bb.yMax(),bb.zMin());
>   osg::Vec3 bottom_right(bb.xMax(),bb.yMax(),bb.zMin());
>   osg::Vec3 top_right(bb.xMax(),bb.yMax(),bb.zMax());
>     // create geometry
>   osg::Geometry* geom = new osg::Geometry;
>
>   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);
>     osg::Vec2Array* texcoords = new osg::Vec2Array(4);
>   (*texcoords)[0].set(0.0f, 0.0f);
>   (*texcoords)[1].set(1.0f, 0.0f);
>   (*texcoords)[2].set(1.0f, 1.0f);
>   (*texcoords)[3].set(0.0f, 1.0f);
>   geom->setTexCoordArray(0,texcoords);
>
>   osg::Vec3Array* normals = new osg::Vec3Array(1);
>   (*normals)[0].set(0.0f,-1.0f,0.0f);
>   geom->setNormalArray(normals);
>   geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
>
>   osg::Vec4Array* colors = new osg::Vec4Array(1);
>   (*colors)[0].set(1.0f,1.0f,1.0f,1.0f);
>   geom->setColorArray(colors);
>   geom->setColorBinding(osg::Geometry::BIND_OVERALL);
>
>   geom->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4));
>
>   // disable display list so our modified tex coordinates show up
>   geom->setUseDisplayList(false);
>
>   // load image
>    img = osgDB::readImageFile("c:\\mgreene\\data\\mach00.bmp");
>
>   // setup texture
>    texture->setImage(img);
>
>   osg::TexMat* texmat = new osg::TexMat;
>   texmat->setScaleByTextureRectangleSize(true);
>
>   // setup state
>   osg::StateSet* state = geom->getOrCreateStateSet();
>   state->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
>   state->setTextureAttributeAndModes(0, texmat, osg::StateAttribute::ON);
>
>   // turn off lighting
>   state->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
>
>   // install 'update' callback
>   osg::Geode* geode = new osg::Geode;
>   geode->addDrawable(geom);
>   geode->setUpdateCallback(new TextureChangeCallback());
>
>   //////////////////////
>
>   root->addChild(geode);
>
>
>   // construct the viewer.
>   osgViewer::Viewer viewer;
>
>   // create a model from the images.
>   osg::Node* rootNode = root;//createModel((arguments.argc() > 1 ?
> arguments[1] : "b:\\test00.jpg"));//"Images/lz.rgb"));
>
>   // add model to viewer.
>   viewer.setSceneData(rootNode);
>
>   viewer.realize();
>    while( !viewer.done() )
>  {
>     viewer.run();
>
>  }
>  return 0;
>
>   // return viewer.run();
> }
>
> _______________________________________________
> osg-users mailing list
> osg-users@lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to