فهرست منبع

Implement modification on selection

Johannes Kreutz 3 سال پیش
والد
کامیت
0ac82c2c44

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

@@ -21,6 +21,8 @@ public:
   void updateNormals(osg::Vec3 normal);
   void invalidatePositions();
   ActiveTrackingSystem getSelectedTrackingSystem();
+  void setSelection(int id);
+  int getSelectedPoint();
 
 protected:
   virtual void showEvent(QShowEvent* event);
@@ -29,10 +31,13 @@ private slots:
   void selectTool(Tool tool);
   void updateNormalModifier();
   void resetNormalModifier();
+  void setNormalModifier(osg::Vec3 normalModifier);
   void updateOptiTrackSettings();
   void resetOptiTrackSettings();
+  void setOptiTrackSettings(double length, double radius);
   void exportProject();
 
 private:
   Ui::EditWidget* ui;
+  int selectedPoint = -1;
 };

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

@@ -11,6 +11,7 @@ public:
   double getLength();
   double getRadius();
   OptiTrackSettings getOptiTrackSettings();
+  void updateOptiTrackSettings(OptiTrackSettings settings);
 
 private:
   double _length;

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

@@ -29,6 +29,7 @@ private:
   bool _clickStartedOnElement = false;
   OSGWidget* _osgWidget;
   double _optiTrackSteamVRLength;
+  int _selectedPoint = -1;
   void moveTo(osg::Vec3f position);
   void rotateToNormalVector(osg::Vec3f normal);
   void removeAllShapes();

+ 3 - 0
trackpoint-app/include/ProjectStore.hpp

@@ -5,6 +5,7 @@
 #include "OptiTrackPoint.hpp"
 #include "TrackSystemSettingsStructs.hpp"
 #include "OpenScadRenderer.hpp"
+#include "enums.hpp"
 
 // Include dependencies
 #include <string>
@@ -28,6 +29,8 @@ public:
   bool saveProject(std::string projectFile);
   // Export the project
   bool exportProject(std::string path, ExportSettings settings);
+  // UNIVERSAL TRACKPOINT GETTER
+  TrackPoint* getTrackPointById(int id, ActiveTrackingSystem activeTrackingSystem);
   // NORMAL MODIFIER
   // Update normal modifier
   void updateNormalModifier(osg::Vec3 modifier);

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

@@ -12,6 +12,7 @@ public:
   osg::Vec3 getNormal();
   osg::Vec3 getNormalModifier();
   osg::Vec3 getTrackPoint();
+  void updateNormalModifier(osg::Vec3 normalModifier);
 
 protected:
   osg::ref_ptr<osg::MatrixTransform> _translationGroup;

+ 73 - 8
trackpoint-app/src/EditWidget.cpp

@@ -5,6 +5,7 @@
 // Include modules
 #include "OSGWidget.hpp"
 #include "PickHandler.hpp"
+#include "TrackPointRenderer.hpp"
 
 // Include dependencies
 #include <QFileDialog>
@@ -71,6 +72,33 @@ ActiveTrackingSystem EditWidget::getSelectedTrackingSystem() {
   }
 }
 
