Skip to content

Instantly share code, notes, and snippets.

@sbrkopac
Created August 2, 2018 21:56
Show Gist options
  • Save sbrkopac/45b4e9d7d35a979e7e0dd7eebbd2a061 to your computer and use it in GitHub Desktop.
Save sbrkopac/45b4e9d7d35a979e7e0dd7eebbd2a061 to your computer and use it in GitHub Desktop.
#include <osgViewer/Viewer>
#include <osg/PolygonOffset>
#include <iostream>
class DrawLogicalNodeFlagsVisitor : public osg::NodeVisitor
{
const osg::Vec4 IGNORED_COLOR = osg::Vec4(1.0f, 0.0f, 0.0f, 0.5f);
const osg::Vec4 FLOOR_COLOR = osg::Vec4(0.0f, 1.0f, 0.0f, 0.5f);
const osg::Vec4 WATER_COLOR = osg::Vec4(0.0f, 0.0f, 1.0f, 0.5f);
public:
DrawLogicalNodeFlagsVisitor() : NodeVisitor(NodeVisitor::TRAVERSE_NONE)
{
}
virtual ~DrawLogicalNodeFlagsVisitor() {}
void apply(osg::Geode & geode) override
{
osg::ref_ptr<osg::Geode> drawable(new osg::Geode);
drawable->setName("lnoflags");
geode.addChild(drawable);
osg::ref_ptr<osg::Vec4Array> color(new osg::Vec4Array(1));
(*color)[0] = FLOOR_COLOR;
osg::ref_ptr<osg::Geometry> geometry(new osg::Geometry);
osg::ref_ptr<osg::Vec3Array> vertices(new osg::Vec3Array);
geometry->setVertexArray(vertices);
geometry->setColorArray(color);
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
osg::ref_ptr<osg::PolygonOffset> polyOffset = new osg::PolygonOffset;
polyOffset->setFactor(-1.0f);
polyOffset->setUnits(-1.0f);
geometry->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
geometry->getOrCreateStateSet()->setAttributeAndModes(polyOffset, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON);
vertices->push_back(osg::Vec3(0, 0, 0));
vertices->push_back(osg::Vec3(0, 0, -2));
vertices->push_back(osg::Vec3(0, -2, 0));
geometry->addPrimitiveSet(new osg::DrawArrays(GL_TRIANGLES, 0, vertices->size()));
drawable->addDrawable(geometry);
}
};
// class to handle events with a pick
class PickHandler : public osgGA::GUIEventHandler {
public:
PickHandler() {}
~PickHandler() {}
bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override
{
switch (ea.getEventType())
{
case(osgGA::GUIEventAdapter::PUSH):
{
osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
if (view) pick(view, ea);
return false;
}
default:
return false;
}
}
void pick(osgViewer::View* view, const osgGA::GUIEventAdapter& ea)
{
osgUtil::LineSegmentIntersector::Intersections intersections;
if (view->computeIntersections(ea, intersections))
{
osg::Geode * geode = intersections.begin()->nodePath.back()->asGeode();
if (geode != nullptr)
{
// stuff happens
}
}
}
};
int main(int argc, char** argv[])
{
osgViewer::Viewer viewer;
viewer.setUpViewInWindow(50, 50, 1024, 768);
viewer.addEventHandler(new PickHandler());
osg::Vec3Array * vertices = new osg::Vec3Array;
vertices->push_back(osg::Vec3(0, 0, 0));
vertices->push_back(osg::Vec3(0, 0, -2));
vertices->push_back(osg::Vec3(0, -2, 0));
osg::Geometry * geometry = new osg::Geometry;
geometry->setVertexArray(vertices);
geometry->addPrimitiveSet(new osg::DrawArrays(GL_TRIANGLES, 0, 3));
osg::Geode * drawable = new osg::Geode;
drawable->addDrawable(geometry);
drawable->getOrCreateStateSet()->setMode(GL_LIGHTING, false);
// Without the visitor the picking won't crash
DrawLogicalNodeFlagsVisitor visitor;
visitor.apply(*drawable);
viewer.setSceneData(drawable);
return viewer.run();
}
@sbrkopac
Copy link
Author

sbrkopac commented Aug 3, 2018

class DrawLogicalNodeFlagsVisitor : public osg::NodeVisitor
{
    const osg::Vec4 IGNORED_COLOR = osg::Vec4(1.0f, 0.0f, 0.0f, 0.5f);
    const osg::Vec4 FLOOR_COLOR = osg::Vec4(0.0f, 1.0f, 0.0f, 0.5f);
    const osg::Vec4 WATER_COLOR = osg::Vec4(0.0f, 0.0f, 1.0f, 0.5f);

    public:

        DrawLogicalNodeFlagsVisitor() : NodeVisitor(NodeVisitor::TRAVERSE_NONE)
        {
        }

        virtual ~DrawLogicalNodeFlagsVisitor() {}

        void apply(osg::Geode & geode) override
        {
            SiegeNodeMeshData * data = (SiegeNodeMeshData *)geode.getUserData();

            osg::ref_ptr<osg::Geode> drawable(new osg::Geode);
            drawable->setName("lnoflags");

            geode.addChild(drawable);

            if (data != nullptr)
            {
                uint32_t groupingsCount = data->getLogicalNodeGroupingCount();

                // these id's start at 0
                for (uint32_t id = 0; id < groupingsCount; ++id)
                {
                    const LogicalNodeGrouping & group = data->getLogicalNodeGrouping(id);

                    osg::ref_ptr<osg::Vec4Array> color(new osg::Vec4Array(1));

                    switch (group.mFloorFlag)
                    {
                    case FloorFlag::FLOOR_IGNORED:
                        (*color)[0] = IGNORED_COLOR;
                        break;

                    case FloorFlag::FLOOR_FLOOR:
                        (*color)[0] = FLOOR_COLOR;
                        break;

                    case FloorFlag::FLOOR_WATER:
                        (*color)[0] = WATER_COLOR;
                        break;
                    }

                    osg::ref_ptr<osg::Geometry> geometry(new osg::Geometry);
                    osg::ref_ptr<osg::Vec3Array> vertices(new osg::Vec3Array);

                    geometry->setVertexArray(vertices);
                    geometry->setColorArray(color);
                    geometry->setColorBinding(osg::Geometry::BIND_OVERALL);

                    osg::ref_ptr<osg::PolygonOffset> polyOffset = new osg::PolygonOffset;
                    polyOffset->setFactor(-1.0f);
                    polyOffset->setUnits(-1.0f);

                    geometry->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
                    geometry->getOrCreateStateSet()->setAttributeAndModes(polyOffset, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON);

                    for (const Face & f : group.mLogicalNodeFaces)
                    {
                        vertices->push_back(osg::Vec3(f.a.x(), f.a.y(), f.a.z()));
                        vertices->push_back(osg::Vec3(f.b.x(), f.b.y(), f.b.z()));
                        vertices->push_back(osg::Vec3(f.c.x(), f.c.y(), f.c.z()));
                    }

                    geometry->addPrimitiveSet(new osg::DrawArrays(GL_TRIANGLES, 0, vertices->size()));

                    drawable->addDrawable(geometry);
                }
            }
        }
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment