Hi,

I assume someone will interested in this,
enough to read my code and reply with suggestions.
I am presenting code that should replace the OpenGL code presented above.
Both codes are run insides the glutDisplayFunc callback, "display call".
I have also added the OSG object initialization code
required prior to the OSG display call.
I expect this is where I need other suggestions.


1) This is the code used in each OSG "display call".
How can I copy byte-for-byte, like memcpy,
from the external stream "buffer" into the VBO ?


Code:

    float *buffer = captureBuffer();

    for (uint j = 0; j < vec->size(); j++)
    {
        vec->at(j) = osg::Vec3(buffer[j*3],buffer[j*3+1],buffer[j*3+2]);
        vec->dirty();
    }

    releaseBuffer();

    // update and render the scene graph
    if (viewer.valid()) viewer->frame();





2) This is the code to initialize OSG display & objects.
I expect I am doing too much work here....HELP !


Code:

    //Initialize an OSG scene
    osg::ref_ptr<osgViewer::Viewer> viewer;
    osg::observer_ptr<osgViewer::GraphicsWindow> window;
    osg::ref_ptr<osg::Node> loadedModel = createScene();

    // Create objects to store geometry and vertices.
    osg::ref_ptr<osg::Geode> geode = new osg::Geode;
    osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
    osg::ref_ptr<osg::Vec3Array> vec = new osg::Vec3Array;

    // create the view of the scene.
    viewer = new osgViewer::Viewer;
    window = viewer->setUpViewerAsEmbeddedInWindow(100,100,800,600);
    viewer->setSceneData(loadedModel.get());
    viewer->setCameraManipulator(new osgGA::TrackballManipulator);
    viewer->addEventHandler(new osgViewer::StatsHandler);
    viewer->realize();

    osg::Node* createScene(void)
    {
        // Disable Display lists and setup Vertex Buffer Objects
        geom->setUseDisplayList (false);
        geom->setUseVertexBufferObjects(true);

        // Set VBO to STREAMING since attributes are changing per frame
        osg::VertexBufferObject* df = geom->getOrCreateVertexBufferObject();
        df->setUsage (GL_DYNAMIC_DRAW);//(GL_STREAM_DRAW);//

        vec->resize(buffer_size);
        //initial box size for auto setup boundry// FIXME: draw a cube in the 
scene
        vec->at(0)=osg::Vec3( 2.0, 2.0, 2.0);
        vec->at(1)=osg::Vec3(-2.0,-2.0,-2.0);
        vec->at(2)=osg::Vec3(-2.0, 2.0, 2.0);
        vec->at(3)=osg::Vec3( 2.0,-2.0,-2.0);
        geom->setVertexArray( vec.get() );

        osg::Vec4Array* c = new osg::Vec4Array;
        c->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
        geom->setColorArray(c);
        geom->setColorBinding(osg::Geometry::BIND_OVERALL);

        osg::Vec3Array* n = new osg::Vec3Array;
        n->push_back(osg::Vec3(0.0f,-1.0f,0.0f));
        geom->setNormalArray(n);
        geom->setNormalBinding(osg::Geometry::BIND_OVERALL);

        geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS,
                                                                                
           0, buffer_size));
        geode->addDrawable (geom.get());

        return (geode);
    }





Thank you!

Cheers,
Ga

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=43118#43118





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to