Hi Nick
Find my code below to compile,
Code:
#include <osg/Node>
#include <osg/Geometry>
#include <osg/Notify>
#include <osg/MatrixTransform>
#include <osg/Texture2D>
#include <osg/DrawPixels>
#include <osg/PolygonOffset>
#include <osg/Geode>
#include <osgDB/Registry>
#include <osgDB/ReadFile>
#include <osgText/Text>
#include <osgViewer/Viewer>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/StateSetManipulator>
#include <osgGA/TrackballManipulator>
#include <iostream.h>
#undef MULTI_SCREEN
#define NUM_CAMERA 1
#define NUM_SCREEN 1
unsigned char *buf_1, *buf_2, *buf_3, *buf_4;
int buf_width=1920, buf_height=1200;
unsigned int numCameras = NUM_CAMERA;
unsigned int numScreens = NUM_SCREEN;
int width=1920 * NUM_SCREEN;
int height=1200;
int read_off=0;
osg::ref_ptr<osg::Image> image;
osg::Texture2D *texture[4];
osg::Geometry *geom[4];
void initRead(char* fname, int w, int h)
{
buf_1=new unsigned char[buf_width * buf_height];
buf_2=new unsigned char[buf_width * buf_height];
buf_3=new unsigned char[buf_width * buf_height];
buf_4=new unsigned char[buf_width * buf_height];
memset((unsigned char*)buf_1,(unsigned char)128,buf_width * buf_height);
memset((unsigned char*)buf_2,(unsigned char)160,buf_width * buf_height);
memset((unsigned char*)buf_3,(unsigned char)180,buf_width * buf_height);
memset((unsigned char*)buf_4,(unsigned char)200,buf_width * buf_height);
}
osg::Node* createTex(int index, unsigned char* buf)
{
osg::Group* group=new osg::Group;
osg::Vec3 top_left(0.0f ,0.0f ,height);
osg::Vec3 bottom_left(0.0f ,0.0f ,0.0f);
osg::Vec3 bottom_right(width ,0.0f, 0.0f);
osg::Vec3 top_right(width, 0.0f, height);
geom[index] = 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[index]->setVertexArray(vertices);
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[index]->setTexCoordArray(0,texcoords);
osg::Vec3Array* normals = new osg::Vec3Array(1);
(*normals)[0].set(1.0f,0.0f,0.0f);
geom[index]->setNormalArray(normals);
geom[index]->setNormalBinding(osg::Geometry::BIND_OVERALL);
osg::Vec4Array* colors = new osg::Vec4Array(1);
(*colors)[0].set(1.0f,1.0f,1.0f,1.0f);
geom[index]->setColorArray(colors);
geom[index]->setColorBinding(osg::Geometry::BIND_OVERALL);
geom[index]->addPrimitiveSet(new osg::DrawArrays(GL_QUADS,0,4));
osg::Geode* geom_geode = new osg::Geode;
geom_geode->addDrawable(geom[index]);
texture[index] = new osg::Texture2D;
texture[index]->setName("TEXTURE");
texture[index]->setDataVariance(osg::Object::DYNAMIC); // protect from
being optimized away as static state.
texture[index]->setResizeNonPowerOfTwoHint(false);
// Setting buffer
image = new osg::Image;
image->setName("BUFFER");
image->setOrigin(osg::Image::BOTTOM_LEFT);
image->setImage(buf_width, buf_height, 1, GL_LUMINANCE, GL_LUMINANCE,
GL_UNSIGNED_BYTE,buf, osg::Image::NO_DELETE);
texture[index]->setImage(image);
osg::StateSet* stateset = geom[index]->getOrCreateStateSet();
stateset->setTextureAttributeAndModes(0,texture[index],osg::StateAttribute::ON);
stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
group->addChild(geom_geode);
return group;
}
void setView(osgViewer::View* view, int screen_no)
{
double aspectRatioScale = 1.0;
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
osg::GraphicsContext::Traits;
traits->screenNum = screen_no;
traits->x = (screen_no*width)/numCameras;
traits->y = 0;
traits->width = width/numCameras-1;
traits->height = height;
traits->windowDecoration = true;
traits->doubleBuffer = true;
traits->sharedContext = 0;
osg::ref_ptr<osg::GraphicsContext> gc =
osg::GraphicsContext::createGraphicsContext(traits.get());
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext(gc.get());
camera->setViewport(new osg::Viewport(0,0, width/numCameras, height));
camera->setProjectionMatrix(osg::Matrix::ortho2D(0,1920,0,1200));
camera->setViewMatrix(osg::Matrix::identity());
camera->setClearMask(GL_DEPTH_BUFFER_BIT);
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
view->addSlave(camera.get(), osg::Matrix::scale(aspectRatioScale, 1.0,
1.0)*osg::Matrix::translate(0.0, 0.0, 0.0), osg::Matrix() );
}
int main(int , char **)
{
osgViewer::CompositeViewer viewer;
osg::Group* root=new osg::Group;
osgGA::TrackballManipulator* tm=new osgGA::TrackballManipulator;
// Screen-1
{
osg::Group* scene=new osg::Group;
scene->addChild(createTex(0,buf_1));
osgViewer::View* view = new osgViewer::View;
view->setName("View-1");
view->setSceneData(scene);
setView(view, 0);
view->setCameraManipulator(tm);
viewer.addView(view);
}
#ifdef MULTI_SCREEN
// Screen-2
{
osg::Group* scene=new osg::Group;
scene->addChild(createTex(1,buf_2));
osgViewer::View* view = new osgViewer::View;
view->setName("View-2");
view->setSceneData(scene);
setView(view, 1);
view->setCameraManipulator(tm);
viewer.addView(view);
}
// Screen-3
{
osg::Group* scene=new osg::Group;
scene->addChild(createTex(2,buf_3));
osgViewer::View* view = new osgViewer::View;
view->setName("View-3");
view->setSceneData(scene);
setView(view, 2);
view->setCameraManipulator(tm);
viewer.addView(view);
}
// Screen-4
{
osg::Group* scene=new osg::Group;
scene->addChild(createTex(3,buf_4));
osgViewer::View* view = new osgViewer::View;
view->setName("View-4");
view->setSceneData(scene);
setView(view, 3);
view->setCameraManipulator(tm);
viewer.addView(view);
}
#endif
viewer.setThreadingModel(osgViewer::CompositeViewer::CullDrawThreadPerContext);
viewer.realize();
while(!viewer.done()){
viewer.frame();
}
delete [] buf_1;
delete [] buf_2;
delete [] buf_3;
delete [] buf_4;
return 0;
}
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=26184#26184
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org