PickHandler.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Include own headers
  2. #include "PickHandler.hpp"
  3. // Include modules
  4. #include "OSGWidget.hpp"
  5. // Include dependencies
  6. #include <osg/io_utils>
  7. #include <osgUtil/IntersectionVisitor>
  8. #include <osgUtil/LineSegmentIntersector>
  9. #include <osg/ShapeDrawable>
  10. #include <osg/MatrixTransform>
  11. #include <osg/Material>
  12. #include <osg/StateSet>
  13. #include <osgViewer/Viewer>
  14. PickHandler::PickHandler(StoreHandler* storeHandler, OpenScadRenderer* openScadRenderer, ThreeMFWriter* threeMFWriter, osg::ref_ptr<osg::Node> axesNode) {
  15. _storeHandler = storeHandler;
  16. _openScadRenderer = openScadRenderer;
  17. _threeMFWriter = threeMFWriter;
  18. _axesNode = axesNode;
  19. }
  20. osg::Node* PickHandler::getOrCreateSelectionCylinder() {
  21. if (!_selectionTranslateGroup) {
  22. osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  23. osg::ref_ptr<osg::ShapeDrawable> cylinder = new osg::ShapeDrawable();
  24. cylinder->setShape(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, 0.0f), 1.0f, 10.0f));
  25. cylinder->setColor(osg::Vec4(1.0f, 0.0f, 0.0f, 0.2f));
  26. geode->addDrawable(cylinder.get());
  27. OSGWidget::fixMaterialState(geode);
  28. _selectionRotateGroup = new osg::MatrixTransform;
  29. _selectionRotateGroup->addChild(geode.get());
  30. _selectionMoveToEndGroup = new osg::MatrixTransform;
  31. _selectionMoveToEndGroup->addChild(_selectionRotateGroup.get());
  32. _selectionTranslateGroup = new osg::MatrixTransform;
  33. _selectionTranslateGroup->addChild(_selectionMoveToEndGroup.get());
  34. _selectionSwitch = new osg::Switch;
  35. _selectionSwitch->addChild(_selectionTranslateGroup.get());
  36. }
  37. return _selectionSwitch.get();
  38. }
  39. bool PickHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) {
  40. if (ea.getModKeyMask()&osgGA::GUIEventAdapter::MODKEY_CTRL) {
  41. isSelection = !isSelection;
  42. setVisibility(false);
  43. }
  44. if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE && ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON && isSelection) {
  45. osgViewer::View* viewer = dynamic_cast<osgViewer::View*>(&aa);
  46. if (viewer) {
  47. osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, ea.getX(), ea.getY());
  48. osgUtil::IntersectionVisitor iv(intersector.get());
  49. iv.setTraversalMask(~0x1);
  50. viewer->getCamera()->accept(iv);
  51. if (intersector->containsIntersections()) {
  52. for (const osgUtil::LineSegmentIntersector::Intersection result: intersector->getIntersections()) {
  53. if (std::find(result.nodePath.begin(), result.nodePath.end(), _axesNode) != result.nodePath.end()) {
  54. moveTo(result.localIntersectionPoint);
  55. rotateToNormalVector(result.localIntersectionNormal);
  56. _storeHandler->addTrackingPoint(result.localIntersectionPoint, result.localIntersectionNormal);
  57. _openScadRenderer->render(_storeHandler->getPoints());
  58. _threeMFWriter->writeTrackPoints(_storeHandler->getPoints(), "/tmp/export.3mf");
  59. break;
  60. }
  61. }
  62. }
  63. }
  64. }
  65. if (ea.getEventType() == osgGA::GUIEventAdapter::MOVE && isSelection) {
  66. osgViewer::View* viewer = dynamic_cast<osgViewer::View*>(&aa);
  67. if (viewer) {
  68. osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, ea.getX(), ea.getY());
  69. osgUtil::IntersectionVisitor iv(intersector.get());
  70. iv.setTraversalMask(~0x1);
  71. viewer->getCamera()->accept(iv);
  72. if (intersector->containsIntersections()) {
  73. for (const osgUtil::LineSegmentIntersector::Intersection result: intersector->getIntersections()) {
  74. if (std::find(result.nodePath.begin(), result.nodePath.end(), _axesNode) != result.nodePath.end()) {
  75. moveTo(result.localIntersectionPoint);
  76. rotateToNormalVector(result.localIntersectionNormal);
  77. setVisibility(true);
  78. break;
  79. }
  80. }
  81. } else {
  82. setVisibility(false);
  83. }
  84. }
  85. }
  86. return false;
  87. }
  88. void PickHandler::moveTo(osg::Vec3f position) {
  89. _selectionTranslateGroup->setMatrix(osg::Matrix::translate(position));
  90. }
  91. void PickHandler::rotateToNormalVector(osg::Vec3f normal) {
  92. _selectionRotateGroup->setMatrix(osg::Matrix::rotate(osg::Vec3f(0.0f, 0.0f, 1.0f), normal));
  93. osg::Vec3f movementVector = normal.operator*(5.0f);
  94. _selectionMoveToEndGroup->setMatrix(osg::Matrix::translate(movementVector));
  95. }
  96. void PickHandler::setVisibility(bool mode) {
  97. _selectionSwitch->setValue(0, mode);
  98. }