// Initialize GLUT & OpenSG and set up the scene int doMain(int argc, char **argv) { // OSG init OSG::osgInit(argc,argv); // GLUT init int winid = setupGLUT(&argc, argv); // the connection between GLUT and OpenSG OSG::GLUTWindowRecPtr gwin= OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->init(); // put the geometry core into a node scene = OSG::Node::create(); OSG::GroupRecPtr groupPtr = OSG::Group::create(); scene->setCore(groupPtr); statfg = OSG::SimpleStatisticsForeground::create(); statfg->setSize(25); statfg->setColor(OSG::Color4f(0,1,0,0.9f)); statfg->addElement(textureFormatDesc, "Pixel Format: %s"); statfg->addElement(textureDataTypeDesc, "Data Type: %s"); statfg->addElement(textureSizeDesc, "Texture Size: %s"); statfg->addElement(textureDimensionDesc, "Dimension: %i"); statfg->addElement(textureBPPDesc, "BPP: %i"); statfg->addElement(textureMipMapCountDesc, "MipMapCount: %i"); statfg->addElement(textureFrameCountDesc, "FrameCount: %i"); // Create the background OSG::SolidBackgroundRecPtr bg = OSG::SolidBackground::create(); bg->setColor(OSG::Color3f(0.1f, 0.1f, 0.5f)); if (argc < 2) { std::cerr << "Usage: testImageLoader <filename>" << std::endl; return EXIT_FAILURE; } updateScene(argv[1]); szFilename = argv[1]; // create the SimpleSceneManager helper mgr = new OSG::SimpleSceneManager; // tell the manager what to manage mgr->setWindow(gwin ); mgr->setRoot (scene); // show the whole scene mgr->showAll(); // add the statistics forground gwin->getPort(0)->addForeground(statfg); gwin->getPort(0)->setBackground(bg); return 0; }
int main( int argc, char **argv ) { // OSG init OSG::osgInit(argc, argv); OSG::SceneFileHandler::the()->print(); // create the graph // beacon for camera and light OSG::NodeRecPtr b1n = OSG::Node::create(); OSG::GroupRecPtr b1 = OSG::Group::create(); b1n->setCore( b1 ); // transformation OSG::NodeRecPtr t1n = OSG::Node::create(); OSG::TransformRecPtr t1 = OSG::Transform::create(); t1n->setCore( t1 ); t1n->addChild( b1n ); cam_trans = t1; // light OSG::NodeRecPtr dlight = OSG::Node::create(); OSG::DirectionalLightRecPtr dl = OSG::DirectionalLight::create(); dlight->setCore( dl ); dl->setAmbient( .3, .3, .3, 1 ); dl->setDiffuse( 1, 1, 1, 1 ); dl->setDirection(0,0,1); dl->setBeacon( b1n); // root root = OSG::Node::create(); OSG::GroupRecPtr gr1 = OSG::Group::create(); root->setCore( gr1 ); root->addChild( t1n ); root->addChild( dlight ); // Load the file OSG::NodeRecPtr file = NULL; if ( argc > 1 ) file = OSG::SceneFileHandler::the()->read(argv[1]); if ( file == NULL ) { std::cerr << "Couldn't load file, ignoring" << std::endl; file = OSG::makeTorus( .5, 2, 16, 16 ); } OSG::commitChanges(); file->updateVolume(); OSG::Vec3f min,max; file->getVolume().getBounds( min, max ); std::cout << "Volume: from " << min << " to " << max << std::endl; dlight->addChild( file ); std::cerr << "Tree: " << std::endl; root->dump(); // Camera OSG::PerspectiveCameraRecPtr cam = OSG::PerspectiveCamera::create(); cam->setBeacon( b1n ); cam->setFov( OSG::osgDegree2Rad( 60 ) ); cam->setNear( 1 ); cam->setFar( 4000 ); // Background OSG::SolidBackgroundRecPtr bkgnd = OSG::SolidBackground::create(); bkgnd->setColor( OSG::Color3f( 0,0,1 ) ); // Viewport vp = OSG::Viewport::create(); vp->setCamera( cam ); vp->setBackground( bkgnd ); vp->setRoot( root ); vp->setSize( 0,0, 1,1 ); // Action ract = OSG::RenderAction::create(); // QT init QApplication::setColorSpec( QApplication::CustomColor ); a = new QApplication( argc, argv ); if ( !QGLFormat::hasOpenGL() ) { qWarning( "This system has no OpenGL support. Exiting." ); return -1; } OSG::Vec3f pos( 0, 0, max[2] + ( max[2] - min[2] ) * 1.5 ); // Create Window glWidget = new MyOSGQGLWidget( new OSG::OSGQGLWidget::GLContext(QGLFormat::defaultFormat()), 0, 0, 0); glWidget->tball.setMode( OSG::Trackball::OSGObject ); glWidget->tball.setStartPosition( pos, true ); glWidget->tball.setSum( true ); glWidget->tball.setTranslationMode( OSG::Trackball::OSGFree ); glWidget->osgWin = OSG::QT4Window::create(); glWidget->osgWin->setGlWidget( glWidget ); glWidget->osgWin->addPort( vp ); glWidget->osgWin->init(&MyOSGQGLWidget::initOpenGL); a->processEvents(); glWidget->show(); a->exec(); // execute QT main loop root = NULL; file = NULL; vp = NULL; cam_trans = NULL; cam = NULL; osgTWin = NULL; delete glWidget; glWidget = NULL; delete a; return 0; }
int main(int argc, char *argv[]) { // Init the OpenSG subsystem OSG::osgInit(argc, argv); { // We create a GLUT Window (that is almost the same for most applications) int winid = setupGLUT(&argc, argv); OSG::GLUTWindowRecPtr gwin = OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->init(); // Create the face std::string family = "SANS"; OSG::TextFace::Style style = OSG::TextFace::STYLE_PLAIN; OSG::UInt32 size = 32; OSG::TextPixmapFaceRefPtr face = OSG::TextPixmapFace::create(family, style, size); if (face == 0) { std::cerr << "ERROR: Cannot create face object!" << std::endl; return -1; } // Lay out one single line of text std::string text = "Hello World!"; // Use UTF-8 encoding! OSG::TextLayoutParam layoutParam; layoutParam.horizontal = true; layoutParam.leftToRight = true; layoutParam.topToBottom = true; layoutParam.majorAlignment = OSG::TextLayoutParam::ALIGN_FIRST; layoutParam.minorAlignment = OSG::TextLayoutParam::ALIGN_FIRST; layoutParam.spacing = 1.f; layoutParam.length.push_back(0.f); layoutParam.maxExtend = 0.f; OSG::TextLayoutResult layoutResult; face->layout(text, layoutParam, layoutResult); // Render the text into an OpenSG image OSG::Vec2f offset; OSG::UInt32 border = 1; OSG::ImageRecPtr imagePtr = face->makeImage(layoutResult, offset, border); // Create the geometry which we will assign the texture to OSG::Real32 width = imagePtr->getWidth(); OSG::Real32 height = imagePtr->getHeight(); OSG::NodeRecPtr plane = OSG::makePlane(width, height, 1, 1); // Create the texture that will hold the image OSG::SimpleTexturedMaterialRecPtr tex = OSG::SimpleTexturedMaterial::create(); tex->setImage(imagePtr); tex->setEnvMode(GL_MODULATE); tex->setDiffuse(OSG::Color3f(1, 0, 0)); // Assign the texture to the geometry OSG::GeometryRecPtr geo = dynamic_cast<OSG::Geometry *>(plane->getCore()); geo->setMaterial(tex); // Transform the geometry so that the origin of the text is at // the origin of the world coordinate system OSG::NodeRecPtr scene = OSG::Node::create(); OSG::TransformRecPtr transformPtr = OSG::Transform::create(); OSG::Matrix m; m.setTranslate(offset.x() + width / 2, offset.y() - height / 2, 0); transformPtr->setMatrix(m); scene->setCore(transformPtr); scene->addChild(plane); // Create and setup the SSM mgr = new OSG::SimpleSceneManager; mgr->setWindow(gwin); mgr->setRoot(scene); // Create a blue background OSG::SolidBackgroundRecPtr bg = OSG::SolidBackground::create(); bg->setColor(OSG::Color3f(0.1, 0.1, 0.5)); gwin->getPort(0)->setBackground(bg); mgr->showAll(); OSG::commitChanges(); } // Give Control to the GLUT Main Loop glutMainLoop(); 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); }
void key(unsigned char key, int /*x*/, int /*y*/) { switch ( key ) { case 'l': { loadAnim(); break; } case 'c': { FILE *file=fopen(animName.c_str(),"w"); fclose(file); animOri.clear(); animPos.clear(); frameCount = 0; animTime = 0; break; } case 's': { FILE *file=fopen(animName.c_str(),"a"); OSG::Matrix m=cam_trans->getMatrix(); OSG::Quaternion q(m); OSG::Real32 ax,ay,az,r; animPos.push_back(OSG::Vec3f(m[3][0], m[3][1], m[3][2])); animOri.push_back(q); q.getValueAsAxisRad(ax,ay,az,r); fprintf(file,"%f %f %f %f,%f %f %f\n",ax,ay,az,r, m[3][0], m[3][1], m[3][2]); fclose(file); frameCount = 0; animTime = 0; break; } case 'S': { FILE *file=fopen((animName+".wrl").c_str(),"w"); std::vector<OSG::Quaternion>::iterator qit; fprintf(file,"DEF OriInter OrientationInterpolator {\n\tkey ["); for(size_t i = 0; i < animOri.size(); ++i) { fprintf(file, "%f", i / OSG::Real32(animOri.size() - 1) ); if(i < animOri.size() - 1) fprintf(file,", "); } fprintf(file,"]\n\tkeyValue ["); for(qit = animOri.begin(); qit != animOri.end(); ++qit) { OSG::Real32 ax,ay,az,r; (*qit).getValueAsAxisRad(ax,ay,az,r); fprintf(file, "%f %f %f %f", ax, ay, az, r ); if(qit < animOri.end() - 1) fprintf(file,", "); } fprintf(file,"]\n}\n\n"); std::vector<OSG::Vec3f>::iterator vit; fprintf(file,"DEF PosInter PositionInterpolator {\n\tkey ["); for(size_t i = 0; i < animPos.size(); ++i) { fprintf(file, "%f", i / OSG::Real32(animPos.size() - 1) ); if(i < animPos.size() - 1) fprintf(file,", "); } fprintf(file,"]\n\tkeyValue ["); for(vit = animPos.begin(); vit != animPos.end(); ++vit) { OSG::Vec3f v = *vit; fprintf(file, "%f %f %f, ", v[0], v[1], v[2] ); } fprintf(file,"]\n}\n\n"); fclose(file); break; } case 'j': if(sortfirst!=NULL) { sortfirst->setCompression("JPEG"); } break; case 'r': if(sortfirst!=NULL) { sortfirst->setCompression("RLE"); } break; case 'n': if(sortfirst!=NULL) { sortfirst->editCompression().erase(); } break; case 'i': showInfo = !showInfo; break; case 'w': if(polygonChunk->getFrontMode() == GL_FILL) polygonChunk->setFrontMode(GL_LINE); else polygonChunk->setFrontMode(GL_FILL); if(polygonChunk->getBackMode() == GL_FILL) polygonChunk->setBackMode(GL_LINE); else polygonChunk->setBackMode(GL_FILL); break; case 'a': if(animate) { glutIdleFunc(NULL); animate=false; } else { glutIdleFunc(display); animate=true; } frameCount = 0; animTime = 0; break; case 'd': // remove tree while(root->getNChildren()) { root->subChild(0u); } break; case '+': _dsFactor += 0.01f; if(_dsFactor > 1.0f) _dsFactor = 1.0f; setHEyeWallParameter(_dsFactor, _enablecc); break; case '-': _dsFactor -= 0.01f; if(_dsFactor <= 0.0f) _dsFactor = 0.01f; setHEyeWallParameter(_dsFactor, _enablecc); break; case 'f': if(_enablecc) _enablecc = false; else _enablecc = true; setHEyeWallParameter(_dsFactor, _enablecc); break; case 'B': if(bkgnd->getColor()[0] == 0.0) bkgnd->setColor( OSG::Color3f(1,1,1) ); else bkgnd->setColor( OSG::Color3f(0,0,0) ); break; case 27: // should kill the clients here // exit cleanup(); OSG::osgExit(); exit(0); } glutPostRedisplay(); }
int main(int argc, char *argv[]) { // Init the OpenSG subsystem OSG::osgInit(argc, argv); { // We create a GLUT Window (that is almost the same for most applications) int winid = setupGLUT(&argc, argv); OSG::GLUTWindowRecPtr gwin = OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->init(); // Create the face std::string family = "SANS"; OSG::TextFace::Style style = OSG::TextFace::STYLE_PLAIN; OSG::TextTXFParam txfParam; txfParam.size = 46; txfParam.gap = 1; txfParam.setCharacters("Hello World!"); txfParam.textureWidth = 0; OSG::TextTXFFaceRefPtr face = OSG::TextTXFFace::create(family, style, txfParam); if (face == 0) { std::cerr << "ERROR: Cannot create face object!" << std::endl; return -1; } // Lay out one single line of text std::string text = "Hello World!"; // Use UTF-8 encoding! OSG::TextLayoutParam layoutParam; layoutParam.horizontal = true; layoutParam.leftToRight = true; layoutParam.topToBottom = true; layoutParam.majorAlignment = OSG::TextLayoutParam::ALIGN_FIRST; layoutParam.minorAlignment = OSG::TextLayoutParam::ALIGN_FIRST; layoutParam.spacing = 1.f; layoutParam.length.push_back(0.f); layoutParam.maxExtend = 0.f; OSG::TextLayoutResult layoutResult; face->layout(text, layoutParam, layoutResult); // Create the text geometry OSG::Real32 scale = 1.f; OSG::NodeRecPtr scene = face->makeNode(layoutResult, scale); // Get the texture that contains the characters of the font OSG::ImageRecPtr image = face->getTexture(); // Create the texture that will hold the image OSG::SimpleTexturedMaterialRecPtr tex = OSG::SimpleTexturedMaterial::create(); tex->setImage(image); tex->setEnvMode(GL_MODULATE); tex->setDiffuse(OSG::Color3f(1, 0, 0)); // Assign the texture to the geometry OSG::GeometryRecPtr geo = dynamic_cast<OSG::Geometry *>(scene->getCore()); geo->setMaterial(tex); // Create and setup the SSM mgr = new OSG::SimpleSceneManager; mgr->setWindow(gwin); mgr->setRoot(scene); // Create a blue background OSG::SolidBackgroundRecPtr bg = OSG::SolidBackground::create(); bg->setColor(OSG::Color3f(0.1, 0.1, 0.5)); gwin->getPort(0)->setBackground(bg); mgr->showAll(); OSG::commitChanges(); } // Give Control to the GLUT Main Loop glutMainLoop(); return 0; }