int init(int argc, char **argv) { OSG::osgInit(argc,argv); // GLUT init glutInit(&argc, argv); glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); int winid = glutCreateWindow("OpenSG"); glutKeyboardFunc(key); glutVisibilityFunc(vis); glutReshapeFunc(reshape); glutDisplayFunc(display); glutMouseFunc(mouse); glutMotionFunc(motion); glutIdleFunc(display); // OSG OSG::SceneFileHandler::the()->print(); // create the graph // beacon for camera and light OSG::NodeUnrecPtr b1n = OSG::Node::create(); OSG::GroupUnrecPtr b1 = OSG::Group::create(); b1n->setCore(b1); // transformation OSG::NodeUnrecPtr t1n = OSG::Node::create(); OSG::TransformUnrecPtr t1 = OSG::Transform::create(); t1n->setCore (t1 ); t1n->addChild(b1n); cam_trans = t1; // light OSG::NodeUnrecPtr dlight = OSG::Node::create(); OSG::DirectionalLightUnrecPtr dl = OSG::DirectionalLight::create(); dlight->setCore(dl); dl->setAmbient (0.0, 0.0, 0.0, 1.0); dl->setDiffuse (0.8, 0.8, 0.8, 1.0); dl->setDirection(0.0, 0.0, 1.0 ); dl->setBeacon (b1n ); // root OSG::NodeUnrecPtr root = OSG::Node::create(); OSG::GroupUnrecPtr gr1 = OSG::Group::create(); root->setCore (gr1 ); root->addChild(t1n ); root->addChild(dlight); // Load the file OSG::NodeUnrecPtr file = NULL; if(argc > 1) { file = OSG::SceneFileHandler::the()->read(argv[1], NULL); } if(file == NULL) { std::cerr << "Couldn't load file, ignoring" << std::endl; //file = OSG::makeSphere(4, 2.0); file = OSG::Node::create(); OSG::AlgorithmStageUnrecPtr pStage = OSG::AlgorithmStage::create(); file->setCore(pStage); pAlgo = OSG::GPUVolRTV2::create(); pStage->setAlgorithm(pAlgo); // fix/freeze the node volume file->editVolume().setStatic(true); file->editVolume().setBounds( 0.f, 0.f, 0.f, 1.f, 1.f, 1.f); } OSG::commitChanges(); file->updateVolume(); OSG::Vec3f min,max; file->getVolume().getBounds( min, max ); std::cout << "Volume: from " << min << " to " << max << std::endl; OSG::MultiCoreUnrecPtr pMCore = OSG::MultiCore::create(); pCOver = OSG::ChunkOverrideGroup::create(); OSG::TransformRecPtr scene_trans = OSG::Transform::create(); pMCore->addCore(scene_trans); pMCore->addCore(pCOver ); pPoly = OSG::PolygonChunk::create(); OSG::NodeUnrecPtr sceneTrN = OSG::Node::create(); sceneTrN->setCore (pMCore); sceneTrN->addChild(file ); dlight->addChild(sceneTrN); // Camera OSG::PerspectiveCameraRecPtr cam = OSG::PerspectiveCamera::create(); cam->setBeacon(b1n ); cam->setFov (OSG::osgDegree2Rad(60)); cam->setNear (0.1 ); cam->setFar (400 ); // Background OSG::SolidBackgroundUnrecPtr bkgnd = OSG::SolidBackground::create(); bkgnd->setColor(OSG::Color3f(0,0,0)); // Viewport OSG::ViewportRecPtr vp = OSG::Viewport::create(); vp->setCamera (cam ); vp->setBackground(bkgnd ); vp->setRoot (root ); vp->setSize (0, 0, 1, 1); // Window std::cout << "GLUT winid: " << winid << std::endl; GLint glvp[4]; glGetIntegerv(GL_VIEWPORT, glvp); OSG::GLUTWindowUnrecPtr gwin = OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->setSize( glvp[2], glvp[3] ); win = gwin; win->addPort(vp); win->init(); // Action rentravact = OSG::RenderAction::create(); // renact->setFrustumCulling(false); // tball OSG::Vec3f pos; pos.setValues(min[0] + ((max[0] - min[0]) * 0.5), min[1] + ((max[1] - min[1]) * 0.5), max[2] + ( max[2] - min[2] ) * 1.5 ); float scale = (max[2] - min[2] + max[1] - min[1] + max[0] - min[0]) / 6; OSG::Pnt3f tCenter(min[0] + (max[0] - min[0]) / 2, min[1] + (max[1] - min[1]) / 2, min[2] + (max[2] - min[2]) / 2); fprintf(stderr, "Startpos : %f %f %f\n", pos[0], pos[1], pos[2]); tball.setMode (OSG::Trackball::OSGObject); tball.setStartPosition (pos, true ); tball.setSum (true ); tball.setTranslationMode (OSG::Trackball::OSGFree ); tball.setTranslationScale(scale ); tball.setRotationCenter (tCenter ); // run... return 0; }
void init(std::vector<std::string> &filenames) { size_t i; OSG::DirectionalLightUnrecPtr dl; OSG::Real32 x,y,z; OSG::BoxVolume volume; OSG::Vec3f min,max; OSG::Vec3f size; glEnable( GL_DEPTH_TEST ); glEnable( GL_LIGHTING ); glEnable( GL_LIGHT0 ); // GLint twoSide = 1; // glLightModeliv(GL_LIGHT_MODEL_TWO_SIDE,&twoSide); glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); // create the graph // beacon for camera and light OSG::NodeUnrecPtr b1n = OSG::Node::create(); OSG::GroupUnrecPtr b1 = OSG::Group::create(); b1n->setCore( b1 ); // transformation OSG::NodeUnrecPtr t1n = OSG::Node::create(); OSG::TransformUnrecPtr t1 = OSG::Transform::create(); t1n->setCore( t1 ); t1n->addChild( b1n ); cam_trans = t1; // light OSG::NodeUnrecPtr dlight = OSG::Node::create(); dl = OSG::DirectionalLight::create(); dlight->setCore( dl ); dl->setAmbient( .3f, .3f, .3f, 1 ); dl->setDiffuse( 1, 1, 1, 1 ); dl->setDirection(0,0,1); dl->setBeacon( b1n); // root root = OSG::Node::create(); OSG::GroupUnrecPtr gr1 = OSG::Group::create(); root->setCore( gr1 ); root->addChild( t1n ); root->addChild( dlight ); // Load the file OSG::NodeUnrecPtr scene = OSG::Node::create(); scene->setCore(OSG::Group::create()); OSG::NodeUnrecPtr file; for(i=0;i<filenames.size();i++) { file = OSG::SceneFileHandler::the()->read(filenames[i].c_str(),0); if(file != NULL) scene->addChild(file); else std::cerr << "Couldn't load file, ignoring " << filenames[i] << std::endl; } if ( filenames.size()==0 ) { file = OSG::makeTorus( .5, 2, 16, 16 ); scene->addChild(file); // scene->addChild(makeBox(.6,.6,.6,5,5,5)); } prepareSceneGraph(scene); OSG::Thread::getCurrentChangeList()->commitChanges(); scene->invalidateVolume(); scene->updateVolume(); volume=scene->getVolume(); volume.getBounds(min,max); size = max-min; if(ca>0) { if(cb==-1) cb=ca; if(cc==-1) cc=cb; OSG::NodeUnrecPtr node; OSG::NodeUnrecPtr geoNode; OSG::TransformUnrecPtr trans; for(x=-ca/2.0 ; x<ca/2.0 ; x++) for(y=-cb/2.0 ; y<cb/2.0 ; y++) for(z=-cc/2.0 ; z<cc/2.0 ; z++) { trans=OSG::Transform::create(); node=OSG::Node::create(); node->setCore(trans); trans->editMatrix().setTranslate( x*size[0]*1.1, y*size[1]*1.1, z*size[2]*1.1); geoNode = OSG::cloneTree(scene); geoNode->editSFVolume()->getValue() = scene->getSFVolume()->getValue(); geoNode->editVolume(false).setValid(true); node->addChild( geoNode ); dlight->addChild(node); } } else { dlight->addChild(scene); } if(ca>0) { sum_geometries*=OSG::UInt32(ca*cb*cc); sum_triangles *=OSG::UInt32(ca*cb*cc); sum_positions *=OSG::UInt32(ca*cb*cc); } OSG::Thread::getCurrentChangeList()->commitChanges(); // dlight->invalidateVolume(); printf("update Volume\n"); dlight->updateVolume(); printf("update Volume OK\n"); // should check first. ok for now. const OSG::BoxVolume &vol = dlight->getVolume(); OSG::Pnt3f center; vol.getBounds(min, max); vol.getCenter(center); size = max - min; std::cout << "Volume: from " << min << " to " << max << std::endl; std::cout << "Center: " << center << std::endl; // Camera OSG::PerspectiveCameraUnrecPtr cam = OSG::PerspectiveCamera::create(); cam->setBeacon( b1n ); cam->setFov( OSG::osgDegree2Rad( 60 ) ); cam->setNear( 10 ); cam->setFar( 50000 ); // Solid Background bkgnd = OSG::SolidBackground::create(); bkgnd->setColor( OSG::Color3f(0,0,0) ); // bkgnd->setColor( OSG::Color3f(.1,.1,.6) ); // bkgnd->setColor( OSG::Color3f(1,1,1) ); // Viewport OSG::ViewportUnrecPtr vp1; OSG::ViewportUnrecPtr vp2; if(stereoMode == 0) { vp1 = OSG::Viewport::create(); vp1->setCamera ( cam ); vp1->setBackground( bkgnd ); vp1->setRoot ( root ); vp1->setSize ( 0,0, 1,1 ); if(multiport) { vp2 = OSG::Viewport::create(); vp2->setCamera ( cam ); vp2->setBackground( bkgnd ); vp2->setRoot ( root ); vp2->setSize ( .1f, .55f, .7f,.95f ); } } else if(stereoMode == 1) { OSG::ShearedStereoCameraDecoratorUnrecPtr deco; // left deco=OSG::ShearedStereoCameraDecorator::create(); deco->setLeftEye(true); deco->setEyeSeparation(eyedistance); deco->setDecoratee(cam); deco->setZeroParallaxDistance(zeroparallax); vp1 = OSG::Viewport::create(); vp1->setCamera ( deco ); vp1->setBackground( bkgnd ); vp1->setRoot ( root ); vp1->setSize ( 0,0, .5,1 ); // right deco=OSG::ShearedStereoCameraDecorator::create(); deco->setLeftEye(false); deco->setEyeSeparation(eyedistance); deco->setDecoratee(cam); deco->setZeroParallaxDistance(zeroparallax); vp2 = OSG::Viewport::create(); vp2->setCamera ( deco ); vp2->setBackground( bkgnd ); vp2->setRoot ( root ); vp2->setSize ( .5,0,1,1 ); } else if(stereoMode == 2) { OSG::ShearedStereoCameraDecoratorUnrecPtr deco; // left deco=OSG::ShearedStereoCameraDecorator::create(); deco->setLeftEye(true); deco->setEyeSeparation(eyedistance); deco->setDecoratee(cam); deco->setZeroParallaxDistance(zeroparallax); OSG::ColorBufferViewportUnrecPtr cvp1 = OSG::ColorBufferViewport::create(); cvp1->setCamera ( deco ); cvp1->setBackground( bkgnd ); cvp1->setRoot ( root ); cvp1->setSize ( 0,0, 1,1 ); cvp1->setRed(GL_FALSE); cvp1->setGreen(GL_TRUE); cvp1->setBlue(GL_TRUE); cvp1->setAlpha(GL_TRUE); vp1 = cvp1; // right deco=OSG::ShearedStereoCameraDecorator::create(); deco->setLeftEye(false); deco->setEyeSeparation(eyedistance); deco->setDecoratee(cam); deco->setZeroParallaxDistance(zeroparallax); OSG::ColorBufferViewportUnrecPtr cvp2 = OSG::ColorBufferViewport::create(); cvp2->setCamera ( deco ); cvp2->setBackground( bkgnd ); cvp2->setRoot ( root ); cvp2->setSize ( 0,0,1,1 ); cvp2->setRed(GL_TRUE); cvp2->setGreen(GL_FALSE); cvp2->setBlue(GL_FALSE); cvp2->setAlpha(GL_FALSE); vp2 = cvp2; } GLint glvp[4]; glGetIntegerv( GL_VIEWPORT, glvp ); if(serverx>0 && servery>0) clusterWindow->setSize( serverx, servery ); else clusterWindow->setSize( glvp[2], glvp[3] ); clusterWindow->addPort( vp1 ); if(multiport || stereoMode > 0) clusterWindow->addPort( vp2 ); if(serviceInterfaceValid == true) { clusterWindow->setServiceInterface(serviceInterface); fprintf(stderr, "tcclient use if %s\n", serviceInterface.c_str()); } if(serviceAddressValid == true) { clusterWindow->setServiceAddress(serviceAddress); fprintf(stderr, "tcclient use ba %s\n", serviceAddress.c_str()); } // tball OSG::Vec3f pos(min[0] + ((max[0] - min[0]) * 0.5), min[1] + ((max[1] - min[1]) * 0.5), max[2] + ( max[2] - min[2] ) * 1.5 ); float scale = (max[2] - min[2] + max[1] - min[1] + max[0] - min[0]) / 6; tball.setMode( OSG::Trackball::OSGObject ); tball.setStartPosition( pos, true ); tball.setSum( true ); tball.setTranslationMode( OSG::Trackball::OSGFree ); tball.setTranslationScale(scale); tball.setRotationCenter(center); tball.setTranslationGen(OSG::Trackball::OSGAbsoluteTranslation); // run... std::cout << size.length() << std::endl; cam->setFar (size.length() * 100.0); cam->setNear(size.length() * 100.0 / 100000.0); }