Hi Robert, I found out what the Problem was—it *was* my code :-) In particular, it looks like mixing doubles and floats is very bad.
Pretty much everything is a float except for the vertex array of a street. If I change that to float and convert the Points to Vec3 instead of Vec3d, then everything is good. Do you understand why this is a problem though? Thanks, –Ben On Tue, Sep 2, 2014 at 12:01 PM, Ben Morgan <nee...@gmail.com> wrote: > 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