Johannes Kreutz 3 лет назад
Родитель
Сommit
8622621477

+ 0 - 2
trackpoint-app/CMakeLists.txt

@@ -65,10 +65,8 @@ QT_ADD_EXECUTABLE(TrackpointApp
   src/OSGWidget.cpp
   src/ProjectStore.cpp
   src/PickHandler.cpp
-  src/StoreHandler.cpp
   src/TrackPoint.cpp
   src/OptiTrackPoint.cpp
-  src/ThreeMFWriter.cpp
   src/OpenScadRenderer.cpp
   src/StringBasics.cpp
 )

+ 227 - 182
trackpoint-app/gui/EditWidget.ui

@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>508</width>
-    <height>980</height>
+    <height>915</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -78,6 +78,214 @@
      </layout>
     </widget>
    </item>
+   <item>
+    <widget class="QGroupBox" name="positions">
+     <property name="font">
+      <font>
+       <pointsize>13</pointsize>
+      </font>
+     </property>
+     <property name="title">
+      <string>POSITIONS</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="0">
+       <widget class="QLabel" name="anchorLabel">
+        <property name="text">
+         <string>Anchor point</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="anchorYLabel">
+        <property name="text">
+         <string>Y:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="2">
+       <widget class="QLabel" name="normalLabel">
+        <property name="text">
+         <string>Normal vector</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="anchorXLabel">
+        <property name="text">
+         <string>X:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QLabel" name="anchorZLabel">
+        <property name="text">
+         <string>Z:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QLabel" name="anchorX">
+        <property name="text">
+         <string>-</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QLabel" name="anchorY">
+        <property name="text">
+         <string>-</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="1">
+       <widget class="QLabel" name="anchorZ">
+        <property name="text">
+         <string>-</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="2">
+       <widget class="QLabel" name="normalXLabel">
+        <property name="text">
+         <string>X:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="3">
+       <widget class="QLabel" name="normalX">
+        <property name="text">
+         <string>-</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="2">
+       <widget class="QLabel" name="normalYLabel">
+        <property name="text">
+         <string>Y:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="2">
+       <widget class="QLabel" name="normalZLabel">
+        <property name="text">
+         <string>Z:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="3">
+       <widget class="QLabel" name="normalY">
+        <property name="text">
+         <string>-</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="3">
+       <widget class="QLabel" name="normalZ">
+        <property name="text">
+         <string>-</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="modifier">
+     <property name="font">
+      <font>
+       <pointsize>13</pointsize>
+      </font>
+     </property>
+     <property name="title">
+      <string>MODIFIER</string>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_6">
+      <item>
+       <layout class="QGridLayout" name="gridLayout_3">
+        <property name="spacing">
+         <number>-1</number>
+        </property>
+        <item row="0" column="0">
+         <widget class="QLabel" name="normalModLabel">
+          <property name="text">
+           <string>Normal vector</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="0">
+         <widget class="QLabel" name="normalModLabelY">
+          <property name="text">
+           <string>Y:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="1">
+         <widget class="QDoubleSpinBox" name="normalModX">
+          <property name="maximum">
+           <double>1.000000000000000</double>
+          </property>
+          <property name="singleStep">
+           <double>0.010000000000000</double>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QLabel" name="normalModLabelX">
+          <property name="text">
+           <string>X:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="0">
+         <widget class="QLabel" name="normalModLabelZ">
+          <property name="text">
+           <string>Z:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="1">
+         <widget class="QDoubleSpinBox" name="normalModY">
+          <property name="maximum">
+           <double>1.000000000000000</double>
+          </property>
+          <property name="singleStep">
+           <double>0.010000000000000</double>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="1">
+         <widget class="QDoubleSpinBox" name="normalModZ">
+          <property name="maximum">
+           <double>1.000000000000000</double>
+          </property>
+          <property name="singleStep">
+           <double>0.010000000000000</double>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+      <item>
+       <widget class="QPushButton" name="modifierReset">
+        <property name="text">
+         <string>Reset</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QPushButton" name="deleteTrackPoint">
+     <property name="enabled">
+      <bool>false</bool>
+     </property>
+     <property name="text">
+      <string>Delete point</string>
+     </property>
+    </widget>
+   </item>
    <item>
     <spacer name="spacer">
      <property name="orientation">
@@ -97,7 +305,7 @@
    <item>
     <widget class="QTabWidget" name="tabWidget">
      <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+      <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
@@ -137,7 +345,14 @@
           <item>
            <layout class="QGridLayout" name="gridLayout">
             <item row="0" column="1">
-             <widget class="QDoubleSpinBox" name="optiTrackLength"/>
+             <widget class="QDoubleSpinBox" name="optiTrackLength">
+              <property name="minimum">
+               <double>5.000000000000000</double>
+              </property>
+              <property name="maximum">
+               <double>100.000000000000000</double>
+              </property>
+             </widget>
             </item>
             <item row="1" column="0">
              <widget class="QLabel" name="optiTrackRadiusLabel">
@@ -147,7 +362,14 @@
              </widget>
             </item>
             <item row="1" column="1">
-             <widget class="QDoubleSpinBox" name="optiTrackRadius"/>
+             <widget class="QDoubleSpinBox" name="optiTrackRadius">
+              <property name="minimum">
+               <double>1.000000000000000</double>
+              </property>
+              <property name="maximum">
+               <double>10.000000000000000</double>
+              </property>
+             </widget>
             </item>
             <item row="0" column="0">
              <widget class="QLabel" name="optiTrackLengthLabel">
@@ -159,7 +381,7 @@
            </layout>
           </item>
           <item>
-           <widget class="QPushButton" name="pushButton">
+           <widget class="QPushButton" name="optiTrackLoadDefaults">
             <property name="text">
              <string>Load defaults</string>
             </property>
@@ -168,183 +390,6 @@
          </layout>
         </widget>
        </item>
