[osg-users] How to set Texturerect to BGRA?

2008-05-23 Thread Mike Greene

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


Re: [osg-users] How to set Texturerect to BGRA?

2008-05-23 Thread Robert Osfield
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] :