void VTKPolyDataMapper::initGeometries(void) { NodeUnrecPtr pRoot = Node::create(); pRoot->setCore(Group::create()); setRoot(pRoot); for(UInt32 i = 0; i < 4; ++i) { GeometryUnrecPtr pGeo = Geometry::create(); ChunkMaterialUnrecPtr pMat = ChunkMaterial::create(); MaterialChunkUnrecPtr pMatChunk = MaterialChunk::create(); GeoPnt3fPropertyUnrecPtr pPoints = GeoPnt3fProperty ::create(); GeoUInt32PropertyUnrecPtr pLengths = GeoUInt32Property ::create(); GeoUInt8PropertyUnrecPtr pTypes = GeoUInt8Property ::create(); GeoColor4fPropertyUnrecPtr pColors = GeoColor4fProperty::create(); GeoVec3fPropertyUnrecPtr pNormals = GeoVec3fProperty ::create(); if(i < 2) { pMatChunk->setLit(false); } pMatChunk->setDiffuse (OSG::Color4f(1.0, 1.0, 1.0, 1.0)); pMatChunk->setSpecular (OSG::Color4f(0.0, 0.0, 0.0, 1.0)); pMatChunk->setShininess(10.0f); pMat->addChunk(pMatChunk); TwoSidedLightingChunkUnrecPtr pTSLChunk = TwoSidedLightingChunk::create(); pMat->addChunk(pTSLChunk); pGeo->setDlistCache(false ); pGeo->setMaterial (pMat ); pGeo->setPositions (pPoints ); pGeo->setLengths (pLengths); pGeo->setTypes (pTypes ); pGeo->setColors (pColors ); if(i > 1) { pGeo->setNormals(pNormals); } OSG::NodeUnrecPtr pGeoRoot = OSG::Node::create(); pGeoRoot->setCore (pGeo); pGeoRoot->setTravMask(0 ); pRoot->addChild(pGeoRoot); this->pushToGeometries (pGeo ); this->pushToMaterials (pMat ); this->pushToMaterialChunks(pMatChunk); this->pushToPositions (pPoints ); this->pushToLength (pLengths ); this->pushToTypes (pTypes ); this->pushToColors (pColors ); this->pushToNormals (pNormals ); this->pushToGeoRoots (pGeoRoot ); } }
// Setup the part of the scene rooted at animRoot // This includes a file to animate, a beacon for a light, // and a staged core to render this subtree from the position // of the light. void initAnimSetup(int argc, char **argv) { // beacon for light and stage camera OSG::GroupNodeRefPtr beacon = OSG::GroupNodeRefPtr::create(); // transformation for beacon cam_transScene = OSG::TransformNodeRefPtr::create(); cam_transScene.node()->addChild(beacon); // light OSG::DirectionalLightNodeRefPtr dlight = OSG::DirectionalLightNodeRefPtr::create(); dlight->setAmbient (.3f, .3f, .3f, 1); dlight->setDiffuse ( 1, 1, 1, 1); dlight->setDirection( 0, 0, 1 ); dlight->setBeacon (beacon ); // animRoot animRoot = OSG::GroupNodeRefPtr::create(); animRoot.node()->addChild(cam_transScene ); // Load the file and put it in the graph // under the sceneXform node. OSG::NodeUnrecPtr 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::Vec3f min,max; OSG::commitChanges(); file->updateVolume(); file->dump(); file->getVolume().getBounds(min, max); std::cout << "Volume: from " << min << " to " << max << std::endl; sceneTrans.setValues(min[0] + ((max[0] - min[0]) * 0.5), min[1] + ((max[1] - min[1]) * 0.5), max[2] + ( max[2] - min[2]) * 4.5 ); sceneXform = OSG::TransformNodeRefPtr::create(); sceneXform.node()->addChild(file); OSG::NodeUnrecPtr pBoxNode = OSG::makeBox(1, 1, 1, 5, 5, 5); pBoxNode->setTravMask(pBoxNode->getTravMask() & 0x0001); sceneXform.node()->addChild(pBoxNode); dlight.node()->addChild(sceneXform); // ---- STAGE RENDERING SETUP --- // // Camera: setup camera to point from beacon (light pos) // with a 90deg FOV to render the scene OSG::PerspectiveCameraUnrecPtr stage_cam = OSG::PerspectiveCamera::create(); stage_cam->setBeacon(beacon); stage_cam->setFov (OSG::osgDegree2Rad(90)); stage_cam->setNear (0.1f); stage_cam->setFar (100000); // Background OSG::SolidBackgroundUnrecPtr bkgnd = OSG::SolidBackground::create(); bkgnd->setColor(OSG::Color3f(0,1,0)); // FBO setup pFBO = OSG::FrameBufferObject::create(); pTexBuffer = OSG::TextureBuffer::create(); #ifdef USE_DEPTH_TEXTURE OSG::TextureBufferUnrecPtr pDepthBuffer = OSG::TextureBuffer::create(); pDepthBuffer->setTexture(txDepth); #else OSG::RenderBufferUnrecPtr pDepthBuffer = OSG::RenderBuffer ::create(); pDepthBuffer->setInternalFormat(GL_DEPTH_COMPONENT24 ); #endif pTexBuffer->setTexture (tx1o); pTexBuffer->setReadBack(true); pFBO->setSize(512, 512); pFBO->setColorAttachment(pTexBuffer, 0); pFBO->setDepthAttachment(pDepthBuffer ); pFBO->editMFDrawBuffers()->clear(); pFBO->editMFDrawBuffers()->push_back(GL_COLOR_ATTACHMENT0_EXT); // Stage core setup OSG::SimpleStageNodeRefPtr pStage = OSG::SimpleStageNodeRefPtr::create(); pStage->setRenderTarget(pFBO ); pStage->setCamera (stage_cam ); pStage->setBackground (bkgnd); pStage->addPreRenderFunctor (&testPreRenderCB, "" ); pStage->addPostRenderFunctor(&testPostRenderCB, ""); // Setup sub-tree visitor // - This will setup a graph that will render a subtree during traversal pVisit = OSG::VisitSubTreeNodeRefPtr::create(); pVisit->setSubTreeRoot(dlight); pStage.node()->addChild(pVisit); animRoot.node()->addChild(pStage); animRoot.node()->addChild(dlight); }