[osg-users] Bug while updating geometry in Linux
Nikita Petrov
nikitapetroff at gmail.com
Thu Jan 26 01:27:34 PST 2017
Hi,
I am trying to port my app from Windows to Linux.
I have a ribbon, which is updated dynamically. I add 2 points to vertices and I use GL_TRIANGLE_STRIP to create a ribbon.
On Windows everything works fine.
But on Linux all new vertices go to coordinates (0,0,0) after calling geometry->dirtyBound();
I even created a small app to test this behaviour on Linux. It should draw sine function ribbon.
Here's the code:
osg::ref_ptr<osg::Vec3Array> vertices;
osg::ref_ptr<osg::Geometry> geometry;
osg::DrawArrays* drawArrays;
int count;
class UpdateVertex: public osg::NodeCallback
{
public:
UpdateVertex() {}
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv);
};
void UpdateVertex::operator()(osg::Node* node, osg::NodeVisitor* nv)
{
OpenThreads::Thread::microSleep(1000);
vertices->push_back(osg::Vec3(1+count/200.0, 1, 1+sin(count*M_PI/180.0)));
vertices->push_back(osg::Vec3(1+count/200.0, 2, 1+sin(count*M_PI/180.0)));
count++;
drawArrays->setCount(vertices->size());
geometry->dirtyBound();
traverse(node, nv);
}
int main(int argc, char *argv[])
{
vertices = new osg::Vec3Array();
count = 120;
for (int i=0;i<count;i++)
{
vertices->push_back(osg::Vec3(1+i/200.0, 1, 1+sin(i*M_PI/180.0)));
vertices->push_back(osg::Vec3(1+i/200.0, 2, 1+sin(i*M_PI/180.0)));
}
osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array();
normal->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
osg::ref_ptr<osg::Vec4Array> color = new osg::Vec4Array();
color->push_back(osg::Vec4(0,0,1,0.8f));
geometry = new osg::Geometry;
geometry->setDataVariance(osg::Object::DYNAMIC);
geometry->setUseDisplayList(false);
geometry->setVertexArray(vertices.get());
geometry->setNormalArray(normal.get());
geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
geometry->setColorArray(color.get());
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
drawArrays = new osg::DrawArrays(GL_TRIANGLE_STRIP, 0, vertices->size());
geometry->addPrimitiveSet(drawArrays);
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
geode->addDrawable(geometry.get());
geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
osg::ref_ptr<osg::Group> root = new osg::Group();
root->addChild(geode.get());
root->addUpdateCallback(new UpdateVertex);
osgViewer::Viewer viewer;
viewer.setSceneData(root.get());
viewer.getCamera()->setSmallFeatureCullingPixelSize(0);
viewer.getCamera()->setClearColor(osg::Vec4(1,1,1,1));
viewer.addEventHandler(new osgViewer::StatsHandler);
viewer.realize();
return viewer.run();
}
And you can see what I get in the attachements.
If I press "S" to see number of vertices (thanks to StatsHandler), it is always increasing. So new vertices are added, but in (0,0,0) coordinates.
My guess is that geometry->dirtyBound(); is not working corectly.
I use master build of OSG.
On Windows I use x86 build with Visual Studio 2013.
On Linux Mint 18 Cinnamon 64-bit, I use x64 build with Qt Creator (GCC 64bit).
Hope that somebody have a clue to that issue.
Best regards,
Nikita
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=70051#70051
Attachments:
http://forum.openscenegraph.org//files/2_123.png
http://forum.openscenegraph.org//files/1_632.png
More information about the osg-users
mailing list