-       <item>
-        <widget class="QGroupBox" name="optiTrackPositions">
-         <property name="font">
-          <font>
-           <pointsize>13</pointsize>
-          </font>
-         </property>
-         <property name="title">
-          <string>POSITIONS</string>
-         </property>
-         <layout class="QGridLayout" name="gridLayout_2">
-          <item row="4" column="0">
-           <widget class="QLabel" name="optiTrackNormalLabel">
-            <property name="text">
-             <string>Normal vector</string>
-            </property>
-           </widget>
-          </item>
-          <item row="1" column="0">
-           <widget class="QLabel" name="optiTrackAnchorXLabel">
-            <property name="text">
-             <string>X:</string>
-            </property>
-           </widget>
-          </item>
-          <item row="3" column="0">
-           <widget class="QLabel" name="optiTrackAnchorZLabel">
-            <property name="text">
-             <string>Z:</string>
-            </property>
-           </widget>
-          </item>
-          <item row="5" column="0">
-           <widget class="QLabel" name="optiTrackNormalXLabel">
-            <property name="text">
-             <string>X:</string>
-            </property>
-           </widget>
-          </item>
-          <item row="6" column="0">
-           <widget class="QLabel" name="optiTrackNormalYLabel">
-            <property name="text">
-             <string>Y:</string>
-            </property>
-           </widget>
-          </item>
-          <item row="0" column="0">
-           <widget class="QLabel" name="optiTrackAnchorLabel">
-            <property name="text">
-             <string>Anchor point</string>
-            </property>
-           </widget>
-          </item>
-          <item row="2" column="0">
-           <widget class="QLabel" name="optiTrackAnchorYLabel">
-            <property name="text">
-             <string>Y:</string>
-            </property>
-           </widget>
-          </item>
-          <item row="7" column="0">
-           <widget class="QLabel" name="optiTrackNormalZLabel">
-            <property name="text">
-             <string>Z:</string>
-            </property>
-           </widget>
-          </item>
-          <item row="1" column="1">
-           <widget class="QLabel" name="optiTrackAnchorX">
-            <property name="text">
-             <string>0,00</string>
-            </property>
-           </widget>
-          </item>
-          <item row="2" column="1">
-           <widget class="QLabel" name="optiTrackAnchorY">
-            <property name="text">
-             <string>0,00</string>
-            </property>
-           </widget>
-          </item>
-          <item row="3" column="1">
-           <widget class="QLabel" name="optiTrackAnchorZ">
-            <property name="text">
-             <string>0,00</string>
-            </property>
-           </widget>
-          </item>
-          <item row="5" column="1">
-           <widget class="QLabel" name="optiTrackNormalX">
-            <property name="text">
-             <string>0,00</string>
-            </property>
-           </widget>
-          </item>
-          <item row="6" column="1">
-           <widget class="QLabel" name="optiTrackNormalY">
-            <property name="text">
-             <string>0,00</string>
-            </property>
-           </widget>
-          </item>
-          <item row="7" column="1">
-           <widget class="QLabel" name="optiTrackNormalZ">
-            <property name="text">
-             <string>0,00</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="optiTrackModifier">
-         <property name="font">
-          <font>
-           <pointsize>13</pointsize>
-          </font>
-         </property>
-         <property name="title">
-          <string>MODIFIER</string>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_6">
-          <item>
-           <layout class="QGridLayout" name="gridLayout_3">
-            <property name="spacing">
-             <number>-1</number>
-            </property>
-            <item row="0" column="0">
-             <widget class="QLabel" name="optiTrackNormalModLabel">
-              <property name="text">
-               <string>Normal vector</string>
-              </property>
-             </widget>
-            </item>
-            <item row="2" column="0">
-             <widget class="QLabel" name="optiTrackNormalModLabelY">
-              <property name="text">
-               <string>Y:</string>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="1">
-             <widget class="QDoubleSpinBox" name="optiTrackNormalModX"/>
-            </item>
-            <item row="1" column="0">
-             <widget class="QLabel" name="optiTrackNormalModLabelX">
-              <property name="text">
-               <string>X:</string>
-              </property>
-             </widget>
-            </item>
-            <item row="3" column="0">
-             <widget class="QLabel" name="optiTrackNormalModLabelZ">
-              <property name="text">
-               <string>Z:</string>
-              </property>
-             </widget>
-            </item>
-            <item row="2" column="1">
-             <widget class="QDoubleSpinBox" name="optiTrackNormalModY"/>
-            </item>
-            <item row="3" column="1">
-             <widget class="QDoubleSpinBox" name="optiTrackNormalModZ"/>
-            </item>
-           </layout>
-          </item>
-          <item>
-           <widget class="QPushButton" name="optiTrackModifierReset">
-            <property name="text">
-             <string>Reset</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
        <item>
         <spacer name="verticalSpacer">
          <property name="orientation">

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

@@ -1,6 +1,11 @@
 #pragma once
 
+// Include modules
+#include "enums.hpp"
+
+// Include dependencies
 #include <QWidget>
+#include <osg/Vec3>
 
 QT_BEGIN_NAMESPACE
 namespace Ui { class EditWidget; }
