Hi Robert, thanks for your reply. I'm kinda new in the OSG/OpenGL field, so I'm thankful for all the help and advice I can get.
The goal of the project I'm working on is to develop algorithms for street label positioning on an active route. So I have a street network, a pointer that moves along a route in the network and a camera that follows the pointer, and then I have a bunch of labels that I position and move around. (I think I might have written something in this mailing list two years ago.) I never thought that it could be anything other than a mistake of my own. The problem occurs on the following configurations: Thinkpad T420 with i5 CPU/Graphics Card (Intel HD3000 I think) Arch Linux 3.16.1 OSG version 3.2.1 OSG version 3.0.1 G++ version 4.9.1 Intel Video Driver version 2.99.914 Intel DRI Software version 10.2.6 Thinkpad T60 with Radeon Graphics Card (I only did this quickly, so I don't have all the details) Arch Linux 3.16.1 OSG version 3.2.1 G++ version 4.9.1 I tried another program that I knew was working two years ago on this computer, and it has a similar issue (though different) now—the pointer is just not there. Additionally, the osgText labels are not showing up either. The past few days since your response, I also worked on getting it to compile on Windows 7, with Visual Studio 12. (FYI: I had to add an #include <algorithm> to osgText/Glyph.cpp for it to compile, otherwise it didn't see min/max.) I'll write again after I finish that. Is there a better way to represent the street network? Should I have a Group containing a bunch of street lines and then apply color and line width at that level? Or do I store the street lines all in a single Geode? I updated (and simplified) the source code listing to include the pointer drawing code—perhaps the problem lies there? (I also changed the street network to contain a bunch of drawables inside a single Geode. Is it better that way? Or am I going a completely wrong direction with that?) Thanks again for your help! –Ben PS: And here is the updated source code (also updated at StackOverflow): // My libraries: #include <asl/util/color.h> using namespace asl; #include <straph/point.h> #include <straph/straph.h> using namespace straph; // Standard and OSG libraries: #include <utility> #include <boost/tuple/tuple.hpp> // tie using namespace std; #include <osg/ref_ptr> #include <osg/Array> #include <osg/Geometry> #include <osg/Geode> #include <osg/Group> #include <osg/LineWidth> using namespace osg; #include <osgUtil/Tessellator> #include <osgViewer/Viewer> using namespace osgViewer; /* * Just FYI: A Polyline looks like this: * * typedef std::vector<Point> Polyline; * * And a Point basically is a simple struct: * * struct Point { * double x; * double y; * }; */ inline osg::Vec3d toVec3d(const straph::Point& p, double elevation=0.0) { return osg::Vec3d(p.x, p.y, elevation); } Geometry* createStreet(const straph::Polyline& path) { ref_ptr<Vec3dArray> array (new Vec3dArray(path.size())); for (unsigned i = 0; i < path.size(); ++i) { (*array)[i] = toVec3d(path[i]); } Geometry* geom = new Geometry; geom->setVertexArray(array.get()); geom->addPrimitiveSet(new osg::DrawArrays(GL_LINE_STRIP, 0, array->size())); return geom; } Geode* load_streets() { unique_ptr<Straph> graph = read_shapefile("mexico/roads", 6); Geode* root = new Geode(); boost::graph_traits<straph::Straph>::edge_iterator ei, ee; for (boost::tie(ei, ee) = edges(*graph); ei != ee; ++ei) { const straph::Segment& s = (*graph)[*ei]; root->addDrawable(createStreet(s.polyline)); } return root; } Geode* createPointer(double width, const Color& body_color) { float f0 = 0.0f; float f3 = 3.0f; float f1 = 1.0f * width; float f2 = 2.0f * width; // Create vertex array ref_ptr<Vec3Array> vertices (new Vec3Array(4)); (*vertices)[0].set( f0 , f0 , f0 ); (*vertices)[1].set( -f1/f3, -f1/f3 , f0 ); (*vertices)[2].set( f0 , f2/f3 , f0 ); (*vertices)[3].set( f1/f3, -f1/f3 , f0 ); // Build the geometry object ref_ptr<Geometry> polygon (new Geometry); polygon->setVertexArray( vertices.get() ); polygon->addPrimitiveSet( new DrawArrays(GL_POLYGON, 0, 4) ); // Set the colors ref_ptr<Vec4Array> body_colors (new Vec4Array(1)); (*body_colors)[0] = body_color.get(); polygon->setColorArray( body_colors.get() ); polygon->setColorBinding( Geometry::BIND_OVERALL ); // Create Geode object Geode* geode = new Geode; geode->addDrawable( polygon.get() ); return geode; } int main(int, char**) { Group* root = new Group(); Geode* str = load_streets(); root->addChild(str); Geode* p = createPointer(6.0, TangoColor::Scarlet3); root->addChild(p); Viewer viewer; viewer.setSceneData(root); viewer.getCamera()->setClearColor(Color(TangoColor::White).get()); viewer.run(); } On Sat, Aug 30, 2014 at 6:56 PM, Robert Osfield <robert.osfi...@gmail.com> wrote: > HI Ben, > > The osg-users mailing list/forum is the appropriate place for support. > > I've read your post, the code you provided and screenshots and don't really > know what to make of it all. I'd guess that others will be similarly > confused but what might be work and what might not be. > > I don't understand why you are subclassing from OSG classes for this type of > work, for 3rd parties like ourselves not party to the the code in these > subclasses and without any knowledge of why felt the need to do this > subclassing it really kinda hard to know where you are going with this code. > > I couldn't spot any obvious errors in your code, but I sure wouldn't write a > tool to visualize a road network in the way you have - having lots of > separate scene graph objects and state will introduce CPU and GPU overheads > that will prevent getting the best performance for your system. > > You don't mention what hardware/GL driver/OS/OSG version you are using. > This is all is important when trying to track down problems. It could be > that you have a buggy OpenGL driver and little to do with your own code. > There isn't much we can say to help at this point as there is just way too > many unknowns about your software, hardware, OS, exactly nature of the > problem etc. > > Robert. > > > On 30 August 2014 12:32, Ben Morgan <nee...@gmail.com> wrote: >> >> I did post this question on StackOverflow ( >> >> http://stackoverflow.com/questions/25576762/warped-scene-with-two-sets-of-geodes >> ), but I assume that this is a more appropriate place for questions. >> >> I have a few objects that I want to combine into a scene graph: >> >> Street inherits from Geode and has a Geometry child drawable made up >> of a GL_LINE_STRIP. >> Pointer inherits from PositionAttitudeTransform and contains a Geode >> which contains two Geometry polygons. >> >> When I add a bunch of Streets to a Group, it looks just fine. When I >> add only the Pointer to a Group, it also looks fine. But if I somehow >> have them both in the scene, the second one is screwed up. (This does >> not happen if I have only two Pointers.) I posted some screenshots on >> the StackOverflow site, in case you want to see them. Probably I’m >> making some simple mistake—but I can’t see it! >> >> Here is some code that causes the problem (I tried to shorten it a >> little): >> >> // My libraries: >> #include <asl/util/draw.h> >> #include <asl/util/color.h> >> using namespace asl; >> >> #include <straph/point.h> >> #include <straph/straph.h> >> using namespace straph; >> >> // Standard and OSG libraries: >> #include <utility> >> #include <boost/tuple/tuple.hpp> // tie >> using namespace std; >> >> #include <osg/ref_ptr> >> #include <osg/Array> >> #include <osg/Geometry> >> #include <osg/Group> >> #include <osg/LineWidth> >> using namespace osg; >> >> #include <osgUtil/Optimizer> >> #include <osgViewer/Viewer> >> #include <osgViewer/ViewerEventHandlers> >> using namespace osgViewer; >> >> Geode* createStreet(const straph::Polyline& path, double width, const >> Color& color) >> { >> ref_ptr<Geometry> geom (new Geometry); >> >> // Set the shape: >> ref_ptr<Vec3dArray> array (new Vec3dArray(path.size())); >> for (unsigned i = 0; i < path.size(); ++i) { >> (*array)[i] = toVec3d(path[i]); >> } >> geom->setVertexArray(array.get()); >> geom->addPrimitiveSet(new osg::DrawArrays(GL_LINE_STRIP, 0, >> array->size())); >> >> // Set the normals: >> ref_ptr<Vec3Array> normals (new Vec3Array(1)); >> (*normals)[0].set( 0.0f, 0.0f, 1.0f ); >> geom->setNormalArray( normals.get() ); >> geom->setNormalBinding( Geometry::BIND_OVERALL ); >> >> // Set the colors: >> ref_ptr<Vec4Array> colors = new Vec4Array(); >> colors->push_back(color.get()); >> geom->setColorArray(colors); >> geom->setColorBinding(osg::Geometry::BIND_OVERALL); >> >> Geode* g = new Geode(); >> g->addDrawable(geom.get()); >> >> // Set the line width. >> ref_ptr<LineWidth> lwidth (new LineWidth); >> lwidth->setWidth(width); >> g->getOrCreateStateSet()->setAttributeAndModes(lwidth, >> StateAttribute::ON); >> >> return g; >> } >> >> Group* load_streets() >> { >> unique_ptr<Straph> graph = read_shapefile("mexico/roads", 6); >> >> Group* root = new Group(); >> boost::graph_traits<straph::Straph>::edge_iterator ei, ee; >> for (boost::tie(ei, ee) = edges(*graph); ei != ee; ++ei) { >> const straph::Segment& s = (*graph)[*ei]; >> root->addChild(createStreet(s.polyline, 2.0, >> TangoColor::Aluminium4)); >> } >> return root; >> } >> >> int main(int, char**) >> { >> Group* root = load_streets(); >> Pointer* p = new Pointer(6.0, TangoColor::Scarlet3, >> TangoColor::Black); >> root->addChild(p); >> >> Viewer viewer; >> viewer.setSceneData(root); >> viewer.getCamera()->setClearColor(Color(TangoColor::White).get()); >> viewer.run(); >> } >> >> Thanks for the help! :-) >>  >> –Ben Morgan >> _______________________________________________ >> osg-users mailing list >> osg-users@lists.openscenegraph.org >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > > > _______________________________________________ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > _______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org