void display(void) { OSG::Real32 time = glutGet(GLUT_ELAPSED_TIME ); //create the Quaternion the describes the rotation of //the planet around the sun OSG::Quaternion planetRot = OSG::Quaternion(OSG::Vec3f(0,1,0), time/float(1000)); //now the rotation of the moon around the planet //the division by 12 speeds up the rotation by 12 compared to the //planet rotation OSG::Quaternion moonRot = OSG::Quaternion(OSG::Vec3f(0,1,0), time/float(1000/12)); //generate the Matrices OSG::Matrix p,m,t1,r1,t2,r2; t1.setTransform(OSG::Vec3f(20,0,0)); r1.setTransform(planetRot); r1.mult(t1); p.setValue(r1); t2.setTransform(OSG::Vec3f(8,0,0)); r2.setTransform(moonRot); r2.mult(t2); r1.mult(r2); m.setValue(r1); planetTransform->setMatrix(p); moonTransform ->setMatrix(m); mgr->redraw(); }
void MyOSGQGLWidget::paintGL(void) { OSG::Matrix m1, m2, m3; OSG::Quaternion q1; tball.getRotation().getValue(m3); q1.setValue(m3); m1.setRotate(q1); m2.setTranslate( tball.getPosition() ); m1.mult( m2 ); cam_trans->setMatrix( m1 ); OSG::commitChanges(); osgWin->render(ract); // draw the viewports }
OSG::NodeRecPtr createScenegraph(void) { //create sun, planet & moon geometry OSG::GeometryRecPtr sun = OSG::makeSphereGeo(3, 6); OSG::NodeRecPtr planet = OSG::makeSphere (3, 3); OSG::NodeRecPtr moon = OSG::makeSphere (2, 1); //the root node will be the sun OSG::NodeRecPtr root = OSG::Node::create(); root->setCore(sun); OSG::NodeRecPtr planetTransformNode = OSG::Node::create(); OSG::NodeRecPtr moonTransformNode = OSG::Node::create(); // these were declared globally planetTransform = OSG::Transform::create(); moonTransform = OSG::Transform::create(); // Now we need to fill it with live // We want to have the planet some distance away from the sun, // but initial with no rotation. The same aplies to the moon OSG::Matrix m,n; m.setIdentity(); n.setIdentity(); m.setTranslate(20, 0, 0); n.setTranslate( 8, 0, 0); planetTransform->setMatrix(m); moonTransform ->setMatrix(n); //Insert the cores into the apropiate nodes and add the geometry planetTransformNode->setCore (planetTransform); planetTransformNode->addChild(planet ); moonTransformNode->setCore (moonTransform); moonTransformNode->addChild(moon ); //add the planet to the sun root->addChild(planetTransformNode); root->addChild(moonTransformNode ); //now we are done return OSG::NodeTransitPtr(root); }
OSG::NodeTransitPtr createScenegraph(void) { // At first we load all needed models from file OSG::NodeRecPtr w_high = OSG::SceneFileHandler::the()->read("Data/woman_high.wrl"); OSG::NodeRecPtr w_medium = OSG::SceneFileHandler::the()->read("Data/woman_medium.wrl"); OSG::NodeRecPtr w_low = OSG::SceneFileHandler::the()->read("Data/woman_low.wrl"); // we check the result if((w_high == NULL) || (w_medium == NULL)|| (w_low == NULL)) { std::cout << "It was not possible to load all needed models from file" << std::endl; return OSG::NodeTransitPtr(); } // now the LOD core OSG::DistanceLODRecPtr lod = OSG::DistanceLOD::create(); lod->editSFCenter()->setValue(OSG::Pnt3f(0,0,0)); lod->editMFRange()->push_back(200); lod->editMFRange()->push_back(500); // the node containing the LOD core. The three models will be // added as its children OSG::NodeRecPtr lodNode = OSG::Node::create(); lodNode->setCore(lod); lodNode->addChild(w_high); lodNode->addChild(w_medium); lodNode->addChild(w_low); // create the node with switch core ******************** OSG::SwitchRecPtr sw = OSG::Switch::create(); //Notice: the first choice is 0 sw->setChoice(0); OSG::NodeRecPtr switchNode = OSG::Node::create(); switchNode->setCore(sw); switchNode->addChild(lodNode); //end switch creation ********************************** OSG::NodeRecPtr root = OSG::Node::create(); root->setCore(OSG::Group::create()); root->addChild(switchNode); // we know want to extract the mesh geometry out of the graph // it is sufficent to pass the model only as root for searching OSG::NodeRecPtr womanGeometry = checkName(w_high); OSG::GeometryRecPtr geo = dynamic_cast<OSG::Geometry *>(womanGeometry->getCore()); //new node with "old" geometry core referenced OSG::NodeRecPtr woman = OSG::Node::create(); woman->setCore(geo); //translate it a bit to see both women OSG::NodeRecPtr womanTrans = OSG::Node ::create(); OSG::TransformRecPtr t = OSG::Transform::create(); OSG::Matrix m; m.setIdentity(); m.setTranslate(OSG::Vec3f(0,0,200)); t->setMatrix(m); womanTrans->setCore(t); womanTrans->addChild(woman); //add it to the root root->addChild(womanTrans); return OSG::NodeTransitPtr(root); }
void updateScene(const std::string &filename, OSG::Image::PixelFormat compressTo = OSG::Image::OSG_INVALID_PF) { // Try to create the new image OSG::ImageRecPtr imagePtr = OSG::ImageFileHandler::the()->read(filename.c_str()); if (imagePtr == NULL) return; if(compressTo != OSG::Image::OSG_INVALID_PF) { imagePtr->reformat(compressTo); } // Update information on the screen OSG::StatStringElem *statElem = statfg->editCollector()->getElem(textureFormatDesc); switch (imagePtr->getPixelFormat()) { case OSG::Image::OSG_A_PF: statElem->set("OSG_A_PF"); break; case OSG::Image::OSG_I_PF: statElem->set("OSG_I_PF"); break; case OSG::Image::OSG_L_PF: statElem->set("OSG_L_PF"); break; case OSG::Image::OSG_LA_PF: statElem->set("OSG_LA_PF"); break; case OSG::Image::OSG_RGB_PF: statElem->set("OSG_RGB_PF"); break; case OSG::Image::OSG_RGBA_PF: statElem->set("OSG_RGBA_PF"); break; case OSG::Image::OSG_BGR_PF: statElem->set("OSG_BGRA_PF"); break; case OSG::Image::OSG_BGRA_PF: statElem->set("OSG_BGRA_PF"); break; case OSG::Image::OSG_RGB_DXT1: statElem->set("OSG_RGB_DXT1"); break; case OSG::Image::OSG_RGBA_DXT1: statElem->set("OSG_RGBA_DXT1"); break; case OSG::Image::OSG_RGBA_DXT3: statElem->set("OSG_RGBA_DXT3"); break; case OSG::Image::OSG_RGBA_DXT5: statElem->set("OSG_RGBA_DXT5"); break; default: statElem->set("???"); break; } statElem = statfg->editCollector()->getElem(textureDataTypeDesc); switch (imagePtr->getDataType()) { case OSG::Image::OSG_UINT8_IMAGEDATA: statElem->set("OSG_UINT8_IMAGEDATA"); break; case OSG::Image::OSG_UINT16_IMAGEDATA: statElem->set("OSG_UINT16_IMAGEDATA"); break; case OSG::Image::OSG_UINT32_IMAGEDATA: statElem->set("OSG_UINT32_IMAGEDATA"); break; case OSG::Image::OSG_FLOAT16_IMAGEDATA: statElem->set("OSG_FLOAT16_IMAGEDATA"); break; case OSG::Image::OSG_FLOAT32_IMAGEDATA: statElem->set("OSG_FLOAT32_IMAGEDATA"); break; case OSG::Image::OSG_INT16_IMAGEDATA: statElem->set("OSG_INT16_IMAGEDATA"); break; case OSG::Image::OSG_INT32_IMAGEDATA: statElem->set("OSG_INT32_IMAGEDATA"); break; default: statElem->set("???"); break; } ostringstream os; os << imagePtr->getWidth() << 'x' << imagePtr->getHeight() << 'x' << imagePtr->getDepth(); statfg->editCollector()->getElem(textureSizeDesc)->set(os.str()); statfg->editCollector()->getElem(textureDimensionDesc)->set(imagePtr->getDimension()); statfg->editCollector()->getElem(textureBPPDesc)->set(imagePtr->getBpp()); statfg->editCollector()->getElem(textureMipMapCountDesc)->set(imagePtr->getMipMapCount()); statfg->editCollector()->getElem(textureFrameCountDesc)->set(imagePtr->getFrameCount()); // Put it all together into a Geometry NodeCore. OSG::GeometryRecPtr geo = OSG::makePlaneGeo(imagePtr->getWidth(), imagePtr->getHeight(), 1, 1); OSG::NodeRecPtr imageNode = OSG::Node::create(); imageNode->setCore(geo); OSG::NodeRecPtr transNodePtr = OSG::Node::create(); OSG::TransformRecPtr transPtr = OSG::Transform::create(); OSG::Matrix transMatrix; transMatrix.setTranslate(0.f, 0.f, -1.f); transPtr->setMatrix(transMatrix); transNodePtr->setCore(transPtr); transNodePtr->addChild(imageNode); OSG::TextureObjChunkRecPtr texObjChunk = OSG::TextureObjChunk::create(); texObjChunk->setImage(imagePtr); texObjChunk->setWrapS(GL_CLAMP); texObjChunk->setWrapT(GL_CLAMP); texObjChunk->setMagFilter(GL_NEAREST); texObjChunk->setMinFilter(GL_NEAREST); OSG::TextureEnvChunkRecPtr texEnvChunk = OSG::TextureEnvChunk::create(); texEnvChunk->setEnvMode(GL_MODULATE); OSG::MaterialChunkRecPtr matChunk = OSG::MaterialChunk::create(); matChunk->setAmbient(OSG::Color4f(1.f, 1.f, 1.f, 1.f)); matChunk->setDiffuse(OSG::Color4f(1.f, 1.f, 1.f, 1.f)); matChunk->setEmission(OSG::Color4f(0.f, 0.f, 0.f, 1.f)); matChunk->setSpecular(OSG::Color4f(0.f, 0.f, 0.f, 1.f)); matChunk->setShininess(0); OSG::ChunkMaterialRecPtr m = OSG::ChunkMaterial::create(); m->addChunk(texObjChunk); m->addChunk(texEnvChunk); m->addChunk(matChunk); geo->setMaterial(m); scene->clearChildren(); scene->addChild(transNodePtr); if(compressTo != OSG::Image::OSG_INVALID_PF) { OSG::SceneFileHandler::the()->write(scene->getChild(0), "/tmp/comp.osb"); OSG::SceneFileHandler::the()->write(scene->getChild(0), "/tmp/comp.osg"); } }
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; }