Skip to content

Instantly share code, notes, and snippets.

@sbrkopac
Created August 2, 2018 21:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • 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 2, 2018

osg157-osgd.dll!osg::Node::isCullingActive() Line 337 C++
osg157-osgUtild.dll!osgUtil::LineSegmentIntersector::intersect(osgUtil::IntersectionVisitor & iv, osg::Drawable * drawable) Line 509 C++
osg157-osgUtild.dll!osgUtil::IntersectionVisitor::intersect(osg::Drawable * drawable) Line 282 C++
osg157-osgUtild.dll!osgUtil::IntersectionVisitor::apply(osg::Geode & geode) Line 240 C++
osg157-osgd.dll!osg::Geode::accept(osg::NodeVisitor & nv) Line 37 C++
osg157-osgd.dll!osg::Group::traverse(osg::NodeVisitor & nv) Line 63 C++
osg157-osgd.dll!osg::NodeVisitor::traverse(osg::Node & node) Line 277 C++
osg157-osgUtild.dll!osgUtil::IntersectionVisitor::apply(osg::Camera & camera) Line 495 C++
osg157-osgd.dll!osg::Camera::accept(osg::NodeVisitor & nv) Line 54 C++
osg157-osgViewerd.dll!osgViewer::View::computeIntersections(const osg::Camera * camera, osgUtil::Intersector::CoordinateFrame cf, float x, float y, std::multiset<osgUtil::LineSegmentIntersector::Intersection,std::lessosgUtil::LineSegmentIntersector::Intersection,std::allocatorosgUtil::LineSegmentIntersector::Intersection > & intersections, unsigned int traversalMask) Line 1051 C++
osg157-osgViewerd.dll!osgViewer::View::computeIntersections(const osgGA::GUIEventAdapter & ea, std::multiset<osgUtil::LineSegmentIntersector::Intersection,std::lessosgUtil::LineSegmentIntersector::Intersection,std::allocatorosgUtil::LineSegmentIntersector::Intersection > & intersections, unsigned int traversalMask) Line 1020 C++
editor.exe!PickHandler::pick(osgViewer::View * view, const osgGA::GUIEventAdapter & ea) Line 86 C++
editor.exe!PickHandler::handle(const osgGA::GUIEventAdapter & ea, osgGA::GUIActionAdapter & aa) Line 75 C++
osg157-osgGAd.dll!osgGA::GUIEventHandler::handle(const osgGA::GUIEventAdapter & ea, osgGA::GUIActionAdapter & aa, osg::Object * __formal, osg::NodeVisitor * __formal) Line 65 C++
osg157-osgGAd.dll!osgGA::GUIEventHandler::handle(osgGA::Event * event, osg::Object * object, osg::NodeVisitor * nv) Line 34 C++
osg157-osgViewerd.dll!osgViewer::Viewer::eventTraversal() Line 1113 C++
osg157-osgViewerd.dll!osgViewer::ViewerBase::frame(double simulationTime) Line 748 C++
osg157-osgViewerd.dll!osgViewer::ViewerBase::run() Line 717 C++
osg157-osgViewerd.dll!osgViewer::Viewer::run() Line 444 C++
editor.exe!main(int argc, char * * * argv) Line 123 C++
[External Code]
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]

@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