Browse Source

Render trackpoints

Johannes Kreutz 2 years ago
parent
commit
756d01f809

+ 1 - 0
trackpoint-app/CMakeLists.txt

@@ -70,6 +70,7 @@ QT_ADD_EXECUTABLE(TrackpointApp
   src/OpenScadRenderer.cpp
   src/StringBasics.cpp
   src/TrackPointRenderer.cpp
+  src/PointShape.cpp
 )
 
 if(NOT BUILD_STATIC_RELEASE)

+ 1 - 0
trackpoint-app/include/EditWidget.hpp

@@ -20,6 +20,7 @@ public:
   void updatePositions(osg::Vec3 point);
   void updateNormals(osg::Vec3 normal);
   void invalidatePositions();
+  ActiveTrackingSystem getSelectedTrackingSystem();
 
 protected:
   virtual void showEvent(QShowEvent* event);

+ 4 - 3
trackpoint-app/include/OSGWidget.hpp

@@ -1,8 +1,5 @@
 #pragma once
 
-// Include modules
-#include "TrackPointRenderer.hpp"
-
 // Include dependencies
 #include <QPoint>
 #include <QOpenGLWidget>
@@ -26,6 +23,7 @@ namespace osgWidget {
 }
 
 class PickHandler; // Forward declaration