@@ -12,6 +17,19 @@ class EditWidget: public QWidget {
 public:
   EditWidget(QWidget* parent = nullptr);
   ~EditWidget();
+  void updatePositions(osg::Vec3 point);
+  void updateNormals(osg::Vec3 normal);
+  void invalidatePositions();
+
+protected:
+  virtual void showEvent(QShowEvent* event);
+
+private slots:
+  void selectTool(Tool tool);
+  void updateNormalModifier();
+  void resetNormalModifier();
+  void updateOptiTrackSettings();
+  void resetOptiTrackSettings();
 
 private:
   Ui::EditWidget* ui;

+ 2 - 5
trackpoint-app/include/MainWindow.hpp

@@ -4,6 +4,7 @@
 #include "NoMeshWidget.hpp"
 #include "EditWidget.hpp"
 #include "ProjectStore.hpp"
+#include "enums.hpp"
 
 #include <QMainWindow>
 
@@ -11,11 +12,6 @@ QT_BEGIN_NAMESPACE
 namespace Ui { class MainWindow; }
 QT_END_NAMESPACE
 
-enum GuiView {
-  NoMesh,
-  Edit,
-};
-
 class MainWindow: public QMainWindow {
   Q_OBJECT
 
@@ -26,6 +22,7 @@ public:
   void renderView(GuiView view);
   OSGWidget* getOsgWidget();
   ProjectStore* getStore();
+  EditWidget* getEditWiget();
 
 private:
   void openFile();

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

@@ -15,6 +15,7 @@ public:
 
 private slots:
   void loadMeshFile();
+  void loadProjectFile();
 
 private:
   Ui::NoMeshWidget* ui;

+ 8 - 10
trackpoint-app/include/OSGWidget.hpp

@@ -1,9 +1,6 @@
 #pragma once
 
-#include "StoreHandler.hpp"
-#include "OpenScadRenderer.hpp"
-#include "ThreeMFWriter.hpp"
-
+// Include dependencies
 #include <QPoint>
 #include <QOpenGLWidget>
 
@@ -25,14 +22,18 @@ namespace osgWidget {
   };
 }
 
+class PickHandler; // Forward declaration
+
 class OSGWidget : public QOpenGLWidget {
   Q_OBJECT
 
 public:
+  static void fixMaterialState(osg::ref_ptr<osg::Node> node);
   OSGWidget(QWidget* parent = nullptr);
   virtual ~OSGWidget();
   void renderBaseMesh(const osg::ref_ptr<osg::Vec3Array> vertices, const osg::ref_ptr<osg::Vec3Array> normals);
-  static void fixMaterialState(osg::ref_ptr<osg::Node> node);
+  osg::ref_ptr<osg::Geode> getMesh();
+  PickHandler* getPicker();
 
 protected:
   virtual void paintEvent(QPaintEvent* paintEvent);
@@ -54,21 +55,18 @@ private:
   virtual void onResize(int width, int height);
 
   osgGA::EventQueue* getEventQueue() const;
+  PickHandler* _picker;
 
   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::Geode> _coordinateAxes;
-  osg::ref_ptr<osg::Geode> _axesNode;
+  osg::ref_ptr<osg::Geode> _mesh;
 
   QPoint selectionStart_;
   QPoint selectionEnd_;
 
   bool selectionActive_;
   bool selectionFinished_;
-
-  StoreHandler* _storeHandler;
-  OpenScadRenderer* _openScadRenderer;
-  ThreeMFWriter* _threeMFWriter;
 };

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

@@ -5,7 +5,7 @@
 
 class OptiTrackPoint: TrackPoint {
 public:
-  OptiTrackPoint(const osg::Vec3 point, const osg::Vec3 normal, const double length = OPTITRACK_DEFAULT_LENGTH, const double radius = OPTITRACK_DEFAULT_RADIUS);
+  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();
 

+ 22 - 16
trackpoint-app/include/PickHandler.hpp

@@ -1,30 +1,36 @@
 #pragma once
 
-#include "StoreHandler.hpp"
-#include "OpenScadRenderer.hpp"
-#include "ThreeMFWriter.hpp"
+// Include modules
+#include "MainWindow.hpp"
+#include "OSGWidget.hpp"
 
+// Include dependencies
 #include <osgGA/GUIEventHandler>
 
 class PickHandler: public osgGA::GUIEventHandler {
 public:
-  PickHandler(StoreHandler* storeHandler, OpenScadRenderer* openScadRenderer, ThreeMFWriter* threeMFWriter, osg::ref_ptr<osg::Node> axesNode);
-  osg::Node* getOrCreateSelectionCylinder();
+  PickHandler(OSGWidget* osgWidget, osg::ref_ptr<osg::Group> root);
+  osg::Node* getPickerRoot();
   virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);
-  void moveTo(osg::Vec3f position);
-  void rotateToNormalVector(osg::Vec3f normal);
-  void setVisibility(bool mode);
+  void setTrackingSystem(ActiveTrackingSystem activeTrackingSystem);
+  void setSelection(bool addNewPoints);
+  void updateRenderer();
 
-protected:
+//protected:
+
+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;
-  bool isSelection = true;
-
-private:
-  StoreHandler* _storeHandler;
-  OpenScadRenderer* _openScadRenderer;
-  ThreeMFWriter* _threeMFWriter;
-  osg::ref_ptr<osg::Node> _axesNode;
+  ActiveTrackingSystem _activeTrackingSystem = OptiTrack;
+  bool _addNewPoints = true;
+  bool _clickStartedOnElement = false;
+  OSGWidget* _osgWidget;
+  double _optiTrackSteamVRLength;
+  void moveTo(osg::Vec3f position);
+  void rotateToNormalVector(osg::Vec3f normal);
+  void removeAllShapes();
+  void setVisibility(bool mode);
+  void addPoint(osg::Vec3 point, osg::Vec3 normal);
 };

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

@@ -1,8 +1,10 @@
 #pragma once
 
+// Include modules
 #include "lib3mf_implicit.hpp"
 #include "OptiTrackPoint.hpp"
 
+// Include dependencies
 #include <string>
 
 typedef struct {
@@ -11,6 +13,21 @@ typedef struct {
   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
@@ -27,13 +44,33 @@ public:
   bool saveProject(std::string projectFile);
   // Export the project
   bool exportProject(std::string path, ExportSettings settings);
+  // NORMAL MODIFIER
+  // Update normal modifier
+  void updateNormalModifier(osg::Vec3 modifier);
+  // Return normal modifier
+  osg::Vec3 getNormalModifier();
+  // OPTITRACK
+  // Get all OptiTrack points
+  std::vector<OptiTrackPoint*> getOptiTrackPoints();
+  // Add an OptiTrack point
+  void addOptiTrackPoint(osg::Vec3 point, osg::Vec3 normal);
+  // Remove an OptiTrack point
+  void removeOptiTrackPoint();
+  // Update actual OptiTrack settings
+  void updateOptiTrackSettings(OptiTrackSettings optiTrackSettings);
+  // Return OptiTrack settings
+  OptiTrackSettings getOptiTrackSettings();
 
 private:
   bool projectLoaded;
   Lib3MF::PWrapper _wrapper;
   Lib3MF::PModel _project;
   std::string _projectFile;
-  std::vector<OptiTrackPoint> _optiTrackPoints;
+  std::vector<OptiTrackPoint*> _optiTrackPoints;
+  OptiTrackSettings _optiTrackSettings = OptiTrackSettings {OPTITRACK_DEFAULT_LENGTH, OPTITRACK_DEFAULT_RADIUS};
+  EMFTrackSettings _emfTrackSettings;
+  SteamVRTrackSettings _steamVrTrackSettings;
+  osg::Vec3 _normalModifier = osg::Vec3(0.0f, 0.0f, 0.0f);
   void load3mfLib();
   void render3MFMesh(const std::vector<Lib3MF::sPosition> verticesBuffer, const std::vector<Lib3MF::sTriangle> triangleBuffer);
   void exportMetaData();

+ 0 - 21
trackpoint-app/include/StoreHandler.hpp

@@ -1,21 +0,0 @@
-#pragma once
-
-#include "TrackPoint.hpp"
-
-#include <osg/ref_ptr>
-#include <osg/Group>
-#include <osg/Vec3>
-#include <vector>
-
-class StoreHandler {
-public:
-  void addTrackingPoint(osg::Vec3 point, osg::Vec3 normal);
-  StoreHandler(osg::ref_ptr<osg::Group> root);
-  std::vector<TrackPoint*> getPoints();
-
-protected:
-  std::vector<TrackPoint*> points;
-
-private:
-  osg::ref_ptr<osg::Group> _root;
-};

+ 4 - 2
trackpoint-app/include/TrackPoint.hpp

@@ -6,11 +6,12 @@
 
 class TrackPoint {
 public:
-  TrackPoint(osg::Vec3 point, osg::Vec3 normal);
-  osg::ref_ptr<osg::MatrixTransform> getUppermostRoot();
+  TrackPoint(const osg::Vec3 point, const osg::Vec3 normal, const osg::Vec3 normalModifier);
   osg::Vec3 getTranslation();
   osg::Vec3 getRotation();
   osg::Vec3 getTrackPoint();
+  osg::Vec3 getNormal();
+  osg::Vec3 getNormalModifier();
 
 protected:
   osg::ref_ptr<osg::MatrixTransform> _translationGroup;
@@ -21,4 +22,5 @@ protected:
 private:
   osg::Vec3 _origin;
   osg::Vec3 _normal;
+  osg::Vec3 _normalModifier;
 };

+ 1 - 1
trackpoint-app/include/defaults.hpp

@@ -1,4 +1,4 @@
 #pragma once
 
 #define OPTITRACK_DEFAULT_LENGTH 10.0
-#define OPTITRACK_DEFAULT_RADIUS 0.5
+#define OPTITRACK_DEFAULT_RADIUS 1.0

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

@@ -0,0 +1,17 @@
+#pragma once
+
+enum GuiView {
+  NoMesh,
+  Edit,
+};
+
+enum ActiveTrackingSystem {
+  OptiTrack,
+  EMFTrack,
+  SteamVRTrack,
+};
+
+enum Tool {
+  InsertionTool,
+  SelectionTool
+};

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

@@ -2,10 +2,100 @@
 #include "EditWidget.hpp"
 #include "../gui/ui_EditWidget.h"
 
+// Include modules
+#include "OSGWidget.hpp"
+#include "PickHandler.hpp"
+
 EditWidget::EditWidget(QWidget* parent): QWidget(parent), ui(new Ui::EditWidget) {
   ui->setupUi(this);
+  ui->insertionToolButton->setCheckable(true);
+  ui->insertionToolButton->setChecked(true);
+  QObject::connect(ui->insertionToolButton, &QToolButton::clicked, this, [=](){ this->selectTool(InsertionTool); });
+  ui->selectionToolButton->setCheckable(true);
+  QObject::connect(ui->selectionToolButton, &QToolButton::clicked, this, [=](){ this->selectTool(SelectionTool); });
+  // Modifiers
+  QObject::connect(ui->normalModX, &QDoubleSpinBox::valueChanged, this, &EditWidget::updateNormalModifier);
+  QObject::connect(ui->normalModY, &QDoubleSpinBox::valueChanged, this, &EditWidget::updateNormalModifier);
+  QObject::connect(ui->normalModZ, &QDoubleSpinBox::valueChanged, this, &EditWidget::updateNormalModifier);
+  QObject::connect(ui->modifierReset, &QPushButton::clicked, this, &EditWidget::resetNormalModifier);
+  // OptiTrack settings
+  QObject::connect(ui->optiTrackLength, &QDoubleSpinBox::valueChanged, this, &EditWidget::updateOptiTrackSettings);
+  QObject::connect(ui->optiTrackRadius, &QDoubleSpinBox::valueChanged, this, &EditWidget::updateOptiTrackSettings);
+  QObject::connect(ui->optiTrackLoadDefaults, &QPushButton::clicked, this, &EditWidget::resetOptiTrackSettings);
 }
 
 EditWidget::~EditWidget() {
   delete ui;
 }
+
+void EditWidget::updatePositions(osg::Vec3 point) {
+  ui->anchorX->setText(QString::number(point.x()));
+  ui->anchorY->setText(QString::number(point.y()));
+  ui->anchorZ->setText(QString::number(point.z()));
+}
+
+void EditWidget::updateNormals(osg::Vec3 normal) {
+  ui->normalX->setText(QString::number(normal.x()));
+  ui->normalY->setText(QString::number(normal.y()));
+  ui->normalZ->setText(QString::number(normal.z()));
+}
+
+void EditWidget::invalidatePositions() {
+  ui->anchorX->setText("-");
+  ui->anchorY->setText("-");
+  ui->anchorZ->setText("-");
+  ui->normalX->setText("-");
+  ui->normalY->setText("-");
+  ui->normalZ->setText("-");
+}
+
+void EditWidget::showEvent(QShowEvent* event) {
+  QWidget::showEvent(event);
+  resetOptiTrackSettings();
+}
+
+void EditWidget::selectTool(Tool tool) {
+  switch(tool) {
+    case InsertionTool: {
+      ui->insertionToolButton->setChecked(true);
+      ui->selectionToolButton->setChecked(false);
+      MainWindow::getInstance()->getOsgWidget()->getPicker()->setSelection(true);
+      break;
+    }
+    case SelectionTool: {
+      ui->insertionToolButton->setChecked(false);
+      ui->selectionToolButton->setChecked(true);
+      MainWindow::getInstance()->getOsgWidget()->getPicker()->setSelection(false);
+      break;
+    }
+  }
+}
+
+void EditWidget::updateNormalModifier() {
+  osg::Vec3 modifier = osg::Vec3(ui->normalModX->value(), ui->normalModY->value(), ui->normalModZ->value());
+  MainWindow::getInstance()->getStore()->updateNormalModifier(modifier);
+  MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
+}
+
+void EditWidget::resetNormalModifier() {
+  osg::Vec3 modifier = osg::Vec3(0.0f, 0.0f, 0.0f);
+  ui->normalModX->setValue(0.0f);
+  ui->normalModY->setValue(0.0f);
+  ui->normalModZ->setValue(0.0f);
+  MainWindow::getInstance()->getStore()->updateNormalModifier(modifier);
+  MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
+}
+
+void EditWidget::updateOptiTrackSettings() {
+  OptiTrackSettings settings = {ui->optiTrackLength->value(), ui->optiTrackRadius->value()};
+  MainWindow::getInstance()->getStore()->updateOptiTrackSettings(settings);
+  MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
+}
+
+void EditWidget::resetOptiTrackSettings() {
+  OptiTrackSettings settings = {OPTITRACK_DEFAULT_LENGTH, OPTITRACK_DEFAULT_RADIUS};
+  ui->optiTrackLength->setValue(OPTITRACK_DEFAULT_LENGTH);
+  ui->optiTrackRadius->setValue(OPTITRACK_DEFAULT_RADIUS);
+  MainWindow::getInstance()->getStore()->updateOptiTrackSettings(settings);
+  MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
+}

+ 9 - 2
trackpoint-app/src/MainWindow.cpp

@@ -19,6 +19,9 @@ MainWindow::MainWindow(QWidget* parent): QMainWindow(parent), ui(new Ui::MainWin
   osgWidget = new OSGWidget(this);
   ui->sceneWidget->layout()->addWidget(osgWidget);
 
+  noMeshWidget = new NoMeshWidget();
+  editWidget = new EditWidget();
+
   // TODO: Add option for opening a project via double click
   projectStore = new ProjectStore();
   renderView(NoMesh);
@@ -37,15 +40,19 @@ ProjectStore* MainWindow::getStore() {
   return projectStore;
 }
 
+EditWidget* MainWindow::getEditWiget() {
+  return editWidget;
+}
+
 void MainWindow::renderView(GuiView view) {
   switch(view) {
     case NoMesh: {
-      noMeshWidget = new NoMeshWidget(this);
+      editWidget->setParent(nullptr);
       ui->controlWidget->layout()->addWidget(noMeshWidget);
       break;
     }
     case Edit: {
-      editWidget = new EditWidget(this);
+      noMeshWidget->setParent(nullptr);
       ui->controlWidget->layout()->addWidget(editWidget);
       break;
     }

+ 7 - 0
trackpoint-app/src/NoMeshWidget.cpp

@@ -11,6 +11,7 @@
 NoMeshWidget::NoMeshWidget(QWidget* parent): QWidget(parent), ui(new Ui::NoMeshWidget) {
   ui->setupUi(this);
   QObject::connect(ui->noMeshButton, &QPushButton::clicked, this, &NoMeshWidget::loadMeshFile);
+  QObject::connect(ui->loadProjectButton, &QPushButton::clicked, this, &NoMeshWidget::loadProjectFile);
 }
 
 NoMeshWidget::~NoMeshWidget() {
@@ -22,3 +23,9 @@ void NoMeshWidget::loadMeshFile() {
   std::string meshFile = fileName.toUtf8().constData();
   MainWindow::getInstance()->getStore()->loadMesh(meshFile);
 }
+
+void NoMeshWidget::loadProjectFile() {
+  QString fileName = QFileDialog::getOpenFileName(this, tr("Open a TrackpointApp Project"), "", tr("TrackpointApp Projects (*.trackproj)"));
+  std::string meshFile = fileName.toUtf8().constData();
+  // TODO: Connect
+}

+ 20 - 12
trackpoint-app/src/OSGWidget.cpp

@@ -1,5 +1,7 @@
 // Include own headers
 #include "OSGWidget.hpp"
+
+// Include modules
 #include "PickHandler.hpp"
 
 // Include dependencies
@@ -91,7 +93,7 @@ OSGWidget::OSGWidget(QWidget* parent): QOpenGLWidget(parent),
 
   _root->addChild(_coordinateAxes);
 
-  _axesNode = new osg::Geode;
+  _mesh = new osg::Geode;
 
   // Attach a manipulator (it's usually done for us when we use viewer.run())
   osg::ref_ptr<osgGA::TrackballManipulator> tm = new osgGA::TrackballManipulator;
@@ -102,14 +104,10 @@ OSGWidget::OSGWidget(QWidget* parent): QOpenGLWidget(parent),
   _viewer->setThreadingModel(osgViewer::CompositeViewer::SingleThreaded);
   _viewer->realize();
 
-  _storeHandler = new StoreHandler(_root);
-  _openScadRenderer = new OpenScadRenderer();
-  _threeMFWriter = new ThreeMFWriter();
-
-  osg::ref_ptr<PickHandler> picker = new PickHandler(_storeHandler, _openScadRenderer, _threeMFWriter, _axesNode);
-  _root->addChild(picker->getOrCreateSelectionCylinder());
+  _picker = new PickHandler(this, _root);
+  _root->addChild(_picker->getPickerRoot());
 
-  _view->addEventHandler(picker.get());
+  _view->addEventHandler(_picker);
 
   // This ensures that the widget will receive keyboard events. This focus
   // policy is not set by default. The default, Qt::NoFocus, will result in
@@ -127,18 +125,28 @@ OSGWidget::~OSGWidget() {
 }
 
 void OSGWidget::renderBaseMesh(const osg::ref_ptr<osg::Vec3Array> vertices, const osg::ref_ptr<osg::Vec3Array> normals) {
-  _root->removeChild(_axesNode);
+  _root->removeChild(_mesh);
 
   osg::ref_ptr<osg::Geometry> meshGeometry = new osg::Geometry;
   meshGeometry->setVertexArray(vertices.get());
   meshGeometry->setNormalArray(normals.get(), osg::Array::BIND_PER_VERTEX);
   meshGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, 0, vertices->getNumElements()));
   osgUtil::optimizeMesh(meshGeometry.get());
-  _axesNode->addDrawable(meshGeometry.get());
+  _mesh->addDrawable(meshGeometry.get());
+
+  OSGWidget::fixMaterialState(_mesh);
+
+  _root->addChild(_mesh);
 
-  OSGWidget::fixMaterialState(_axesNode);
+  _picker->updateRenderer();
+}
+
+osg::ref_ptr<osg::Geode> OSGWidget::getMesh() {
+  return _mesh;
+}
 
-  _root->addChild(_axesNode);
+PickHandler* OSGWidget::getPicker() {
+  return _picker;
 }
 
 void OSGWidget::paintEvent(QPaintEvent*) {

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

@@ -1,7 +1,7 @@
 // Include own headers
 #include "OptiTrackPoint.hpp"
 
-OptiTrackPoint::OptiTrackPoint(const osg::Vec3 point, const osg::Vec3 normal, const double length, const double radius): TrackPoint(point, normal) {
+OptiTrackPoint::OptiTrackPoint(const osg::Vec3 point, const osg::Vec3 normal, const osg::Vec3 normalModifier, const double length, const double radius): TrackPoint(point, normal, normalModifier) {
   _length = length;
   _radius = radius;
 

+ 123 - 54
trackpoint-app/src/PickHandler.cpp

@@ -1,9 +1,6 @@
 // Include own headers
 #include "PickHandler.hpp"
 
-// Include modules
-#include "OSGWidget.hpp"
-
 // Include dependencies
 #include <osg/io_utils>
 
@@ -16,65 +13,72 @@
 
 #include <osgViewer/Viewer>
 
-PickHandler::PickHandler(StoreHandler* storeHandler, OpenScadRenderer* openScadRenderer, ThreeMFWriter* threeMFWriter, osg::ref_ptr<osg::Node> axesNode) {
-  _storeHandler = storeHandler;
-  _openScadRenderer = openScadRenderer;
-  _threeMFWriter = threeMFWriter;
-  _axesNode = axesNode;
-}
+PickHandler::PickHandler(OSGWidget* osgWidget, osg::ref_ptr<osg::Group> root) {
+  _osgWidget = osgWidget;
 
-osg::Node* PickHandler::getOrCreateSelectionCylinder() {
-  if (!_selectionTranslateGroup) {
-    osg::ref_ptr<osg::Geode> geode = new osg::Geode;
-    osg::ref_ptr<osg::ShapeDrawable> cylinder = new osg::ShapeDrawable();
-    cylinder->setShape(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, 0.0f), 1.0f, 10.0f));
-    cylinder->setColor(osg::Vec4(1.0f, 0.0f, 0.0f, 0.2f));
-    geode->addDrawable(cylinder.get());
+  _selectionRotateGroup = new osg::MatrixTransform;
 
-    OSGWidget::fixMaterialState(geode);
+  _selectionMoveToEndGroup = new osg::MatrixTransform;
+  _selectionMoveToEndGroup->addChild(_selectionRotateGroup.get());
 
-    _selectionRotateGroup = new osg::MatrixTransform;
-    _selectionRotateGroup->addChild(geode.get());
+  _selectionTranslateGroup = new osg::MatrixTransform;
+  _selectionTranslateGroup->addChild(_selectionMoveToEndGroup.get());
 
-    _selectionMoveToEndGroup = new osg::MatrixTransform;
-    _selectionMoveToEndGroup->addChild(_selectionRotateGroup.get());
+  _selectionSwitch = new osg::Switch;
+  _selectionSwitch->addChild(_selectionTranslateGroup.get());
 
-    _selectionTranslateGroup = new osg::MatrixTransform;
-    _selectionTranslateGroup->addChild(_selectionMoveToEndGroup.get());
+  root->addChild(_selectionSwitch.get());
+}
 
-    _selectionSwitch = new osg::Switch;
-    _selectionSwitch->addChild(_selectionTranslateGroup.get());
-  }
+osg::Node* PickHandler::getPickerRoot() {
   return _selectionSwitch.get();
 }
 
 bool PickHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) {
-  if (ea.getModKeyMask()&osgGA::GUIEventAdapter::MODKEY_CTRL) {
-    isSelection = !isSelection;
-    setVisibility(false);
-  }
-  if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE && ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON && isSelection) {
-    osgViewer::View* viewer = dynamic_cast<osgViewer::View*>(&aa);
-    if (viewer) {
-      osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, ea.getX(), ea.getY());
-      osgUtil::IntersectionVisitor iv(intersector.get());
-      iv.setTraversalMask(~0x1);
-      viewer->getCamera()->accept(iv);
-      if (intersector->containsIntersections()) {
-        for (const osgUtil::LineSegmentIntersector::Intersection result: intersector->getIntersections()) {
-          if (std::find(result.nodePath.begin(), result.nodePath.end(), _axesNode) != result.nodePath.end()) {
-            moveTo(result.localIntersectionPoint);
-            rotateToNormalVector(result.localIntersectionNormal);
-            _storeHandler->addTrackingPoint(result.localIntersectionPoint, result.localIntersectionNormal);
-            _openScadRenderer->render(_storeHandler->getPoints());
-            _threeMFWriter->writeTrackPoints(_storeHandler->getPoints(), "/tmp/export.3mf");
-            break;
+  if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) {
+    if (ea.getEventType() == osgGA::GUIEventAdapter::PUSH) {
+      osgViewer::View* viewer = dynamic_cast<osgViewer::View*>(&aa);
+      if (viewer) {
+        osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, ea.getX(), ea.getY());
+        osgUtil::IntersectionVisitor iv(intersector.get());
+        iv.setTraversalMask(~0x1);
+        viewer->getCamera()->accept(iv);
+        if (intersector->containsIntersections()) {
+          if (_addNewPoints) {
+            for (const osgUtil::LineSegmentIntersector::Intersection result: intersector->getIntersections()) {
+              if (std::find(result.nodePath.begin(), result.nodePath.end(), _osgWidget->getMesh()) != result.nodePath.end()) {
+                _clickStartedOnElement = true;
+                break;
+              }
+            }
+          } else {
+
+          }
+        }
+      }
+    } else if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE && _clickStartedOnElement) {
+      _clickStartedOnElement = false;
+      osgViewer::View* viewer = dynamic_cast<osgViewer::View*>(&aa);
+      if (viewer) {
+        osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, ea.getX(), ea.getY());
+        osgUtil::IntersectionVisitor iv(intersector.get());
+        iv.setTraversalMask(~0x1);
+        viewer->getCamera()->accept(iv);
+        if (intersector->containsIntersections()) {
+          for (const osgUtil::LineSegmentIntersector::Intersection result: intersector->getIntersections()) {
+            if (std::find(result.nodePath.begin(), result.nodePath.end(), _osgWidget->getMesh()) != result.nodePath.end()) {
+              moveTo(result.localIntersectionPoint);
+              rotateToNormalVector(result.localIntersectionNormal);
+              addPoint(result.localIntersectionPoint, result.localIntersectionNormal);
+              break;
+            }
           }
         }
       }
     }
   }
-  if (ea.getEventType() == osgGA::GUIEventAdapter::MOVE && isSelection) {
+  // Update position of picker on mouse move
+  if (ea.getEventType() == osgGA::GUIEventAdapter::MOVE || ea.getEventType() == osgGA::GUIEventAdapter::DRAG) {
     osgViewer::View* viewer = dynamic_cast<osgViewer::View*>(&aa);
     if (viewer) {
       osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, ea.getX(), ea.getY());
@@ -82,15 +86,22 @@ bool PickHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapt
       iv.setTraversalMask(~0x1);
       viewer->getCamera()->accept(iv);
       if (intersector->containsIntersections()) {
-        for (const osgUtil::LineSegmentIntersector::Intersection result: intersector->getIntersections()) {
-          if (std::find(result.nodePath.begin(), result.nodePath.end(), _axesNode) != result.nodePath.end()) {
-            moveTo(result.localIntersectionPoint);
-            rotateToNormalVector(result.localIntersectionNormal);
-            setVisibility(true);
-            break;
+        if (_addNewPoints) {
+          for (const osgUtil::LineSegmentIntersector::Intersection result: intersector->getIntersections()) {
+            if (std::find(result.nodePath.begin(), result.nodePath.end(), _osgWidget->getMesh()) != result.nodePath.end()) {
+              moveTo(result.localIntersectionPoint);
+              rotateToNormalVector(result.localIntersectionNormal);
+              setVisibility(true);
+              break;
+            }
+          }
+        } else {
+          for (const osgUtil::LineSegmentIntersector::Intersection result: intersector->getIntersections()) {
+            // TODO
           }
         }
       } else {
+        MainWindow::getInstance()->getEditWiget()->invalidatePositions();
         setVisibility(false);
       }
     }
@@ -98,16 +109,74 @@ bool PickHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapt
   return false;
 }
 
+void PickHandler::setTrackingSystem(ActiveTrackingSystem activeTrackingSystem) {
+  _activeTrackingSystem = activeTrackingSystem;
+  updateRenderer();
+}
+
+void PickHandler::setSelection(bool addNewPoints) {
+  _addNewPoints = addNewPoints;
+  updateRenderer();
+}
+
 void PickHandler::moveTo(osg::Vec3f position) {
   _selectionTranslateGroup->setMatrix(osg::Matrix::translate(position));
+  MainWindow::getInstance()->getEditWiget()->updatePositions(position);
 }
 
 void PickHandler::rotateToNormalVector(osg::Vec3f normal) {
+  osg::Vec3 modifier = MainWindow::getInstance()->getStore()->getNormalModifier();
+  normal = normal.operator+(modifier);
   _selectionRotateGroup->setMatrix(osg::Matrix::rotate(osg::Vec3f(0.0f, 0.0f, 1.0f), normal));
-  osg::Vec3f movementVector = normal.operator*(5.0f);
+  osg::Vec3f movementVector = normal.operator*(_optiTrackSteamVRLength / 2);
   _selectionMoveToEndGroup->setMatrix(osg::Matrix::translate(movementVector));
+  MainWindow::getInstance()->getEditWiget()->updateNormals(normal);
+}
+
+void PickHandler::updateRenderer() {
+  removeAllShapes();
+  switch(_activeTrackingSystem) {
+    case OptiTrack: {
+      OptiTrackSettings settings = MainWindow::getInstance()->getStore()->getOptiTrackSettings();
+      _optiTrackSteamVRLength = settings.length;
+      osg::ref_ptr<osg::Geode> geode = new osg::Geode;
+      osg::ref_ptr<osg::ShapeDrawable> cylinder = new osg::ShapeDrawable();
+      cylinder->setShape(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, 0.0f), settings.radius, settings.length));
+      cylinder->setColor(osg::Vec4(1.0f, 0.0f, 0.0f, 0.2f));
+      geode->addDrawable(cylinder.get());
+      OSGWidget::fixMaterialState(geode);
+      _selectionRotateGroup->addChild(geode.get());
+      break;
+    }
+    case EMFTrack: {
+      break;
+    }
+    case SteamVRTrack: {
+      break;
+    }
+  }
+  setVisibility(_addNewPoints);
+}
+
+void PickHandler::removeAllShapes() {
+  _selectionRotateGroup->removeChildren(0, _selectionRotateGroup->getNumChildren());
 }
 
 void PickHandler::setVisibility(bool mode) {
   _selectionSwitch->setValue(0, mode);
 }
+
+void PickHandler::addPoint(osg::Vec3 point, osg::Vec3 normal) {
+  switch(_activeTrackingSystem) {
+    case OptiTrack: {
+      MainWindow::getInstance()->getStore()->addOptiTrackPoint(point, normal);
+      break;
+    }
+    case EMFTrack: {
+      break;
+    }
+    case SteamVRTrack: {
+      break;
+    }
+  }
+}

+ 32 - 0
trackpoint-app/src/ProjectStore.cpp

@@ -5,6 +5,7 @@
 #include "MainWindow.hpp"
 #include "StringBasics.hpp"
 
+// Include dependencies
 #include <typeinfo>
 #include <iostream>
 
@@ -41,6 +42,8 @@ void ProjectStore::loadMesh(std::string meshFile) {
     std::vector<Lib3MF::sTriangle> triangleBuffer;
     mesh->GetTriangleIndices(triangleBuffer);
     render3MFMesh(verticesBuffer, triangleBuffer);
+    MainWindow* mainWindow = MainWindow::getInstance();
+    mainWindow->renderView(Edit);
   } else {
     // TODO: Show error popup
     printf("Unsupported file type.\n");
@@ -76,6 +79,35 @@ bool ProjectStore::exportProject(std::string path, ExportSettings settings) {
   return false; // TODO
 }
 
+void ProjectStore::updateNormalModifier(osg::Vec3 modifier) {
+  _normalModifier = modifier;
+}
+
+osg::Vec3 ProjectStore::getNormalModifier() {
+  return _normalModifier;
+}
+
+std::vector<OptiTrackPoint*> ProjectStore::getOptiTrackPoints() {
+  return _optiTrackPoints;
+}
+
+void ProjectStore::addOptiTrackPoint(osg::Vec3 point, osg::Vec3 normal) {
+  OptiTrackPoint* optiTrackPoint = new OptiTrackPoint(point, normal, _normalModifier, _optiTrackSettings.length, _optiTrackSettings.radius);
+  _optiTrackPoints.push_back(optiTrackPoint);
+}
+
+void ProjectStore::removeOptiTrackPoint() {
+  // TODO
+}
+
+void ProjectStore::updateOptiTrackSettings(OptiTrackSettings optiTrackSettings) {
+  _optiTrackSettings = optiTrackSettings;
+}
+
+OptiTrackSettings ProjectStore::getOptiTrackSettings() {
+  return _optiTrackSettings;
+}
+
 void ProjectStore::load3mfLib() {
   _wrapper = Lib3MF::CWrapper::loadLibrary();
   _project = _wrapper->CreateModel();

+ 0 - 15
trackpoint-app/src/StoreHandler.cpp

@@ -1,15 +0,0 @@
-#include "StoreHandler.hpp"
-
-void StoreHandler::addTrackingPoint(osg::Vec3 point, osg::Vec3 normal) {
-  TrackPoint* trackPoint = new TrackPoint(point, normal);
-  points.push_back(trackPoint);
-  _root->addChild(trackPoint->getUppermostRoot());
-}
-
-StoreHandler::StoreHandler(osg::ref_ptr<osg::Group> root) {
-  _root = root;
-}
-
-std::vector<TrackPoint*> StoreHandler::getPoints() {
-  return points;
-}

+ 8 - 34
trackpoint-app/src/TrackPoint.cpp

@@ -4,40 +4,10 @@
 // Include modules
 #include "OSGWidget.hpp"
 
-// Include dependencies
-#include <osg/Geode>
-#include <osg/ShapeDrawable>
-#include <osg/Material>
-#include <osg/StateSet>
-
-TrackPoint::TrackPoint(osg::Vec3 point, osg::Vec3 normal) {
-  /*osg::ref_ptr<osg::Geode> geode = new osg::Geode;
-  osg::ref_ptr<osg::ShapeDrawable> cylinder = new osg::ShapeDrawable();
-  cylinder->setShape(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, 0.0f), 1.0f, 10.0f));
-  cylinder->setColor(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));
-  geode->addDrawable(cylinder.get());
-
-  OSGWidget::fixMaterialState(geode);
-
-  _rotationGroup = new osg::MatrixTransform;
-  _rotationGroup->addChild(geode.get());
-  _rotationGroup->setMatrix(osg::Matrix::rotate(osg::Vec3f(0.0f, 0.0f, 1.0f), normal));
-
-  _originFixGroup = new osg::MatrixTransform;
-  _originFixGroup->addChild(_rotationGroup.get());
-  osg::Vec3f movementVector = normal.operator*(5.0f);
-  _originFixGroup->setMatrix(osg::Matrix::translate(movementVector));
-
-  _translationGroup = new osg::MatrixTransform;
-  _translationGroup->addChild(_originFixGroup.get());
-  _translationGroup->setMatrix(osg::Matrix::translate(point));*/
-
+TrackPoint::TrackPoint(const osg::Vec3 point, const osg::Vec3 normal, const osg::Vec3 normalModifier) {
   _origin = point;
   _normal = normal;
-}
-
-osg::ref_ptr<osg::MatrixTransform> TrackPoint::getUppermostRoot() {
-  return _translationGroup.get();
+  _normalModifier = normalModifier;
 }
 
 osg::Vec3 TrackPoint::getTranslation() {
@@ -70,6 +40,10 @@ osg::Vec3 TrackPoint::getRotation() {
   return osg::Vec3(xRotation, yRotation, zRotation);
 }
 
-osg::Vec3 TrackPoint::getTrackPoint() {
-  return _trackOrigin;
+osg::Vec3 TrackPoint::getNormal() {
+  return _normal;
+}
+
+osg::Vec3 TrackPoint::getNormalModifier() {
+  return _normalModifier;
 }