PointShape.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // Include own headers
  2. #include "PointShape.hpp"
  3. // Include modules
  4. #include "OSGWidget.hpp"
  5. #include "defaults.hpp"
  6. #include "resources.hpp"
  7. #include "MeshTools.hpp"
  8. // Include dependencies
  9. #include <osgUtil/MeshOptimizers>
  10. #include "lib3mf_implicit.hpp"
  11. PointShape::PointShape(const osg::ref_ptr<osg::Group> renderRoot, const ActiveTrackingSystem activeTrackingSystem, osg::Vec3f point, osg::Vec3f normal, osg::Vec3f normalModifier) {
  12. _renderRoot = renderRoot;
  13. _activeTrackingSystem = activeTrackingSystem;
  14. _screwMove = new osg::MatrixTransform;
  15. _selectionRotateGroup = new osg::MatrixTransform;
  16. _selectionRotateGroup->addChild(_screwMove.get());
  17. _selectionMoveToEndGroup = new osg::MatrixTransform;
  18. _selectionMoveToEndGroup->addChild(_selectionRotateGroup.get());
  19. _selectionTranslateGroup = new osg::MatrixTransform;
  20. _selectionTranslateGroup->addChild(_selectionMoveToEndGroup.get());
  21. _selectionSwitch = new osg::Switch;
  22. _selectionSwitch->addChild(_selectionTranslateGroup.get());
  23. _renderRoot->addChild(_selectionSwitch.get());
  24. moveTo(point);
  25. setNormalModifier(normalModifier);
  26. rotateToNormalVector(normal);
  27. }
  28. PointShape::~PointShape() {
  29. _renderRoot->removeChild(_selectionSwitch.get());
  30. }
  31. void PointShape::moveTo(osg::Vec3f position) {
  32. _selectionTranslateGroup->setMatrix(osg::Matrix::translate(position));
  33. }
  34. void PointShape::setNormalModifier(osg::Vec3f normalModifier) {
  35. _normalModifier = normalModifier;
  36. }
  37. void PointShape::rotateToNormalVector(osg::Vec3f normal) {
  38. normal = normal.operator+(_normalModifier);
  39. normal.normalize();
  40. _selectionRotateGroup->setMatrix(osg::Matrix::rotate(osg::Vec3f(0.0f, 0.0f, 1.0f), normal));
  41. if (_activeTrackingSystem == OptiTrack || _activeTrackingSystem == SteamVRTrack) {
  42. osg::Vec3f movementVector = normal.operator*(_optiTrackSteamVRLength / 2);
  43. _selectionMoveToEndGroup->setMatrix(osg::Matrix::translate(movementVector));
  44. }
  45. if (_activeTrackingSystem == SteamVRTrack) {
  46. osg::Vec3f movementVector = osg::Vec3f(0.0f, 0.0f, 1.0f).operator*(_optiTrackSteamVRLength / 2);
  47. _screwMove->setMatrix(osg::Matrix::translate(movementVector));
  48. }
  49. }
  50. void PointShape::setVisibility(bool mode) {
  51. _selectionSwitch->setValue(0, mode);
  52. }
  53. void PointShape::setColor(osg::Vec4 color) {
  54. _shape->setColor(color);
  55. if (_threadMesh) {
  56. _threadMesh->setColor(color);
  57. }
  58. }
  59. void PointShape::setupOptiTrack(OptiTrackSettings optiTrackSettings) {
  60. if (_activeTrackingSystem == OptiTrack) {
  61. _optiTrackSteamVRLength = optiTrackSettings.length;
  62. _geode = new osg::Geode;
  63. _shape = new osg::ShapeDrawable();
  64. _shape->setShape(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, 0.0f), optiTrackSettings.radius, optiTrackSettings.length));
  65. _shape->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.2f));
  66. _geode->addDrawable(_shape.get());
  67. OSGWidget::fixMaterialState(_geode);
  68. _selectionRotateGroup->addChild(_geode.get());
  69. }
  70. }
  71. void PointShape::setupSteamVRTrack(SteamVRTrackSettings steamVrTrackSettings) {
  72. if (_activeTrackingSystem == SteamVRTrack) {
  73. _optiTrackSteamVRLength = steamVrTrackSettings.length;
  74. _geode = new osg::Geode;
  75. _shape = new osg::ShapeDrawable();
  76. _shape->setShape(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, 0.0f), STEAMVR_CONSTANT_RADIUS, steamVrTrackSettings.length));
  77. _shape->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.2f));
  78. _geode->addDrawable(_shape.get());
  79. std::vector<Lib3MF::sPosition> verticesBuffer;
  80. std::vector<Lib3MF::sTriangle> triangleBuffer;
  81. for (unsigned int i = 0; i < sizeof(steamvrthread_VERTICES) / sizeof(float); i += 3) {
  82. Lib3MF::sPosition vertex = {steamvrthread_VERTICES[i], steamvrthread_VERTICES[i + 1], steamvrthread_VERTICES[i + 2]};
  83. verticesBuffer.push_back(vertex);
  84. }
  85. for (unsigned int i = 0; i < sizeof(steamvrthread_TRIANGLES) / sizeof(unsigned int); i += 3) {
  86. Lib3MF::sTriangle triangle = {steamvrthread_TRIANGLES[i], steamvrthread_TRIANGLES[i + 1], steamvrthread_TRIANGLES[i + 2]};
  87. triangleBuffer.push_back(triangle);
  88. }
  89. // Create osg style arrays
  90. osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
  91. osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
  92. MeshTools::calculateNormals(verticesBuffer, triangleBuffer, vertices, normals);
  93. osg::ref_ptr<osg::Geode> thread = new osg::Geode;
  94. _threadMesh = new osg::Geometry;
  95. _threadMesh->setVertexArray(vertices.get());
  96. _threadMesh->setNormalArray(normals.get(), osg::Array::BIND_PER_VERTEX);
  97. _threadMesh->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, 0, vertices->getNumElements()));
  98. _threadMesh->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.2f));
  99. osgUtil::optimizeMesh(_threadMesh.get());
  100. thread->addDrawable(_threadMesh.get());
  101. OSGWidget::fixMaterialState(thread);
  102. _screwMove->addChild(thread.get());
  103. OSGWidget::fixMaterialState(_geode);
  104. _selectionRotateGroup->addChild(_geode.get());
  105. }
  106. }
  107. void PointShape::setupActionPoints() {
  108. if (_activeTrackingSystem == ActionPoints) {
  109. _geode = new osg::Geode;
  110. _shape = new osg::ShapeDrawable();
  111. _shape->setShape(new osg::Sphere(osg::Vec3(0.0f, 0.0f, 0.0f), 0.5f));
  112. _shape->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.2f));
  113. _geode->addDrawable(_shape.get());
  114. OSGWidget::fixMaterialState(_geode);
  115. _selectionRotateGroup->addChild(_geode.get());
  116. }
  117. }
  118. osg::ref_ptr<osg::Geode> PointShape::getMesh() {
  119. return _geode;
  120. }