本文整理汇总了C++中osg::NodeRefPtr::setCore方法的典型用法代码示例。如果您正苦于以下问题:C++ NodeRefPtr::setCore方法的具体用法?C++ NodeRefPtr::setCore怎么用?C++ NodeRefPtr::setCore使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类osg::NodeRefPtr
的用法示例。
在下文中一共展示了NodeRefPtr::setCore方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: createLabeledTorus
OSG::NodeTransitPtr createLabeledTorus(OSG::Vec3f trans, int idx)
{
OSG::NodeTransitPtr node = OSG::Node::create();
OSG::TransformRefPtr xform = OSG::Transform::create();
OSG::Matrix mat;
// --- setup transform ------------------
mat.setIdentity();
mat.setTranslate(trans);
xform->setMatrix(mat);
node->setCore(xform);
// --- setup label ----------------------
OSG::NodeRefPtr labelNode = OSG::Node::create();
OSG::LabelRefPtr label =
(idx) ? createTextLabel(idx) : createIconLabel();
updateLabelParams(label, idx);
labelNode->setCore(label);
// --- add torus ------------------------
labelNode->addChild(OSG::makeTorus(.5, 2, 16, 16));
node->addChild(labelNode);
return node;
}
示例2: main
int main(int argc, char* argv[])
{
std::cerr << argv[0] << ". Press 'h' for keys" << std::endl;
// Init OSG and glut.
OSG::osgInit(argc,argv);
{
int winid = setupGLUT(&argc, argv);
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
printFontFamilies();
// load the scene
OSG::NodeRefPtr scene = OSG::Node::create();
scene->setCore(OSG::Group::create());
// Setup text sample
gTextStuff = new TextStuff();
gTextStuff->initialize();
gTextStuff->updateFace();
gTextStuff->updateScene();
scene->addChild(gTextStuff->mRootNode);
mgr = new OSG::SimpleSceneManager;
// Tell the manager about the window and scene
mgr->setWindow(gwin );
mgr->setRoot(scene);
// Start it up
mgr->showAll();
}
glutMainLoop();
return 0;
}
示例3: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin= OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// create the scene
/*
Scenegraph nodes in OpenSG consist of two parts: the Node and its Core.
The Node contains the general information that anchors an object in the
graph: the parent, a list of children, a bounding volume. Note that the
Node contains a single parent, a Node can only be connected to a graph
in one place.
There is only one Node class, all nodes in the scenegraph use the same
Node. The specific information that distinguishes node kinds from each
other is stored in the NodeCore.
Consequently there is a different kind of NodeCore for the different
kinds of functions a node can have. The NodeCore contains all the
information that the Node doesn't.
NodeCores can be used by multiple Nodes. In this example the Geometry
NodeCore of the torus is used to display multiple tori.
*/
// this time, create just the core of the geometry
OSG::GeometryRefPtr torus = OSG::makeTorusGeo( .5, 2, 8, 12 );
// create the scene
// the scene has a single group with ncopies transformations below,
// each of these carries a Node that shares the geometry
/*
The Group NodeCore is the basic type to create the hierarchical graph.
It does very little to its children, just calls all of them when asked
to do anything, and collecting their information if necessary.
*/
// create the root Group node
OSG::NodeRefPtr scene = OSG::Node::create();
OSG::GroupRefPtr g = OSG::Group::create();
scene->setCore(g);
// create the copied geometry nodes and their transformations
for(OSG::UInt16 i = 0; i < ncopies; ++i)
{
// create the nodes for the shared Geometry core
OSG::NodeRefPtr geonode = OSG::Node::create();
// assign the Core to the Node
geonode->setCore(torus);
// add a transformation for every Geometry
OSG::NodeRefPtr transnode = OSG::Node::create();
trans[i] = OSG::Transform::create();
transnode->setCore (trans[i]);
transnode->addChild(geonode );
scene->addChild(transnode);
}
OSG::commitChanges();
// 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();
}
// GLUT main loop
glutMainLoop();
return 0;
}
示例4: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// create the scene
// create a pretty simple graph: a Group with two Transforms as children,
// each of which carries a single Geometry.
// The scene group
OSG::NodeRefPtr scene = OSG::Node::create();
OSG::GroupRefPtr g = OSG::Group::create();
scene->setCore(g);
// The cylinder and its transformation
OSG::NodeRefPtr cyl = OSG::makeCylinder( 1.4f, .3f, 8, true, true, true );
cyltrans = OSG::Transform::create();
OSG::NodeRefPtr cyltransnode = OSG::Node::create();
cyltransnode->setCore (cyltrans);
cyltransnode->addChild(cyl );
// add it to the scene
scene->addChild(cyltransnode);
// The torus and its transformation
OSG::NodeRefPtr torus = OSG::makeTorus( .2f, 1, 8, 12 );
tortrans = OSG::Transform::create();
OSG::NodeRefPtr tortransnode = OSG::Node::create();
tortransnode->setCore (tortrans);
tortransnode->addChild(torus );
// add it to the scene
scene->addChild(tortransnode);
// now traverse the scene
/*
There are four variants of the traverse() function.
It can either be called for a single node or for a vector nodes. And
they can either call a function just when entering the node, or in
addition when leaving the node. The signatures of the functions are:
enter functions:
Action::ResultE enter(Node *node);
leave functions:
Action::ResultE leave(Node *node, Action::ResultE res);
The functions that are called are wrapped in functors. A functor is an
object that contains a function or method, which can be called through
the functor. OpenSG uses boost::function for this purpose and
provides appriopriate typedefs for enter and leave functors as
TraverseEnterFunctor and TraverseLeaveFunctor (see OSGAction.h).
In order to call member functions through a functor an object of
the correct type has to be available (there has to an object to
take the role of this for the member function). To store an
instance of an object in a functor use boost::bind to bind the
first argument of the member function functor to the object (see
below for examples).
*/
SLOG << "Variant 1: just print every encountered node" << OSG::endLog;
traverse(scene, enter);
SLOG << OSG::endLog
<< "Variant 2: just print every encountered node, using a"
<< " vector of nodes" << OSG::endLog;
std::vector<OSG::Node *> nodevec;
nodevec.push_back(tortransnode);
nodevec.push_back(cyltransnode);
traverse(nodevec, enter);
SLOG << OSG::endLog
<< "Variant 3: just print every encountered node on entering"
//.........这里部分代码省略.........
示例5: main
//.........这里部分代码省略.........
OSG::GeoUInt32PropertyRefPtr ind2 = OSG::GeoUInt32Property::create();
// fill first index (will be used for positions)
ind1->push_back(0); // polygon
ind1->push_back(1);
ind1->push_back(2);
ind1->push_back(3);
ind1->push_back(7); // triangle 1
ind1->push_back(4);
ind1->push_back(8);
ind1->push_back(5); // triangle 2
ind1->push_back(6);
ind1->push_back(9);
ind1->push_back(1); // quad 1
ind1->push_back(2);
ind1->push_back(6);
ind1->push_back(5);
ind1->push_back(3); // quad 2
ind1->push_back(0);
ind1->push_back(4);
ind1->push_back(7);
// fill second index (will be used for colors/normals)
ind2->push_back(3); // polygon
ind2->push_back(3);
ind2->push_back(3);
ind2->push_back(3);
ind2->push_back(4); // triangle 1
ind2->push_back(4);
ind2->push_back(4);
ind2->push_back(5); // triangle 2
ind2->push_back(5);
ind2->push_back(5);
ind2->push_back(5); // quad 1
ind2->push_back(5);
ind2->push_back(5);
ind2->push_back(5);
ind2->push_back(4); // quad 2
ind2->push_back(4);
ind2->push_back(4);
ind2->push_back(4);
/*
Put it all together into a Geometry NodeCore.
*/
OSG::GeometryRefPtr geo = OSG::Geometry::create();
geo->setTypes (type);
geo->setLengths (lens);
/*
Set the properties and indices used to index them.
Calling geo->setProperty(pnts, Geometry::PositionsIndex) is the
same as calling geo->setPositions(pnts), but this way it is
more obvious which properties and indices go together.
*/
geo->setProperty(pnts, OSG::Geometry::PositionsIndex);
geo->setIndex (ind1, OSG::Geometry::PositionsIndex);
geo->setProperty(norms, OSG::Geometry::NormalsIndex );
geo->setIndex (ind2, OSG::Geometry::NormalsIndex );
geo->setProperty(colors, OSG::Geometry::ColorsIndex );
geo->setIndex (ind2, OSG::Geometry::ColorsIndex );
geo->setMaterial (OSG::getDefaultMaterial());
// put the geometry core into a node
OSG::NodeRefPtr n = OSG::Node::create();
n->setCore(geo);
// add a transformation to make it move
OSG::NodeRefPtr scene = OSG::Node::create();
trans = OSG::Transform::create();
scene->setCore(trans);
scene->addChild(n);
OSG::commitChanges();
// create the SimpleSceneManager helper
mgr = OSG::SimpleSceneManager::create();
// tell the manager what to manage
mgr->setWindow(gwin );
mgr->setRoot (scene);
// show the whole scene
mgr->showAll();
}
// GLUT main loop
glutMainLoop();
return 0;
}
示例6: main
//
// Initialize GLUT & OpenSG and set up the scene
//
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// create the SimpleSceneManager helper
mgr = OSG::SimpleSceneManager::create();
mgr->setWindow(gwin);
// create a pretty simple graph: a Group with two Transforms as children,
// each of which carries a single Geometry.
// The scene
OSG::NodeRefPtr scene = OSG::Node::create();
// The cylinder and its transformation
OSG::NodeRefPtr cyl = OSG::Node::create();
OSG::GeometryRefPtr cylgeo = OSG::makeCylinderGeo( 1.4f, .3f, 24,
true, true, true );
cyl->setCore(cylgeo);
cyltrans = OSG::Transform::create();
OSG::NodeRefPtr cyltransnode = OSG::Node::create();
cyltransnode->setCore (cyltrans);
cyltransnode->addChild(cyl );
// add it to the scene
scene->addChild(cyltransnode);
// The torus and its transformation
OSG::NodeRefPtr torus = OSG::Node::create();
OSG::GeometryRefPtr torusgeo = OSG::makeTorusGeo( .2f, 1, 24, 36 );
torus->setCore(torusgeo);
tortrans = OSG::Transform::create();
OSG::NodeRefPtr tortransnode = OSG::Node::create();
tortransnode->setCore (tortrans);
tortransnode->addChild(torus );
// add it to the scene
scene->addChild(tortransnode);
//
// create the shader program
//
OSG::ShaderProgramChunkRefPtr prog_chunk = OSG::ShaderProgramChunk::create();
OSG::ShaderProgramRefPtr vertShader = OSG::ShaderProgram::createVertexShader();
OSG::ShaderProgramRefPtr fragShader = OSG::ShaderProgram::createFragmentShader();
vertShader->setProgram(get_vp_program());
fragShader->setProgram(get_fp_program());
//
// binding the unifrom block to a buffer binding point can be performed
// either by calling the shaders's addUniformBlock method or by
// adding a 'uniform block' variable to a ShaderProgramVariableChunk.
// In the following we use both variants for illustration.
//
fragShader->addUniformBlock("Materials", 1); // block binding point
fragShader->addUniformBlock("Lights", 2); // block binding point
//
// The following is replaced by adding ShaderProgramVariableChunk objects
// to the chunk material. See below...
//
// fragShader->addUniformBlock("GeomState", 3); // block binding point
prog_chunk->addShader(vertShader);
prog_chunk->addShader(fragShader);
//
// create uniform buffer objects and corresponding materials
//
OSG::UniformBufferObjChunkRefPtr ubo_material_database = create_material_database_state(materials);
ubo_light_state = create_light_state(lights);
OSG::PolygonChunkRefPtr polygon_chunk = OSG::PolygonChunk::create();
polygon_chunk->setFrontMode(GL_FILL);
polygon_chunk->setBackMode(GL_FILL);
polygon_chunk->setCullFace(GL_NONE);
//.........这里部分代码省略.........
示例7: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
OSG::preloadSharedObject("OSGFileIO");
OSG::preloadSharedObject("OSGTBFileIO");
OSG::preloadSharedObject("OSGImageFileIO");
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// create the scene
// create a pretty simple graph: a Group with two Transforms as children,
// each of which carries a single Geometry.
// The scene group
OSG::NodeRefPtr scene = OSG::Node::create();
OSG::GroupRefPtr g = OSG::Group::create();
scene->setCore(g);
// The cylinder and its transformation
OSG::NodeRefPtr cyl = OSG::Node::create();
OSG::GeometryRefPtr cylgeo = OSG::makeCylinderGeo( 1.4f, .3f, 64,
true, true, true );
cyl->setCore(cylgeo);
cyltrans = OSG::Transform::create();
OSG::NodeRefPtr cyltransnode = OSG::Node::create();
cyltransnode->setCore (cyltrans);
cyltransnode->addChild(cyl );
// add it to the scene
scene->addChild(cyltransnode);
// The torus and its transformation
OSG::NodeRefPtr torus = OSG::Node::create();
OSG::GeometryRefPtr torusgeo = OSG::makeTorusGeo( .2f, 1, 32, 64 );
torus->setCore(torusgeo);
tortrans = OSG::Transform::create();
OSG::NodeRefPtr tortransnode = OSG::Node::create();
tortransnode->setCore (tortrans);
tortransnode->addChild(torus );
// add it to the scene
scene->addChild(tortransnode);
// create the materials: Here, just using cgfx materials.
OSG::CgFXMaterialRefPtr mat1 = OSG::CgFXMaterial::create();
if(argc > 1)
{
mat1->setEffectFile(argv[1]);
}
// assign the material to the geometry
cylgeo->setMaterial(mat1);
// assign the material to the geometry
torusgeo->setMaterial(mat1);
OSG::commitChanges();
// create the SimpleSceneManager helper
mgr = new OSG::SimpleSceneManager;
// tell the manager what to manage
mgr->setWindow(gwin );
// file io
OSG::FCFileType::FCPtrStore Containers;
Containers.insert(scene);
//Use an empty Ignore types vector
OSG::FCFileType::FCTypeVector IgnoreTypes;
//IgnoreTypes.push_back(Node::getClassType().getId());
//Write the Field Containers to a xml file
OSG::FCFileHandler::the()->write(Containers,OSG::BoostPath("C:/Users/danielg/Desktop/test.xml"),IgnoreTypes);
//Read FieldContainers from an XML file
//.........这里部分代码省略.........
示例8: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// create the scene
// this time, create just the core of the geometry
OSG::GeometryRefPtr torus = OSG::makeTorusGeo( .5, 2, 8, 12 );
// create the scene
// the scene has a single group with ncopies transformations below,
// each of these carries a Node that shares the geometry
/*
The Switch NodeCore very similar to the Group, but it has the additional
capability to only show one or none of its children.
This is controlled by the choice Field, and is used below in the keys
function.
*/
// create the root Switch node
OSG::NodeRefPtr scene = OSG::Node::create();
sw = OSG::Switch::create();
sw->setChoice(OSG::Switch::ALL);
scene->setCore(sw);
// create the copied geometry nodes and their transformations
for(OSG::UInt16 i = 0; i<ncopies; ++i)
{
// create the nodes for the shared Geometry core
OSG::NodeRefPtr geonode = OSG::Node::create();
// assign the Core to the Node
geonode->setCore(torus);
// add a transformation for every Geometry
OSG::NodeRefPtr transnode = OSG::Node::create();
trans[i] = OSG::Transform::create();
transnode->setCore (trans[i]);
transnode->addChild(geonode );
scene->addChild(transnode);
}
OSG::commitChanges();
// 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();
}
// GLUT main loop
glutMainLoop();
return 0;
}
示例9: doMain
int doMain(int argc, char **argv)
{
//
// This might be necessary depending on the
// used platform to ensure that the corresponding
// libraries get loaded.
//
OSG::preloadSharedObject("OSGFileIO");
OSG::preloadSharedObject("OSGImageFileIO");
OSG::preloadSharedObject("OSGContribPLY");
OSG::osgInit(argc,argv);
// GLUT init
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_STENCIL | GLUT_DOUBLE);
glutCreateWindow("OpenSG");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutIdleFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
OSG::PassiveWindowRefPtr pwin=OSG::PassiveWindow::create();
pwin->init();
// create the SimpleSceneManager helper
mgr = new OSG::SimpleSceneManager;
// create the window and initial camera/viewport
mgr->setWindow(pwin);
//
// for storing clipplane beacon we use a container
// collection attachment which we attach to the scene
// node. Otherwise the scene could not be saved correctly,
// as the beacons would be lost.
//
container = OSG::ContainerCollection::create();
//
// Implementation details:
// For each clip plane we provide a ClipPlaneChunk, the plane geometry,
// the plane transform core and at least a plane color conveniently in
// a vector of type VecClipPlaneDetailsT. The next function call
// initializes this data structure.
//
createClipPlaneDetails();
//
// The scene
//
scene = OSG::Node::create();
scene->setCore(OSG::Group::create());
scene->addAttachment(container);
//
// A place for accessing the box and torus.
//
vecGeometries.push_back(NULL);
vecGeometries.push_back(NULL);
//
// Build concrete clipping planes and update the clip plane details.
//
ClipPlaneData data1;
ClipPlaneData data2;
data1._equation = OSG::Vec4f(0,0,1,0);
data1._enabled = true;
data2._equation = OSG::Vec4f(1,0,0,0);
data2._enabled = false;
vecClipPlaneData.push_back(data1);
vecClipPlaneData.push_back(data2);
updateClipPlanes(vecClipPlaneData);
keyboard('3',-1,-1);
keyboard('4',-1,-1);
// tell the manager what to manage
mgr->setRoot(scene);
// show the whole scene
mgr->showAll();
mgr->redraw();
pwin->dumpExtensions();
return 0;
}
示例10: main
int main(int argc, char **argv)
{
// we need to load some relative images and geometry files.
// to make this work reliable (e.g. starting the tutorial via link)
// we use the argv[0] parameter.
#ifdef WIN32
std::string sep("\\");
#else
std::string sep("/");
#endif
std::string path = argv[0];
// remove app name
std::string::size_type i = path.rfind(sep);
if(i != std::string::npos)
path = path.substr(0, i);
// set the current dir to the application dir.
OSG::Directory::setCurrent(path.c_str());
// OSG init
OSG::osgInit(argc, argv);
/* Initialize GLUT state - glut will take any command line arguments that pertain to it or
X Windows - look at its documentation at http://reality.sgi.com/mjk/spec3/spec3.html */
glutInit(&argc, argv);
/* Select type of Display mode:
Double buffer
RGBA color
Alpha components supported (use GLUT_ALPHA)
Depth buffer */
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
/* get a 640 x 480 window */
//glutInitWindowSize(640, 480);
glutInitWindowSize(Width, Height);
/* the window starts at the upper left corner of the screen */
glutInitWindowPosition(300, 0);
/* Open a window */
window = glutCreateWindow("Oz, Mouse Control");
if (m_bFullscreen)
glutFullScreen();
glutSetCursor(GLUT_CURSOR_NONE);
glutDisplayFunc(&DrawGLScene);
// register all GLUT callback functions
glutIdleFunc(idleFunc);
/* Register the function called when our window is resized. */
glutReshapeFunc(ReSizeGLScene);
/* Register the function called when the keyboard is pressed. */
glutKeyboardFunc(keyPressed);
/* Register the function called when special keys (arrows, page down, etc) are pressed. */
//glutSpecialFunc(&specialKeyPressed);
glutMouseFunc(mouseFunc);
glutMotionFunc(motionFunc);
glutPassiveMotionFunc(motionFunc);
/* Initialize our window. */
InitGL(640, 480);
pwin = OSG::PassiveWindow::create();
pwin->init();
/*
All scene file loading is handled via the SceneFileHandler.
*/
world = OSG::SceneFileHandler::the()->read("Data/tie.wrl");
// create the main scene transformation node
// 1. create the Node
scene =OSG:: Node::create();
// 2. create the core
trans = OSG::Transform::create();
// 3. associate the core with the node
scene->setCore(trans);
scene->addChild(world); // add the world as a child
// create the SimpleSceneManager helper - it will be only partially used
mgr = new OSG::SimpleSceneManager;
// tell the manager what to manage
mgr->setWindow(pwin );
mgr->setRoot (scene);
if (pwin->getMFPort()->size() != 0)
{
OSG::PassiveBackgroundRefPtr bg = OSG::PassiveBackground::create();
vp = pwin->getPort(0);
cam = dynamic_cast<OSG::PerspectiveCamera *>(vp->getCamera());
newcam = OSG::MatrixCamera::create(); // the MatrixCamera will only be a slave to the OpenGL matrices
//.........这里部分代码省略.........
示例11: buildGeoTree
//
// build geometry scenegraph Tree
//
//
// We need 3 material groups for the clip plane capping trick:
//
// scene
// |
// +--------------------+--------------------+
// | | |
// group1 (mat1) group2 (mat2) group3 (mat3)
// | | |
// geometry (geo1) geometry (geo2) geometry (geo1)
//
// geo1 : actual geometry to draw
// geo2 : plane geometry coincident with the clip plane
//
// mat1 : has a stencil chunk that clears the stencil buffer first, than
// does the inversion, and has a clip plane chunk that enables one
// clip plane. Sort key 2*i + 0 with i idx of a clip plane.
// mat2 : has a stencil chunk and settings for drawing the clip plane
// geometry. All clip planes but the one coincident with the plane
// are activated. Sort key 2*i + 0 with i idx of a clip plane.
// mat3 : the material used for the actual geometry. All clip planes are
// activated. Sort key none.
//
// For each active clip plane copies of the left two branches need to be
// added.
//
OSG::NodeTransitPtr buildGeoTree( OSG::Node *scene,
OSG::Geometry *geo1,
const OSG::Matrix &matrix)
{
//
// Parent nodes for the left two branches
//
VecNodesT vecMaterialNodes1;
VecNodesT vecMaterialNodes2;
for(int i = 0; i < iNumClipPlanes; ++i) // foreach clip plane
{
//
// Branch 1: Imprint the geometry clip plane intersection into the
// stencil buffer.
//
OSG::NodeRefPtr geomNode = OSG::Node::create();
geomNode->setCore(geo1);
OSG::NodeRefPtr materialNode1 = OSG::Node::create();
//
// Create stencil material core
//
OSG::StencilChunkRefPtr stencilChunk1 = OSG::StencilChunk::create();
stencilChunk1->setClearBuffer(1);
stencilChunk1->setStencilFunc(GL_NEVER);
stencilChunk1->setStencilValue(1);
stencilChunk1->setStencilMask(1);
stencilChunk1->setStencilOpFail(GL_INVERT);
stencilChunk1->setStencilOpZFail(GL_INVERT);
stencilChunk1->setStencilOpZPass(GL_INVERT);
OSG::ChunkMaterialRefPtr mat1 = OSG::ChunkMaterial::create();
mat1->addChunk(stencilChunk1);
mat1->addChunk(vecClipPlaneDetails[i]._clipPlaneChunk);
mat1->setSortKey(2 * i + 0);
OSG::MaterialGroupRefPtr mgrp1 = OSG::MaterialGroup::create();
mgrp1->setMaterial(mat1);
materialNode1->setCore(mgrp1);
materialNode1->addChild(geomNode); // the primary geometry
vecMaterialNodes1.push_back(materialNode1);
//
// Branch 2: Draw plane at places were the stencil buffer is set
//
OSG::NodeRefPtr materialNode2 = OSG::Node ::create();
OSG::StencilChunkRefPtr stencilChunk2 = OSG::StencilChunk::create();
stencilChunk2->setStencilFunc(GL_EQUAL);
stencilChunk2->setStencilValue(1);
stencilChunk2->setStencilMask(1);
stencilChunk2->setStencilOpFail(GL_KEEP);
stencilChunk2->setStencilOpZFail(GL_ZERO);
stencilChunk2->setStencilOpZPass(GL_ZERO);
OSG::SimpleMaterialRefPtr mat2 = OSG::SimpleMaterial::create();
mat2->setDiffuse(vecClipPlaneDetails[i]._planeColor);
mat2->setSpecular(OSG::Color3f(1,1,1));
mat2->setLit(true);
//
// Do clip the plane with all clip planes but the one coincident
// with the plane.
//
for(int j = 0; j < iNumClipPlanes; ++j)
{
if(i != j)
{
//.........这里部分代码省略.........
示例12: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// The scene group
OSG::NodeRefPtr scene = OSG::Node::create();
OSG::GroupRefPtr g = OSG::Group::create();
scene->setCore(g);
if(argc < 2)
{
FWARNING(("No file given!\n"));
FWARNING(("Supported file formats:\n"));
std::list<const char*> suffixes;
OSG::SceneFileHandler::the()->getSuffixList(suffixes);
for(std::list<const char*>::iterator it = suffixes.begin();
it != suffixes.end();
++it)
{
FWARNING(("%s\n", *it));
}
fileroot = OSG::makeTorus(.5, 2, 16, 16);
}
else
{
fileroot = OSG::SceneFileHandler::the()->read(argv[1]);
/*
All scene file loading is handled via the SceneFileHandler.
*/
}
scene->addChild(fileroot);
// Create a small geometry to show the ray and what was hit
// Contains a line and a single triangle.
// The line shows the ray, the triangle whatever was hit.
OSG::SimpleMaterialRefPtr red = OSG::SimpleMaterial::create();
red->setDiffuse (OSG::Color3f( 1,0,0 ));
red->setTransparency(0.5);
red->setLit (false);
isectPoints = OSG::GeoPnt3fProperty::create();
isectPoints->addValue(OSG::Pnt3f(0,0,0));
isectPoints->addValue(OSG::Pnt3f(0,0,0));
isectPoints->addValue(OSG::Pnt3f(0,0,0));
isectPoints->addValue(OSG::Pnt3f(0,0,0));
isectPoints->addValue(OSG::Pnt3f(0,0,0));
OSG::GeoUInt32PropertyRefPtr index = OSG::GeoUInt32Property::create();
index->addValue(0);
index->addValue(1);
index->addValue(2);
index->addValue(3);
index->addValue(4);
OSG::GeoUInt32PropertyRefPtr lens = OSG::GeoUInt32Property::create();
lens->addValue(2);
lens->addValue(3);
OSG::GeoUInt8PropertyRefPtr type = OSG::GeoUInt8Property::create();
type->addValue(GL_LINES);
type->addValue(GL_TRIANGLES);
testgeocore = OSG::Geometry::create();
testgeocore->setPositions(isectPoints);
testgeocore->setIndices(index);
testgeocore->setLengths(lens);
testgeocore->setTypes(type);
testgeocore->setMaterial(red);
OSG::NodeRefPtr testgeo = OSG::Node::create();
testgeo->setCore(testgeocore);
scene->addChild(testgeo);
// create the SimpleSceneManager helper
mgr = OSG::SimpleSceneManager::create();
// tell the manager what to manage
//.........这里部分代码省略.........
示例13: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// Args given?
if(argc > 1)
{
if(sscanf(argv[1], "%u", &nlights) != 1)
{
FWARNING(("Number of lights '%s' not understood.\n", argv[1]));
nlights = 3;
}
}
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
/*
A Light defines a source of light in the scene. Generally, two types
of information are of interest: The position of the light source
(geometry), and what elements of the scene are lit (semantics).
Using the position of the light in the graph for geometry allows
moving the Light just like any other node, by putting it below a
OSG::Transform Node and changing the transformation. This consistency
also simplifies attaching Lights to moving parts in the scene: just
put them below the same Transform and they will move with the object.
The semantic interpretation also makes sense, it lets you restrict the
influence area of the light to a subgraph of the scene. This can be
used for efficiency, as every active light increases the amount of
calculations necessary per vertex, even if the light doesn't influence
the vertex, because it is too far away. It can also be used to
overcome the restrictions on the number of lights. OpenSG currently
only allows 8 concurrently active lights.
It is also not difficult to imagine situations where both
interpretations are necessary at the same time. Take for example a car
driving through a night scene. You'd want to headlights to be fixed to
the car and move together with it. But at the same time they should
light the houses you're driving by, and not the mountains in the
distance.
Thus there should be a way to do both at the same time. OpenSG solves
this by splitting the two tasks to two Nodes. The Light's Node is for
the sematntic part, it defines which object are lit by the Light. FOr
the geometrc part the Light keeps a SFNodePtr to a different Node, the
so called beacon. The local coordinate system of the beacon provides
the reference coordinate system for the light's position.
Thus the typical setup of an OpenSG scenegraph starts with a set of
lights, which light the whole scene, followed by the actual geometry.
Tip: Using the beacon of the camera (see \ref PageSystemWindowCamera)
as the beacon of a light source creates a headlight.
Every light is closely related to OpenGL's light specification. It has
a diffuse, specular and ambient color. Additionally it can be switched
on and off using the on field.
*/
// Create the scene
OSG::NodeRefPtr scene = OSG::Node::create();
OSG::GroupRefPtr group = OSG::Group::create();
scene->setCore(group);
// create the scene to be lit
// a simple torus is fine for now.
// You can add more Geometry here if you want to.
OSG::NodeRefPtr lit_scene = OSG::makeTorus(.5, 2, 32, 64);
// helper node to keep the lights on top of each other
OSG::NodeRefPtr lastnode = lit_scene;
// create the light sources
OSG::Color3f colors[] =
{
OSG::Color3f(1,0,0), OSG::Color3f(0,1,0), OSG::Color3f(0,0,1),
OSG::Color3f(1,1,0), OSG::Color3f(0,1,1), OSG::Color3f(1,0,1),
OSG::Color3f(1,1,1), OSG::Color3f(1,1,1)
};
if(nlights > 8)
{
//.........这里部分代码省略.........
示例14: main
//
// Initialize GLUT & OpenSG and set up the scene
//
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// create the SimpleSceneManager helper
mgr = OSG::SimpleSceneManager::create();
mgr->setWindow(gwin);
// create a pretty simple graph: a Group with two Transforms as children,
// each of which carries a single Geometry.
// The scene
OSG::NodeRefPtr scene = OSG::Node::create();
// The cylinder and its transformation
OSG::NodeRefPtr cyl = OSG::Node::create();
OSG::GeometryRefPtr cylgeo = OSG::makeCylinderGeo( 1.4f, .3f, 24,
true, true, true );
cyl->setCore(cylgeo);
cyltrans = OSG::Transform::create();
OSG::NodeRefPtr cyltransnode = OSG::Node::create();
cyltransnode->setCore (cyltrans);
cyltransnode->addChild(cyl );
// add it to the scene
scene->addChild(cyltransnode);
// The torus and its transformation
OSG::NodeRefPtr torus = OSG::Node::create();
OSG::GeometryRefPtr torusgeo = OSG::makeTorusGeo( .2f, 1, 24, 36 );
torus->setCore(torusgeo);
tortrans = OSG::Transform::create();
OSG::NodeRefPtr tortransnode = OSG::Node::create();
tortransnode->setCore (tortrans);
tortransnode->addChild(torus );
// add it to the scene
scene->addChild(tortransnode);
//
// create the shader program
//
OSG::ShaderProgramChunkRefPtr prog_chunk = OSG::ShaderProgramChunk::create();
OSG::ShaderProgramRefPtr vertShader = OSG::ShaderProgram::createVertexShader();
OSG::ShaderProgramRefPtr fragShader = OSG::ShaderProgram::createFragmentShader();
vertShader->setProgram(get_vp_program());
fragShader->setProgram(get_fp_program());
//
// binding the shader storage block to a buffer binding point can be performed
// either by calling the shaders's addShaderStorageBlock method or by
// adding a 'buffer block' variable to a ShaderProgramVariableChunk.
// In the following we use both variants for illustration.
//
fragShader->addShaderStorageBlock("ExampleBlock", 1); // block binding point
prog_chunk->addShader(vertShader);
prog_chunk->addShader(fragShader);
//
// create shader storage buffer object for block 'ExampleBlock'
//
OSG::MultiPropertySSBOChunkRefPtr ssbo_example_block = create_example_block_state();
OSG::PolygonChunkRefPtr polygon_chunk = OSG::PolygonChunk::create();
polygon_chunk->setFrontMode(GL_FILL);
polygon_chunk->setBackMode(GL_FILL);
polygon_chunk->setCullFace(GL_NONE);
OSG::DepthChunkRefPtr depth_chunk = OSG::DepthChunk::create();
depth_chunk->setEnable(true);
OSG::ChunkMaterialRefPtr prog_state = OSG::ChunkMaterial::create();
prog_state->addChunk(ssbo_example_block, 1); // buffer binding point 1
prog_state->addChunk(prog_chunk);
prog_state->addChunk(polygon_chunk);
//.........这里部分代码省略.........
示例15: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// create the scene
OSG::NodeRefPtr torus = OSG::makeTorus( .5, 2, 16, 32 );
OSG::NodeRefPtr scene = OSG::Node::create();
trans = OSG::Transform::create();
scene->setCore(trans);
scene->addChild(torus);
// Create the parts needed for the video background
OSG::UInt32 width = 640;
OSG::UInt32 height = 480;
// get the desired size from the command line
if(argc >= 3)
{
width = atoi(argv[1]);
height = atoi(argv[2]);
}
// To check OpenGL extensions, the Window needs to have run through
// frameInit at least once. This automatically happens when rendering,
// but we can't wait for that here.
gwin->activate ();
gwin->frameInit();
// Now we can check for OpenGL extensions
hasNPOT = gwin->hasExtension("GL_ARB_texture_non_power_of_two");
// Print what we've got
SLOG << "Got " << (isPOT?"":"non-") << "power-of-two images and "
<< (hasNPOT?"can":"cannot") << " use NPOT textures, changing "
<< (changeOnlyPart?"part":"all")
<< " of the screen"
<< std::endl;
// Ok, now for the meat of the code...
// first we need an Image to hold the picture(s) to show
image = OSG::Image::create();
// set the image's size and type, and allocate memory
// this example uses RGB. On some systems (e.g. Windows) BGR
// or BGRA might be faster, it depends on how the images are
// acquired
image->set(OSG::Image::OSG_RGB_PF, width, height);
// Now create the texture to be used for the background
texObj = OSG::TextureObjChunk::create();
// Associate image and texture
texObj->setImage(image);
// Set filtering modes. LINEAR is cheap and good if the image size
// changes very little (i.e. the window is about the same size as
// the images).
texObj->setMinFilter(GL_LINEAR);
texObj->setMagFilter(GL_LINEAR);
// Set the wrapping modes. We don't need repetition, it might actually
// introduce artifactes at the borders, so switch it off.
texObj->setWrapS(GL_CLAMP_TO_EDGE);
texObj->setWrapT(GL_CLAMP_TO_EDGE);
// Newer versions of OpenGL can handle NPOT textures directly.
// OpenSG will do that internally automatically.
//
// Older versions need POT textures. By default OpenSG
// will scale an NPOT texture to POT while defining it.
// For changing textures that's too slow.
// So tell OpenSG not to scale the image and adjust the texture
// coordinates used by the TextureBackground (see below).
texObj->setScale(false);
// Create the background
OSG::TextureBackgroundRefPtr back = OSG::TextureBackground::create();
//.........这里部分代码省略.........