-
-
Save sbrkopac/45b4e9d7d35a979e7e0dd7eebbd2a061 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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(); | |
} |
Author
sbrkopac
commented
Aug 2, 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