Hello all, I'm using OpenSG2.0 to read line strips out of a .wrl file and process them afterwards. I've attached a sample file containing three line strips. In principle these line segments are connected, i.e., they represent a closed curve. I have some trouble with the whole process and I do not know if there are bugs or I'm missing something.
1) When reading the file, GL_LINES instead of GL_LINE_STRIPS are generated in
the geometry core. A simple example shows the issue: At the end of the
following code snipplet, the type of the geometry core is GL_LINES instead of
GL_LINE_STRIP.
OSG::GeometryRecPtr geo = OSG::Geometry::create();
OSG::GeoUInt8PropertyRecPtr types = OSG::GeoUInt8Property::create();
OSG::GeoUInt32PropertyRecPtr lengths = SG::GeoUInt32Property::create();
OSG::GeoPnt3fPropertyRecPtr positions = OSG::GeoPnt3fProperty::create();
OSG::GeoUInt32PropertyRecPtr indices = SG::GeoUInt32Property::create();
ypes->addValue(GL_LINE_STRIP);
lengths->addValue(4);
for(unsigned int i = 0; i < 4; ++i)
{
indices->addValue(i);
positions->addValue(OSG::Vec3f(i * 0.1, 0.0f, 0.0f));
}
geo->setTypes(types);
geo->setLengths(lengths);
geo->setPositions(positions);
geo->setIndices(indices);
OSG::NodeRecPtr myNode = OSG::Node::create();
myNode->setCore(geo);
OSG::SceneFileHandler::the()->write(myNode, "test.wrl");
OSG::NodeRefPtr scene;
scene = OSG::SceneFileHandler::the()->read("test.wrl", NULL);
I fixed that in my application by traversing the generated scene graph and
replacing all GL_LINES with GL_LINE_STRIP.
2) In a second step I need to merge all geometry cores into one. As the
geometry is spread over the whole the scenegraph and the GeometryMergeOp only
works with direct children, I collected all geometry cores and put them "below"
a group node ("newScene"). The merge operation works in principle, but it
always results in two geometry cores: one with the merged geometry and another
one. I assume that the "second" one is simply not deleted in the final step.
Here is the code:
OSG::Action::ResultE changeToLineStripAndCollectGeoNodes(OSG::Node* node)
{
OSG::Geometry * geo = dynamic_cast<OSG::Geometry* (node->getCore());
if(geo)
{
OSG::GeoIntegralProperty* lengths = geo->getLengths();
OSG::GeoIntegralProperty* indices = geo->getIndices();
OSG::GeoIntegralProperty* types = geo->getTypes();
for(unsigned int i = 0; i < types->size(); ++i)
{
types->setValue(GL_LINE_STRIP, i);
}
geoNodes.push_back(node);
}
return OSG::Action::Continue;
}
void processGeometry(OSG::NodeRecPtr& loadedGeo, OSG::NodeRecPtr& newScene)
{
OSG::traverse(loadedGeo,boost::bind(&changeToLineStripAndCollectGeoNodes, _1));
newScene = OSG::makeCoredNode<OSG::Group>();
for(unsigned int i = 0; i < geoNodes.size(); ++i)
{
newScene->addChild(geoNodes[i]);
}
OSG::GeometryMergeGraphOpRefPtr mergeOp =
OSG::GeometryMergeGraphOp::create();
mergeOp->traverse(newScene);
// here newScene has two children, not one...
3) In the third step, I call "createSharedIndex" in order to merge vertices
that belong more than on line segment (these are the start- and end-vertices of
the line strips.) With the attached file, only two of the three start-vertices
are merged with the corresponding end-vertex. What may be the reason?)
4) Finally, I would like to make one linestrip out of the geometry. But the
StipeGraphOp does not seem to work for linestrips (only tri- and quadstrips?)
Thanks for taking your time, best regards,
Daniel
--
Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de
test.wrl
Description: Binary data
------------------------------------------------------------------------------ Simplify data backup and recovery for your virtual environment with vRanger. Installation's a snap, and flexible recovery options mean your data is safe, secure and there when you need it. Discover what all the cheering's about. Get your free trial download today. http://p.sf.net/sfu/quest-dev2dev2
_______________________________________________ Opensg-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensg-users