+void EditWidget::setSelection(int id) {
+  selectedPoint = id;
+  switch(ui->tabWidget->currentIndex()) {
+    case 0: {
+      OptiTrackPoint* point = MainWindow::getInstance()->getStore()->getOptiTrackPoints()[id];
+      updatePositions(point->getTranslation());
+      updateNormals(point->getNormal());
+      setNormalModifier(point->getNormalModifier());
+      setOptiTrackSettings(point->getLength(), point->getRadius());
+      break;
+    }
+    case 1: {
+      break;
+    }
+    case 2: {
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+}
+
+int EditWidget::getSelectedPoint() {
+  return selectedPoint;
+}
+
 void EditWidget::showEvent(QShowEvent* event) {
   QWidget::showEvent(event);
   resetOptiTrackSettings();
@@ -82,6 +110,10 @@ void EditWidget::selectTool(Tool tool) {
       ui->insertionToolButton->setChecked(true);
       ui->selectionToolButton->setChecked(false);
       MainWindow::getInstance()->getOsgWidget()->getPicker()->setSelection(true);
+      invalidatePositions();
+      resetNormalModifier();
+      resetOptiTrackSettings();
+      selectedPoint = -1;
       break;
     }
     case SelectionTool: {
@@ -95,8 +127,14 @@ void EditWidget::selectTool(Tool tool) {
 
 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();
+  if (selectedPoint < 0) {
+    MainWindow::getInstance()->getStore()->updateNormalModifier(modifier);
+    MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
+  } else {
+    ActiveTrackingSystem activeTrackingSystem = getSelectedTrackingSystem();
+    MainWindow::getInstance()->getStore()->getTrackPointById(selectedPoint, activeTrackingSystem)->updateNormalModifier(modifier);
+    MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(activeTrackingSystem);
+  }
 }
 
 void EditWidget::resetNormalModifier() {
@@ -104,22 +142,49 @@ void EditWidget::resetNormalModifier() {
   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();
+  if (selectedPoint < 0) {
+    MainWindow::getInstance()->getStore()->updateNormalModifier(modifier);
+    MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
+  } else {
+    ActiveTrackingSystem activeTrackingSystem = getSelectedTrackingSystem();
+    MainWindow::getInstance()->getStore()->getTrackPointById(selectedPoint, activeTrackingSystem)->updateNormalModifier(modifier);
+    MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(activeTrackingSystem);
+  }
+}
+
+void EditWidget::setNormalModifier(osg::Vec3 normalModifier) {
+  ui->normalModX->setValue(normalModifier.x());
+  ui->normalModY->setValue(normalModifier.y());
+  ui->normalModZ->setValue(normalModifier.z());
 }
 
 void EditWidget::updateOptiTrackSettings() {
   OptiTrackSettings settings = {ui->optiTrackLength->value(), ui->optiTrackRadius->value()};
-  MainWindow::getInstance()->getStore()->updateOptiTrackSettings(settings);
-  MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
+  if (selectedPoint < 0) {
+    MainWindow::getInstance()->getStore()->updateOptiTrackSettings(settings);
+    MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
+  } else {
+    MainWindow::getInstance()->getStore()->getOptiTrackPoints()[selectedPoint]->updateOptiTrackSettings(settings);
+    MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(OptiTrack);
+  }
 }
 
 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();
+  if (selectedPoint < 0) {
+    MainWindow::getInstance()->getStore()->updateOptiTrackSettings(settings);
+    MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
+  } else {
+    MainWindow::getInstance()->getStore()->getOptiTrackPoints()[selectedPoint]->updateOptiTrackSettings(settings);
+    MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(OptiTrack);
+  }
+}
+
+void EditWidget::setOptiTrackSettings(double length, double radius) {
+  ui->optiTrackLength->setValue(length);
+  ui->optiTrackRadius->setValue(radius);
 }
 
 void EditWidget::exportProject() {

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

@@ -20,3 +20,8 @@ double OptiTrackPoint::getRadius() {
 OptiTrackSettings OptiTrackPoint::getOptiTrackSettings() {
   return OptiTrackSettings {_length, _radius};
 }
+
+void OptiTrackPoint::updateOptiTrackSettings(OptiTrackSettings settings) {
+  _length = settings.length;
+  _radius = settings.radius;
+}

+ 46 - 12
trackpoint-app/src/PickHandler.cpp

@@ -55,7 +55,17 @@ bool PickHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapt
               }
             }
           } else {
-
+            bool found = false;
+            for (const osgUtil::LineSegmentIntersector::Intersection result: intersector->getIntersections()) {
+              if (found) break;
+              for (PointShape* shape: _osgWidget->getPointRenderer()->getShapes()) {
+                if (std::find(result.nodePath.begin(), result.nodePath.end(), shape->getMesh()) != result.nodePath.end()) {
+                  _clickStartedOnElement = true;
+                  found = true;
+                  break;
+                }
+              }
+            }
           }
         }
       }
@@ -68,16 +78,30 @@ 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(), _osgWidget->getMesh()) != result.nodePath.end()) {
-              moveTo(result.localIntersectionPoint);
-              rotateToNormalVector(result.localIntersectionNormal);
-              addPoint(result.localIntersectionPoint, result.localIntersectionNormal);
-              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);
+                addPoint(result.localIntersectionPoint, result.localIntersectionNormal);
+                break;
+              }
+            }
+          } else {
+            bool found = false;
+            for (const osgUtil::LineSegmentIntersector::Intersection result: intersector->getIntersections()) {
+              if (found) break;
+              int shapeId = 0;
+              for (PointShape* shape: _osgWidget->getPointRenderer()->getShapes()) {
+                if (std::find(result.nodePath.begin(), result.nodePath.end(), shape->getMesh()) != result.nodePath.end()) {
+                  _selectedPoint = shapeId;
+                  MainWindow::getInstance()->getEditWiget()->setSelection(shapeId);
+                  found = true;
+                  break;
+                }
+                shapeId++;
+              }
             }
-            /*for () {
-
-            }*/
           }
         }
       }