+class TrackPointRenderer; // Forward declaration
 
 class OSGWidget : public QOpenGLWidget {
   Q_OBJECT
@@ -37,6 +35,7 @@ public:
   void renderBaseMesh(const osg::ref_ptr<osg::Vec3Array> vertices, const osg::ref_ptr<osg::Vec3Array> normals);
   osg::ref_ptr<osg::Geode> getMesh();
   PickHandler* getPicker();
+  TrackPointRenderer* getPointRenderer();
 
 protected:
   virtual void paintEvent(QPaintEvent* paintEvent);
@@ -59,11 +58,13 @@ private:
 
   osgGA::EventQueue* getEventQueue() const;
   PickHandler* _picker;
+  TrackPointRenderer* _pointRenderer;
 
   osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> graphicsWindow_;
   osg::ref_ptr<osgWidget::Viewer> _viewer;
   osgViewer::View* _view;
   osg::ref_ptr<osg::Group> _root;
+  osg::ref_ptr<osg::Group> _pointRoot;
   osg::ref_ptr<osg::Geode> _coordinateAxes;
   osg::ref_ptr<osg::Geode> _mesh;
 

+ 4 - 1
trackpoint-app/include/OptiTrackPoint.hpp

@@ -1,13 +1,16 @@
 #pragma once
 
+// Include modules
 #include "defaults.hpp"
 #include "TrackPoint.hpp"
+#include "TrackSystemSettingsStructs.hpp"
 
-class OptiTrackPoint: TrackPoint {
+class OptiTrackPoint: public TrackPoint {
 public:
   OptiTrackPoint(const osg::Vec3 point, const osg::Vec3 normal, const osg::Vec3 normalModifier, const double length = OPTITRACK_DEFAULT_LENGTH, const double radius = OPTITRACK_DEFAULT_RADIUS);
   double getLength();
   double getRadius();
+  OptiTrackSettings getOptiTrackSettings();
 
 private:
   double _length;

+ 1 - 0
trackpoint-app/include/PickHandler.hpp

@@ -3,6 +3,7 @@
 // Include modules
 #include "MainWindow.hpp"
 #include "OSGWidget.hpp"
+#include "PointShape.hpp"
 
 // Include dependencies
 #include <osgGA/GUIEventHandler>

+ 36 - 0
trackpoint-app/include/PointShape.hpp

@@ -0,0 +1,36 @@
+#pragma once
+
+// Include modules
+#include "TrackSystemSettingsStructs.hpp"
+#include "enums.hpp"
+
+// Include dependencies
+#include <osg/Vec3>
+#include <osg/Group>
+#include <osg/MatrixTransform>
+#include <osg/ShapeDrawable>
+#include <osg/Switch>
+#include <osg/Geode>
+
+class PointShape {
+public:
+  PointShape(const osg::ref_ptr<osg::Group> renderRoot, const ActiveTrackingSystem activeTrackingSystem, osg::Vec3f point, osg::Vec3f normal, osg::Vec3f normalModifier);
+  ~PointShape();
+  void moveTo(osg::Vec3f position);
+  void setNormalModifier(osg::Vec3f normalModifier);
+  void rotateToNormalVector(osg::Vec3f normal);
+  void setVisibility(bool mode);
+  void setColor(osg::Vec4 color);
+  void setupOptiTrack(OptiTrackSettings optiTrackSettings);
+
+private:
+  osg::ref_ptr<osg::Switch> _selectionSwitch;
+  osg::ref_ptr<osg::MatrixTransform> _selectionTranslateGroup;
+  osg::ref_ptr<osg::MatrixTransform> _selectionRotateGroup;
+  osg::ref_ptr<osg::MatrixTransform> _selectionMoveToEndGroup;
+  osg::ref_ptr<osg::Group> _renderRoot;
+  osg::ref_ptr<osg::ShapeDrawable> _shape;
+  osg::Vec3f _normalModifier;
+  double _optiTrackSteamVRLength;
+  ActiveTrackingSystem _activeTrackingSystem;
+};

+ 1 - 21
trackpoint-app/include/ProjectStore.hpp

@@ -3,31 +3,11 @@
 // Include modules
 #include "lib3mf_implicit.hpp"
 #include "OptiTrackPoint.hpp"
+#include "TrackSystemSettingsStructs.hpp"
 
 // Include dependencies
 #include <string>
 
-typedef struct {
-  bool OptiTrack;
-  bool EMFTrack;
-  bool SteamVRTrack;
-} ExportSettings;
-
-typedef struct {
-  double length;
-  double radius;
-} OptiTrackSettings;
-
-typedef struct {
-  double width;
-  double height;
-  double depth;
-} EMFTrackSettings;
-
-typedef struct {
-  double length;
-} SteamVRTrackSettings;
-
 class ProjectStore {
 public:
   // Create an empty project

+ 5 - 1
trackpoint-app/include/TrackPointRenderer.hpp

@@ -2,16 +2,20 @@
 
 // Include modules
 #include "enums.hpp"
+#include "OSGWidget.hpp"
+#include "PointShape.hpp"
 
 // Include dependencies
 #include <osg/Group>
 
 class TrackPointRenderer {
 public:
-  TrackPointRenderer(osg::ref_ptr<osg::Group> renderRoot);
+  TrackPointRenderer(OSGWidget* osgWidget, osg::ref_ptr<osg::Group> renderRoot);
   ~TrackPointRenderer();
   void render(ActiveTrackingSystem activeTrackingSystem);
 
 private:
+  OSGWidget* _osgWidget;
   osg::ref_ptr<osg::Group> _renderRoot;
+  std::vector<PointShape*> _shapes;
 };

+ 22 - 0
trackpoint-app/include/TrackSystemSettingsStructs.hpp

@@ -0,0 +1,22 @@
+#pragma once
+
+typedef struct {
+  bool OptiTrack;
+  bool EMFTrack;
+  bool SteamVRTrack;
+} ExportSettings;
+
+typedef struct {
+  double length;
+  double radius;
+} OptiTrackSettings;
+
+typedef struct {
+  double width;
+  double height;
+  double depth;
+} EMFTrackSettings;
+
+typedef struct {
+  double length;
+} SteamVRTrackSettings;

+ 1 - 0
trackpoint-app/include/enums.hpp

@@ -9,6 +9,7 @@ enum ActiveTrackingSystem {
   OptiTrack,
   EMFTrack,
   SteamVRTrack,
+  ActionPoints,
 };
 
 enum Tool {

+ 17 - 0
trackpoint-app/src/EditWidget.cpp

@@ -49,6 +49,23 @@ void EditWidget::invalidatePositions() {
   ui->normalZ->setText("-");
 }
 
+ActiveTrackingSystem EditWidget::getSelectedTrackingSystem() {
+  switch(ui->tabWidget->currentIndex()) {
+    case 0: {
+      return OptiTrack;
+    }
+    case 1: {
+      return EMFTrack;
+    }
+    case 2: {
+      return SteamVRTrack;
+    }
+    default: {
+      return ActionPoints;
+    }
+  }
+}
+
 void EditWidget::showEvent(QShowEvent* event) {
   QWidget::showEvent(event);
   resetOptiTrackSettings();

+ 9 - 0
trackpoint-app/src/OSGWidget.cpp

@@ -3,6 +3,7 @@
 
 // Include modules
 #include "PickHandler.hpp"
+#include "TrackPointRenderer.hpp"
 
 // Include dependencies
 #include <osgViewer/Viewer>
@@ -119,6 +120,10 @@ OSGWidget::OSGWidget(QWidget* parent): QOpenGLWidget(parent),
   // mouse button has been pressed. We require this in order to let the
   // graphics window switch viewports properly.
   this->setMouseTracking(true);
+
+  _pointRoot = new osg::Group;
+  _root->addChild(_pointRoot.get());
+  _pointRenderer = new TrackPointRenderer(this, _pointRoot);
 }
 
 OSGWidget::~OSGWidget() {
@@ -149,6 +154,10 @@ PickHandler* OSGWidget::getPicker() {
   return _picker;
 }
 
+TrackPointRenderer* OSGWidget::getPointRenderer() {
+  return _pointRenderer;
+}
+
 void OSGWidget::paintEvent(QPaintEvent*) {
   this->makeCurrent();
 

+ 5 - 1
trackpoint-app/src/OptiTrackPoint.cpp

@@ -5,7 +5,7 @@ OptiTrackPoint::OptiTrackPoint(const osg::Vec3 point, const osg::Vec3 normal, co
   _length = length;
   _radius = radius;
 
-  osg::Vec3 shift = normal.operator*(10.0f);
+  osg::Vec3 shift = normal.operator*(length);
   _trackOrigin = shift.operator+(point);
 }
 
@@ -16,3 +16,7 @@ double OptiTrackPoint::getLength() {
 double OptiTrackPoint::getRadius() {
   return _radius;
 }
+
+OptiTrackSettings OptiTrackPoint::getOptiTrackSettings() {
+  return OptiTrackSettings {_length, _radius};
+}

+ 4 - 0
trackpoint-app/src/PickHandler.cpp

@@ -1,6 +1,9 @@
 // Include own headers
 #include "PickHandler.hpp"
 
+// Include modules
+#include "TrackPointRenderer.hpp"
+
 // Include dependencies
 #include <osg/io_utils>
 
@@ -171,6 +174,7 @@ void PickHandler::addPoint(osg::Vec3 point, osg::Vec3 normal) {
   switch(_activeTrackingSystem) {
     case OptiTrack: {
       MainWindow::getInstance()->getStore()->addOptiTrackPoint(point, normal);
+      _osgWidget->getPointRenderer()->render(MainWindow::getInstance()->getEditWiget()->getSelectedTrackingSystem());
       break;
     }
     case EMFTrack: {

+ 68 - 0
trackpoint-app/src/PointShape.cpp

@@ -0,0 +1,68 @@
+// Include own headers
+#include "PointShape.hpp"
+
+// Include modules
+#include "OSGWidget.hpp"
+
+PointShape::PointShape(const osg::ref_ptr<osg::Group> renderRoot, const ActiveTrackingSystem activeTrackingSystem, osg::Vec3f point, osg::Vec3f normal, osg::Vec3f normalModifier) {
+  _renderRoot = renderRoot;
+  _activeTrackingSystem = activeTrackingSystem;
+
+  _selectionRotateGroup = new osg::MatrixTransform;
+
+  _selectionMoveToEndGroup = new osg::MatrixTransform;
+  _selectionMoveToEndGroup->addChild(_selectionRotateGroup.get());
+
+  _selectionTranslateGroup = new osg::MatrixTransform;
+  _selectionTranslateGroup->addChild(_selectionMoveToEndGroup.get());
+
+  _selectionSwitch = new osg::Switch;
+  _selectionSwitch->addChild(_selectionTranslateGroup.get());
+
+  _renderRoot->addChild(_selectionSwitch.get());
+
+  moveTo(point);
+  setNormalModifier(normalModifier);
+  rotateToNormalVector(normal);
+}
+
+PointShape::~PointShape() {
+  _renderRoot->removeChild(_selectionSwitch.get());
+}
+
+void PointShape::moveTo(osg::Vec3f position) {
+  _selectionTranslateGroup->setMatrix(osg::Matrix::translate(position));
+}
+
+void PointShape::setNormalModifier(osg::Vec3f normalModifier) {
+  _normalModifier = normalModifier;
+}
+
+void PointShape::rotateToNormalVector(osg::Vec3f normal) {
+  normal = normal.operator+(_normalModifier);
+  normal.normalize();
+  _selectionRotateGroup->setMatrix(osg::Matrix::rotate(osg::Vec3f(0.0f, 0.0f, 1.0f), normal));
+  osg::Vec3f movementVector = normal.operator*(_optiTrackSteamVRLength / 2);
+  _selectionMoveToEndGroup->setMatrix(osg::Matrix::translate(movementVector));
+}
+
+void PointShape::setVisibility(bool mode) {
+  _selectionSwitch->setValue(0, mode);
+}
+
+void PointShape::setColor(osg::Vec4 color) {
+  _shape->setColor(color);
+}
+
+void PointShape::setupOptiTrack(OptiTrackSettings optiTrackSettings) {
+  if (_activeTrackingSystem == OptiTrack) {
+    _optiTrackSteamVRLength = optiTrackSettings.length;
+    osg::ref_ptr<osg::Geode> geode = new osg::Geode;
+    _shape = new osg::ShapeDrawable();
+    _shape->setShape(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, 0.0f), optiTrackSettings.radius, optiTrackSettings.length));
+    _shape->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.2f));
+    geode->addDrawable(_shape.get());
+    OSGWidget::fixMaterialState(geode);
+    _selectionRotateGroup->addChild(geode.get());
+  }
+}

+ 10 - 1
trackpoint-app/src/TrackPointRenderer.cpp

@@ -8,7 +8,8 @@
 // Include dependencies
 
 
-TrackPointRenderer::TrackPointRenderer(osg::ref_ptr<osg::Group> renderRoot) {
+TrackPointRenderer::TrackPointRenderer(OSGWidget* osgWidget, osg::ref_ptr<osg::Group> renderRoot) {
+  _osgWidget = osgWidget;
   _renderRoot = renderRoot;
 }
 
@@ -19,6 +20,14 @@ void TrackPointRenderer::render(ActiveTrackingSystem activeTrackingSystem) {
   switch(activeTrackingSystem) {
     case OptiTrack: {
       std::vector<OptiTrackPoint*> points = MainWindow::getInstance()->getStore()->getOptiTrackPoints();
+      _shapes.clear();
+      for (OptiTrackPoint* point: points) {
+        PointShape* newShape = new PointShape(_renderRoot, activeTrackingSystem, point->getTranslation(), point->getNormal(), point->getNormalModifier());
+        newShape->setupOptiTrack(point->getOptiTrackSettings());
+        newShape->setColor(osg::Vec4(0.0f, 1.0f, 0.0f, 0.2f));
+        newShape->rotateToNormalVector(point->getNormal());
+        _shapes.push_back(newShape);
+      }
       break;
     }
     case EMFTrack: {