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