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

Reply via email to