this code test stereo program :
// OpenSG Tutorial Example: Hello World
//
// Minimalistic OpenSG program
//
// This is the shortest useful OpenSG program
// (if you remove all the comments ;)
//
// It shows how to use OpenSG together with GLUT to
create a little
// interactive scene viewer.
//
// GLUT is used for window handling
#include <OpenSG/OSGGLUT.h>
// General OpenSG configuration, needed everywhere
#include <OpenSG/OSGConfig.h>
// Methods to create simple geometry: boxes, spheres,
tori etc.
#include <OpenSG/OSGSimpleGeometry.h>
// The GLUT-OpenSG connection class
#include <OpenSG/OSGGLUTWindow.h>
// A little helper to simplify scene management and
interaction
#include <OpenSG/OSGSimpleSceneManager.h>
#include <OpenSG/OSGGLUT.h>
#include <OpenSG/OSGConfig.h>
#include <OpenSG/OSGSimpleGeometry.h>
#include <OpenSG/OSGGLUTWindow.h>
#include <OpenSG/OSGSolidBackground.h>
#include <OpenSG/OSGDirectionalLight.h>
#include <OpenSG/OSGPerspectiveCamera.h>
#include <OpenSG/OSGTransform.h>
#include <OpenSG/OSGRenderAction.h>
#include <OpenSG/OSGViewport.h>
#include <OpenSG/OSGGradientBackground.h>
#include <OpenSG/OSGImageBackground.h>
#include <OpenSG/OSGImage.h>
#include <OpenSG/OSGImageForeground.h>
#include <OpenSG/OSGFileGrabForeground.h>
#include <OpenSG/OSGPerspectiveCamera.h>
#include <OpenSG/OSGStereoBufferViewport.h>
#include <OpenSG/OSGColorBufferViewport.h>
#include <OpenSG/OSGShearedStereoCameraDecorator.h>
#include <OpenSG/OSGSceneFileHandler.h>
// Activate the OpenSG namespace
// This is not strictly necessary, you can also prefix
all OpenSG symbols
// with OSG::, but that would be a bit tedious for
this example
OSG_USING_NAMESPACE
// The SimpleSceneManager to manage simple
applications
//SimpleSceneManager *mgr;
PerspectiveCameraPtr leftcamera;
PerspectiveCameraPtr rightcamera;
ViewportPtr leftviewport;
ViewportPtr rightviewport;
WindowPtr window;
NodePtr scene;
NodePtr
leftCamBeacon,rightCamBeacon,lightBeacon,lightNode;
RenderAction *renderAct;
ShearedStereoCameraDecoratorPtr decoleft, decoright;
Real32 zpp = 2, ed = 1;
bool stereobuffer = false;
bool amberblue = false;
// forward declaration so we can have the interesting
stuff upfront
void create_Camera_Viewport();
NodePtr create_scene();
void setupStereo(WindowPtr &win);
void setupStereoService(unsigned char k,int,int);
void checkInitMode(int argc, char **argv);
int setupGLUT( int *argc, char *argv[] );
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
// OSG init
osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
checkInitMode(argc,argv);
// the connection between GLUT and OpenSG
GLUTWindowPtr gwin= GLUTWindow::create();
renderAct=RenderAction::create();
gwin->setSize(1024,768);
gwin->setId(winid);
// gwin->init();
// create the scene
scene = Node::create();
//NodePtr temp=create_scene();
beginEditCP(scene);
scene->setCore(Group::create());
endEditCP(scene);
scene=create_scene();
create_Camera_Viewport();
window=gwin;
window->addPort(leftviewport);
window->addPort(rightviewport);
setupStereo(window);
window->init();
// create the SimpleSceneManager helper
//mgr = new SimpleSceneManager;
// tell the manager what to manage
//mgr->setWindow(gwin );
//mgr->setRoot (scene);
// show the whole scene
//mgr->showAll();
GLint val;
#define cv(v)\
glGetIntegerv((v),&val);\
printf("%s: %d\n", #v, val)
cv(GL_RED_BITS);
cv(GL_GREEN_BITS);
cv(GL_BLUE_BITS);
cv(GL_DEPTH_BITS);
glEnable(GL_DEPTH_TEST);
// GLUT main loop
glutMainLoop();
return 0;
}
//
// GLUT callback functions
//
// redraw the window
void display(void)
{
window->render(renderAct);
//glutPostRedisplay();
// mgr->redraw();
}
// react to size changes
void reshape(int w, int h)
{
window->resize(w, h);
glutPostRedisplay();
}
// react to mouse motions with pressed buttons
void motion(int x, int y)
{
/// mgr->mouseMove(x, y);
glutPostRedisplay();
}
// react to keys
void keyboard(unsigned char k, int x, int y)
{
switch(k)
{
case 27:
{
OSG::osgExit();
exit(0);
}
break;
}
setupStereoService(k,x,y);
//glutPostRedisplay();
}
// setup the GLUT library which handles the windows
for us
int setupGLUT(int *argc, char *argv[])
{
glutInit(argc, argv);
// glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH |
GLUT_DOUBLE);
int winid = glutCreateWindow("OpenSG");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutIdleFunc(display);
// glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
return winid;
}
void create_Camera_Viewport()
{
leftcamera=PerspectiveCamera::create();
rightcamera=PerspectiveCamera::create();
beginEditCP(leftcamera);
leftcamera->setBeacon(leftCamBeacon);
leftcamera->setFov(deg2rad(90));
leftcamera->setNear(0.1);
leftcamera->setFar(100000);
endEditCP(leftcamera);
beginEditCP(rightcamera);
rightcamera->setBeacon(rightCamBeacon);
rightcamera->setFov(deg2rad(90));
rightcamera->setNear(0.1);
rightcamera->setFar(100000);
endEditCP(rightcamera);
GradientBackgroundPtr
bg=GradientBackground::create();
beginEditCP(bg);
bg->addLine(Color3f(0,0,0),0);
bg->addLine(Color3f(1,1,1),1);
endEditCP(bg);
GradientBackgroundPtr
bg1=GradientBackground::create();
beginEditCP(bg1);
bg1->addLine(Color3f(0,0,0),0);
bg1->addLine(Color3f(1,1,1),1);
endEditCP(bg1);
leftviewport=Viewport::create();
rightviewport=Viewport::create();
beginEditCP(leftviewport);
leftviewport->setBackground(bg);
leftviewport->setCamera(leftcamera);
leftviewport->setRoot(scene);
leftviewport->setSize(0,0,0.5,1);
endEditCP(leftviewport);
beginEditCP(rightviewport);
rightviewport->setBackground(bg1);
rightviewport->setCamera(rightcamera);
rightviewport->setRoot(scene);
rightviewport->setSize(0.5,0,1,1);
beginEditCP(rightviewport);
}
NodePtr create_scene()
{
NodePtr node=Node::create();
beginEditCP(node);
node->setCore(Group::create());
endEditCP(node);
leftCamBeacon = Node::create();
rightCamBeacon = Node::create();
lightBeacon = Node::create();
lightNode = Node::create();
beginEditCP(leftCamBeacon);
beginEditCP(rightCamBeacon);
beginEditCP(lightBeacon);
TransformPtr leftCamTrans, rightCamTrans,
lightTrans;
leftCamTrans = Transform::create();
rightCamTrans = Transform::create();
lightTrans = Transform::create();
beginEditCP(leftCamTrans);
beginEditCP(rightCamTrans);
beginEditCP(lightTrans);
Matrix leftM, rightM, lightM;
leftM.setIdentity();
rightM.setIdentity();
lightM.setIdentity();
leftM.setTransform(Vec3f(0,0,7));
rightM.setTransform(Vec3f(0,0,7));
//lightM.setTransform(Vec3f(1,10,2));
leftCamTrans->setMatrix(leftM);
rightCamTrans->setMatrix(rightM);
lightTrans->setMatrix(lightM);
endEditCP(leftCamTrans);
endEditCP(rightCamTrans);
endEditCP(lightTrans);
leftCamBeacon->setCore(leftCamTrans);
rightCamBeacon->setCore(rightCamTrans);
lightBeacon->setCore(lightTrans);
endEditCP(lightBeacon);
endEditCP(rightCamBeacon);
endEditCP(leftCamBeacon);
DirectionalLightPtr dLight =
DirectionalLight::create();
beginEditCP(dLight);
dLight->setDirection(Vec3f(0,1,2));
//color information
dLight->setDiffuse(Color4f(1,1,1,1));
dLight->setAmbient(Color4f(0.2,0.2,0.2,1));
dLight->setSpecular(Color4f(1,1,1,1));
//set the beacon
dLight->setBeacon(lightBeacon);
endEditCP (dLight);
lightNode = Node::create();
NodePtr torus=makeTorus(0.1,4,16,16);
beginEditCP(lightNode);
lightNode->setCore(dLight);
lightNode->addChild(torus);
endEditCP(lightNode);
beginEditCP(node);
node->addChild(lightNode);
node->addChild(leftCamBeacon);
node->addChild(rightCamBeacon);
node->addChild(lightBeacon);
endEditCP(node);
return node;
}
/*ShearedStereoCameraDecoratorPtr decoleft, decoright;
Real32 zpp = 2, ed = 1;
bool stereobuffer = false;
bool amberblue = false;
*/
void setupStereo(WindowPtr &win)
{
ViewportPtr vp = win->getPort(0);
ViewportPtr vp1 = win->getPort(1);
if(vp!=vp1) printf("\nOk");
PerspectiveCameraPtr cam =
PerspectiveCameraPtr::dcast(vp->getCamera());
PerspectiveCameraPtr cam1 =
PerspectiveCameraPtr::dcast(vp1->getCamera());
beginEditCP(cam);
cam->setFov(deg2rad(90));
cam->setAspect(1);
endEditCP (cam);
beginEditCP(cam1);
cam1->setFov(deg2rad(90));
cam1->setAspect(1);
endEditCP (cam1);
// create the decorators and the second viewport
ViewportPtr vpleft,vpright;
decoleft = ShearedStereoCameraDecorator::create();
decoright =
ShearedStereoCameraDecorator::create();
beginEditCP(decoleft);
decoleft->setEyeSeparation(ed);
decoleft->setZeroParallaxDistance(zpp);
decoleft->setLeftEye(true);
decoleft->setDecoratee(cam);
endEditCP (decoleft);
beginEditCP(decoright);
decoright->setEyeSeparation(ed);
decoright->setZeroParallaxDistance(zpp);
decoright->setLeftEye(false);
decoright->setDecoratee(cam1);
endEditCP (decoright);
if(amberblue)
{
ColorBufferViewportPtr svpleft =
ColorBufferViewport::create();
ColorBufferViewportPtr svpright =
ColorBufferViewport::create();
beginEditCP(svpleft);
svpleft->setLeft(0);
svpleft->setRight(1);
svpleft->setBottom(0);
svpleft->setTop(1);
svpleft->setCamera(decoleft);
svpleft->setBackground(vp->getBackground());
svpleft->setRoot(vp->getRoot());
svpleft->setRed(GL_TRUE);
svpleft->setGreen(GL_TRUE);
svpleft->setBlue(GL_FALSE);
svpleft->setAlpha(GL_TRUE);
endEditCP (svpleft);
beginEditCP(svpright);
svpright->setLeft(0);
svpright->setRight(1);
svpright->setBottom(0);
svpright->setTop(1);
svpright->setCamera(decoright);
svpright->setBackground(vp1->getBackground());
svpright->setRoot(vp1->getRoot());
svpright->setRed(GL_FALSE);
svpright->setGreen(GL_FALSE);
svpright->setBlue(GL_TRUE);
svpright->setAlpha(GL_FALSE);
endEditCP (svpright);
vpleft = svpleft;
vpright = svpright;
printf("\nVao mau\n");
}
else if(stereobuffer)
{
printf("\nVao Stereo");
StereoBufferViewportPtr svpleft =
StereoBufferViewport::create();
StereoBufferViewportPtr svpright =
StereoBufferViewport::create();
beginEditCP(svpleft);
svpleft->setLeft(0);
svpleft->setRight(1);
svpleft->setBottom(0);
svpleft->setTop(1);
svpleft->setCamera(decoleft);
svpleft->setBackground(vp->getBackground());
svpleft->setRoot(vp->getRoot());
svpleft->setLeftBuffer(true);
svpleft->setRightBuffer(false);
endEditCP (svpleft);
beginEditCP(svpright);
svpright->setLeft(0);
svpright->setRight(1);
svpright->setBottom(0);
svpright->setTop(1);
svpright->setCamera(decoright);
svpright->setBackground(vp1->getBackground());
svpright->setRoot(vp1->getRoot());
svpright->setLeftBuffer(false);
svpright->setRightBuffer(true);
endEditCP (svpright);
vpleft = svpleft;
vpright = svpright;
}
else
{
printf("\nVao viewport");
vpleft = vp;
vpright = Viewport::create();
beginEditCP(vpleft);
vpleft->setLeft(0);
vpleft->setRight(1);
vpleft->setBottom(0);
vpleft->setTop(0.5);
endEditCP (vpleft);
beginEditCP(vpright);
vpright->setLeft(0);
vpright->setRight(1);
vpright->setBottom(0.5);
vpright->setTop(1);
vpright->setBackground(vp1->getBackground());
vpright->setRoot(vp1->getRoot());
endEditCP (vpright);
}
beginEditCP(vpleft);
vpleft->setCamera(decoleft);
endEditCP (vpleft);
beginEditCP(vpright);
vpright->setCamera(decoright);
endEditCP (vpright);
beginEditCP(win);
win->subPort(vp);
win->subPort(vp1);
win->addPort(vpleft);
win->addPort(vpright);
endEditCP (win);
}
void setupStereoService(unsigned char k,int,int)
{
switch(k)
{
//case 27: exit(1);
case '1': zpp /= 1.1;
break;
case '2': zpp *= 1.1;
break;
case 'z': ed /= 1.1;
break;
case 'x': ed *= 1.1;
break;
}
std::cout << "ZPP:" << zpp << " ED:" << ed <<
std::endl;
beginEditCP(decoleft);
decoleft->setEyeSeparation(ed);
decoleft->setZeroParallaxDistance(zpp);
endEditCP (decoleft);
beginEditCP(decoright);
decoright->setEyeSeparation(ed);
decoright->setZeroParallaxDistance(zpp);
endEditCP (decoright);
}
void checkInitMode(int argc, char **argv)
{
// glutInit(&argc, argv);
// bool stereobuffer = false;
//bool amberblue = false;
if(argc >= 2 && !strcmp(argv[1],"-s"))
{
stereobuffer = true;
--argc, ++argv;
}
if(argc >= 2 && !strcmp(argv[1],"-a"))
{
amberblue = true;
--argc, ++argv;
}
//stereobuffer = true;
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH |
GLUT_DOUBLE |
(stereobuffer?GLUT_STEREO:0)
);
}
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
-------------------------------------------------------
This SF.Net email is sponsored by: NEC IT Guy Games. How far can you shotput
a projector? How fast can you ride your desk chair down the office luge track?
If you want to score the big prize, get to know the little guy.
Play to win an NEC 61" plasma display: http://www.necitguy.com/?r=20
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users