@@ -116,7 +140,9 @@ bool PickHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapt
           }
         }
       } else {
-        MainWindow::getInstance()->getEditWiget()->invalidatePositions();
+        if (_addNewPoints) {
+          MainWindow::getInstance()->getEditWiget()->invalidatePositions();
+        }
         setVisibility(false);
       }
     }
@@ -131,6 +157,10 @@ void PickHandler::setTrackingSystem(ActiveTrackingSystem activeTrackingSystem) {
 
 void PickHandler::setSelection(bool addNewPoints) {
   _addNewPoints = addNewPoints;
+  if (addNewPoints) {
+    _selectedPoint = -1;
+  }
+  invalidateTrackPointColors();
   updateRenderer();
 }
 
@@ -199,7 +229,11 @@ void PickHandler::addPoint(osg::Vec3 point, osg::Vec3 normal) {
 }
 
 void PickHandler::invalidateTrackPointColors() {
+  int shapeId = 0;
   for (PointShape* shape: _osgWidget->getPointRenderer()->getShapes()) {
-    shape->setColor(osg::Vec4(0.0f, 1.0f, 0.0f, 0.2f));
+    if (_selectedPoint != shapeId) {
+      shape->setColor(osg::Vec4(0.0f, 1.0f, 0.0f, 0.2f));
+    }
+    shapeId++;
   }
 }

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

@@ -115,6 +115,23 @@ bool ProjectStore::exportProject(std::string path, ExportSettings settings) {
   return true;
 }
 
+TrackPoint* ProjectStore::getTrackPointById(int id, ActiveTrackingSystem activeTrackingSystem) {
+  switch(activeTrackingSystem) {
+    case OptiTrack: {
+      return _optiTrackPoints[id];
+    };
+    case EMFTrack: {
+      break;
+    };
+    case SteamVRTrack: {
+      break;
+    };
+    case ActionPoints: {
+      break;
+    };
+  }
+}
+
 void ProjectStore::updateNormalModifier(osg::Vec3 modifier) {
   _normalModifier = modifier;
 }

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

@@ -51,3 +51,7 @@ osg::Vec3 TrackPoint::getNormalModifier() {
 osg::Vec3 TrackPoint::getTrackPoint() {
   return _trackOrigin;
 }
+
+void TrackPoint::updateNormalModifier(osg::Vec3 normalModifier) {
+  _normalModifier = normalModifier;
+}

+ 11 - 2
trackpoint-app/src/TrackPointRenderer.cpp

@@ -17,16 +17,25 @@ TrackPointRenderer::~TrackPointRenderer() {
 }
 
 void TrackPointRenderer::render(ActiveTrackingSystem activeTrackingSystem) {
+  for (PointShape* shape: _shapes) {
+    delete shape;
+  }
+  _shapes.clear();
   switch(activeTrackingSystem) {
     case OptiTrack: {
       std::vector<OptiTrackPoint*> points = MainWindow::getInstance()->getStore()->getOptiTrackPoints();
-      _shapes.clear();
+      int id = 0;
       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));
+        if (id == MainWindow::getInstance()->getEditWiget()->getSelectedPoint()) {
+          newShape->setColor(osg::Vec4(0.0f, 0.0f, 1.0f, 0.2f));
+        } else {
+          newShape->setColor(osg::Vec4(0.0f, 1.0f, 0.0f, 0.2f));
+        }
         newShape->rotateToNormalVector(point->getNormal());
         _shapes.push_back(newShape);
+        id++;
       }
       break;
     }