void FaceSpatializeIndexed<BasicTraits>::Category::addData (OpenSGFaceBase<OpenSGTraits>* arg) { FaceIterator face = arg->getOriginal(); if ( face.getGeometry()->getMaterial()->isTransparent() // transparent face && m_trans.find(arg->getObjectAdapter().getNode()) != m_trans.end() // not processed ) { // create object adapter OSGObjectBase convert(arg->getObjectAdapter().getNode()); convert.setObjectAdapter(&arg->getObjectAdapter()); NodePtr newNode = Node::create(); m_trans[convert.getOriginal()] = newNode; GeometryPtr oldCore = GeometryPtr::dcast(convert.getOriginal()->getCore()); GeometryPtr newCore = oldCore->clone(); beginEditCP(newNode); newNode->setCore(newCore); endEditCP(newNode); beginEditCP(newCore); newCore->setPositions(convert.getPositions()); newCore->setNormals (convert.getNormals()); endEditCP(newCore); beginEditCP(m_root); m_root->addChild(newNode); endEditCP(m_root); return; } ++m_totalFaces; typename CategoryList::iterator c; for (c = m_all.begin(); c != m_all.end(); ++c) { if ((*c)->isThisCategory(face)) { break; } } if (c == m_all.end()) { // new category #if 0 MaterialGroupPtr mat = MaterialGroup::create(); beginEditCP(mat); mat->setMaterial(face.getGeometry()->getMaterial()); endEditCP(mat); NodePtr matNode = Node::create(); beginEditCP(matNode); matNode->setCore(mat); endEditCP(matNode); beginEditCP(m_root); m_root->addChild(matNode); endEditCP(m_root); c = m_all.insert(m_all.end(), new CategoryGeneral(matNode, arg, face)); #else c = m_all.insert(m_all.end(), new CategoryGeneral(m_root, arg, face)); #endif ++m_numGeom; } (*c)->addData(arg, face); }
Action::ResultE MaterialPool::subMaterialCB(NodePtr &node) { FieldContainerPtr core = node->getCore(); if(core == NullFC) return Action::Continue; MaterialGroupPtr mg = MaterialGroupPtr::dcast(core); if(mg != NullFC) { sub(mg->getMaterial()); return Action::Continue; } // ignore MaterialPool node! #if 0 MaterialPoolPtr mp = MaterialPoolPtr::dcast(core); if(mp != NullFC) { sub(mp); return Action::Continue; } #endif MaterialDrawablePtr md = MaterialDrawablePtr::dcast(core); if(md != NullFC) { sub(md->getMaterial()); return Action::Continue; } const char *typename2 = core->getType().getName().str(); if(!strcmp(typename2, "DVRVolume")) { Field *field = core->getField("renderMaterial"); if(field != NULL) { sub(MaterialPtr::dcast((static_cast<SFFieldContainerPtr *>(field))->getValue())); } } return Action::Continue; }
NodePtr createScenegraph(){ SimpleMaterialPtr simpleMaterial = SimpleMaterial::create(); beginEditCP (simpleMaterial, SimpleMaterial::DiffuseFieldMask | SimpleMaterial::AmbientFieldMask | SimpleMaterial::TransparencyFieldMask); simpleMaterial->setDiffuse(Color3f(1,0,0)); simpleMaterial->setAmbient(Color3f(0.2, 0.2, 0.2)); simpleMaterial->setTransparency(0.5); endEditCP (simpleMaterial, SimpleMaterial::DiffuseFieldMask | SimpleMaterial::AmbientFieldMask | SimpleMaterial::TransparencyFieldMask); NodePtr simpleMaterialNode = Node::create(); NodePtr sphere = makeSphere(2,6); MaterialGroupPtr mg = MaterialGroup::create(); beginEditCP(mg); mg->setMaterial(simpleMaterial); endEditCP(mg); beginEditCP(simpleMaterialNode); simpleMaterialNode->setCore(mg); simpleMaterialNode->addChild(sphere); endEditCP(simpleMaterialNode); NodePtr root = Node::create(); beginEditCP(root); root->setCore(Group::create()); root->addChild(simpleMaterialNode); endEditCP(root); return root; }
// 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); // the connection between GLUT and OpenSG GLUTWindowPtr gwin = GLUTWindow::create(); beginEditCP(gwin); gwin->setId(winid); gwin->setSize( 800, 800 ); gwin->init(); endEditCP(gwin); // create root node _scene = makeCoredNode<Group>(); GeometryPtr geo = makeBoxGeo(0.5, 0.5, 0.5, 1, 1, 1); // share the chunk CGChunkPtr cg = CGChunk::create(); beginEditCP(cg); cg->setVertexProfile(CG_PROFILE_ARBVP1); cg->setVertexProgram(_vp_program); cg->setFragmentProfile(CG_PROFILE_ARBFP1); cg->setFragmentProgram(_fp_program); endEditCP(cg); Int32 size = 4; // start color Vec3f sc(0.0, 0.0, 0.0); // end color Vec3f ec(1.0, 1.0, 1.0); Real32 sr = (ec[0] - sc[0]) / Real32((size*2)); Real32 sg = (ec[1] - sc[1]) / Real32((size*2)); Real32 sb = (ec[2] - sc[2]) / Real32((size*2)); Vec3f color(sc); Int32 x = - size; Int32 y = - size; Int32 z = - size; UInt32 iterations = size*2 * size*2 * size*2; printf("Creating %u cubes ...\n", iterations); for(UInt32 i=0;i<iterations;++i) { ChunkMaterialPtr cmat = ChunkMaterial::create(); // ok use one CGChunk and n CGParameterChunks CGParameterChunkPtr cgparameter = CGParameterChunk::create(); beginEditCP(cgparameter); cgparameter->setCGChunk(cg); cgparameter->setUniformParameter("SurfaceColor", color); endEditCP(cgparameter); _cgparameter = cgparameter; beginEditCP(cmat); cmat->addChunk(cg); cmat->addChunk(cgparameter); endEditCP(cmat); TransformPtr trans; NodePtr trans_node = makeCoredNode<Transform>(&trans); beginEditCP(trans); trans->getMatrix().setTranslate(Real32(x), Real32(y), Real32(z)); endEditCP(trans); MaterialGroupPtr mg; NodePtr mg_node = makeCoredNode<MaterialGroup>(&mg); beginEditCP(mg, MaterialGroup::MaterialFieldMask); mg->setMaterial(cmat); endEditCP(mg, MaterialGroup::MaterialFieldMask); NodePtr geonode = Node::create(); beginEditCP(geonode, Node::CoreFieldMask); geonode->setCore(geo); endEditCP(geonode, Node::CoreFieldMask); beginEditCP(mg_node); mg_node->addChild(geonode); endEditCP(mg_node); beginEditCP(trans_node); trans_node->addChild(mg_node); endEditCP(trans_node); // add to scene beginEditCP(_scene); _scene->addChild(trans_node); endEditCP(_scene); // ---- ++x; color[0] += sr; if(x == size) { x = - size; ++y; color[0] = sc[0]; color[1] += sg; if(y == size) { y = - size; ++z; color[1] = sc[1]; color[2] += sb; } } } // 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(); // create a gradient background. GradientBackgroundPtr gback = GradientBackground::create(); beginEditCP(gback, GradientBackground::LineFieldMask); gback->clearLines(); gback->addLine(Color3f(0.7, 0.7, 0.8), 0); gback->addLine(Color3f(0.0, 0.1, 0.3), 1); endEditCP(gback, GradientBackground::LineFieldMask); WindowPtr win = _mgr->getWindow(); beginEditCP(win); for(int i=0;i<win->getPort().size();++i) { ViewportPtr vp = win->getPort()[i]; beginEditCP(vp); vp->setBackground(gback); endEditCP(vp); } endEditCP(win); // GLUT main loop glutMainLoop(); return 0; }
int main (int argc, char **argv) { 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); // glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); glEnable( GL_DEPTH_TEST ); glEnable( GL_LIGHTING ); glEnable( GL_LIGHT0 ); // OSG SceneFileHandler::the().print(); // create the graph // beacon for camera and light NodePtr b1n = Node::create(); GroupPtr b1 = Group::create(); beginEditCP(b1n); b1n->setCore( b1 ); endEditCP(b1n); // transformation NodePtr t1n = Node::create(); TransformPtr t1 = Transform::create(); beginEditCP(t1n); t1n->setCore( t1 ); t1n->addChild( b1n ); endEditCP(t1n); cam_trans = t1; // light NodePtr dlight = Node::create(); DirectionalLightPtr dl = DirectionalLight::create(); beginEditCP(dlight); dlight->setCore( dl ); endEditCP(dlight); beginEditCP(dl); dl->setAmbient( .3, .3, .3, 1 ); dl->setDiffuse( 1, 1, 1, 1 ); dl->setDirection(0,0,1); dl->setBeacon( b1n); endEditCP(dl); // root root = Node::create(); GroupPtr gr1 = Group::create(); beginEditCP(root); root->setCore( gr1 ); root->addChild( t1n ); root->addChild( dlight ); endEditCP(root); // Load the file NodePtr file = NullFC; NodePtr file1 = NullFC; if ( argc > 1 ) file1 = SceneFileHandler::the().read(argv[1]); if ( file1 == NullFC ) { std::cerr << "Couldn't load file, ignoring" << std::endl; file1 = makeTorus( .5, 2, 16, 16 ); } file1->updateVolume(); // file->dump(); // subRefCP(file); // return 0; Vec3f min,max; file1->getVolume().getBounds( min, max ); std::cout << "Volume: from " << min << " to " << max << std::endl; file = Node::create(); MaterialGroupPtr testMat = MaterialGroup::create(); SimpleMaterialPtr defaultMaterial = SimpleMaterial::create(); beginEditCP(defaultMaterial); defaultMaterial->setDiffuse(Color3f(1,.0,.0)); defaultMaterial->setAmbient(Color3f(0.1,0.1,0.1)); defaultMaterial->setSpecular(Color3f(1,1,1)); defaultMaterial->setShininess(20); endEditCP (defaultMaterial); testMat->setMaterial(defaultMaterial); beginEditCP(file); { // file->setCore(testMat); file->setCore(Group::create()); file->addChild(file1); } endEditCP (file); scene_trans = Transform::create(); NodePtr sceneTrN = Node::create(); beginEditCP(sceneTrN); { sceneTrN->setCore(scene_trans); sceneTrN->addChild(file); sceneTrN->addChild(makeTorus( .5, 2, 16, 16 )); } endEditCP(sceneTrN); beginEditCP(dlight); dlight->addChild(sceneTrN); endEditCP(dlight); std::cerr << "Tree: " << std::endl; // root->dump(); // Camera cam = PerspectiveCamera::create(); cam->setBeacon( b1n ); cam->setFov( deg2rad( 90 ) ); cam->setNear( 0.1 ); cam->setFar( 100000 ); // Background SolidBackgroundPtr bkgnd = SolidBackground::create(); beginEditCP(bkgnd, SolidBackground::ColorFieldMask); bkgnd->setColor(Color3f(1,1,1)); endEditCP(bkgnd, SolidBackground::ColorFieldMask); // Viewport vp = 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; GLUTWindowPtr gwin; GLint glvp[4]; glGetIntegerv( GL_VIEWPORT, glvp ); gwin = GLUTWindow::create(); gwin->setId(winid); gwin->setSize( glvp[2], glvp[3] ); win = gwin; win->addPort( vp ); win->init(); // Action ract = DrawAction::create(); renact = RenderAction::create(); // tball 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; Pnt3f tCenter(min[0] + (max[0] - min[0]) / 2, min[1] + (max[1] - min[1]) / 2, min[2] + (max[2] - min[2]) / 2); tball.setMode( Trackball::OSGObject ); tball.setStartPosition( pos, true ); tball.setSum( true ); tball.setTranslationMode( Trackball::OSGFree ); tball.setTranslationScale(scale); tball.setRotationCenter(tCenter); // run... glutMainLoop(); return 0; }